Przeglądaj źródła

feat: 增加会员详情页

Basil 2 lat temu
rodzic
commit
d337ff2ad3

+ 2 - 0
components.d.ts

@@ -20,6 +20,7 @@ declare module '@vue/runtime-core' {
20 20
     CXBNotLoginButton: typeof import('./src/components/CXBNotLoginButton/CXBNotLoginButton.vue')['default']
21 21
     CXBPhoneLoginButton: typeof import('./src/components/CXBPhoneLoginButton/CXBPhoneLoginButton.vue')['default']
22 22
     CXBSkuPopup: typeof import('./src/components/CXBSkuPopup/CXBSkuPopup.vue')['default']
23
+    CXBUserINdexHeader: typeof import('./src/components/CXBUserIndexHeader/CXBUserINdexHeader.vue')['default']
23 24
     CXBYaojinTag: typeof import('./src/components/CXBYaojinTag/CXBYaojinTag.vue')['default']
24 25
     FButton: typeof import('./src/components/FButton/FButton.vue')['default']
25 26
     FCell: typeof import('./src/components/FCell/FCell.vue')['default']
@@ -53,6 +54,7 @@ declare module '@vue/runtime-core' {
53 54
     NutMenu: typeof import('uniapp-nutui/components/menu/menu.vue')['default']
54 55
     NutMenuItem: typeof import('uniapp-nutui/components/menuitem/menuitem.vue')['default']
55 56
     NutNoticebar: typeof import('uniapp-nutui/components/noticebar/noticebar.vue')['default']
57
+    NutPicker: typeof import('uniapp-nutui/components/picker/picker.vue')['default']
56 58
     NutPopup: typeof import('uniapp-nutui/components/popup/popup.vue')['default']
57 59
     NutSearchbar: typeof import('uniapp-nutui/components/searchbar/searchbar.vue')['default']
58 60
     NutSwitch: typeof import('uniapp-nutui/components/switch/switch.vue')['default']

+ 1 - 1
src/apis/model/storeModel.ts

@@ -89,7 +89,7 @@ export interface StoreParams {
89 89
     // 经度
90 90
     lng: ''
91 91
     // 关键字(检索内容)
92
-    mer_keyword: ''
92
+    mer_keyword: string
93 93
     // 距离排序(升序)0
94 94
     distanceAsc?: number
95 95
     // 商品分类 id

+ 9 - 0
src/apis/model/userInfoModel.ts

@@ -1,3 +1,12 @@
1
+export interface UpdateUserInfoRequestModel {
2
+    nickname: string;
3
+    // 1男 2女
4
+    sex: number
5
+    birthday: string
6
+    mark: string
7
+    avatar: string
8
+    // addres: string
9
+}
1 10
 export interface UserInfoModel{
2 11
     /** 用户id */
3 12
     uid: string

+ 15 - 1
src/apis/user.ts

@@ -4,7 +4,7 @@ import Cache from '~/utils/cache'
4 4
 import {EXPIRES_TIME, LOGIN_STATUS, STATE_R_KEY, USER_INFO} from "~/constants";
5 5
 import {useUserStore} from "~/stores/userStore";
6 6
 import type {YanglaoStatisticsResult} from "~/apis/model/yanglaoStatisticsModel";
7
-import type {UserInfoModel} from "~/apis/model/userInfoModel";
7
+import type {UpdateUserInfoRequestModel, UserInfoModel} from "~/apis/model/userInfoModel";
8 8
 import type {InvitePartnerModel, UserInviteParams} from "~/apis/model/invitePartnerModel";
9 9
 import type {UserShareProductListModel, UserShareProductParams} from "~/apis/model/userShareProductModel";
10 10
 import type {RevenueSharingModel, RevenueSharingParams} from "~/apis/model/revenueSharingModel";
@@ -50,6 +50,8 @@ enum API {
50 50
     GET_YANGLAO_LOG = '/api/user/yanglaolog',
51 51
     // 获取用户信息
52 52
     USER = '/api/user',
53
+    // 个人资料编辑
54
+    UPDATE_USER = '/api/user/update/user',
53 55
     // 获取协议
54 56
     GET_XIEYI = '/api/xieyi/detail',
55 57
     GET_USER_UNION_ID = '/api/userMp/getUserUnionid',
@@ -633,6 +635,18 @@ export function getUserInfo(): Promise<UserInfoModel> {
633 635
 }
634 636
 
635 637
 /**
638
+ * 更新用户信息
639
+ * @param params
640
+ */
641
+export function updateUserInfo(params: UpdateUserInfoRequestModel) {
642
+    return defHttp.post({
643
+        url: API.UPDATE_USER,
644
+        data: {
645
+            ...params
646
+        }
647
+    })
648
+}
649
+/**
636 650
  * 获取协议内容
637 651
  */
638 652
 export function getXieYi(type: number) {

+ 0 - 0
src/components/CXBUserIndexHeader/CXBUserINdexHeader.vue


+ 1 - 1
src/components/FNavBar/FNavBar.vue

@@ -84,7 +84,7 @@ const {
84 84
 }
85 85
 
86 86
 .f-nav-bar-title {
87
-  --at-apply: 'line-clamp-1 m-auto max-w-60% text-base text-lg font-bold f-bg-2'
87
+  --at-apply: 'line-clamp-1 m-auto max-w-60% text-base text-sm font-bold '
88 88
 }
89 89
 
90 90
 .f-nav-bar-right {

Plik diff jest za duży
+ 1 - 1
src/pages.json


+ 1 - 0
src/pages/mine/my-address.vue

@@ -8,6 +8,7 @@ import FField from "~/components/FField/FField.vue";
8 8
 // })
9 9
 const userAddress = ref<any>({})
10 10
 const checked = ref(false)
11
+
11 12
 </script>
12 13
 <template>
13 14
 <CXBBasePage>

+ 263 - 0
src/pages/my-profile/index.vue

@@ -0,0 +1,263 @@
1
+<script setup lang="ts">
2
+
3
+import {UPLOAD_URL} from "~/utils/http";
4
+import {getToken} from "~/utils/auth";
5
+import {updateUserInfo} from "~/apis/user";
6
+
7
+const userStore = useUserStore()
8
+const showSexPicker = ref(false)
9
+const sexPopupValue = ref()
10
+const sexColumns = ref([
11
+  { text: '男', value: '1' },
12
+  { text: '女', value: '2' },
13
+])
14
+
15
+const formData = reactive({
16
+  phone: '',
17
+  nickname: '',
18
+  sex: '1',
19
+  birthday: '',
20
+  avatar: '',
21
+  // avatarUrl: '',
22
+  tempFile: { path: '' },
23
+  mark: ''
24
+})
25
+// const sex
26
+const sexPopupConfirm = ({ selectedValue, selectedOptions }) => {
27
+  console.log(selectedValue)
28
+  formData.sex = selectedValue[0]
29
+  showSexPicker.value = false
30
+}
31
+
32
+const showDatePicker = ref(false)
33
+const birthdayPopupValue = ref()
34
+const minDate = new Date(1900, 0, 1);
35
+const maxDate = new Date(2025, 10, 1);
36
+const currentDate = new Date()
37
+
38
+const birthdayPopupConfirm = ({ selectedValue, selectedOptions }) => {
39
+  console.log(selectedValue.join('-'))
40
+  formData.birthday = selectedValue.join('-')
41
+  showDatePicker.value = false
42
+}
43
+onLoad(async () => {
44
+  await userStore.getUserInfo()
45
+  // console.log(userStore.userInfo)
46
+  if (userStore.userInfo) {
47
+    const userInfo = userStore.userInfo
48
+    formData.nickname = userInfo.nickname
49
+    formData.birthday = userInfo.birthday
50
+    formData.sex = userInfo.sex
51
+    formData.avatar = userInfo.avatar
52
+    formData.mark = userInfo.mark
53
+    formData.phone = userInfo.phone
54
+  }
55
+})
56
+
57
+function onChooseAvatar({ detail }) {
58
+  console.log()
59
+  formData.avatar = detail.avatarUrl
60
+  formData.tempFile = { path: detail.avatarUrl }
61
+  const inputName = 'field';
62
+
63
+  uni.showLoading()
64
+  uni.uploadFile({
65
+    url: UPLOAD_URL,
66
+    name: 'field',
67
+    formData: {
68
+      'filename': inputName
69
+    },
70
+    header: {
71
+      // #ifdef MP
72
+      "Content-Type": "multipart/form-data",
73
+      // #endif
74
+      'X-Token':'Bearer ' + getToken()
75
+      // [TOKENNAME]: 'Bearer ' + store.state.app.token
76
+
77
+    },
78
+    filePath: formData.tempFile.path,
79
+    success: res => {
80
+      uni.hideLoading()
81
+      const { data } = res
82
+      const assetData = JSON.parse(data)
83
+      console.log(assetData)
84
+      if (assetData && assetData.data) {
85
+        formData.avatar = assetData.data.path
86
+      }
87
+    }
88
+  })
89
+}
90
+
91
+function handleSubmit() {
92
+  // console.log(formData)
93
+  updateUserInfo({
94
+    avatar: formData.avatar,
95
+    nickname: formData.nickname,
96
+    sex: formData.sex,
97
+    birthday: formData.birthday,
98
+    mark: formData.mark
99
+  }).then(res => {
100
+    if (res) {
101
+      uni.showToast({
102
+        title: '保存成功',
103
+        icon: 'none'
104
+      }).then(() => {
105
+        uni.navigateBack()
106
+      })
107
+    }
108
+  }).catch(error => {
109
+    // if (error == '未做任何修改') {
110
+      uni.showToast({
111
+        title: error,
112
+        icon: 'none'
113
+      })
114
+    // }
115
+  })
116
+}
117
+// const show
118
+</script>
119
+<template>
120
+  <div v-if="userStore && userStore.userInfo">
121
+    <div
122
+        class="bg-white rounded-md text-sm flex justify-between p-3 f-hairline-bottom items-center">
123
+      <div class="">头像</div>
124
+      <div class="flex items-center">
125
+        <button class="btn-normal" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
126
+          <image :src="formData.avatar ? formData.avatar : 'https://app.bjtdba.com/mp/zjx_image/logo.png'" mode="widthFix" class="w-9 h-9 rounded-full" />
127
+        </button>
128
+        <div
129
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
130
+        />
131
+      </div>
132
+
133
+    </div>
134
+    <div
135
+        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
136
+      <div class="">昵称</div>
137
+      <div class="flex items-center">
138
+        <div><input placeholder="请填写昵称" v-model="formData.nickname" class="text-right"/></div>
139
+        <div
140
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
141
+        />
142
+      </div>
143
+    </div>
144
+    <div
145
+        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
146
+      <div class="">性别</div>
147
+      <div class="flex items-center" @click="showSexPicker = true">
148
+        <div>{{ formData.sex ? formData.sex == '1' ? '男' : '女' : '请选择' }}</div>
149
+        <div
150
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
151
+        />
152
+      </div>
153
+
154
+      <nut-popup position="bottom"  v-model:visible="showSexPicker">
155
+        <nut-picker
156
+            v-model="sexPopupValue"
157
+            :columns="sexColumns"
158
+            title="请选择性别"
159
+            @confirm="sexPopupConfirm"
160
+            @cancel="showSexPicker=false"
161
+        >
162
+          <nut-button block type="primary">完成</nut-button>
163
+        </nut-picker>
164
+      </nut-popup>
165
+    </div>
166
+
167
+    <div
168
+        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
169
+      <div class="">生日</div>
170
+      <div class="flex items-center" @click="showDatePicker = true">
171
+        <div>请选择</div>
172
+        <div
173
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
174
+        />
175
+      </div>
176
+
177
+      <nut-popup position="bottom" v-model:visible="showDatePicker">
178
+        <nut-date-picker
179
+            v-model="currentDate"
180
+            :min-date="minDate"
181
+            :max-date="maxDate"
182
+            @confirm="birthdayPopupConfirm"
183
+            :is-show-chinese="true"
184
+        >
185
+<!--          <nut-button block type="primary" @click="alwaysFun">永远有效</nut-button>-->
186
+        </nut-date-picker>
187
+      </nut-popup>
188
+    </div>
189
+
190
+    <div
191
+        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
192
+      <div class="">手机号</div>
193
+      <div class="flex items-center">
194
+        <div><input placeholder="请填写昵称" :value="formData.phone" class="text-right"/></div>
195
+        <div
196
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
197
+        />
198
+      </div>
199
+    </div>
200
+
201
+
202
+
203
+    <div
204
+        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
205
+      <div class="">签名</div>
206
+      <div class="flex items-center">
207
+        <div><input placeholder="请填写您的人个性签名" :value="formData.mark" class="text-right"/></div>
208
+        <div
209
+            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
210
+        />
211
+      </div>
212
+    </div>
213
+
214
+    <div class=" fixed bottom-0 w-full p-safe">
215
+
216
+      <div class="px-3 text-white">
217
+        <nut-button type="primary" block @click="handleSubmit">完成</nut-button>
218
+      </div>
219
+    </div>
220
+
221
+  </div>
222
+</template>
223
+
224
+
225
+<style>
226
+page {
227
+  background-color: #f8f8f8;
228
+}
229
+/* 无样式button (用于伪submit) */
230
+
231
+.btn-normal {
232
+  display: block;
233
+  margin: 0;
234
+  padding: 0;
235
+  line-height: normal;
236
+  background: none;
237
+  border-radius: 0;
238
+  box-shadow: none;
239
+  border: none;
240
+  font-size: unset;
241
+  text-align: unset;
242
+  overflow: visible;
243
+  color: inherit;
244
+}
245
+
246
+.btn-normal:after {
247
+  border: none;
248
+}
249
+
250
+.btn-normal.button-hover {
251
+  color: inherit;
252
+}
253
+
254
+button:after {
255
+  content: none;
256
+  border: none;
257
+}
258
+
259
+</style>
260
+<route lang="yaml">
261
+style:
262
+  navigationBarTitleText: 个人资料
263
+</route>

+ 249 - 0
src/pages/my-rules/index.vue

@@ -0,0 +1,249 @@
1
+<script setup lang="ts">
2
+// import CXBBasePage from "~/components/CXBBasePage/CXBBasePage.vue";
3
+import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html'
4
+
5
+import {encodePhone} from "../../utils";
6
+import {getRules, getUserInfo} from "~/apis/user";
7
+
8
+const userStore = useUserStore()
9
+const ruleDetail = ref<{
10
+  admin_id: string
11
+  content: string
12
+  create_time: string
13
+  is_del: string
14
+  notice_id: string
15
+  status: string
16
+  title: string
17
+}>()
18
+
19
+const showUpgradeInfo = ref(false)
20
+const userType = computed(() => {
21
+  const userRichType = userStore.userInfo?.user_rich_type
22
+  // 创始人
23
+  if (userRichType == 3) {
24
+    return '创始人'
25
+  }
26
+  // 普通用户
27
+  if (userRichType == 0) {
28
+    return '用户'
29
+  }
30
+  // 会员
31
+  if (userRichType == 1) {
32
+    return '会员'
33
+  }
34
+  // 合伙人
35
+  if (userRichType == 2) {
36
+    return '合伙人'
37
+  }
38
+  if (!userRichType) {
39
+    return '用户'
40
+  }
41
+})
42
+
43
+onLoad(async () => {
44
+  await userStore.getUserInfo()
45
+  await userStore.getUserYanglaoJin()
46
+})
47
+
48
+
49
+function handleShowMyInvitation() {
50
+  uni.navigateTo({
51
+    url: '/pages/my-invitation/index'
52
+  })
53
+}
54
+function handleShowMyIntegral() {
55
+  uni.navigateTo({
56
+    url: '/pages/my-integral/index'
57
+  })
58
+}
59
+function handleShowMyAllOrder(tab?: number) {
60
+  uni.navigateTo({
61
+    url: '/pages/order/index?tabIndex=' + tab
62
+  })
63
+}
64
+function handleToRedIntegral() {
65
+  uni.navigateTo({
66
+    url: '/pages/red-integral/index'
67
+  })
68
+}
69
+
70
+function handleShowAnnuityDetail() {
71
+  uni.navigateTo({
72
+    url: '/pages/annuity/index'
73
+  })
74
+}
75
+const ruleId = computed(() => {
76
+  const userRichType = userStore.userInfo?.user_rich_type
77
+  // 创始人
78
+  if (userRichType === 3) {
79
+    return 21
80
+  }
81
+  // 普通用户
82
+  if (userRichType === 0) {
83
+    return 18
84
+  }
85
+  // 会员
86
+  if (userRichType === 1) {
87
+    return 19
88
+  }
89
+  // 合伙人
90
+  if (userRichType === 2) {
91
+    return 20
92
+  }
93
+
94
+  return 18
95
+})
96
+
97
+onShow(() => {
98
+
99
+  getRules(ruleId.value).then(res => {
100
+    ruleDetail.value = res
101
+  }).catch(error => {
102
+    uni.showToast({
103
+      title: error,
104
+      icon: 'none'
105
+    })
106
+  })
107
+})
108
+
109
+function handleUserUpgrade() {
110
+  if (ruleId.value < 21) {
111
+    const id = ruleId.value + 1
112
+    getRules(id).then(res => {
113
+      ruleDetail.value = res
114
+      showUpgradeInfo.value = true
115
+    })
116
+  }
117
+}
118
+
119
+function handleToVipPage() {
120
+  uni.navigateTo({
121
+    url: '/pages/vip/index'
122
+  })
123
+}
124
+</script>
125
+<template>
126
+  <div>
127
+    <div class="bg-[#FD1642] h-40 w-full absolute top-0 left-0"></div>
128
+    <div class="flex flex-col gap-4 relative px-3 pb-safe">
129
+      <div class="pt-15 ">
130
+        <div class="flex gap-2 mb-2 text-white mb-6">
131
+          <image v-if="userStore.userInfo && userStore.userInfo.avatar" :src="userStore.userInfo.avatar"
132
+                 mode="widthFix"
133
+                 class="w-9 h-9 rounded-full"
134
+          ></image>
135
+
136
+          <div class="flex">
137
+            <div class="flex flex-col">
138
+              <div class="text-sm">
139
+                <div class="text-sm" v-if="userStore.userInfo">
140
+                  {{ userStore.userInfo.nickname ? userStore.userInfo.nickname : '登录' }}
141
+                </div>
142
+              </div>
143
+              <div class="text-xs" v-if="userStore.userInfo && userStore.userInfo.phone">
144
+                {{ encodePhone(userStore.userInfo.phone) }}
145
+              </div>
146
+            </div>
147
+            <div
148
+                class="flex rounded-full border border-solid border-1px border-yellow text-[12px] text-white w-12 h-5 justify-center items-center">
149
+              {{ userType || '用户' }}
150
+            </div>
151
+          </div>
152
+
153
+
154
+        </div>
155
+        <div class="bg-white rounded flex flex-col gap-6 py-4 text-xl">
156
+          <div
157
+              v-if="userStore.userInfo"
158
+              class="flex flex-wrap">
159
+            <div
160
+                @tap="handleShowAnnuityDetail"
161
+                class="w-1/3 flex flex-col justify-center items-center"
162
+            >
163
+              <div>{{ userStore.yanglao.all_yanglao }}</div>
164
+              <div class="text-xs">养老金</div>
165
+            </div>
166
+            <div
167
+                @tap="handleShowMyInvitation"
168
+                class="w-1/3  flex flex-col justify-center items-center">
169
+              <div>{{ userStore.userInfo.member_brokerage_price }}</div>
170
+              <div class="text-xs">我的佣金</div>
171
+            </div>
172
+            <div
173
+                @tap="handleShowMyIntegral"
174
+                class="w-1/3  flex flex-col justify-center items-center">
175
+              <div>{{ userStore.userInfo.score }}</div>
176
+              <div class="text-xs">我的积分</div>
177
+            </div>
178
+          </div>
179
+          <div
180
+              v-if="userStore.userInfo"
181
+              class="flex">
182
+            <div
183
+                @click="handleToRedIntegral"
184
+                class="w-1/2 flex flex-col justify-center items-center">
185
+              <div>{{ userStore.userInfo.red }}</div>
186
+              <div class="text-xs">红积分提现</div>
187
+            </div>
188
+            <div class="w-1/2 flex flex-col  justify-center items-center">
189
+              <div>{{ userStore.userInfo.team_number }}</div>
190
+              <div class="text-xs">团队人数</div>
191
+            </div>
192
+          </div>
193
+
194
+        </div>
195
+
196
+      </div>
197
+
198
+      <div
199
+          v-if="ruleDetail && ruleDetail.content && !showUpgradeInfo"
200
+          class="p-3 bg-white text-sm text-gray-500"
201
+      >
202
+        <mpHtml :content="ruleDetail.content"></mpHtml>
203
+      </div>
204
+      <div
205
+          v-else
206
+          class="p-3 bg-white text-sm text-gray-500"
207
+      >
208
+        <mpHtml :content="ruleDetail.content"></mpHtml>
209
+
210
+        <div class="flex justify-center items-center">
211
+          <nut-button
212
+              @click="handleToVipPage"
213
+              type="primary" size="small">立即升级</nut-button>
214
+
215
+        </div>
216
+      </div>
217
+
218
+
219
+
220
+      <div class="p-3 bg-white text-sm flex flex-col" v-if="!showUpgradeInfo">
221
+        <div class="font-bold">还有更多奖励权益</div>
222
+        <div class="flex justify-end">
223
+
224
+          <div
225
+              @click="handleUserUpgrade"
226
+              class="text-[12px] border border-solid border-1px rounded px-1 border-gray text-gray-600"
227
+          >了解更多奖励</div>
228
+        </div>
229
+      </div>
230
+
231
+
232
+
233
+    </div>
234
+  </div>
235
+
236
+
237
+</template>
238
+
239
+<route lang="yaml" type="home">
240
+style:
241
+  navigationBarTitleText: 储蓄保
242
+  enablePullDownRefresh: true
243
+</route>
244
+
245
+<style>
246
+page{
247
+  background: #f5f5f5;
248
+}
249
+</style>

+ 174 - 22
src/pages/search/index.vue

@@ -5,20 +5,26 @@ import {
5 5
   getDyProductList,
6 6
   getJdProductList,
7 7
   getPddProductList,
8
-  getSuProductList, getTaobaoProductList, getVipProductList,
9
-  searchProductList
8
+  getSuProductList,
9
+  getTaobaoProductList,
10
+  getVipProductList,
11
+  searchDyProduct,
12
+  searchJdProduct,
13
+  searchPddProduct,
14
+  searchSuProduct, searchVipProduct
10 15
 } from "~/apis/product";
11 16
 import type {
12
-  DyProductModel, IProductDetail,
13
-  JdProductModel, SuNingProductModel,
14
-  TaobaoProductDetailModel,
15
-  TaobaoProductThirdPartyWaresModel, VipProductModel
17
+  DyProductModel,
18
+  IProductDetail,
19
+  JdProductModel,
20
+  SuNingProductModel,
21
+  TaobaoProductThirdPartyWaresModel,
22
+  VipProductModel
16 23
 } from "~/apis/model/product.model";
17 24
 import {getDcProductList} from "~/apis/dacang";
18 25
 import type {DcProductModel} from "~/apis/model/dacang.model";
19 26
 import FPrice from "~/components/FPrice/FPrice.vue";
20 27
 import {encodeBase64} from "~/utils/http/helper";
21
-import FCell from "~/components/FCell/FCell.vue";
22 28
 import CXBDyLiveRecommend from "~/components/CXBDyLive/CXBDyLiveRecommend.vue";
23 29
 import {PLATFORM_NAME} from "~/apis/model/common.model";
24 30
 import {CDN_URL} from "~/config/app";
@@ -70,15 +76,24 @@ const tabList = <Array<TabItem>>[{
70 76
   selectedIconPath: CDN_URL + '/static/assets/suningyigou_d.png',
71 77
 }]
72 78
 const state = reactive({
73
-  currentTab: PLATFORM_NAME.JD
79
+  currentTab: PLATFORM_NAME.JD,
80
+  // 列表高度
81
+  scrollHeight: 0,
82
+  triggered: false,
83
+  status: 'none',
84
+  currentPage: 1,
85
+  totalPage: 1
74 86
 })
87
+const { windowHeight } = uni.getSystemInfoSync()
88
+state.scrollHeight = windowHeight - 195
89
+const searchValue = ref('')
75 90
 
76 91
 onLoad((options) => {
77 92
   const platform = options.platform
78 93
   if (platform) {
79 94
     state.currentTab = platform
80 95
   }
81
-  loadProductList(state.currentTab)
96
+  loadProductList('reload')
82 97
 
83 98
 })
84 99
 const list = ref<Array<
@@ -92,14 +107,80 @@ const list = ref<Array<
92 107
 >>()
93 108
 
94 109
 const dyLiveList = ref<Array<DyProductModel>>()
95
-function loadProductList(platform: PLATFORM_NAME) {
96
-  switch (platform) {
110
+
111
+function searchProduct() {
112
+  switch (state.currentTab) {
97 113
     case PLATFORM_NAME.JD: {
98
-      getJdProductList({
114
+      searchJdProduct({keyword: searchValue.value, page: 1, limit: 20}).then(res => {
115
+        list.value = res
116
+      })
117
+      break;
118
+    }
119
+    case PLATFORM_NAME.DC: {
120
+      getDcProductList({
99 121
         page: 1,
100
-        limit: 10
122
+        limit: 10,
123
+        classify: '',
124
+        keyword: searchValue.value
101 125
       }).then(res => {
102 126
         list.value = res
127
+      })
128
+      break;
129
+    }
130
+    case PLATFORM_NAME.DY: {
131
+      searchDyProduct({keyword: searchValue.value, page: 1, limit: 10}).then(res => {
132
+        list.value = res
133
+      })
134
+      break;
135
+    }
136
+    case PLATFORM_NAME.PDD: {
137
+      searchPddProduct({ keyword: searchValue.value, page: 1, limit: 10}).then(res => {
138
+        list.value = res
139
+      })
140
+      break;
141
+    }
142
+    case PLATFORM_NAME.SU: {
143
+      searchSuProduct({ keyword: searchValue.value, page: 1, limit: 10}).then(res => {
144
+        list.value = res
145
+      })
146
+      break;
147
+    }
148
+    case PLATFORM_NAME.TB: {
149
+      getTaobaoProductList({
150
+        pageNum: `1`,
151
+        pageSize: '10',
152
+        title: searchValue.value
153
+      }).then(res => {
154
+        list.value = res.thirdPartyWaresList
155
+      })
156
+      break;
157
+    }
158
+    case PLATFORM_NAME.VIP: {
159
+      searchVipProduct({ keyword: searchValue.value, page: 1, limit: 10}).then(res => {
160
+        list.value = res
161
+      })
162
+      break;
163
+    }
164
+  }
165
+}
166
+function loadProductList(action: 'page' | 'reload', callback?: (items) => void) {
167
+
168
+  switch (state.currentTab) {
169
+    case PLATFORM_NAME.JD: {
170
+      getJdProductList({
171
+        page: state.currentPage,
172
+        limit: 10
173
+      }).then(res => {
174
+        state.triggered = false
175
+
176
+        // list.value = res
177
+        if (action === 'page') {
178
+          list.value = list.value.concat(res)
179
+        }
180
+        if (action === 'reload') {
181
+          list.value = res
182
+        }
183
+        // state.totalPage = Math.ceil()
103 184
         // res[0].
104 185
         // console.log(res)
105 186
       })
@@ -107,19 +188,20 @@ function loadProductList(platform: PLATFORM_NAME) {
107 188
     }
108 189
     case PLATFORM_NAME.DC: {
109 190
       getDcProductList({
110
-        page: 1,
191
+        page: state.currentPage,
111 192
         limit: 10,
112 193
         classify: '',
113 194
         keyword: ''
114 195
       }).then(res => {
115 196
         list.value = res
197
+        state.triggered = false
116 198
 
117 199
       })
118 200
       break;
119 201
     }
120 202
     case PLATFORM_NAME.DY: {
121 203
       getDyLiveList({
122
-        page: 1,
204
+        page: state.currentPage,
123 205
         limit: 4,
124 206
         // keyword: ''
125 207
       }).then(res => {
@@ -134,16 +216,18 @@ function loadProductList(platform: PLATFORM_NAME) {
134 216
             }
135 217
           })
136 218
       getDyProductList({
137
-        page: 1,
219
+        page: state.currentPage,
138 220
         limit: 10,
139 221
       }).then(res => {
140 222
         list.value = res
223
+        state.triggered = false
224
+
141 225
       })
142 226
       break;
143 227
     }
144 228
     case PLATFORM_NAME.PDD: {
145 229
       getPddProductList({
146
-        page: 1,
230
+        page: state.currentPage,
147 231
         limit: 10
148 232
       }).then(res => {
149 233
         list.value = res
@@ -152,18 +236,20 @@ function loadProductList(platform: PLATFORM_NAME) {
152 236
     }
153 237
     case PLATFORM_NAME.SU: {
154 238
       getSuProductList({
155
-        page: 1,
239
+        page: state.currentPage,
156 240
         limit: 10
157 241
       }).then(res => {
158 242
         list.value = res
159 243
         console.log(res)
244
+        state.triggered = false
245
+
160 246
 
161 247
       })
162 248
       break;
163 249
     }
164 250
     case PLATFORM_NAME.TB: {
165 251
       getTaobaoProductList({
166
-        pageNum: '1',
252
+        pageNum: `${state.currentPage}`,
167 253
         pageSize: '10'
168 254
       }).then(res => {
169 255
         list.value = res.thirdPartyWaresList
@@ -172,10 +258,12 @@ function loadProductList(platform: PLATFORM_NAME) {
172 258
     }
173 259
     case PLATFORM_NAME.VIP: {
174 260
       getVipProductList({
175
-        page: 1,
261
+        page: state.currentPage,
176 262
         limit: 10
177 263
       }).then(res => {
178 264
         list.value = res
265
+        state.triggered = false
266
+
179 267
 
180 268
       })
181 269
       break;
@@ -190,6 +278,7 @@ function loadProductList(platform: PLATFORM_NAME) {
190 278
     // }
191 279
   }
192 280
 
281
+
193 282
 }
194 283
 
195 284
 function handleCategoryItemClick(item: TabItem) {
@@ -352,10 +441,49 @@ function handleLiveRecommendTitleClick() {
352 441
     url: `/pages/store/product/dy-live`
353 442
   })
354 443
 }
444
+
445
+// 下拉刷新被下拉
446
+const onRefresherPulling = e => {
447
+  state.triggered = true;
448
+};
449
+// 下拉刷新被复位
450
+const onRefresherRestore = e => {
451
+  state.triggered = false;
452
+};
453
+// 下拉刷新被中止
454
+const onRefresherAbort = e => {
455
+  state.triggered = false;
456
+}
457
+
458
+const onRefresherRefresh = e => {
459
+  loadProductList('reload')
460
+};
461
+
462
+function handleScrollToLower() {
463
+  state.status = 'loading';
464
+  state.currentPage += 1;
465
+  // if (state.currentPage > state.totalPage) {
466
+  //   state.status = 'noMore';
467
+  // } else {
468
+  //   // queryFavorites('page');
469
+  //   // loadSelectMerchant('page')
470
+  //   loadProductList(state.currentTab)
471
+  //
472
+  // }
473
+}
355 474
 </script>
356 475
 <template>
357 476
   <CXBBasePage>
358
-    <div class="flex overflow-hidden">
477
+
478
+    <div class="flex flex-col overflow-hidden fixed  h-fit z-1 bg-white">
479
+      <nut-searchbar
480
+          v-model="searchValue" @search="searchProduct" @clear="loadProductList('reload')">
481
+        <template v-slot:rightout>
482
+          <div @tap="searchProduct">
483
+            搜索
484
+          </div>
485
+        </template>
486
+      </nut-searchbar>
359 487
       <div class="py-3">
360 488
         <scroll-view
361 489
             class="flex flex-row w-full gap-2 overflow-x whitespace-nowrap w-screen"
@@ -378,7 +506,22 @@ function handleLiveRecommendTitleClick() {
378 506
         </scroll-view>
379 507
       </div>
380 508
     </div>
381
-    <div class="">
509
+    <div class="pt-36 ">
510
+      <scroll-view
511
+          :scroll-y="true"
512
+          :style="{ height: `${state.scrollHeight}px` }"
513
+          scroll-with-animation
514
+          :refresher-enabled="true"
515
+          refresher-background="#f5f5f5"
516
+          refresher-default-style="black"
517
+          :refresher-triggered="state.triggered"
518
+          @scrolltolower="handleScrollToLower"
519
+          @refresherPulling="onRefresherPulling"
520
+          @refresherRestore="onRefresherRestore"
521
+          @refresherAbort="onRefresherAbort"
522
+          @refresherrefresh="onRefresherRefresh"
523
+
524
+      >
382 525
       <div
383 526
           v-if="state.currentTab === PLATFORM_NAME.DY"
384 527
       >
@@ -476,6 +619,7 @@ function handleLiveRecommendTitleClick() {
476 619
 
477 620
       </div>
478 621
 
622
+      </scroll-view>
479 623
     </div>
480 624
   </CXBBasePage>
481 625
 
@@ -484,5 +628,13 @@ function handleLiveRecommendTitleClick() {
484 628
 <route lang="yaml">
485 629
 style:
486 630
   navigationBarTitleText: 搜索
631
+  disableScroll: true
487 632
 </route>
488 633
 
634
+<style>
635
+page {
636
+  overflow: hidden;
637
+  position: fixed;
638
+
639
+}
640
+</style>

+ 96 - 41
src/pages/store/nearby/index.vue

@@ -11,6 +11,15 @@ const state = reactive<any>({
11 11
   // 内容区垂直滚动条位置
12 12
   scrollTop: 0,
13 13
 
14
+  tabCurrent: 0,
15
+  status: 'loading',
16
+  currentPage: 1,
17
+  totalPage: 1,
18
+  total: 1,
19
+  pageSize: 10,
20
+  triggered: false,
21
+
22
+  category_id: 0,
14 23
   merchantCategory: [],
15 24
   merchantList: [],
16 25
   merchantPageNum: 1,
@@ -25,7 +34,7 @@ const state = reactive<any>({
25 34
 const searchValue = ref('')
26 35
 
27 36
 const { windowHeight } = uni.getSystemInfoSync()
28
-state.scrollHeight = windowHeight
37
+state.scrollHeight = windowHeight - 70
29 38
 
30 39
 onLoad(() => {
31 40
   // getMerchantCategory()
@@ -33,50 +42,56 @@ onLoad(() => {
33 42
     state.merchantCategory = res.merchantCategory
34 43
   })
35 44
 
36
-  getSelectMerchant({
37
-    pageNum: 1,
38
-    pageSize: 10,
39
-    mer_keyword: '',
40
-    lat: '',
41
-    lng: '',
42
-    // distanceAsc: 0,
43
-    // category_id: '',
44
-  }).then((res: StoreResult) => {
45
-    // console.log(res.pageInfo)
46
-    // console.log(res.list)
47
-    state.merchantList = res.list
48
-  })
45
+  // loadSelectMerchant('reload')
46
+  loadAll()
49 47
 })
50 48
 
49
+function loadAll() {
50
+  state.category_id = 0
51
+  loadSelectMerchant('reload')
52
+}
51 53
 function handleCategoryChange(category) {
52
-  // console.log(category)
54
+  console.log(category)
53 55
   state.currentMerchantCategoryId = category.merchant_category_id
54 56
   // console.log(category)
55 57
   // loadSelectMerchant()
56
-  loadSelectMerchant(category.merchant_category_id)
58
+  state.category_id = category.merchant_category_id
59
+  loadSelectMerchant('reload')
57 60
 }
58
-function loadSelectMerchant(category_id: number, mer_keyword?: string) {
59
-  if (category_id == 0) {
60
-    state.currentMerchantCategoryId = category_id
61
+function loadSelectMerchant(action: 'page' | 'reload', callback?: (items) => void) {
62
+  if (state.category_id == 0) {
63
+    state.currentMerchantCategoryId = state.category_id
61 64
   }
62 65
   let params: StoreParams = {
63
-    pageNum: 1,
64
-    pageSize: 10,
65
-    mer_keyword: mer_keyword ? mer_keyword : '',
66
+    pageNum: state.currentPage,
67
+    pageSize: state.pageSize,
68
+    mer_keyword: searchValue.value,
66 69
     // mer_keyword: mer_keyword,
67 70
     lat: '',
68 71
     lng: '',
69 72
   }
70
-  if (category_id !== 0) {
73
+  if (state.category_id !== 0) {
71 74
     // params.category_id = category_id
72 75
     params = Object.assign({}, params, {
73
-      category_id
76
+      category_id: state.category_id
74 77
     })
75 78
   }
76 79
   getSelectMerchant(params).then((res: StoreResult) => {
77
-    // console.log(res.pageInfo)
78
-    // console.log(res.list)
79
-    state.merchantList = res.list
80
+    state.total = res.total
81
+    state.totalPage = Math.ceil(state.total / state.pageSize);
82
+    console.log(state.totalPage)
83
+    // state.merchantList = res.list
84
+    if (action === 'page') {
85
+      state.merchantList = state.merchantList.concat(res.list)
86
+    }
87
+    if (action === 'reload') {
88
+      state.merchantList = res.list
89
+    }
90
+    state.status = 'more'
91
+
92
+    if (callback) {
93
+      callback(res.list)
94
+    }
80 95
   })
81 96
 }
82 97
 
@@ -89,19 +104,48 @@ function handleShowMerchant(merchant) {
89 104
 
90 105
 function change() {}
91 106
 function onChange() {}
107
+// 下拉刷新被下拉
108
+const onRefresherPulling = e => {
109
+  state.triggered = true;
110
+};
111
+// 下拉刷新被复位
112
+const onRefresherRestore = e => {
113
+  state.triggered = false;
114
+};
115
+// 下拉刷新被中止
116
+const onRefresherAbort = e => {
117
+  state.triggered = false;
118
+}
119
+// 下拉刷新被触发
120
+const onRefresherRefresh = e => {
121
+  loadSelectMerchant(0)
122
+};
123
+function handleScrollToLower() {
124
+  state.status = 'loading';
125
+  state.currentPage += 1;
126
+  if (state.currentPage > state.totalPage) {
127
+    state.status = 'noMore';
128
+  } else {
129
+    // queryFavorites('page');
130
+    loadSelectMerchant('page')
131
+  }
132
+}
92 133
 </script>
93 134
 <template>
94 135
 <!--  <nut-category :category="state.merchantCategory" @change="change">-->
95 136
 <!--    <nut-category-pane :categoryChild="state.merchantList" @onChange="onChange">-->
96 137
 <!--    </nut-category-pane>-->
97 138
 <!--  </nut-category>-->
98
-  <nut-searchbar v-model="searchValue" @search="loadSelectMerchant(0, searchValue)" @clear="loadSelectMerchant(0, '')">
99
-    <template v-slot:rightout>
100
-      <div @tap="loadSelectMerchant(0, searchValue)">
101
-        搜索
102
-      </div>
103
-    </template>
104
-  </nut-searchbar>
139
+    <nut-searchbar
140
+        class="absolute top-0"
141
+        v-model="searchValue" @search="loadSelectMerchant(0, searchValue)" @clear="loadSelectMerchant(0, '')">
142
+      <template v-slot:rightout>
143
+        <div @tap="loadSelectMerchant(0, searchValue)">
144
+          搜索
145
+        </div>
146
+      </template>
147
+    </nut-searchbar>
148
+
105 149
   <div class="flex">
106 150
     <!-- 左侧 一级分类 -->
107 151
     <scroll-view
@@ -110,11 +154,11 @@ function onChange() {}
110 154
         class="flex w-40 h-full bg-[#f8f8f8]"
111 155
     >
112 156
       <div
113
-          @tap="loadSelectMerchant(0)"
157
+          @tap="loadAll()"
114 158
           :class="state.currentMerchantCategoryId == 0 ? 'bg-white font-bold' : ''"
115 159
           class="relative h-15 block text-sm flex justify-center items-center">
116 160
         <div class="flex items-center gap-1">
117
-          <div class="h-4 bg-primary w-1"></div>
161
+          <div class="h-4 bg-primary w-1" v-if="state.currentMerchantCategoryId == 0"></div>
118 162
           <div>全部</div>
119 163
         </div>
120 164
 
@@ -122,10 +166,11 @@ function onChange() {}
122 166
       <div v-for="(item, index) in state.merchantCategory" :key="index"
123 167
            @tap="handleCategoryChange(item)"
124 168
            :class="state.currentMerchantCategoryId == item.merchant_category_id ? 'bg-white font-bold' : ''"
125
-           class="relative h-15 block text-sm flex justify-center items-center"
169
+           class="relative h-15 block text-sm flex justify-center items-center gap-1"
126 170
       >
127
-        <div
128
-        >
171
+        <div class="h-4 bg-primary w-1" v-if="state.currentMerchantCategoryId == item.merchant_category_id"></div>
172
+
173
+        <div>
129 174
           {{item.category_name}}
130 175
 
131 176
         </div>
@@ -135,10 +180,20 @@ function onChange() {}
135 180
 
136 181
 
137 182
     <scroll-view
138
-        :scroll-top="true"
139 183
         :scroll-y="true"
140 184
         :style="{ height: `${state.scrollHeight}px` }"
185
+        scroll-with-animation
141 186
         class="flex flex-1  flex-col h-full  p-3 gap-3"
187
+        :refresher-enabled="true"
188
+        refresher-background="#f5f5f5"
189
+        refresher-default-style="black"
190
+        :refresher-triggered="state.triggered"
191
+        @scrolltolower="handleScrollToLower"
192
+        @refresherPulling="onRefresherPulling"
193
+        @refresherRestore="onRefresherRestore"
194
+        @refresherAbort="onRefresherAbort"
195
+        @refresherrefresh="onRefresherRefresh"
196
+
142 197
     >
143 198
       <div
144 199
           v-for="(item, index) in state.merchantList" :key="index"
@@ -170,7 +225,7 @@ function onChange() {}
170 225
     </scroll-view>
171 226
   </div>
172 227
 </template>
173
-<route lang="yaml" type="home">
228
+<route lang="yaml">
174 229
 style:
175 230
   navigationBarTitleText: 储蓄保
176 231
   enablePullDownRefresh: true

+ 83 - 30
src/pages/user/index.vue

@@ -26,6 +26,18 @@ const myOrderList = [{
26 26
   text: '退款/售后',
27 27
   url: ''
28 28
 }]
29
+const contactUsList = [{
30
+  type: 'customer',
31
+  icon: '/static/icon/kefu_icon.png',
32
+  text: '联系客服',
33
+  url: 'https://work.weixin.qq.com/kfid/kfce29f31a08fd53ee0'
34
+},{
35
+  type: 'link',
36
+  icon: CDN_URL + '/static/assets/bangzhuzhongxin_220620.png',
37
+  text: '帮助中心',
38
+  url: '/pages/help-center/index'
39
+}]
40
+
29 41
 const myServiceList = [{
30 42
   icon: CDN_URL + '/static/assets/wodeyaoqing_220620.png',
31 43
   text: '我的邀请',
@@ -47,10 +59,6 @@ const myServiceList = [{
47 59
   text: '三方订单',
48 60
   url: '/pages/order/third-order'
49 61
 }, {
50
-  icon: CDN_URL + '/static/assets/bangzhuzhongxin_220620.png',
51
-  text: '帮助中心',
52
-  url: '/pages/help-center/index'
53
-}, {
54 62
   icon: CDN_URL + '/static/assets/wodepingjia_220620.png',
55 63
   text: '我的评价',
56 64
   url: '/pages/my-reply/index'
@@ -141,7 +149,7 @@ function handleService(item: {
141 149
 }
142 150
 
143 151
 // onShow(async () => {
144
-  // await userStore.getUserInfo()
152
+// await userStore.getUserInfo()
145 153
 // })
146 154
 
147 155
 function encodePhone(phone: string) {
@@ -174,26 +182,26 @@ function handleShowMyAllOrder(tab?: number) {
174 182
 }
175 183
 
176 184
 const userType = computed(() => {
177
-    const userRichType = userStore.userInfo.user_rich_type
178
-    // 创始人
179
-    if (userRichType === 3) {
180
-      return '创始人'
181
-    }
182
-    // 普通用户
183
-    if (userRichType === 0) {
184
-      return '用户'
185
-    }
186
-    // 会员
187
-    if (userRichType === 1) {
188
-      return '会员'
189
-    }
190
-    // 合伙人
191
-    if (userRichType === 2) {
192
-      return '合伙人'
193
-    }
194
-    if (!userRichType) {
195
-      return '用户'
196
-    }
185
+  const userRichType = userStore.userInfo?.user_rich_type
186
+  // 创始人
187
+  if (userRichType == 3) {
188
+    return '创始人'
189
+  }
190
+  // 普通用户
191
+  if (userRichType == 0) {
192
+    return '用户'
193
+  }
194
+  // 会员
195
+  if (userRichType == 1) {
196
+    return '会员'
197
+  }
198
+  // 合伙人
199
+  if (userRichType == 2) {
200
+    return '合伙人'
201
+  }
202
+  if (!userRichType) {
203
+    return '用户'
204
+  }
197 205
 })
198 206
 
199 207
 function handleToRedIntegral() {
@@ -201,14 +209,38 @@ function handleToRedIntegral() {
201 209
     url: '/pages/red-integral/index'
202 210
   })
203 211
 }
212
+
213
+function handleToContact(item) {
214
+  if (item.type === 'link') {
215
+    return uni.navigateTo({
216
+      url: item.url
217
+    })
218
+  }
219
+  if (item.type === 'customer') {
220
+    return uni.openCustomerServiceChat({
221
+      extInfo: {
222
+        url: item.url
223
+      },
224
+      corpId: ''
225
+    })
226
+  }
227
+}
228
+
229
+function handleShowMyProfile() {
230
+  uni.navigateTo({
231
+    url: '/pages/my-profile/index'
232
+  })
233
+}
204 234
 </script>
205 235
 <template>
206 236
   <div v-if="state.isLogin">
207 237
     <div class="bg-[#FD1642] h-40 w-full absolute top-0 left-0"></div>
208
-    <div class="flex flex-col gap-4 relative px-3">
238
+    <div class="flex flex-col gap-4 relative px-3 pb-safe">
209 239
       <div class="pt-15 ">
210 240
         <div class="flex gap-2 mb-2 text-white mb-6">
211
-          <image v-if="userStore.userInfo && userStore.userInfo.avatar" :src="userStore.userInfo.avatar" mode="widthFix"
241
+          <image v-if="userStore.userInfo && userStore.userInfo.avatar" :src="userStore.userInfo.avatar"
242
+                 @click="handleShowMyProfile"
243
+                 mode="widthFix"
212 244
                  class="w-9 h-9 rounded-full"
213 245
           ></image>
214 246
           <image
@@ -229,8 +261,9 @@ function handleToRedIntegral() {
229 261
                 {{ encodePhone(userStore.userInfo.phone) }}
230 262
               </div>
231 263
             </div>
232
-            <div class="flex rounded-full border border-solid border-1px border-yellow text-[12px] text-white w-12 h-5 justify-center items-center">
233
-              {{userType || '用户'}}
264
+            <div
265
+                class="flex rounded-full border border-solid border-1px border-yellow text-[12px] text-white w-12 h-5 justify-center items-center">
266
+              {{ userType || '用户' }}
234 267
             </div>
235 268
           </div>
236 269
 
@@ -322,10 +355,30 @@ function handleToRedIntegral() {
322 355
 
323 356
       </div>
324 357
 
358
+      <div class="bg-white rounded px-3">
359
+        <div class="flex justify-between pt-4 mb-4">
360
+          <div>联系我们</div>
361
+        </div>
362
+        <div class="flex flex-wrap ">
363
+          <div
364
+              v-for="(item, index) in contactUsList" :key="index"
365
+              @tap="handleToContact(item)"
366
+              class="flex flex-col justify-center items-center w-1/4 gap-2 mb-4"
367
+          >
368
+            <image :src="item.icon"
369
+                   mode="widthFix"
370
+                   class="w-6 h-6 "
371
+            />
372
+            <div class="text-xs">{{ item.text }}</div>
373
+          </div>
374
+        </div>
375
+
376
+      </div>
377
+
325 378
     </div>
326 379
   </div>
327 380
 
328
-<!--  <CXBAuthorize v-else/>-->
381
+  <!--  <CXBAuthorize v-else/>-->
329 382
 </template>
330 383
 <style>
331 384
 page {

+ 0 - 98
src/pages/user/info.vue

@@ -1,98 +0,0 @@
1
-<script setup lang="ts">
2
-</script>
3
-<template>
4
-  <div>
5
-    <div
6
-        class="bg-white rounded-md text-sm flex justify-between p-3 f-hairline-bottom">
7
-      <div class="">头像</div>
8
-      <div
9
-          class="f-text-color-2 i-tabler-chevron-right transform transition-300"
10
-      />
11
-    </div>
12
-    <div
13
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
14
-      <div class="">昵称</div>
15
-      <div class="flex items-center">
16
-        <div>用户4578</div>
17
-        <div
18
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
19
-        />
20
-      </div>
21
-    </div>
22
-
23
-    <div
24
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
25
-      <div class="">性别</div>
26
-      <div class="flex items-center">
27
-        <div>请选择</div>
28
-        <div
29
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
30
-        />
31
-      </div>
32
-    </div>
33
-
34
-    <div
35
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
36
-      <div class="">生日</div>
37
-      <div class="flex items-center">
38
-        <div>请选择</div>
39
-        <div
40
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
41
-        />
42
-      </div>
43
-    </div>
44
-
45
-    <div
46
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
47
-      <div class="">手机号</div>
48
-      <div class="flex items-center">
49
-        <div>13488689885</div>
50
-        <div
51
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
52
-        />
53
-      </div>
54
-    </div>
55
-
56
-    <div
57
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
58
-      <div class="">注册地</div>
59
-      <div class="flex items-center">
60
-        <div>省,市</div>
61
-        <div
62
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
63
-        />
64
-      </div>
65
-    </div>
66
-
67
-    <div
68
-        class="bg-white rounded-md text-sm flex justify-between p-3  f-hairline-bottom">
69
-      <div class="">签名</div>
70
-      <div class="flex items-center">
71
-        <div><input placeholder="请填写您的人个性签名"/></div>
72
-        <div
73
-            class="f-text-color-2 i-tabler-chevron-right transform transition-300"
74
-        />
75
-      </div>
76
-    </div>
77
-
78
-    <div class=" fixed bottom-0 w-full p-safe">
79
-      <div class="px-3 text-white">
80
-        <div class="bg-red rounded-full h-10 flex flex-col justify-center items-center text-sm">
81
-          保存修改
82
-        </div>
83
-      </div>
84
-    </div>
85
-
86
-  </div>
87
-</template>
88
-
89
-
90
-<style>
91
-page {
92
-  background-color: #f8f8f8;
93
-}
94
-</style>
95
-<route lang="yaml">
96
-style:
97
-  navigationBarTitleText: 个人资料
98
-</route>

+ 21 - 2
src/pages/vip/index.vue

@@ -1,7 +1,25 @@
1 1
 <template>
2
-  <CXBBasePage>
2
+  <CXBBasePage :show="true" title="">
3
+
3 4
     <div class="flex flex-col gap-3 ">
4
-      <image :src="homeBanner" mode="widthFix" class="h-full w-full "></image>
5
+<!--      <div-->
6
+<!--          class="overflow-hidden fixed top-0 w-full"-->
7
+<!--      >-->
8
+<!--        <nut-searchbar-->
9
+<!--            v-model="searchValue" @search="searchProduct" @clear="loadProductList('reload')">-->
10
+<!--          &lt;!&ndash;      <template v-slot:leftout>&ndash;&gt;-->
11
+<!--          &lt;!&ndash;        <div @tap="navBack">&ndash;&gt;-->
12
+<!--          &lt;!&ndash;          <nut-icon name="left"></nut-icon>&ndash;&gt;-->
13
+<!--          &lt;!&ndash;        </div>&ndash;&gt;-->
14
+<!--          &lt;!&ndash;      </template>&ndash;&gt;-->
15
+<!--          <template v-slot:rightout>-->
16
+<!--            <div @tap="searchProduct">-->
17
+<!--              搜索-->
18
+<!--            </div>-->
19
+<!--          </template>-->
20
+<!--        </nut-searchbar>-->
21
+<!--      </div>-->
22
+      <image :src="homeBanner" mode="widthFix" class="h-10 w-full "></image>
5 23
       <div class="flex px-3">
6 24
         会员专区
7 25
       </div>
@@ -108,6 +126,7 @@ function handleItemClick(item) {
108 126
 
109 127
 <route lang="yaml">
110 128
 style:
129
+  navigationStyle: custom
111 130
   navigationBarTitleText: 储蓄保会员
112 131
   enablePullDownRefresh: true
113 132
 </route>

BIN
src/static/icon/kefu_icon.png