瀏覽代碼

feat:提交首页和技师列表的静态页面

PC-20240823SNLS\Administrator 7 月之前
父節點
當前提交
96b26b62a9
共有 100 個文件被更改,包括 3306 次插入1480 次删除
  1. 1 1
      .env
  2. 1 0
      App.vue
  3. 72 0
      components/XD-swiper/XD-swiper.vue
  4. 7 7
      manifest.json
  5. 37 22
      pages.json
  6. 734 0
      pages/XDHome/homePage/homePage.vue
  7. 504 0
      pages/XDHome/technicianList/technicianList.vue
  8. 22 44
      pages/activity/groupon/detail.vue
  9. 3 3
      pages/app/sign.vue
  10. 30 35
      pages/chat/components/messageListItem.vue
  11. 1 1
      pages/commission/goods.vue
  12. 1 1
      pages/coupon/detail.vue
  13. 1 0
      pages/coupon/list.vue
  14. 2 2
      pages/goods/comment/add.vue
  15. 3 0
      pages/goods/components/detail/detail-activity-tip.vue
  16. 5 18
      pages/goods/groupon.vue
  17. 3 2
      pages/goods/index.vue
  18. 5 6
      pages/goods/seckill.vue
  19. 5 6
      pages/index/category.vue
  20. 1 1
      pages/order/addressSelection.vue
  21. 5 13
      pages/order/confirm.vue
  22. 2 1
      pages/order/detail.vue
  23. 2 2
      pages/order/express/log.vue
  24. 1 0
      pages/pay/result.vue
  25. 1 1
      pages/public/faq.vue
  26. 3 12
      pages/user/address/list.vue
  27. 1 1
      pages/user/wallet/score.vue
  28. 14 0
      sheep/api/migration/chat.js
  29. 5 5
      sheep/components/s-block-item/s-block-item.vue
  30. 138 162
      sheep/components/s-coupon-block/s-coupon-block.vue
  31. 1 24
      sheep/components/s-coupon-card/s-coupon-card.vue
  32. 23 25
      sheep/components/s-coupon-select/s-coupon-select.vue
  33. 8 19
      sheep/components/s-custom-navbar/s-custom-navbar.vue
  34. 141 158
      sheep/components/s-groupon-block/s-groupon-block.vue
  35. 8 8
      sheep/components/s-layout/s-layout.vue
  36. 326 306
      sheep/components/s-menu-button/s-menu-button.vue
  37. 71 93
      sheep/components/s-menu-grid/s-menu-grid.vue
  38. 5 0
      sheep/components/s-menu-tools/s-menu-tools.vue
  39. 2 26
      sheep/components/s-order-card/s-order-card.vue
  40. 148 170
      sheep/components/s-seckill-block/s-seckill-block.vue
  41. 2 2
      sheep/components/s-select-groupon-sku/s-select-groupon-sku.vue
  42. 1 1
      sheep/components/s-share-modal/canvas-poster/index.vue
  43. 5 5
      sheep/components/s-share-modal/canvas-poster/poster/groupon.js
  44. 84 92
      sheep/components/s-title-block/s-title-block.vue
  45. 148 166
      sheep/components/s-user-card/s-user-card.vue
  46. 2 28
      sheep/components/s-wallet-card/s-wallet-card.vue
  47. 17 0
      sheep/components/uni-indexed-list/changelog.md
  48. 144 0
      sheep/components/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue
  49. 367 0
      sheep/components/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue
  50. 89 0
      sheep/components/uni-indexed-list/package.json
  51. 11 0
      sheep/components/uni-indexed-list/readme.md
  52. 1 1
      sheep/libs/sdk-h5-weixin.js
  53. 1 0
      sheep/platform/provider/wechat/miniProgram.js
  54. 1 0
      sheep/platform/provider/wechat/officialAccount.js
  55. 0 2
      sheep/router/index.js
  56. 87 1
      sheep/scss/_tools.scss
  57. 2 0
      sheep/store/app.js
  58. 1 7
      sheep/store/cart.js
  59. 二進制
      static/homePage/banner.png
  60. 二進制
      static/homePage/bluehuo.png
  61. 二進制
      static/homePage/bluexing.png
  62. 二進制
      static/homePage/daka.png
  63. 二進制
      static/homePage/daodian.png
  64. 二進制
      static/homePage/fuwumeinv.png
  65. 二進制
      static/homePage/huiyuan.png
  66. 二進制
      static/homePage/jiantou.png
  67. 二進制
      static/homePage/kuaijie.png
  68. 二進制
      static/homePage/topbg.png
  69. 二進制
      static/homePage/tuijianmeinv.png
  70. 二進制
      static/homePage/xingxiang.png
  71. 二進制
      static/homePage/yaoqing.png
  72. 二進制
      static/homePage/youhui.png
  73. 二進制
      static/homePage/yuyue.png
  74. 二進制
      static/homePage/zhaopin.png
  75. 二進制
      static/icon/logo.png
  76. 二進制
      static/lanhu_shouye/0ec6b37287b9470080da66761c7acb4a_mergeImage.png
  77. 二進制
      static/lanhu_shouye/2d4bbfdd92454ce390099cd0b3f4827d_mergeImage.png
  78. 二進制
      static/lanhu_shouye/3669348c89e1484195ead2a693641ad0_mergeImage.png
  79. 二進制
      static/lanhu_shouye/451866d9f9cb44489db11b3cbd64a143_mergeImage.png
  80. 二進制
      static/lanhu_shouye/46bef50168b84fd6aaa29f4bcc551759_mergeImage.png
  81. 二進制
      static/lanhu_shouye/4c0d58d0a0d147ac90adec9fb0bfec0f_mergeImage.png
  82. 二進制
      static/lanhu_shouye/61f5a7931f9d41caafd7d60ec1efadb4_mergeImage.png
  83. 二進制
      static/lanhu_shouye/6461e1be91dd49c48afbbacf664a38ec_mergeImage.png
  84. 二進制
      static/lanhu_shouye/b0a7586b65a246f2bff8db2d14c75dc7_mergeImage.png
  85. 二進制
      static/lanhu_shouye/bb556fbbdb6f445a803ffd791c4e1828_mergeImage.png
  86. 二進制
      static/lanhu_shouye/f0d5117be4674fabb67af2a48e47e61d_mergeImage.png
  87. 二進制
      static/lanhu_shouye/f7c0cc7e4bf5466eabb649ece6ae5387_mergeImage.png
  88. 二進制
      static/lanhu_shouye/ps0dhzp8mouy2fgg4wjrd1occoeoz6lpggv29d19aa8-0234-4d9a-a8ce-3eba8e673e37.png
  89. 二進制
      static/lanhu_shouye/ps0vh4ynl7euk8tr5085ssz6cwdxhgrc88546f1cb-9ff7-4fe6-b279-aa56bcaee33a.png
  90. 二進制
      static/lanhu_shouye/ps1usx472izy70hbl1zx7zonjy7ztk3vsi3683e223-4f2a-4e52-a167-9af2d9a4e79f.png
  91. 二進制
      static/lanhu_shouye/ps2jgtolcfpxrovgv4adbklqfxs0xdn68bb0461c-c52e-4a9b-9f55-d3fcac902e80.png
  92. 二進制
      static/lanhu_shouye/ps2yolsy1y0pxtp297vmupv7fxe0pvaeicab4022b-c8e2-4e8a-898f-4405b339cf56.png
  93. 二進制
      static/lanhu_shouye/ps2zpqvud3mxhwheywygapp9g19kb1updi7dfbf1994-e810-4126-a2f3-f00af23a4005.png
  94. 二進制
      static/lanhu_shouye/ps3qdk2eqfqpnxb4ltlu7q91xhck6f8mrn583d40d1-2215-4158-9f2d-25a57f1d7bf1.png
  95. 二進制
      static/lanhu_shouye/ps3rnhf0h3f5tfy1i6sxykaab8eb5bd4ku4f04db045-528b-4b23-b99e-a05eb5b2464d.png
  96. 二進制
      static/lanhu_shouye/ps3yktsnfyp9q184m0n2oddbamta7j2rm6dbd4d680-54bf-471c-9792-c05398a3ed32.png
  97. 二進制
      static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png
  98. 二進制
      static/lanhu_shouye/ps49z053zwc0kbyz0iam0zq76lbo6l4uzus8737a25a-aff7-4c57-a127-84a2a6bf4556.png
  99. 二進制
      static/lanhu_shouye/ps4lxmxswmym348u236aywai6tkiitmmjo2be9cfc4-22a7-485c-8dc6-0301488c7b60.png
  100. 二進制
      static/lanhu_shouye/ps67q18priosurl11ywweaocdrtqikryfd45653430-437f-4239-8eab-7efc9d56f509.png

+ 1 - 1
.env

@@ -5,7 +5,7 @@ SHOPRO_VERSION = v1.8.3
 SHOPRO_BASE_URL = http://api-dashboard.yudao.iocoder.cn
 SHOPRO_BASE_URL = http://api-dashboard.yudao.iocoder.cn
 
 
 # 后端接口 - 测试环境(通过 process.env.NODE_ENV = development)
 # 后端接口 - 测试环境(通过 process.env.NODE_ENV = development)
-SHOPRO_DEV_BASE_URL = http://127.0.0.1:48080
+SHOPRO_DEV_BASE_URL = http://192.168.110.5:48080
 ### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc
 ### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc
 
 
 # 后端接口前缀(一般不建议调整)
 # 后端接口前缀(一般不建议调整)

+ 1 - 0
App.vue

