Browse Source

fix(app): 活动列表

EvilDragon 4 months ago
parent
commit
986907167f

+ 5 - 3
packages/app/env/.env.development

@@ -5,11 +5,13 @@ VITE_DELETE_CONSOLE = false
 # 是否开启sourcemap
 VITE_SHOW_SOURCEMAP = true
 
-# VITE_SERVER_BASEURL = 'https://www.zhuchaohui.com'
+VITE_SERVER_BASEURL = 'https://www.zhuchaohui.com'
 # VITE_SERVER_BASEURL = 'http://39.106.91.179:48080'
 # VITE_SERVER_BASEURL = 'http://192.168.2.34:48080'
 # 王超
 # VITE_SERVER_BASEURL = 'http://192.168.2.39:48080'
 # VITE_SERVER_BASEURL = 'http://192.168.0.157:48080'
-# 刘
-VITE_SERVER_BASEURL = 'http://192.168.2.38:48080'
+# 刘岁成
+# VITE_SERVER_BASEURL = 'http://192.168.2.38:48080'
+# 赵要军
+# VITE_SERVER_BASEURL = 'http://192.168.2.41:48080'

+ 7 - 0
packages/app/pages.config.ts

@@ -53,6 +53,13 @@ export default defineUniPages({
       { name: '设计师认证', path: 'pages/mine/authentication/index' },
       { name: '设计师认证提交成功', path: 'pages/mine/authentication/submit/success/index' },
       { name: '设计师个人主页', path: 'pages/mine/homepage/index' },
+      {
+        name: '确认订单',
+        path: '/pages/home/mall/confirm-order/index',
+        query:
+          'data={"isShoppingCart":0,"userId":287,"list":[{"orderNo":"241028151736FX00004","productId":"6719ed0ae4b09baa6eb01481","points":0,"nums":1}],"couponList":[],"totalsPoints":0,"totalsCouponPoints":0,"totalsCurrPoints":0}',
+      },
+      { name: '商品兑换成功', path: '/pages/home/mall/purchased/success/index' },
     ],
   },
 })

+ 74 - 3
packages/app/src/core/libs/requests.ts

