kevin.T 2 ヶ月 前
コミット
bb11146a20

+ 35 - 8
packages/app/src/components/swiper-evo.vue

@@ -1,16 +1,43 @@
 <script setup lang="ts" generic="T extends Object">
-withDefaults(defineProps<{ items?: T[] }>(), { items: () => [] })
+const props = withDefaults(defineProps<{ items?: T[]; dotColor?: string }>(), {
+  items: () => [],
+  dotColor: () => '#000',
+})
 const modelValue = defineModel({ type: Number, default: 0 })
 const handleSwiperChange = async ({ detail: { current } }) => {
   modelValue.value = current
 }
 </script>
 <template>
-  <swiper class="w-full h-full" autoplay :current="modelValue" @change="handleSwiperChange">
-    <template v-for="(it, i) in items" :key="i">
-      <swiper-item>
-        <div class="w-full h-full swiper-item"><slot :item="it"></slot></div>
-      </swiper-item>
-    </template>
-  </swiper>
+  <div class="w-full h-full relative">
+    <swiper class="w-full h-full" autoplay :current="modelValue" @change="handleSwiperChange">
+      <template v-for="(it, i) in items" :key="i">
+        <swiper-item>
+          <div class="w-full h-full swiper-item"><slot :item="it"></slot></div>
+        </swiper-item>
+      </template>
+    </swiper>
+    <div class="absolute flex gap-1 dots">
+      <template v-for="(it, i) in items" :key="i">
+        <div
+          class="w-1 h-1 rounded-full"
+          :class="`${modelValue === i ? `bg-active` : `opacity-50`}`"
+          :style="{ background: dotColor }"
+        ></div>
+      </template>
+    </div>
+  </div>
 </template>
+
+<style scoped>
+.dots {
+  bottom: 10px;
+  left: 50%;
+  transform: translateX(-50%);
+  z-index: 1000;
+}
+.bg-active {
+  width: 30rpx;
+  transition: width 0.3s ease-in-out;
+}
+</style>

+ 8 - 9
packages/app/src/composables/share.ts