@@ -15,6 +15,7 @@
   });
   });
 
 
   onShow((options) => {
   onShow((options) => {
+	  consloe.log('调用全局的show')
     // #ifdef APP-PLUS
     // #ifdef APP-PLUS
     // 获取urlSchemes参数
     // 获取urlSchemes参数
     const args = plus.runtime.arguments;
     const args = plus.runtime.arguments;

+ 72 - 0
components/XD-swiper/XD-swiper.vue

@@ -0,0 +1,72 @@
+<template>
+	<swiper :current="current" :circular="circular" :autoplay="true" :interval="interval" :duration="duration"
+		:display-multiple-items="multipleItems" :style="'height:'+height">
+		<swiper-item v-for="(item, index) in swiperList" :key="item.id">
+			<view class="ss-flex ss-row-around ss-flex-wrap" :style="'margin-left: 10rpx;height:'+height">
+				<view :style="'width:100%;height:'+imageHeight">
+					<image style="width: 100%;height: 100%;" referrerpolicy="no-referrer" :src="item.imageUrl" />
+				</view>
+				<slot :data="item"></slot>
+			</view>
+		</swiper-item>
+	</swiper>
+</template>
+
+<script setup>
+	import {
+		defineProps
+	} from 'vue'
+	// 父组件传递的数据
+	const props = defineProps({
+		current: { //当前所在滑块
+			type: Number,
+			default: 1
+		},
+		multipleItems: { //同时显示滑块数量
+			type: Number,
+			default: 1
+		},
+		circular: { //是否采用衔接滑动
+			type: Boolean,
+			default: true
+		},
+		autoplay: { //是否自动切换
+			type: Boolean,
+			default: true
+		},
+		interval: { //自动切换间隔 时长(ms)
+			type: Number,
+			default: 1000,
+		},
+		duration: { //滑动动画时长(ms)
+			type: Number,
+			default: 500,
+		},
+		height: { //高度
+			type: String,
+			default: '200rpx'
+		},
+		width: { //宽度
+			type: String,
+			default: '100%'
+		},
+		swiperList: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		imageHeight: { //高度
+			type: String,
+			default: '200rpx'
+		},
+		imageWidth: { //宽度
+			type: String,
+			default: '100%'
+		},
+	});
+</script>
+
+<style>
+
+</style>

+ 7 - 7
manifest.json

@@ -1,9 +1,9 @@
 {
 {
-  "name": "芋道商城",
-  "appid": "__UNI__460BC4C",
+  "name": "嘀咚到位",
+  "appid": "__UNI__5E22D74",
   "description": "基于 uni-app + Vue3 技术驱动的在线商城系统,内含诸多功能与丰富的活动,期待您的使用和反馈。",
   "description": "基于 uni-app + Vue3 技术驱动的在线商城系统,内含诸多功能与丰富的活动,期待您的使用和反馈。",
-  "versionName": "2.1.0",
-  "versionCode": 183,
+  "versionName": "1.0.0",
+  "versionCode": 100,
   "transformPx": false,
   "transformPx": false,
   "app-plus": {
   "app-plus": {
     "usingComponents": true,
     "usingComponents": true,
@@ -216,7 +216,7 @@
   "h5": {
   "h5": {
     "template": "index.html",
     "template": "index.html",
     "router": {
     "router": {
-      "mode": "history",
+      "mode": "hash",
       "base": "./"
       "base": "./"
     },
     },
     "sdkConfigs": {
     "sdkConfigs": {
@@ -225,7 +225,7 @@
     "async": {
     "async": {
       "timeout": 20000
       "timeout": 20000
     },
     },
-    "title": "芋道商城",
+    "title": "嘀咚到位",
     "optimization": {
     "optimization": {
       "treeShaking": {
       "treeShaking": {
         "enable": true
         "enable": true
@@ -236,4 +236,4 @@
   "_spaceID": "192b4892-5452-4e1d-9f09-eee1ece40639",
   "_spaceID": "192b4892-5452-4e1d-9f09-eee1ece40639",
   "locale": "zh-Hans",
   "locale": "zh-Hans",
   "fallbackLocale": "zh-Hans"
   "fallbackLocale": "zh-Hans"
-}
+}

+ 37 - 22
pages.json

@@ -6,7 +6,8 @@
 			"^su-(.*)": "@/sheep/ui/su-$1/su-$1.vue"
 			"^su-(.*)": "@/sheep/ui/su-$1/su-$1.vue"
 		}
 		}
 	},
 	},
-	"pages": [{
+	"pages": [
+		{
 			"path": "pages/index/index",
 			"path": "pages/index/index",
 			"aliasPath": "/",
 			"aliasPath": "/",
 			"style": {
 			"style": {
@@ -20,6 +21,28 @@
 				"group": "商城"
 				"group": "商城"
 			}
 			}
 		},
 		},
+		{
+			"path": "pages/index/category",
+			"style": {
+				"navigationBarTitleText": "商品分类"
+			},
+			"meta": {
+				"sync": true,
+				"title": "商品分类",
+				"group": "商城"
+			}
+		},
+		{
+			"path": "pages/index/cart",
+			"style": {
+				"navigationBarTitleText": "购物车"
+			},
+			"meta": {
+				"sync": true,
+				"title": "购物车",
+				"group": "商城"
+			}
+		},
 		{
 		{
 			"path": "pages/index/user",
 			"path": "pages/index/user",
 			"style": {
 			"style": {
@@ -33,24 +56,28 @@
 			}
 			}
 		},
 		},
 		{
 		{
-			"path": "pages/index/category",
-			"style": {
-				"navigationBarTitleText": "商品分类"
+			"path" : "pages/XDHome/homePage/homePage",
+			"style" : 
+			{
+				"navigationBarTitleText" : "首页two",
+				"enablePullDownRefresh": true
 			},
 			},
 			"meta": {
 			"meta": {
 				"sync": true,
 				"sync": true,
-				"title": "商品分类",
+				"title": "首页two",
 				"group": "商城"
 				"group": "商城"
 			}
 			}
 		},
 		},
 		{
 		{
-			"path": "pages/index/cart",
-			"style": {
-				"navigationBarTitleText": "购物车"
+			"path" : "pages/XDHome/technicianList/technicianList",
+			"style" : 
+			{
+				"navigationBarTitleText" : "技师列表",
+				"enablePullDownRefresh": true
 			},
 			},
 			"meta": {
 			"meta": {
 				"sync": true,
 				"sync": true,
-				"title": "购物车",
+				"title": "技师列表",
 				"group": "商城"
 				"group": "商城"
 			}
 			}
 		},
 		},
@@ -647,21 +674,9 @@
 	],
 	],
 	"globalStyle": {
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "芋道商城",
+		"navigationBarTitleText": "嘀咚到位",
 		"navigationBarBackgroundColor": "#FFFFFF",
 		"navigationBarBackgroundColor": "#FFFFFF",
 		"backgroundColor": "#FFFFFF",
 		"backgroundColor": "#FFFFFF",
 		"navigationStyle": "custom"
 		"navigationStyle": "custom"
-	},
-	"tabBar": {
-		"list": [{
-				"pagePath": "pages/index/index"
-			},
-			{
-				"pagePath": "pages/index/cart"
-			},
-			{
-				"pagePath": "pages/index/user"
-			}
-		]
 	}
 	}
 }
 }

+ 734 - 0
pages/XDHome/homePage/homePage.vue

@@ -0,0 +1,734 @@
+<!-- 首页,支持店铺装修 -->
+<template>
+	<s-layout class='homepage-wrap ss-w-100 box-sizing' title="首页two" navbar="custom"
+		tabbar="/pages/XDHomePage/homePage/homePage">
+		<view class="body">
+			<!-- 头部 -->
+			<view class="head ss-bg box-sizing" :style="'padding-top:'+bottomHeight">
+				<!-- 定位 客服 消息 -->
+				<view class="ss-flex ss-flex-nowrap ss-margin-top1" style="height: 50rpx;">
+					<view class="ss-flex-1 ss-flex ss-margin-left1">
+						<view class="ss-image-icon">
+							<image referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/psza2ppvfwx4d6fnhi4tcrcfmrgvqf7x4jb799f8f8-619e-4a58-9606-3e6cd5bf62c6.png"
+								class="icon_5"></image>
+						</view>
+						<text class="ss-font-2 ss-margin-left5" style="color:#fff;">烟台市芝罘区华庭路xxx</text>
+					</view>
+					<view class="ss-image-icon1 ss-margin-left5">
+						<image referrerpolicy="no-referrer"
+							src="/static/lanhu_shouye/61f5a7931f9d41caafd7d60ec1efadb4_mergeImage.png"
+							class="ss-w-100 ss-h-100"></image>
+					</view>
+					<view class="ss-image-icon1 ss-margin-left6 ss-margin-right">
+						<image referrerpolicy="no-referrer"
+							src="/static/lanhu_shouye/psza2ppvfwx4d6fnhi4tcrcfmrgvqf7x4jb799f8f8-619e-4a58-9606-3e6cd5bf62c6.png"
+							class="icon_5"></image>
+					</view>
+				</view>
+				<!-- 预约上门 到店尊享 快捷下单 -->
+				<view class="ss-flex ss-flex-nowrap ss-row-around ss-margin-width ss-margin-top3">
+					<view class="ss-flex ss-flex-nowrap ss-row-center">
+						<view class="ss-icon">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/b0a7586b65a246f2bff8db2d14c75dc7_mergeImage.png" />
+						</view>
+						<view class="ss-text ss-margin-left4 font-icon">预约上门</view>
+					</view>
+					<view class="ss-flex ss-flex-nowrap ss-row-center" style="position: relative;">
+						<view class="ss-icon">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/ps2zpqvud3mxhwheywygapp9g19kb1updi7dfbf1994-e810-4126-a2f3-f00af23a4005.png" />
+						</view>
+						<view class="ss-text ss-margin-left4">
+							<view>到店尊享</view>
+							<view class="red-box">会员优惠</view>
+						</view>
+					</view>
+					<view class="ss-flex ss-flex-nowrap ss-row-center" style="position: relative;">
+						<view class="ss-icon">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/psaf5wkf2zzotodrgkbrojxh2f4yd3pl9lg04f0df6a-0803-47d8-be42-ef57e271456c.png" />
+						</view>
+						<view class="ss-text ss-margin-left4">
+							<view>快捷上门</view>
+							<view class="red-box">快人一步</view>
+						</view>
+					</view>
+				</view>
+				<!-- 功能区域 -->
+				<view class="ss-flex ss-flex-nowrap ss-row-around function-box">
+					<view class="ss-flex ss-flex-wrap ss-row-around">
+						<view class="ss-image">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/efed74f8e4604d4eb08e7b731007fa9d_mergeImage.png" />
+						</view>
+						<view class="ss-font-2 ss-margin-top6">
+							打卡签到
+						</view>
+					</view>
+					<view class="ss-flex ss-flex-wrap ss-row-around">
+						<view class="ss-image">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/f7dc0ce749ea4c02b7cdb3c84a8c6f3c_mergeImage.png" />
+						</view>
+						<view class="ss-font-2 ss-margin-top6">
+							优惠活动
+						</view>
+					</view>
+					<view class="ss-flex ss-flex-wrap ss-row-around">
+						<view class="ss-image">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/f8a6d69731334d19b323258208ed7b04_mergeImage.png" />
+						</view>
+						<view class="ss-font-2 ss-margin-top6">
+							会员权益
+						</view>
+					</view>
+					<view class="ss-flex ss-flex-wrap ss-row-around">
+						<view class="ss-image">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/60a631e8455641e993ec3febb2b72243_mergeImage.png" />
+						</view>
+						<view class="ss-font-2 ss-margin-top6">
+							招聘合作
+						</view>
+					</view>
+					<view class="ss-flex ss-flex-wrap ss-row-around">
+						<view class="ss-image">
+							<image class="icon_5" referrerpolicy="no-referrer"
+								src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/ae105b8c0a594e84ba9985cdcdae6223_mergeImage.png" />
+						</view>
+						<view class="ss-font-2 ss-margin-top6">
+							邀请赚钱
+						</view>
+					</view>
+				</view>
+			</view>
+			
+			<view class="list-wrap-two" style="margin-top: 20rpx;">
+				<scroll-view scroll-y="true" class="list-two">
+					<!-- 中部 -->
+					<view class="list-wrap">
+						<view class="ss-flex ss-margin-width2" style="background-color: #EEEEEF;">
+							<view :class="nactiveIndex==1?'title-box-two':'title-box'" @click="nactiveInfo(1)">手法专业</view>
+							<view :class="nactiveIndex==2?'title-box-two':'title-box'" @click="nactiveInfo(2)">明星技师</view>
+							<view :class="nactiveIndex==3?'title-box-two':'title-box'" @click="nactiveInfo(3)">新人入驻</view>
+						</view>
+						<!-- 两个左右箭头 -->
+						<view class="left-jian">
+							<image class="icon_5" referrerpolicy="no-referrer" @click="prev()"
+								src="/static/lanhu_shouye/6461e1be91dd49c48afbbacf664a38ec_mergeImage.png" />
+						</view>
+						<view class="right-jian">
+							<image class="icon_5" referrerpolicy="no-referrer" @click="next()"
+								src="/static/lanhu_shouye/46bef50168b84fd6aaa29f4bcc551759_mergeImage.png" /> 
+						</view>
+						<view class="list">
+							<XD-swiper :current="currentIndex" :interval="5000" :duration="1000" :multipleItems="3" :height="'400rpx'" :imageHeight="'340rpx'" :swiperList="swiperListOne">
+								<template v-slot="slotProps">
+									<view style="height:30rpx;padding:5rpx;line-height: 30rpx;"
+										class="ss-flex ss-flex-nowrap">
+										<view class="ss-font-2">{{slotProps.data.name}}</view>
+										<view class="ss-flex-1">
+										</view>
+										<view style="width:26rpx;height:20rpx;padding-bottom: 15rpx;">
+											<image class="icon_5" referrerpolicy="no-referrer"
+												src="/static/lanhu_shouye/2d4bbfdd92454ce390099cd0b3f4827d_mergeImage.png" />
+										</view>
+									</view>
+								</template>
+							</XD-swiper>
+						</view>
+					</view>
+					<!-- 当前服务模块 -->
+					<view class="ss-flex ss-flex-nowrap service-module">
+						<view class="service-text">
+							<text style="color:red;">当前</text><text>服务</text>
+						</view>
+						<view class="broadcast">
+							<!-- 当前服务轮播 -->
+							<swiper :current="currentIndex" vertical circular :autoplay="true" interval="5000"
+								duration="1000" display-multiple-items="1" style="height: 120rpx;width: 100%;"
+								@change="changeSwiper">
+								<swiper-item v-for="(item, index) in swiperList" :key="index+'_jhy'"
+									style="height:110rpx;width:100%;padding:5rpx;">
+									<view style="display: flex;flex-wrap: nowrap;width: 100%;">
+										<view style="width:75rpx;height:120rpx;">
+											<image class="icon_5" referrerpolicy="no-referrer"
+												src="/static/lanhu_shouye/pserz4p1s8x8wkob1c0bat390gscqet6q2w9869d84a-bcd7-4f8a-a669-dda68333c1f2.png" />
+										</view>
+										<view class="ss-flex-1">
+											<uni-notice-bar v-if="index==swiperIndex" :speed="40" background-color="#fff"
+												:showIcon="false" style="width:100%;height:120rpx;" scrollable
+												text="uni-app 版正式发布,开发一次,同时发布iOS、Android、H5、微信小程序、支付宝小程序、百度小程序、头条小程序等7大平台">
+											</uni-notice-bar>
+										</view>
+										<view style="width:120rpx;background-color: #fff;">
+											<view class="f-button">提前预约{{index}}</view>
+										</view>
+									</view>
+								</swiper-item>
+							</swiper>
+						</view>
+					</view>
+					<!-- 服务项目 -->
+					
+					<view class="project-box">
+						<view class="ss-flex ss-flex-nowrap" style="padding:10rpx;">
+							<view style="font-size: 26rpx;">服务项目</view>
+							<view class="ss-flex-1"></view>
+							<view style="width:80rpx;" class="ss-flex ss-flex-nowrap">
+								<view class="ss-font-1" style="color:#929699;margin-top:5rpx;">更多</view>
+								<view style="width: 25rpx;height: 20rpx;margin-left:10rpx;margin-top:-11rpx;">
+									<image class="icon_5" referrerpolicy="no-referrer"
+										src="/static/lanhu_shouye/pssy6qpwcm3oof80oiyvs68a83ztr1i4g1bd89538-eec8-4886-92a1-a23ac37768e7.png" />
+								</view>
+							</view>
+						</view>
+						<view style="margin-top: 10rpx;">
+							<XD-swiper :current="currentIndex" :interval="5000" :duration="1000" :multipleItems="4" :height="'170rpx'" :imageHeight="'130rpx'" :swiperList="swiperListTwo">
+								<template v-slot="slotProps">
+									<view style="height:30rpx;padding:5rpx;line-height: 30rpx;"
+										class="ss-flex ss-flex-nowrap">
+										<view style="font-size: 16rpx;height:20rpx;">{{slotProps.data.projectName}}</view>
+										<view class="ss-flex-1">
+														
+										</view>
+										<view style="height:20rpx;font-size: 14rpx;padding-top:5rpx;color:red;">
+											¥{{slotProps.data.maney}}
+										</view>
+									</view>
+								</template>
+							</XD-swiper>
+						</view>
+					</view>
+					<!-- 技师列表展示(瀑布流) -->
+					<view class="waterfall-box">
+						<view class="ss-flex ss-flex-nowrap" style="padding:10rpx;">
+							<view :class="waterIndex==1?'list-active-title':'list-title'" @click="waterClickTitle(1)">推荐
+							</view>
+							<view :class="waterIndex==2?'list-active-title':'list-title'" @click="waterClickTitle(2)">附近
+							</view>
+							<view :class="waterIndex==3?'list-active-title':'list-title'" @click="waterClickTitle(3)">关注
+							</view>
+							<view class="ss-flex-1"></view>
+							<view style="width:80rpx;" class="ss-flex ss-flex-nowrap">
+								<view class="ss-font-1" style="color:#929699;margin-top:15rpx;">更多</view>
+								<view class="water-title-more">
+									<image class="icon_5" referrerpolicy="no-referrer"
+										src="/static/lanhu_shouye/pssy6qpwcm3oof80oiyvs68a83ztr1i4g1bd89538-eec8-4886-92a1-a23ac37768e7.png" />
+								</view>
+							</view>
+						</view>
+						<!-- 瀑布流布局 -->
+						<view style="padding:10rpx;">
+							<view class="content-test">
+								<view class="list-test" v-for="(item, index) in swiperList" :key="item.id">
+					
+									<view v-if="index==1||index==7" style="padding-bottom:30rpx">
+					
+										<swiper class="box-sizing" style="height:320rpx;"
+											:current="currentIndex" circular :autoplay="true" interval="5000"
+											duration="1000" display-multiple-items="1">
+											<swiper-item v-for="(item, index) in swiperList" :key="index">
+												<image class="icon_5" referrerpolicy="no-referrer"
+													src="/static/lanhu_shouye/ps4lxmxswmym348u236aywai6tkiitmmjo2be9cfc4-22a7-485c-8dc6-0301488c7b60.png" />
+											</swiper-item>
+										</swiper>
+									</view>
+					
+									<view v-else @click="gopreview(item.id)" style="padding-bottom:30rpx">
+										<view style="height:310rpx;" class="box-sizing">
+											<image class="icon_5" referrerpolicy="no-referrer"
+												src="/static/lanhu_shouye/psq752p4oxrur1kwz38o9hz2uugu327v8c905774083-1ff9-40d7-8687-01c969b1461d.png" />
+										</view>
+										<view class="ss-flex ss-flex-nowrap box-sizing"
+											style="height:40rpx;margin-top:15rpx;">
+											<view style="font-size: 24rpx;">
+												王琳sf谁
+											</view>
+											<view class="ss-flex-1"></view>
+											<view class="ss-flex" style="width: 60rpx;height:40rpx;margin-top:2rpx;">
+												<view style="width:20rpx;height:20rpx;" class="ss-flex">
+													<image class="icon_5" referrerpolicy="no-referrer"
+														src="/static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png" />
+												</view>
+												<view style="font-size: 20rpx;height:25rpx;margin-left:5rpx;">4.8</view>
+											</view>
+											<view class="ss-flex"
+												style="height:40rpx;margin-left:10rpx;box-sizing: border-box;padding-left:5rpx;">
+												<view style="width:15rpx;height:22rpx;" class="ss-flex">
+													<image class="icon_5" referrerpolicy="no-referrer"
+														src="/static/lanhu_shouye/psmhtq7f5mtj9p90k3kaa1orxxscw7f3llac959982c-94bc-4f6a-9cee-a59dd97c25f2.png" />
+												</view>
+												<view
+													style="font-size: 20rpx;height:25rpx;margin-left:5rpx;margin-top:-3rpx;">
+													已接<text
+														style="color:#2CADEB;margin-left:3rpx;margin-right:3rpx;">6</text>单
+												</view>
+											</view>
+										</view>
+										<view class="ss-flex ss-flex-nowrap ss-self-start" style="margin-top: 10rpx;">
+											<view class="ss-flex ss-flex-nowrap ss-margin-left4">
+												<view style="width:16rpx;height:16rpx;" class="ss-flex">
+													<image class="icon_5" referrerpolicy="no-referrer"
+														src="/static/lanhu_shouye/pspk8pze9bwdqv9oslvx1xc0tcqeb932n722dbb1d-f5f9-40ea-be4a-eca416c5300e.png" />
+												</view>
+												<view style="font-size: 6rpx !important;">
+													<text style="color:#43AEE9;padding-left:5rpx;">80%</text>认为形象优秀
+												</view>
+											</view>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+			    </scroll-view>
+			</view>
+		</view>
+	</s-layout>
+</template>
+
+<script setup>
+	import {
+		reactive,
+		ref
+	} from 'vue';
+	import {
+		computed
+	} from 'vue';
+	import {
+		onLoad,
+		onPageScroll,
+		onPullDownRefresh,
+		onReady,
+		onReachBottom,
+		onShow
+	} from '@dcloudio/uni-app';
+	import sheep from '@/sheep';
+	import $share from '@/sheep/platform/share';
+	// 隐藏原生tabBar
+	uni.hideTabBar();
+
+
+
+	/**技师推荐*/
+	const nactiveIndex = ref(1)
+	// num 1 手法专业  2 明星技师  3 新人入驻
+	function nactiveInfo(num) {
+		nactiveIndex.value = num
+	}
+	// 技师轮播
+	const currentIndex = ref(0)
+	const swiperListOne=ref([
+		{
+			imageUrl:'/static/lanhu_shouye/pserz4p1s8x8wkob1c0bat390gscqet6q2w9869d84a-bcd7-4f8a-a669-dda68333c1f2.png',
+			id:1,
+			name:'王琳',
+			flag:true
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pserz4p1s8x8wkob1c0bat390gscqet6q2w9869d84a-bcd7-4f8a-a669-dda68333c1f2.png',
+			id:2,
+			name:'王琳',
+			flag:false
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pserz4p1s8x8wkob1c0bat390gscqet6q2w9869d84a-bcd7-4f8a-a669-dda68333c1f2.png',
+			id:3,
+			name:'王琳',
+			flag:true
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pserz4p1s8x8wkob1c0bat390gscqet6q2w9869d84a-bcd7-4f8a-a669-dda68333c1f2.png',
+			id:4,
+			name:'王琳',
+			flag:true
+		}
+	])
+	const swiperListTwo=ref([
+		{
+			imageUrl:'/static/lanhu_shouye/pskrims113novhztuh3djro4dewm6siic9cbfccd-f457-4e94-a2a5-bf7808d1dd3f.png',
+			id:1,
+			projectName:'spa',
+			maney:'999.99'
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pskrims113novhztuh3djro4dewm6siic9cbfccd-f457-4e94-a2a5-bf7808d1dd3f.png',
+			id:2,
+			projectName:'洗脚',
+			maney:'999.99'
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pskrims113novhztuh3djro4dewm6siic9cbfccd-f457-4e94-a2a5-bf7808d1dd3f.png',
+			id:3,
+			projectName:'推拿',
+			maney:'999.99'
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pskrims113novhztuh3djro4dewm6siic9cbfccd-f457-4e94-a2a5-bf7808d1dd3f.png',
+			id:4,
+			projectName:'精油按摩',
+			maney:'999.99'
+		},
+		{
+			imageUrl:'/static/lanhu_shouye/pskrims113novhztuh3djro4dewm6siic9cbfccd-f457-4e94-a2a5-bf7808d1dd3f.png',
+			id:5,
+			projectName:'护理',
+			maney:'999.99'
+		}
+	])
+	const swiperList = ref(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'])
+
+	function handleSwiperChange(event) {
+		const current = event.detail.current;
+		currentIndex.value = current;
+		console.log("当前轮播到第", current, "个索引");
+	}
+
+	function prev() {
+		currentIndex.value = (currentIndex.value - 1 + swiperList.value.length) % swiperList.value.length;
+	}
+
+	function next() {
+		currentIndex.value = (currentIndex.value + 1) % swiperList.value.length;
+	}
+	const swiperIndex = ref(0)
+	// 广告开启与关闭
+	function changeSwiper(e) {
+		console.log(e, 'rrrrrrrrrrr')
+		swiperIndex.value = e.detail.current
+	}
+
+
+
+	/**技师推荐列表*/
+	const waterIndex = ref(1)
+	function waterClickTitle(num) {
+		waterIndex.value = num
+	}
+
+
+
+
+
+
+	const app = uni.getSystemInfoSync()
+	const bottomHeightOne = (app.statusBarHeight) + 'rpx'
+	const bottomHeight = ref(bottomHeightOne)
+
+
+
+
+	onLoad((options) => {
+		// #ifdef MP
+		// 小程序识别二维码
+		if (options.scene) {
+			const sceneParams = decodeURIComponent(options.scene).split('=');
+			console.log("sceneParams=>", sceneParams);
+			options[sceneParams[0]] = sceneParams[1];
+		}
+		// #endif
+
+		// 预览模板
+		if (options.templateId) {
+			sheep.$store('app').init(options.templateId);
+		}
+
+		// 解析分享信息
+		if (options.spm) {
+			$share.decryptSpm(options.spm);
+		}
+
+		// 进入指定页面(完整页面路径)
+		if (options.page) {
+			sheep.$router.go(decodeURIComponent(options.page));
+		}
+
+	});
+
+	// 下拉刷新
+	onPullDownRefresh(() => {
+		// sheep.$store('app').init();
+		// setTimeout(function() {
+		// 	uni.stopPullDownRefresh();
+		// }, 800);
+		console.log('下拉刷新')
+		uni.stopPullDownRefresh();
+	})
+	onReachBottom(() => {
+		console.log('上拉加载')
+	})
+	onPageScroll(() => {});
+</script>
+<style scoped>
+	/deep/ .uni-noticebar__content-text {
+		font-size: 26rpx !important;
+	}
+</style>
+<style scoped lang="scss">
+	// ======test
+	.list-wrap-two {
+		flex-grow: 1;
+		position: relative;
+	}
+	.list-two {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+	.list-test {
+		break-inside: avoid;
+		width: 100%;
+		margin-left: 3%;
+		border-radius: 20rpx;
+		box-sizing: border-box;
+	}
+	.con-test {
+		color: #8b8d8c;
+		overflow: hidden;
+		/*超出部分隐藏*/
+		white-space: nowrap;
+		/*禁止换行*/
+		text-overflow: ellipsis;
+		margin-left: 15rpx;
+		margin-right: 15rpx;
+		font-size: 26rpx;
+	}
+	.title-test {
+		margin-left: 15rpx;
+		margin-right: 15rpx;
+		font-size: 26rpx;
+		color: #8b8d8c;
+		overflow: hidden;
+		/*超出部分隐藏*/
+		white-space: nowrap;
+		/*禁止换行*/
+		text-overflow: ellipsis;
+	}
+	/* 内容区 */
+	.content-test {
+		width: 100%;
+		padding: 10rpx;
+		box-sizing: border-box;
+		column-count: 2;
+	}
+	image {
+		width: 100%;
+		border-radius: 6rpx;
+	}
+	.list-title {
+		width: 110rpx;
+		font-size: 30rpx;
+		color: #9C9C9C;
+		padding-top: 15rpx;
+		box-sizing: border-box;
+	}
+	.list-active-title {
+		width: 110rpx;
+		font-size: 34rpx;
+		color: #222C3A;
+		font-weight: 650;
+	}
+	// 新样式
+	.water-title-more {
+		width: 25rpx;
+		height: 20rpx;
+		margin-left: 10rpx;
+	}
+	.waterfall-box {
+		width: 95%;
+		margin-left: 2.5%;
+		background-color: #fff;
+		padding: 10rpx;
+		box-sizing: border-box;
+	}
+	.project-box {
+		width: 95%;
+		margin-left: 2.5%;
+		background-color: #fff;
+		padding: 10rpx;
+		margin-top: 20rpx;
+		border-top-right-radius: 10rpx;
+		border-top-left-radius: 10rpx;
+		box-sizing: border-box;
+	}
+	.f-button {
+		width: 100%;
+		height: 50rpx;
+		line-height: 50rpx;
+		text-align: center;
+		font-size: 24rpx;
+		border-radius: 15rpx;
+		background-color: #34AFCA;
+		color: #fff;
+		margin-top: 30rpx;
+		margin-right: 5rpx;
+	}
+	// 服务模块
+	.broadcast {
+		flex-grow: 1;
+		margin-left: 10rpx;
+		height: 120rpx;
+		overflow: hidden;
+		background-color: #fff;
+	}
+	.service-text {
+		width: 120rpx;
+		height: 120rpx;
+		font-size: 32rpx;
+		font-weight: 650;
+		text-align: center;
+		border-right: 1rpx dashed #969899;
+		padding-left: 15rpx;
+		padding-right: 15rpx;
+		padding-top: 20rpx;
+		box-sizing: border-box;
+	}
+	.service-module {
+		width: 95%;
+		margin-left: 2.5%;
+		background-color: #fff;
+		padding: 10rpx;
+		margin-top: 20rpx;
+		border-radius: 5rpx;
+		box-sizing: border-box;
+	}
+	// 滑动模块
+	.right-jian {
+		position: absolute;
+		top: 40%;
+		right: 20rpx;
+		width: 70rpx;
+		height: 70rpx;
+		z-index: 99;
+	}
+	.left-jian {
+		position: absolute;
+		top: 40%;
+		left: 20rpx;
+		width: 70rpx;
+		height: 70rpx;
+		z-index: 99;
+	}
+	.title-box {
+		width: 24%;
+		height: 40rpx;
+		line-height: 40rpx;
+		text-align: center;
+		font-size: 26rpx;
+		color: #B5B5B6;
+		border-top-left-radius: 10rpx;
+		border-top-right-radius: 10rpx;
+	}
+	.title-box-two {
+		width: 24%;
+		height: 40rpx;
+		line-height: 40rpx;
+		text-align: center;
+		font-size: 26rpx;
+		border-top-left-radius: 10rpx;
+		border-top-right-radius: 10rpx;
+		color:#58B5EC;
+		background-color: #fff;
+	}
+	.icon_5 {
+		width: 100%;
+		height: 100%;
+	}
+	.ss-icon {
+		width: 52rpx;
+		height: 52rpx;
+	}
+	.ss-text {
+		font-size: 26rpx;
+		color: #fff;
+		font-weight: 700;
+	}
+	.red-box {
+		position: absolute;
+		top: -25rpx;
+		right: -25rpx;
+		height: 20rpx;
+		line-height: 20rpx;
+		border-radius: 10rpx;
+		padding-left: 12rpx;
+		padding-right: 12rpx;
+		padding-top:5rpx;
+		color: #fff;
+		background-color: red;
+		font-size: 12rpx;
+	}
+	.ss-image {
+		width: 65rpx;
+		height: 65rpx
+	}
+	.function-box {
+		width: 95%;
+		margin-left: 2.5%;
+		border-radius: 10rpx;
+		background-color: #fff;
+		padding: 20rpx;
+		margin-top: 30rpx;
+		box-sizing: border-box;
+	}
+	// 上中下布局样式
+	.body {
+		display: flex;
+		flex-direction: column;
+		width: 100vw;
+		height: calc(100vh - 50px);
+		background-color: #EEEEEF;
+		box-sizing: border-box;
+	}
+	.head {
+		text-align: center;
+	}
+	// 中部滚动
+	.list-wrap {
+		position: relative;
+	}
+	.list {
+		width: 95%;
+		margin-left: 2.5%;
+		white-space: nowrap;
+		overflow-x: auto;
+		background-color: #fff;
+		padding-top: 10rpx;
+		box-sizing: border-box;
+	}
+	// 底部
+	.tools {
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+	}
+	.tools-item {
+		width: 45px;
+		text-align: center;
+		font-size: 14px;
+		padding: 20px;
+	}
+</style>
+<style lang="scss" scoped>
+	.homepage-wrap {
+		// 头部
+		.ss-bg {
+			background: url('@/static/top-bg.png') no-repeat;
+			background-size: 100% 100%;
+			box-sizing: border-box;
+			.ss-image-icon {
+				width: 30rpx;
+				height: 30rpx;
+			}
+			.ss-image-icon1 {
+				width: 40rpx;
+				height: 40rpx;
+			}
+		}
+	}
+</style>

+ 504 - 0
pages/XDHome/technicianList/technicianList.vue

@@ -0,0 +1,504 @@
+<!-- 技师列表 -->
+<!-- 首页,支持店铺装修 -->
+<template>
+	<s-layout class='ss-w-100 ss-h-100 box-sizing' style="position: relative;" title="技师" navbar="custom"
+		tabbar="/pages/XDHomePage/technicianList/technicianList">
+		<view class="body" :style="'padding-top:'+bottomHeight">
+			<!-- 头部 -->
+			<view style="margin-top: 20rpx;padding: 10rpx;" id="head-box">
+				<!-- 导航标题 -->
+				<view class="ss-flex ss-w-100">
+					<view class="ss-flex">
+						<view style="width:40rpx;height:40rpx;">
+							<image referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/6461e1be91dd49c48afbbacf664a38ec_mergeImage.png"
+								class="icon-image"></image>
+						</view>
+						<view style="font-size:26rpx;color:#fff;margin-left:15rpx;">
+							技师列表
+						</view>
+					</view>
+					<view class="ss-flex-1"></view>
+					<view style="width:40rpx;height:40rpx;">
+						<image referrerpolicy="no-referrer"
+							src="/static/lanhu_shouye/61f5a7931f9d41caafd7d60ec1efadb4_mergeImage.png"
+							class="icon-image"></image>
+					</view>
+					<view style="width:40rpx;height:40rpx;margin-left:15rpx;margin-right:15rpx;">
+						<image referrerpolicy="no-referrer"
+							src="/static/lanhu_shouye/psza2ppvfwx4d6fnhi4tcrcfmrgvqf7x4jb799f8f8-619e-4a58-9606-3e6cd5bf62c6.png"
+							class="icon-image"></image>
+					</view>
+				</view>
+				<!-- 搜索框 -->
+				<view style="width:100%;height:60rpx;margin-top:20rpx;">
+					<uni-search-bar radius="30" v-model="searchInfo" placeholder="请输入搜索关键字" cancelButton="none" clearButton="none" @confirm="onSearch" ></uni-search-bar>
+				</view>
+				<!-- 多种搜索 -->
+				<view style="width:100%;height:60rpx;margin-top:20rpx;" class="ss-flex">
+					<view style="width:40rpx;height:40rpx;margin-left:15rpx;margin-right:15rpx;">
+						<image referrerpolicy="no-referrer"
+							src="/static/lanhu_shouye/psza2ppvfwx4d6fnhi4tcrcfmrgvqf7x4jb799f8f8-619e-4a58-9606-3e6cd5bf62c6.png"
+							class="icon-image"></image>
+					</view>
+					<view style="width:25%;height:40rpx;">
+						<uni-data-select
+							class="icon-image"
+						    v-model="address"
+						    :localdata="range"
+							:clear="false"
+						    @change="changeAddress"
+						></uni-data-select>
+					</view>
+					<view style="width:20rpx;"></view>
+					<view style="width:25%;height:40rpx;" class="distance">
+						<uni-data-select
+							class="icon-image"
+						    v-model="distance"
+						    :localdata="distanceData"
+							:clear="false"
+						    @change="changeDistance"
+						></uni-data-select>
+					</view>
+					<view class="ss-flex-1"></view>
+					<view style="width:120rpx;display:flex;margin-right:20rpx;" @click="searchAll">
+						<view style="width:80rpx;height:40rpx;line-height:40rpx;text-align:center;font-size:26rpx;color:#fff;">筛选</view>
+						<view style="width:40rpx;height:40rpx;margin-left:15rpx;margin-right:15rpx;">
+							<image referrerpolicy="no-referrer"
+								src="/static/lanhu_shouye/psza2ppvfwx4d6fnhi4tcrcfmrgvqf7x4jb799f8f8-619e-4a58-9606-3e6cd5bf62c6.png"
+								class="icon-image"></image>
+						</view>
+					</view>
+					
+				</view>
+			</view>
+			<!-- 中部 -->
+			<view class="list-wrap">
+				<scroll-view scroll-y="true" class="list">
+					<view class="ss-flex-2 box-sizing list-box" v-for="item in 10" :key="item">
+						<!-- 左右布局 -->
+						<view style="width:190rpx;">
+							<view style="width:190rpx;height:160rpx;">
+								<image referrerpolicy="no-referrer"
+									src="/static/lanhu_shouye/psq752p4oxrur1kwz38o9hz2uugu327v8c905774083-1ff9-40d7-8687-01c969b1461d.png"
+									class="icon-image"></image>
+							</view>
+							<view class="bt-box">
+								可预约
+							</view>
+						</view>
+						<!-- 右边布局 -->
+						<view class="ss-flex-1" style="margin-left: 20rpx;">
+							<view class="ss-flex">
+								<view style="font-size: 30rpx;color:#1A2433;font-weight: 650;">王琳haha</view>
+								<view class="ss-flex" style="margin-left:20rpx;margin-top:5rpx;">
+									<view style="width:25rpx;height:25rpx;">
+										<image class="icon-image" referrerpolicy="no-referrer"
+											src="/static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png" />
+									</view>
+									<view style="font-size: 24rpx;margin-left:5rpx;color:#009FE8;margin-top: 5rpx;">4.8</view>
+								</view>
+								<view class="ss-flex-1"></view>
+								<view class="job-box">
+									NO.00158
+								</view>
+							</view>
+							<view class="ss-flex-2">
+								<view class="flag-box" style="background-color: #E57F3A;">
+									新人
+								</view>
+								<view class="flag-box" style="background-color: #E50012;">
+									明星
+								</view>
+								<view class="flag-box" style="background-color: #48B790;">
+									手法哈哈哈哈
+								</view>
+							</view>
+							<uni-tooltip style="margin-top: 5rpx;" content="哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈哈哈哈" placement="bottom">
+								<view class="text-info-box">
+									哈哈哈哈哈哈哈,哈哈哈哈哈哈哈,哈哈哈哈,哈哈哈哈哈哈哈,
+								</view>
+							</uni-tooltip>
+							<view class="ss-flex-2">
+								<view class="ss-flex-2 shop-box ss-row-center" style="height:25rpx;">
+									<view style="width:17rpx;height:17rpx;margin-top:3rpx;" class="ss-flex-2">
+										<image class="icon-image" referrerpolicy="no-referrer"
+											src="/static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png" />
+									</view>
+									<view style="font-size:16rpx;margin-left: 5rpx;color:#444;">秋水伊人</view>
+								</view>
+							</view>
+							<view class="ss-flex-2 ss-row-center ss-col-center" style="box-sizing: border-box;">
+								<view style="width:23rpx;height:25rpx;">
+									<image class="icon-image" referrerpolicy="no-referrer"
+										src="/static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png" />
+								</view>
+								<view style="font-size: 22rpx;margin-left:5rpx;margin-top: 15rpx;">
+									15
+								</view>
+								<view style="width:17rpx;height:25rpx;margin-left:30rpx;">
+									<image class="icon-image" referrerpolicy="no-referrer"
+										src="/static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png" />
+								</view>
+								<view style="font-size: 22rpx;margin-left:5rpx;color:#009FE8;margin-top: 15rpx;">
+									15.256km
+								</view>
+								<view style="font-size: 16rpx;margin-left:20rpx;color:#666;margin-top: 15rpx;">
+									莱山区哈哈哈
+								</view>
+								<view class="ss-flex-1"></view>
+								<view class="bt-box-two">点TA</view>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<!-- 弹窗 -->
+		<view v-if="isShow" class="popup-box" :style="'top:'+topSize" @click="close(2)">
+			<view style="position: relative;width:100%;background-color: #fff;" @click.stop="prevent">
+				<view style="display: flex;flex-direction:row;border-bottom: 4rpx solid #DCDCDC;">
+					<!-- 左右布局 -->
+					<view style="width:160rpx;background-color: #DCDCDC;color:#6B6B6B;font-size:26rpx;">
+						<view style="width:100%;height:90rpx;line-height: 90rpx;text-align: center;font-size:34rpx;color:#333;font-weight: 650;background-color: #fff;">技师筛选</view>
+						<view style="width:100%;height:90rpx;line-height: 90rpx;text-align: center;">时段</view>
+						<view style="width:100%;height:90rpx;line-height: 90rpx;text-align: center;">价格</view>
+						<view style="width:100%;height:90rpx;line-height: 90rpx;text-align: center;">服务状态</view>
+						<view style="width:100%;height:90rpx;line-height: 90rpx;text-align: center;">服务类别</view>
+					</view>
+					<view class="ss-flex-1 box-sizing" style="padding-top:10rpx;">
+						<view class="search-title">
+							技师登记
+						</view>
+						<view class="content-info-box">
+							<view class="content-text" @click.stop="newInfo(1)">新人组</view>
+							<view class="content-text">明星组</view>
+							<view class="content-text">专业组</view>
+							<view class="content-text">5星好评</view>
+						</view>
+						<view class="search-title">
+							技师性别
+						</view>
+						<view class="content-info-box">
+							<view class="content-text">女技师</view>
+							<view class="content-text">男技师</view>
+							<view class="content-text">性别不限</view>
+						</view>
+						<view class="search-title">
+							服务类别
+						</view>
+						<view class="content-info-box">
+							<view class="content-text">上门服务</view>
+							<view class="content-text">店面体验</view>
+						</view>
+						<view class="search-title">
+							服务状态
+						</view>
+						<view class="content-info-box">
+							<view class="content-text">空闲中</view>
+							<view class="content-text">休息中</view>
+							<view class="content-text">服务中</view>
+						</view>
+						<view class="search-title">
+							技师年龄(岁)
+						</view>
+						<view style="width: 95%;margin-left:2.5%;">
+							<slider :value="age" @change="sliderChange" min="18" max="55" show-value />
+						</view>
+						<view class="search-title">
+							技师距离(km)
+						</view>
+						<view style="width: 95%;margin-left:2.5%;">
+							<slider :value="distanceNum" @change="changeDistanceTwo" min="3" max="20" show-value />
+						</view>
+					</view>
+				</view>
+				<view style="display: flex;flex-wrap: nowrap;width:100%;height: 120rpx;">
+					<view class="button-info-box" style="color:#41474B;background-color: #DCDCDC;">重置</view>
+					<view class="button-info-box" style="color:#fff;background-color: #49B58E;">完成</view>
+				</view>
+			</view>
+		</view>
+	</s-layout>
+</template>
+
+<script setup>
+	import {
+		computed,
+		ref
+	} from 'vue';
+	import {
+		onLoad,
+		onPageScroll,
+		onPullDownRefresh
+	} from '@dcloudio/uni-app';
+	import sheep from '@/sheep';
+	import $share from '@/sheep/platform/share';
+	// 隐藏原生tabBar
+	uni.hideTabBar();
+
+	/**搜索栏*/
+	const searchInfo=ref('')
+	//搜索事件
+	const onSearch=async(e)=>{
+		console.log(e,'触发搜索事件')
+	}
+	const address=ref(0)
+	const range=ref([
+        { value: 0, text: "华庭路橡树湾小区10-909" },
+        { value: 1, text: "足球" },
+        { value: 2, text: "游泳" },
+      ])
+	const changeAddress=async(e)=>{
+		console.log(e,'获取地址信息')
+	}
+	const distance=ref(0)
+	const distanceData=ref(
+	[{ value: 0, text: "距离" },
+	{ value: 1, text: "0~3km" },
+	{ value: 2, text: "3~5km" },
+	{ value: 2, text: "5~10km" },]
+	)
+	const changeDistance=async(e)=>{
+		console.log(e,'获取距离')
+	}
+	const topSize=ref('0rpx')
+	const isShow=ref(false)
+	const searchAll=async()=>{
+		//获取头部盒子宽高
+		const query = uni.createSelectorQuery().select("#head-box")
+		//获取宽度
+		query.boundingClientRect(function(data){
+			console.log(data,'元素的各种信息')
+			topSize.value=(data.height*2+20)+'rpx'
+			isShow.value=true
+		}).exec()
+	}
+	const age=ref(21)
+	const sliderChange=async(e)=>{
+		console.log(e.detail.value,'技师年龄')
+		age.value=e.detail.value
+	}
+	const distanceNum=ref(3)
+	const changeDistanceTwo=async(e)=>{
+		console.log(e.detail.value,'技师距离')
+		distanceNum.value=e.detail.value
+	}
+	const newInfo=async(e)=>{
+		console.log(e,'pppppppppppppp')
+	}
+	const prevent=async()=>{
+		console.log('阻止事件冒泡')
+	}
+	const close=async(e)=>{
+		console.log(e,'qqqqqq')
+		isShow.value=false
+	}
+	
+
+	//获取顶部安全距离
+	const app = uni.getSystemInfoSync()
+	const bottomHeightOne = (app.statusBarHeight) + 'rpx'
+	const bottomHeight = ref(bottomHeightOne)
+	
+	onLoad((options) => {
+
+	});
+</script>
+<style scoped>
+/deep/uni-slider .uni-slider-handle-wrapper{
+	height:18rpx !important;
+}
+.distance{
+	/deep/.uni-select__input-text{
+		width:130rpx;
+		color:#fff;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		font-size:24rpx;
+		text-align: right;
+	}
+}
+/deep/.uni-select__input-text{
+	width:180rpx;
+	color:#fff;
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	font-size:24rpx;
+	text-align: right;
+}
+/deep/.uni-searchbar__box{
+	height:100% !important;
+}
+/deep/.uni-select{
+	border: none !important;
+	padding-left: 0rpx;
+}
+</style>
+<style scoped lang="scss">
+.list-box{
+	width:95%;
+	margin-left:2.5%;
+	margin-top: 20rpx;
+	padding-bottom: 20rpx;
+	border-bottom: 3rpx dashed #AAAAAA;
+}
+.bt-box-two{
+	padding: 5rpx;
+	padding-left: 20rpx;
+	padding-right: 20rpx;
+	font-size: 20rpx;
+	color:#fff;
+	background-color: #009FE8;
+	border-radius: 5rpx;
+}
+.shop-box{
+	padding:3rpx;
+	padding-left: 15rpx;
+	padding-right: 15rpx;
+	// background-color: #E3007F;
+	color:#fff;
+	border-radius: 5rpx;
+	box-sizing: border-box;
+}
+.text-info-box{
+	width: 100%;
+	font-size: 23rpx;
+	color: #6F7379;
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	min-height: 60rpx;
+}
+.flag-box{
+	font-size: 16rpx !important;
+	color:#fff;
+	margin-right: 15rpx;
+	padding-top:2rpx;
+	padding-bottom:2rpx;
+	text-align: center;
+	box-sizing: border-box;
+	border-radius: 5rpx;
+	margin-top:5rpx;
+	padding-left:15rpx;
+	padding-right:15rpx;
+}
+.job-box{
+	font-size: 22rpx;
+	color: #fff;
+	background-color: #898F96;
+	padding:3rpx;
+	padding-left: 5rpx;
+	padding-right: 5rpx;
+	-moz-box-sizing: border-box;
+}
+.bt-box{
+	width:100rpx;
+	height:30rpx;
+	line-height:30rpx;
+	text-align:center;
+	color:#fff;
+	background-color: #009FE8;
+	font-size: 20rpx;
+	padding:3rpx;
+	border-radius: 5rpx;
+	margin-top:10rpx;
+	margin-left:40rpx;
+}
+.button-info-box{
+	width:41%;
+	margin-left:6%;
+	height: 70rpx;
+	line-height: 70rpx;
+	text-align: center;
+	font-size:40rpx;
+	margin-top:25rpx;
+	border-radius: 10rpx;
+}
+.content-text{
+	width: 30%;
+	height: 60rpx;
+	line-height: 60rpx;
+	text-align: center;
+	font-size: 28rpx;
+	color:#707374;
+	background-color: #EFEEF1;
+	margin-top:15rpx;
+	border-radius: 10rpx;
+	margin-left: 2.5%;
+}
+.content-info-box{
+	width: 95%;
+	margin-left:2.5%;
+	display: flex;
+	flex-wrap: wrap;
+	justify-content: flex-start;
+	align-items: center;
+}
+.search-title{
+	width: 90%;
+	height: 50rpx;
+	margin-left:5%;
+	margin-top: 20rpx;
+	font-size: 30rpx;
+	color: #333;
+	font-weight: 650;
+	text-align: left;
+}
+.popup-box{
+	position: absolute;
+	left:0;
+	bottom:0;
+	right:0;
+	z-index: 999;
+	background-color: rgba(0, 0, 0, .2);
+}
+.icon-image{
+	width:100%;
+	height:100%;
+}
+// 上中下布局样式
+.body {
+	display: flex;
+	flex-direction: column;
+	height: calc(100vh - 50px);
+	background: linear-gradient(to bottom, #08A3E9, #fff);
+	box-sizing: border-box;
+}
+// 中部滚动
+.list-wrap {
+	flex-grow: 1;
+	position: relative;
+	background-color: #fff;
+	border-radius: 10rpx;
+	width: 95%;
+	margin-left: 2.5%;
+	box-sizing: border-box;
+}
+.list {
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	padding:10rpx;
+	box-sizing: border-box;
+}
+.list-scroll-view {
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+	justify-content: space-between;
+	margin-left: 2vw;
+	margin-right: 2vw;
+}
+.course-card {
+	width: 47vw;
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+</style>

+ 22 - 44
pages/activity/groupon/detail.vue

@@ -181,11 +181,11 @@
         </view>
         </view>
       </view>
       </view>
 
 
-      <view v-if="!isEmpty(state.goodsInfo)">
-        <!-- 规格与数量弹框 -->
+      <!-- TODO 芋艿:这里暂时没接入 -->
+      <view v-if="state.data.goods">
         <s-select-groupon-sku
         <s-select-groupon-sku
           :show="state.showSelectSku"
           :show="state.showSelectSku"
-          :goodsInfo="state.goodsInfo"
+          :goodsInfo="state.data.goods"
           :grouponAction="state.grouponAction"
           :grouponAction="state.grouponAction"
           :grouponNum="state.grouponNum"
           :grouponNum="state.grouponNum"
           @buy="onBuy"
           @buy="onBuy"
@@ -193,7 +193,6 @@
           @close="state.showSelectSku = false"
           @close="state.showSelectSku = false"
         />
         />
       </view>
       </view>
-
     </view>
     </view>
 
 
     <s-empty v-if="!state.data && !state.loading" icon="/static/goods-empty.png" />
     <s-empty v-if="!state.data && !state.loading" icon="/static/goods-empty.png" />
@@ -204,28 +203,25 @@
   import { computed, reactive } from 'vue';
   import { computed, reactive } from 'vue';
   import sheep from '@/sheep';
   import sheep from '@/sheep';
   import { onLoad } from '@dcloudio/uni-app';
   import { onLoad } from '@dcloudio/uni-app';
-  import { fen2yuan, useDurationTime } from '@/sheep/hooks/useGoods';
+  import { useDurationTime } from '@/sheep/hooks/useGoods';
   import { showShareModal } from '@/sheep/hooks/useModal';
   import { showShareModal } from '@/sheep/hooks/useModal';
   import { isEmpty } from 'lodash-es';
   import { isEmpty } from 'lodash-es';
   import CombinationApi from '@/sheep/api/promotion/combination';
   import CombinationApi from '@/sheep/api/promotion/combination';
-  import SpuApi from '@/sheep/api/product/spu';
 
 
   const headerBg = sheep.$url.css('/static/img/shop/user/withdraw_bg.png');
   const headerBg = sheep.$url.css('/static/img/shop/user/withdraw_bg.png');
   const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
   const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
   const state = reactive({
   const state = reactive({
     data: {}, // 拼团详情
     data: {}, // 拼团详情
-    goodsId: 0, // 商品ID
-    goodsInfo: {}, // 商品信息
-    showSelectSku: false, // 显示规格弹框
-    selectedSkuPrice: {}, // 选中的规格价格
-    activity: {}, // 团购活动
-    grouponId: 0, // 团购ID
-    grouponNum: 0, // 团购人数
-    grouponAction: 'create', // 团购操作
-    combinationHeadId: null, // 拼团团长编号
     loading: true,
     loading: true,
+    grouponAction: 'create',
+    showSelectSku: false,
+    grouponNum: 0,
+    number: 0,
+    activity: {},
+    combinationHeadId: null, // 拼团团长编号
   });
   });
 
 
+  // todo 芋艿:分享要再接下
   const shareInfo = computed(() => {
   const shareInfo = computed(() => {
     if (isEmpty(state.data)) return {};
     if (isEmpty(state.data)) return {};
     return sheep.$platform.share.getShareInfo(
     return sheep.$platform.share.getShareInfo(
@@ -235,14 +231,15 @@
         desc: state.data.goods?.subtitle,
         desc: state.data.goods?.subtitle,
         params: {
         params: {
           page: '5',
           page: '5',
-          query: state.data.headRecord.id,
+          query: state.data.id,
         },
         },
       },
       },
       {
       {
         type: 'groupon', // 邀请拼团海报
         type: 'groupon', // 邀请拼团海报
         title: state.data.headRecord.spuName, // 商品标题
         title: state.data.headRecord.spuName, // 商品标题
         image: sheep.$url.cdn(state.data.headRecord.picUrl), // 商品主图
         image: sheep.$url.cdn(state.data.headRecord.picUrl), // 商品主图
-        price: fen2yuan(state.data.headRecord.combinationPrice), // 商品价格
+        price: state.data.goods?.price, // 商品价格
+        original_price: state.data.goods?.original_price, // 商品原价
       },
       },
     );
     );
   });
   });
@@ -254,33 +251,33 @@
     });
     });
   }
   }
 
 
-  // 去开团
+  // 去开团 TODO 芋艿:这里没接入
   function onCreateGroupon() {
   function onCreateGroupon() {
     state.grouponAction = 'create';
     state.grouponAction = 'create';
     state.grouponId = 0;
     state.grouponId = 0;
     state.showSelectSku = true;
     state.showSelectSku = true;
   }
   }
 
 
-  // 规格变更
+  // 规格变更 TODO 芋艿:这里没接入
   function onSkuChange(e) {
   function onSkuChange(e) {
     state.selectedSkuPrice = e;
     state.selectedSkuPrice = e;
   }
   }
 
 
-  // 立即参团
+  // 立即参团 TODO 芋艿:这里没接入
   function onJoinGroupon() {
   function onJoinGroupon() {
     state.grouponAction = 'join';
     state.grouponAction = 'join';
-    state.grouponId = state.data.headRecord.activityId;
-    state.combinationHeadId = state.data.headRecord.id;
-    state.grouponNum = state.data.headRecord.userSize;
+    state.grouponId = state.data.activityId;
+    state.combinationHeadId = state.data.id;
+    state.grouponNum = state.data.num;
     state.showSelectSku = true;
     state.showSelectSku = true;
   }
   }
 
 
-  // 立即购买
+  // 立即购买 TODO 芋艿:这里没接入
   function onBuy(sku) {
   function onBuy(sku) {
     sheep.$router.go('/pages/order/confirm', {
     sheep.$router.go('/pages/order/confirm', {
       data: JSON.stringify({
       data: JSON.stringify({
         order_type: 'goods',
         order_type: 'goods',
-        combinationActivityId: state.activity.id,
+        combinationActivityId: state.data.activity.id,
         combinationHeadId: state.combinationHeadId,
         combinationHeadId: state.combinationHeadId,
         items: [
         items: [
           {
           {
@@ -309,25 +306,6 @@
         data.headRecord.activityId,
         data.headRecord.activityId,
       );
       );
       state.activity = activity;
       state.activity = activity;
-      state.grouponNum = activity.userSize;
-      // 加载商品信息
-      const { data: spu } = await SpuApi.getSpuDetail(activity.spuId);
-      state.goodsId = spu.id;
-      // 默认显示最低价
-      activity.products.forEach((product) => {
-        spu.price = Math.min(spu.price, product.combinationPrice); // 设置 SPU 的最低价格
-      });
-      state.goodsInfo = spu;
-      // 价格、库存使用活动的
-      spu.skus.forEach((sku) => {
-        const product = activity.products.find((product) => product.skuId === sku.id);
-        if (product) {
-          sku.price = product.combinationPrice;
-        } else {
-          // 找不到可能是没配置,则不能发起秒杀
-          sku.stock = 0;
-        }
-      });
     } else {
     } else {
       state.data = null;
       state.data = null;
     }
     }

+ 3 - 3
pages/app/sign.vue

@@ -1,4 +1,4 @@
-<!-- 签到界面  -->
+  <!-- 签到界面  -->
 <template>
 <template>
   <s-layout title="签到有礼">
   <s-layout title="签到有礼">
     <s-empty v-if="state.loading" icon="/static/data-empty.png" text="签到活动还未开始" />
     <s-empty v-if="state.loading" icon="/static/data-empty.png" text="签到活动还未开始" />
@@ -62,7 +62,7 @@
         </view>
         </view>
       </view>
       </view>
 
 
-      <!-- 签到说明 TODO @芋艿:【签到】这里改成【已累计签到】;改版,接入 sheepjs  -->
+      <!-- 签到说明 TODO @科举:这里改成【已累计签到】 -->
       <view class="bg-white ss-m-t-16 ss-p-t-30 ss-p-b-60 ss-p-x-40">
       <view class="bg-white ss-m-t-16 ss-p-t-30 ss-p-b-60 ss-p-x-40">
         <view class="activity-title ss-m-b-30">签到说明</view>
         <view class="activity-title ss-m-b-30">签到说明</view>
         <view class="activity-des">1、已累计签到{{state.signInfo.totalDay}}天</view>
         <view class="activity-des">1、已累计签到{{state.signInfo.totalDay}}天</view>
@@ -110,7 +110,7 @@
     signInfo: {}, // 签到信息
     signInfo: {}, // 签到信息
 
 
     signConfigList: [], // 签到配置列表
     signConfigList: [], // 签到配置列表
-    maxDay: 0, // 最大的签到天数
+    maxDay: 0, // 最大的签到天数 
 
 
     showModel: false, // 签到弹框
     showModel: false, // 签到弹框
     signResult: {}, // 签到结果
     signResult: {}, // 签到结果

+ 30 - 35
pages/chat/components/messageListItem.vue

@@ -4,20 +4,12 @@
     <view class="message-item ss-flex-col scroll-item">
     <view class="message-item ss-flex-col scroll-item">
       <view class="ss-flex ss-row-center ss-col-center">
       <view class="ss-flex ss-row-center ss-col-center">
         <!-- 日期 -->
         <!-- 日期 -->
-        <view
-          v-if="
-            message.contentType !== KeFuMessageContentTypeEnum.SYSTEM &&
-            showTime(message, messageIndex)
-          "
-          class="date-message"
-        >
+        <view v-if="message.contentType !== KeFuMessageContentTypeEnum.SYSTEM && showTime(message, messageIndex)"
+              class="date-message">
           {{ formatDate(message.createTime) }}
           {{ formatDate(message.createTime) }}
         </view>
         </view>
         <!-- 系统消息 -->
         <!-- 系统消息 -->
-        <view
-          v-if="message.contentType === KeFuMessageContentTypeEnum.SYSTEM"
-          class="system-message"
-        >
+        <view v-if="message.contentType === KeFuMessageContentTypeEnum.SYSTEM" class="system-message">
           {{ message.content }}
           {{ message.content }}
         </view>
         </view>
       </view>
       </view>
@@ -26,35 +18,32 @@
         v-if="message.contentType !== KeFuMessageContentTypeEnum.SYSTEM"
         v-if="message.contentType !== KeFuMessageContentTypeEnum.SYSTEM"
         class="ss-flex ss-col-top"
         class="ss-flex ss-col-top"
         :class="[
         :class="[
-          message.senderType === UserTypeEnum.ADMIN
-            ? `ss-row-left`
-            : message.senderType === UserTypeEnum.MEMBER
-            ? `ss-row-right`
-            : '',
-        ]"
+              message.senderType === UserTypeEnum.ADMIN
+                ? `ss-row-left`
+                : message.senderType === UserTypeEnum.MEMBER
+                ? `ss-row-right`
+                : '',
+            ]"
       >
       >
         <!-- 客服头像 -->
         <!-- 客服头像 -->
         <image
         <image
           v-show="message.senderType === UserTypeEnum.ADMIN"
           v-show="message.senderType === UserTypeEnum.ADMIN"
           class="chat-avatar ss-m-r-24"
           class="chat-avatar ss-m-r-24"
           :src="
           :src="
-            sheep.$url.cdn(message.senderAvatar) ||
-            sheep.$url.static('/static/img/shop/chat/default.png')
-          "
+                sheep.$url.cdn(message.senderAvatar) ||
+                sheep.$url.static('/static/img/shop/chat/default.png')
+              "
           mode="aspectFill"
           mode="aspectFill"
         ></image>
         ></image>
         <!-- 内容 -->
         <!-- 内容 -->
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.TEXT">
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.TEXT">
-          <view class="message-box" :class="{ admin: message.senderType === UserTypeEnum.ADMIN }">
+          <view class="message-box" :class="{'admin': message.senderType === UserTypeEnum.ADMIN}">
             <mp-html :content="replaceEmoji(message.content)" />
             <mp-html :content="replaceEmoji(message.content)" />
           </view>
           </view>
         </template>
         </template>
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.IMAGE">
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.IMAGE">
-          <view
-            class="message-box"
-            :class="{ admin: message.senderType === UserTypeEnum.ADMIN }"
-            :style="{ width: '200rpx' }"
-          >
+          <view class="message-box" :class="{'admin': message.senderType === UserTypeEnum.ADMIN}"
+                :style="{ width: '200rpx' }">
             <su-image
             <su-image
               class="message-img"
               class="message-img"
               isPreview
               isPreview
@@ -70,23 +59,29 @@
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.PRODUCT">
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.PRODUCT">
           <GoodsItem
           <GoodsItem
             :goodsData="getMessageContent(message)"
             :goodsData="getMessageContent(message)"
-            @tap="sheep.$router.go('/pages/goods/index', { id: getMessageContent(message).spuId })"
+            @tap="
+                    sheep.$router.go('/pages/goods/index', {
+                      id: getMessageContent(message).id,
+                    })
+                  "
           />
           />
         </template>
         </template>
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.ORDER">
         <template v-if="message.contentType === KeFuMessageContentTypeEnum.ORDER">
           <OrderItem
           <OrderItem
             :orderData="getMessageContent(message)"
             :orderData="getMessageContent(message)"
-            @tap="sheep.$router.go('/pages/order/detail', { id: getMessageContent(message).id })"
+            @tap="
+                  sheep.$router.go('/pages/order/detail', {
+                    id: getMessageContent(message).id,
+                  })
+                "
           />
           />
         </template>
         </template>
         <!-- user头像 -->
         <!-- user头像 -->
         <image
         <image
           v-if="message.senderType === UserTypeEnum.MEMBER"
           v-if="message.senderType === UserTypeEnum.MEMBER"
           class="chat-avatar ss-m-l-24"
           class="chat-avatar ss-m-l-24"
-          :src="
-            sheep.$url.cdn(message.senderAvatar) ||
-            sheep.$url.static('/static/img/shop/chat/default.png')
-          "
+          :src="sheep.$url.cdn(message.senderAvatar) ||
+                sheep.$url.static('/static/img/shop/chat/default.png')"
           mode="aspectFill"
           mode="aspectFill"
         >
         >
         </image>
         </image>
@@ -109,7 +104,7 @@
     // 消息
     // 消息
     message: {
     message: {
       type: Object,
       type: Object,
-      default: () => ({}),
+      default: ()=>({}),
     },
     },
     // 消息索引
     // 消息索引
     messageIndex: {
     messageIndex: {
@@ -117,10 +112,10 @@
       default: 0,
       default: 0,
     },
     },
     // 消息列表
     // 消息列表
-    messageList: {
+    messageList:{
       type: Array,
       type: Array,
       default: () => [],
       default: () => [],
-    },
+    }
   });
   });
   const getMessageContent = computed(() => (item) => JSON.parse(item.content)); // 解析消息内容
   const getMessageContent = computed(() => (item) => JSON.parse(item.content)); // 解析消息内容
 
 

+ 1 - 1
pages/commission/goods.vue

@@ -76,7 +76,7 @@
     shareInfo: {},
     shareInfo: {},
   });
   });
 
 
-  // TODO @puhui999:【分享】接入
+  // TODO 芋艿:分享的接入
   function onShareGoods(goodsInfo) {
   function onShareGoods(goodsInfo) {
     state.shareInfo = $share.getShareInfo(
     state.shareInfo = $share.getShareInfo(
       {
       {

+ 1 - 1
pages/coupon/detail.vue

@@ -57,7 +57,7 @@
               <view>优惠券类型</view>
               <view>优惠券类型</view>
               <view>{{ state.coupon.discountType === 1 ? '满减券' : '折扣券' }}</view>
               <view>{{ state.coupon.discountType === 1 ? '满减券' : '折扣券' }}</view>
             </view>
             </view>
-            <!-- TODO 芋艿:【优惠劵】可优化,增加优惠劵的描述 -->
+            <!-- TODO 芋艿:可优化,增加优惠劵的描述 -->
             <uni-collapse>
             <uni-collapse>
               <uni-collapse-item title="优惠券说明" v-if="state.coupon.description">
               <uni-collapse-item title="优惠券说明" v-if="state.coupon.description">
                 <view class="content ss-p-b-20">
                 <view class="content ss-p-b-20">

+ 1 - 0
pages/coupon/list.vue

@@ -107,6 +107,7 @@
     },
     },
   ];
   ];
 
 
+  // TODO yunai:
   function onTabsChange(e) {
   function onTabsChange(e) {
     state.currentTab = e.index;
     state.currentTab = e.index;
     state.type = e.value;
     state.type = e.value;

+ 2 - 2
pages/goods/comment/add.vue

@@ -30,7 +30,7 @@
 							<uni-easyinput :inputBorder="false" type="textarea" maxlength="120" autoHeight
 							<uni-easyinput :inputBorder="false" type="textarea" maxlength="120" autoHeight
 								v-model="state.commentList[index].content"
 								v-model="state.commentList[index].content"
 								placeholder="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧~" />
 								placeholder="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧~" />
-              <!-- TODO 卢越:【评论】文件上传 -->
+              <!-- TODO 芋艿:文件上传 -->
 							<view class="img-box">
 							<view class="img-box">
 								<s-uploader v-model:url="state.commentList[index].images" fileMediatype="image"
 								<s-uploader v-model:url="state.commentList[index].images" fileMediatype="image"
 									limit="9" mode="grid" :imageStyles="{ width: '168rpx', height: '168rpx' }" />
 									limit="9" mode="grid" :imageStyles="{ width: '168rpx', height: '168rpx' }" />
@@ -40,7 +40,7 @@
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
-    <!-- TODO 卢越:【评论】是否匿名 -->
+    <!-- TODO 芋艿:是否匿名 -->
 
 
 		<su-fixed bottom placeholder>
 		<su-fixed bottom placeholder>
 			<view class="foot_box ss-flex ss-row-center ss-col-center">
 			<view class="foot_box ss-flex ss-row-center ss-col-center">

+ 3 - 0
pages/goods/components/detail/detail-activity-tip.vue

@@ -2,6 +2,7 @@
   <su-fixed bottom placeholder :val="44">
   <su-fixed bottom placeholder :val="44">
     <view>
     <view>
       <view v-for="activity in props.activityList" :key="activity.id">
       <view v-for="activity in props.activityList" :key="activity.id">
+        <!-- TODO 芋艿:拼团 -->
         <view
         <view
           class="activity-box ss-p-x-38 ss-flex ss-row-between ss-col-center"
           class="activity-box ss-p-x-38 ss-flex ss-row-between ss-col-center"
           :class="activity.type === 1 ? 'seckill-box' : 'groupon-box'"
           :class="activity.type === 1 ? 'seckill-box' : 'groupon-box'"
@@ -13,6 +14,7 @@
                 :src="sheep.$url.static('/static/img/shop/goods/seckill-icon.png')"
                 :src="sheep.$url.static('/static/img/shop/goods/seckill-icon.png')"
                 class="activity-icon"
                 class="activity-icon"
               />
               />
+              <!-- TODO 芋艿:拼团 -->
               <image
               <image
                 v-else-if="activity.type === 3"
                 v-else-if="activity.type === 3"
                 :src="sheep.$url.static('/static/img/shop/goods/groupon-icon.png')"
                 :src="sheep.$url.static('/static/img/shop/goods/groupon-icon.png')"
@@ -31,6 +33,7 @@
 <script setup>
 <script setup>
   import sheep from '@/sheep';
   import sheep from '@/sheep';
 
 
+  // TODO 芋艿:这里要迁移下;
   const seckillBg = sheep.$url.css('/static/img/shop/goods/seckill-tip-bg.png');
   const seckillBg = sheep.$url.css('/static/img/shop/goods/seckill-tip-bg.png');
   const grouponBg = sheep.$url.css('/static/img/shop/goods/groupon-tip-bg.png');
   const grouponBg = sheep.$url.css('/static/img/shop/goods/groupon-tip-bg.png');
 
 

+ 5 - 18
pages/goods/groupon.vue

@@ -80,7 +80,7 @@
         <!-- 功能卡片 -->
         <!-- 功能卡片 -->
         <view class="detail-cell-card detail-card ss-flex-col">
         <view class="detail-cell-card detail-card ss-flex-col">
           <!-- 规格 -->
           <!-- 规格 -->
-          <detail-cell-sku :sku="state.selectedSku" @tap="state.showSelectSku = true" />
+          <detail-cell-sku :sku="state.selectedSkuPrice" @tap="state.showSelectSku = true" />
         </view>
         </view>
 
 
         <!-- 参团列表 -->
         <!-- 参团列表 -->
@@ -90,7 +90,6 @@
         <s-select-groupon-sku
         <s-select-groupon-sku
           :show="state.showSelectSku"
           :show="state.showSelectSku"
           :goodsInfo="state.goodsInfo"
           :goodsInfo="state.goodsInfo"
-		  :selectedSku="state.selectedSku"
           :grouponAction="state.grouponAction"
           :grouponAction="state.grouponAction"
           :grouponNum="state.grouponNum"
           :grouponNum="state.grouponNum"
           @buy="onBuy"
           @buy="onBuy"
@@ -126,7 +125,7 @@
             :disabled="state.goodsInfo.stock === 0 || state.activity.status !== 0"
             :disabled="state.goodsInfo.stock === 0 || state.activity.status !== 0"
           >
           >
             <view class="btn-price">{{
             <view class="btn-price">{{
-              fen2yuan(state.selectedSku.price * state.selectedSku.count || state.activity.price * state.selectedSku.count || state.goodsInfo.price * state.selectedSku.count || state.goodsInfo.price)
+              fen2yuan(state.activity.price || state.goodsInfo.price)
             }}</view>
             }}</view>
             <view v-if="state.activity.startTime > new Date().getTime()">未开始</view>
             <view v-if="state.activity.startTime > new Date().getTime()">未开始</view>
             <view v-else-if="state.activity.endTime <= new Date().getTime()">已结束</view>
             <view v-else-if="state.activity.endTime <= new Date().getTime()">已结束</view>
@@ -169,7 +168,7 @@
     goodsInfo: {}, // 商品信息
     goodsInfo: {}, // 商品信息
     goodsSwiper: [], // 商品轮播图
     goodsSwiper: [], // 商品轮播图
     showSelectSku: false, // 显示规格弹框
     showSelectSku: false, // 显示规格弹框
-    selectedSku: {}, // 选中的规格属性
+    selectedSkuPrice: {}, // 选中的规格价格
     activity: {}, // 团购活动
     activity: {}, // 团购活动
     grouponId: 0, // 团购ID
     grouponId: 0, // 团购ID
     grouponNum: 0, // 团购人数
     grouponNum: 0, // 团购人数
@@ -184,7 +183,7 @@
 
 
   // 规格变更
   // 规格变更
   function onSkuChange(e) {
   function onSkuChange(e) {
-    state.selectedSku = e;
+    state.selectedSkuPrice = e;
   }
   }
 
 
   function onSkuClose() {
   function onSkuClose() {
@@ -200,7 +199,6 @@
 
 
   /**
   /**
    * 去参团
    * 去参团
-   *
    * @param record 团长的团购记录
    * @param record 团长的团购记录
    */
    */
   function onJoinGroupon(record) {
   function onJoinGroupon(record) {
@@ -229,6 +227,7 @@
   }
   }
 
 
   // 分享信息
   // 分享信息
+  // TODO @芋艿:分享的接入
   const shareInfo = computed(() => {
   const shareInfo = computed(() => {
     if (isEmpty(state.activity)) return {};
     if (isEmpty(state.activity)) return {};
     return sheep.$platform.share.getShareInfo(
     return sheep.$platform.share.getShareInfo(
@@ -263,21 +262,9 @@
     // 加载商品信息
     // 加载商品信息
     const { data: spu } = await SpuApi.getSpuDetail(activity.spuId);
     const { data: spu } = await SpuApi.getSpuDetail(activity.spuId);
     state.goodsId = spu.id;
     state.goodsId = spu.id;
-    // 默认显示最低价
     activity.products.forEach((product) => {
     activity.products.forEach((product) => {
       spu.price = Math.min(spu.price, product.combinationPrice); // 设置 SPU 的最低价格
       spu.price = Math.min(spu.price, product.combinationPrice); // 设置 SPU 的最低价格
     });
     });
-    // 价格、库存使用活动的
-    spu.skus.forEach((sku) => {
-      const product = activity.products.find((product) => product.skuId === sku.id);
-      if (product) {
-        sku.price = product.combinationPrice;
-      } else {
-        // 找不到可能是没配置,则不能发起秒杀
-        sku.stock = 0;
-      }
-    });
-
     // 关闭骨架屏
     // 关闭骨架屏
     state.skeletonLoading = false;
     state.skeletonLoading = false;
     if (code === 0) {
     if (code === 0) {

+ 3 - 2
pages/goods/index.vue

@@ -157,7 +157,7 @@
         items: [{
         items: [{
           skuId: e.id,
           skuId: e.id,
           count: e.goods_num,
           count: e.goods_num,
-		      categoryId: state.goodsInfo.categoryId
+		  categoryId: state.goodsInfo.categoryId
         }]
         }]
       }),
       }),
     });
     });
@@ -182,6 +182,7 @@
     }, 1000);
     }, 1000);
 	}
 	}
 
 
+	//  TODO 芋艿:待测试
 	const shareInfo = computed(() => {
 	const shareInfo = computed(() => {
 		if (isEmpty(state.goodsInfo)) return {};
 		if (isEmpty(state.goodsInfo)) return {};
 		return sheep.$platform.share.getShareInfo({
 		return sheep.$platform.share.getShareInfo({
@@ -250,7 +251,7 @@
           state.activityList.push(activity);
           state.activityList.push(activity);
         } else if (activity.type === 5) { // 情况二:满减送
         } else if (activity.type === 5) { // 情况二:满减送
           state.activityInfo.push(activity);
           state.activityInfo.push(activity);
-        } else { // 情况三:限时折扣 TODO puhui999:【折扣】
+        } else { // 情况三:限时折扣 TODO 芋艿
           console.log('待实现!优先级不高');
           console.log('待实现!优先级不高');
         }
         }
       })
       })

+ 5 - 6
pages/goods/seckill.vue

@@ -63,7 +63,7 @@
             <detail-progress :percent="state.percent" />
             <detail-progress :percent="state.percent" />
           </view>
           </view>
 
 
-          <view class="title-text ss-line-2 ss-m-b-6">{{ state.goodsInfo.name || '' }}</view>
+          <view class="title-text ss-line-2 ss-m-b-6">{{ state.goodsInfo?.name }}</view>
           <view class="subtitle-text ss-line-1">{{ state.goodsInfo.introduction }}</view>
           <view class="subtitle-text ss-line-1">{{ state.goodsInfo.introduction }}</view>
         </view>
         </view>
 
 
@@ -135,7 +135,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-  import { reactive, computed, ref, unref } from 'vue';
+  import { reactive, computed, ref } from 'vue';
   import { onLoad, onPageScroll } from '@dcloudio/uni-app';
   import { onLoad, onPageScroll } from '@dcloudio/uni-app';
   import sheep from '@/sheep';
   import sheep from '@/sheep';
   import { isEmpty, min } from 'lodash-es';
   import { isEmpty, min } from 'lodash-es';
@@ -196,9 +196,9 @@
     });
     });
   }
   }
 
 