@@ -410,12 +410,43 @@ export const deleteProductItemBuy = (data: {
  */
 export const productPlacing = (data: {
   isShoppingCart: number
+  userId: number
   list: {
-    userId: number
-    productId: string
-    couponIds: any[]
+    orderNo?: string
+    productId?: string
+    points?: number
+    nums?: number
   }[]
+  couponList: {
+    couponId: number
+    brandPoints: number
+  }[]
+  totalsPoints?: number
+  totalsCouponPoints?: number
+  totalsCurrPoints?: number
 }) => httpPost('/app-api/member/points-order/placing', data)
+/**
+ * 订单结算
+ */
+export const orderPay = (data: {
+  isShoppingCart: number
+  userId: number
+  list: {
+    orderNo?: string
+    productId?: string
+    points?: number
+    nums?: number
+  }[]
+  couponList: {
+    couponId: number
+    brandPoints: number
+  }[]
+  totalsPoints?: number
+  totalsCouponPoints?: number
+  totalsCurrPoints?: number
+}) => httpPost(`/app-api/member/points-order/placingPay`, data)
+export const getPointsOrders = (query) =>
+  httpGet<{ list: []; total: number }>('/app-api/member/points-order/page', query)
 export const getActivities = (query) =>
   httpGet<{
     list: Activity[]
@@ -495,9 +526,49 @@ export const getStudyTourSignups = (query: { studyId: string }) =>
 export const getBanners = (query: { mode: BannerMode }) =>
   httpGet<Banner[]>('/app-api/member/banner/get-by-mode', query)
 /**
+ * 获取消息列表
+ */
+export const getMessages = (query) => httpGet('/app-api/member/message-manage/page', query)
+/**
  * 获取Banner
  */
 export const getBanner = (id) => httpGet<Banner>('/app-api/member/banner/get-by-id', { id })
+/**
+ * 获取积分明细列表
+ */
+export const getPoints = (query) =>
+  httpGet<{
+    list: {
+      id: number
+      pointsType: string
+      typeName: string
+      pointsCategory: string
+      categoryName: string
+      sourceId: number
+      name: string
+      pointsStauts: string
+      points: number
+      orderMoney: string
+      materialsId: number
+      materialsBrand: string
+      stylistId: number
+      brokerId: number
+      stylistName: string
+      brokerName: string
+      generateTime: string
+      verifyTime: string
+      completeTime: string
+      turnDownTime: string
+      cancelTime: string
+      cancelReason: string
+      turnDownReason: string
+      remark: string
+      couponId: number
+      orderNo: string
+      createTime: string
+    }[]
+    total: number
+  }>(`/app-api/member/points-details/pageAllByYear/${query.year}`, query)
 export const refreshToken = (refreshToken: string) =>
   httpPost<any>('/app-api/member/auth/refresh-token', {}, { refreshToken })
 export const httpGetMock = <T>(data: T) =>

+ 21 - 35
packages/app/src/core/models/moment.ts

@@ -322,47 +322,18 @@ export interface Activity {
    */
   ifSingnUp: boolean
 }
-/**
- * 学习计划对象
- * @typedef {Object} StudyPlan
- * @property {number} id - 唯一标识符,表示该学习计划的ID
- * @property {string} name - 学习计划的名称
- * @property {string} studyType - 学习类型,例如在线学习、面授课程等
- * @property {number} planApplyStartTime - 申请开始时间的时间戳
- * @property {number} planApplyEndTime - 申请结束时间的时间戳
- * @property {number} planStudyStartTime - 学习计划开始时间的时间戳
- * @property {number} planStudyEndTime - 学习计划结束时间的时间戳
- * @property {any} planStudyAllowType - 允许的学习方式类型,可能是枚举或字符串
- * @property {any} planStudyAllowCount - 允许的学习次数,可能是数字或其他类型
- * @property {string} studyYear - 学习年度,例如2023
- * @property {any} memberLevel - 参与学习计划所需的会员等级,可能是数字或字符串
- * @property {any} needPointsType - 所需积分类型,可能是枚举或字符串
- * @property {any} needPointsCount - 所需积分数量,可能是数字或其他类型
- * @property {any} badgeId - 相关的徽章ID,可能是数字或字符串
- * @property {any} applyStartTime - 实际申请开始时间,可能是时间戳或其他格式
- * @property {any} applyEndTime - 实际申请结束时间,可能是时间戳或其他格式
- * @property {string} applyStatus - 申请状态,例如“开放”、“关闭”等
- * @property {any} studyStartTime - 实际学习开始时间,可能是时间戳或其他格式
- * @property {any} studyEndTime - 实际学习结束时间,可能是时间戳或其他格式
- * @property {any} studyAllowType - 实际允许的学习方式类型,可能是枚举或字符串
- * @property {any} studyAllowCount - 实际允许的学习次数,可能是数字或其他类型
- * @property {any} bannerUrl - 横幅图像的URL,用于展示
- * @property {any} thumbnailUrl - 缩略图的URL,用于展示
- * @property {any} backgroundUrl - 背景图像的URL,用于展示
- * @property {any} studyDesc - 学习计划的描述信息
- * @property {any} isTravelPlan - 是否为旅行计划,可能是布尔值或其他类型
- * @property {string} showStatus - 显示状态,例如“可见”、“隐藏”等
- * @property {string} headRecommend - 推荐信息或标语
- * @property {any} viewCount - 查看次数,可能是数字或其他类型
- * @property {number} createTime - 创建时间的时间戳
- * @property {boolean} ifSingnUp - 是否已经报名,布尔值
- */
 export interface StudyTour {
   id: number
   name: string
   studyType: string
+  /**
+   * 计划报名时间
+   */
   planApplyStartTime: number
   planApplyEndTime: number
+  /**
+   * 计划游学时间
+   */
   planStudyStartTime: number
   planStudyEndTime: number
   planStudyAllowType: any
@@ -389,6 +360,21 @@ export interface StudyTour {
   viewCount: any
   createTime: number
   ifSingnUp: boolean
+  studyTravelList: {
+    createTime: number
+    updateTime: number
+    creator: string
+    updater: string
+    deleted: boolean
+    id: number
+    studyId: number
+    travelDate: number
+    travelTime: number
+    title: string
+    travelDesc: string
+    clockExplainDesc: string
+    clockExplainUrl: string
+  }[]
 }
 export interface Banner {
   id: number

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

@@ -64,6 +64,15 @@
       {
         "name": "设计师个人主页",
         "path": "pages/mine/homepage/index"
+      },
+      {
+        "name": "确认订单",
+        "path": "/pages/home/mall/confirm-order/index",
+        "query": "data={\"isShoppingCart\":0,\"userId\":287,\"list\":[{\"orderNo\":\"241028151736FX00004\",\"productId\":\"6719ed0ae4b09baa6eb01481\",\"points\":0,\"nums\":1}],\"couponList\":[],\"totalsPoints\":0,\"totalsCouponPoints\":0,\"totalsCurrPoints\":0}"
+      },
+      {
+        "name": "商品兑换成功",
+        "path": "/pages/home/mall/purchased/success/index"
       }
     ]
   },
@@ -433,6 +442,14 @@
       }
     },
     {
+      "path": "pages/home/mall/purchased/success/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationBarBackgroundColor": "#fff"
+      }
+    },
+    {
       "path": "pages/home/spread/case-shooting/photographer/index",
       "type": "page",
       "style": {

+ 61 - 8
packages/app/src/pages/home/activity/detail/index.vue

@@ -42,7 +42,8 @@ const router = useRouter()
 const id = ref()
 const type = ref<'activity' | 'studyTour'>()
 const activityTypes = ref({ activity: '活动', studyTour: '游学' })
-const request = ref<() => Promise<IResData<Partial<Activity | StudyTour>>>>()
+const tab = ref(0)
+const request = ref<() => Promise<IResData<Partial<StudyTour> | Partial<Activity>>>>()
 const { data, run: setData } = useRequest(() => request.value(), { initialData: {} })
 const { data: signups, run: setSignups } = useRequest(
   () => getActivitySignups({ activityId: id.value }),
@@ -69,16 +70,24 @@ const infos = computed(() => [
     icon: calendar,
     title: `${activityTypes.value[type.value]}时间`,
     content: [
-      dayjs(data.value.activityStartTime).format('YYYY.MM.DD'),
-      dayjs(data.value.activityEndTime).format('YYYY.MM.DD'),
+      dayjs(
+        'activityStartTime' in data.value
+          ? data.value.activityStartTime
+          : data.value.studyStartTime || data.value.planStudyStartTime,
+      ).format('YYYY.MM.DD'),
+      dayjs(
+        'activityEndTime' in data.value
+          ? data.value.activityEndTime
+          : data.value.studyEndTime || data.value.planStudyEndTime,
+      ).format('YYYY.MM.DD'),
     ],
     visable: true,
   },
   {
     icon: location,
     title: `${activityTypes.value[type.value]}地点`,
-    content: [data.value.activityAddr],
-    visable: true,
+    content: ['activityAddr' in data.value ? data.value.activityAddr : ''],
+    visable: isActivity.value,
   },
   {
     icon: user,
@@ -214,7 +223,7 @@ onLoad(async (query: { id: string; type: 'activity' | 'studyTour' }) => {
       class="px-4 py-6 bg-[#010102]/30 backdrop-blur-[20px] rounded-2xl my-8 flex flex-col gap-3"
     >
       <template v-for="(it, i) in infos" :key="i">
-        <div class="flex items-center gap-1.5">
+        <div v-if="it.show" class="flex items-center gap-1.5">
           <wd-img width="16" height="16" :src="it.icon"></wd-img>
           <div
             class="w-[70px] text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal"
@@ -238,7 +247,7 @@ onLoad(async (query: { id: string; type: 'activity' | 'studyTour' }) => {
     </div>
     <div v-if="isStudyTour" class="w-50%">
       <wd-config-provider :themeVars="themeVars">
-        <wd-tabs class="bg-transparent!" custom-class="bg-transparent!">
+        <wd-tabs v-model="tab" class="bg-transparent!" custom-class="bg-transparent!">
           <wd-tab title="活动介绍"></wd-tab>
           <wd-tab title="行程安排"></wd-tab>
         </wd-tabs>
@@ -248,16 +257,60 @@ onLoad(async (query: { id: string; type: 'activity' | 'studyTour' }) => {
 
     <div class="mt-5 mx-3.5">
       <div
+        v-if="tab === 0"
         class="text-justify text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-relaxed"
       >
         {{ data['activityDesc'] }}
       </div>
+      <div v-if="tab === 1 && 'studyTravelList' in data">
+        <template v-for="(it, i) in data.studyTravelList" :key="i">
+          <div class="flex flex-col">
+            <div class="text-white text-base font-normal font-['PingFang_SC'] leading-normal">
+              6月26日 第一天
+            </div>
+            <div class="flex">
+              <div class="w-[27px] h-[27px] bg-white/10 rounded-full"></div>
+              <div class="flex flex-col">
+                <div class="flex">
+                  <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-normal">
+                    9:00
+                  </div>
+                  <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-normal">
+                    <!-- 早稻田大学课程 -->
+                    {{ it.title }}
+                  </div>
+                </div>
+                <div class="w-[298px] h-[114px]">
+                  <span
+                    class="text-[#c1c1c1] text-sm font-normal font-['PingFang_SC'] leading-[23px]"
+                  >
+                    行程介绍:
+                  </span>
+                  <span
+                    class="text-[#ababab] text-sm font-normal font-['PingFang_SC'] leading-[23px]"
+                  >
+                    <!-- 是位于日本东京都新宿区的一所著名的私立大学。它由早稻田大学的创始人大隈重信于1882年创立,是日本超级国际化大学计划(Top
+                    Global University Project)选定的大学之一,也是日本顶尖的高等教育机构之一。 -->
+                    {{ it.travelDesc }}
+                  </span>
+                </div>
+                <div class="flex">
+                  <div class="text-white text-xs font-normal font-['PingFang_SC'] leading-normal">
+                    打卡示例
+                  </div>
+                </div>
+                <img class="w-[298px] h-[193px] rounded-2xl border" :src="it.clockExplainUrl" />
+              </div>
+            </div>
+          </div>
+        </template>
+      </div>
     </div>
     <BottomAppBar fixed placeholder transparent>
       <div
         class="h-[63px] bg-white/90 rounded-2xl backdrop-blur-[20px] flex items-center gap-1 px-4 box-border"
       >
-        <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">
+        <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-normal">
           {{ data.needPointsCount }}
         </div>
         <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">

+ 47 - 20
packages/app/src/pages/home/mall/confirm-order/index.vue

@@ -15,11 +15,35 @@ import InvertedTrapezoidButton from '@/components/inverted-trapezoid-button.vue'
 import TrapeziumButton from '@/components/trapezium-button.vue'
 import Card from '@/components/card.vue'
 import SectionHeading from '@/components/section-heading.vue'
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import { requestToast } from '@/core/utils/common'
+import { orderPay } from '@/core/libs/requests'
+import { useUserStore } from '@/store'
+import { storeToRefs } from 'pinia'
+import { useRouter } from '@/core/utils/router'
 
-const data = ref(['https://via.placeholder.com/347x128'])
+const router = useRouter()
+const userStore = useUserStore()
+const { userInfo } = storeToRefs(userStore)
 const products = ref([{}, {}, {}])
-const show = ref(true)
+const show = ref(false)
 const a = ref(1)
+const data = ref()
+const handlePay = async () => {
+  const { code } = await requestToast(
+    () =>
+      orderPay({
+        ...data.value,
+      }),
+    { success: true, successTitle: '兑换成功' },
+  )
+  if (code === 0) {
+    router.push('/pages/home/mall/purchased/success/index')
+  }
+}
+onLoad(async (query: { data: string }) => {
+  data.value = JSON.parse(query.data)
+})
 </script>
 
 <template>
@@ -55,29 +79,32 @@ const a = ref(1)
         <SectionHeading title="实付积分" end-text="1360" size="sm"></SectionHeading>
       </div>
     </Card>
-    <div class="h-[63px] bg-white backdrop-blur-[20px] flex px-3.5 items-center justify-between">
-      <div class="flex">
-        <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">
-          1280
-        </div>
-        <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
-          积分
+    <BottomAppBar fixed placeholder>
+      <div class="h-[63px] bg-white backdrop-blur-[20px] flex px-3.5 items-center justify-between">
+        <div class="flex">
+          <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">
+            1280
+          </div>
+          <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
+            积分
+          </div>
         </div>
-      </div>
-      <div class="" @click="show = true">
-        <TrapeziumButton size="large">
-          <div
-            class="w-[49px] h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"
-          >
+        <div class="" @click="show = true">
+          <TrapeziumButton size="large">
             <div
-              class="w-[65px] h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"
+              class="w-[49px] h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"
             >
-              确认兑换
+              <div
+                class="w-[65px] h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"
+                @click="handlePay"
+              >
+                确认兑换
+              </div>
             </div>
-          </div>
-        </TrapeziumButton>
+          </TrapeziumButton>
+        </div>
       </div>
-    </div>
+    </BottomAppBar>
     <wd-action-sheet title="优惠券" v-model="show">
       <view class="">
         <wd-tabs>

+ 5 - 2
packages/app/src/pages/home/mall/detail/index.vue

@@ -32,12 +32,15 @@ const { data, run: setData } = useRequest(() => getProduct(id.value))
 
 const handleConfirm = async () => {
   if (type.value === 'orderNow') {
-    await requestToast(() =>
+    const { data: res } = await requestToast(() =>
       productPlacing({
         isShoppingCart: 0,
-        list: [{ userId: userInfo.value.userId, productId: id.value, couponIds: [] }],
+        userId: userInfo.value.userId,
+        list: [{ productId: id.value, points: data.value.needPoints, nums: 1 }],
+        couponList: [],
       }),
     )
+    router.push(`/pages/home/mall/confirm-order/index?data=${JSON.stringify(res)}`)
   }
 }
 onLoad(async (query: { id: string }) => {

+ 36 - 0
packages/app/src/pages/home/mall/purchased/success/index.vue

@@ -0,0 +1,36 @@
+<route lang="json">
+{
+  "style": {
+    "navigationBarTitleText": "",
+    "navigationBarBackgroundColor": "#fff"
+  }
+}
+</route>
+<script setup lang="ts">
+import { success } from '../../../../../core/libs/svgs'
+import { useUserStore } from '../../../../../store'
+import { useRouter } from '../../../../../core/utils/router'
+
+const userStore = useUserStore()
+const router = useRouter()
+const handle2Orders = () => {
+  router.push('/pages/mine/orders/index')
+}
+const handle2Mall = () => {
+  router.push('/pages/home/mall/index')
+}
+</script>
+<template>
+  <div class="flex-grow flex flex-col px-3.5 justify-center items-center gap-7 bg-white">
+    <wd-img width="60" height="60" :src="success" custom-class="mb-4.5"></wd-img>
+    <div class="mb-10 text-black/90 text-xl font-normal font-['PingFang_SC'] leading-none">
+      兑换成功
+    </div>
+    <div class="w-full">
+      <wd-button block :round="false" @click="handle2Orders">查看订单</wd-button>
+    </div>
+    <div class="w-full">
+      <wd-button block :round="false" @click="handle2Mall">返回商城</wd-button>
+    </div>
+  </div>
+</template>

+ 10 - 32
packages/app/src/pages/home/study-tour/components/study-tour-card.vue

@@ -6,7 +6,7 @@ import { useRouter } from '../../../../core/utils/router'
 import { map } from '@designer-hub/assets/src/assets/svgs'
 import { NetImages } from '../../../../core/libs/net-images'
 import ActivityCountDown from '../../components/activity-count-down.vue'
-import { getActivityStatusButtonText } from '../../../../core/utils/common'
+import { getActivityStatusButtonText, getActivityStatusText } from '../../../../core/utils/common'
 
 const props = defineProps<{ customClass?: string; options?: StudyTour }>()
 
@@ -30,7 +30,14 @@ const toDetail = () => {
         </div>
         <div class="flex-1"></div>
         <div class="bg-[#f3f3f3] rounded-[20px] backdrop-blur-[15px] px-4 py-1.5">
-          <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">未开始</div>
+          <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
+            {{
+              getActivityStatusText(
+                options?.applyStartTime || options?.planApplyStartTime,
+                options?.applyEndTime || options?.planApplyEndTime,
+              )
+            }}
+          </div>
         </div>
       </div>
       <div class="flex gap-4 pt-2">
@@ -61,7 +68,7 @@ const toDetail = () => {
             <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
               兑换积分:
             </div>
-            <div class="text-[#ef4343] text-xl font-normal font-['D-DIN Exp'] leading-[34px]">
+            <div class="text-[#ef4343] text-xl font-normal font-['D-DIN_Exp'] leading-[34px]">
               {{ options?.needPointsCount }}
             </div>
           </div>
@@ -69,35 +76,6 @@ const toDetail = () => {
         <div></div>
       </div>
       <div class="flex justify-between">
-        <!-- <view
-          class="flex items-center text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]"
-        >
-          距结束还剩
-          <view
-            class="w-4 h-4 bg-black/90 rounded flex-col justify-center items-center gap-2.5 inline-flex mx-1.5"
-          >
-            <view class="text-white text-[10px] font-normal font-['PingFang_SC'] leading-[10.18px]">
-              05
-            </view>
-          </view>
-          天
-          <div
-            class="w-4 h-4 bg-black/90 rounded flex-col justify-center items-center gap-2.5 inline-flex mx-1.5"
-          >
-            <div class="text-white text-[10px] font-normal font-['PingFang_SC'] leading-[10.18px]">
-              05
-            </div>
-          </div>
-          时
-          <div
-            class="w-4 h-4 bg-black/90 rounded flex-col justify-center items-center gap-2.5 inline-flex mx-1.5"
-          >
-            <div class="text-white text-[10px] font-normal font-['PingFang_SC'] leading-[10.18px]">
-              05
-            </div>
-          </div>
-          分
-        </view> -->
         <ActivityCountDown
           :start-at="options?.applyStartTime || options?.planApplyStartTime"
           :end-at="options?.applyEndTime || options?.planApplyEndTime"

+ 65 - 50
packages/app/src/pages/messages/index.vue

@@ -1,12 +1,17 @@
-<route lang="yaml">
-layout: tabbar
-style:
-  navigationBarTitleText: 消息
-  navigationBarBackgroundColor: '#fff'
+<route lang="json">
+{
+  "layout": "tabbar",
+  "style": {
+    "navigationBarTitleText": "消息",
+    "navigationBarBackgroundColor": "#fff"
+  }
+}
 </route>
 
 <script setup lang="ts">
 import Card from '@/components/card.vue'
+import PageHelper from '@/components/page-helper.vue'
+import { getMessages } from '@/core/libs/requests'
 import { integral, interact, system } from '@/core/libs/svgs'
 import { beforeNow } from '@/utils/date-util'
 import dayjs from 'dayjs'
@@ -53,53 +58,63 @@ const msgs = ref({
         <wd-tab :title="`${label}`" :name="value"></wd-tab>
       </block>
     </wd-tabs>
-    <div class="p-3.5 gap-3.5 flex flex-col">
-      <template v-for="({ title, createdAt, content, img }, i) in msgs[tab]" :key="i">
-        <Card>
-          <div class="grid items-center grid-cols-[38px_auto_100px]">
-            <div class="row-start-1 col-start-1">
-              <div
-                class="w-[30px] h-[30px] bg-neutral-100 rounded-full mr-2 flex items-center justify-center"
-              >
-                <wd-img
-                  width="18"
-                  height="18"
-                  :src="{ integral: integral, system: system, interact: interact }[tab]"
-                ></wd-img>
+    <PageHelper :request="getMessages" :query="{}">
+      <template #default="{ source }">
+        <div class="p-3.5 gap-3.5 flex flex-col">
+          <template v-for="({ title, createdAt, content, img }, i) in source.list" :key="i">
+            <Card>
+              <div class="grid items-center grid-cols-[38px_auto_100px]">
+                <div class="row-start-1 col-start-1">
+                  <div
+                    class="w-[30px] h-[30px] bg-neutral-100 rounded-full mr-2 flex items-center justify-center"
+                  >
+                    <wd-img
+                      width="18"
+                      height="18"
+                      :src="{ integral: integral, system: system, interact: interact }[tab]"
+                    ></wd-img>
+                  </div>
+                </div>
+                <div class="row-start-1 col-start-2 text-start">
+                  <div
+                    class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[30px]"
+                  >
+                    {{ title }}
+                  </div>
+                </div>
+                <div class="row-start-1 col-start-3 text-end">
+                  <div
+                    class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]"
+                  >
+                    {{ beforeNow(dayjs(createdAt).toDate()) }}
+                  </div>
+                </div>
+                <div class="row-start-2 col-start-2 col-end-4">
+                  <div
+                    class="my-3 text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[25px]"
+                  >
+                    {{ content }}
+                  </div>
+                </div>
+                <div v-if="img" class="row-start-3 col-start-2 col-end-4">
+                  <img class="w-[279px] h-[164px] rounded-md" :src="img" />
+                </div>
+                <div class="row-start-4 col-start-1 col-end-4 my-2">
+                  <div v-if="!img" class="bg-[#dadada] w-full h-[1px]"></div>
+                </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]"
+                  >
+                    查看详情
+                  </div>
+                </div>
               </div>
-            </div>
-            <div class="row-start-1 col-start-2 text-start">
-              <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[30px]">
-                {{ title }}
-              </div>
-            </div>
-            <div class="row-start-1 col-start-3 text-end">
-              <div class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]">
-                {{ beforeNow(dayjs(createdAt).toDate()) }}
-              </div>
-            </div>
-            <div class="row-start-2 col-start-2 col-end-4">
-              <div
-                class="my-3 text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[25px]"
-              >
-                {{ content }}
-              </div>
-            </div>
-            <div v-if="img" class="row-start-3 col-start-2 col-end-4">
-              <img class="w-[279px] h-[164px] rounded-md" :src="img" />
-            </div>
-            <div class="row-start-4 col-start-1 col-end-4 my-2">
-              <div v-if="!img" class="bg-[#dadada] w-full h-[1px]"></div>
-            </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]">
-                查看详情
-              </div>
-            </div>
-          </div>
-        </Card>
+            </Card>
+          </template>
+        </div>
       </template>
-    </div>
+    </PageHelper>
   </view>
 </template>
 

+ 4 - 2
packages/app/src/pages/mine/homepage/edit/index.vue

@@ -95,14 +95,16 @@ const handleChange = () => {}
     <Card>
       <div>
         <SectionHeading title="服务客户数">
-          <template #append><wd-input label="请输入真实客户数" no-border></wd-input></template>
+          <template #append>
+            <wd-input placeholder="请输入真实客户数" no-border></wd-input>
+          </template>
         </SectionHeading>
       </div>
     </Card>
     <Card>
       <div>
         <SectionHeading title="从业年限">
-          <template #append><wd-input placehoder="请输入年限" no-border></wd-input></template>
+          <template #append><wd-input placeholder="请输入年限" no-border></wd-input></template>
         </SectionHeading>
       </div>
     </Card>

+ 50 - 35
packages/app/src/pages/mine/orders/index.vue

@@ -3,48 +3,63 @@
 </route>
 <script setup lang="ts">
 import Card from '@/components/card.vue'
+import PageHelper from '@/components/page-helper.vue'
+import { getPointsOrders } from '../../../core/libs/requests'
+import { useUserStore } from '../../../store'
+import { storeToRefs } from 'pinia'
 
-const data = ref([{}, {}, {}])
+const userStore = useUserStore()
+const { userInfo } = storeToRefs(userStore)
 const handleClick = () => {
   uni.navigateTo({ url: '/pages/mine/orders/detail/index' })
 }
 </script>
 <template>
   <div class="flex-grow flex flex-col gap-4 px-3.5 py-5">
-    <template v-for="({}, i) in data" :key="i">
-      <div @click="handleClick">
-        <Card>
-          <div class="flex gap-4">
-            <wd-img
-              width="94"
-              height="94"
-              custom-class="rounded-2xl overflow-hidden"
-              src="https://via.placeholder.com/94x94"
-            />
-            <div class="flex flex-col flex-1">
-              <div class="text-black text-base font-normal font-['PingFang_SC'] leading-normal">
-                方晓峰
-              </div>
-              <div
-                class="text-start text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal"
-              >
-                x1
-              </div>
-              <div class="flex-1"></div>
-              <div
-                class="text-start text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal"
-              >
-                1600积分
-              </div>
+    <PageHelper :request="getPointsOrders" :query="{}" class="flex-grow flex flex-col">
+      <template #default="{ source }">
+        <div class="flex-grow flex flex-col gap-4">
+          <template v-for="(it, i) in source.list" :key="i">
+            <div @click="handleClick">
+              <Card>
+                <div class="flex gap-4">
+                  <wd-img
+                    width="94"
+                    height="94"
+                    custom-class="rounded-2xl overflow-hidden"
+                    src="https://via.placeholder.com/94x94"
+                  />
+                  <div class="flex flex-col flex-1">
+                    <div
+                      class="text-black text-base font-normal font-['PingFang_SC'] leading-normal"
+                    >
+                      {{ it.projectName }}
+                    </div>
+                    <div
+                      class="text-start text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal"
+                    >
+                      x1
+                    </div>
+                    <div class="flex-1"></div>
+                    <div
+                      class="text-start text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal"
+                    >
+                      1600积分
+                    </div>
+                  </div>
+                  <div>
+                    <div
+                      class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal"
+                    >
+                      已完成
+                    </div>
+                  </div>
+                </div>
+              </Card>
             </div>
-            <div>
-              <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal">
-                已完成
-              </div>
-            </div>
-          </div>
-        </Card>
-      </div>
-    </template>
+          </template>
+        </div>
+      </template>
+    </PageHelper>
   </div>
 </template>

+ 47 - 14
packages/app/src/pages/mine/points/index.vue

@@ -2,20 +2,20 @@
 { "style": { "navigationStyle": "custom" } }
 </route>
 <script setup lang="ts">
-import { back } from '../../../core/utils/router'
+import PageHelper from '@/components/page-helper.vue'
 import Card from '@/components/card.vue'
+import { getPoints } from '../../../core/libs/requests'
+import { useUserStore } from '../../../store'
+import { storeToRefs } from 'pinia'
+import dayjs from 'dayjs'
+import NavbarEvo from '@/components/navbar-evo.vue'
+
+const userStore = useUserStore()
+const { userInfo } = storeToRefs(userStore)
 </script>
 <template>
   <div class="flex-grow">
-    <wd-navbar
-      left-arrow
-      safe-area-inset-top
-      fixed
-      title="积分明细"
-      :bordered="false"
-      custom-class="bg-transparent!"
-      @leftClick="back()"
-    ></wd-navbar>
+    <NavbarEvo title="积分明细" transparent dark></NavbarEvo>
     <div class="relative aspect-[3/1]">
       <div class="aspect-[1.69/1] absolute top-0 w-full">
         <div class="relative w-full h-full">
@@ -43,7 +43,9 @@ import Card from '@/components/card.vue'
           当前积分
         </div>
         <div>
-          <span class="text-[#ffefd8] text-4xl font-normal font-['D-DIN Exp'] leading-9">615</span>
+          <span class="text-[#ffefd8] text-4xl font-normal font-['D-DIN_Exp'] leading-9">
+            {{ userInfo.level.point }}
+          </span>
         </div>
         <div class="flex-1"></div>
         <div></div>
@@ -52,9 +54,40 @@ import Card from '@/components/card.vue'
         </div>
       </div>
       <Card custom-class="relative">
-        <div class="flex flex-col">
-          <wd-status-tip image="content" tip="暂无"></wd-status-tip>
-        </div>
+        <PageHelper :request="getPoints" :query="{ stylistId: userInfo.userId, year: 2024 }">
+          <template #default="{ source }">
+            <div class="flex flex-col gap-4">
+              <template v-for="(it, i) in source.list" :key="i">
+                <div class="flex items-center py-4">
+                  <div class="flex-1 flex flex-col">
+                    <div
+                      class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed"
+                    >
+                      {{ it.name }}
+                    </div>
+                    <div
+                      class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
+                    >
+                      <!-- 2024/08/10 14:21:54 -->
+                      {{ dayjs(it.createTime).format('YYYY/MM/DD hh:mm:ss') }}
+                    </div>
+                  </div>
+                  <div>
+                    <div
+                      class="text-lg font-normal font-['D-DIN_Exp'] leading-relaxed"
+                      :class="`${it.points > 0 ? 'text-[#ef4343]' : 'text-black'}`"
+                    >
+                      <!-- 8200 -->
+                      {{ it.points > 0 ? '+' : '-' }}
+                      {{ it.points }}
+                    </div>
+                  </div>
+                </div>
+                <div class="h-0.25 bg-[#dadada]" v-if="i !== source.list.length - 1"></div>
+              </template>
+            </div>
+          </template>
+        </PageHelper>
       </Card>
     </div>
   </div>

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

@@ -51,6 +51,7 @@ interface NavigateToOptions {
        "/pages/mine/homepage/consult/index" |
        "/pages/mine/homepage/edit/index" |
        "/pages/mine/orders/detail/index" |
+       "/pages/home/mall/purchased/success/index" |
        "/pages/home/spread/case-shooting/photographer/index" |
        "/pages/mine/authentication/submit/success/index";
 }