Przeglądaj źródła

feat(mine): 添加主页数据页面并优化相关功能

- 新增主页数据页面,用于展示设计师主页的统计数据
- 优化消息中心功能,增加消息已读状态处理
- 调整个人主页布局和样式,提升用户体验
- 移除未使用的视频号关联功能相关代码
EvilDragon 4 miesięcy temu
rodzic
commit
574c264f86

+ 5 - 0
packages/app/src/core/libs/models.ts

@@ -480,12 +480,17 @@ export interface Message {
    * 图文详情(富文本)
    */
   detailBody: string
+  /**
+   *  1 已读
+   */
   isRead: string
   triggerPort: string
   triggerRole: string
   designerId: number
   businessId: any
   createTime: number
+  viewCount: any
+  viewTime: any
 }
 export enum DictType {
   /**

+ 5 - 0
packages/app/src/core/libs/requests.ts

@@ -566,6 +566,11 @@ export const getMessages = (query) =>
 export const deleteMessage = (id: string) =>
   httpPost('/app-api/member/message-manage/delete', {}, { id })
 /**
+ * 更新消息
+ */
+export const updateMessage = (data: Partial<Message>) =>
+  httpPut('/app-api/member/message-manage/update', data)
+/**
  * 积分订单取消
  */
 export const orderPointsCancel = (query: { id: string; cancelReason: string }) =>

+ 8 - 0
packages/app/src/pages.json

@@ -454,6 +454,14 @@
       }
     },
     {
+      "path": "pages/mine/homepage/statistics/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "主页数据",
+        "navigationBarBackgroundColor": "#fff"
+      }
+    },
+    {
       "path": "pages/mine/orders/code/index",
       "type": "page",
       "style": {

+ 28 - 36
packages/app/src/pages/messages/index.vue

@@ -16,6 +16,7 @@ import {
   getMessages,
   orderPointsCancel,
   orderPointsSubmit,
+  updateMessage,
 } from '../../core/libs/requests'
 import { integral, interact, system } from '../../core/libs/svgs'
 import { beforeNow } from '../../utils/date-util'
@@ -23,8 +24,8 @@ import dayjs from 'dayjs'
 import { MessageType } from '../../core/libs/enums'
 import { group } from 'radash'
 import { ComponentExposed } from 'vue-component-type-helpers'
-import { Message } from '@/core/libs/models'
-import { requestToast } from '@/core/utils/common'
+import { Message } from '../../core/libs/models'
+import { requestToast } from '../../core/utils/common'
 
 const pageHelperRef = ref<ComponentExposed<typeof PageHelper>>()
 const tab = ref(0)
@@ -33,34 +34,6 @@ const tabs = ref([
   { label: '系统消息', value: MessageType.System },
   { label: '互动消息', value: MessageType.Interact },
 ])
-const msgs = ref({
-  integral: [
-    { title: '积分变动通知', createdAt: Date.now() },
-    { title: '请确认积分', createdAt: '2023-05-05' },
-  ],
-  system: [
-    {
-      title: '新豪轩门窗入驻筑巢荟',
-      createdAt: Date.now(),
-      content: '新豪轩材料商加入筑巢荟,为筑巢荟设计师提供更好的材料和服务!',
-      img: 'https://via.placeholder.com/279x164',
-    },
-    { title: '平台通知', createdAt: Date.now(), content: '有新的材料商入驻平台,点击查看!' },
-  ],
-  interact: [
-    {
-      title: '王磊回复了你',
-      createdAt: Date.now(),
-      content: '设计师李家豪刚刚点赞了你的设计圈点击前往查看',
-    },
-    {
-      title: '李琳赞了你的设计圈',
-      createdAt: Date.now(),
-      content: '设计师李家豪刚刚点赞了你的设计圈点击前往查看',
-    },
-  ],
-})
-const messageTypes = ref([{}])
 onShow(async () => {
   nextTick(() => {
     pageHelperRef.value?.refresh()
@@ -71,7 +44,8 @@ const handleCancel = async (message: Message) => {
     () => orderPointsCancel({ id: message.businessId.toString(), cancelReason: '用户取消' }),
     { success: true, successTitle: '积分确认已驳回' },
   )
-  await deleteMessage(message.id.toString())
+  // await deleteMessage(message.id.toString())
+  await updateMessage({ id: message.id, isRead: '1' })
   await pageHelperRef.value?.refresh()
 }
 const handleSubmit = async (message: Message) => {
@@ -79,7 +53,8 @@ const handleSubmit = async (message: Message) => {
     success: true,
     successTitle: '积分已确认',
   })
-  await deleteMessage(message.id.toString())
+  // await deleteMessage(message.id.toString())
+  await updateMessage({ id: message.id, isRead: '1' })
   await pageHelperRef.value?.refresh()
 }
 </script>
@@ -147,19 +122,36 @@ const handleSubmit = async (message: Message) => {
                 </div>
                 <div class="row-start-5 col-start-2 col-end-4">
                   <div
-                    class="text-black/90 text-xs font-normal font-['PingFang_SC'] leading-[25px]"
+                    class="text-black/90 text-xs font-normal font-['PingFang_SC'] leading-[25px] my-2.5"
                   >
-                    <template v-if="[MessageType.Integral].includes(Number(it.messageType))">
+                    <template
+                      v-if="
+                        [MessageType.Integral].includes(Number(it.messageType)) && it.isRead !== '1'
+                      "
+                    >
                       <span class="text-black/40">
                         确认积分后,即刻到账,如有问题请驳回,联系材料商修改积分后再次确认
                       </span>
                     </template>
+                    <template
+                      v-else-if="
+                        [MessageType.Integral].includes(Number(it.messageType)) && it.isRead === '1'
+                      "
+                    >
+                      <span class="text-black/40">
+                        <!-- 确认积分后,即刻到账,如有问题请驳回,联系材料商修改积分后再次确认 -->
+                      </span>
+                    </template>
                     <template v-else>查看详情</template>
                   </div>
                 </div>
                 <div
-                  class="row-start-6 col-start-1 col-end-4"
-                  v-if="[MessageType.Integral].includes(Number(it.messageType))"
+                  class="row-start-6 col-start-1 col-end-4 my-1"
+                  v-if="
+                    [MessageType.Integral].includes(Number(it.messageType)) &&
+                    it.messageSubType === '31' &&
+                    it.isRead !== '1'
+                  "
                 >
                   <div class="flex gap-4">
                     <div class="flex-1">

+ 1 - 117
packages/app/src/pages/mine/homepage/channels/index.vue

@@ -2,27 +2,18 @@
 { "style": { "navigationBarTitleText": "关联视频号", "navigationBarBackgroundColor": "#fff" } }
 </route>
 <script setup lang="ts">
-import Card from '@/components/card.vue'
 import SectionHeading from '@/components/section-heading.vue'
 import { getDesignerInfo, updateDesignerInfo } from '../../../../core/libs/requests'
 import { useUserStore } from '../../../../store'
 import { storeToRefs } from 'pinia'
 import { pick } from 'radash'
 import { requestToast } from '../../../../core/utils/common'
-import UploadEvo from '@/components/upload-evo.vue'
 import BottomAppBar from '@/components/bottom-app-bar.vue'
 
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const form = ref<{
   userId?: number
-  //   serviceYears?: number | string
-  //   homePageUrl?: string
-  //   sharePageUrl?: string
-  //   designDesc?: string
-  //   designFee?: string
-  //   personalIdentity?: string
-  //   serviceCustomerCount?: number
   videoNumber?: string
 }>()
 const { data, run: setData } = useRequest(() => getDesignerInfo(userInfo.value.userId))
@@ -35,18 +26,7 @@ const handleSubmit = async () => {
 }
 onMounted(async () => {
   await setData()
-  form.value = pick(data.value, [
-    'id',
-    'userId',
-    // 'homePageUrl',
-    // 'serviceYears',
-    // 'sharePageUrl',
-    // 'designDesc',
-    // 'designFee',
-    // 'personalIdentity',
-    // 'serviceCustomerCount',
-    'videoNumber',
-  ])
+  form.value = pick(data.value, ['id', 'userId', 'videoNumber'])
 })
 </script>
 <template>
@@ -77,101 +57,5 @@ onMounted(async () => {
         </wd-button>
       </div>
     </BottomAppBar>
-    <!-- <template v-if="form">
-      <Card>
-        <div>
-          <SectionHeading title="主页封面图"></SectionHeading>
-          <div
-            class="mt-4.5 mb-2.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug"
-          >
-            用于主页形象封面图,请上传体现个人艺术设计风格的图片,建议竖图尺寸750x1920,也可上传自己的视频介绍
-          </div>
-          <UploadEvo v-model="form.homePageUrl"></UploadEvo>
-        </div>
-      </Card>
-      <Card>
-        <div>
-          <SectionHeading title="分享封面图"></SectionHeading>
-          <div
-            class="mt-4.5 mb-2.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug"
-          >
-            用于分享到微信好友的卡片封面图,尺寸1920x1080;
-          </div>
-          <UploadEvo v-model="form.sharePageUrl"></UploadEvo>
-        </div>
-      </Card>
-      <SectionHeading title="个人信息"></SectionHeading>
-      <Card>
-        <div>
-          <SectionHeading title="设计理念" subtitle="请输入设计理念"></SectionHeading>
-          <div
-            class="mt-4.5 mx--3.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug"
-          >
-            <wd-textarea
-              placeholder="例:设计没有风格,设计是对生活的一种诠释,不是所谓的造型与装饰!"
-              v-model="form.designDesc"
-            />
-          </div>
-          <div class="text-end text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug">
-            0/100
-          </div>
-        </div>
-      </Card>
-      <Card>
-        <div>
-          <SectionHeading title="个人信息" subtitle="请输入关于自己身份体现"></SectionHeading>
-          <div
-            class="mt-4.5 mx--3.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug"
-          >
-            <wd-textarea
-              placeholder="例:中国室内装饰协会会员、 xxx 空间设计事务所创始人、筑巢奖金奖设计师等等"
-              v-model="form.personalIdentity"
-            />
-          </div>
-          <div class="text-end text-black/40 text-xs font-normal font-['PingFang_SC'] leading-snug">
-            0/100
-          </div>
-        </div>
-      </Card>
-      <Card>
-        <div>
-          <SectionHeading title="设计费">
-            <template #append>
-              <div class="flex">
-                <wd-input no-border v-model="form.designFee"></wd-input>
-                <div
-                  class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-relaxed"
-                >
-                  元/㎡
-                </div>
-              </div>
-            </template>
-          </SectionHeading>
-        </div>
-      </Card>
-      <Card>
-        <div>
-          <SectionHeading title="服务客户数">
-            <template #append>
-              <wd-input
-                placeholder="请输入真实客户数"
-                no-border
-                v-model="form.serviceCustomerCount"
-              ></wd-input>
-            </template>
-          </SectionHeading>
-        </div>
-      </Card>
-      <Card>
-        <div>
-          <SectionHeading title="从业年限">
-            <template #append>
-              <wd-input placeholder="请输入年限" no-border v-model="form.serviceYears"></wd-input>
-            </template>
-          </SectionHeading>
-        </div>
-      </Card>
-      <div class=""><wd-button block :round="false" @click="handleSubmit">保存</wd-button></div>
-    </template> -->
   </div>
 </template>

+ 22 - 8
packages/app/src/pages/mine/homepage/index.vue

@@ -48,11 +48,25 @@ const { data: designerInfo, run: setDesignerInfo } = useRequest(() => getDesigne
   initialData: {},
 })
 const isOwn = computed(() => userInfo.value?.userId === id.value)
-const skills = computed(() => [
-  { label: '从业年限', value: designerInfo.value.serviceYears },
-  { label: '客户', value: designerInfo.value.serviceCustomerCount },
-  { label: '设计费', value: `${designerInfo.value.designFee}元/㎡` },
-])
+const skills = computed(() =>
+  [
+    {
+      label: '从业年限',
+      value: designerInfo.value?.serviceYears,
+      show: designerInfo.value?.serviceYears,
+    },
+    {
+      label: '客户',
+      value: designerInfo.value?.serviceCustomerCount,
+      show: designerInfo.value?.serviceCustomerCount,
+    },
+    {
+      label: '设计费',
+      value: `${designerInfo.value?.designFee}元/㎡`,
+      show: designerInfo.value?.designFee,
+    },
+  ].filter(({ show }) => show),
+)
 const query = computed(() => ({
   circleType: tab.value,
   stylistId: id.value,
@@ -113,7 +127,7 @@ defineExpose({
       />
       <div class="absolute bottom-0 left-0 right-0">
         <div class="bg-gradient-to-t from-black to-transparent">
-          <div class="flex">
+          <div class="flex min-h-27">
             <div
               class="w-18 h-18 border-white border border-solid mx-3.5 rounded-full overflow-hidden"
             >
@@ -128,7 +142,7 @@ defineExpose({
                 {{ memberInfo.name }}
               </div>
               <div class="flex flex-wrap gap-4">
-                <template v-for="(it, i) in designerInfo?.personalIdentity.split('、')" :key="i">
+                <template v-for="(it, i) in designerInfo?.personalIdentity?.split('、')" :key="i">
                   <div
                     class="h-6 px-2 bg-black/10 rounded-[30px] border border-solid border-white/60 justify-center items-center gap-2.5 inline-flex"
                   >
@@ -147,7 +161,7 @@ defineExpose({
       </div>
     </div>
     <div class="flex-grow flex flex-col bg-white rounded-t-2xl relative bottom-4 gap-5 px-3.5 pt-5">
-      <div class="flex gap-4">
+      <div class="flex gap-4" v-if="skills.length">
         <template v-for="(it, i) in skills" :key="i">
           <div>
             <span

+ 63 - 0
packages/app/src/pages/mine/homepage/statistics/index.vue

@@ -0,0 +1,63 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "主页数据", "navigationBarBackgroundColor": "#fff" } }
+</route>
+<script setup lang="ts">
+import SectionHeading from '@/components/section-heading.vue'
+import { getDesignerInfo, updateDesignerInfo } from '../../../../core/libs/requests'
+import { useUserStore } from '../../../../store'
+import { storeToRefs } from 'pinia'
+import { pick } from 'radash'
+import { requestToast } from '../../../../core/utils/common'
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import Card from '@/components/card.vue'
+
+const userStore = useUserStore()
+const { userInfo } = storeToRefs(userStore)
+const form = ref<{
+  userId?: number
+  videoNumber?: string
+}>()
+const { data, run: setData } = useRequest(() => getDesignerInfo(userInfo.value.userId))
+const { loading, run: submiting } = useRequest(() => updateDesignerInfo(form.value))
+const handleSubmit = async () => {
+  await requestToast(submiting, {
+    success: true,
+    successTitle: '关联成功',
+  }).then(() => setData())
+}
+onMounted(async () => {
+  await setData()
+  form.value = pick(data.value, ['id', 'userId', 'videoNumber'])
+})
+</script>
+<template>
+  <div class="flex-grow flex flex-col gap-5 px-3.5 py-6">
+    <Card>1</Card>
+    <!-- <SectionHeading title="如何关联视频号?" size="sm"></SectionHeading>
+    <img class="w-[347px] h-[186px] rounded-2xl" src="https://via.placeholder.com/347x186" />
+    <SectionHeading title="视频号ID" size="sm"></SectionHeading>
+    <div class="bg-[#f6f6f6] rounded-lg px-3.5 py-2.5">
+      <wd-input
+        v-model="form.videoNumber"
+        placeholder="请输入视频号ID"
+        no-border
+        custom-class="bg-[#f6f6f6]!"
+      ></wd-input>
+    </div>
+    <BottomAppBar fixed :border="false">
+      <div>
+        <div class="text-center mb-5.5">
+          <span class="text-black/40 text-xs font-normal font-['PingFang SC'] leading-tight">
+            点击确认关联即表示同意
+          </span>
+          <span class="text-[#0cbe7c] text-xs font-normal font-['PingFang SC'] leading-tight">
+            《个人微信视频号授权使用协议》
+          </span>
+        </div>
+        <wd-button :round="false" block :loading="loading" @click="handleSubmit">
+          确定关联
+        </wd-button>
+      </div>
+    </BottomAppBar> -->
+  </div>
+</template>

+ 0 - 5
packages/app/src/pages/mine/index.vue

@@ -186,10 +186,6 @@ const handleClickScan = async () => {
   }
   router.push(`/pages/mine/scan/result/index?result=${result}`)
 }
-const handle2Video = () => {
-  // wx.openChannelsUserProfile({ finderUserName: 'sphtEhk7olIepB0' })
-  uni.openChannelsUserProfile({ finderUserName: 'sphtEhk7olIepB0' })
-}
 const navBarProps = ref({ customClass: 'bg-transparent!' })
 onMounted(async () => {
   await setLevelConfigs()
@@ -409,7 +405,6 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
       ></TasksCard>
       <SectionHeading custom-class="my-6" title="和筑巢荟一起共同成长"></SectionHeading>
       <CardMenu :items="pieces" custom-class="grid-cols-2" />
-      <wd-button @click="handle2Video">视频号</wd-button>
     </view>
   </view>
 </template>

+ 1 - 0
packages/app/src/types/uni-pages.d.ts

@@ -52,6 +52,7 @@ interface NavigateToOptions {
        "/pages/mine/homepage/channels/index" |
        "/pages/mine/homepage/consult/index" |
        "/pages/mine/homepage/edit/index" |
+       "/pages/mine/homepage/statistics/index" |
        "/pages/mine/orders/code/index" |
        "/pages/mine/orders/detail/index" |
        "/pages/mine/scan/result/index" |