-  // 分享信息
+  // 分享信息 TODO 芋艿:待接入
   const shareInfo = computed(() => {
   const shareInfo = computed(() => {
-    if (isEmpty(unref(activity))) return {};
+    if (isEmpty(activity)) return {};
     return sheep.$platform.share.getShareInfo(
     return sheep.$platform.share.getShareInfo(
       {
       {
         title: activity.value.name,
         title: activity.value.name,
@@ -220,7 +220,6 @@
 
 
   const activity = ref();
   const activity = ref();
   const timeStatusEnum = ref('');
   const timeStatusEnum = ref('');
-
   // 查询活动
   // 查询活动
   const getActivity = async (id) => {
   const getActivity = async (id) => {
     const { data } = await SeckillApi.getSeckillActivity(id);
     const { data } = await SeckillApi.getSeckillActivity(id);
@@ -231,9 +230,9 @@
     await getSpu(data.spuId);
     await getSpu(data.spuId);
   };
   };
 
 
-  // 查询商品
   const getSpu = async (id) => {
   const getSpu = async (id) => {
     const { data } = await SpuApi.getSpuDetail(id);
     const { data } = await SpuApi.getSpuDetail(id);
+    // 模拟
     data.activity_type = 'seckill';
     data.activity_type = 'seckill';
     state.goodsInfo = data;
     state.goodsInfo = data;
     // 处理轮播图
     // 处理轮播图

+ 5 - 6
pages/index/category.vue

@@ -131,13 +131,12 @@
     getGoodsList();
     getGoodsList();
   }
   }
 
 
-  onLoad(async (params) => {
+  onLoad(async () => {
     await getList();
     await getList();
-
-    // 首页点击分类的处理:查找满足条件的分类
-    const foundCategory = state.categoryList.find(category => category.id === params.id);
-    // 如果找到则调用 onMenu 自动勾选相应分类,否则调用 onMenu(0) 勾选第一个分类
-    onMenu(foundCategory ? state.categoryList.indexOf(foundCategory) : 0);
+    // 如果是 first 风格,需要加载商品分页
+    if (state.style === 'first_one' || state.style === 'first_two') {
+      onMenu(0);
+    }
   });
   });
 
 
   onReachBottom(() => {
   onReachBottom(() => {

+ 1 - 1
pages/order/addressSelection.vue

@@ -86,7 +86,7 @@
   // 选择地址
   // 选择地址
   function onSelectAddress() {
   function onSelectAddress() {
     let emitName = 'SELECT_ADDRESS'
     let emitName = 'SELECT_ADDRESS'
-    let addressPage = '/pages/user/address/list?type=select';
+    let addressPage = '/pages/user/address/list'
     if (state.value.deliveryType === 2){
     if (state.value.deliveryType === 2){
       emitName = 'SELECT_PICK_UP_INFO'
       emitName = 'SELECT_PICK_UP_INFO'
       addressPage = '/pages/user/goods_details_store/index'
       addressPage = '/pages/user/goods_details_store/index'

+ 5 - 13
pages/order/confirm.vue

@@ -122,7 +122,7 @@
         >
         >
           <view class="item-title">活动优惠</view>
           <view class="item-title">活动优惠</view>
           <view class="ss-flex ss-col-center">
           <view class="ss-flex ss-col-center">
-            <!--                @tap="state.showDiscount = true" TODO puhui999:【折扣】后续要把优惠信息打进去 -->
+            <!--                @tap="state.showDiscount = true" TODO 芋艿:后续要把优惠信息打进去 -->
             <text class="item-value text-red">
             <text class="item-value text-red">
               -¥{{ fen2yuan(state.orderInfo.price.discountPrice) }}
               -¥{{ fen2yuan(state.orderInfo.price.discountPrice) }}
             </text>
             </text>
@@ -158,7 +158,7 @@
       @close="state.showCoupon = false"
       @close="state.showCoupon = false"
     />
     />
 
 
-    <!-- 满额折扣弹框 TODO @puhui999:【折扣】后续要把优惠信息打进去 -->
+    <!-- 满额折扣弹框 TODO 芋艿:后续要把优惠信息打进去 -->
     <s-discount-list
     <s-discount-list
       v-model="state.orderInfo"
       v-model="state.orderInfo"
       :show="state.showDiscount"
       :show="state.showDiscount"
@@ -185,7 +185,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-  import { reactive, ref, watch } from 'vue';
+  import { reactive, ref } from 'vue';
   import { onLoad } from '@dcloudio/uni-app';
   import { onLoad } from '@dcloudio/uni-app';
   import AddressSelection from '@/pages/order/addressSelection.vue';
   import AddressSelection from '@/pages/order/addressSelection.vue';
   import sheep from '@/sheep';
   import sheep from '@/sheep';
@@ -208,7 +208,7 @@
 
 
   const addressState = ref({
   const addressState = ref({
     addressInfo: {}, // 选择的收货地址
     addressInfo: {}, // 选择的收货地址
-    deliveryType: 1, // 收货方式:1-快递配送,2-门店自提
+    deliveryType: 1, // 收货方式 1 - 快递配送;2 - 门店自提
     isPickUp: true, // 门店自提是否开启 TODO puhui999: 默认开启,看看后端有开关的话接入
     isPickUp: true, // 门店自提是否开启 TODO puhui999: 默认开启,看看后端有开关的话接入
     pickUpInfo: {}, // 选择的自提门店信息
     pickUpInfo: {}, // 选择的自提门店信息
     receiverName: '', // 收件人名称
     receiverName: '', // 收件人名称
@@ -226,7 +226,7 @@
 
 
   // 选择优惠券
   // 选择优惠券
   async function onSelectCoupon(couponId) {
   async function onSelectCoupon(couponId) {
-    state.orderPayload.couponId = couponId;
+    state.orderPayload.couponId = couponId || 0;
     await getOrderInfo();
     await getOrderInfo();
     state.showCoupon = false;
     state.showCoupon = false;
   }
   }
@@ -336,14 +336,6 @@
     await getOrderInfo();
     await getOrderInfo();
     await getCoupons();
     await getCoupons();
   });
   });
-
-  // 使用 watch 监听地址和配送方式的变化
-  watch(addressState, async (newAddress, oldAddress) => {
-    // 如果收货地址或配送方式有变化,则重新计算价格
-    if (newAddress.addressInfo.id !== oldAddress.addressInfo.id || newAddress.deliveryType !== oldAddress.deliveryType) {
-      await getOrderInfo();
-    }
-  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>

+ 2 - 1
pages/order/detail.vue

@@ -170,6 +170,7 @@
         <text class="title">运费</text>
         <text class="title">运费</text>
         <text class="detail">¥{{ fen2yuan(state.orderInfo.deliveryPrice) }}</text>
         <text class="detail">¥{{ fen2yuan(state.orderInfo.deliveryPrice) }}</text>
       </view>
       </view>
+      <!-- TODO 芋艿:优惠劵抵扣、积分抵扣 -->
       <view class="notice-item ss-flex ss-row-between" v-if="state.orderInfo.couponPrice > 0">
       <view class="notice-item ss-flex ss-row-between" v-if="state.orderInfo.couponPrice > 0">
         <text class="title">优惠劵金额</text>
         <text class="title">优惠劵金额</text>
         <text class="detail">-¥{{ fen2yuan(state.orderInfo.couponPrice) }}</text>
         <text class="detail">-¥{{ fen2yuan(state.orderInfo.couponPrice) }}</text>
@@ -324,7 +325,7 @@
     });
     });
   }
   }
 
 
-  // 确认收货
+  // 确认收货 TODO 芋艿:待测试
   async function onConfirm(orderId, ignore = false) {
   async function onConfirm(orderId, ignore = false) {
     // 需开启确认收货组件
     // 需开启确认收货组件
     // todo: 芋艿:待接入微信
     // todo: 芋艿:待接入微信

+ 2 - 2
pages/order/express/log.vue

@@ -12,7 +12,7 @@
           </swiper>
           </swiper>
         </uni-swiper-dot>
         </uni-swiper-dot>
         <view class="log-card-msg">
         <view class="log-card-msg">
-          <!-- TODO 芋艿:【物流】优化点:展示状态 -->
+          <!-- TODO 芋艿:优化点:展示状态 -->
 <!--          <view class="ss-flex ss-m-b-8">-->
 <!--          <view class="ss-flex ss-m-b-8">-->
 <!--            <view>物流状态:</view>-->
 <!--            <view>物流状态:</view>-->
 <!--            <view class="warning-color">{{ state.info.status_text }}</view>-->
 <!--            <view class="warning-color">{{ state.info.status_text }}</view>-->
@@ -34,7 +34,7 @@
             <view v-if="state.tracks.length - 1 !== index" class="line" />
             <view v-if="state.tracks.length - 1 !== index" class="line" />
           </view>
           </view>
           <view class="log-content-msg">
           <view class="log-content-msg">
-            <!-- TODO 芋艿:【物流】优化点:展示状态 -->
+            <!-- TODO 芋艿:优化点:展示状态 -->
 <!--            <view class="log-msg-title ss-m-b-20">-->
 <!--            <view class="log-msg-title ss-m-b-20">-->
 <!--              {{ item.status_text }}-->
 <!--              {{ item.status_text }}-->
 <!--            </view>-->
 <!--            </view>-->

+ 1 - 0
pages/pay/result.vue

@@ -39,6 +39,7 @@
         <button class="check-btn ss-reset-button" v-if="payResult === 'success'" @tap="onOrder">
         <button class="check-btn ss-reset-button" v-if="payResult === 'success'" @tap="onOrder">
           查看订单
           查看订单
         </button>
         </button>
+        <!-- TODO 芋艿:拼团接入 -->
         <button
         <button
           class="check-btn ss-reset-button"
           class="check-btn ss-reset-button"
           v-if="payResult === 'success' && state.tradeOrder.type === 3"
           v-if="payResult === 'success' && state.tradeOrder.type === 3"

+ 1 - 1
pages/public/faq.vue

@@ -49,7 +49,7 @@
     }
     }
   }
   }
   onLoad(() => {
   onLoad(() => {
-    // TODO 芋艿:【文章】目前简单做,使用营销文章,作为 faq
+    // TODO 芋艿:目前简单做,使用营销文章,作为 faq
     if (true) {
     if (true) {
       sheep.$router.go('/pages/public/richtext', {
       sheep.$router.go('/pages/public/richtext', {
         title: '常见问题',
         title: '常见问题',

+ 3 - 12
pages/user/address/list.vue

@@ -39,8 +39,8 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-  import { onBeforeMount, reactive } from 'vue';
-  import { onShow, onLoad } from '@dcloudio/uni-app';
+  import { reactive, onBeforeMount } from 'vue';
+  import { onShow } from '@dcloudio/uni-app';
   import sheep from '@/sheep';
   import sheep from '@/sheep';
   import { isEmpty } from 'lodash-es';
   import { isEmpty } from 'lodash-es';
   import AreaApi from '@/sheep/api/system/area';
   import AreaApi from '@/sheep/api/system/area';
@@ -49,14 +49,10 @@
   const state = reactive({
   const state = reactive({
     list: [], // 地址列表
     list: [], // 地址列表
     loading: true,
     loading: true,
-    openType: '', // 页面打开类型
   });
   });
 
 
   // 选择收货地址
   // 选择收货地址
   const onSelect = (addressInfo) => {
   const onSelect = (addressInfo) => {
-    if (state.openType !== 'select'){ // 不作为选择组件时阻断操作
-      return
-    }
     uni.$emit('SELECT_ADDRESS', {
     uni.$emit('SELECT_ADDRESS', {
       addressInfo,
       addressInfo,
     });
     });
@@ -64,6 +60,7 @@
   };
   };
 
 
   // 导入微信地址
   // 导入微信地址
+  // TODO 芋艿:未测试
   function importWechatAddress() {
   function importWechatAddress() {
     let wechatAddress = {};
     let wechatAddress = {};
     // #ifdef MP
     // #ifdef MP
@@ -113,12 +110,6 @@
     // #endif
     // #endif
   }
   }
 
 
-  onLoad((option) => {
-    if (option.type) {
-      state.openType = option.type;
-    }
-  });
-
   onShow(async () => {
   onShow(async () => {
     state.list = (await AddressApi.getAddressList()).data;
     state.list = (await AddressApi.getAddressList()).data;
     state.loading = false;
     state.loading = false;

+ 1 - 1
pages/user/wallet/score.vue

@@ -36,7 +36,7 @@
           </button>
           </button>
         </uni-datetime-picker>
         </uni-datetime-picker>
 
 
-        <!-- TODO 芋艿:【钱包】可优化 -->
+        <!-- TODO 芋艿:优化 -->
         <!--				<view class="total-box">-->
         <!--				<view class="total-box">-->
         <!--					<view class="ss-m-b-10">总收入¥{{ state.pagination.income }}</view>-->
         <!--					<view class="ss-m-b-10">总收入¥{{ state.pagination.income }}</view>-->
         <!--					<view>总支出¥{{ -state.pagination.expense }}</view>-->
         <!--					<view>总支出¥{{ -state.pagination.expense }}</view>-->

+ 14 - 0
sheep/api/migration/chat.js

@@ -0,0 +1,14 @@
+import request from '@/sheep/request';
+
+// TODO 芋艿:暂不支持 socket 聊天
+export default {
+  // 获取聊天token
+  unifiedToken: () =>
+    request({
+      url: 'unifiedToken',
+      custom: {
+        showError: false,
+        showLoading: false,
+      },
+    }),
+};

+ 5 - 5
sheep/components/s-block-item/s-block-item.vue

@@ -9,7 +9,7 @@
     <!-- 基础组件:列表导航 -->
     <!-- 基础组件:列表导航 -->
     <s-menu-list v-if="type === 'MenuList'" :data="data" />
     <s-menu-list v-if="type === 'MenuList'" :data="data" />
     <!-- 基础组件:宫格导航 -->
     <!-- 基础组件:宫格导航 -->
-    <s-menu-grid v-if="type === 'MenuGrid'" :data="data" :styles="styles" />
+    <s-menu-grid v-if="type === 'MenuGrid'" :data="data" />
     <!-- 基础组件:弹窗广告 -->
     <!-- 基础组件:弹窗广告 -->
     <s-popup-image v-if="type === 'Popover'" :data="data" />
     <s-popup-image v-if="type === 'Popover'" :data="data" />
     <!-- 基础组件:悬浮按钮 -->
     <!-- 基础组件:悬浮按钮 -->
@@ -47,13 +47,13 @@
     <s-richtext-block v-if="type === 'PromotionArticle'" :data="data" :styles="styles" />
     <s-richtext-block v-if="type === 'PromotionArticle'" :data="data" :styles="styles" />
 
 
     <!-- 用户组件:用户卡片 -->
     <!-- 用户组件:用户卡片 -->
-    <s-user-card v-if="type === 'UserCard'" :data="data" :styles="styles" />
+    <s-user-card v-if="type === 'UserCard'" />
     <!-- 用户组件:用户订单 -->
     <!-- 用户组件:用户订单 -->
-    <s-order-card v-if="type === 'UserOrder'" :data="data" :styles="styles" />
+    <s-order-card v-if="type === 'UserOrder'" :data="data" />
     <!-- 用户组件:用户资产 -->
     <!-- 用户组件:用户资产 -->
-    <s-wallet-card v-if="type === 'UserWallet'" :data="data" :styles="styles" />
+    <s-wallet-card v-if="type === 'UserWallet'" />
     <!-- 用户组件:用户卡券 -->
     <!-- 用户组件:用户卡券 -->
-    <s-coupon-card v-if="type === 'UserCoupon'" :data="data" :styles="styles" />
+    <s-coupon-card v-if="type === 'UserCoupon'" />
   </view>
   </view>
 </template>
 </template>
 
 

+ 138 - 162
sheep/components/s-coupon-block/s-coupon-block.vue

@@ -1,176 +1,152 @@
 <!-- 装修营销组件:优惠券  -->
 <!-- 装修营销组件:优惠券  -->
 <template>
 <template>
-	<scroll-view class="scroll-box" scroll-x scroll-anchoring :style="[bgStyle, { marginLeft: `${data.space}px` }]">
-		<view class="coupon-box ss-flex" :style="couponList.length === 2 ? couponBoxStyleTwo : couponBoxStyleNormal">
-			<view class="coupon-item" :style="[couponBg, { marginLeft: `${data.space}px` }]"
-				v-for="(item, index) in couponList" :key="index">
-				<su-coupon :size="SIZE_LIST[columns - 1]" :textColor="data.textColor" background="" :couponId="item.id"
-					:title="item.name" :type="formatCouponDiscountType(item)" :value="formatCouponDiscountValue(item)"
-					:sellBy="formatValidityType(item)">
-					<template v-slot:btn>
-						<!-- 两列时,领取按钮坚排 -->
-						<button v-if="columns === 2" @click.stop="onGetCoupon(item.id)"
-							class="ss-reset-button card-btn vertical" :style="[btnStyles]">
-							<view class="btn-text">立即领取</view>
-						</button>
-						<button v-else class="ss-reset-button card-btn" :style="[btnStyles]"
-							@click.stop="onGetCoupon(item.id)">
-							立即领取
-						</button>
-					</template>
-				</su-coupon>
-			</view>
-		</view>
-	</scroll-view>
+  <scroll-view class="scroll-box" scroll-x scroll-anchoring>
+    <view class="coupon-box ss-flex">
+      <view
+        class="coupon-item"
+        :style="[couponBg, { marginLeft: `${data.space}px` }]"
+        v-for="(item, index) in couponList"
+        :key="index"
+      >
+        <su-coupon
+          :size="SIZE_LIST[columns - 1]"
+          :textColor="data.textColor"
+          background=""
+          :couponId="item.id"
+          :title="item.name"
+          :type="formatCouponDiscountType(item)"
+          :value="formatCouponDiscountValue(item)"
+          :sellBy="formatValidityType(item)"
+        >
+          <template v-slot:btn>
+            <!-- 两列时,领取按钮坚排 -->
+            <button
+              v-if="columns === 2"
+              @click.stop="onGetCoupon(item.id)"
+              class="ss-reset-button card-btn vertical"
+              :style="[btnStyles]"
+            >
+              <view class="btn-text">立即领取</view>
+            </button>
+            <button
+              v-else
+              class="ss-reset-button card-btn"
+              :style="[btnStyles]"
+              @click.stop="onGetCoupon(item.id)"
+            >
+              立即领取
+            </button>
+          </template>
+        </su-coupon>
+      </view>
+    </view>
+  </scroll-view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	import sheep from '@/sheep';
-	import CouponApi from '@/sheep/api/promotion/coupon';
-	import {
-		ref,
-		onMounted,
-		computed
-	} from 'vue';
-	import {
-		CouponTemplateValidityTypeEnum,
-		PromotionDiscountTypeEnum
-	} from "@/sheep/util/const";
-	import {
-		floatToFixed2,
-		formatDate
-	} from "@/sheep/util";
+  import sheep from '@/sheep';
+  import CouponApi from '@/sheep/api/promotion/coupon';
+  import { ref, onMounted } from 'vue';
+  import { CouponTemplateValidityTypeEnum, PromotionDiscountTypeEnum } from "@/sheep/util/const";
+  import { floatToFixed2, formatDate } from "@/sheep/util";
 
 
-	const props = defineProps({
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-	});
-	const {
-		columns,
-		button
-	} = props.data;
-	const SIZE_LIST = ['lg', 'md', 'xs']
-	const couponBg = {
-		background: `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`,
-	};
-	const btnStyles = {
-		background: button.bgColor,
-		color: button.color,
-	};
-	// 两列优惠券时的排版方式
-	const couponBoxStyleNormal = {
-		'display': 'flex',
-		'justify-content': 'space-between'
-	};
-	// 非两列优惠券时的排版方式
-	const couponBoxStyleTwo = {
-		'display': 'flex',
-		'justify-content': 'space-around'
-	};
-	// 设置背景样式
-	const bgStyle = computed(() => {
-		// 直接从 props.styles 解构
-		const {
-			bgType,
-			bgImg,
-			bgColor
-		} = props.styles;
+  const props = defineProps({
+    data: {
+      type: Object,
+      default: () => ({}),
+    },
+    styles: {
+      type: Object,
+      default: () => ({}),
+    },
+  });
+  const { columns, button } = props.data;
+  const SIZE_LIST = ['lg', 'md', 'xs']
+  const couponBg = {
+    background: `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`,
+  };
+  const btnStyles = {
+    background: button.bgColor,
+    color: button.color,
+  };
 
 
-		// 根据 bgType 返回相应的样式
-		return {
-			background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
-		};
-	});
-	// 格式化【折扣类型】
-	const formatCouponDiscountType = (coupon) => {
-		if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
-			return 'reduce'
-		}
-		if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
-			return 'percent'
-		}
-		return `未知【${coupon.discountType}】`
-	}
+  // 格式化【折扣类型】
+  const formatCouponDiscountType = (coupon) => {
+    if(coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
+      return 'reduce'
+    }
+    if(coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
+      return 'percent'
+    }
+    return `未知【${coupon.discountType}】`
+  }
 
 
-	// 格式化【折扣】
-	const formatCouponDiscountValue = (coupon) => {
-		if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
-			return floatToFixed2(coupon.discountPrice)
-		}
-		if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
-			return coupon.discountPercent
-		}
-		return `未知【${coupon.discountType}】`
-	}
+  // 格式化【折扣】
+  const formatCouponDiscountValue = (coupon) => {
+    if(coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
+      return floatToFixed2(coupon.discountPrice)
+    }
+    if(coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
+      return coupon.discountPercent
+    }
+    return `未知【${coupon.discountType}】`
+  }
 
 
-	// 格式化【有效期限】
-	const formatValidityType = (row) => {
-		if (row.validityType === CouponTemplateValidityTypeEnum.DATE.type) {
-			return `${formatDate(row.validStartTime)} 至 ${formatDate(row.validEndTime)}`
-		}
-		if (row.validityType === CouponTemplateValidityTypeEnum.TERM.type) {
-			return `领取后第 ${row.fixedStartTerm} - ${row.fixedEndTerm} 天内可用`
-		}
-		return '未知【' + row.validityType + '】'
-	}
+  // 格式化【有效期限】
+  const formatValidityType = (row) => {
+    if (row.validityType === CouponTemplateValidityTypeEnum.DATE.type) {
+      return `${formatDate(row.validStartTime)} 至 ${formatDate(row.validEndTime)}`
+    }
+    if (row.validityType === CouponTemplateValidityTypeEnum.TERM.type) {
+      return `领取后第 ${row.fixedStartTerm} - ${row.fixedEndTerm} 天内可用`
+    }
+    return '未知【' + row.validityType + '】'
+  }
 
 
-	const couponList = ref([]);
-	// 立即领取优惠券
-	async function onGetCoupon(id) {
-		const {
-			error,
-			msg
-		} = await CouponApi.takeCoupon(id);
-		if (error === 0) {
-			uni.showToast({
-				title: msg,
-				icon: 'none',
-			});
-			return
-		}
-		await getCouponTemplateList()
-	}
-	const getCouponTemplateList = async () => {
-		const {
-			data
-		} = await CouponApi.getCouponTemplateListByIds(props.data.couponIds.join(','));
-		couponList.value = data;
-	}
-	onMounted(() => {
-		getCouponTemplateList()
-	});
+  const couponList = ref([]);
+  // 立即领取优惠券
+  async function onGetCoupon(id) {
+    const { error, msg } = await CouponApi.takeCoupon(id);
+    if (error === 0) {
+      uni.showToast({
+        title: msg,
+        icon: 'none',
+      });
+      return
+    }
+    await getCouponTemplateList()
+  }
+  const getCouponTemplateList = async () => {
+    const { data } = await CouponApi.getCouponTemplateListByIds(props.data.couponIds.join(','));
+    couponList.value = data;
+  }
+  onMounted(() => {
+    getCouponTemplateList()
+  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.card-btn {
-		width: 140rpx;
-		height: 50rpx;
-		border-radius: 25rpx;
-		font-size: 24rpx;
-		line-height: 50rpx;
+  .card-btn {
+    width: 140rpx;
+    height: 50rpx;
+    border-radius: 25rpx;
+    font-size: 24rpx;
+    line-height: 50rpx;
+    &.vertical {
+      width: 50rpx;
+      height: 140rpx;
+      margin: auto 20rpx auto 0;
 
 
-		&.vertical {
-			width: 50rpx;
-			height: 140rpx;
-			margin: auto 20rpx auto 0;
-
-			.btn-text {
-				font-size: 24rpx;
-				text-align: center;
-				writing-mode: vertical-lr;
-			}
-		}
-	}
-
-	.coupon-item {
-		&:nth-of-type(1) {
-			margin-left: 0 !important;
-		}
-	}
-</style>
+      .btn-text {
+        font-size: 24rpx;
+        text-align: center;
+        writing-mode: vertical-lr;
+      }
+    }
+  }
+  .coupon-item {
+    &:nth-of-type(1) {
+      margin-left: 0 !important;
+    }
+  }
+</style>

+ 1 - 24
sheep/components/s-coupon-card/s-coupon-card.vue

@@ -1,6 +1,6 @@
 <!-- 装修用户组件:用户卡券 -->
 <!-- 装修用户组件:用户卡券 -->
 <template>
 <template>
-	<view class="ss-coupon-menu-wrap ss-flex ss-col-center" :style="[bgStyle, { marginLeft: `${data.space}px` }]">
+	<view class="ss-coupon-menu-wrap ss-flex ss-col-center">
 		<view class="menu-item ss-flex-col ss-row-center ss-col-center" v-for="item in props.list" :key="item.title"
 		<view class="menu-item ss-flex-col ss-row-center ss-col-center" v-for="item in props.list" :key="item.title"
 			@tap="sheep.$router.go(item.path, { type: item.type })"
 			@tap="sheep.$router.go(item.path, { type: item.type })"
 			:class="item.type === 'all' ? 'menu-wallet' : 'ss-flex-1'">
 			:class="item.type === 'all' ? 'menu-wallet' : 'ss-flex-1'">
@@ -15,7 +15,6 @@
 	 * 装修组件 - 优惠券菜单
 	 * 装修组件 - 优惠券菜单
 	 */
 	 */
 	import sheep from '@/sheep';
 	import sheep from '@/sheep';
-	import { computed } from 'vue';
 
 
 	// 接收参数
 	// 接收参数
 	const props = defineProps({
 	const props = defineProps({
@@ -53,28 +52,6 @@
 				];
 				];
 			},
 			},
 		},
 		},
-		// 装修数据
-		data: {
-		  type: Object,
-		  default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-		  type: Object,
-		  default: () => ({}),
-		},
-	});
-	// 设置背景样式
-	const bgStyle = computed(() => {
-	  // 直接从 props.styles 解构
-	  const { bgType, bgImg, bgColor } = props.styles; 
-	
-	  // 根据 bgType 返回相应的样式
-	  return {
-		background: bgType === 'img'
-			? `url(${bgImg}) no-repeat top center / 100% 100%`
-			: bgColor
-		};
 	});
 	});
 </script>
 </script>
 
 

+ 23 - 25
sheep/components/s-coupon-select/s-coupon-select.vue

@@ -1,19 +1,24 @@
 <!-- 订单确认的优惠劵选择弹窗 -->
 <!-- 订单确认的优惠劵选择弹窗 -->
 <template>
 <template>
-  <su-popup :show="show" type="bottom" round="20" @close="emits('close')" showClose backgroundColor="#f2f2f2">
+  <su-popup
+    :show="show"
+    type="bottom"
+    round="20"
+    @close="emits('close')"
+    showClose
+    backgroundColor="#f2f2f2"
+  >
     <view class="model-box">
     <view class="model-box">
       <view class="title ss-m-t-16 ss-m-l-20 ss-flex">优惠券</view>
       <view class="title ss-m-t-16 ss-m-l-20 ss-flex">优惠券</view>
-      <scroll-view class="model-content" scroll-y :scroll-with-animation="false" :enable-back-to-top="true">
-        <!--可使用的优惠券区域-->
+      <scroll-view
+        class="model-content"
+        scroll-y
+        :scroll-with-animation="false"
+        :enable-back-to-top="true"
+      >
         <view class="subtitle ss-m-l-20">可使用优惠券</view>
         <view class="subtitle ss-m-l-20">可使用优惠券</view>
-        <view v-for="(item, index) in state.couponInfo.filter(coupon => coupon.match)" :key="index">
+        <view v-for="(item, index) in state.couponInfo" :key="index">
           <s-coupon-list :data="item" type="user" :disabled="false">
           <s-coupon-list :data="item" type="user" :disabled="false">
-            <template v-slot:reason>
-              <view class="ss-flex ss-m-t-24">
-                <view class="reason-title">可用原因:</view>
-                <view class="reason-desc">{{ item.description || '已达到使用门槛' }}</view>
-              </view>
-            </template>
             <template #default>
             <template #default>
               <label class="ss-flex ss-col-center" @tap="radioChange(item.id)">
               <label class="ss-flex ss-col-center" @tap="radioChange(item.id)">
                 <radio
                 <radio
@@ -26,18 +31,19 @@
             </template>
             </template>
           </s-coupon-list>
           </s-coupon-list>
         </view>
         </view>
-        <!--不可使用的优惠券区域-->
+        <!-- TODO 芋艿:未来接口需要支持下
         <view class="subtitle ss-m-t-40 ss-m-l-20">不可使用优惠券</view>
         <view class="subtitle ss-m-t-40 ss-m-l-20">不可使用优惠券</view>
-        <view v-for="item in state.couponInfo.filter(coupon => !coupon.match)" :key="item.id">
+        <view v-for="item in state.couponInfo.cannot_use" :key="item.id">
           <s-coupon-list :data="item" type="user" :disabled="true">
           <s-coupon-list :data="item" type="user" :disabled="true">
             <template v-slot:reason>
             <template v-slot:reason>
               <view class="ss-flex ss-m-t-24">
               <view class="ss-flex ss-m-t-24">
                 <view class="reason-title"> 不可用原因:</view>
                 <view class="reason-title"> 不可用原因:</view>
-                <view class="reason-desc">{{ item.description || '未达到使用门槛' }}</view>
+                <view class="reason-desc">{{ item.cannot_use_msg }}</view>
               </view>
               </view>
             </template>
             </template>
           </s-coupon-list>
           </s-coupon-list>
         </view>
         </view>
+      -->
       </scroll-view>
       </scroll-view>
     </view>
     </view>
     <view class="modal-footer ss-flex">
     <view class="modal-footer ss-flex">
@@ -51,8 +57,7 @@
   const props = defineProps({
   const props = defineProps({
     modelValue: { // 优惠劵列表
     modelValue: { // 优惠劵列表
       type: Object,
       type: Object,
-      default() {
-      },
+      default() {},
     },
     },
     show: {
     show: {
       type: Boolean,
       type: Boolean,
@@ -64,13 +69,13 @@
 
 
   const state = reactive({
   const state = reactive({
     couponInfo: computed(() => props.modelValue), // 优惠劵列表
     couponInfo: computed(() => props.modelValue), // 优惠劵列表
-    couponId: undefined, // 选中的优惠劵编号
+    couponId: 0, // 选中的优惠劵编号
   });
   });
 
 
   // 选中优惠劵
   // 选中优惠劵
   function radioChange(couponId) {
   function radioChange(couponId) {
     if (state.couponId === couponId) {
     if (state.couponId === couponId) {
-      state.couponId = undefined;
+      state.couponId = 0;
     } else {
     } else {
       state.couponId = couponId;
       state.couponId = couponId;
     }
     }
@@ -79,7 +84,7 @@
   // 确认优惠劵
   // 确认优惠劵
   const onConfirm = () => {
   const onConfirm = () => {
     emits('confirm', state.couponId);
     emits('confirm', state.couponId);
-  };
+  }
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
   :deep() {
   :deep() {
@@ -91,30 +96,25 @@
   .model-box {
   .model-box {
     height: 60vh;
     height: 60vh;
   }
   }
-
   .title {
   .title {
     font-size: 36rpx;
     font-size: 36rpx;
     height: 80rpx;
     height: 80rpx;
     font-weight: bold;
     font-weight: bold;
     color: #333333;
     color: #333333;
   }
   }
-
   .subtitle {
   .subtitle {
     font-size: 26rpx;
     font-size: 26rpx;
     font-weight: 500;
     font-weight: 500;
     color: #333333;
     color: #333333;
   }
   }
-
   .model-content {
   .model-content {
     height: 54vh;
     height: 54vh;
   }
   }
-
   .modal-footer {
   .modal-footer {
     width: 100%;
     width: 100%;
     height: 120rpx;
     height: 120rpx;
     background: #fff;
     background: #fff;
   }
   }
-
   .confirm-btn {
   .confirm-btn {
     width: 710rpx;
     width: 710rpx;
     margin-left: 20rpx;
     margin-left: 20rpx;
@@ -123,14 +123,12 @@
     border-radius: 40rpx;
     border-radius: 40rpx;
     color: #fff;
     color: #fff;
   }
   }
-
   .reason-title {
   .reason-title {
     font-weight: 600;
     font-weight: 600;
     font-size: 20rpx;
     font-size: 20rpx;
     line-height: 26rpx;
     line-height: 26rpx;
     color: #ff0003;
     color: #ff0003;
   }
   }
-
   .reason-desc {
   .reason-desc {
     font-weight: 600;
     font-weight: 600;
     font-size: 20rpx;
     font-size: 20rpx;

+ 8 - 19
sheep/components/s-custom-navbar/s-custom-navbar.vue

@@ -44,9 +44,9 @@
    *
    *
    * @property {Number | String}  alwaysShow = [0,1]			    - 是否常驻
    * @property {Number | String}  alwaysShow = [0,1]			    - 是否常驻
    * @property {Number | String}  styleType = [inner]			   	- 是否沉浸式
    * @property {Number | String}  styleType = [inner]			   	- 是否沉浸式
-   * @property {String | Number} type              - 标题背景模式
-   * @property {String} color                  - 页面背景色
-   * @property {String} src                    - 页面背景图片
+   * @property {String | Number} type 		 					- 标题背景模式
+   * @property {String} color 		 							- 页面背景色
+   * @property {String} src 		 								- 页面背景图片
    */
    */
   import { computed, unref } from 'vue';
   import { computed, unref } from 'vue';
   import sheep from '@/sheep';
   import sheep from '@/sheep';
@@ -77,7 +77,7 @@
   });
   });
   const navList = computed(() => {
   const navList = computed(() => {
     // #ifdef MP
     // #ifdef MP
-    return props.data.mpCells || [];
+    return props.data.mapCells || [];
     // #endif
     // #endif
     return props.data.otherCells || [];
     return props.data.otherCells || [];
   });
   });
@@ -117,12 +117,11 @@
   const bgStyles = computed(() => {
   const bgStyles = computed(() => {
     return {
     return {
       background:
       background:
-        props.data.bgType === 'img' && props.data.bgImg
+          props.data.bgType === 'img' && props.data.bgImg
           ? `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`
           ? `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`
-          : props.data.bgColor,
+          : props.data.bgColor
     };
     };
   });
   });
-
   // 左侧按钮:返回上一页或首页
   // 左侧按钮:返回上一页或首页
   function onClickLeft() {
   function onClickLeft() {
     if (hasHistory) {
     if (hasHistory) {
@@ -131,7 +130,6 @@
       sheep.$router.go('/pages/index/index');
       sheep.$router.go('/pages/index/index');
     }
     }
   }
   }
-
   // 右侧按钮:打开快捷菜单
   // 右侧按钮:打开快捷菜单
   function onClickRight() {
   function onClickRight() {
     showMenuTools();
     showMenuTools();
@@ -149,53 +147,44 @@
       top: 50%;
       top: 50%;
       transform: translateY(-50%);
       transform: translateY(-50%);
     }
     }
-
     .nav-icon {
     .nav-icon {
       position: absolute;
       position: absolute;
       top: 50%;
       top: 50%;
       transform: translateY(-50%);
       transform: translateY(-50%);
       left: 20rpx;
       left: 20rpx;
-
       .inner-icon-box {
       .inner-icon-box {
         border: 1px solid rgba(#fff, 0.4);
         border: 1px solid rgba(#fff, 0.4);
         background: none !important;
         background: none !important;
       }
       }
-
       .icon-box {
       .icon-box {
         background: #ffffff;
         background: #ffffff;
-        box-shadow: 0px 0px 4rpx rgba(51, 51, 51, 0.08), 0px 4rpx 6rpx 2rpx rgba(102, 102, 102, 0.12);
+        box-shadow: 0px 0px 4rpx rgba(51, 51, 51, 0.08),
+          0px 4rpx 6rpx 2rpx rgba(102, 102, 102, 0.12);
         border-radius: 30rpx;
         border-radius: 30rpx;
         width: 134rpx;
         width: 134rpx;
         height: 56rpx;
         height: 56rpx;
         margin-left: 8rpx;
         margin-left: 8rpx;
-
         .line {
         .line {
           width: 2rpx;
           width: 2rpx;
           height: 24rpx;
           height: 24rpx;
           background: #e5e5e7;
           background: #e5e5e7;
         }
         }
-
         .sicon-back {
         .sicon-back {
           font-size: 32rpx;
           font-size: 32rpx;
         }
         }
-
         .sicon-home {
         .sicon-home {
           font-size: 32rpx;
           font-size: 32rpx;
         }
         }
-
         .sicon-more {
         .sicon-more {
           font-size: 32rpx;
           font-size: 32rpx;
         }
         }
-
         .icon-button {
         .icon-button {
           width: 67rpx;
           width: 67rpx;
           height: 56rpx;
           height: 56rpx;
-
           &-left:hover {
           &-left:hover {
             background: rgba(0, 0, 0, 0.16);
             background: rgba(0, 0, 0, 0.16);
             border-radius: 30rpx 0px 0px 30rpx;
             border-radius: 30rpx 0px 0px 30rpx;
           }
           }
-
           &-right:hover {
           &-right:hover {
             background: rgba(0, 0, 0, 0.16);
             background: rgba(0, 0, 0, 0.16);
             border-radius: 0px 30rpx 30rpx 0px;
             border-radius: 0px 30rpx 30rpx 0px;

+ 141 - 158
sheep/components/s-groupon-block/s-groupon-block.vue

@@ -1,171 +1,154 @@
 <!-- 装修组件 - 拼团 -->
 <!-- 装修组件 - 拼团 -->
 <template>
 <template>
-	<view>
-		<view v-if="layoutType === 'threeCol'" class="goods-sm-box ss-flex ss-flex-wrap" :style="[{ margin: '-' + data.space + 'rpx' }]">
-			<view v-for="product in productList" class="goods-card-box" :key="product.id" :style="[{padding: data.space + 'rpx',},]">
-				<s-goods-column
-					class="goods-card"
-					size="sm"
-					:goodsFields="goodsFields"
-					:tagStyle="badge"
-					:data="product"
-					:titleColor="data.fields.name?.color"
-					:topRadius="data.borderRadiusTop"
-					:bottomRadius="data.borderRadiusBottom"
-					@click="sheep.$router.go('/pages/goods/groupon', { id: props.data.activityId, })">
-				</s-goods-column>
-			</view>
-		</view>
-		<!-- 样式2 一行一个 图片左 文案右 -->
-		<view class="goods-box" v-if="layoutType === 'oneCol'">
-			<view class="goods-list" v-for="(product, index) in productList" :key="index" :style="[{ marginBottom: space + 'px' }]">
-				<s-goods-column
-					class="goods-card" size="lg"
-					:grouponTag="true"
-					:goodsFields="goodsFields"
-					:tagStyle="badge"
-					:data="product"
-					:titleColor="data.fields.name?.color"
-					:subTitleColor="data.fields.introduction?.color"
-					:topRadius="data.borderRadiusTop"
-					:bottomRadius="data.borderRadiusBottom"
-					@click="sheep.$router.go('/pages/goods/groupon', { id: props.data.activityId, })">
-					<template v-slot:cart>
-						<button class="ss-reset-button cart-btn" :style="[buyStyle]">
-							{{ btnBuy?.type === 'text' ? btnBuy.text : '去拼团' }}
-						</button>
-					</template>
-				</s-goods-column>
-			</view>
-		</view>
-	</view>
+  <view>
+    <view
+      v-if="layoutType === 'threeCol'"
+      class="goods-sm-box ss-flex ss-flex-wrap"
+      :style="[{ margin: '-' + data.space + 'rpx' }]"
+    >
+      <view
+        v-for="product in productList"
+        :key="product.id"
+        class="goods-card-box"
+        :style="[
+          {
+            padding: data.space + 'rpx',
+          },
+        ]"
+      >
+        <s-goods-column
+          class="goods-card"
+          size="sm"
+          :goodsFields="data.fields"
+          :tagStyle="tagStyle"
+          :data="product"
+          :titleColor="data.fields.name?.color"
+          :topRadius="data.borderRadiusTop"
+          :bottomRadius="data.borderRadiusBottom"
+          @click="
+            sheep.$router.go('/pages/goods/groupon', {
+              id: props.data.activityId,
+            })
+          "
+        ></s-goods-column>
+      </view>
+    </view>
+    <!-- 样式2 一行一个 图片左 文案右 -->
+    <view class="goods-box" v-if="layoutType === 'oneCol'">
+      <view
+        class="goods-list"
+        v-for="(product, index) in productList"
+        :key="index"
+        :style="[{ marginBottom: space + 'px' }]"
+      >
+        <s-goods-column
+          class="goods-card"
+          size="lg"
+          :goodsFields="data.fields"
+          :tagStyle="tagStyle"
+          :data="product"
+          :titleColor="data.fields.name?.color"
+          :subTitleColor="data.fields.introduction?.color"
+          :topRadius="data.borderRadiusTop"
+          :bottomRadius="data.borderRadiusBottom"
+          @click="
+            sheep.$router.go('/pages/goods/groupon', {
+              id: props.data.activityId,
+            })
+          "
+        >
+          <template v-slot:cart>
+            <button class="ss-reset-button cart-btn" :style="[buyStyle]">
+              {{ btnBuy?.type === 'text' ? btnBuy.text : '' }}
+            </button>
+          </template>
+        </s-goods-column>
+      </view>
+    </view>
+  </view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	/**
-	 * 拼团
-	 */
-	import {
-		computed,
-		onMounted,
-		reactive,
-		ref
-	} from 'vue';
-	import sheep from '@/sheep';
-	import SpuApi from "@/sheep/api/product/spu";
-	import CombinationApi from "@/sheep/api/promotion/combination";
+  /**
+   * 拼团
+   */
+  import { computed, onMounted, ref } from 'vue';
+  import sheep from '@/sheep';
+  import SpuApi from "@/sheep/api/product/spu";
+  import CombinationApi from "@/sheep/api/promotion/combination";
 
 
-	// 接收参数
-	const props = defineProps({
-		// 装修数据
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-	});
-	
-	// 设置相关信息是否显示
-	const goodsFields = reactive({
-	  // 商品价格
-	  price: { show: true },
-	  // 库存
-	  stock: { show: true },
-	  // 商品名称
-	  name: { show: true },
-	  // 商品介绍
-	  introduction: { show: true },
-	  // 市场价
-	  marketPrice: { show: true },
-	  // 销量
-	  salesCount: { show: true },
-	});
+  // 接收参数
+  const props = defineProps({
+    data: {
+      type: Object,
+      default() {},
+    },
+    styles: {
+      type: Object,
+      default() {},
+    },
+  });
 
 
-	let {
-		layoutType,
-		badge,
-		btnBuy,
-		space,
-	} = props.data;
-	let {
-		marginLeft,
-		marginRight
-	} = props.styles;
+  let { layoutType, tagStyle, btnBuy, space } = props.data;
+  let { marginLeft, marginRight } = props.styles;
 
 
-	// 购买按钮样式(暂未实现)
-	const buyStyle = computed(() => {
-		let btnBuy = props.data.btnBuy;
-		if (btnBuy?.type === 'text') {
-			return {
-				background: `linear-gradient(to right, ${btnBuy.bgBeginColor}, ${btnBuy.bgEndColor})`,
-			};
-		}
+  // 购买按钮样式
+  const buyStyle = computed(() => {
+    let btnBuy = props.data.btnBuy;
+    if (btnBuy?.type === 'text') {
+      return {
+        background: `linear-gradient(to right, ${btnBuy.bgBeginColor}, ${btnBuy.bgEndColor})`,
+      };
+    }
 
 
-		if (btnBuy?.type === 'img') {
-			return {
-				width: '54rpx',
-				height: '54rpx',
-				background: `url(${sheep.$url.cdn(btnBuy.imgUrl)}) no-repeat`,
-				backgroundSize: '100% 100%',
-			};
-		}
-	});
+    if (btnBuy?.type === 'img') {
+      return {
+        width: '54rpx',
+        height: '54rpx',
+        background: `url(${sheep.$url.cdn(btnBuy.imgUrl)}) no-repeat`,
+        backgroundSize: '100% 100%',
+      };
+    }
+  });
 
 
-	const productList = ref([]);
-	onMounted(async () => {
-		// todo:@owen 与Yudao结构不一致,待重构
-		const {
-			data: activity
-		} = await CombinationApi.getCombinationActivity(props.data.activityId);
-		const {
-			data: spu
-		} = await SpuApi.getSpuDetail(activity.spuId)
-		// 循环活动信息,赋值拼团最低价格
-		activity.products.forEach((product) => {
-			spu.price = Math.min(spu.price, product.combinationPrice); // 设置 SPU 的最低价格
-		});
-		productList.value = [spu];
-	});
+  const productList = ref([]);
+  onMounted(async () => {
+    // todo:@owen 与Yudao结构不一致,待重构
+    const { data: activity } = await CombinationApi.getCombinationActivity(props.data.activityId);
+    const { data: spu } = await SpuApi.getSpuDetail(activity.spuId)
+    productList.value = [spu];
+  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.goods-list {
-		position: relative;
-
-		.cart-btn {
-			position: absolute;
-			bottom: 10rpx;
-			right: 20rpx;
-			z-index: 11;
-			height: 50rpx;
-			line-height: 50rpx;
-			padding: 0 20rpx;
-			border-radius: 25rpx;
-			font-size: 24rpx;
-			color: #fff;
-			background: linear-gradient(90deg, #ff6600 0%, #fe832a 100%);
-		}
-	}
-
-	.goods-list {
-		&:nth-last-of-type(1) {
-			margin-bottom: 0 !important;
-		}
-	}
-
-	.goods-sm-box {
-		margin: 0 auto;
-		box-sizing: border-box;
-
-		.goods-card-box {
-			flex-shrink: 0;
-			overflow: hidden;
-			width: 33.3%;
-			box-sizing: border-box;
-		}
-	}
-</style>
+  .goods-list {
+    position: relative;
+    .cart-btn {
+      position: absolute;
+      bottom: 10rpx;
+      right: 20rpx;
+      z-index: 11;
+      height: 50rpx;
+      line-height: 50rpx;
+      padding: 0 20rpx;
+      border-radius: 25rpx;
+      font-size: 24rpx;
+      color: #fff;
+    }
+  }
+  .goods-list {
+    &:nth-last-of-type(1) {
+      margin-bottom: 0 !important;
+    }
+  }
+  .goods-sm-box {
+    margin: 0 auto;
+    box-sizing: border-box;
+    .goods-card-box {
+      flex-shrink: 0;
+      overflow: hidden;
+      width: 33.3%;
+      box-sizing: border-box;
+    }
+  }
+</style>

+ 8 - 8
sheep/components/s-layout/s-layout.vue

@@ -217,15 +217,15 @@
     display: flex;
     display: flex;
     width: 100%;
     width: 100%;
     height: 100vh;
     height: 100vh;
-
+	box-sizing: border-box;
     .page-main {
     .page-main {
-      position: absolute;
-      z-index: 1;
-      width: 100%;
-      min-height: 100%;
-      display: flex;
-      flex-direction: column;
-
+		position: absolute;
+		z-index: 1;
+		width: 100%;
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		box-sizing: border-box;
       .page-body {
       .page-body {
         width: 100%;
         width: 100%;
         position: relative;
         position: relative;

+ 326 - 306
sheep/components/s-menu-button/s-menu-button.vue

@@ -1,343 +1,363 @@
 <!-- 装修基础组件:菜单导航(金刚区) -->
 <!-- 装修基础组件:菜单导航(金刚区) -->
 <template>
 <template>
-	<!-- 包裹层 -->
-	<view class="ui-swiper" :class="[props.mode, props.ui]"
-		:style="[bgStyle, { height: swiperHeight + (menuList.length > 1 ? 50 : 0) + 'rpx' }]">
-		<!-- 轮播 -->
-		<swiper :circular="props.circular" :current="state.cur" :autoplay="props.autoplay" :interval="props.interval"
-			:duration="props.duration" :style="[{ height: swiperHeight + 'rpx' }]" @change="swiperChange">
-			<swiper-item v-for="(arr, index) in menuList" :key="index" :class="{ cur: state.cur == index }">
-				<!-- 宫格 -->
-				<view class="grid-wrap">
-					<view v-for="(item, index) in arr" :key="index"
-						class="grid-item ss-flex ss-flex-col ss-col-center ss-row-center"
-						:style="[{ width: `${100 * (1 / data.column)}%`, height: '200rpx' }]" hover-class="ss-hover-btn"
-						@tap="sheep.$router.go(item.url)">
-						<view class="menu-box ss-flex ss-flex-col ss-col-center ss-row-center">
-							<view v-if="item.badge.show" class="tag-box"
-								:style="[{ background: item.badge.bgColor, color: item.badge.textColor }]">
-								{{ item.badge.text }}
-							</view>
-							<image v-if="item.iconUrl" class="menu-icon" :style="[
+  <!-- 包裹层 -->
+  <view
+    class="ui-swiper"
+    :class="[props.mode, props.bg, props.ui]"
+    :style="[{ height: swiperHeight + (menuList.length > 1 ? 50 : 0) + 'rpx' }]"
+  >
+    <!-- 轮播 -->
+    <swiper
+      :circular="props.circular"
+      :current="state.cur"
+      :autoplay="props.autoplay"
+      :interval="props.interval"
+      :duration="props.duration"
+      :style="[{ height: swiperHeight + 'rpx' }]"
+      @change="swiperChange"
+    >
+      <swiper-item
+        v-for="(arr, index) in menuList"
+        :key="index"
+        :class="{ cur: state.cur == index }"
+      >
+        <!-- 宫格 -->
+        <view class="grid-wrap">
+          <view
+            v-for="(item, index) in arr"
+            :key="index"
+            class="grid-item ss-flex ss-flex-col ss-col-center ss-row-center"
+            :style="[{ width: `${100 * (1 / data.column)}%`, height: '200rpx' }]"
+            hover-class="ss-hover-btn"
+            @tap="sheep.$router.go(item.url)"
+          >
+            <view class="menu-box ss-flex ss-flex-col ss-col-center ss-row-center">
+              <view
+                v-if="item.badge.show"
+                class="tag-box"
+                :style="[{ background: item.badge.bgColor, color: item.badge.textColor }]"
+              >
+                {{ item.badge.text }}
+              </view>
+              <image
+                v-if="item.iconUrl"
+                class="menu-icon"
+                :style="[
                   {
                   {
                     width: props.iconSize + 'rpx',
                     width: props.iconSize + 'rpx',
                     height: props.iconSize + 'rpx',
                     height: props.iconSize + 'rpx',
                   },
                   },
-                ]" :src="sheep.$url.cdn(item.iconUrl)" mode="aspectFill"></image>
-							<view v-if="data.layout === 'iconText'" class="menu-title"
-								:style="[{ color: item.titleColor }]">
-								{{ item.title }}
-							</view>
-						</view>
-					</view>
-				</view>
-			</swiper-item>
-		</swiper>
-		<!-- 指示点 -->
-		<template v-if="menuList.length > 1">
-			<view class="ui-swiper-dot" :class="props.dotStyle" v-if="props.dotStyle != 'tag'">
-				<view class="line-box" v-for="(item, index) in menuList.length" :key="index"
-					:class="[state.cur == index ? 'cur' : '', props.dotCur]"></view>
-			</view>
-			<view class="ui-swiper-dot" :class="props.dotStyle" v-if="props.dotStyle == 'tag'">
-				<view class="ui-tag radius" :class="[props.dotCur]" style="pointer-events: none">
-					<view style="transform: scale(0.7)">{{ state.cur + 1 }} / {{ menuList.length }}</view>
-				</view>
-			</view>
-		</template>
-	</view>
+                ]"
+                :src="sheep.$url.cdn(item.iconUrl)"
+                mode="aspectFill"
+              ></image>
+              <view
+                v-if="data.layout === 'iconText'"
+                class="menu-title"
+                :style="[{ color: item.titleColor }]"
+              >
+                {{ item.title }}
+              </view>
+            </view>
+          </view>
+        </view>
+      </swiper-item>
+    </swiper>
+    <!-- 指示点 -->
+    <template v-if="menuList.length > 1">
+      <view class="ui-swiper-dot" :class="props.dotStyle" v-if="props.dotStyle != 'tag'">
+        <view
+          class="line-box"
+          v-for="(item, index) in menuList.length"
+          :key="index"
+          :class="[state.cur == index ? 'cur' : '', props.dotCur]"
+        ></view>
+      </view>
+      <view class="ui-swiper-dot" :class="props.dotStyle" v-if="props.dotStyle == 'tag'">
+        <view class="ui-tag radius" :class="[props.dotCur]" style="pointer-events: none">
+          <view style="transform: scale(0.7)">{{ state.cur + 1 }} / {{ menuList.length }}</view>
+        </view>
+      </view>
+    </template>
+  </view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	/**
-	 * 轮播menu
-	 *
-	 * @property {Boolean} circular = false  		- 是否采用衔接滑动,即播放到末尾后重新回到开头
-	 * @property {Boolean} autoplay = true  		- 是否自动切换
-	 * @property {Number} interval = 5000  			- 自动切换时间间隔
-	 * @property {Number} duration = 500  			- 滑动动画时长,app-nvue不支持
-	 * @property {Array} list = [] 					- 轮播数据
-	 * @property {String} ui = ''  					- 样式class
-	 * @property {String} mode  					- 模式
-	 * @property {String} dotStyle  				- 指示点样式
-	 * @property {String} dotCur= 'ui-BG-Main' 		- 当前指示点样式,默认主题色
-	 * @property {String} bg  						- 背景
-	 *
-	 * @property {String|Number} col = 4  			- 一行数量
-	 * @property {String|Number} row = 1 			- 几行
-	 * @property {String} hasBorder 				- 是否有边框
-	 * @property {String} borderColor 				- 边框颜色
-	 * @property {String} background		  		- 背景
-	 * @property {String} hoverClass 				- 按压样式类
-	 * @property {String} hoverStayTime 		  	- 动画时间
-	 *
-	 * @property {Array} list 		  				- 导航列表
-	 * @property {Number} iconSize 		  			- 图标大小
-	 * @property {String} color 		  			- 标题颜色
-	 *
-	 */
+  /**
+   * 轮播menu
+   *
+   * @property {Boolean} circular = false  		- 是否采用衔接滑动,即播放到末尾后重新回到开头
+   * @property {Boolean} autoplay = true  		- 是否自动切换
+   * @property {Number} interval = 5000  			- 自动切换时间间隔
+   * @property {Number} duration = 500  			- 滑动动画时长,app-nvue不支持
+   * @property {Array} list = [] 					- 轮播数据
+   * @property {String} ui = ''  					- 样式class
+   * @property {String} mode  					- 模式
+   * @property {String} dotStyle  				- 指示点样式
+   * @property {String} dotCur= 'ui-BG-Main' 		- 当前指示点样式,默认主题色
+   * @property {String} bg  						- 背景
+   *
+   * @property {String|Number} col = 4  			- 一行数量
+   *  @property {String|Number} row = 1 			- 几行
+   * @property {String} hasBorder 				- 是否有边框
+   * @property {String} borderColor 				- 边框颜色
+   * @property {String} background		  		- 背景
+   * @property {String} hoverClass 				- 按压样式类
+   * @property {String} hoverStayTime 		  	- 动画时间
+   *
+   * @property {Array} list 		  				- 导航列表
+   * @property {Number} iconSize 		  			- 图标大小
+   * @property {String} color 		  			- 标题颜色
+   *
+   */
 
 
-	import {
-		reactive,
-		computed
-	} from 'vue';
-	import sheep from '@/sheep';
+  import { reactive, computed } from 'vue';
+  import sheep from '@/sheep';
 
 
-	// 数据
-	const state = reactive({
-		cur: 0,
-	});
+  // 数据
+  const state = reactive({
+    cur: 0,
+  });
 
 
-	// 接收参数
+  // 接收参数
 
 
-	const props = defineProps({
-		// 装修数据
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-		circular: {
-			type: Boolean,
-			default: true,
-		},
-		autoplay: {
-			type: Boolean,
-			default: false,
-		},
-		interval: {
-			type: Number,
-			default: 5000,
-		},
-		duration: {
-			type: Number,
-			default: 500,
-		},
-		ui: {
-			type: String,
-			default: '',
-		},
-		mode: {
-			//default
-			type: String,
-			default: 'default',
-		},
-		dotStyle: {
-			type: String,
-			default: 'long', //default long tag
-		},
-		dotCur: {
-			type: String,
-			default: 'ui-BG-Main',
-		},
-		height: {
-			type: Number,
-			default: 300,
-		},
-		// 是否有边框
-		hasBorder: {
-			type: Boolean,
-			default: true,
-		},
-		// 边框颜色
-		borderColor: {
-			type: String,
-			default: 'red',
-		},
-		background: {
-			type: String,
-			default: 'blue',
-		},
-		hoverClass: {
-			type: String,
-			default: 'ss-hover-class', //'none'为没有hover效果
-		},
-		// 一排宫格数
-		col: {
-			type: [Number, String],
-			default: 3,
-		},
-		iconSize: {
-			type: Number,
-			default: 80,
-		},
-		color: {
-			type: String,
-			default: '#000',
-		},
-	});
+  const props = defineProps({
+    data: {
+      type: Object,
+      default() {},
+    },
+    styles: {
+      type: Object,
+      default() {},
+    },
+    circular: {
+      type: Boolean,
+      default: true,
+    },
+    autoplay: {
+      type: Boolean,
+      default: false,
+    },
+    interval: {
+      type: Number,
+      default: 5000,
+    },
+    duration: {
+      type: Number,
+      default: 500,
+    },
 
 
-	// 设置背景样式
-	const bgStyle = computed(() => {
-		// 直接从 props.styles 解构
-		const {
-			bgType,
-			bgImg,
-			bgColor
-		} = props.styles;
+    ui: {
+      type: String,
+      default: '',
+    },
+    mode: {
+      //default
+      type: String,
+      default: 'default',
+    },
+    dotStyle: {
+      type: String,
+      default: 'long', //default long tag
+    },
+    dotCur: {
+      type: String,
+      default: 'ui-BG-Main',
+    },
+    bg: {
+      type: String,
+      default: 'bg-none',
+    },
+    height: {
+      type: Number,
+      default: 300,
+    },
 
 
-		// 根据 bgType 返回相应的样式
-		return {
-			background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
-		};
-	});
+    // 是否有边框
+    hasBorder: {
+      type: Boolean,
+      default: true,
+    },
+    // 边框颜色
+    borderColor: {
+      type: String,
+      default: 'red',
+    },
+    background: {
+      type: String,
+      default: 'blue',
+    },
+    hoverClass: {
+      type: String,
+      default: 'ss-hover-class', //'none'为没有hover效果
+    },
+    // 一排宫格数
+    col: {
+      type: [Number, String],
+      default: 3,
+    },
+    iconSize: {
+      type: Number,
+      default: 80,
+    },
+    color: {
+      type: String,
+      default: '#000',
+    },
+  });
 
 
-	// 生成数据
-	const menuList = computed(() => splitData(props.data.list, props.data.row * props.data.column));
-	const swiperHeight = computed(() => props.data.row * (props.data.layout === 'iconText' ? 200 : 180));
-	const windowWidth = sheep.$platform.device.windowWidth;
+  // 生成数据
+  const menuList = computed(() => splitData(props.data.list, props.data.row * props.data.column));
+  const swiperHeight = computed(() => props.data.row * (props.data.layout === 'iconText' ? 200 : 180));
+  const windowWidth = sheep.$platform.device.windowWidth;
 
 
-	// current 改变时会触发 change 事件
-	const swiperChange = (e) => {
-		state.cur = e.detail.current;
-	};
+  // current 改变时会触发 change 事件
+  const swiperChange = (e) => {
+    state.cur = e.detail.current;
+  };
 
 
-	// 重组数据
-	const splitData = (oArr = [], length = 1) => {
-		let arr = [];
-		let minArr = [];
-		oArr.forEach((c) => {
-			if (minArr.length === length) {
-				minArr = [];
-			}
-			if (minArr.length === 0) {
-				arr.push(minArr);
-			}
-			minArr.push(c);
-		});
+  // 重组数据
+  const splitData = (oArr = [], length = 1) => {
+    let arr = [];
+    let minArr = [];
+    oArr.forEach((c) => {
+      if (minArr.length === length) {
+        minArr = [];
+      }
+      if (minArr.length === 0) {
+        arr.push(minArr);
+      }
+      minArr.push(c);
+    });
 
 
-		return arr;
-	};
+    return arr;
+  };
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.grid-wrap {
-		width: 100%;
-		display: flex;
-		position: relative;
-		box-sizing: border-box;
-		overflow: hidden;
-		flex-wrap: wrap;
-		align-items: center;
-	}
+  .grid-wrap {
+    width: 100%;
+    display: flex;
+    position: relative;
+    box-sizing: border-box;
+    overflow: hidden;
+    flex-wrap: wrap;
+    align-items: center;
+  }
+  .menu-box {
+    position: relative;
+    z-index: 1;
+    transform: translate(0, 0);
 
 
-	.menu-box {
-		position: relative;
-		z-index: 1;
-		transform: translate(0, 0);
+    .tag-box {
+      position: absolute;
+      z-index: 2;
+      top: 0;
+      right: -6rpx;
+      font-size: 2em;
+      line-height: 1;
+      padding: 0.4em 0.6em 0.3em;
+      transform: scale(0.4) translateX(0.5em) translatey(-0.6em);
+      transform-origin: 100% 0;
+      border-radius: 200rpx;
+      white-space: nowrap;
+    }
 
 
-		.tag-box {
-			position: absolute;
-			z-index: 2;
-			top: 0;
-			right: -6rpx;
-			font-size: 2em;
-			line-height: 1;
-			padding: 0.4em 0.6em 0.3em;
-			transform: scale(0.4) translateX(0.5em) translatey(-0.6em);
-			transform-origin: 100% 0;
-			border-radius: 200rpx;
-			white-space: nowrap;
-		}
+    .menu-icon {
+      transform: translate(0, 0);
+      width: 80rpx;
+      height: 80rpx;
+      padding-bottom: 10rpx;
+    }
 
 
-		.menu-icon {
-			transform: translate(0, 0);
-			width: 80rpx;
-			height: 80rpx;
-			padding-bottom: 10rpx;
-		}
+    .menu-title {
+      font-size: 24rpx;
+      color: #333;
+    }
+  }
 
 
-		.menu-title {
-			font-size: 24rpx;
-			color: #333;
-		}
-	}
+  ::v-deep(.ui-swiper) {
+    position: relative;
+    z-index: 1;
 
 
-	::v-deep(.ui-swiper) {
-		position: relative;
-		z-index: 1;
+    .ui-swiper-dot {
+      position: absolute;
+      width: 100%;
+      bottom: 20rpx;
+      height: 30rpx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      z-index: 2;
 
 
-		.ui-swiper-dot {
-			position: absolute;
-			width: 100%;
-			bottom: 20rpx;
-			height: 30rpx;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			z-index: 2;
+      &.default .line-box {
+        display: inline-flex;
+        border-radius: 50rpx;
+        width: 6px;
+        height: 6px;
+        border: 2px solid transparent;
+        margin: 0 10rpx;
+        opacity: 0.3;
+        position: relative;
+        justify-content: center;
+        align-items: center;
 
 
-			&.default .line-box {
-				display: inline-flex;
-				border-radius: 50rpx;
-				width: 6px;
-				height: 6px;
-				border: 2px solid transparent;
-				margin: 0 10rpx;
-				opacity: 0.3;
-				position: relative;
-				justify-content: center;
-				align-items: center;
+        &.cur {
+          width: 8px;
+          height: 8px;
+          opacity: 1;
+          border: 0px solid transparent;
+        }
 
 
-				&.cur {
-					width: 8px;
-					height: 8px;
-					opacity: 1;
-					border: 0px solid transparent;
-				}
+        &.cur::after {
+          content: '';
+          border-radius: 50rpx;
+          width: 4px;
+          height: 4px;
+          background-color: #fff;
+        }
+      }
 
 
-				&.cur::after {
-					content: '';
-					border-radius: 50rpx;
-					width: 4px;
-					height: 4px;
-					background-color: #fff;
-				}
-			}
+      &.long .line-box {
+        display: inline-block;
+        border-radius: 100rpx;
+        width: 6px;
+        height: 6px;
+        margin: 0 10rpx;
+        opacity: 0.3;
+        position: relative;
 
 
-			&.long .line-box {
-				display: inline-block;
-				border-radius: 100rpx;
-				width: 6px;
-				height: 6px;
-				margin: 0 10rpx;
-				opacity: 0.3;
-				position: relative;
+        &.cur {
+          width: 24rpx;
+          opacity: 1;
+        }
 
 
-				&.cur {
-					width: 24rpx;
-					opacity: 1;
-				}
+        &.cur::after {
+        }
+      }
 
 
-				&.cur::after {}
-			}
+      &.line {
+        bottom: 20rpx;
 
 
-			&.line {
-				bottom: 20rpx;
+        .line-box {
+          display: inline-block;
+          width: 30px;
+          height: 3px;
+          opacity: 0.3;
+          position: relative;
 
 
-				.line-box {
-					display: inline-block;
-					width: 30px;
-					height: 3px;
-					opacity: 0.3;
-					position: relative;
+          &.cur {
+            opacity: 1;
+          }
+        }
+      }
 
 
-					&.cur {
-						opacity: 1;
-					}
-				}
-			}
-
-			&.tag {
-				justify-content: flex-end;
-				position: absolute;
-				bottom: 20rpx;
-				right: 20rpx;
-			}
-		}
-	}
-</style>
+      &.tag {
+        justify-content: flex-end;
+        position: absolute;
+        bottom: 20rpx;
+        right: 20rpx;
+      }
+    }
+  }
+</style>

+ 71 - 93
sheep/components/s-menu-grid/s-menu-grid.vue

@@ -1,104 +1,82 @@
 <!-- 装修基础组件:宫格导航 -->
 <!-- 装修基础组件:宫格导航 -->
 <template>
 <template>
-	<view :style="[bgStyle, { marginLeft: `${data.space}px` }]">
-		<uni-grid :showBorder="Boolean(data.border)" :column="data.column">
-			<uni-grid-item v-for="(item, index) in data.list" :key="index" @tap="sheep.$router.go(item.url)">
-				<view class="grid-item-box ss-flex ss-flex-col ss-row-center ss-col-center">
-					<view class="img-box">
-						<view class="tag-box" v-if="item.badge.show"
-							:style="[{ background: item.badge.bgColor, color: item.badge.textColor }]">
-							{{ item.badge.text }}
-						</view>
-						<image class="menu-image" :src="sheep.$url.cdn(item.iconUrl)"></image>
-					</view>
-
-					<view class="title-box ss-flex ss-flex-col ss-row-center ss-col-center">
-						<view class="grid-text" :style="[{ color: item.titleColor }]">
-							{{ item.title }}
-						</view>
-						<view class="grid-tip" :style="[{ color: item.subtitleColor }]">
-							{{ item.subtitle }}
-						</view>
-					</view>
-				</view>
-			</uni-grid-item>
-		</uni-grid>
-	</view>
+  <uni-grid :showBorder="Boolean(data.border)" :column="data.column">
+    <uni-grid-item
+      v-for="(item, index) in data.list"
+      :key="index"
+      @tap="sheep.$router.go(item.url)"
+    >
+      <view class="grid-item-box ss-flex ss-flex-col ss-row-center ss-col-center">
+        <view class="img-box">
+          <view
+            class="tag-box"
+            v-if="item.badge.show"
+            :style="[{ background: item.badge.bgColor, color: item.badge.textColor }]"
+          >
+            {{ item.badge.text }}
+          </view>
+          <image class="menu-image" :src="sheep.$url.cdn(item.iconUrl)"></image>
+        </view>
 
 
+        <view class="title-box ss-flex ss-flex-col ss-row-center ss-col-center">
+          <view class="grid-text" :style="[{ color: item.titleColor }]">
+            {{ item.title }}
+          </view>
+          <view class="grid-tip" :style="[{ color: item.subtitleColor }]">
+            {{ item.subtitle }}
+          </view>
+        </view>
+      </view>
+    </uni-grid-item>
+  </uni-grid>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	import sheep from '@/sheep';
-	import {
-		computed
-	} from 'vue';
-
-	const props = defineProps({
-		// 装修数据
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-	});
-	// 设置背景样式
-	const bgStyle = computed(() => {
-		// 直接从 props.styles 解构
-		const {
-			bgType,
-			bgImg,
-			bgColor
-		} = props.styles;
+  import sheep from '@/sheep';
 
 
-		// 根据 bgType 返回相应的样式
-		return {
-			background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
-		};
-	});
+  const props = defineProps({
+    data: {
+      type: Object,
+      default() {},
+    },
+  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.menu-image {
-		width: 24px;
-		height: 24px;
-	}
-
-	.grid-item-box {
-		flex: 1;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		height: 100%;
-
-		.img-box {
-			position: relative;
-
-			.tag-box {
-				position: absolute;
-				z-index: 2;
-				top: 0;
-				right: 0;
-				font-size: 2em;
-				line-height: 1;
-				padding: 0.4em 0.6em 0.3em;
-				transform: scale(0.4) translateX(0.5em) translatey(-0.6em);
-				transform-origin: 100% 0;
-				border-radius: 200rpx;
-				white-space: nowrap;
-			}
-		}
+  .menu-image {
+    width: 24px;
+    height: 24px;
+  }
+  .grid-item-box {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    .img-box {
+      position: relative;
+      .tag-box {
+        position: absolute;
+        z-index: 2;
+        top: 0;
+        right: 0;
+        font-size: 2em;
+        line-height: 1;
+        padding: 0.4em 0.6em 0.3em;
+        transform: scale(0.4) translateX(0.5em) translatey(-0.6em);
+        transform-origin: 100% 0;
+        border-radius: 200rpx;
+        white-space: nowrap;
+      }
+    }
 
 
-		.title-box {
-			.grid-tip {
-				font-size: 24rpx;
-				white-space: nowrap;
-				text-align: center;
-			}
-		}
-	}
-</style>
+    .title-box {
+      .grid-tip {
+        font-size: 24rpx;
+        white-space: nowrap;
+        text-align: center;
+      }
+    }
+  }
+</style>

+ 5 - 0
sheep/components/s-menu-tools/s-menu-tools.vue

@@ -49,6 +49,11 @@
       icon: '/static/img/shop/tools/user.png',
       icon: '/static/img/shop/tools/user.png',
       title: '个人中心',
       title: '个人中心',
     },
     },
+	{
+	  url: '/pages/XDHomePage/homePage/homePage',
+	  icon: '/static/img/shop/tools/home.png',
+	  title: '首页two',
+	},
     {
     {
       url: '/pages/index/cart',
       url: '/pages/index/cart',
       icon: '/static/img/shop/tools/cart.png',
       icon: '/static/img/shop/tools/cart.png',

+ 2 - 26
sheep/components/s-order-card/s-order-card.vue

@@ -1,6 +1,6 @@
 <!-- 装修用户组件:用户订单 -->
 <!-- 装修用户组件:用户订单 -->
 <template>
 <template>
-  <view class="ss-order-menu-wrap ss-flex ss-col-center" :style="[style, { marginLeft: `${data.space}px` }]">
+  <view class="ss-order-menu-wrap ss-flex ss-col-center">
     <view
     <view
       class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
       class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
       v-for="item in orderMap"
       v-for="item in orderMap"
@@ -67,32 +67,8 @@
       path: '/pages/order/list',
       path: '/pages/order/list',
     },
     },
   ];
   ];
-  // 接收参数
-  const props = defineProps({
-  	// 装修数据
-  	data: {
-  	  type: Object,
-  	  default: () => ({}),
-  	},
-  	// 装修样式
-  	styles: {
-  	  type: Object,
-  	  default: () => ({}),
-  	},
-  });
-  // 设置角标
+
   const numData = computed(() => sheep.$store('user').numData);
   const numData = computed(() => sheep.$store('user').numData);
-  // 设置背景样式
-  const style = computed(() => {
-    // 直接从 props.styles 解构
-    const { bgType, bgImg, bgColor } = props.styles; 
-    // 根据 bgType 返回相应的样式
-    return {
-  		background: bgType === 'img'
-  			? `url(${bgImg}) no-repeat top center / 100% 100%`
-  			: bgColor
-  	};
-  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>

+ 148 - 170
sheep/components/s-seckill-block/s-seckill-block.vue

@@ -1,182 +1,160 @@
 <!-- 装修组件 - 秒杀 -->
 <!-- 装修组件 - 秒杀 -->
 <template>
 <template>
-	<view>
-		<!-- 样式一:三列 - 上图下文 -->
-		<view v-if="layoutType === 'threeCol'" class="goods-sm-box ss-flex ss-flex-wrap" :style="[{ margin: '-' + data.space + 'rpx' }]">
-			<view v-for="product in productList" :key="product.id" class="goods-card-box" :style="[{padding: data.space + 'rpx',},]">
-				<s-goods-column
-					class="goods-card" size="sm"
-					:goodsFields="goodsFields"
-					:tagStyle="badge"
-					:data="product"
-					:titleColor="data.fields.name?.color"
-					:topRadius="data.borderRadiusTop"
-					:bottomRadius="data.borderRadiusBottom"
-					@click="sheep.$router.go('/pages/goods/seckill', { id: props.data.activityId, })">
-				</s-goods-column>
-			</view>
-		</view>
-		<!-- 样式二:一列 - 左图右文 -->
-		<view class="goods-box" v-if="layoutType === 'oneCol'">
-			<view class="goods-list" v-for="(product, index) in productList" :key="index"
-				:style="[{ marginBottom: space + 'px' }]">
-				<s-goods-column
-					class="goods-card"
-					size="lg"
-					:goodsFields="goodsFields"
-					:seckillTag="true"
-					:tagStyle="badge"
-					:data="product"
-					:titleColor="data.fields.name?.color"
-					:subTitleColor="data.fields.introduction?.color"
-					:topRadius="data.borderRadiusTop"
-					:bottomRadius="data.borderRadiusBottom"
-					@click="sheep.$router.go('/pages/goods/seckill', { id: props.data.activityId, })">
-					<template v-slot:cart>
-						<button class="ss-reset-button cart-btn" :style="[buyStyle]">
-							{{ btnBuy?.type === 'text' ? btnBuy.text : '立即秒杀' }}
-						</button>
-					</template>
-				</s-goods-column>
-			</view>
-		</view>
-	</view>
+  <view>
+    <!-- 样式一:三列 - 上图下文 -->
+    <view
+      v-if="layoutType === 'threeCol'"
+      class="goods-sm-box ss-flex ss-flex-wrap"
+      :style="[{ margin: '-' + data.space + 'rpx' }]"
+    >
+      <view
+        v-for="product in productList"
+        :key="product.id"
+        class="goods-card-box"
+        :style="[
+          {
+            padding: data.space + 'rpx',
+          },
+        ]"
+      >
+        <s-goods-column
+          class="goods-card"
+          size="sm"
+          :goodsFields="data.fields"
+          :tagStyle="tagStyle"
+          :data="product"
+          :titleColor="data.fields.name?.color"
+          :topRadius="data.borderRadiusTop"
+          :bottomRadius="data.borderRadiusBottom"
+          @click="
+            sheep.$router.go('/pages/goods/seckill', {
+              id: props.data.activityId,
+            })
+          "
+        ></s-goods-column>
+      </view>
+    </view>
+    <!-- 样式二:一列 - 左图右文 -->
+    <view class="goods-box" v-if="layoutType === 'oneCol'">
+      <view
+        class="goods-list"
+        v-for="(product, index) in productList"
+        :key="index"
+        :style="[{ marginBottom: space + 'px' }]"
+      >
+        <s-goods-column
+          class="goods-card"
+          size="lg"
+          :goodsFields="data.fields"
+          :tagStyle="tagStyle"
+          :data="product"
+          :titleColor="data.fields.name?.color"
+          :subTitleColor="data.fields.introduction?.color"
+          :topRadius="data.borderRadiusTop"
+          :bottomRadius="data.borderRadiusBottom"
+          @click="
+            sheep.$router.go('/pages/goods/seckill', {
+              id: props.data.activityId,
+            })
+          "
+        >
+          <template v-slot:cart>
+            <button class="ss-reset-button cart-btn" :style="[buyStyle]">
+              {{ btnBuy?.type === 'text' ? btnBuy.text : '' }}
+            </button>
+          </template>
+        </s-goods-column>
+      </view>
+    </view>
+  </view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	/**
-	 * 秒杀商品列表
-	 *
-	 * @property {Array} list 商品列表
-	 */
-	import {
-		computed,
-		onMounted,
-		reactive,
-		ref
-	} from 'vue';
-	import sheep from '@/sheep';
-	import SeckillApi from "@/sheep/api/promotion/seckill";
-	import SpuApi from "@/sheep/api/product/spu";
+  /**
+   * 秒杀商品列表
+   *
+   * @property {Array} list 商品列表
+   */
+  import { computed, onMounted, ref } from 'vue';
+  import sheep from '@/sheep';
+  import SeckillApi from "@/sheep/api/promotion/seckill";
+  import SpuApi from "@/sheep/api/product/spu";
 
 
-	// 接收参数
-	const props = defineProps({
-		// 装修数据
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-	});
-	
-	// 设置相关信息是否显示
-	const goodsFields = reactive({
-	  // 商品价格
-	  price: { show: true },
-	  // 库存
-	  stock: { show: true },
-	  // 商品名称
-	  name: { show: true },
-	  // 商品介绍
-	  introduction: { show: true },
-	  // 市场价
-	  marketPrice: { show: true },
-	  // 销量
-	  salesCount: { show: true },
-	});
-	
-	let {
-		layoutType,
-		badge,
-		btnBuy,
-		space,
-	} = props.data;
-	let {
-		marginLeft,
-		marginRight
-	} = props.styles;
+  // 接收参数
+  const props = defineProps({
+    data: {
+      type: Object,
+      default() {},
+    },
+    styles: {
+      type: Object,
+      default() {},
+    },
+  });
 
 
-	// 购买按钮样式
-	const buyStyle = computed(() => {
-		let btnBuy = props.data.btnBuy;
-		if (btnBuy?.type === 'text') {
-			return {
-				background: `linear-gradient(to right, ${btnBuy.bgBeginColor}, ${btnBuy.bgEndColor})`,
-			};
-		}
-		if (btnBuy?.type === 'img') {
-			return {
-				width: '54rpx',
-				height: '54rpx',
-				background: `url(${sheep.$url.cdn(btnBuy.imgUrl)}) no-repeat`,
-				backgroundSize: '100% 100%',
-			};
-		}
-	});
+  let { layoutType, tagStyle, btnBuy, space } = props.data;
+  let { marginLeft, marginRight } = props.styles;
 
 
-	// 商品列表
-	const productList = ref([]);
-	// 查询秒杀活动商品
-	onMounted(async () => {
-		// todo:@owen 与Yudao结构不一致,待重构
-		const {
-			data: activity
-		} = await SeckillApi.getSeckillActivity(props.data.activityId);
-		const {
-			data: spu
-		} = await SpuApi.getSpuDetail(activity.spuId)
-		// 循环活动信息,赋值秒杀最低价格
-		activity.products.forEach((product) => {
-			spu.price = Math.min(spu.price, product.seckillPrice); // 设置 SPU 的最低价格
-		});
-    // 将活动库存赋值给商品库存
-    spu.stock = activity.stock
-    // 活动总库存 - 活动库存 = 销量
-    spu.salesCount = activity.totalStock - activity.stock
-		productList.value = [spu];
-	});
+  // 购买按钮样式
+  const buyStyle = computed(() => {
+    let btnBuy = props.data.btnBuy;
+    if (btnBuy?.type === 'text') {
+      return {
+        background: `linear-gradient(to right, ${btnBuy.bgBeginColor}, ${btnBuy.bgEndColor})`,
+      };
+    }
+    if (btnBuy?.type === 'img') {
+      return {
+        width: '54rpx',
+        height: '54rpx',
+        background: `url(${sheep.$url.cdn(btnBuy.imgUrl)}) no-repeat`,
+        backgroundSize: '100% 100%',
+      };
+    }
+  });
+
+  // 商品列表
+  const productList = ref([]);
+  // 查询秒杀活动商品
+  onMounted(async () => {
+    // todo:@owen 与Yudao结构不一致,待重构
+    const { data: activity } = await SeckillApi.getSeckillActivity(props.data.activityId);
+    const { data: spu } = await SpuApi.getSpuDetail(activity.spuId)
+    productList.value = [spu];
+  });
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.header-box {
-		height: 100rpx;
-	}
-
-	.goods-list {
-		position: relative;
-
-		&:nth-last-child(1) {
-			margin-bottom: 0 !important;
-		}
-
-		.cart-btn {
-			position: absolute;
-			bottom: 10rpx;
-			right: 20rpx;
-			z-index: 11;
-			height: 50rpx;
-			line-height: 50rpx;
-			padding: 0 20rpx;
-			border-radius: 25rpx;
-			font-size: 24rpx;
-			color: #fff;
-			background: linear-gradient(90deg, #ff6600 0%, #fe832a 100%);
-		}
-	}
-
-	.goods-sm-box {
-		margin: 0 auto;
-		box-sizing: border-box;
+  .header-box {
+    height: 100rpx;
+  }
 
 
-		.goods-card-box {
-			flex-shrink: 0;
-			overflow: hidden;
-			width: 33.3%;
-			box-sizing: border-box;
-		}
-	}
-</style>
+  .goods-list {
+    position: relative;
+    &:nth-last-child(1) {
+      margin-bottom: 0 !important;
+    }
+    .cart-btn {
+      position: absolute;
+      bottom: 10rpx;
+      right: 20rpx;
+      z-index: 11;
+      height: 50rpx;
+      line-height: 50rpx;
+      padding: 0 20rpx;
+      border-radius: 25rpx;
+      font-size: 24rpx;
+      color: #fff;
+    }
+  }
+  .goods-sm-box {
+    margin: 0 auto;
+    box-sizing: border-box;
+    .goods-card-box {
+      flex-shrink: 0;
+      overflow: hidden;
+      width: 33.3%;
+      box-sizing: border-box;
+    }
+  }
+</style>

+ 2 - 2
sheep/components/s-select-groupon-sku/s-select-groupon-sku.vue

@@ -22,7 +22,7 @@
             </view>
             </view>
           </view>
           </view>
           <view class="header-right-bottom ss-flex ss-col-center ss-row-between">
           <view class="header-right-bottom ss-flex ss-col-center ss-row-between">
-            <view class="price-text"> {{ fen2yuan(state.selectedSku.price || goodsInfo.price || state.selectedSku.marketPrice) }}</view>
+            <view class="price-text"> {{ fen2yuan(goodsInfo.price) }}</view>
 
 
             <view class="stock-text ss-m-l-20">
             <view class="stock-text ss-m-l-20">
               库存{{ state.selectedSku.stock || goodsInfo.stock }}件
               库存{{ state.selectedSku.stock || goodsInfo.stock }}件
@@ -63,7 +63,7 @@
               <view class="btn-title">{{ grouponNum + '人团' }}</view>
               <view class="btn-title">{{ grouponNum + '人团' }}</view>
             </button>
             </button>
             <button class="ss-reset-button btn-tox ss-flex-col" @tap="onBuy">
             <button class="ss-reset-button btn-tox ss-flex-col" @tap="onBuy">
-              <view class="btn-price">{{ fen2yuan(state.selectedSku.price * state.selectedSku.count || goodsInfo.price * state.selectedSku.count || state.selectedSku.marketPrice * state.selectedSku.count || goodsInfo.price) }}</view>
+              <view class="btn-price">{{ fen2yuan(goodsInfo.price) }}</view>
               <view v-if="grouponAction === 'create'">立即开团</view>
               <view v-if="grouponAction === 'create'">立即开团</view>
               <view v-else-if="grouponAction === 'join'">参与拼团</view>
               <view v-else-if="grouponAction === 'join'">参与拼团</view>
             </button>
             </button>

+ 1 - 1
sheep/components/s-share-modal/canvas-poster/index.vue

@@ -66,7 +66,7 @@
     css: {
     css: {
       // 根节点若无尺寸,自动获取父级节点
       // 根节点若无尺寸,自动获取父级节点
       width: sheep.$platform.device.windowWidth * 0.9,
       width: sheep.$platform.device.windowWidth * 0.9,
-      height: 600,
+      height: 550,
     },
     },
     views: [],
     views: [],
   });
   });

+ 5 - 5
sheep/components/s-share-modal/canvas-poster/poster/groupon.js

@@ -82,12 +82,12 @@ const groupon = async (poster) => {
       type: 'text',
       type: 'text',
       text: '2人团',
       text: '2人团',
       css: {
       css: {
-        color: '#fff',
-        fontSize: 12,
+        color: '#ff0000',
+        fontSize: 30,
         fontFamily: 'OPPOSANS',
         fontFamily: 'OPPOSANS',
         position: 'fixed',
         position: 'fixed',
-        left: width * 0.84,
-        top: width * 1.3,
+        left: width * 0.3,
+        top: width * 1.32,
       },
       },
     },
     },
     // #ifndef MP-WEIXIN
     // #ifndef MP-WEIXIN
@@ -96,7 +96,7 @@ const groupon = async (poster) => {
       text: poster.shareInfo.link,
       text: poster.shareInfo.link,
       css: {
       css: {
         position: 'fixed',
         position: 'fixed',
-        left: width * 0.5,
+        left: width * 0.75,
         top: width * 1.3,
         top: width * 1.3,
         width: width * 0.2,
         width: width * 0.2,
         height: width * 0.2,
         height: width * 0.2,

+ 84 - 92
sheep/components/s-title-block/s-title-block.vue

@@ -1,108 +1,100 @@
 <!-- 装修商品组件:标题栏 -->
 <!-- 装修商品组件:标题栏 -->
 <template>
 <template>
-	<view class="ss-title-wrap ss-flex ss-col-center" :class="[state.typeMap[data.textAlign]]" :style="[bgStyle, { marginLeft: `${data.space}px` }]">
-		<view class="title-content">
-			<!-- 主标题 -->
-			<view v-if="data.title" class="title-text" :style="[titleStyles]">{{ data.title }}</view>
-			<!-- 副标题 -->
-			<view v-if="data.description" :style="[descStyles]" class="sub-title-text">{{ data.description }}</view>
-		</view>
-		<!-- 查看更多 -->
-		<view v-if="data.more?.show" class="more-box ss-flex ss-col-center" @tap="sheep.$router.go(data.more.url)"
-			:style="{color: data.descriptionColor}">
-			<view class="more-text" v-if="data.more.type !== 'icon'">{{ data.more.text }} </view>
-			<text class="_icon-forward" v-if="data.more.type !== 'text'"></text>
-		</view>
-	</view>
+  <view
+    class="ss-title-wrap ss-flex ss-col-center"
+    :class="[state.typeMap[data.textAlign]]"
+    :style="[elStyles]"
+  >
+    <view class="title-content">
+      <!-- 主标题 -->
+      <view v-if="data.title" class="title-text" :style="[titleStyles]">{{ data.title }}</view>
+      <!-- 副标题 -->
+      <view v-if="data.description" :style="[descStyles]" class="sub-title-text">{{ data.description }}</view>
+    </view>
+    <!-- 查看更多 -->
+    <view v-if="data.more?.show" class="more-box ss-flex ss-col-center" @tap="sheep.$router.go(data.more.url)"
+          :style="{color: data.descriptionColor}">
+      <view class="more-text" v-if="data.more.type !== 'icon'">{{ data.more.text }} </view>
+      <text class="_icon-forward" v-if="data.more.type !== 'text'"></text>
+    </view>
+  </view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-	/**
-	 * 标题栏
-	 */
-	import {
-		reactive,
-		computed
-	} from 'vue';
-	import sheep from '@/sheep';
+  /**
+   * 标题栏
+   */
+  import { reactive } from 'vue';
+  import sheep from '@/sheep';
 
 
-	// 数据
-	const state = reactive({
-		typeMap: {
-			left: 'ss-row-left',
-			center: 'ss-row-center',
-		},
-	});
+  // 数据
+  const state = reactive({
+    typeMap: {
+      left: 'ss-row-left',
+      center: 'ss-row-center',
+    },
+  });
 
 
-	// 接收参数
-	const props = defineProps({
-		// 装修数据
-		data: {
-			type: Object,
-			default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-			type: Object,
-			default: () => ({}),
-		},
-	});
-	// 设置背景样式
-	const bgStyle = computed(() => {
-		// 直接从 props.styles 解构
-		const {
-			bgType,
-			bgImg,
-			bgColor
-		} = props.styles;
+  // 接收参数
+  const props = defineProps({
+    data: {
+      type: Object,
+      default() {},
+    },
+    styles: {
+      type: Object,
+      default() {},
+    },
+  });
 
 
-		// 根据 bgType 返回相应的样式
-		return {
-			background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
-		};
-	});
+  // 组件样式
+  const elStyles = {
+    background: `url(${sheep.$url.cdn(props.data.bgImgUrl)}) no-repeat top center / 100% auto`,
+    fontSize: `${props.data.titleSize}px`,
+    fontWeight: `${props.data.titleWeight}px`,
+  };
 
 
-	// 标题样式
-	const titleStyles = {
-		color: props.data.titleColor,
-		fontSize: `${props.data.titleSize}px`,
-		textAlign: props.data.textAlign
-	};
+  // 标题样式
+  const titleStyles = {
+    color: props.data.titleColor,
+    fontSize: `${props.data.titleSize}px`,
+    textAlign: props.data.textAlign
+  };
 
 
-	// 副标题
-	const descStyles = {
-		color: props.data.descriptionColor,
-		textAlign: props.data.textAlign,
-		fontSize: `${props.data.descriptionSize}px`,
-		fontWeight: `${props.data.descriptionWeight}px`,
-	};
+  // 副标题
+  const descStyles = {
+    color: props.data.descriptionColor,
+    textAlign: props.data.textAlign,
+    fontSize: `${props.data.descriptionSize}px`,
+    fontWeight: `${props.data.descriptionWeight}px`,
+  };
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-	.ss-title-wrap {
-		height: 80rpx;
-		position: relative;
+  .ss-title-wrap {
+    height: 80rpx;
+    position: relative;
 
 
-		.title-content {
-			.title-text {
-				font-size: 30rpx;
-				color: #333;
-			}
+    .title-content {
+      .title-text {
+        font-size: 30rpx;
+        color: #333;
+      }
 
 
-			.sub-title-text {
-				font-size: 22rpx;
-				color: #999;
-			}
-		}
+      .sub-title-text {
+        font-size: 22rpx;
+        color: #999;
+      }
+    }
 
 
-		.more-box {
-			white-space: nowrap;
-			font-size: 22rpx;
-			color: #999;
-			position: absolute;
-			top: 50%;
-			transform: translateY(-50%);
-			right: 20rpx;
-		}
-	}
-</style>
+    .more-box {
+      white-space: nowrap;
+      font-size: 22rpx;
+      color: #999;
+      position: absolute;
+      top: 50%;
+      transform: translateY(-50%);
+      right: 20rpx;
+    }
+  }
+</style>

+ 148 - 166
sheep/components/s-user-card/s-user-card.vue

@@ -1,185 +1,167 @@
 <!-- 装修用户组件:用户卡片 -->
 <!-- 装修用户组件:用户卡片 -->
 <template>
 <template>
-  <view class="ss-user-info-wrap ss-p-t-50" :style="[bgStyle, { marginLeft: `${data.space}px` }]">
-    <view class="ss-flex ss-col-center ss-row-between ss-m-b-20">
-      <view class="left-box ss-flex ss-col-center ss-m-l-36">
-        <view class="avatar-box ss-m-r-24">
-          <image class="avatar-img" :src="
+	<view class="ss-user-info-wrap ss-p-t-50">
+		<view class="ss-flex ss-col-center ss-row-between ss-m-b-20">
+			<view class="left-box ss-flex ss-col-center ss-m-l-36">
+				<view class="avatar-box ss-m-r-24">
+					<image class="avatar-img" :src="
               isLogin
               isLogin
                 ? sheep.$url.cdn(userInfo.avatar)
                 ? sheep.$url.cdn(userInfo.avatar)
-                : sheep.$url.static('/static/img/shop/default_avatar.png')"
-                 mode="aspectFill" @tap="sheep.$router.go('/pages/user/info')">
-          </image>
-        </view>
-        <view>
-          <view class="nickname-box ss-flex ss-col-center">
-            <view class="nick-name ss-m-r-20">{{ userInfo?.nickname || nickname }}</view>
-          </view>
-        </view>
-      </view>
-      <view class="right-box ss-m-r-52">
-        <button class="ss-reset-button" @tap="showShareModal">
-          <text class="sicon-qrcode"></text>
-        </button>
-      </view>
-    </view>
-
-    <!-- 提示绑定手机号 先隐藏 yudao 需要再修改 -->
-    <view
+                : sheep.$url.static('/static/img/shop/default_avatar.png')
+            " mode="aspectFill" @tap="sheep.$router.go('/pages/user/info')"></image>
+				</view>
+				<view>
+					<view class="nickname-box ss-flex ss-col-center">
+						<view class="nick-name ss-m-r-20">{{ userInfo?.nickname || nickname }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="right-box ss-m-r-52">
+				<button class="ss-reset-button" @tap="showShareModal">
+					<text class="sicon-qrcode"></text>
+				</button>
+			</view>
+		</view>
+
+		<!-- 提示绑定手机号 先隐藏 yudao 需要再修改 -->
+		<view
       class="bind-mobile-box ss-flex ss-row-between ss-col-center"
       class="bind-mobile-box ss-flex ss-row-between ss-col-center"
       v-if="isLogin && !userInfo.mobile"
       v-if="isLogin && !userInfo.mobile"
     >
     >
       <view class="ss-flex">
       <view class="ss-flex">
         <text class="cicon-mobile-o" />
         <text class="cicon-mobile-o" />
-        <view class="mobile-title ss-m-l-20"> 点击绑定手机号确保账户安全</view>
+        <view class="mobile-title ss-m-l-20"> 点击绑定手机号确保账户安全 </view>
       </view>
       </view>
       <button class="ss-reset-button bind-btn" @tap="onBind">去绑定</button>
       <button class="ss-reset-button bind-btn" @tap="onBind">去绑定</button>
     </view>
     </view>
-  </view>
+	</view>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-  /**
-   * 用户卡片
-   *
-   * @property {Number} leftSpace                  - 容器左间距
-   * @property {Number} rightSpace                  - 容器右间距
-   *
-   * @property {String} avatar          - 头像
-   * @property {String} nickname          - 昵称
-   * @property {String} vip              - 等级
-   * @property {String} collectNum        - 收藏数
-   * @property {String} likeNum          - 点赞数
-   *
-   *
-   */
-  import { computed } from 'vue';
-  import sheep from '@/sheep';
-  import {
-    showShareModal,
-    showAuthModal,
-  } from '@/sheep/hooks/useModal';
-
-  // 用户信息
-  const userInfo = computed(() => sheep.$store('user').userInfo);
-  console.log('用户信息', userInfo);
-
-  // 是否登录
-  const isLogin = computed(() => sheep.$store('user').isLogin);
-  // 接收参数
-  const props = defineProps({
-    // 装修数据
-    data: {
-      type: Object,
-      default: () => ({}),
-    },
-    // 装修样式
-    styles: {
-      type: Object,
-      default: () => ({}),
-    },
-    // 头像
-    avatar: {
-      type: String,
-      default: '',
-    },
-    nickname: {
-      type: String,
-      default: '请先登录',
-    },
-    vip: {
-      type: [String, Number],
-      default: '1',
-    },
-    collectNum: {
-      type: [String, Number],
-      default: '1',
-    },
-    likeNum: {
-      type: [String, Number],
-      default: '1',
-    },
-  });
-
-  // 设置背景样式
-  const bgStyle = computed(() => {
-    // 直接从 props.styles 解构
-    const { bgType, bgImg, bgColor } = props.styles;
-
-    // 根据 bgType 返回相应的样式
-    return {
-      background: bgType === 'img'
-        ? `url(${bgImg}) no-repeat top center / 100% 100%`
-        : bgColor,
-    };
-  });
-
-  // 绑定手机号
-  function onBind() {
-    showAuthModal('changeMobile');
-  }
+	/**
+	 * 用户卡片
+	 *
+	 * @property {Number} leftSpace 									- 容器左间距
+	 * @property {Number} rightSpace 									- 容器右间距
+	 *
+	 * @property {String} avatar 					- 头像
+	 * @property {String} nickname 					- 昵称
+	 * @property {String} vip		  				- 等级
+	 * @property {String} collectNum 				- 收藏数
+	 * @property {String} likeNum 					- 点赞数
+	 *
+	 *
+	 */
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import sheep from '@/sheep';
+	import {
+		showShareModal,
+		showAuthModal
+	} from '@/sheep/hooks/useModal';
+
+	// 用户信息
+	const userInfo = computed(() => sheep.$store('user').userInfo);
+	console.log('用户信息', userInfo)
+
+	// 是否登录
+	const isLogin = computed(() => sheep.$store('user').isLogin);
+	// 接收参数
+	const props = defineProps({
+		background: {
+			type: String,
+			default: '',
+		},
+		// 头像
+		avatar: {
+			type: String,
+			default: '',
+		},
+		nickname: {
+			type: String,
+			default: '请先登录',
+		},
+		vip: {
+			type: [String, Number],
+			default: '1',
+		},
+		collectNum: {
+			type: [String, Number],
+			default: '1',
+		},
+		likeNum: {
+			type: [String, Number],
+			default: '1',
+		},
+	});
+
+	function onBind() {
+		showAuthModal('changeMobile');
+	}
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-  .ss-user-info-wrap {
-    box-sizing: border-box;
-
-    .avatar-box {
-      width: 100rpx;
-      height: 100rpx;
-      border-radius: 50%;
-      overflow: hidden;
-
-      .avatar-img {
-        width: 100%;
-        height: 100%;
-      }
-    }
-
-    .nick-name {
-      font-size: 34rpx;
-      font-weight: 400;
-      color: #333333;
-      line-height: normal;
-    }
-
-    .vip-img {
-      width: 30rpx;
-      height: 30rpx;
-    }
-
-    .sicon-qrcode {
-      font-size: 40rpx;
-    }
-  }
-
-  .bind-mobile-box {
-    width: 100%;
-    height: 84rpx;
-    padding: 0 34rpx 0 44rpx;
-    box-sizing: border-box;
-    background: #ffffff;
-    box-shadow: 0px -8rpx 9rpx 0px rgba(#e0e0e0, 0.3);
-
-    .cicon-mobile-o {
-      font-size: 30rpx;
-      color: #ff690d;
-    }
-
-    .mobile-title {
-      font-size: 24rpx;
-      font-weight: 500;
-      color: #ff690d;
-    }
-
-    .bind-btn {
-      width: 100rpx;
-      height: 50rpx;
-      background: #ff6100;
-      border-radius: 25rpx;
-      font-size: 24rpx;
-      font-weight: 500;
-      color: #ffffff;
-    }
-  }
+	.ss-user-info-wrap {
+		box-sizing: border-box;
+
+		.avatar-box {
+			width: 100rpx;
+			height: 100rpx;
+			border-radius: 50%;
+			overflow: hidden;
+
+			.avatar-img {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.nick-name {
+			font-size: 34rpx;
+			font-weight: 400;
+			color: #333333;
+			line-height: normal;
+		}
+
+		.vip-img {
+			width: 30rpx;
+			height: 30rpx;
+		}
+
+		.sicon-qrcode {
+			font-size: 40rpx;
+		}
+	}
+
+	.bind-mobile-box {
+		width: 100%;
+		height: 84rpx;
+		padding: 0 34rpx 0 44rpx;
+		box-sizing: border-box;
+		background: #ffffff;
+		box-shadow: 0px -8rpx 9rpx 0px rgba(#e0e0e0, 0.3);
+
+		.cicon-mobile-o {
+			font-size: 30rpx;
+			color: #ff690d;
+		}
+
+		.mobile-title {
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #ff690d;
+		}
+
+		.bind-btn {
+			width: 100rpx;
+			height: 50rpx;
+			background: #ff6100;
+			border-radius: 25rpx;
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #ffffff;
+		}
+	}
 </style>
 </style>

+ 2 - 28
sheep/components/s-wallet-card/s-wallet-card.vue

@@ -1,6 +1,6 @@
 <!-- 装修用户组件:用户资产 -->
 <!-- 装修用户组件:用户资产 -->
 <template>
 <template>
-	<view class="ss-wallet-menu-wrap ss-flex ss-col-center" :style="[bgStyle, { marginLeft: `${data.space}px` }]">
+	<view class="ss-wallet-menu-wrap ss-flex ss-col-center">
 		<view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
 		<view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
 			@tap="sheep.$router.go('/pages/user/wallet/money')">
 			@tap="sheep.$router.go('/pages/user/wallet/money')">
 			<view class="value-box ss-flex ss-col-bottom">
 			<view class="value-box ss-flex ss-col-bottom">
@@ -42,34 +42,8 @@
 	 */
 	 */
 	import { computed } from 'vue';
 	import { computed } from 'vue';
 	import sheep from '@/sheep';
 	import sheep from '@/sheep';
-	import { fen2yuan } from '../../hooks/useGoods';
+  import { fen2yuan } from '../../hooks/useGoods';
 
 
-	// 接收参数
-	const props = defineProps({
-		// 装修数据
-		data: {
-		  type: Object,
-		  default: () => ({}),
-		},
-		// 装修样式
-		styles: {
-		  type: Object,
-		  default: () => ({}),
-		},
-	});
-	// 设置背景样式
-	const bgStyle = computed(() => {
-	  // 直接从 props.styles 解构
-	  const { bgType, bgImg, bgColor } = props.styles; 
-	
-	  // 根据 bgType 返回相应的样式
-	  return {
-		background: bgType === 'img'
-			? `url(${bgImg}) no-repeat top center / 100% 100%`
-			: bgColor
-		};
-	});
-	
 	const userWallet = computed(() => sheep.$store('user').userWallet);
 	const userWallet = computed(() => sheep.$store('user').userWallet);
 	const userInfo = computed(() => sheep.$store('user').userInfo);
 	const userInfo = computed(() => sheep.$store('user').userInfo);
 	const numData = computed(() => sheep.$store('user').numData);
 	const numData = computed(() => sheep.$store('user').numData);

+ 17 - 0
sheep/components/uni-indexed-list/changelog.md

@@ -0,0 +1,17 @@
+## 1.2.1(2021-11-22)
+- 修复 vue3中某些scss变量无法找到的问题
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-indexed-list](https://uniapp.dcloud.io/component/uniui/uni-indexed-list)
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.11(2021-05-12)
+- 新增 组件示例地址
+## 1.0.10(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 1.0.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+
+## 1.0.8(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端

+ 144 - 0
sheep/components/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue

@@ -0,0 +1,144 @@
+<template>
+	<view>
+		<view v-if="loaded || list.itemIndex < 15" class="uni-indexed-list__title-wrapper">
+			<text v-if="list.items && list.items.length > 0" class="uni-indexed-list__title">{{ list.key }}</text>
+		</view>
+		<view v-if="(loaded || list.itemIndex < 15) && list.items && list.items.length > 0" class="uni-indexed-list__list">
+			<view v-for="(item, index) in list.items" :key="index" class="uni-indexed-list__item" hover-class="uni-indexed-list__item--hover">
+				<view class="uni-indexed-list__item-container" @click="onClick(idx, index)">
+					<view class="uni-indexed-list__item-border" :class="{'uni-indexed-list__item-border--last':index===list.items.length-1}">
+						<view v-if="showSelect" style="margin-right: 20rpx;">
+							<uni-icons :type="item.checked ? 'checkbox-filled' : 'circle'" :color="item.checked ? '#007aff' : '#C0C0C0'" size="24" />
+						</view>
+						<text class="uni-indexed-list__item-content">{{ item.name }}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniIndexedList',
+		emits:['itemClick'],
+		props: {
+			loaded: {
+				type: Boolean,
+				default: false
+			},
+			idx: {
+				type: Number,
+				default: 0
+			},
+			list: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			showSelect: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			onClick(idx, index) {
+				this.$emit("itemClick", {
+					idx,
+					index
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-indexed-list__list {
+		background-color: $uni-bg-color;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		border-top-style: solid;
+		border-top-width: 1px;
+		border-top-color: #DEDEDE;
+	}
+
+	.uni-indexed-list__item {
+		font-size: 14px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.uni-indexed-list__item-container {
+		padding-left: 15px;
+		flex: 1;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-indexed-list__item-border {
+		flex: 1;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+		height: 50px;
+		padding: 25px;
+		padding-left: 0;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+		border-bottom-color:  #DEDEDE;
+	}
+
+	.uni-indexed-list__item-border--last {
+		border-bottom-width: 0px;
+	}
+
+	.uni-indexed-list__item-content {
+		flex: 1;
+		font-size: 14px;
+		color: #191919;
+	}
+
+	.uni-indexed-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-indexed-list__title-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		width: 100%;
+		/* #endif */
+		background-color: #f7f7f7;
+	}
+
+	.uni-indexed-list__title {
+		padding: 6px 12px;
+		line-height: 24px;
+		font-size: 16px;
+		font-weight: 500;
+	}
+</style>

+ 367 - 0
sheep/components/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue

@@ -0,0 +1,367 @@
+<template>
+	<view class="uni-indexed-list" ref="list" id="list">
+		<!-- #ifdef APP-NVUE -->
+		<list class="uni-indexed-list__scroll" scrollable="true" show-scrollbar="false">
+			<cell v-for="(list, idx) in lists" :key="idx" :ref="'uni-indexed-list-' + idx">
+				
+				<!-- #ifndef APP-NVUE -->
+				<scroll-view :scroll-into-view="scrollViewId" class="uni-indexed-list__scroll" scroll-y>
+					<view v-for="(list, idx) in lists" :key="idx" :id="'uni-indexed-list-' + idx">
+						<!-- #endif -->
+						<indexed-list-item :list="list" :loaded="loaded" :idx="idx" :showSelect="showSelect"
+							@itemClick="onClick"></indexed-list-item>
+						<!-- #ifndef APP-NVUE -->
+					</view>
+				</scroll-view>
+				<!-- #endif -->
+				
+			</cell>
+		</list>
+		<!-- #endif -->
+		<view class="uni-indexed-list__menu" @touchstart="touchStart" @touchmove.stop.prevent="touchMove"
+			@touchend="touchEnd" @mousedown.stop="mousedown" @mousemove.stop.prevent="mousemove"
+			@mouseleave.stop="mouseleave">
+			<view v-for="(list, key) in lists" :key="key" class="uni-indexed-list__menu-item"
+				:class="touchmoveIndex == key ? 'uni-indexed-list__menu--active' : ''">
+				<text class="uni-indexed-list__menu-text"
+					:class="touchmoveIndex == key ? 'uni-indexed-list__menu-text--active' : ''">{{ list.key }}</text>
+			</view>
+		</view>
+		<view v-if="touchmove" class="uni-indexed-list__alert-wrapper">
+			<text class="uni-indexed-list__alert">{{ lists[touchmoveIndex].key }}</text>
+		</view>
+	</view>
+</template>
+<script>
+	import indexedListItem from './uni-indexed-list-item.vue'
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom');
+	// #endif
+	// #ifdef APP-PLUS
+	function throttle(func, delay) {
+		var prev = Date.now();
+		return function() {
+			var context = this;
+			var args = arguments;
+			var now = Date.now();
+			if (now - prev >= delay) {
+				func.apply(context, args);
+				prev = Date.now();
+			}
+		}
+	}
+
+	function touchMove(e) {
+		let pageY = e.touches[0].pageY
+		let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+		if (this.touchmoveIndex === index) {
+			return false
+		}
+		let item = this.lists[index]
+		if (item) {
+			// #ifndef APP-NVUE
+			this.scrollViewId = 'uni-indexed-list-' + index
+			this.touchmoveIndex = index
+			// #endif
+			// #ifdef APP-NVUE
+			dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
+				animated: false
+			})
+			this.touchmoveIndex = index
+			// #endif
+		}
+	}
+	const throttleTouchMove = throttle(touchMove, 40)
+	// #endif
+
+	/**
+	 * IndexedList 索引列表
+	 * @description 用于展示索引列表
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=375
+	 * @property {Boolean} showSelect = [true|false] 展示模式
+	 * 	@value true 展示模式
+	 * 	@value false 选择模式
+	 * @property {Object} options 索引列表需要的数据对象
+	 * @event {Function} click 点击列表事件 ,返回当前选择项的事件对象
+	 * @example <uni-indexed-list options="" showSelect="false" @click=""></uni-indexed-list>
+	 */
+	export default {
+		name: 'UniIndexedList',
+		components: {
+			indexedListItem
+		},
+		emits: ['click'],
+		props: {
+			options: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			showSelect: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				lists: [],
+				winHeight: 0,
+				itemHeight: 0,
+				winOffsetY: 0,
+				touchmove: false,
+				touchmoveIndex: -1,
+				scrollViewId: '',
+				touchmovable: true,
+				loaded: false,
+				isPC: false
+			}
+		},
+		watch: {
+			options: {
+				handler: function() {
+					this.setList()
+				},
+				deep: true
+			}
+		},
+		mounted() {
+			// #ifdef H5
+			this.isPC = this.IsPC()
+			// #endif
+			setTimeout(() => {
+				this.setList()
+			}, 50)
+			setTimeout(() => {
+				this.loaded = true
+			}, 300);
+		},
+		methods: {
+			setList() {
+				let index = 0;
+				this.lists = []
+				this.options.forEach((value, index) => {
+					if (value.data.length === 0) {
+						return
+					}
+					let indexBefore = index
+					let items = value.data.map(item => {
+						let obj = {}
+						obj['key'] = value.letter
+						obj['name'] = item
+						obj['itemIndex'] = index
+						index++
+						obj.checked = item.checked ? item.checked : false
+						return obj
+					})
+					this.lists.push({
+						title: value.letter,
+						key: value.letter,
+						items: items,
+						itemIndex: indexBefore
+					})
+				})
+				// #ifndef APP-NVUE
+				uni.createSelectorQuery()
+					.in(this)
+					.select('#list')
+					.boundingClientRect()
+					.exec(ret => {
+						this.winOffsetY = ret[0].top
+						this.winHeight = ret[0].height
+						this.itemHeight = this.winHeight / this.lists.length
+					})
+				// #endif
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['list'], (res) => {
+					this.winOffsetY = res.size.top
+					this.winHeight = res.size.height
+					this.itemHeight = this.winHeight / this.lists.length
+				})
+				// #endif
+			},
+			touchStart(e) {
+				this.touchmove = true
+				let pageY = this.isPC ? e.pageY : e.touches[0].pageY
+				let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+				let item = this.lists[index]
+				if (item) {
+					this.scrollViewId = 'uni-indexed-list-' + index
+					this.touchmoveIndex = index
+					// #ifdef APP-NVUE
+					dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
+						animated: false
+					})
+					// #endif
+				}
+			},
+			touchMove(e) {
+				// #ifndef APP-PLUS
+				let pageY = this.isPC ? e.pageY : e.touches[0].pageY
+				let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+				if (this.touchmoveIndex === index) {
+					return false
+				}
+				let item = this.lists[index]
+				if (item) {
+					this.scrollViewId = 'uni-indexed-list-' + index
+					this.touchmoveIndex = index
+				}
+				// #endif
+				// #ifdef APP-PLUS
+				throttleTouchMove.call(this, e)
+				// #endif
+			},
+			touchEnd() {
+				this.touchmove = false
+				// this.touchmoveIndex = -1
+			},
+
+			/**
+			 * 兼容 PC @tian
+			 */
+
+			mousedown(e) {
+				if (!this.isPC) return
+				this.touchStart(e)
+			},
+			mousemove(e) {
+				if (!this.isPC) return
+				this.touchMove(e)
+			},
+			mouseleave(e) {
+				if (!this.isPC) return
+				this.touchEnd(e)
+			},
+
+			// #ifdef H5
+			IsPC() {
+				var userAgentInfo = navigator.userAgent;
+				var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+				var flag = true;
+				for (let v = 0; v < Agents.length - 1; v++) {
+					if (userAgentInfo.indexOf(Agents[v]) > 0) {
+						flag = false;
+						break;
+					}
+				}
+				return flag;
+			},
+			// #endif
+
+
+			onClick(e) {
+				let {
+					idx,
+					index
+				} = e
+				let obj = {}
+				for (let key in this.lists[idx].items[index]) {
+					obj[key] = this.lists[idx].items[index][key]
+				}
+				let select = []
+				if (this.showSelect) {
+					this.lists[idx].items[index].checked = !this.lists[idx].items[index].checked
+					this.lists.forEach((value, idx) => {
+						value.items.forEach((item, index) => {
+							if (item.checked) {
+								let obj = {}
+								for (let key in this.lists[idx].items[index]) {
+									obj[key] = this.lists[idx].items[index][key]
+								}
+								select.push(obj)
+							}
+						})
+					})
+				}
+				this.$emit('click', {
+					item: obj,
+					select: select
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-indexed-list {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-indexed-list__scroll {
+		flex: 1;
+	}
+
+	.uni-indexed-list__menu {
+		width: 24px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-indexed-list__menu-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		align-items: center;
+		justify-content: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-indexed-list__menu-text {
+		font-size: 12px;
+		text-align: center;
+		color: #aaa;
+	}
+
+	.uni-indexed-list__menu--active {
+		// background-color: rgb(200, 200, 200);
+	}
+
+	.uni-indexed-list__menu--active {}
+
+	.uni-indexed-list__menu-text--active {
+		border-radius: 16px;
+		width: 16px;
+		height: 16px;
+		line-height: 16px;
+		background-color: #007aff;
+		color: #fff;
+	}
+
+	.uni-indexed-list__alert-wrapper {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-indexed-list__alert {
+		width: 80px;
+		height: 80px;
+		border-radius: 80px;
+		text-align: center;
+		line-height: 80px;
+		font-size: 35px;
+		color: #fff;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+</style>

+ 89 - 0
sheep/components/uni-indexed-list/package.json

@@ -0,0 +1,89 @@
+{
+  "id": "uni-indexed-list",
+  "displayName": "uni-indexed-list 索引列表",
+  "version": "1.2.1",
+  "description": "索引列表组件,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景",
+  "keywords": [
+    "uni-ui",
+    "索引列表",
+    "索引",
+    "列表"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
sheep/components/uni-indexed-list/readme.md

@@ -0,0 +1,11 @@
+
+
+## IndexedList 索引列表
+> **组件名:uni-indexed-list**
+> 代码块: `uIndexedList`
+
+
+用于展示索引列表。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-indexed-list)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 1 - 1
sheep/libs/sdk-h5-weixin.js

@@ -78,7 +78,7 @@ export default {
     });
     });
   },
   },
 
 
-  // 获取微信收货地址
+  //获取微信收货地址 TODO 芋艿:未测试
   openAddress(callback) {
   openAddress(callback) {
     this.isReady(() => {
     this.isReady(() => {
       jweixin.openAddress({
       jweixin.openAddress({

+ 1 - 0
sheep/platform/provider/wechat/miniProgram.js

@@ -53,6 +53,7 @@ const mobileLogin = async (e) => {
     } else {
     } else {
       return resolve(false);
       return resolve(false);
     }
     }
+    // TODO 芋艿:shareInfo: uni.getStorageSync('shareLog') || {},
   });
   });
 };
 };
 
 

+ 1 - 0
sheep/platform/provider/wechat/officialAccount.js

@@ -24,6 +24,7 @@ async function login(code = '', state = '') {
     // 解密 code 发起登陆
     // 解密 code 发起登陆
     const loginResult = await AuthUtil.socialLogin(socialType, code, state);
     const loginResult = await AuthUtil.socialLogin(socialType, code, state);
     if (loginResult.code === 0) {
     if (loginResult.code === 0) {
+      // TODO 芋艿:shareLog
       setOpenid(loginResult.data.openid);
       setOpenid(loginResult.data.openid);
       return loginResult;
       return loginResult;
     }
     }

+ 0 - 2
sheep/router/index.js

@@ -47,9 +47,7 @@ const _go = (
       query = paramsToQuery(path.params);
       query = paramsToQuery(path.params);
     }
     }
   }
   }
-
   const nextRoute = ROUTES_MAP[page];
   const nextRoute = ROUTES_MAP[page];
-
   // 未找到指定跳转页面
   // 未找到指定跳转页面
   // mark: 跳转404页
   // mark: 跳转404页
   if (!nextRoute) {
   if (!nextRoute) {

+ 87 - 1
sheep/scss/_tools.scss

@@ -16,7 +16,14 @@
   flex-direction: row;
   flex-direction: row;
   align-items: center;
   align-items: center;
 }
 }
-
+.ss-flex-2{
+	display: flex;
+	flex-wrap: nowrap;
+}
+.ss-flex-3{
+	display: flex;
+	flex-wrap: wrap;
+}
 .ss-flex-1 {
 .ss-flex-1 {
   flex: 1;
   flex: 1;
 }
 }
@@ -87,6 +94,85 @@
 .ss-w-100 {
 .ss-w-100 {
   width: 100%;
   width: 100%;
 }
 }
+// 字体样式
+.ss-font-1{
+	font-size: 20rpx;
+}
+.ss-font-2{
+	font-size: 24rpx;
+}
+.ss-font-3{
+	font-size: 28rpx;
+}
+.ss-font-4{
+	font-size: 32rpx;
+}
+.ss-font-5{
+	font-size: 36rpx;
+}
+// 左边距
+.ss-margin-left1{
+	margin-left: 2.5%;
+}
+.ss-margin-left2{
+	margin-left: 5%;
+}
+.ss-margin-left3{
+	margin-left: 10%;
+}
+.ss-margin-left4{
+	margin-left: 10rpx;
+}
+.ss-margin-left5{
+	margin-left: 15rpx;
+}
+.ss-margin-left6{
+	margin-left: 20rpx;
+}
+.ss-margin-left7{
+	margin-left: 40rpx;
+}
+// 右边距
+.ss-margin-right{
+	margin-right: 2.5%;
+}
+.ss-margin-width{
+	width:90%;
+	margin-left: 5%;
+}
+.ss-margin-width2{
+	width:95%;
+	margin-left: 2.5%;
+}
+// 内边距
+.ss-margin-top1{
+	padding-top: 5%;
+}
+.ss-margin-top2{
+	padding-top: 10%;
+}
+.ss-margin-top3{
+	padding-top: 15%;
+}
+.ss-margin-top4{
+	padding-top: 20%;
+}
+.ss-margin-top5{
+	padding-top: 10rpx;
+}
+.ss-margin-top6{
+	padding-top: 15rpx;
+}
+.box-sizing{
+	box-sizing: border-box;
+}
+// 首页滚动区域
+.scroll-box{
+	width:95%;
+	height: 440rpx;
+	margin-left:2.5%;
+	position: relative;
+}
 
 
 /* ==================
 /* ==================
 
 

+ 2 - 0
sheep/store/app.js

@@ -110,10 +110,12 @@ const app = defineStore({
 
 
 // todo: @owen 先做数据适配,后期重构
 // todo: @owen 先做数据适配,后期重构
 const adaptTemplate = async (appTemplate, templateId) => {
 const adaptTemplate = async (appTemplate, templateId) => {
+	console.log(appTemplate, templateId,'ppppppppppppppppppppppppppp');
   const { data: diyTemplate } = templateId
   const { data: diyTemplate } = templateId
       // 查询指定模板,一般是预览时使用
       // 查询指定模板,一般是预览时使用
       ? await DiyApi.getDiyTemplate(templateId)
       ? await DiyApi.getDiyTemplate(templateId)
       : await DiyApi.getUsedDiyTemplate();
       : await DiyApi.getUsedDiyTemplate();
+	console.log(diyTemplate,'uuuuuuuuuuuuuuu')
   // 模板不存在
   // 模板不存在
   if (!diyTemplate) {
   if (!diyTemplate) {
     $router.error('TemplateError');
     $router.error('TemplateError');

+ 1 - 7
sheep/store/cart.js

@@ -57,13 +57,7 @@ const cart = defineStore({
 
 
     // 移除购物车
     // 移除购物车
     async delete(ids) {
     async delete(ids) {
-      let idsTemp = '';
-      if (Array.isArray(ids)) {
-        idsTemp = ids.join(',');
-      } else {
-        idsTemp = ids;
-      }
-      const { code } = await CartApi.deleteCart(idsTemp);
+      const { code } = await CartApi.deleteCart(ids.join(','));
       if (code === 0) {
       if (code === 0) {
         await this.getList();
         await this.getList();
       }
       }

二進制
static/homePage/banner.png


二進制
static/homePage/bluehuo.png


二進制
static/homePage/bluexing.png


二進制
static/homePage/daka.png


二進制
static/homePage/daodian.png


二進制
static/homePage/fuwumeinv.png


二進制
static/homePage/huiyuan.png


二進制
static/homePage/jiantou.png


二進制
static/homePage/kuaijie.png


二進制
static/homePage/topbg.png


二進制
static/homePage/tuijianmeinv.png


二進制
static/homePage/xingxiang.png


二進制
static/homePage/yaoqing.png


二進制
static/homePage/youhui.png


二進制
static/homePage/yuyue.png


二進制
static/homePage/zhaopin.png


二進制
static/icon/logo.png


二進制
static/lanhu_shouye/0ec6b37287b9470080da66761c7acb4a_mergeImage.png


二進制
static/lanhu_shouye/2d4bbfdd92454ce390099cd0b3f4827d_mergeImage.png


二進制
static/lanhu_shouye/3669348c89e1484195ead2a693641ad0_mergeImage.png


二進制
static/lanhu_shouye/451866d9f9cb44489db11b3cbd64a143_mergeImage.png


二進制
static/lanhu_shouye/46bef50168b84fd6aaa29f4bcc551759_mergeImage.png


二進制
static/lanhu_shouye/4c0d58d0a0d147ac90adec9fb0bfec0f_mergeImage.png


二進制
static/lanhu_shouye/61f5a7931f9d41caafd7d60ec1efadb4_mergeImage.png


二進制
static/lanhu_shouye/6461e1be91dd49c48afbbacf664a38ec_mergeImage.png


二進制
static/lanhu_shouye/b0a7586b65a246f2bff8db2d14c75dc7_mergeImage.png


二進制
static/lanhu_shouye/bb556fbbdb6f445a803ffd791c4e1828_mergeImage.png


二進制
static/lanhu_shouye/f0d5117be4674fabb67af2a48e47e61d_mergeImage.png


二進制
static/lanhu_shouye/f7c0cc7e4bf5466eabb649ece6ae5387_mergeImage.png


二進制
static/lanhu_shouye/ps0dhzp8mouy2fgg4wjrd1occoeoz6lpggv29d19aa8-0234-4d9a-a8ce-3eba8e673e37.png


二進制
static/lanhu_shouye/ps0vh4ynl7euk8tr5085ssz6cwdxhgrc88546f1cb-9ff7-4fe6-b279-aa56bcaee33a.png


二進制
static/lanhu_shouye/ps1usx472izy70hbl1zx7zonjy7ztk3vsi3683e223-4f2a-4e52-a167-9af2d9a4e79f.png


二進制
static/lanhu_shouye/ps2jgtolcfpxrovgv4adbklqfxs0xdn68bb0461c-c52e-4a9b-9f55-d3fcac902e80.png


二進制
static/lanhu_shouye/ps2yolsy1y0pxtp297vmupv7fxe0pvaeicab4022b-c8e2-4e8a-898f-4405b339cf56.png


二進制
static/lanhu_shouye/ps2zpqvud3mxhwheywygapp9g19kb1updi7dfbf1994-e810-4126-a2f3-f00af23a4005.png


二進制
static/lanhu_shouye/ps3qdk2eqfqpnxb4ltlu7q91xhck6f8mrn583d40d1-2215-4158-9f2d-25a57f1d7bf1.png


二進制
static/lanhu_shouye/ps3rnhf0h3f5tfy1i6sxykaab8eb5bd4ku4f04db045-528b-4b23-b99e-a05eb5b2464d.png


二進制
static/lanhu_shouye/ps3yktsnfyp9q184m0n2oddbamta7j2rm6dbd4d680-54bf-471c-9792-c05398a3ed32.png


二進制
static/lanhu_shouye/ps45z8ynos8u6p0hlyciknnu9trq6jgvec6ac864-6e48-46fc-a850-9e88158e568c.png


二進制
static/lanhu_shouye/ps49z053zwc0kbyz0iam0zq76lbo6l4uzus8737a25a-aff7-4c57-a127-84a2a6bf4556.png


二進制
static/lanhu_shouye/ps4lxmxswmym348u236aywai6tkiitmmjo2be9cfc4-22a7-485c-8dc6-0301488c7b60.png


二進制
static/lanhu_shouye/ps67q18priosurl11ywweaocdrtqikryfd45653430-437f-4239-8eab-7efc9d56f509.png


部分文件因文件數量過多而無法顯示