@@ -24,12 +24,11 @@ export const useShare = () => {
     //   res.path = `/pages-sub/mine/homepage/index?id=${id.value}&isShared=true`
     // }
     // return res
-	
-	
+
     // console.log('from', from)
     console.log('target', target)
     const res: Page.CustomShareContent = {}
-    if (from === 'button') {		
+    if (from === 'button') {
       if (target.dataset.type === 'homepage') {
         await shareDesignerHome({
           stylistId: target.dataset.options.homepageId,
@@ -38,15 +37,15 @@ export const useShare = () => {
         res.title = target.dataset.shareContent.title
         res.imageUrl = target.dataset.shareContent.imageUrl
         res.path = target.dataset.shareContent.path
-      } else {	 
+      } else {
         if (['1', '2'].includes(target.dataset.options.circleType)) {
-			if(!target.dataset.options.levelId || target.dataset.options.levelId < 2){
-				uni.showToast({ title: '无法分享普通会员等级作者的圈子内容', icon: 'none' }).then()
-				throw new Error("禁止分享")
-			} 
+          if (!target.dataset.options.levelId || target.dataset.options.levelId < 2) {
+            uni.showToast({ title: '无法分享普通会员等级作者的圈子内容', icon: 'none' }).then()
+            throw new Error('禁止分享')
+          }
           await shareCircle(target.dataset.options.id)
         }
-        res.path = `/pages-sub/home/moment/index?id=${target.dataset.options.id}&isShared=true`
+        res.path = `/pages-sub/home/moment/index?id=${target.dataset.options.id}&isShared=true&circleType=${target.dataset.options.circleType}`
         res.imageUrl = target.dataset.options.bannerUrls[0]
         res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
       }

+ 2 - 1
packages/app/src/core/libs/models.ts

@@ -753,6 +753,7 @@ export interface Message {
   viewCount: any
   viewTime: any
   pointsDetail?: PointsDetail
+  availableCouponsNum?: number
 }
 
 export interface ConfirmOrder {
@@ -809,7 +810,7 @@ export interface Coupon {
    */
   material: number
   brandId: number
-  buinessId: number
+  businessId: number
   productId: number
   createTime: string
   brandPoints: number

+ 1 - 1
packages/app/src/manifest.json

@@ -1,6 +1,6 @@
 {
   "name": "筑巢荟",
-  "appid": "__UNI__BA668E1",
+  "appid": "H57F2ACE4",
   "description": "",
   "versionName": "1.0.0",
   "versionCode": "100",

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

@@ -100,8 +100,8 @@ const infos = computed(() => [
     icon: clock,
     title: '报名时间',
     content: [
-      dayjs(data.value.applyStartTime).format('YYYY.MM.DD HH:mm'),
-      // dayjs(data.value.applyEndTime).format('YYYY.MM.DD'),
+      dayjs(data.value.applyStartTime).format('YYYY.MM.DD'),
+      dayjs(data.value.applyEndTime).format('YYYY.MM.DD'),
     ],
     visable: true,
   },
@@ -447,7 +447,9 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
       v-if="photos.total"
       class="fixed bottom-30 right-8 bg-[#0cbe7c] w-15 h-15 rounded-full flex flex-col items-center justify-center"
       @click="
-        router.push(`/pages-sub/home/activity/images/index?id=${id}&type=${type}&title=${data.name}`)
+        router.push(
+          `/pages-sub/home/activity/images/index?id=${id}&type=${type}&title=${data.name}`,
+        )
       "
     >
       <div>
@@ -494,7 +496,9 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
               <div class="text-justify text-white text-2xl font-bold font-['Alimama_ShuHeiTi']">
                 报名详情
               </div>
-              <div @click="listShow = true"><wd-icon name="close" size="22px" color="#ffff"></wd-icon></div>
+              <div @click="listShow = true">
+                <wd-icon name="close" size="22px" color="#ffff"></wd-icon>
+              </div>
             </div>
 
             <div class="flex flex-col justify-center aspect-[0.7/1] gap-5 p-6.5">

+ 41 - 34
packages/app/src/pages-sub/home/moment/index.vue

@@ -49,16 +49,17 @@ const { getOptionLabel } = dictStore
 const id = ref()
 const current = ref(0)
 const isShared = ref(false)
+const circleType = ref()
 const commentRef = ref<InstanceType<typeof WdInput>>()
 const commentItemRef = ref<InstanceType<typeof CommentItem>[]>()
 const instance = getCurrentInstance()
 const momentVideoRef = ref<ComponentExposed<typeof MomentVideo>[]>()
 const focus = ref(false)
 const hot = ref(true)
-const active = ref('hot');
+const active = ref('hot')
 const { data, run } = useRequest(() => getCircle(id.value), { initialData: {} })
 const { data: reviews, run: runGetReviews } = useRequest(
-  () => getCircleReviews({ circleId: id.value,hot:hot.value}),
+  () => getCircleReviews({ circleId: id.value, hot: hot.value }),
   {
     initialData: {
       list: [],
@@ -149,12 +150,12 @@ const handleDelete = async (index?: number) => {
     await runGetReviews()
   }
 }
-const dictLabelChange = (dictArr:any, value:any) => {
-	for(let i in dictArr){
-		if(dictArr[i].value === value){
-			return dictArr[i].label
-		}
-	}
+const dictLabelChange = (dictArr: any, value: any) => {
+  for (let i in dictArr) {
+    if (dictArr[i].value === value) {
+      return dictArr[i].label
+    }
+  }
 }
 const handleUpvote = async (index?: number) => {
   if (index !== undefined) {
@@ -163,7 +164,9 @@ const handleUpvote = async (index?: number) => {
   await runGetReviews()
 }
 const toDesignerHomepage = () => {
-	console.log(`/pages-sub/mine/homepage/index?id=${data.value?.stylistId}${isShared.value ? '&isShared=true' : ''}`)
+  console.log(
+    `/pages-sub/mine/homepage/index?id=${data.value?.stylistId}${isShared.value ? '&isShared=true' : ''}`,
+  )
   if (['1', '2'].includes(String(data.value?.circleType))) {
     router.push(
       `/pages-sub/mine/homepage/index?id=${data.value?.stylistId}${isShared.value ? '&isShared=true' : ''}`,
@@ -173,16 +176,17 @@ const toDesignerHomepage = () => {
 onMounted(async () => {})
 const dictMemberDesignStyle = ref<[]>()
 const dictCircleSpaceType = ref<[]>()
-onLoad(async (query?: { id: string; isShared?: boolean }) => {
+onLoad(async (query?: { id: string; isShared?: boolean; circleType?: string }) => {
   id.value = query?.id
   isShared.value = query?.isShared
+  circleType.value = query?.circleType
   await run()
   await setSwiperStyle()
   await runGetReviews()
   await setCircleUpvotes()
-  let value1  = await getByDictType(DictType.circleSpaceType);
+  let value1 = await getByDictType(DictType.circleSpaceType)
   dictCircleSpaceType.value = value1.data
-  let value2  = await getByDictType(DictType.memberDesignStyle);
+  let value2 = await getByDictType(DictType.memberDesignStyle)
   dictMemberDesignStyle.value = value2.data
 })
 // onShareAppMessage(async () => {
@@ -191,12 +195,11 @@ onLoad(async (query?: { id: string; isShared?: boolean }) => {
 // })
 onShareAppMessage(shareAppMessage)
 
-
-const handleClick = async (value:boolean) => {
-  active.value = value ? 'hot' : 'time';
+const handleClick = async (value: boolean) => {
+  active.value = value ? 'hot' : 'time'
   hot.value = value
   await runGetReviews()
-};
+}
 </script>
 <template>
   <view class="bg-white flex-grow">
@@ -284,13 +287,13 @@ const handleClick = async (value:boolean) => {
                 <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
                   风格:{{ getOptionLabel(DictType.memberDesignStyle, data.designStyle) }}
                 </div> -->
-				<div class="font-normal font-['PingFang_SC']">
-				  类别:{{ dictLabelChange(dictCircleSpaceType, data?.spaceType) }}
-				</div>
-				|
-				<div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
-				  风格:{{ dictLabelChange(dictMemberDesignStyle, data.designStyle) }}
-				</div>
+                <div class="font-normal font-['PingFang_SC']">
+                  类别:{{ dictLabelChange(dictCircleSpaceType, data?.spaceType) }}
+                </div>
+                |
+                <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
+                  风格:{{ dictLabelChange(dictMemberDesignStyle, data.designStyle) }}
+                </div>
                 |
                 <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">
                   面积:{{ data.spaceExtent }}
@@ -353,21 +356,25 @@ const handleClick = async (value:boolean) => {
       <SectionHeading v-if="!isShared" :title="`评论`" size="base">
         <template #append>
           <view v-if="reviews?.list" class="flex">
-            <div @click="handleClick(true)" :class="{
-        'text-black/90': active === 'hot',
-        'text-black/40': active !== 'hot'
-      }" class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-[10.18px]">
+            <div
+              @click="handleClick(true)"
+              :class="{
+                'text-black/90': active === 'hot',
+                'text-black/40': active !== 'hot',
+              }"
+              class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-[10.18px]"
+            >
               按热度
             </div>
+            <div class="text-xs font-normal font-['PingFang_SC'] leading-[10.18px]">|</div>
             <div
+              @click="handleClick(false)"
+              :class="{
+                'text-black/90': active === 'time',
+                'text-black/40': active !== 'time',
+              }"
               class="text-xs font-normal font-['PingFang_SC'] leading-[10.18px]"
             >
-              |
-            </div>
-            <div @click="handleClick(false)"  :class="{
-        'text-black/90': active === 'time',
-        'text-black/40': active !== 'time'
-      }"  class="text-xs font-normal font-['PingFang_SC'] leading-[10.18px]">
               按时间
             </div>
           </view>
@@ -498,7 +505,7 @@ const handleClick = async (value:boolean) => {
         </view>
       </div>
     </BottomAppBar>
-    <BottomAppBar v-if="isShared" fixed placeholder>
+    <BottomAppBar v-if="isShared && circleType != 3" fixed placeholder>
       <div>
         <wd-button block :round="false" @click="toDesignerHomepage">查看设计师主页</wd-button>
       </div>

+ 4 - 3
packages/app/src/pages-sub/home/study-tour/list.vue

@@ -42,22 +42,23 @@ onLoad(async (query?: Record<string | 'designStudyAbroadYear' | 'designDesc', st
 
 onMounted(async () => {
   await setLevels()
-  await setBanners();
+  await setBanners()
   console.log(banners)
 })
 onShareAppMessage(() => ({
   title: '游学计划',
-  imageUrl:banners.value?.length>0?banners.value[0].bannerImgUrl:""
+  imageUrl: banners.value?.length > 0 ? banners.value[0].bannerImgUrl : '',
 }))
 onShareTimeline(() => ({
   title: '游学计划',
-  imageUrl:banners.value?.length>0?banners.value[0].bannerImgUrl:""
+  imageUrl: banners.value?.length > 0 ? banners.value[0].bannerImgUrl : '',
 }))
 </script>
 <template>
   <div class="flex flex-col gap-6 p-3.5">
     <SectionHeading custom-class="" :title="title"></SectionHeading>
     <div
+      v-if="designDesc"
       class="mx-3.5 relative top--4 text-justify text-black/40 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
     >
       <!--      *我们为您精心打造了一个独特且极具价值的游学项目。这个项目的核心旨在全方位提升-->

+ 49 - 41
packages/app/src/pages-sub/mine/homepage/index.vue

@@ -164,20 +164,22 @@ onUnload(async () => {
     })
   }
 })
-const shareMessage = () =>{
-	const promise = new Promise((resolve,reject) => {
-		  if(userInfo.value?.level?.level < 2){
-			  uni.showToast({ title: '普通会员无法分享', icon: 'none' })
-			  reject()
-		  }else{
-			  const res: Page.CustomShareContent = {}
-			  res.title = designerInfo.value?.homePageName?designerInfo.value?.homePageName:userInfo.value?.nickname+" “${designerInfo.value?.designDesc}”";
-			  res.imageUrl = designerInfo.value.sharePageUrl;
-			  res.path = `/pages-sub/mine/homepage/index?id=${userInfo.value?.id}&isShared=true`
-			  resolve(res)
-		  }
-	})
-	return { promise }
+const shareMessage = () => {
+  const promise = new Promise((resolve, reject) => {
+    if (userInfo.value?.level?.level < 2) {
+      uni.showToast({ title: '普通会员无法分享', icon: 'none' })
+      reject()
+    } else {
+      const res: Page.CustomShareContent = {}
+      res.title = designerInfo.value?.homePageName
+        ? designerInfo.value?.homePageName
+        : userInfo.value?.nickname + ' “${designerInfo.value?.designDesc}”'
+      res.imageUrl = designerInfo.value.sharePageUrl
+      res.path = `/pages-sub/mine/homepage/index?id=${userInfo.value?.userId}&isShared=true`
+      resolve(res)
+    }
+  })
+  return { promise }
 }
 onShareAppMessage(shareMessage)
 // onShareAppMessage(() => ({
@@ -185,10 +187,12 @@ onShareAppMessage(shareMessage)
 //   imageUrl:designerInfo.value.sharePageUrl,
 //   path:`/pages-sub/mine/homepage/index?id=${id}&isShared=true`
 // }))
-onShareTimeline(()=>({
-	title:designerInfo.value?.homePageName?designerInfo.value?.homePageName:userInfo.value?.nickname + " “${designerInfo.value?.designDesc}”",
-	imageUrl:designerInfo.value.sharePageUrl,
-	query:`${id}&isShared=true`
+onShareTimeline(() => ({
+  title: designerInfo.value?.homePageName
+    ? designerInfo.value?.homePageName
+    : userInfo.value?.nickname + ' “${designerInfo.value?.designDesc}”',
+  imageUrl: designerInfo.value.sharePageUrl,
+  query: `${id.value}&isShared=true`,
 }))
 defineExpose({
   navBarFixed: false,
@@ -210,18 +214,18 @@ defineExpose({
           <div class="flex min-h-27 px-3.5 gap-3.5">
             <div class="relative">
               <wd-img
-				custom-class="overflow-hidden rounded-full "
+                custom-class="overflow-hidden rounded-full "
                 :width="72"
                 :height="72"
                 :src="memberInfo?.avatar || NetImages.DefaultAvatar"
               ></wd-img>
-			  <wd-img
-			    v-if="getMemberAvatarFrame(memberInfo?.levelId)"
-			    custom-class="vertical-bottom absolute! level-circle"
-			    :width="79"
-			    :height="82"
-			    :src="getMemberAvatarFrame(memberInfo?.levelId) || ''"
-			  ></wd-img>
+              <wd-img
+                v-if="getMemberAvatarFrame(memberInfo?.levelId)"
+                custom-class="vertical-bottom absolute! level-circle"
+                :width="79"
+                :height="82"
+                :src="getMemberAvatarFrame(memberInfo?.levelId) || ''"
+              ></wd-img>
             </div>
             <div class="pb-8 flex-1 overflow-hidden">
               <div class="flex items-center justify-between">
@@ -405,7 +409,11 @@ defineExpose({
     <BottomAppBar fixed placeholder>
       <div class="flex gap-7.5">
         <div class="flex-1" v-if="isOwn && !isShared">
-          <wd-button block :round="false" @click="router.push(`/pages-sub/mine/homepage/edit/index`)">
+          <wd-button
+            block
+            :round="false"
+            @click="router.push(`/pages-sub/mine/homepage/edit/index`)"
+          >
             编辑
           </wd-button>
         </div>
@@ -429,16 +437,16 @@ defineExpose({
           >
             <wd-button block :round="false">分享</wd-button>
           </button> -->
-		  <button
-		    v-if="features.shareMoment"
-		    class="p-0 after:b-none"
-		    block
-		    :round="false"
-		    :open-type="features.shareMoment ? 'share' : ''"
-			 @click="clickByPermission('share', () => {})"
-		  >
-		    <wd-button block :round="false">分享</wd-button>
-		  </button>
+          <button
+            v-if="features.shareMoment"
+            class="p-0 after:b-none"
+            block
+            :round="false"
+            :open-type="features.shareMoment ? 'share' : ''"
+            @click="clickByPermission('share', () => {})"
+          >
+            <wd-button block :round="false">分享</wd-button>
+          </button>
           <template v-else>
             <!--            1-->
             <wd-button block :round="false" @click="clickByPermission('share', () => {})">
@@ -460,8 +468,8 @@ defineExpose({
   </div>
 </template>
 <style scoped>
-	:deep(.level-circle){
-		top: -20rpx;
-		left:-10rpx;
-	}
+:deep(.level-circle) {
+  top: -20rpx;
+  left: -10rpx;
+}
 </style>

+ 24 - 24
packages/app/src/pages-sub/mine/honors/index.vue

@@ -24,6 +24,7 @@ import { Certificate } from '@/core/libs/models'
 import dayjs from 'dayjs'
 import { useUserStore } from '@/store'
 import { storeToRefs } from 'pinia'
+import SwiperEvo from '@/components/swiper-evo.vue'
 
 const id = ref()
 const isShared = ref(false)
@@ -79,9 +80,6 @@ const save = async (filePath: string) => {
     },
   })
 }
-const handleSwiperChange = (e: any) => {
-  console.log(e)
-}
 
 const handleGetCondition = (badge: any) => {
   uni.navigateTo({
@@ -182,17 +180,20 @@ onLoad(async (query?: Record<string | 'active' | 'id' | 'isShared', string>) =>
       </template>
     </div>
     <template v-if="active === 'badge'">
-	<!-- <view class="h-[145px]" v-if="String(userInfo.userId) === id">	 -->
+      <!-- <view class="h-[145px]" v-if="String(userInfo.userId) === id">	 -->
       <view class="h-[145px]">
-        <swiper :autoplay="autoplay" @change="handleSwiperChange">
-          <swiper-item v-for="item in collectionBadges" :key="item.id">
+        <SwiperEvo :items="collectionBadges" dot-color="#fff">
+          <template #default="{ item }">
             <Card custom-class="border border-solid bg-[#25221f]! border-[rgba(255,236,185,0.20)]">
               <div class="grid grid-cols-[90px_1fr] gap-x-4">
-                <div class="grid-row-start-1 grid-row-end-4 col-start-1" @click="
-                  router.push(
-                    `/pages-sub/mine/honors/detail/index?type=badge&id=${id}&data=${JSON.stringify(item)}`,
-                  )
-                ">
+                <div
+                  class="grid-row-start-1 grid-row-end-4 col-start-1"
+                  @click="
+                    router.push(
+                      `/pages-sub/mine/honors/detail/index?type=badge&id=${id}&data=${JSON.stringify(item)}`,
+                    )
+                  "
+                >
                   <!-- <wd-img
                     width="90"
                     height="90"
@@ -202,20 +203,16 @@ onLoad(async (query?: Record<string | 'active' | 'id' | 'isShared', string>) =>
                         : item.badgeNotObtainedImage
                     "
                   ></wd-img> -->
-				  <wd-img
-				    width="90"
-				    height="90"
-				    :src="item.badgeYesObtainedImage"
-				  ></wd-img>
+                  <wd-img width="90" height="90" :src="item.badgeYesObtainedImage"></wd-img>
                 </div>
                 <div class="row-start-1 col-start-2 flex items-center justify-between">
                   <div
                     class="text-center text-[#ffecb9] text-lg font-normal font-['PingFang_SC'] leading-relaxed"
-					@click="
-					  router.push(
-					    `/pages-sub/mine/honors/detail/index?type=badge&id=${id}&data=${JSON.stringify(item)}`,
-					  )
-					"
+                    @click="
+                      router.push(
+                        `/pages-sub/mine/honors/detail/index?type=badge&id=${id}&data=${JSON.stringify(item)}`,
+                      )
+                    "
                   >
                     {{ item.badgeName }}
                   </div>
@@ -275,12 +272,15 @@ onLoad(async (query?: Record<string | 'active' | 'id' | 'isShared', string>) =>
                 </div>
               </div>
             </Card>
-          </swiper-item>
-        </swiper>
+          </template>
+        </SwiperEvo>
       </view>
 
       <template v-for="([key, it], index) in Object.entries(badges)" :key="index">
-        <Card v-if="!((!isOwner || isShared) && ['积分徽章', '积分徽章'].includes(key))" custom-class="bg-[#171615]! text-white border border-solid border-[rgba(255,236,185,0.20)]">
+        <Card
+          v-if="!((!isOwner || isShared) && ['积分徽章', '积分徽章'].includes(key))"
+          custom-class="bg-[#171615]! text-white border border-solid border-[rgba(255,236,185,0.20)]"
+        >
           <div class="flex items-center gap-2 py-4">
             <div class="w-1.5 h-1.5 bg-[#ffecb9] rounded-full"></div>
             <SectionHeading :title="key.toString()" dark></SectionHeading>

+ 41 - 55
packages/app/src/pages/home/index.vue

@@ -41,7 +41,7 @@ import PageHelperEvo from '@/components/page-helper-evo.vue'
 import { useMessage } from 'wot-design-uni'
 import ShareActionSheet from './components/share-action-sheet.vue'
 import { useShare } from '@/composables/share'
-import { useHonorDialog,HonorDialogType } from './components/honor-dialog/index'
+import { useHonorDialog, HonorDialogType } from './components/honor-dialog/index'
 import { getByDictType } from '../../core/libs/requests'
 import { DictType } from '../../core/libs/models'
 
@@ -120,10 +120,10 @@ const handleShare = (options: any) => {
 const dictMemberDesignStyle = ref<[]>()
 const dictCircleSpaceType = ref<[]>()
 const offLoad = (e) => {
-	console.log(e)
+  console.log(e)
 }
 const offError = (err) => {
-	console.log(err)
+  console.log(err)
 }
 onShow(async () => {
   await pageHelperRef.value?.reload()
@@ -132,7 +132,7 @@ onShow(async () => {
     reqs.push(setStudyTours())
   }
   await Promise.all(reqs)
-  if (userInfo.value.level != null){
+  if (userInfo.value.level != null) {
     const { data: badgeData } = await getBadges({})
     const { data: certificates } = await getCertificates()
     const badges = Object.values(badgeData)
@@ -158,7 +158,7 @@ onShow(async () => {
     ]
     if (honors.length) {
       const honor = honors[0]
-	  console.log(honor)
+      console.log(honor)
       await show({
         title: honor.title ?? ' ',
         content: honor.content ?? ' ',
@@ -179,9 +179,9 @@ onLoad(async () => {
   swiperData.value = indexConfigsData.value.list.map((it) => ({
     data: it,
   }))
-  let value1  = await getByDictType(DictType.circleSpaceType);
+  let value1 = await getByDictType(DictType.circleSpaceType)
   dictCircleSpaceType.value = value1.data
-  let value2  = await getByDictType(DictType.memberDesignStyle);
+  let value2 = await getByDictType(DictType.memberDesignStyle)
   dictMemberDesignStyle.value = value2.data
 })
 onHide(() => {
@@ -201,7 +201,7 @@ onShareAppMessage(shareAppMessage)
 
 <template>
   <view class="">
-	<!-- <view class="official">
+    <!-- <view class="official">
 		<official-account @load="offLoad" @error="offError"></official-account>
 	</view>  -->
     <view class="bg-black w-full relative aspect-[1.26/1]">
@@ -222,14 +222,14 @@ onShareAppMessage(shareAppMessage)
           </swiper-item>
         </template>
       </swiper>
-	  <div class="absolute flex gap-1 dots">
-	    <template v-for="(it, i) in swiperData" :key="i">
-	      <div
-	        class="w-1 h-1 rounded-full"
-	        :class="`${currentBanner === i ? 'bg-white bg-active' : 'bg-white/40'}`"
-	      ></div>
-	    </template>
-	  </div>
+      <div class="absolute flex gap-1 dots">
+        <template v-for="(it, i) in swiperData" :key="i">
+          <div
+            class="w-1 h-1 rounded-full"
+            :class="`${currentBanner === i ? 'bg-white bg-active' : 'bg-white/40'}`"
+          ></div>
+        </template>
+      </div>
     </view>
     <view class="bg-[#f6f6f6] relative bottom-4 rounded-t-2xl py-1">
       <template v-if="currentStudyTour">
@@ -238,25 +238,6 @@ onShareAppMessage(shareAppMessage)
           :items="currentStudyTour.studyTravelDOList"
         ></ScheduleCard>
       </template>
-      <!-- <SectionHeading title="按钮调试"></SectionHeading> -->
-      <!-- <div class="flex">
-        <TiltedButton size="large" custom-class="w-30"></TiltedButton>
-        <ButtonEvo>神奇按钮</ButtonEvo>
-        <ImgBtnEvo></ImgBtnEvo>
-      </div> -->
-      <!-- <div class="flex flex-col gap-1">
-        <button>咲</button>
-        <ButtonEvo custom-class="w-auto!">咲</ButtonEvo>
-        <ButtonEvo custom-class="">遥星</ButtonEvo>
-        <ButtonEvo custom-class="">血不染</ButtonEvo>
-        <ButtonEvo custom-class="">天地不容</ButtonEvo>
-        <ButtonEvo custom-class="">飒沓如流星</ButtonEvo>
-        <ButtonEvo custom-class="">君有才能纵捭阖</ButtonEvo>
-        <div class="w-full">
-          <ButtonEvo custom-class="" block>诗仙纵横,刀剑茫茫去不还</ButtonEvo>
-        </div>
-        <ButtonEvo color="red" size="lg">敌无命</ButtonEvo>
-      </div> -->
       <menus></menus>
       <view v-if="hotActivities?.length" class="my-6 mx-3.5">
         <HotActivity :items="hotActivities"></HotActivity>
@@ -279,7 +260,12 @@ onShareAppMessage(shareAppMessage)
           <template #default="{ source }">
             <template v-for="it of source.list" :key="it.id">
               <view class="my-3">
-                <MomentItem :dict="{'spaceType':dictCircleSpaceType,'designStyle':dictMemberDesignStyle}" :options="it" @like="handleLike" @share="handleShare"></MomentItem>
+                <MomentItem
+                  :dict="{ spaceType: dictCircleSpaceType, designStyle: dictMemberDesignStyle }"
+                  :options="it"
+                  @like="handleLike"
+                  @share="handleShare"
+                ></MomentItem>
               </view>
             </template>
           </template>
@@ -295,23 +281,23 @@ onShareAppMessage(shareAppMessage)
 </template>
 
 <style scoped>
-	.dots{
-		bottom: 60rpx;
-		left: 50%;
-		transform: translateX(-50%);
-	}
-	.bg-active{
-		width:40rpx;
-	}
-	.official{
-		position: fixed;
-		top:100rpx;
-		left:0;
-		width: 100%;
-		z-index: 9999;
-	}
-	:deep(.level-circle){
-		top: -10rpx;
-		left:-5rpx;
-	}
+.dots {
+  bottom: 60rpx;
+  left: 50%;
+  transform: translateX(-50%);
+}
+.bg-active {
+  width: 40rpx;
+}
+.official {
+  position: fixed;
+  top: 100rpx;
+  left: 0;
+  width: 100%;
+  z-index: 9999;
+}
+:deep(.level-circle) {
+  top: -10rpx;
+  left: -5rpx;
+}
 </style>

+ 71 - 69
packages/app/src/pages/material/detail/index.vue

@@ -27,7 +27,7 @@ const id = ref()
 const downloading = ref(false)
 const currentBanner = ref(0)
 const handleSwiperChange = ({ detail: { current, source } }) => {
-  currentBanner.value = current 
+  currentBanner.value = current
 }
 const { data, run: setData } = useRequest(() => getMaterialDetail({ id: id.value }))
 const { data: materialHomePageData, run: setMaterialHomePageData } = useRequest(
@@ -50,14 +50,14 @@ const { data: materialsManageBrands, run: setMaterialsManageBrands } = useReques
   () => getByDictType(DictType.materialsManageBrand),
   { initialData: [] },
 )
-const copy = (url) =>{
-	uni.setClipboardData({
-		data:url,
-		success: () => {
-			console.log("已复制")
-			downloadMaterials({ materialsId: id.value })
-		}
-	})
+const copy = (url) => {
+  uni.setClipboardData({
+    data: url,
+    success: () => {
+      console.log('已复制')
+      downloadMaterials({ materialsId: id.value })
+    },
+  })
 }
 const handleDownload = async () => {
   downloading.value = true
@@ -110,11 +110,11 @@ onLoad(async (query: { id: number }) => {
 })
 onShareAppMessage(() => ({
   title: data.value?.materialsName,
-  imageUrl:data.value?.bannerUrl,
+  imageUrl: data.value?.bannerUrl,
 }))
 onShareTimeline(() => ({
   title: data.value?.materialsName,
-  imageUrl:data.value?.bannerUrl,
+  imageUrl: data.value?.bannerUrl,
 }))
 </script>
 <template>
@@ -318,14 +318,14 @@ onShareTimeline(() => ({
               {{ it.productTitleName }}
             </div>
           </div>
-		  <div class="absolute flex gap-1 dots">
-		    <template v-for="(img, i) in it?.productImgUrl?.split(',')" :key="i">
-		      <div
-		        class="w-1 h-1 rounded-full"
-		        :class="`${currentBanner === i ? 'bg-white bg-active' : 'bg-white/40'}`"
-		      ></div>
-		    </template>
-		  </div>
+          <div class="absolute flex gap-1 dots">
+            <template v-for="(img, i) in it?.productImgUrl?.split(',')" :key="i">
+              <div
+                class="w-1 h-1 rounded-full"
+                :class="`${currentBanner === i ? 'bg-white bg-active' : 'bg-white/40'}`"
+              ></div>
+            </template>
+          </div>
         </div>
       </template>
 
@@ -337,57 +337,59 @@ onShareTimeline(() => ({
       >
         {{ downloading ? '下载中...' : '下载所有素材包' }}
       </wd-button> -->
-	  <wd-button
-	    custom-class="w-full! rounded-lg!"
-	    :disabled="(data?.agreementFileUrl ?? '') === ''"
-		@click="clickByPermission('download', () => dealerPanelState = true)"
-	  >
-	    下载所有素材包
-	  </wd-button>
+      <wd-button
+        custom-class="w-full! rounded-lg!"
+        :disabled="(data?.agreementFileUrl ?? '') === ''"
+        @click="clickByPermission('download', () => (dealerPanelState = true))"
+      >
+        下载所有素材包
+      </wd-button>
     </div>
-	<wd-overlay :show="dealerPanelState" @click="dealerPanelState = false">
-	  <view class="wrapper flex flex-col justify-end h-full">
-	    <div class="w-full flex justify-end mb-4">
-	      <div class="mr-3.5">
-	        <wd-button type="text" custom-class="w-8! h-8! p-0!" size="small">
-	          <wd-img :src="close" width="28" height="28" custom-class="vertical-bottom"></wd-img>
-	        </wd-button>
-	      </div>
-	    </div>
-		<div class="bg-neutral-100 rounded-tl-2xl rounded-tr-2xl p-3.5" @click.stop="">
-			<div class="deal-title">请复制以下链接,打开默认浏览器,粘贴到浏览器进行下载</div>
-			<div class="deal-link">{{ data?.agreementFileUrl }}</div>
-			<wd-button custom-class="custom-shadow" @click="copy(data?.agreementFileUrl)">复制链接</wd-button>
-		</div>
-	  </view>
-	</wd-overlay>
+    <wd-overlay :show="dealerPanelState" @click="dealerPanelState = false">
+      <view class="wrapper flex flex-col justify-end h-full">
+        <div class="w-full flex justify-end mb-4">
+          <div class="mr-3.5">
+            <wd-button type="text" custom-class="w-8! h-8! p-0!" size="small">
+              <wd-img :src="close" width="28" height="28" custom-class="vertical-bottom"></wd-img>
+            </wd-button>
+          </div>
+        </div>
+        <div class="bg-neutral-100 rounded-tl-2xl rounded-tr-2xl p-3.5" @click.stop="">
+          <div class="deal-title">请复制以下链接,打开默认浏览器,粘贴到浏览器进行下载</div>
+          <div class="deal-link">{{ materialHomePageData?.fodderList[0].fodderUrl }}</div>
+          <wd-button custom-class="custom-shadow" @click="copy(data?.agreementFileUrl)">
+            复制链接
+          </wd-button>
+        </div>
+      </view>
+    </wd-overlay>
   </view>
 </template>
 <style scoped>
-	.dots{
-		bottom: 30rpx;
-		left: 50%;
-		transform: translateX(-50%);
-	}
-	.bg-active{
-		width:40rpx;
-	}
-	.deal-title{
-		font-size:32rpx;
-		text-align: center;
-		font-weight: bold;
-		padding:60rpx 0;
-	}
-	.deal-link{
-		padding: 20rpx 30rpx;
-		font-size: 28rpx;
-		color: rgba(0, 0, 0, 0.45);
-		background-color: rgba(200, 200, 200, 0.w);
-		border-radius: 20rpx;
-		margin-bottom:60rpx;
-		word-wrap: break-word;
-	}
-	:deep(.custom-shadow){
-		width:100% !important;
-	}
-</style>
+.dots {
+  bottom: 30rpx;
+  left: 50%;
+  transform: translateX(-50%);
+}
+.bg-active {
+  width: 40rpx;
+}
+.deal-title {
+  font-size: 32rpx;
+  text-align: center;
+  font-weight: bold;
+  padding: 60rpx 0;
+}
+.deal-link {
+  padding: 20rpx 30rpx;
+  font-size: 28rpx;
+  color: rgba(0, 0, 0, 0.45);
+  background-color: rgba(200, 200, 200, 0w);
+  border-radius: 20rpx;
+  margin-bottom: 60rpx;
+  word-wrap: break-word;
+}
+:deep(.custom-shadow) {
+  width: 100% !important;
+}
+</style>

+ 3 - 1
packages/app/src/pages/messages/components/coupons-selector.vue

@@ -16,7 +16,7 @@ const props = withDefaults(
   { show: false },
 )
 const modelValue = defineModel({ default: () => [], type: Array as PropType<Coupon[]> })
-const emits = defineEmits<{ close: []; clickInstruction: [coupon: Coupon] }>()
+const emits = defineEmits<{ close: []; clickInstruction: [coupon: Coupon | Coupon[]] }>()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const { alert } = useMessage()
@@ -59,6 +59,8 @@ const handleSelect = (coupon: Coupon) => {
   } else {
     modelValue.value.push(coupon)
   }
+  modelValue.value = modelValue.value.map((it) => ({ ...it, businessId: props.businessId }))
+  emits('clickInstruction', modelValue.value)
   emits('close')
 }
 const handleTabsChange = async ({ index, name }) => {

+ 35 - 34
packages/app/src/pages/messages/components/message-card.vue

@@ -5,7 +5,7 @@ import { integral, interact, message, system } from '../../../core/libs/svgs'
 import { beforeNow } from '../../../utils/date-util'
 import dayjs from 'dayjs'
 import { MessageType, PointStatus } from '../../../core/libs/enums'
-import {fuckYou, getPointsCoupons, updateReadByMessageType} from '../../../core/libs/requests'
+import { fuckYou, getPointsCoupons, updateReadByMessageType } from '../../../core/libs/requests'
 import { getMessageType } from '../../../core/libs/message-types'
 import { useRouter } from '../../../core/utils/router'
 import ButtonEvo from '@/components/button-evo.vue'
@@ -33,13 +33,13 @@ const { data: coupons, run: setCoupons } = useRequest(
 )
 const couponSelectText = computed(() => {
   const selectedCoupons = props.options.selectedCoupons || []
-  const availableCoupons = coupons.value || []
-
+  const availableCoupons = props.options.availableCouponsNum || 0
+  console.log('selectedCoupons computed', selectedCoupons)
   if (selectedCoupons.length > 0) {
     return `${selectedCoupons[0].brandPoints ?? 0}积分`
   }
-  if (availableCoupons.length > 0) {
-    return `${availableCoupons.length}张可用`
+  if (availableCoupons > 0) {
+    return `${availableCoupons}张可用`
   }
   return '无可用'
 })
@@ -54,27 +54,26 @@ const init = async () => {
   }
 }
 const handleJump = () => {
-  fuckYou({id:props.options.id})
+  fuckYou({ id: props.options.id })
   if ((props.options.linkUrl ?? '') !== '') {
     return router.push(props.options.linkUrl)
   }
   const query: Record<string, string> = {}
   switch (props.options.messageSubType) {
     case 5:
-      query.id = props.options.id
+      query.id = props.options.id as any
       query.title = props.options.title
       query.contentDetail = props.options.detailBody
       query.createTime = String(props.options.createTime)
       query.viewsCount = props.options.viewCount
       break
-	case 14:
-	  query.type = 	props.options.couponType
+    case 14:
+      query.type = props.options.couponType
     default:
       break
   }
   console.log(stringify(query))
   router.push(getMessageType(props.options.messageSubType)?.path + '?' + stringify(query))
-
 }
 watch(
   () => props.options,
@@ -86,17 +85,14 @@ watch(
 onMounted(async () => {
   await init()
 })
-
 </script>
 <template>
   <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"
@@ -108,43 +104,42 @@ onMounted(async () => {
               }[options.messageType]
             "
           ></wd-img>
-
         </div>
       </div>
 
       <div class="row-start-1 col-start-2 text-start relative">
         <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[30px]">
-<!--          {{-->
-<!--            String(options.messageSubType) === '5'-->
-<!--              ? getMessageType(options.messageSubType)?.desc-->
-<!--              : options.title-->
-<!--          }}-->
-          {{options.title}}
+          <!--          {{-->
+          <!--            String(options.messageSubType) === '5'-->
+          <!--              ? getMessageType(options.messageSubType)?.desc-->
+          <!--              : options.title-->
+          <!--          }}-->
+          {{ options.title }}
         </div>
       </div>
 
       <div class="row-start-1 col-start-3 text-end" style="white-space: nowrap">
-        <div class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-[8.18px] ">
+        <div class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-[8.18px]">
           <template v-if="String(options.isRead) === '0'">
-             <wd-img width="16" height="16" src="/static/svgs/red.svg"></wd-img>
+            <wd-img width="16" height="16" src="/static/svgs/red.svg"></wd-img>
           </template>
           {{ beforeNow(dayjs(options.createTime).toDate()) }}
-<!--          <div class="absolute top-[2px] right-[50px] z-10">-->
-<!--            <wd-img width="16" height="20" src="/static/svgs/red.svg"></wd-img>-->
-<!--          </div>-->
-<!--          <wd-img width="16" height="10" src="/static/svgs/red.svg"></wd-img>-->
+          <!--          <div class="absolute top-[2px] right-[50px] z-10">-->
+          <!--            <wd-img width="16" height="20" src="/static/svgs/red.svg"></wd-img>-->
+          <!--          </div>-->
+          <!--          <wd-img width="16" height="10" src="/static/svgs/red.svg"></wd-img>-->
         </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]">
           <!-- {{ options.detailBody }} -->
-<!--          <div-->
-<!--            v-if="-->
-<!--              [MessageType.Integral, MessageType.System].includes(options.messageType) &&-->
-<!--              String(options.messageSubType) !== '5'-->
-<!--            "-->
-<!--            v-html="options.detailBody"-->
-<!--          ></div>-->
+          <!--          <div-->
+          <!--            v-if="-->
+          <!--              [MessageType.Integral, MessageType.System].includes(options.messageType) &&-->
+          <!--              String(options.messageSubType) !== '5'-->
+          <!--            "-->
+          <!--            v-html="options.detailBody"-->
+          <!--          ></div>-->
           <div v-html="options.detailBody"></div>
           <div class="grid grid-cols-[auto_1fr] gap-x-1 gap-y-4.5">
             <template
@@ -185,7 +180,13 @@ onMounted(async () => {
         v-if="options.coverUrl"
         class="row-start-3 col-start-2 col-end-4 aspect-[1.7/1] rounded-md overflow-hidden"
       >
-        <wd-img width="100%" height="100%" mode="aspectFill" :src="options.coverUrl"  @click="handleJump"/>
+        <wd-img
+          width="100%"
+          height="100%"
+          mode="aspectFill"
+          :src="options.coverUrl"
+          @click="handleJump"
+        />
       </div>
       <div v-if="hasLine" class="row-start-4 col-start-1 col-end-4 my-2">
         <div class="bg-[#dadada] w-full h-[1px]"></div>

+ 22 - 20
packages/app/src/pages/messages/index.vue

@@ -65,6 +65,12 @@ const tabs = ref([
   },
 ])
 const selectedCoupons = ref<Coupon[]>([])
+
+const instructionClick = (val: any) => {
+  selectedCoupons.value = val
+  // handleClickInstruction(alert, Array.isArray(val) ? val[0] : val)
+}
+
 const coupons = ref<Coupon[]>([])
 const cancelReason = ref('')
 const currentMessage = ref<Message>()
@@ -101,7 +107,7 @@ const handleChange = async (value) => {
   let tab1 = tabs.value[value.index]
   await getReadCount()
   if (tab1.value == MessageType.Integral) {
-    await updateReadByMessageType({ messageType: MessageType.Integral})
+    await updateReadByMessageType({ messageType: MessageType.Integral })
   }
   if (tab1.value == MessageType.System) {
     await updateReadByMessageType({ messageType: MessageType.System })
@@ -144,32 +150,22 @@ const handleSubmit = async (message: Message, coupons: Coupon[]) => {
 
 const getReadCount = async () => {
   await readCount().then(({ data }) => {
-    //  x.data.forEach(c =>{
-    //    const matchedTab = tabs.value.find(a => a.value === c.messageType);
-    //    if (matchedTab != undefined && c.quantity != 0){
-    //      console.log(matchedTab.value,"messageType")
-    //      tabs.value.forEach(b =>{
-    //        console.log(b.value,"111")
-    //        if (b.value == matchedTab.value){
-    //          b.badgeProps.hidden = true
-    //        }
-    //      })
-    //    }
-    //  })
     tabs.value = tabs.value.map((a) => {
-      const match = data.find(d => d.messageType === a.value);
+      const match = data.find((d) => d.messageType === a.value)
       return {
         ...a,
         badgeProps: {
           ...a.badgeProps,
           hidden: !match || match.quantity === 0,
         },
-      };
-    });
+      }
+    })
   })
 }
-const handleQ = async (msg, res) => {
+const handleQ = async (msg: any, res: any) => {
+  console.log('选择的销售积分', msg, res)
   currentMessage.value = msg
+  selectedCoupons.value = []
   coupons.value = res
   show.value = true
 }
@@ -184,7 +180,13 @@ onShow(async () => {
 
 <template>
   <view class="flex-grow flex flex-col bg">
-    <PageHelperEvo ref="pageHelperRef" class="flex-grow flex" :request="getMessages" :query="query" :automatic="false">
+    <PageHelperEvo
+      ref="pageHelperRef"
+      class="flex-grow flex"
+      :request="getMessages"
+      :query="query"
+      :automatic="false"
+    >
       <template #top>
         <wd-tabs v-model="tab" @change="handleChange">
           <block v-for="({ label, badgeProps }, i) in tabs" :key="i">
@@ -198,7 +200,7 @@ onShow(async () => {
             <MessageCard
               :options="{
                 ...it,
-                selectedCoupons,
+                selectedCoupons: selectedCoupons.filter((m) => m.businessId === it.businessId),
               }"
               @submit="handleSubmit"
               @cancel="handleCancel"
@@ -226,7 +228,7 @@ onShow(async () => {
       :show="show"
       :business-id="currentMessage?.businessId"
       @close="show = false"
-      @click-instruction="(e) => handleClickInstruction(alert, e)"
+      @click-instruction="instructionClick"
     ></CouponsSelector>
   </view>
 </template>

+ 10 - 0
packages/merchant/src/pages/agent/designer/archives/award/imgs.vue

@@ -88,4 +88,14 @@ onLoad((query?: Record<string | 'id', string>) => {
   width: 168px !important;
   border-radius: 8px !important;
 }
+::v-deep .wd-upload__evoke {
+  position: fixed !important;
+  top: 80%;
+  right: 30px;
+  transform: translateY(-50%);
+  width: 50px !important;
+  height: 50px !important;
+  background-color: rgba($color: #000000, $alpha: 0.7) !important;
+  color: #fff !important;
+}
 </style>

+ 11 - 7
packages/merchant/src/pages/agent/designer/index.vue

@@ -479,13 +479,16 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
               </span>
               地址
             </label>
-            <div class="wd-input h-[40px] lh-[40px] flex justify-between px-[20px]">
+            <div
+              class="wd-input h-[40px] lh-[40px] flex justify-between px-[20px]"
+              @click="getCurrentLocation"
+            >
               <div>
                 {{
                   !followUpForm.address.address ? '点击获取当前位置' : followUpForm.address.address
                 }}
               </div>
-              <wd-icon name="refresh" size="14px" @click="getCurrentLocation"></wd-icon>
+              <wd-icon name="refresh" size="14px"></wd-icon>
             </div>
           </div>
         </template>
@@ -581,14 +584,15 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
         </template>
       </wd-checkbox-group>
       <SectionHeading title="推荐设计师"></SectionHeading>
-      <wd-radio-group shape="button"
-        v-model="filterQuery.recommend"
-      >
-        <template v-for="(tag, index) in [
+      <wd-radio-group shape="button" v-model="filterQuery.recommend">
+        <template
+          v-for="(tag, index) in [
             // { label: '全部', value: '' },
             { label: '否', value: false },
             { label: '是', value: true },
-          ]" :key="index">
+          ]"
+          :key="index"
+        >
           <wd-radio :value="tag.value">{{ tag.label }}</wd-radio>
         </template>
       </wd-radio-group>

+ 56 - 4
packages/merchant/src/pages/mine/agent/business-card/edit-card.vue

@@ -12,9 +12,47 @@ import { NetImages } from '@/core/libs/net-images'
 import BottomAppBar from '@/components/bottom-app-bar.vue'
 import { storeToRefs } from 'pinia'
 import { useUserStore } from '@/store/user'
+import DataForm from '@/components/data-form.vue'
+import { DataFormSchema } from '@/components/data-form'
+import { DesignerBasicInfo } from '@designer-hub/app/src/core/libs/models'
 
 const { userInfo } = storeToRefs(useUserStore())
 const infos = ref<any[]>(['公司', '职位', '手机', '微信', '邮箱'])
+const formData = ref({})
+const schema = ref<DataFormSchema>({
+  avatar: {
+    type: 'TextField',
+    label: '头像',
+    labelWidth: 120,
+    props: undefined,
+  },
+  name: {
+    type: 'TextField',
+    label: '姓名',
+    labelWidth: 120,
+    props: undefined,
+  },
+  phone: {
+    type: 'TextField',
+    label: '手机',
+    labelWidth: 120,
+  },
+  email: {
+    type: 'TextField',
+    label: '邮箱',
+    labelWidth: 120,
+  },
+  address: {
+    type: 'TextField',
+    label: '地址',
+    labelWidth: 120,
+  },
+  introduction: {
+    type: 'Textarea',
+    label: '介绍',
+    labelWidth: 120,
+  },
+})
 const submitUpload = () => {
   console.log('submitUpload')
 }
@@ -74,14 +112,23 @@ const submitUpload = () => {
       </div>
     </div>
     <!-- 名片样式 -->
-    <wd-cell title="名片样式" is-link to="/pages/index/index" />
-    <div class="pt-[30px] flex justify-between items-center">
+    <div
+      class="mt-24px mb-18px line-height-26px fw-400 color-[rgba(0,0,0,0.85)] font-size-16px flex justify-between items-center"
+    >
+      <div>名片样式</div>
+      <wd-icon name="arrow-right" size="22px"></wd-icon>
+    </div>
+    <div class="flex justify-between items-center">
       <div class="w-76px h-42px border-[1px] border-solid border-[#E2E4ED]"></div>
       <div class="w-76px h-42px border-[1px] border-solid border-[#E2E4ED]"></div>
       <div class="w-76px h-42px border-[1px] border-solid border-[#E2E4ED]"></div>
     </div>
     <!-- 展示信息 -->
-    <wd-cell title="展示信息" is-link />
+    <div
+      class="mt-24px mb-18px line-height-26px fw-400 color-[rgba(0,0,0,0.85)] font-size-16px flex justify-between items-center"
+    >
+      <div>展示信息</div>
+    </div>
     <div class="pt-[30px] pb-[15px] mb-[15px] flex items-center overflow-x-auto">
       <div
         class="selectItem inline-block px-18px py-4px rounded-[2px] bg-[#F3F6FF] mr-10px whitespace-nowrap font-size-14px lh-[24px] fw-400"
@@ -93,7 +140,12 @@ const submitUpload = () => {
     </div>
     <wd-gap bg-color="#F2F3F6"></wd-gap>
     <!-- 基本数据 -->
-
+    <div
+      class="mt-24px mb-18px line-height-26px fw-400 color-[rgba(0,0,0,0.85)] font-size-16px flex justify-between items-center"
+    >
+      <div>基本数据</div>
+    </div>
+    <DataForm :schema="schema" v-model="formData" :direction="'horizontal'"></DataForm>
     <!-- 保存 按钮 -->
     <BottomAppBar fixed placeholder>
       <wd-button