Преглед изворни кода

代码”

git commit -m 代码”
liujiaxin пре 1 месец
родитељ
комит
fb3b2d170e
84 измењених фајлова са 14865 додато и 4826 уклоњено
  1. 1 0
      common/request.js
  2. 13 10
      components/Server.vue
  3. 222 0
      components/StatisticsTable.vue
  4. 143 0
      components/evan-switch.vue
  5. 41 6
      package-lock.json
  6. 1 0
      package.json
  7. 230 315
      pages.json
  8. 212 0
      pages/auth/changePassword.vue
  9. 271 0
      pages/auth/forgetPassword.vue
  10. 715 658
      pages/auth/login.vue
  11. 132 0
      pages/auth/setting.vue
  12. 1 1
      pages/common/launch.vue
  13. 2649 0
      pages/home/index - 副本.vue
  14. 75 2576
      pages/home/index.vue
  15. 270 384
      pages/user/index.vue
  16. 888 566
      pages_echarts/statistics.vue
  17. 22 0
      pages_speaker/createTask - 副本.vue
  18. 864 0
      pages_speaker/index.vue
  19. 199 0
      pages_speaker/speakerInvitation.vue
  20. 748 0
      pages_task/approvalCenter.vue
  21. 785 0
      pages_task/approvalTaskDetail.vue
  22. 628 0
      pages_task/components/TaskBelongingPicker.vue
  23. 312 0
      pages_task/components/step.vue
  24. 731 0
      pages_task/createTask.vue
  25. 640 0
      pages_task/editSelectCustomer.vue
  26. 915 0
      pages_task/fillTask.vue
  27. 669 0
      pages_task/pointsSettings.vue
  28. 534 0
      pages_task/selectCustomer.vue
  29. 76 0
      pages_task/success.vue
  30. 575 310
      pages_task/taskDetail.vue
  31. 897 0
      pages_task/xlTask.vue
  32. 406 0
      pages_user/userInfo.vue
  33. BIN
      static/image/approval.png
  34. BIN
      static/image/back_white.png
  35. BIN
      static/image/bg_bench.png
  36. BIN
      static/image/bg_invitecard.png
  37. BIN
      static/image/bg_login.png
  38. BIN
      static/image/bg_mine.png
  39. BIN
      static/image/bg_qestion.png
  40. BIN
      static/image/btn_bl.png
  41. BIN
      static/image/icon_approval_no.png
  42. BIN
      static/image/icon_approval_yes.png
  43. BIN
      static/image/icon_attachment.png
  44. BIN
      static/image/icon_camera.png
  45. BIN
      static/image/icon_circle.png
  46. BIN
      static/image/icon_circle_sel.png
  47. BIN
      static/image/icon_clear.png
  48. BIN
      static/image/icon_close.png
  49. BIN
      static/image/icon_delete.png
  50. BIN
      static/image/icon_down.png
  51. BIN
      static/image/icon_downlad.png
  52. BIN
      static/image/icon_expand.png
  53. BIN
      static/image/icon_hospital.png
  54. BIN
      static/image/icon_img_delete.png
  55. BIN
      static/image/icon_invite.png
  56. BIN
      static/image/icon_like.png
  57. BIN
      static/image/icon_my_information.png
  58. BIN
      static/image/icon_my_set.png
  59. BIN
      static/image/icon_pass.png
  60. BIN
      static/image/icon_refuse.png
  61. BIN
      static/image/icon_right.png
  62. BIN
      static/image/icon_share.png
  63. BIN
      static/image/icon_step_done.png
  64. BIN
      static/image/icon_task_kzkt.png
  65. BIN
      static/image/icon_task_wjdc.png
  66. BIN
      static/image/icon_task_yydy.png
  67. BIN
      static/image/icon_user.png
  68. BIN
      static/image/icon_wait.png
  69. BIN
      static/image/icon_wrong.png
  70. BIN
      static/image/img_admitsuccess.png
  71. BIN
      static/image/img_example1.png
  72. BIN
      static/image/img_example2.png
  73. BIN
      static/image/img_example3.png
  74. BIN
      static/image/img_example4 (1).png
  75. BIN
      static/image/img_example4 (2).png
  76. BIN
      static/image/img_example4.png
  77. BIN
      static/image/img_finished.png
  78. BIN
      static/image/img_nocard.png
  79. BIN
      static/image/img_title.png
  80. BIN
      static/image/img_unfinish.png
  81. 0 0
      static/image/my_heads_icon.png
  82. BIN
      static/image/search.png
  83. BIN
      static/image/speaker.png
  84. BIN
      static/image/xl.png

+ 1 - 0
common/request.js

@@ -5,6 +5,7 @@ export default class Request {
 		// let path = 'http://e767647f.natappfree.cc';
 		// let path = 'https://user.test.ylrztop.com/api'; //测试
 		let path = 'https://api.homemdt.net'; //正式
+		
 		// let path = "https://api.qinggetai.com"
 	    // console.log(router,'router')
 		//用户模块

+ 13 - 10
components/Server.vue

@@ -9,11 +9,8 @@
 			@touchend="onTouchEnd"
 		>
 			<view class="serve-content">
-				<image class="w120 h120"
-					src="@/static/image/btn_sjtj.png"
-					mode="aspectFit"></image>
-				<!-- <text class="text">客服投诉</text> -->
-				<!-- <button class="contact-btn" open-type="contact"></button> -->
+				<view>邀请</view>
+				<view>讲者</view>
 			</view>
 		</view>
 	</view>
@@ -40,7 +37,7 @@
 		methods: {
 			navTo(){
 				uni.navigateTo({
-					url: '/pages_echarts/statistics'
+					url: '/pages_speaker/speakerInvitation'
 				})
 			},
 			// 初始化位置
@@ -172,9 +169,13 @@
 .serve{
 	position: fixed;
 	z-index: 9999;
-	width: 150rpx;
-	height: 150rpx;
-	
+	// width: 150rpx;
+	// height: 150rpx;
+	width: 96rpx;
+	height: 96rpx;
+	background: linear-gradient( 0deg, #388BFF 0%, #388BFF 100%);
+	box-shadow: inset 0rpx 4rpx 8rpx 0rpx rgba(255,255,255,0.25), inset 0rpx -6rpx 8rpx 0rpx rgba(255,255,255,0.25), 4rpx 8rpx 12rpx 0rpx rgba(88,144,239,0.29);
+	border-radius: 110rpx 110rpx 110rpx 110rpx;
 	// 确保拖拽时不影响其他元素
 	touch-action: none;
 	user-select: none;
@@ -188,7 +189,9 @@
 		align-items: center;
 		justify-content: center;
 		position: relative;
-		
+		font-weight: 500;
+		font-size: 24rpx;
+		color: #FFFFFF;
 		// 拖拽时的视觉反馈
 		&:active {
 			opacity: 0.9;

+ 222 - 0
components/StatisticsTable.vue

@@ -0,0 +1,222 @@
+<template>
+  <scroll-view class="content" scroll-y @scrolltolower="loadMore">
+    <!-- 数据汇总 -->
+    <view class="summary-section x-bc">
+      <view class="summary-header">
+        <view class="summary-indicator"></view>
+        <text class="summary-title">{{ summaryTitle }}</text>
+      </view>
+      <view class="summary-stats">
+        <view class="stat-item" v-for="stat in summaryStats" :key="stat.label">
+          <text class="stat-label">{{ stat.label }}</text>
+          <text class="stat-value">{{ stat.value }}</text>
+        </view>
+      </view>
+    </view>
+    
+    <!-- 数据表格 -->
+    <view class="table-section">
+      <view class="table-header">
+        <view 
+          class="table-col" 
+          v-for="(column, index) in columns" 
+          :key="index"
+          :style="{ width: column.width }"
+        >
+          {{ column.title }}
+        </view>
+      </view>
+      <view class="table-body">
+        <view class="table-row" v-for="(item, index) in tableData" :key="index">
+          <view 
+            class="table-col" 
+            v-for="(column, colIndex) in columns" 
+            :key="colIndex"
+            :style="{ width: column.width }"
+          >
+            <!-- 使用渲染函数或条件判断代替动态插槽 -->
+            <template v-if="column.key === 'statusText' && column.slot">
+              <slot name="statusText" :item="item" :index="index">
+                {{ item[column.key] }}
+              </slot>
+            </template>
+            <template v-else-if="column.key === 'operation' && column.slot">
+              <slot name="operation" :item="item" :index="index">
+                {{ item[column.key] }}
+              </slot>
+            </template>
+            <template v-else>
+              {{ item[column.key] }}
+            </template>
+          </view>
+        </view>
+      </view>
+    </view>
+    
+    <!-- 底部提示 -->
+    <!-- <view class="no-more" v-if="showNoMore">{{ noMoreText }}</view> -->
+  </scroll-view>
+</template>
+<script>
+export default {
+  name: 'StatisticsTable',
+  props: {
+    // 汇总标题
+    summaryTitle: {
+      type: String,
+      default: '数据汇总'
+    },
+    // 汇总统计数据
+    summaryStats: {
+      type: Array,
+      default: () => [
+        { label: '任务数', value: 0 },
+        { label: '总积分', value: 0 }
+      ]
+    },
+    // 表格列配置
+    columns: {
+      type: Array,
+      default: () => [
+        { title: '任务类型', key: 'taskType', width: '20%' },
+        { title: '积分', key: 'points', width: '15%' },
+        { title: '申请人员', key: 'applicant', width: '20%' },
+        { title: '任务状态', key: 'statusText', width: '20%', slot: true },
+        { title: '接收时间', key: 'receiveTime', width: '25%' }
+      ]
+    },
+    // 表格数据
+    tableData: {
+      type: Array,
+      default: () => []
+    },
+    // 是否显示没有更多了
+    // showNoMore: {
+    //   type: Boolean,
+    //   default: true
+    // },
+    // 没有更多的提示文字
+    // noMoreText: {
+    //   type: String,
+    //   default: '没有更多了~'
+    // },
+    // 是否加载中
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    loadMore() {
+      if (!this.loading) {
+        this.$emit('load-more')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.content {
+  flex: 1;
+  background: #fff;
+}
+
+.summary-section {
+  background: #fff;
+  padding: 32rpx 24rpx;
+  
+  .summary-header {
+    display: flex;
+    align-items: center;
+    
+    .summary-indicator {
+      width: 6rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 3rpx;
+      margin-right: 16rpx;
+    }
+    
+    .summary-title {
+      font-size: 32rpx;
+      font-weight: bold;
+      color: #333;
+    }
+  }
+  
+  .summary-stats {
+    display: flex;
+    gap: 48rpx;
+    
+    .stat-item {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      gap: 16rpx;
+      
+      .stat-label {
+        font-size: 24rpx;
+        color: #999;
+      }
+      
+      .stat-value {
+        font-size: 36rpx;
+        font-weight: bold;
+        color: #388BFF;
+      }
+    }
+  }
+}
+
+.table-section {
+  background: #fff;
+  padding: 0 24rpx;
+  
+  .table-header {
+    display: flex;
+    background: #E3EFFF;
+    padding: 24rpx 16rpx;
+    
+    .table-col {
+      font-family: PingFang SC, PingFang SC;
+      font-weight: 500;
+      font-size: 26rpx;
+      color: #333333;
+      line-height: 40rpx;
+      text-align: left;
+    }
+  }
+  
+  .table-body {
+    .table-row {
+      display: flex;
+      padding: 24rpx 16rpx;
+      
+      &:nth-child(2n) {
+        background: #F7F8FA;
+        border-radius: 8rpx 8rpx 8rpx 8rpx;
+      }
+      
+      .table-col {
+        font-size: 26rpx;
+        color: #333;
+        display: flex;
+        align-items: center;
+        text-align: left;
+        font-family: PingFang SC, PingFang SC;
+        font-weight: 400;
+        font-size: 26rpx;
+        line-height: 40rpx;
+      }
+    }
+  }
+}
+
+.no-more {
+  text-align: center;
+  padding: 48rpx 0;
+  font-size: 24rpx;
+  color: #999;
+}
+</style>

+ 143 - 0
components/evan-switch.vue

@@ -0,0 +1,143 @@
+<template>
+	<!-- <view @click="toggle" class="evan-switch" :class="{'evan-switch--disabled':disabled}" :style="{width:2*size+'px',height:switchHeight,borderRadius:size+'px',backgroundColor:currentValue===activeValue?activeColor:inactiveColor}">
+		<view class="evan-switch__circle" :style="{width:size+'px',height:size+'px',transform:currentValue===activeValue?`translateX(${size}px)`:`translateX(0)`}"></view>
+	</view> -->
+	<view @click="toggle" class="evan-switch" :class="{'evan-switch--disabled':disabled}" :style="{backgroundColor:currentValue===activeValue?activeColor:inactiveColor}">
+		<view class="evan-switch__circle" :style="{transform:currentValue===activeValue?`translateX(${29}px)`:`translateX(0)`}"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'EvanSwitch',
+		props: {
+			value: {
+				type: [String, Number, Boolean],
+				default: false
+			},
+			activeColor: {
+				type: String,
+				default: '#108ee9'
+			},
+			inactiveColor: {
+				type: String,
+				default: '#fff'
+			},
+			size: {
+				type: Number,
+				default: 30
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			activeValue: {
+				type: [String, Number, Boolean],
+				default: true
+			},
+			inactiveValue: {
+				type: [String, Number, Boolean],
+				default: false
+			},
+			beforeChange: {
+				type: Function,
+				default: null
+			},
+			extraData: null,
+			contextLevel: {
+				type: Number,
+				default: 1
+			}
+		},
+		computed: {
+			switchHeight() {
+				// #ifdef APP-NVUE
+				return this.size + 2 + 'px'
+				// #endif
+				// #ifndef APP-NVUE
+				return this.size + 'px'
+				// #endif
+			}
+		},
+		watch: {
+			value: {
+				immediate: true,
+				handler(value) {
+					this.currentValue = value
+				}
+			}
+		},
+		data() {
+			return {
+				currentValue: false
+			}
+		},
+		methods: {
+			toggle() {
+				if (!this.disabled) {
+					if (this.beforeChange && typeof this.beforeChange === 'function') {
+						let context = this
+						for (let i = 0; i < this.contextLevel; i++) {
+							context = context.$options.parent
+						}
+						const result = this.beforeChange(this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue,
+							this.extraData, context)
+						if (typeof result === 'object') {
+							result.then(() => {
+								this.toggleValue()
+							}).catch(() => {})
+						} else if (typeof result === 'boolean' && result) {
+							this.toggleValue()
+						}
+					} else {
+						this.toggleValue()
+					}
+				}
+			},
+			toggleValue() {
+				this.currentValue = this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue
+				this.$emit('input', this.currentValue)
+				this.$emit('change', this.currentValue)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.evan-switch {
+		position: relative;
+		border-width: 1px;
+		border-color: rgba(0, 0, 0, 0.1);
+		border-style: solid;
+		transition: background-color 0.3s;
+		width: 100upx;
+		height: 36upx;
+		background: #2BC7B9;
+		border-radius: 18upx;
+		/* #ifndef APP-NVUE */
+		box-sizing: content-box;
+		/* #endif */
+	}
+
+	.evan-switch--disabled {
+		opacity: 0.3;
+	}
+
+	.evan-switch__circle {
+		position: absolute;
+		left: -4upx;
+		top: -8upx;
+		width: 50upx;
+		height: 50upx;
+		background: #FFFFFF;
+		box-shadow: 0px 2px 10px 0px rgba(166, 217, 212, 0.49);
+		border-radius: 50%;
+		/* #ifndef APP-NVUE */
+		box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		box-shadow: 1px 0 0px 0 rgba(0, 0, 0, 0.05);
+		/* #endif */
+		transition: transform 0.3s;
+	}
+</style>

+ 41 - 6
package-lock.json

@@ -1,14 +1,44 @@
 {
     "name": "shop",
     "version": "1.0.0",
-    "lockfileVersion": 1,
+    "lockfileVersion": 2,
     "requires": true,
-    "dependencies": {
-        "@qiun/ucharts": {
-            "version": "2.5.0-20230101",
-            "resolved": "https://registry.npmjs.org/@qiun/ucharts/-/ucharts-2.5.0-20230101.tgz",
-            "integrity": "sha512-C7ccBgfPuGF6dxTRuMW0NPPMSCf1k/kh3I9zkRVBc5PaivudX/rPL+jd2Wty6gn5ya5L3Ob+YmYe09V5xw66Cw=="
+    "packages": {
+        "": {
+            "name": "shop",
+            "version": "1.0.0",
+            "dependencies": {
+                "animate.css": "^3.7.2",
+                "dayjs": "^1.11.13",
+                "uqrcodejs": "^4.0.7",
+                "uview-ui": "^2.0.36"
+            }
+        },
+        "node_modules/animate.css": {
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-3.7.2.tgz",
+            "integrity": "sha512-0bE8zYo7C0KvgOYrSVfrzkbYk6IOTVPNqkiHg2cbyF4Pq/PXzilz4BRWA3hwEUBoMp5VBgrC29lQIZyhRWdBTw=="
         },
+        "node_modules/dayjs": {
+            "version": "1.11.13",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+            "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+        },
+        "node_modules/uqrcodejs": {
+            "version": "4.0.7",
+            "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz",
+            "integrity": "sha512-84+aZmD2godCVI+93lxE3YUAPNY8zAJvNA7xRS7R7U+q57KzMDepBSfNCwoRUhWOfR6eHFoAOcHRPwsP6ka1cA=="
+        },
+        "node_modules/uview-ui": {
+            "version": "2.0.36",
+            "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.36.tgz",
+            "integrity": "sha512-ASSZT6M8w3GTO1eFPbsgEFV0U5UujK+8pTNr+MSUbRNcRMC1u63DDTLJVeArV91kWM0bfAexK3SK9pnTqF9TtA==",
+            "engines": {
+                "HBuilderX": "^3.1.0"
+            }
+        }
+    },
+    "dependencies": {
         "animate.css": {
             "version": "3.7.2",
             "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-3.7.2.tgz",
@@ -19,6 +49,11 @@
             "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
             "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
         },
+        "uqrcodejs": {
+            "version": "4.0.7",
+            "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz",
+            "integrity": "sha512-84+aZmD2godCVI+93lxE3YUAPNY8zAJvNA7xRS7R7U+q57KzMDepBSfNCwoRUhWOfR6eHFoAOcHRPwsP6ka1cA=="
+        },
         "uview-ui": {
             "version": "2.0.36",
             "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.36.tgz",

+ 1 - 0
package.json

@@ -6,6 +6,7 @@
     "dependencies": {
         "animate.css": "^3.7.2",
         "dayjs": "^1.11.13",
+        "uqrcodejs": "^4.0.7",
         "uview-ui": "^2.0.36"
     }
 }

+ 230 - 315
pages.json

@@ -1,7 +1,7 @@
 {
 	"easycom": {
 		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
-	 },
+	},
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
 			"path": "pages/common/launch"
@@ -19,372 +19,289 @@
 				"navigationBarTitleText": "公众号授权",
 				"navigationStyle": "custom"
 			}
-			
+
 		},
 		{
 			"path": "pages/home/index",
 			"style": {
-				"navigationBarTitleText": "互联网医院",
-                "enablePullDownRefresh": false,
-                "navigationStyle": "custom",
+				"navigationBarTitleText": "企业端",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
 				"app-plus": {
 					"titleNView": false
 				}
 			}
 		},
 		{
-		    "path" : "pages/task/index",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "任务中心",
+			"path": "pages/task/index",
+			"style": {
+				"navigationBarTitleText": "任务中心",
 				"app-plus": {
 					"titleNView": false
 				}
-		    }
+			}
 		},
 		{
 			"path": "pages/user/index",
 			"style": {
 				"navigationBarTitleText": "我的",
-                "navigationStyle": "custom",
+				"navigationStyle": "custom",
 				"app-plus": {
 					"titleNView": false
 				}
 			}
-		}
-		,{
-		    "path" : "pages/home/content",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "详情",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/home/web",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "详情",
-		        "enablePullDownRefresh": false
-		    }
-		    
+		}, {
+			"path": "pages/home/content",
+			"style": {
+				"navigationBarTitleText": "详情",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/home/web",
+			"style": {
+				"navigationBarTitleText": "详情",
+				"enablePullDownRefresh": false
+			}
+
 		},
 		{
-		    "path" : "pages/user/test",
-		    "style" :                                                                                    
-		    {
-		        "navigationBarTitleText": "测一测",
+			"path": "pages/user/test",
+			"style": {
+				"navigationBarTitleText": "测一测",
 				"app-plus": {
 					"titleNView": false
 				}
-		    }
-		}
-		
-    ],
-	"subPackages": [
+			}
+		},
 		{
+			"path": "pages/auth/changePassword",
+			"style": {
+				"navigationBarTitleText": "修改密码"
+			}
+		},
+		{
+			"path": "pages/auth/forgetPassword",
+			"style": {
+				"navigationBarTitleText": "忘记密码"
+			}
+		}, {
+			"path": "pages/auth/setting",
+			"style": {
+				"navigationBarTitleText": "设置中心"
+			}
+		}
+
+	],
+	"subPackages": [{
 			"root": "pages_task",
-			"pages": [
+			"pages": [{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "问答专区",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
 				{
-				    "path" : "index",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "问答专区",
+					"path": "airClassroom",
+					"style": {
+						"navigationBarTitleText": "空中课堂",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}, {
+					// 填写任务
+					"path": "createTask",
+					"style": {
+						"navigationBarTitleText": "创建任务",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
+				}, {
+					// 选择客户
+					"path": "selectCustomer",
+					"style": {
+						"navigationBarTitleText": "创建任务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}, {
+					// 积分设置
+					"path": "pointsSettings",
+					"style": {
+						"navigationBarTitleText": "创建任务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}, {
+					// 提交成功
+					"path": "success",
+					"style": {
+						"navigationBarTitleText": "创建任务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
 				},
+
+				// {
+				// 	"path": "taskDetail",
+				// 	"style": {
+				// 		"navigationBarTitleText": "任务详情",
+				// 		"app-plus": {
+				// 			"titleNView": false
+				// 		}
+				// 	}
+				// },
 				{
-				    "path" : "airClassroom",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "空中课堂",
+					"path": "completeTask",
+					"style": {
+						"navigationBarTitleText": "完成任务",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
 				},
 				{
-				    "path" : "taskDetail",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "任务详情",
+					"path": "taskCompleteSuccess",
+					"style": {
+						"navigationBarTitleText": "完成任务",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
 				},
 				{
-				    "path" : "completeTask",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "完成任务",
+					"path": "onlineLecture",
+					"style": {
+						"navigationBarTitleText": "在线讲座",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
 				},
 				{
-				    "path" : "taskCompleteSuccess",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "完成任务",
+					"path": "science",
+					"style": {
+						"navigationBarTitleText": "科普创作",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
 				},
 				{
-				    "path" : "onlineLecture",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "在线讲座",
+					"path": "xlTask",
+					"style": {
+						"navigationBarTitleText": "XL任务",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
 				},
 				{
-				    "path" : "science",
-				    "style" :                                                                                    
-				    {
-				        "navigationBarTitleText": "科普创作",
+					// 任务详情
+					"path": "taskDetail",
+					"style": {
+						"navigationStyle": "custom",
 						"app-plus": {
 							"titleNView": false
 						}
-				    }
+					}
+				},
+				{
+					//填写任务
+					"path": "fillTask",
+					"style": {
+						"navigationBarTitleText": "编辑任务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
 				}
-				// {
-				//     "path" : "index/medicatedFoodList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "药膳食疗",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/medicatedFoodDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "药膳食疗",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				
-				// {
-				//     "path" : "index/vesselList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "经络穴位",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/vesselDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "经络穴位",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/questionsList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "问答专区",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/questionsDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "问答专区",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/diseaseList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "疾病列表",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/diseaseDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "疾病",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				
-				// {
-				//     "path" : "index/chineseMedicineList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "中药图解",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/chineseMedicineDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "中药图解",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				
-				// {
-				//     "path" : "index/famousPrescribeList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "名方今用",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/famousPrescribeDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "名方今用",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				
-					
-				// {
-				//     "path" : "index/test",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "测一测",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/testList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "测一测",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/testDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "测一测",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/testResult",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "测试结果",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/articleList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "健康知识",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/articleDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "文章详情",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				
-				// {
-				//     "path" : "index/doctorArticleList",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "康复医案",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// },
-				// {
-				//     "path" : "index/doctorArticleDetails",
-				//     "style" :                                                                                    
-				//     {
-				//         "navigationBarTitleText": "康复医案",
-				// 		"app-plus": {
-				// 			"titleNView": false
-				// 		}
-				//     }
-				// }
+				,
+				{
+					//选择客户
+					"path": "editSelectCustomer",
+					"style": {
+						"navigationBarTitleText": "编辑任务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					//审批中心
+					"path": "approvalCenter",
+					"style": {
+						"navigationBarTitleText": "审批中心",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					// 审批中心-任务详情
+					"path": "approvalTaskDetail",
+					"style": {
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+
 			]
 		},
-		
-		
+
+
 		{
 			"root": "pages_user",
-			"pages": [
-				{
-					"path" : "points",
-					"style" :                                                                                    
-					{
+			"pages": [{
+					"path": "points",
+					"style": {
 						"navigationBarTitleText": "我的积分",
 						"enablePullDownRefresh": false
 					}
-					
+
+				},
+				{
+					"path": "userInfo",
+					"style": {
+						"navigationBarTitleText": "个人信息"
+					}
+				}
+
+			]
+		}, {
+			// 讲者邀请
+			"root": "pages_speaker",
+			"pages": [{
+					"path": "speakerInvitation",
+					"style": {
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "讲者管理"
+					}
 				}
-				
+
 			]
 		},
 		{
 			"root": "pages_live",
-			"pages": [
-				{
+			"pages": [{
 					"path": "lecture",
 					"style": {
 						"navigationBarTitleText": "在线讲座",
@@ -483,7 +400,7 @@
 							"titleNView": false
 						}
 					}
-				},{
+				}, {
 					"path": "addUser",
 					"style": {
 						"navigationBarTitleText": "用户信息",
@@ -494,27 +411,25 @@
 					}
 				}
 			]
-		},{
+		}, {
 			"root": "pages_echarts",
-			"pages": [
-				{
-					"path": "statistics",
-					"style": {
-						"navigationBarTitleText": "数据统计",
-						"enablePullDownRefresh": false,
-						"navigationBarBackgroundColor": "#fff",
-						"navigationBarTextStyle": "black",
-						"app-plus": {
-							"titleNView": false
-						}
+			"pages": [{
+				"path": "statistics",
+				"style": {
+					"navigationBarTitleText": "数据统计",
+					"enablePullDownRefresh": false,
+					"navigationBarBackgroundColor": "#fff",
+					"navigationBarTextStyle": "black",
+					"app-plus": {
+						"titleNView": false
 					}
 				}
-			]
+			}]
 		}
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "互联网医院",
+		"navigationBarTitleText": "企业端",
 		"navigationBarBackgroundColor": "#FFFFFF",
 		"backgroundColor": "#FFFFFF"
 	},
@@ -524,8 +439,8 @@
 		"borderStyle": "white",
 		"backgroundColor": "#ffffff",
 		"height": "64px",
-		"fontSize":"12px",
-		"iconWidth":"18px",
+		"fontSize": "12px",
+		"iconWidth": "18px",
 		"spacing": "4px",
 		"list": [{
 				"pagePath": "pages/home/index",
@@ -533,12 +448,12 @@
 				"selectedIconPath": "/static/tabbar/icon_sel_home.png",
 				"text": "首页"
 			},
-			{
-				"pagePath": "pages/task/index",
-				"iconPath": "/static/tabbar/icon_task.png",
-				"selectedIconPath": "/static/tabbar/icon_sel_task.png",
-				"text": "任务中心"
-			},
+			// {
+			// 	"pagePath": "pages/task/index",
+			// 	"iconPath": "/static/tabbar/icon_task.png",
+			// 	"selectedIconPath": "/static/tabbar/icon_sel_task.png",
+			// 	"text": "任务中心"
+			// },
 			{
 				"pagePath": "pages/user/index",
 				"iconPath": "/static/tabbar/icon_me.png",
@@ -547,4 +462,4 @@
 			}
 		]
 	}
-}
+}

+ 212 - 0
pages/auth/changePassword.vue

@@ -0,0 +1,212 @@
+<template>
+	<view class="setting-page">
+		<view class="content">
+			<view class="info-item">
+				<text class="title">原密码</text>
+				<input class="input-field code-input" type="text" :password="!showOldPassword" v-model="oldPassword"
+					placeholder="请输入现有密码" />
+				<view class="img-box" @click="toggleOldPassword">
+					<image class="icon"
+						:src="showOldPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						mode="aspectFill"></image>
+				</view>
+			</view>
+			<view class="info-item">
+				<text class="title">新密码</text>
+				<input class="input-field code-input" type="text" :password="!showNewPassword" v-model="newPassword"
+					placeholder="请输入8-20位字母、数字" />
+				<view class="img-box" @click="toggleNewPassword">
+					<image class="icon"
+						:src="showNewPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						mode="aspectFill"></image>
+				</view>
+			</view>
+			<view class="info-item">
+				<text class="title">确认密码</text>
+				<input class="input-field code-input" type="text" :password="!showConfirmPassword" v-model="confirmPassword"
+					placeholder="请再次输入新密码" />
+				<view class="img-box" @click="toggleConfirmPassword">
+					<image class="icon"
+						:src="showConfirmPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						mode="aspectFill"></image>
+				</view>
+			</view>
+		</view>
+		<view class="btn-box">
+			<view class="confirm" @click="confirm">确认</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				oldPassword: '',
+				newPassword: '',
+				confirmPassword: '',
+				// 为每个密码框单独设置显示状态
+				showOldPassword: false,
+				showNewPassword: false,
+				showConfirmPassword: false
+			}
+		},
+		onLoad() {},
+		methods: {
+			// 分别控制每个密码框的显示/隐藏
+			toggleOldPassword() {
+				this.showOldPassword = !this.showOldPassword;
+			},
+			toggleNewPassword() {
+				this.showNewPassword = !this.showNewPassword;
+			},
+			toggleConfirmPassword() {
+				this.showConfirmPassword = !this.showConfirmPassword;
+			},
+			confirm() {
+				// 验证逻辑
+				if (!this.oldPassword) {
+					uni.showToast({
+						title: '请输入原密码',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				if (!this.newPassword) {
+					uni.showToast({
+						title: '请输入新密码',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				// 密码格式验证
+				const passwordRegex = /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/;
+				if (!passwordRegex.test(this.newPassword)) {
+					uni.showToast({
+						title: '密码需8-20位字母和数字组合',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				if (this.newPassword !== this.confirmPassword) {
+					uni.showToast({
+						title: '两次输入的新密码不一致',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				// 调用修改密码的API
+				this.changePassword();
+			},
+			
+			// 修改密码的API调用
+			async changePassword() {
+				try {
+					uni.showLoading({
+						title: '修改中...'
+					});
+					
+					// 这里添加实际的API调用
+					// const res = await uni.request({
+					// 	url: '/api/change-password',
+					// 	method: 'POST',
+					// 	data: {
+					// 		oldPassword: this.oldPassword,
+					// 		newPassword: this.newPassword
+					// 	}
+					// });
+					
+					// 模拟成功
+					setTimeout(() => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '密码修改成功',
+							icon: 'success'
+						});
+						
+						// 清空表单
+						this.oldPassword = '';
+						this.newPassword = '';
+						this.confirmPassword = '';
+						
+						// 跳转到其他页面或返回
+						setTimeout(() => {
+							uni.navigateBack();
+						}, 1500);
+					}, 1000);
+					
+				} catch (error) {
+					uni.hideLoading();
+					uni.showToast({
+						title: error.message || '修改失败',
+						icon: 'none'
+					});
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.setting-page {
+		background: #ffffff;
+		min-height: 100vh;
+
+		.content {
+			background: #ffffff;
+		}
+
+		.info-item {
+			height: 104upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			border-bottom: 1px solid #F5F6FA;
+
+			.title {
+				width: 160rpx;
+				font-size: 28rpx;
+				color: #666666;
+				margin-left: 32rpx;
+			}
+
+			.input-field {
+				width: 100%;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				color: #333333;
+			}
+
+			.code-input {
+				flex: 1;
+			}
+
+			.img-box {
+				padding: 32rpx;
+				.icon {
+					width: 32rpx;
+					height: 32rpx;
+				}
+			}
+		}
+
+		.btn-box {
+			padding: 64upx 32upx;
+			.confirm {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-family: PingFang SC;
+				font-size: 32upx;
+				color: #FFFFFF;
+				background: #388BFF;
+				border-radius: 44upx;
+			}
+		}
+	}
+</style>

+ 271 - 0
pages/auth/forgetPassword.vue

@@ -0,0 +1,271 @@
+<template>
+	<view class="setting-page">
+		<view class="content">
+			<view class="info-item">
+				<text class="title">手机号码</text>
+				<input class="input-field code-input" type="text" :password="!phone" v-model="phone"
+					placeholder="请输入手机号码" />
+			</view>
+			<view class="info-item">
+				<text class="title">验证码</text>
+				<input class="input-field code-input" type="number" v-model="verifyCode"
+					placeholder="请输入验证码" maxlength="6" />
+				<view  class="get-code-btn" @click="getVerifyCode">
+					{{ codeText }}
+				</view>
+			</view>
+			<view class="info-item">
+				<text class="title">新密码</text>
+				<input class="input-field code-input" type="text" :password="!showNewPassword" v-model="newPassword"
+					placeholder="请输入8-20位字母、数字" />
+				<view class="img-box" @click="toggleNewPassword">
+					<image class="icon"
+						:src="showNewPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						mode="aspectFill"></image>
+				</view>
+			</view>
+			<view class="info-item">
+				<text class="title">确认密码</text>
+				<input class="input-field code-input" type="text" :password="!showConfirmPassword"
+					v-model="confirmPassword" placeholder="请再次输入新密码" />
+				<view class="img-box" @click="toggleConfirmPassword">
+					<image class="icon"
+						:src="showConfirmPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						mode="aspectFill"></image>
+				</view>
+			</view>
+		</view>
+		<view class="btn-box">
+			<view class="confirm" @click="confirm">确认</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				phone:17873014571,
+				codeText: '获取验证码', // 验证码按钮文字
+				newPassword: '',
+				confirmPassword: '',
+				// 为每个密码框单独设置显示状态
+				showOldPassword: false,
+				showNewPassword: false,
+				showConfirmPassword: false
+			}
+		},
+		onLoad() {},
+		methods: {
+			// 获取验证码
+			getVerifyCode() {
+				if (this.countdown > 0) {
+					return;
+				}
+				if (!this.phone) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入手机号",
+					});
+					return;
+				}
+				if (!/^1[3-9]\d{9}$/.test(this.phone)) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入正确的手机号",
+					});
+					return;
+				}
+				// TODO: 调用发送验证码API
+				// 这里需要对接真实的发送验证码接口
+				uni.showLoading({
+					title: "发送中..."
+				});
+				// 模拟发送验证码
+				setTimeout(() => {
+					uni.hideLoading();
+					uni.showToast({
+						icon: 'success',
+						title: "验证码已发送",
+					});
+					// 开始倒计时
+					this.countdown = 60;
+					this.countdownTimer = setInterval(() => {
+						this.countdown--;
+						this.codeText = this.countdown + '秒重新获取';
+						if (this.countdown <= 0) {
+							clearInterval(this.countdownTimer);
+							this.countdownTimer = null;
+							this.codeText = '获取验证码';
+						}
+					}, 1000);
+				}, 1000);
+			},
+			// 分别控制每个密码框的显示/隐藏
+			toggleOldPassword() {
+				this.showOldPassword = !this.showOldPassword;
+			},
+			toggleNewPassword() {
+				this.showNewPassword = !this.showNewPassword;
+			},
+			toggleConfirmPassword() {
+				this.showConfirmPassword = !this.showConfirmPassword;
+			},
+			confirm() {
+				// 验证逻辑
+				if (!this.oldPassword) {
+					uni.showToast({
+						title: '请输入原密码',
+						icon: 'none'
+					});
+					return;
+				}
+
+				if (!this.newPassword) {
+					uni.showToast({
+						title: '请输入新密码',
+						icon: 'none'
+					});
+					return;
+				}
+
+				// 密码格式验证
+				const passwordRegex = /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/;
+				if (!passwordRegex.test(this.newPassword)) {
+					uni.showToast({
+						title: '密码需8-20位字母和数字组合',
+						icon: 'none'
+					});
+					return;
+				}
+
+				if (this.newPassword !== this.confirmPassword) {
+					uni.showToast({
+						title: '两次输入的新密码不一致',
+						icon: 'none'
+					});
+					return;
+				}
+
+				// 调用修改密码的API
+				this.changePassword();
+			},
+
+			// 修改密码的API调用
+			async changePassword() {
+				try {
+					uni.showLoading({
+						title: '修改中...'
+					});
+
+					// 这里添加实际的API调用
+					// const res = await uni.request({
+					// 	url: '/api/change-password',
+					// 	method: 'POST',
+					// 	data: {
+					// 		oldPassword: this.oldPassword,
+					// 		newPassword: this.newPassword
+					// 	}
+					// });
+
+					// 模拟成功
+					setTimeout(() => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '密码修改成功',
+							icon: 'success'
+						});
+
+						// 清空表单
+						this.oldPassword = '';
+						this.newPassword = '';
+						this.confirmPassword = '';
+
+						// 跳转到其他页面或返回
+						setTimeout(() => {
+							uni.navigateBack();
+						}, 1500);
+					}, 1000);
+
+				} catch (error) {
+					uni.hideLoading();
+					uni.showToast({
+						title: error.message || '修改失败',
+						icon: 'none'
+					});
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.setting-page {
+		background: #ffffff;
+		min-height: 100vh;
+
+		.content {
+			background: #ffffff;
+		}
+
+		.info-item {
+			height: 104upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			border-bottom: 1px solid #F5F6FA;
+
+			.title {
+				width: 160rpx;
+				font-size: 28rpx;
+				color: #666666;
+				margin-left: 32rpx;
+			}
+
+			.input-field {
+				width: 100%;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				color: #333333;
+			}
+
+			.code-input {
+				flex: 1;
+			}
+
+			.img-box {
+				padding: 32rpx;
+
+				.icon {
+					width: 32rpx;
+					height: 32rpx;
+				}
+			}
+
+			.get-code-btn {
+				margin-right: 32rpx;
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #157CF8;
+				padding-left: 20rpx;
+				white-space: nowrap;
+			}
+		}
+
+		.btn-box {
+			padding: 64upx 32upx;
+
+			.confirm {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-family: PingFang SC;
+				font-size: 32upx;
+				color: #FFFFFF;
+				background: #388BFF;
+				border-radius: 44upx;
+			}
+		}
+	}
+</style>

+ 715 - 658
pages/auth/login.vue

@@ -1,709 +1,766 @@
 <template>
-  <view class="container">
-    <!-- #ifdef MP-WEIXIN -->
-	<image class="bg" src="@/static/image/bg_login.png" mode="widthFix"></image>
-    <view class="force-login-wrap">
-		<view :style="{height:menuButtonInfo.height,marginTop:menuButtonInfo.top}" class="backImg" >
-			<image @tap="goBack()" src="@/static/images/back.png"></image>
-		</view>
-		<view class="top-title">
-			<view class="title-text">登录</view>
-			<view class="login-notice">仅限特定人群使用,登录后可体验更多功能</view>
-		</view>
-      <view class="force-login__content">
-		  <image class="bg-type" :src="current==0?'/static/image/bg_tab_login.png':'/static/image/bg_tab_login2.png'" mode="widthFix"></image>
-		<view class="logintype">
-			<view :class="current==0 ? 'logintype-item active':'logintype-item'" @click="changeType(0)">验证码登录</view>
-			<view :class="current==1 ? 'logintype-item active':'logintype-item'" @click="changeType(1)">密码登录</view>
-		</view>
-		
-		<view class="input-form">
-			<view class="input-item">
-				<input 
-					class="input-field" 
-					type="number" 
-					v-model="phone" 
-					placeholder="请输入手机号" 
-					maxlength="11"
-				/>
+	<view class="container">
+		<!-- #ifdef MP-WEIXIN -->
+		<image class="bg" src="@/static/image/bg_login.png" mode="widthFix"></image>
+		<view class="force-login-wrap">
+			<view :style="{height:menuButtonInfo.height,marginTop:menuButtonInfo.top}" class="backImg">
+				<image @tap="goBack()" src="@/static/images/back.png"></image>
+			</view>
+			<view class="top-title">
+				<view class="title-text">欢迎登录<text class="blue">小蜜蜂</text></view>
+				<view class="login-notice">新用户首次登录即视为注册</view>
 			</view>
-			<view class="input-item code-input-item">
-				<input 
-					v-if="current == 0"
-					class="input-field code-input" 
-					type="number" 
-					v-model="verifyCode" 
-					placeholder="请输入验证码" 
-					maxlength="6"
-				/>
-				<view v-else class="mima">
-					<input
-						class="input-field code-input" 
-						type="text" 
-						:password="showPassword"
-						v-model="password" 
-						placeholder="请输入密码" 
-					/>
-					<image @click="closePwd" :src="showPassword?'/static/image/icon_invisible.png':'/static/image/icon_visible.png'" mode="aspectFill"></image>
+			<view class="force-login__content">
+				<!-- <image class="bg-type" :src="current==0?'/static/image/bg_tab_login.png':'/static/image/bg_tab_login2.png'" mode="widthFix"></image> -->
+				<view class="logintype">
+					<view :class="current==0 ? 'logintype-item active':'logintype-item'" @click="changeType(0)">验证码登录
+					</view>
+					<view class="line"></view>
+					<view :class="current==1 ? 'logintype-item active':'logintype-item'" @click="changeType(1)">密码登录
+					</view>
+				</view>
+
+				<view class="input-form">
+					<view class="input-item">
+						<input class="input-field" type="number" v-model="phone" placeholder="请输入手机号" maxlength="11" />
+					</view>
+					<view class="input-item code-input-item">
+						<input v-if="current == 0" class="input-field code-input" type="number" v-model="verifyCode"
+							placeholder="请输入验证码" maxlength="6" />
+						<view v-else class="mima">
+							<input class="input-field code-input" type="text" :password="showPassword"
+								v-model="password" placeholder="请输入密码" />
+							<image @click="closePwd"
+								:src="showPassword?'/static/image/icon_invisible.png':'/static/image/icon_visible.png'"
+								mode="aspectFill"></image>
+						</view>
+						<view v-if="current == 0" class="get-code-btn" @click="getVerifyCode">
+							{{ codeText }}
+						</view>
+					</view>
+				</view>
+				<view class="forgot" v-if="current==1" @click="toForgetPassword">忘记密码?</view>
+				<view class="encoding">企业编码:-</view>
+				<view class="login-btn-wrap">
+					<!-- <button class="login-btn" @click="handleLogin">{{ current == 0 ? '登录/注册用户' : '登录' }}</button> -->
+					<button class="login-btn" @click="handleLogin">登录</button>
 				</view>
-				<view v-if="current == 0" class="get-code-btn" @click="getVerifyCode">
-					{{ codeText }}
+
+				<view class="tips">
+					<checkbox :checked="isAgreement" @click="handleAgreement()" />
+					<view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
+					<view class="btn" @click="openH5('/web/userAgreement')">《用户注册协议》</view>
+					<view class="btn" @click="openH5('/web/privacyPolicy')">《隐私保护政策》</view>
 				</view>
 			</view>
 		</view>
-		
-		<view class="login-btn-wrap">
-			<button class="login-btn" @click="handleLogin">{{ current == 0 ? '登录/注册用户' : '登录' }}</button>
-		</view>
-		
-		<view class="tips">
-			<checkbox :checked="isAgreement" @click="handleAgreement()" />
-			<view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
-			<view class="btn" @click="openH5('/web/userAgreement')">《用户注册协议》</view>
-			<view class="btn" @click="openH5('/web/privacyPolicy')">《隐私保护政策》</view>
-		</view>
-      </view>
-    </view>
-    <!-- #endif -->
-  </view>
+		<!-- #endif -->
+	</view>
 </template>
 
 <script>
-import { loginByMiniApp,getUserInfo,loginByMp } from '@/api/user'
-export default {
-	data() {
-		return {
-			code:null, // 微信登录code
-			isAgreement:false,
-			current:0, // 0-验证码登录 1-密码登录
-			menuButtonInfo:{},
-			phone:'', // 手机号
-			verifyCode:'', // 验证码
-			password:'', // 密码
-			codeText:'获取验证码', // 验证码按钮文字
-			countdown:0, // 倒计时
-			countdownTimer:null, // 倒计时定时器
-			showPassword:true // 是否显示密码
-		}
-	},
-	computed: {
-	},
-	onLoad(option) {
-		this.getMenuButtonInfo()
-		// #ifdef MP-WEIXIN
-		uni.$on('refreshLogin', () => {
-			uni.navigateBack({
-				delta:1
-			})
-		})
-		//选获取CODE,防止后请求的时候腾讯服务端未同步报错
-		this.getCode();
-		// #endif
-		
-		// #ifdef H5
-		if (this.checkWeixin()) {
-			this.getWxCode()
-		} else {
-			uni.showToast({
-				icon:'none',
-				title: "请在微信中打开",
-			});
-			//跳转到手机号密码登录
-		}
-		// #endif
-	 
-	},
-	onUnload() {
-		// 清除倒计时
-		if(this.countdownTimer) {
-			clearInterval(this.countdownTimer);
-			this.countdownTimer = null;
-		}
-	},
-	mounted() {
-    
-	},
-	methods: {
-		closePwd(){
-			this.showPassword=!this.showPassword
-		},
-		// 获取胶囊按钮布局参数
-		getMenuButtonInfo() {
-			// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
-			const menuBtn = uni.getMenuButtonBoundingClientRect();
-			if (menuBtn) {
-		
-				this.menuButtonInfo = {
-					top: menuBtn.top + 'px', // 胶囊顶部距离
-					height: menuBtn.height + 'px', // 胶囊高度
-					centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
-					right: menuBtn.right + 'px' // 胶囊右侧距离
-				};
-			}
-		},
-		changeType(index) {
-			this.current = index;
-			// 切换时清空输入
-			if(index == 0) {
-				this.password = '';
-			} else {
-				this.verifyCode = '';
+	import {
+		loginByMiniApp,
+		getUserInfo,
+		loginByMp
+	} from '@/api/user'
+	export default {
+		data() {
+			return {
+				code: null, // 微信登录code
+				isAgreement: false,
+				current: 0, // 0-验证码登录 1-密码登录
+				menuButtonInfo: {},
+				phone: '', // 手机号
+				verifyCode: '', // 验证码
+				password: '', // 密码
+				codeText: '获取验证码', // 验证码按钮文字
+				countdown: 0, // 倒计时
+				countdownTimer: null, // 倒计时定时器
+				showPassword: true // 是否显示密码
 			}
 		},
-		// 返回主页
-		goBack() {
-			uni.navigateBack({
-				delta:1
+		computed: {},
+		onLoad(option) {
+			this.getMenuButtonInfo()
+			// #ifdef MP-WEIXIN
+			uni.$on('refreshLogin', () => {
+				uni.navigateBack({
+					delta: 1
+				})
 			})
-		},
-		// 获取验证码
-		getVerifyCode() {
-			if(this.countdown > 0) {
-				return;
-			}
-			if(!this.phone) {
-				uni.showToast({
-					icon:'none',
-					title: "请输入手机号",
-				});
-				return;
-			}
-			if(!/^1[3-9]\d{9}$/.test(this.phone)) {
+			//选获取CODE,防止后请求的时候腾讯服务端未同步报错
+			this.getCode();
+			// #endif
+
+			// #ifdef H5
+			if (this.checkWeixin()) {
+				this.getWxCode()
+			} else {
 				uni.showToast({
-					icon:'none',
-					title: "请输入正确的手机号",
+					icon: 'none',
+					title: "请在微信中打开",
 				});
-				return;
+				//跳转到手机号密码登录
 			}
-			// TODO: 调用发送验证码API
-			// 这里需要对接真实的发送验证码接口
-			uni.showLoading({
-				title:"发送中..."
-			});
-			// 模拟发送验证码
-			setTimeout(() => {
-				uni.hideLoading();
-				uni.showToast({
-					icon:'success',
-					title: "验证码已发送",
-				});
-				// 开始倒计时
-				this.countdown = 60;
-				this.countdownTimer = setInterval(() => {
-					this.countdown--;
-					this.codeText = this.countdown + '秒重新获取';
-					if(this.countdown <= 0) {
-						clearInterval(this.countdownTimer);
-						this.countdownTimer = null;
-						this.codeText = '获取验证码';
-					}
-				}, 1000);
-			}, 1000);
+			// #endif
+
 		},
-		// 登录
-		handleLogin() {
-			if(!this.isAgreement) {
-				uni.showToast({
-					icon:'none',
-					title: "请先同意协议后再登录",
-				});
-				return;
+		onUnload() {
+			// 清除倒计时
+			if (this.countdownTimer) {
+				clearInterval(this.countdownTimer);
+				this.countdownTimer = null;
 			}
-			uni.navigateBack({
-				delta:1
-			})
-			// if(!this.phone) {
-			// 	uni.showToast({
-			// 		icon:'none',
-			// 		title: "请输入手机号",
-			// 	});
-			// 	return;
-			// }
-			// if(!/^1[3-9]\d{9}$/.test(this.phone)) {
-			// 	uni.showToast({
-			// 		icon:'none',
-			// 		title: "请输入正确的手机号",
-			// 	});
-			// 	return;
-			// }
-			
-			// if(this.current == 0) {
-			// 	// 验证码登录
-			// 	if(!this.verifyCode) {
-			// 		uni.showToast({
-			// 			icon:'none',
-			// 			title: "请输入验证码",
-			// 		});
-			// 		return;
-			// 	}
-			// 	// TODO: 调用验证码登录API
-			// 	this.loginByCode();
-			// } else {
-			// 	// 密码登录
-			// 	if(!this.password) {
-			// 		uni.showToast({
-			// 			icon:'none',
-			// 			title: "请输入密码",
-			// 		});
-			// 		return;
-			// 	}
-			// 	// TODO: 调用密码登录API
-			// 	this.loginByPassword();
-			// }
 		},
-		// 验证码登录
-		loginByCode() {
-			uni.showLoading({
-				title:"登录中..."
-			});
-			// TODO: 调用验证码登录接口
-			// 示例:loginByCode({ phone: this.phone, code: this.verifyCode })
-			setTimeout(() => {
-				uni.hideLoading();
-				uni.showToast({
-					icon:'none',
-					title: "验证码登录接口待对接",
-				});
-			}, 1000);
+		mounted() {
+
 		},
-		// 密码登录
-		loginByPassword() {
-			uni.showLoading({
-				title:"登录中..."
-			});
-			// TODO: 调用密码登录接口
-			// 示例:loginByPassword({ phone: this.phone, password: this.password })
-			setTimeout(() => {
-				uni.hideLoading();
-				uni.showToast({
-					icon:'none',
-					title: "密码登录接口待对接",
+		methods: {
+			closePwd() {
+				this.showPassword = !this.showPassword
+			},
+			// 获取胶囊按钮布局参数
+			getMenuButtonInfo() {
+				// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
+				const menuBtn = uni.getMenuButtonBoundingClientRect();
+				if (menuBtn) {
+
+					this.menuButtonInfo = {
+						top: menuBtn.top + 'px', // 胶囊顶部距离
+						height: menuBtn.height + 'px', // 胶囊高度
+						centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
+						right: menuBtn.right + 'px' // 胶囊右侧距离
+					};
+				}
+			},
+			changeType(index) {
+				this.current = index;
+				// 切换时清空输入
+				if (index == 0) {
+					this.password = '';
+				} else {
+					this.verifyCode = '';
+				}
+			},
+			// 返回主页
+			goBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			// 获取验证码
+			getVerifyCode() {
+				if (this.countdown > 0) {
+					return;
+				}
+				if (!this.phone) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入手机号",
+					});
+					return;
+				}
+				if (!/^1[3-9]\d{9}$/.test(this.phone)) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入正确的手机号",
+					});
+					return;
+				}
+				// TODO: 调用发送验证码API
+				// 这里需要对接真实的发送验证码接口
+				uni.showLoading({
+					title: "发送中..."
 				});
-			}, 1000);
-		},
-		checkWeixin(){
-			var ua = window.navigator.userAgent.toLowerCase();
-			if (ua.match(/micromessenger/i) == 'micromessenger') {
-				return true;
-			} else {
-				return false;
-			}
-		},
-		//URL地址是否存在CODE
-		getUrlCode(name) {
-			return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1]
-				.replace(/\+/g, '%20')) || null
-		},
-		//获取微信CODE
-		getWxCode() {
-			//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
-			//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
-			var appId="wx40593595e62f61ad";
-			var url="http://h5.yjf.runtzh.com";
-			window.location.href ='https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent(url+"/#/pages/auth/wxLogin") +'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
-			//console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
-			// redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
-		},
-		handleAgreement(){
-			this.isAgreement=!this.isAgreement;
-		},
-		openH5(url){
-			var requestPath = uni.getStorageSync('requestPath');
-			uni.setStorageSync('url',requestPath+url);
-			uni.navigateTo({
-				url: '../home/web'
-			})
-		},
-		getCode(){
-			var that=this;
-			this.utils.getProvider()
-			.then(provider => {
-				console.log('当前的环境商',provider)
-				if (!provider) {
-				  reject()
+				// 模拟发送验证码
+				setTimeout(() => {
+					uni.hideLoading();
+					uni.showToast({
+						icon: 'success',
+						title: "验证码已发送",
+					});
+					// 开始倒计时
+					this.countdown = 60;
+					this.countdownTimer = setInterval(() => {
+						this.countdown--;
+						this.codeText = this.countdown + '秒重新获取';
+						if (this.countdown <= 0) {
+							clearInterval(this.countdownTimer);
+							this.countdownTimer = null;
+							this.codeText = '获取验证码';
+						}
+					}, 1000);
+				}, 1000);
+			},
+			// 登录
+			handleLogin() {
+				if (!this.isAgreement) {
+					uni.showToast({
+						icon: 'none',
+						title: "请先同意协议后再登录",
+					});
+					return;
 				}
-				// uni登录
-				uni.login({
-					provider: provider,
-					success: async loginRes => {
-						that.code = loginRes.code
-					}
+				uni.navigateBack({
+					delta: 1
 				})
-			})
-			.catch(err => {
-				
-			})
-		},
-		// 微信用户手机号登录
-		phoneLogin(e) {
-			var that=this;
-			if(!this.isAgreement){
-				uni.showToast({
-					icon:'none',
-					title: "请先同意协议后再登录",
+				// if(!this.phone) {
+				// 	uni.showToast({
+				// 		icon:'none',
+				// 		title: "请输入手机号",
+				// 	});
+				// 	return;
+				// }
+				// if(!/^1[3-9]\d{9}$/.test(this.phone)) {
+				// 	uni.showToast({
+				// 		icon:'none',
+				// 		title: "请输入正确的手机号",
+				// 	});
+				// 	return;
+				// }
+
+				// if(this.current == 0) {
+				// 	// 验证码登录
+				// 	if(!this.verifyCode) {
+				// 		uni.showToast({
+				// 			icon:'none',
+				// 			title: "请输入验证码",
+				// 		});
+				// 		return;
+				// 	}
+				// 	// TODO: 调用验证码登录API
+				// 	this.loginByCode();
+				// } else {
+				// 	// 密码登录
+				// 	if(!this.password) {
+				// 		uni.showToast({
+				// 			icon:'none',
+				// 			title: "请输入密码",
+				// 		});
+				// 		return;
+				// 	}
+				// 	// TODO: 调用密码登录API
+				// 	this.loginByPassword();
+				// }
+			},
+			// 验证码登录
+			loginByCode() {
+				uni.showLoading({
+					title: "登录中..."
 				});
-				return false;
-			}
-			uni.showLoading({
-				title:"处理中..."
-			})
-			console.log(e,"e")
-			if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+				// TODO: 调用验证码登录接口
+				// 示例:loginByCode({ phone: this.phone, code: this.verifyCode })
+				setTimeout(() => {
+					uni.hideLoading();
+					uni.showToast({
+						icon: 'none',
+						title: "验证码登录接口待对接",
+					});
+				}, 1000);
+			},
+			// 密码登录
+			loginByPassword() {
+				uni.showLoading({
+					title: "登录中..."
+				});
+				// TODO: 调用密码登录接口
+				// 示例:loginByPassword({ phone: this.phone, password: this.password })
+				setTimeout(() => {
+					uni.hideLoading();
+					uni.showToast({
+						icon: 'none',
+						title: "密码登录接口待对接",
+					});
+				}, 1000);
+			},
+			checkWeixin() {
+				var ua = window.navigator.userAgent.toLowerCase();
+				if (ua.match(/micromessenger/i) == 'micromessenger') {
+					return true;
+				} else {
+					return false;
+				}
+			},
+			//URL地址是否存在CODE
+			getUrlCode(name) {
+				return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) ||
+					[, ''
+					])[1]
+					.replace(/\+/g, '%20')) || null
+			},
+			//获取微信CODE
+			getWxCode() {
+				//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
+				//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
+				var appId = "wx40593595e62f61ad";
+				var url = "http://h5.yjf.runtzh.com";
+				window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appId +
+					'&redirect_uri=' + encodeURIComponent(url + "/#/pages/auth/wxLogin") +
+					'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
+				//console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
+				// redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
+			},
+			handleAgreement() {
+				this.isAgreement = !this.isAgreement;
+			},
+			openH5(url) {
+				var requestPath = uni.getStorageSync('requestPath');
+				uni.setStorageSync('url', requestPath + url);
+				uni.navigateTo({
+					url: '../home/web'
+				})
+			},
+			toForgetPassword(){
+				uni.navigateTo({
+					url: '/pages/auth/forgetPassword'
+				})
+			},
+			getCode() {
+				var that = this;
 				this.utils.getProvider()
-				.then(provider => {
-					console.log('当前的环境商',provider)
-					if (!provider) {
-					  reject()
-					}
-					// uni登录
-					uni.login({
-						provider: provider,
-						success: async loginRes => {
-							console.log(loginRes)
-							let code = loginRes.code // 获取开发code
-							var userCode=uni.getStorageSync('userCode');
-							loginByMiniApp({
-							   encryptedData: e.mp.detail.encryptedData,
-							   iv: e.mp.detail.iv,
-							   code: code,
-							   userCode:userCode
-							})
-							.then( res => {
-								if(res.code==200){
-									uni.hideLoading();
-									uni.showToast({
-										icon:'none',
-										title: "登录成功",
-									});
-									uni.setStorageSync('AppToken',res.token);
-									uni.setStorageSync('userInfo',JSON.stringify(res.user));
-									uni.hideLoading()
-									//that.getUserInfo()
-									uni.$emit('refreshLogin');
-									uni.navigateBack({
-										delta:1
-									})
-								}
-								else{
-									uni.hideLoading();
-									uni.showToast({
-										icon:'none',
-										title: "授权登录失败,请重新登录",
-									});
-								}
-							   
-							 })
-							 .catch(error => {
-								console.log(error)
-								uni.hideLoading();
-								uni.showToast({
-									icon:'none',
-									title: "登录接口调用失败",
-								});
-							 })
-							 
+					.then(provider => {
+						console.log('当前的环境商', provider)
+						if (!provider) {
+							reject()
 						}
+						// uni登录
+						uni.login({
+							provider: provider,
+							success: async loginRes => {
+								that.code = loginRes.code
+							}
+						})
 					})
-				})
-				.catch(err => {
+					.catch(err => {
+
+					})
+			},
+			// 微信用户手机号登录
+			phoneLogin(e) {
+				var that = this;
+				if (!this.isAgreement) {
 					uni.showToast({
-						icon:'none',
-						title: err,
+						icon: 'none',
+						title: "请先同意协议后再登录",
 					});
+					return false;
+				}
+				uni.showLoading({
+					title: "处理中..."
 				})
-				 
-			} else {
-				uni.showToast({
-					title: '已拒绝授权',
-					icon: 'none',
-					duration: 2000,
-				})
+				console.log(e, "e")
+				if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+					this.utils.getProvider()
+						.then(provider => {
+							console.log('当前的环境商', provider)
+							if (!provider) {
+								reject()
+							}
+							// uni登录
+							uni.login({
+								provider: provider,
+								success: async loginRes => {
+									console.log(loginRes)
+									let code = loginRes.code // 获取开发code
+									var userCode = uni.getStorageSync('userCode');
+									loginByMiniApp({
+											encryptedData: e.mp.detail.encryptedData,
+											iv: e.mp.detail.iv,
+											code: code,
+											userCode: userCode
+										})
+										.then(res => {
+											if (res.code == 200) {
+												uni.hideLoading();
+												uni.showToast({
+													icon: 'none',
+													title: "登录成功",
+												});
+												uni.setStorageSync('AppToken', res.token);
+												uni.setStorageSync('userInfo', JSON.stringify(res
+													.user));
+												uni.hideLoading()
+												//that.getUserInfo()
+												uni.$emit('refreshLogin');
+												uni.navigateBack({
+													delta: 1
+												})
+											} else {
+												uni.hideLoading();
+												uni.showToast({
+													icon: 'none',
+													title: "授权登录失败,请重新登录",
+												});
+											}
+
+										})
+										.catch(error => {
+											console.log(error)
+											uni.hideLoading();
+											uni.showToast({
+												icon: 'none',
+												title: "登录接口调用失败",
+											});
+										})
+
+								}
+							})
+						})
+						.catch(err => {
+							uni.showToast({
+								icon: 'none',
+								title: err,
+							});
+						})
+
+				} else {
+					uni.showToast({
+						title: '已拒绝授权',
+						icon: 'none',
+						duration: 2000,
+					})
+				}
+			},
+			back() {
+				uni.switchTab({
+					url: '/pages/home/index'
+				});
+				// uni.navigateBack()
 			}
-		},
-		back() {
-			uni.switchTab({
-				url: '/pages/home/index'
-			});
-			// uni.navigateBack()
 		}
 	}
-}
 </script>
 
 <style lang="scss">
-.container {
-  flex: 1;
-  padding:0 24rpx;
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-start;
-  position: relative;
-  .bg {
-  	width: 100%;
-  	position: absolute;
-  	top: 0;
-  	left: 0;
-  }
-  .backImg{
-	  display: flex;
-	  align-items: center;
-	  image{
-		  width: 40rpx;
-		  height: 40rpx;
-	  }
-	 
-	  margin-left: 32rpx;
-	  // position: absolute;
-	  // left: 30rpx;
-	  // z-index: 100;
-  }
-}
-
-.force-login-wrap {
-  width: 100%;
-  height: 100vh;
-  position: relative;
-
-  .top-title {
-    padding:0 32rpx;
-    text-align: left;
-    margin-top: 20rpx;
-    .title-text {
-      font-size: 56rpx;
-      font-family: PingFang SC;
-      font-weight: bold;
-      color: #000000;
-      margin-bottom: 20rpx;
-    }
-
-    .login-notice {
-      font-size: 26rpx;
-      font-family: PingFang SC;
-      font-weight: 400;
-      color: #999999;
-      line-height: 36rpx;
-    }
-  }
-
-  .force-login__content {
-	  margin-top: 54rpx;
-    padding:0 32rpx;
-	position: relative;
-	.bg-type{
-		width: 100%;
-		position: absolute;
-		top: 0;
-		left: 0;
-	}
-    .logintype {
-      display: flex;
-      margin-bottom: 66rpx;
-      border-bottom: 2rpx solid #f0f0f0;
-     
-      .logintype-item {
-        flex: 1;
-        text-align: center;
-       padding-top:36rpx;
-	   padding-bottom: 48rpx;
-       font-family: PingFang SC, PingFang SC;
-       font-weight: 400;
-       font-size: 32rpx;
-       color: #666666;
-        position: relative;
-        
-        &.active {
-         font-size: 36rpx;
-         color: #333333;
-          font-weight: 600;
-          &::after {
-            content: '';
-            position: absolute;
-            bottom: 30rpx;
-            left: 50%;
-            transform: translateX(-50%);
-            width: 52rpx;
-            height: 6rpx;
-            background: #388BFF;
-            border-radius: 42rpx;
-          }
-        }
-      }
-    }
-    
-    .input-form {
-      margin-bottom: 60rpx;
-      
-      .input-item {
-        background: #FFFFFF;
-        border-radius: 16rpx;
-        padding: 30rpx 40rpx;
-        margin-bottom: 48rpx;
-        box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
-        &::last-child{
-			margin-bottom:0
-		}
-        .input-field {
-          width: 100%;
-          font-size: 30rpx;
-          font-family: PingFang SC;
-          color: #333333;
-          
-          &::placeholder {
-            color: #CCCCCC;
-          }
-        }
-        .mima{
+	.container {
+		flex: 1;
+		padding: 0 24rpx;
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		position: relative;
+
+		.bg {
 			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		.backImg {
 			display: flex;
 			align-items: center;
-			justify-content: space-between;
-			image{
-				width: 32rpx;
-				height: 32rpx;
+
+			image {
+				width: 40rpx;
+				height: 40rpx;
 			}
+
+			margin-left: 32rpx;
+			// position: absolute;
+			// left: 30rpx;
+			// z-index: 100;
 		}
-        &.code-input-item {
-          display: flex;
-          align-items: center;
-          
-          .code-input {
-            flex: 1;
-          }
-          
-          .get-code-btn {
-            font-size: 28rpx;
-            font-family: PingFang SC;
-            font-weight: 500;
-            color: #388BFF;
-            padding-left: 20rpx;
-            border-left: 2rpx solid #f0f0f0;
-            white-space: nowrap;
-          }
-        }
-      }
-    }
-    
-    .login-btn-wrap {
-      margin-bottom: 40rpx;
-       margin-top:140rpx;
-      .login-btn {
-        width: 100%;
-        height: 88rpx;
-        background: rgba(56, 139, 255, 1);
-        border-radius: 44rpx;
-        font-size: 32rpx;
-        font-family: PingFang SC;
-        font-weight: 500;
-        color: #FFFFFF;
-        border: none;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        &::after {
-          border: none;
-        }
-      }
-    }
-  }
-}
-.tips{
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	font-size: 24rpx;
-	color: #666666;
-	flex-wrap: nowrap;
-	padding: 0 60rpx;
-	
-	checkbox{
-		margin-right: 10rpx;
-		flex-shrink: 0;
-	}
-	
-	.tips-text{
-		margin-right: 4rpx;
-		white-space: nowrap;
 	}
-	
-	.btn{
-		color:#388BFF;
-		margin: 0 2rpx;
-		white-space: nowrap;
-	}
-}
-
-
-.wx-login{
-	background: rgba(0,0,0,0.7);
-	z-index: 99999;
-	position: fixed;
-	top: 0;
-	left: 0;
-	height: 100%;
-	width: 100%;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	.form{
-		border-radius: 20rpx;
-		padding: 60rpx 30rpx;
-		width: 500upx;
-		height: 300upx;
-		background-color: #fff;
-		.title{
-			font-size: 32upx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			
-		}
-		.desc{
-			font-size: 28upx;
-			margin: 60upx 0upx 60upx 0upx;
-			font-family: PingFang SC;
-			font-weight: 500;
+
+	.force-login-wrap {
+		width: 100%;
+		height: 100vh;
+		position: relative;
+
+		.top-title {
+			padding: 0 32rpx;
+			text-align: left;
+			margin-top: 20rpx;
+
+			.title-text {
+				font-weight: 600;
+				font-size: 48rpx;
+				color: #333333;
+				margin-bottom: 20rpx;
+
+				.blue {
+					color: #157CF8;
+				}
+			}
+
+			.login-notice {
+				font-weight: 400;
+				font-size: 32rpx;
+				color: #666666;
+				line-height: 40rpx;
+			}
 		}
-		.btn-box{
-			margin-top: 30rpx;
-			width: 100%;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			
-			.btn{
+
+		.force-login__content {
+			margin-top: 54rpx;
+			padding: 0 32rpx;
+			position: relative;
+
+			.bg-type {
+				width: 100%;
+				position: absolute;
+				top: 0;
+				left: 0;
+			}
+
+			.logintype {
 				display: flex;
 				align-items: center;
-				justify-content: center;
-				margin-left: 10upx;
-				width: 50%;
-				height: 80rpx;
-				border-radius: 5rpx;
-				background-color: #0bb3f2;
-				font-size: 30rpx;
+				margin-bottom: 66rpx;
+				border-bottom: 2rpx solid #f0f0f0;
+
+				.line {
+					margin: 0 32rpx;
+					width: 2rpx;
+					height: 32rpx;
+					background: #D7E1F0;
+					border-radius: 0rpx 0rpx 0rpx 0rpx;
+				}
+
+				.logintype-item {
+					// flex: 1;
+					text-align: center;
+					padding-top: 36rpx;
+					padding-bottom: 48rpx;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 32rpx;
+					color: #666666;
+					position: relative;
+
+
+
+					&.active {
+						font-size: 36rpx;
+						color: #333333;
+						font-weight: 600;
+
+						&::after {
+							content: '';
+							position: absolute;
+							bottom: 30rpx;
+							left: 50%;
+							transform: translateX(-50%);
+							width: 52rpx;
+							height: 6rpx;
+							background: #157CF8;
+							border-radius: 42rpx;
+						}
+					}
+				}
+			}
+
+			.input-form {
+				margin-bottom: 60rpx;
+
+				.input-item {
+					background: #FFFFFF;
+					border-radius: 16rpx;
+					padding: 30rpx 40rpx;
+					margin-bottom: 48rpx;
+					box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+
+					&::last-child {
+						margin-bottom: 0
+					}
+
+					.input-field {
+						width: 100%;
+						font-size: 30rpx;
+						font-family: PingFang SC;
+						color: #333333;
+
+						&::placeholder {
+							color: #CCCCCC;
+						}
+					}
+
+					.mima {
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						image {
+							width: 32rpx;
+							height: 32rpx;
+						}
+					}
+
+					&.code-input-item {
+						display: flex;
+						align-items: center;
+
+						.code-input {
+							flex: 1;
+						}
+
+						.get-code-btn {
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #157CF8;
+							padding-left: 20rpx;
+							white-space: nowrap;
+						}
+					}
+				}
+			}
+
+			.forgot {
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #388BFF;
+				line-height: 40rpx;
+				display: flex;
+				justify-content: flex-end;
+				margin: -40rpx 0 24rpx;
+			}
+
+			.encoding {
+				width: 100%;
+				height: 104rpx;
+				line-height: 104rpx;
+				text-align: center;
+				background: #EDEFF2;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+				font-size: 32rpx;
+				color: #999999;
+			}
+
+			.login-btn-wrap {
+				margin-bottom: 40rpx;
+				margin-top: 140rpx;
+
+				.login-btn {
+					width: 100%;
+					height: 88rpx;
+					background: rgba(56, 139, 255, 1);
+					border-radius: 44rpx;
+					font-size: 32rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #FFFFFF;
+					border: none;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					&::after {
+						border: none;
+					}
+				}
+			}
+		}
+	}
+
+	.tips {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		font-size: 24rpx;
+		color: #666666;
+		flex-wrap: nowrap;
+		padding: 0 60rpx;
+
+		checkbox {
+			margin-right: 10rpx;
+			flex-shrink: 0;
+			transform: scale(0.8);
+		}
+
+		.tips-text {
+			margin-right: 4rpx;
+			white-space: nowrap;
+		}
+
+		.btn {
+			color: #157CF8;
+			margin: 0 2rpx;
+			white-space: nowrap;
+		}
+	}
+
+
+	.wx-login {
+		background: rgba(0, 0, 0, 0.7);
+		z-index: 99999;
+		position: fixed;
+		top: 0;
+		left: 0;
+		height: 100%;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		.form {
+			border-radius: 20rpx;
+			padding: 60rpx 30rpx;
+			width: 500upx;
+			height: 300upx;
+			background-color: #fff;
+
+			.title {
+				font-size: 32upx;
 				font-family: PingFang SC;
-				font-weight: 500;
-				color: #fff;
-				position: relative;
+				font-weight: bold;
+
 			}
-			.btn-close{
-				margin-right: 10upx;
-				width: 50%;
-				height: 80rpx;
-				border-radius: 5rpx;
-				border: 2rpx solid #0bb3f2;
-				background: none;
-				font-size: 30rpx;
+
+			.desc {
+				font-size: 28upx;
+				margin: 60upx 0upx 60upx 0upx;
 				font-family: PingFang SC;
 				font-weight: 500;
-				color: #0bb3f2;
+			}
+
+			.btn-box {
+				margin-top: 30rpx;
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.btn {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-left: 10upx;
+					width: 50%;
+					height: 80rpx;
+					border-radius: 5rpx;
+					background-color: #0bb3f2;
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #fff;
+					position: relative;
+				}
+
+				.btn-close {
+					margin-right: 10upx;
+					width: 50%;
+					height: 80rpx;
+					border-radius: 5rpx;
+					border: 2rpx solid #0bb3f2;
+					background: none;
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #0bb3f2;
+				}
 			}
 		}
 	}
-}
-.auth_btn{
-	width: 100%;
-	height: 100%;
-	top:0upx;
-	position: absolute;
-	opacity:0.0;
-}
-</style>
+
+	.auth_btn {
+		width: 100%;
+		height: 100%;
+		top: 0upx;
+		position: absolute;
+		opacity: 0.0;
+	}
+</style>

+ 132 - 0
pages/auth/setting.vue

@@ -0,0 +1,132 @@
+<template>
+	<view class="setting-page">
+		<view class="content">
+			<view class="info-item" @click="toChangePassword">
+				<view class="label">修改密码</view>
+				<view class="right">
+					<image class="w36 h36" src="@/static/image/icon_my_more.png" mode=""></image>
+				</view>
+			</view>
+			<view class="info-item">
+				<view class="label">版本号</view>
+				<view class="right">v{{ version }}</view>
+			</view>
+		</view>
+		<view class="btn-box">
+			<view class="logout-btn" @click="handleLogout">退出登录</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				version: "1.0"
+			}
+		},
+		onLoad() {
+			this.getVersion()
+		},
+		methods: {
+			getVersion() {
+				try {
+					const accountInfo = wx.getAccountInfoSync()
+					this.version = accountInfo.miniProgram.version || "1.0"
+				} catch (error) {
+					console.warn('获取版本号失败:', error)
+				}
+			},
+			
+			handleLogout() {
+				uni.showModal({
+					title: "提示",
+					content: "确认退出登录吗?",
+					confirmText: '确定',
+					success: (res) => {
+						if (res.confirm) {
+							this.logout()
+						}
+					}
+				})
+			},
+			toChangePassword(){
+				uni.navigateTo({
+					url: '/pages/auth/changePassword'
+				})
+			},
+			logout() {
+				// 清除登录相关存储
+				uni.removeStorageSync('CompanyUserToken')
+				uni.removeStorageSync('AppToken')
+				uni.removeStorageSync('userInfo')
+				
+				// 通知其他页面更新登录状态
+				uni.$emit('refreshLogin')
+				
+				// 跳转到登录页
+				uni.navigateTo({
+					url: '/pages/auth/login'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.setting-page {
+		background: #ffffff;
+		min-height: 100vh;
+		
+		.content {
+			background: #ffffff;
+		}
+		
+		.info-item {
+			height: 104upx;
+			padding: 0 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			border-bottom: 1px solid #F5F6FA;
+			
+			&:last-child {
+				border-bottom: none;
+			}
+			
+			.label {
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #0F1826;
+			}
+			
+			.right {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			
+			.w36 {
+				width: 36upx;
+				height: 36upx;
+			}
+		}
+		
+		.btn-box {
+			padding: 40upx 30upx;
+			
+			.logout-btn {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-family: PingFang SC;
+				font-size: 32upx;
+				color: #333333;
+				background: #F7F8FA;
+				border-radius: 44upx;
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/common/launch.vue

@@ -3,7 +3,7 @@
 		[[]]
 		<view class="loadding" v-if="loadding==true">
 			<image src="https://user.test.ylrztop.com/images/logo.png"></image>
-			<text class="text">互联网医院</text>
+			<text class="text">企业端</text>
 		</view>
 	</view>
 </template>

+ 2649 - 0
pages/home/index - 副本.vue

@@ -0,0 +1,2649 @@
+<template>
+	<view class="content">
+		<!-- 背景图片 -->
+		<image class="bg" src="@/static/image/top_bg.png" mode="widthFix"></image>
+		<view>
+			<view class="top-inner">
+				<view class="fixed-top-box" :style="{ background: bgColor ,paddingBottom:top>0?'20rpx':''}">
+					<!-- 这里是状态栏 -->
+					<!-- <view class="status_bar" :style="{height: statusBarHeight}"></view> -->
+					<!-- <view class="top-title">
+						<view class="name">企业端</view>
+				
+					</view> -->
+					<!-- 搜索框、购物车、客服 -->
+					<view class="func-cont" :style="{marginTop: menuButtonInfo.top}">
+						<view class="search-cont">
+							<image class="icon-search" src="@/static/image/icon_search.png" mode=""></image>
+							<input type="text" disabled value="" placeholder="请输入关键字或作者"
+								placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+							<view class="btn" @click="toSearch">搜索</view>
+						</view>
+						<!-- 购物车 -->
+						<!-- <uni-badge size="small" :text="cartCount" absolute="rightTop" type="error">
+							<view class="img-item" @click="goAuthUrl('../shopping/cart')">
+								<image src="../../static/images/cart_wihte.png" mode=""></image>
+							</view>
+						</uni-badge>
+						<view class="img-item" style="position: relative;">
+							<image src="../../static/images/customer.png" mode=""></image>
+							<button class="contact-btn" open-type="contact"></button>
+						</view> -->
+					</view>
+					<!-- <view class="tips">
+						
+						<view class="left"></view>
+						<view class="right"  @click="navTo('./cert')">资质证明</view>
+					</view> -->
+				</view>
+			</view>
+			<!-- 头部间距 -->
+			<view style="padding-bottom:100rpx">
+				<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			</view>
+			<!-- 轮播图 -->
+			<view class="banner-box">
+				<view class="inner">
+					<swiper class="swiper" :indicator-dots="true" :circular="true" :autoplay="true" :interval="3000"
+						:duration="1000" indicator-color="rgba(255, 255, 255, 0.6)" indicator-active-color="#ffffff">
+						<swiper-item class="swiper-item" v-for="(item,index) in advList" :key="index"
+							@click="handleAdvClick(item)">
+							<image :src="item.imageUrl" mode=""></image>
+						</swiper-item>
+					</swiper>
+				</view>
+			</view>
+
+		</view>
+		<!-- 养生讲堂 -->
+		<view class="doctor-articles">
+			<view class="box-title">
+				<view class="title-l">在线讲座</view>
+				<view class="title-m" @click="navTo('/pages_live/lecture')">
+					查看更多
+					<image src="@/static/image/icon_more.png" mode=""></image>
+				</view>
+			</view>
+			<view class="title-box">
+				<u-tabs :list="livetabList"
+					:activeStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',textAlign:'center',fontWeight: '500',color: '#fff',background: 'linear-gradient( 90deg, #61A3FF 0%, #207DFF 100%)',borderRadius:'98rpx'}"
+					:inactiveStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',fontWeight: '400',color: '#666666',background:'#fff',borderRadius:'98rpx',textAlign:'center'}"
+					lineColor="#F7F8FA" @click="selectlivetab"></u-tabs>
+			</view>
+			<scroll-view :scroll-x="true">
+				<view class="article-box">
+					<view class="article" @click="navTo('/pages_live/addForm')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="views">
+								<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
+								<view class="status">进行中</view>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="views">
+								<image mode="aspectFill" src="@/static/image/icon_tobestart.png"></image>
+								<view class="status">待开始</view>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="views">
+								<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
+								<view class="status">进行中</view>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+
+			</scroll-view>
+		</view>
+
+
+
+		<view class="doctor-articles">
+			<view class="box-title">
+				<view class="title-l">空中课堂</view>
+				<view class="title-m" @click="navTo('/pages_live/lesson')">查看更多
+					<image src="@/static/image/icon_more.png" mode=""></image>
+				</view>
+			</view>
+			<view class="title-box">
+				<u-tabs :list="livetabList"
+					:activeStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',textAlign:'center',fontWeight: '500',color: '#fff',background: 'linear-gradient( 90deg, #61A3FF 0%, #207DFF 100%)',borderRadius:'98rpx'}"
+					:inactiveStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',fontWeight: '400',color: '#666666',background:'#fff',borderRadius:'98rpx',textAlign:'center'}"
+					lineColor="#F7F8FA" @click="selectlivetab"></u-tabs>
+			</view>
+			<scroll-view :scroll-x="true">
+				<view class="article-box">
+					<view class="article" @click="navTo('/pages_live/lessonDetail?articleId=87')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="zhibo">
+								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="zhibo">
+								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
+						<view class="image-box">
+							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
+							<view class="zhibo">
+								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
+							</view>
+						</view>
+						<view class="article-title-box">
+							<view class="article-title one-t">王医生学术直播</view>
+							<view class="name-title one-t">
+								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+								<view class="one-t">
+									王小明-副主任医师/副主任副主任
+								</view>
+							</view>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// import zModal from '@/components/z-modal/z-modal.vue'
+	import {
+		getStoreActivity
+	} from '@/api/activity.js'
+	import {
+		getDepartmentList
+	} from '@/api/doctorOrder.js'
+	import {
+		getMenu,
+		getCanvas,
+		getIndexData,
+		getTuiDoctor,
+		getTuiArticle,
+		getTuiDoctorOrder,
+		getCartCount
+	} from '@/api/index'
+	import {
+		getDoctorArticleList
+	} from '@/api/doctorArticle.js'
+	import {
+		getArticleList
+	} from '@/api/article.js'
+	import {
+		getStoreConfig
+	} from '@/api/common'
+	import {
+		getUserInfo,
+		bindPromoter
+	} from '@/api/user'
+	export default {
+		data() {
+			return {
+				menuButtonInfo: {}, // 胶囊按钮布局信息
+				btnGroup: [{
+					text: '取消',
+					color: '#FFFFFF',
+					bgColor: '#999999',
+					width: '150rpx',
+					height: '80rpx',
+					shape: 'fillet',
+					eventName: 'cancle'
+				}, {
+					text: '确定',
+					color: '#FFFFFF',
+					bgColor: '#0bb3f2',
+					width: '150rpx',
+					height: '80rpx',
+					shape: 'fillet',
+					eventName: 'sure'
+				}],
+				tuiModalControl: false,
+				activity: null,
+				activityShow: false,
+				newProductList: [],
+				hotProductList: [],
+				tuiProductList: [],
+				menus: [],
+				canvas: [],
+				allDoctorTitle: "全部医生",
+				topLen: 0,
+				deptId: 0,
+				depts: [],
+				docTab: 1,
+				top: 0,
+				cartCount: 0,
+				doctorOrderList: [],
+				orderType: 0,
+				cateId: null,
+				articleList: [],
+				advList: [],
+				doctorList: [],
+				articleCateList: [],
+				doctocArticles: [], //养生讲堂
+				articles: [], //养生干货
+				livetabList: [{
+						name: '养生讲堂'
+					},
+					{
+						name: '健康管理'
+					},
+					{
+						name: '养生滋补'
+					}
+				], //养生讲堂TAB
+				articletabList: [{
+						name: '健康案例分享'
+					},
+					{
+						name: '药事服务'
+					}
+				], //文章TAB
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				// tabBg: tabBg, // tab切换背景
+				// 问诊案例类型
+				orderTypes: [{
+					name: '全部',
+					id: 0,
+				}, {
+					name: '图文',
+					id: 1,
+				}, {
+					name: '语音',
+					id: 2,
+				}],
+				// 限时消息是否显示
+				messageShow: true,
+				yangshengs: [{
+						id: "1",
+						title: "药膳食疗",
+						page: "/pages_index/index/medicatedFoodList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/3cfbd47911cf4753aa9497eac500728d.png"
+					},
+					{
+						id: "2",
+						title: "穴位保健",
+						page: "/pages_index/index/vesselList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e93536a9dc1a4f8ca09545097b12fdea.png"
+					},
+					{
+						id: "3",
+						title: "特供中药",
+						page: "/pages_index/index/questionsList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e896972bd56f4e358188af36f2c5af42.png"
+					},
+					{
+						id: "4",
+						title: "营养特医",
+						page: "/pages_index/index/diseaseList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/d6f1851cccae414b8baf2ba07782f91b.png"
+					},
+					{
+						id: "5",
+						title: "古方精方",
+						page: "/pages_index/index/chineseMedicineList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/ff43572d0d004285b5a3b0ef2663c471.png"
+					},
+					{
+						id: "6",
+						title: "健康案例",
+						page: "/pages_index/index/famousPrescribeList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/45db770e58c34963b0d2ba24a958b617.png"
+					},
+					{
+						id: "7",
+						title: "中西药房",
+						page: "/pages_index/index/doctorArticleList",
+						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e793942797b24035b51f94d894bdfa0b.png"
+					},
+					{
+						id: "8",
+						title: "更多",
+						page: "",
+						icon: "/static/images/ysyd_more_icon.png"
+					}
+				],
+			}
+			this.getStoreActivity();
+		},
+		onLoad(option) {
+			this.getMenuButtonInfo(); // 初始化获取胶囊信息
+			if (option.userCode != null) {
+				uni.setStorageSync('userCode', option.userCode);
+				if (this.utils.checkLoginState()) {
+					this.getUserInfo();
+				}
+			}
+			if (option.hasOwnProperty('q') && option.q) {
+				// 通过下面这步解码,可以拿到url的值
+				const url = decodeURIComponent(option.q)
+				this.url = url;
+				// // 对url中携带的参数提取处理
+				const obj = this.utils.urlToObj(url)
+				uni.setStorageSync('userCode', obj.userCode);
+				if (this.utils.checkLoginState()) {
+					this.getUserInfo();
+				}
+			}
+			this.getStoreActivity()
+		},
+		// 暂停所有音频(一般用于页面切换时停止正在播放的音频)
+		onUnload() { //普通页面在 onUnload 生命周期中执行
+			uni.$emit('stop')
+		},
+		onHide() { //tabBar页面在onHide生命周期中执行
+			uni.$emit('stop')
+		},
+		onPageScroll(e) {
+			//console.log(e)
+			this.top = e.scrollTop;
+		},
+		mounted() {
+			//this.getDepartmentList();
+		},
+		onShareAppMessage(res) {
+			return {
+				title: '企业端-您的专属健康解决方案',
+				path: `/pages/common/launch`,
+				imageUrl: 'https://user.test.ylrztop.com/images/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		onReachBottom() {
+			console.log("onReachBottom")
+			// this.$refs.tuiProduct.getTuiProducts();
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: '企业端-您的专属健康解决方案',
+				query: '', //页面参数
+				imageUrl: 'https://user.test.ylrztop.com/images/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		computed: {
+			// 计算属性的 getter
+			bgColor: function() {
+				var top = this.top / 30;
+				return 'rgba(202, 230, 255,' + top + ')';
+			},
+		},
+		onShow() {
+			this.getMenu();
+			this.getIndexData()
+			//this.getTuiDoctorOrder();
+			// console.log(uni.getStorageSync('isLocation'))
+			// if(uni.getStorageSync('isLocation')==""){
+			// 	this.getLocation();
+			// }
+			if (this.utils.checkLoginState()) {
+				this.getCartCount();
+			}
+			this.getStoreConfig();
+			//this.getTuiDoctor()
+			// this.getCanvas();
+			this.getDoctorArticleList();
+			this.getArticleList();
+		},
+		methods: {
+			getUserInfo() {
+				getUserInfo().then(
+					res => {
+						if (res.code == 200) {
+							if (res.user != null) {
+								if (res.user.isPromoter == null || res.user.isPromoter == 0) {
+									this.tuiModalControl = true
+								}
+							}
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 获取胶囊按钮布局参数
+			getMenuButtonInfo() {
+				// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
+				const menuBtn = uni.getMenuButtonBoundingClientRect();
+				if (menuBtn) {
+
+					this.menuButtonInfo = {
+						top: menuBtn.top + 'px', // 胶囊顶部距离
+						height: menuBtn.height + 'px', // 胶囊高度
+						centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
+						right: menuBtn.right + 'px' // 胶囊右侧距离
+					};
+				}
+			},
+			cancleTui(e) {
+				this.tuiModalControl = false
+			},
+			submitTui(e) {
+				console.log(e)
+				// uni.navigateTo({
+				// 	url: '/pages_company/distribution'
+				// })
+				if (e.inputText == null || e.inputText == "") {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入邀请码",
+					});
+					return;
+				}
+				var data = {
+					userCode: e.inputText
+				};
+				bindPromoter(data).then(
+					res => {
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+							this.tuiModalControl = false
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+
+			},
+			bindload: function(detail) {},
+			binderror: function(detail) {},
+			closeActivity() {
+				this.activityShow = false;
+				// uni.setStorageSync(this.activity.activityId,null);
+			},
+			getStoreActivity() {
+				let data = {}
+				getStoreActivity(data).then(res => {
+					this.activity = res.activity;
+					if (this.activity != null) {
+						// if(uni.getStorageSync(this.activity.activityId)!=null)
+						// {
+						// 	uni.setStorageSync(this.activity.activityId,1);
+						// 	this.activityShow=true;
+						// }
+						// else{
+						// 	this.activityShow=false;
+						// }
+						this.activityShow = true;
+					} else {
+						this.activityShow = false;
+					}
+				})
+			},
+			showActivity() {
+				this.activityShow = false;
+				uni.navigateTo({
+					url: '/pages_shopping/shopping/activityDetails?activityId=' + this.activity.activityId
+				})
+			},
+			menuClick(item) {
+				if (item.linkType == 1) {
+					if (item.linkUrl == "/pages/shopping/index") {
+						uni.switchTab({
+							url: item.linkUrl
+						})
+					} else if (item.linkUrl == "/pages/healthy/index") {
+						uni.switchTab({
+							url: item.linkUrl
+						})
+					} else {
+
+						uni.navigateTo({
+							url: item.linkUrl
+						})
+					}
+
+				} else if (item.linkType == 0) {
+					uni.showToast({
+						icon: 'none',
+						title: "开发中...",
+					});
+				}
+			},
+			goDev() {
+				uni.showToast({
+					icon: 'none',
+					title: "开发中...",
+				});
+			},
+			//养生讲堂等直播tab
+			selectlivetab(item) {
+				// console.log('item', item);
+			},
+			// 健康案例分享等文章tab
+			selectarticletab(item) {
+				// console.log('item', item);
+			},
+			handleAdvClick(item) {
+				console.log(item);
+				if (item.showType == 1) {
+					uni.setStorageSync('url', item.advUrl);
+					uni.navigateTo({
+						url: "h5"
+					})
+				} else if (item.showType == 2) {
+					uni.navigateTo({
+						url: item.advUrl
+					})
+				} else if (item.showType == 3) {
+					uni.setStorageSync('content', item.content);
+					uni.navigateTo({
+						url: "content"
+					})
+				}
+
+			},
+			deptChange(item) {
+				this.deptId = item.departmentId;
+				this.getTuiDoctor();
+			},
+			getMenu() {
+				getMenu().then(res => {
+					console.log(res)
+					if (res.code == 200) {
+						this.menus = res.data
+					} else {
+
+					}
+				});
+			},
+			getCanvas() {
+				getCanvas().then(res => {
+					if (res.code == 200) {
+						console.log(res.data)
+						this.canvas = JSON.parse(res.data.json)
+					}
+				});
+			},
+			getDepartmentList() {
+				this.depts = [];
+				getDepartmentList().then(res => {
+					if (res.code == 200) {
+						var allDept = {
+							departmentId: 0,
+							departmentName: "全部"
+						}
+						this.depts.push(allDept);
+						this.depts = this.depts.concat(res.data);
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getTuiDoctor() {
+				let data = {
+					departmentId: this.deptId,
+					doctorType: this.docTab
+				};
+				getTuiDoctor(data).then(
+					res => {
+						if (res.code == 200) {
+							this.doctorList = res.data;
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			docTabChange(val) {
+				if (val == 1) {
+					this.allDoctorTitle = "全部医师"
+				}
+				if (val == 2) {
+					this.allDoctorTitle = "全部药师"
+				}
+				if (val == 3) {
+					this.allDoctorTitle = "全部营养师"
+				}
+				this.docTab = val;
+				this.getTuiDoctor();
+			},
+			showImg(urls) {
+				var imgArr = urls.split(',');
+				//预览图片
+				uni.previewImage({
+					urls: imgArr,
+					current: imgArr[0]
+				});
+			},
+			getStoreConfig() {
+				getStoreConfig().then(
+					res => {
+						if (res.code == 200) {
+							uni.setStorageSync('config', JSON.stringify(res.data));
+						}
+					},
+					rej => {}
+				);
+
+			},
+			goAuthUrl(url) {
+				this.utils.isLogin().then(res => {
+					if (res) {
+						uni.navigateTo({
+							url: url
+						})
+					}
+				})
+			},
+			// 跳转页面
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				})
+			},
+			getLocation() {
+				var that = this;
+				uni.authorize({
+					scope: 'scope.userLocation',
+					success() {
+						uni.getLocation({
+							type: 'gcj02', //腾讯地图使用gcj02获取位置坐标
+							success: function(res) {
+								uni.setStorageSync('isLocation', 1);
+								uni.setStorageSync('lng', res.longitude);
+								uni.setStorageSync('lat', res.latitude);
+							},
+						})
+					},
+					fail(err) {
+						console.log(err)
+					}
+				})
+			},
+			getIndexData() {
+				let data = {};
+				getIndexData(data).then(
+					res => {
+						if (res.code == 200) {
+							this.advList = res.data.advList;
+							this.articleCateList = res.data.articleCateList;
+							if (this.articleCateList != null && this.articleCateList.length > 0) {
+								this.cateId = this.articleCateList[0].cateId;
+								this.getTuiArticle()
+							}
+							this.tuiProductList = res.data.tuiProductList
+							this.newProductList = res.data.newProductList
+							this.hotProductList = res.data.hotProductList
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getCartCount() {
+				this.utils.isLogin().then(res => {
+					if (res) {
+						getCartCount().then(
+							cartRes => {
+								if (cartRes.code == 200) {
+									this.cartCount = cartRes.data;
+								}
+							},
+							rej => {}
+						);
+					}
+				})
+			},
+			getTuiArticle() {
+				let data = {
+					cateId: this.cateId
+				};
+				getTuiArticle(data).then(
+					res => {
+						if (res.code == 200) {
+							this.articleList = res.data;
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getTuiDoctorOrder() {
+				let data = {
+					orderType: this.orderType
+				};
+				getTuiDoctorOrder(data).then(
+					res => {
+						if (res.code == 200) {
+							this.doctorOrderList = res.data;
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			showArticle(item) {
+				uni.navigateTo({
+					url: '../healthy/detail?articleId=' + item.articleId
+				})
+			},
+			showProduct(item) {
+				uni.navigateTo({
+					url: '../shopping/productDetails?productId=' + item.productId
+				})
+			},
+			// 顶部搜索
+			toSearch() {
+				uni.navigateTo({
+					url: '/pages_live/search'
+				})
+			},
+			// 健康知识选中
+			articleCateChange(item) {
+				this.cateId = item.cateId;
+				this.getTuiArticle();
+			},
+			// 问诊案例选中
+			orderTypeChange(item) {
+				this.orderType = item.id;
+				console.log(this.orderType)
+				this.getTuiDoctorOrder();
+			},
+			// 关闭限时消息
+			closeMsg() {
+				this.messageShow = false
+			},
+			// 查看全部
+			viewAll(url) {
+				uni.navigateTo({
+					url: '/pages/home/' + url,
+				});
+			},
+			shopDoctor(item) {
+				console.log(item);
+				uni.navigateTo({
+					url: "/pages_doctor/doctorDetail?doctorId=" + item.doctorId
+				})
+			},
+			switchTo(url) {
+				uni.switchTab({
+					url: url
+				})
+				return
+			},
+			yangshengClick(item) {
+				if (item.page == "") {
+					uni.showToast({
+						icon: "none",
+						title: '暂无更多'
+					})
+					return;
+				}
+				uni.navigateTo({
+					url: item.page
+				})
+			},
+			// 在线问诊
+			openIm() {
+				uni.navigateTo({
+					url: '/pages_doctor/doctorOrderIM?orderId=10'
+				})
+			},
+			getDoctorArticleList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					pageNum: 1,
+					pageSize: 10
+				};
+				getDoctorArticleList(data).then(res => {
+					if (res.code == 200) {
+						this.doctocArticles = res.data.list;
+					}
+				});
+			},
+			getArticleList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui: 1,
+					pageNum: 1,
+					pageSize: 10,
+				};
+				getArticleList(data).then(res => {
+					if (res.code == 200) {
+						this.articles = res.data.list;
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.ellipsis1 {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+
+	.fixed-top-box {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 1000;
+		transition: all 0.5s;
+		background-color: #0bb3f2;
+
+		&.show-back {
+			// background: linear-gradient(135deg, #66b2ef 0%, #0bb3f2 100%);
+		}
+
+		.status_bar {
+
+			width: 100%;
+		}
+	}
+
+	.content {
+		width: 100%;
+		background: #F7F8FA;
+		position: relative;
+		padding-bottom: 28rpx;
+
+		.bg {
+			width: 100%;
+			// height: 380rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		.top-inner {
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 5;
+
+			.top-title {
+				height: 88upx;
+				line-height: 88upx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+
+				.name {
+					font-size: 42upx;
+					font-family: Source Han Sans CN;
+					font-weight: bold;
+					color: #FFFFFF;
+					padding-left: 41upx;
+				}
+
+				.dot {
+					margin: 0upx 10upx;
+					font-size: 28upx;
+					color: #FFFFFF;
+					opacity: 0.5;
+				}
+
+				.sub-name {
+					font-size: 30upx;
+					font-family: Source Han Sans CN;
+					color: #FFFFFF;
+				}
+
+
+			}
+
+			.func-cont {
+				box-sizing: border-box;
+				display: flex;
+				align-items: center;
+				padding: 0 20upx;
+
+				.search-cont {
+					box-sizing: border-box;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					width: 500rpx;
+					height: 64rpx;
+					background: rgba(255, 255, 255, 0.6);
+					border-radius: 38rpx 38rpx 38rpx 38rpx;
+					border: 2rpx solid #388BFF;
+					padding-left: 30rpx;
+					padding-right: 8rpx;
+
+					.icon-search {
+						width: 32rpx;
+						height: 32rpx;
+						margin-right: 14rpx;
+					}
+
+					input {
+						height: 64rpx;
+						line-height: 64rpx;
+						// flex: 1;
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 400;
+						font-size: 28rpx;
+						color: #999999;
+					}
+
+					.btn {
+						width: 88rpx;
+						height: 48rpx;
+						background: #388BFF;
+						border-radius: 40rpx 40rpx 40rpx 40rpx;
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 400;
+						font-size: 28rpx;
+						color: #FFFFFF;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+					}
+				}
+
+				v-deep.uni-badge {
+					border: none;
+					background-color: #FF3636;
+					font-family: Roboto;
+				}
+
+				.img-item {
+					width: 44upx;
+					height: 44upx;
+					margin-left: 30upx;
+
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+
+			.tips {
+				margin: 0upx 20rpx 30rpx;
+				height: 40upx;
+				line-height: 40upx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				.left {
+					font-size: 30upx;
+					color: #FFFFFF;
+				}
+
+				.right {
+					padding: 5upx 20rpx;
+					font-size: 24upx;
+					color: #FFFFFF;
+					background-color: #0bb3f2;
+					border-radius: 50rpx;
+				}
+			}
+		}
+
+		.banner-box {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 100%;
+
+			.inner {
+				width: 702rpx;
+				height: 280rpx;
+				border-radius: 16rpx;
+				overflow: hidden;
+
+				.swiper,
+				.swiper-item,
+				.swiper-item image {
+					width: 702rpx;
+					height: 280rpx;
+				}
+
+			}
+		}
+
+		.menu-content {
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			margin: 20rpx 24rpx;
+			overflow: hidden;
+			padding: 30upx 0;
+			background-color: #ffffff;
+		}
+
+		.menu-box {
+			display: flex;
+			align-items: center;
+			background-color: #FFFFFF;
+			padding-top: 20rpx;
+			border-radius: 12rpx;
+		}
+
+		.online-inquiry {
+			box-sizing: border-box;
+			width: 100%;
+			height: 170upx;
+			padding: 0 20upx;
+			margin-top: 20rpx;
+			// background: linear-gradient(180deg, rgba(255, 255, 255, 0.38) 62%, rgba(255, 255, 255, 0) 100%);
+			display: flex;
+			justify-content: space-between;
+
+			.item {
+				// width: 46.13%;
+				width: 346upx;
+				height: 190upx;
+				position: relative;
+
+				.bg-img,
+				.inner {
+					width: 100%;
+					height: 100%;
+					position: absolute;
+					top: 0;
+					left: 0;
+					z-index: 1;
+					border-radius: 12rpx;
+				}
+
+				.inner {
+					box-sizing: border-box;
+					z-index: 2;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					padding-left: 32upx;
+
+					.title {
+						font-size: 32upx;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						margin-bottom: 20upx;
+						font-weight: bold;
+					}
+
+					.sub-title {
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #898E91;
+					}
+
+					image {
+						width: 80upx;
+						height: 90upx;
+						position: absolute;
+						right: 7upx;
+						bottom: 7upx;
+					}
+				}
+			}
+		}
+
+		.index-cont {
+			box-sizing: border-box;
+			// padding: 0 20upx 120rpx;
+			padding: 0 24upx 20upx;
+
+			.pub-item {
+				background: #FFFFFF;
+				border-radius: 16upx;
+				margin-bottom: 20upx;
+
+				.tabs {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: flex-start;
+					height: 110rpx;
+					background-color: #F0F3F4;
+
+					.tab {
+						height: 110rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						flex: 1;
+
+						.img {
+							z-index: 1;
+							position: absolute;
+							top: 0rpx;
+							left: 0rpx;
+							width: 100%;
+							height: 100%;
+						}
+
+						.inner {
+							z-index: 2;
+
+							.title {
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #666666;
+							}
+
+							.active {
+								color: #0bb3f2;
+							}
+						}
+
+					}
+
+
+				}
+
+				.pub-title-box {
+					box-sizing: border-box;
+					padding: 36upx 30upx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+
+					.left {
+						font-size: 32upx;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+
+					.right {
+						display: flex;
+						align-items: center;
+						justify-content: center;
+
+						.text {
+							font-size: 24rpx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							margin-right: 10upx;
+						}
+
+						image {
+							width: 14upx;
+							height: 24upx;
+						}
+					}
+
+				}
+
+				.doc-tab-box {
+					padding: 14rpx 30rpx 0rpx 30rpx;
+					position: relative;
+
+					.tab-inner {
+						padding: 14upx 0 30upx;
+						display: flex;
+						overflow-x: auto;
+					}
+
+					.item {
+						font-size: 28upx;
+						white-space: nowrap;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						margin-right: 40upx;
+						position: relative;
+
+						&:last-child {
+							margin-right: 0;
+						}
+
+						&.active {
+							font-weight: bold;
+							color: #333333;
+						}
+
+						&.cases {
+							margin-right: 60upx;
+						}
+
+						.text {
+							position: relative;
+							z-index: 1;
+						}
+
+						.tab-bg {
+							width: 72upx;
+							height: 28upx;
+							position: absolute;
+							top: 17upx;
+							left: 50%;
+							transform: translateX(-36upx);
+							z-index: -1;
+						}
+					}
+
+					.right-mask {
+						width: 56upx;
+						height: 34upx;
+						position: absolute;
+						top: 25upx;
+						right: 0upx;
+						z-index: 1;
+					}
+				}
+
+				.doc-list {
+					padding: 20upx;
+
+					.item {
+						box-sizing: border-box;
+						background: #FFFFFF;
+						// border-radius: 16upx;
+						display: flex;
+						border-bottom: 1px solid #F0F0F0;
+						margin-bottom: 30rpx;
+
+						.head-box {
+							width: 120upx;
+							height: 120upx;
+							background: #EDF1F4;
+							border-radius: 50%;
+							overflow: hidden;
+							margin-right: 30upx;
+
+							image {
+								width: 100%;
+								height: 100%;
+							}
+						}
+
+						.info {
+							width: calc(100% - 150upx);
+
+							.top {
+								display: flex;
+								align-items: center;
+								font-family: PingFang SC;
+								line-height: 1;
+
+								.name {
+									font-size: 34upx;
+									font-weight: bold;
+									color: #111111;
+								}
+
+								.line {
+									width: 1px;
+									height: 26upx;
+									background: #DDDDDD;
+									margin: 0 20upx;
+								}
+
+								.other {
+									font-size: 28upx;
+									font-weight: 500;
+									color: #333333;
+								}
+							}
+
+							.unit-box {
+								display: flex;
+								margin-top: 24upx;
+
+								.level {
+									padding: 0 10upx;
+									height: 30upx;
+									line-height: 30upx;
+									font-size: 22upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #FFFFFF;
+									background: #0bb3f2;
+									border-radius: 10upx 4upx 10upx 4upx;
+									margin-right: 12upx;
+								}
+
+								.name {
+									font-size: 28upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #333333;
+									line-height: 30upx;
+								}
+							}
+
+							.expertise {
+								font-size: 26upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #666666;
+								line-height: 42upx;
+								margin: 22upx 0 26upx;
+							}
+
+							.rate-box {
+								display: flex;
+								align-items: center;
+
+								.star {
+									display: flex;
+									align-items: center;
+
+									image {
+										width: 22upx;
+										height: 22upx;
+										margin-right: 10upx;
+									}
+
+									text {
+										font-size: 26upx;
+										font-family: PingFang SC;
+										font-weight: bold;
+										color: #CEA764;
+										line-height: 1;
+									}
+								}
+
+								.line {
+									width: 1px;
+									height: 20upx;
+									background: #DDDDDD;
+									margin: 0 20upx;
+								}
+
+								.num-box {
+									display: flex;
+									align-items: center;
+									font-family: PingFang SC;
+
+									.label {
+										font-size: 24upx;
+										font-weight: 500;
+										color: #999999;
+										line-height: 1;
+										margin-right: 7px;
+									}
+
+									.num {
+										font-size: 26upx;
+										font-weight: bold;
+										color: #CEA764;
+										line-height: 1;
+									}
+								}
+							}
+
+							.price-box {
+								display: flex;
+								align-items: center;
+								margin-top: 38upx;
+
+								.btn-item {
+									display: flex;
+									align-items: center;
+									justify-content: center;
+									width: 164upx;
+									height: 56upx;
+									line-height: 56upx;
+									border: 1px solid rgba(43, 199, 185, 0.5);
+									border-radius: 28upx;
+									font-family: PingFang SC;
+									margin-right: 30upx;
+
+									&:last-child {
+										margin-right: 0;
+									}
+
+									.label {
+										font-size: 26upx;
+										font-weight: 500;
+										color: #0bb3f2;
+										margin-right: 5upx;
+									}
+
+									.num {
+										font-size: 28upx;
+										font-weight: bold;
+										color: #0bb3f2;
+									}
+								}
+							}
+						}
+					}
+
+					.item:last-child {
+						border-bottom: none;
+						margin-bottom: 0rpx;
+					}
+
+					.bottom-title {
+						height: 50rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 26rpx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #0bb3f2;
+
+						image {
+							margin-left: 8rpx;
+							width: 14rpx;
+							height: 24rpx;
+						}
+					}
+				}
+
+				// 医师团队
+				.doc-cont {
+					box-sizing: border-box;
+					padding: 0 30upx;
+
+					.inner {
+						padding: 4upx 0 40upx;
+						display: flex;
+						overflow-x: auto;
+					}
+
+					.item {
+						display: flex;
+						align-items: center;
+						flex-direction: column;
+						margin-right: 40upx;
+
+						&:last-child {
+							margin-right: 0;
+						}
+
+						.head-box {
+							width: 120upx;
+							height: 120upx;
+							background: #F2F5F9;
+							border-radius: 50%;
+							margin-bottom: 20upx;
+							overflow: hidden;
+
+							image {
+								width: 100%;
+								height: 100%;
+							}
+						}
+
+						.name {
+							max-width: 120upx;
+							font-size: 28upx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							margin-bottom: 16upx;
+							text-align: center;
+						}
+
+						.position {
+							max-width: 120upx;
+							font-size: 24upx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							text-align: center;
+						}
+					}
+				}
+
+				.inner {
+					padding: 0 30upx;
+				}
+
+				// 健康知识
+				.pub-tab-box {
+					position: relative;
+
+					.tab-inner {
+						padding: 14upx 0 30upx;
+						display: flex;
+						overflow-x: auto;
+					}
+
+					.item {
+						font-size: 28upx;
+						white-space: nowrap;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						margin-right: 40upx;
+						position: relative;
+
+						&:last-child {
+							margin-right: 0;
+						}
+
+						&.active {
+							font-weight: bold;
+							color: #333333;
+						}
+
+						&.cases {
+							margin-right: 60upx;
+						}
+
+						.text {
+							position: relative;
+							z-index: 1;
+						}
+
+						.tab-bg {
+							width: 72upx;
+							height: 28upx;
+							position: absolute;
+							top: 17upx;
+							left: 50%;
+							transform: translateX(-36upx);
+							z-index: -1;
+						}
+					}
+
+					.right-mask {
+						width: 56upx;
+						height: 34upx;
+						position: absolute;
+						top: 14upx;
+						right: -30upx;
+						z-index: 1;
+					}
+				}
+
+				.know-list {
+					padding-right: 10upx;
+
+					.item {
+						padding: 30upx 0;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						border-bottom: 1px solid #F0F0F0;
+
+						&:last-child {
+							border-bottom: none;
+						}
+
+						.left {
+							flex: 1;
+							padding-right: 40upx;
+							height: 190upx;
+							display: flex;
+							flex-direction: column;
+							justify-content: space-between;
+
+							.title {
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+								line-height: 48upx;
+							}
+
+							.info-box {
+								width: 100%;
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+
+								.readers {
+									display: flex;
+									align-items: center;
+
+									.head-box {
+										margin-right: 27upx;
+										display: flex;
+										align-items: center;
+
+										.head {
+											width: 48upx;
+											height: 48upx;
+											border-radius: 50%;
+											overflow: hidden;
+											box-shadow: 0 0 0 1px #fff;
+											margin-right: -10upx;
+
+											image {
+												width: 100%;
+												height: 100%;
+											}
+										}
+									}
+
+									.readings {
+										display: flex;
+										align-items: center;
+
+										.eye {
+											width: 26upx;
+											height: 20upx;
+											margin-right: 9upx;
+										}
+
+										.num {
+											font-size: 24upx;
+											font-family: PingFang SC;
+											font-weight: 500;
+											color: #999999;
+											line-height: 1;
+										}
+									}
+								}
+
+								.time {
+									font-size: 24upx;
+									line-height: 1;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #999999;
+								}
+							}
+						}
+
+						.right {
+							width: 250upx;
+							height: 190upx;
+							border-radius: 8upx;
+							overflow: hidden;
+
+							image {
+								width: 100%;
+								height: 100%;
+							}
+						}
+					}
+				}
+
+				// 问诊案例
+				.cases-list {
+					padding-bottom: 10upx;
+
+					.item {
+						padding: 30upx 0;
+						border-bottom: 1px solid #F0F0F0;
+
+						&:last-child {
+							border-bottom: none;
+						}
+
+						.dec-text {
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+							line-height: 48upx;
+						}
+
+						.images-box {
+							margin-top: 10upx;
+							display: flex;
+							flex-wrap: wrap;
+
+							.img-item {
+								width: 155upx;
+								height: 155upx;
+								background: #F5F5F5;
+								border-radius: 8upx;
+								margin: 0 10upx 10upx 0;
+								overflow: hidden;
+
+								image {
+									width: 48rpx;
+									height: 48rpx;
+								}
+
+								&:nth-child(4n) {
+									margin-right: 0;
+								}
+							}
+						}
+
+						.doc-info {
+							display: flex;
+							align-items: center;
+							margin: 30upx 0 20upx;
+
+							.head {
+								width: 60upx;
+								height: 60upx;
+								background: #F2F5F9;
+								border-radius: 50%;
+								margin-right: 20upx;
+								overflow: hidden;
+
+								image {
+									width: 100%;
+									height: 100%;
+								}
+							}
+
+							.name {
+								font-size: 28upx;
+								line-height: 1;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+							}
+
+							.line {
+								width: 1px;
+								height: 22upx;
+								background: #DDDDDD;
+								margin: 0 16upx;
+							}
+
+							.posit,
+							.address {
+								font-size: 26upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+							}
+						}
+
+						.answer-box {
+							width: 100%;
+							// height: 117upx;
+							background: #F5F7F7;
+							border-radius: 10upx;
+							display: flex;
+							flex-direction: column;
+							justify-content: center;
+
+							.text-inner {
+								// height: 84upx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #666666;
+								line-height: 42upx;
+								padding: 15upx;
+							}
+						}
+
+						.read-box {
+							margin-top: 30upx;
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+
+							image {
+								width: 24upx;
+								height: 19upx;
+								margin-right: 10upx;
+							}
+
+							.text {
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+							}
+						}
+					}
+				}
+			}
+
+			// 精选药品
+			.feat-title {
+				margin-top: 30upx;
+				padding: 10upx 0 33upx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				image {
+					width: 37upx;
+					height: 37upx;
+					margin: 0upx 20upx;
+				}
+
+				text {
+					font-size: 36upx;
+					line-height: 1;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+			}
+
+			.drug-list {
+				display: flex;
+				flex-wrap: wrap;
+
+				// margin-bottom: 20upx;
+				.item {
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					width: 345rpx;
+					background: #FFFFFF;
+					box-shadow: 0px 0px 10rpx 4rpx rgba(199, 199, 199, 0.22);
+					border-radius: 20rpx;
+					overflow: hidden;
+
+					&:nth-child(2n) {
+						margin-right: 0;
+					}
+
+					.img-box {
+						width: 100%;
+						height: 334upx;
+
+						image {
+							width: 100%;
+							height: 100%;
+						}
+					}
+
+					.info-box {
+						box-sizing: border-box;
+						height: 182upx;
+						padding: 20upx;
+
+						.title {
+							height: 80upx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							line-height: 40upx;
+						}
+
+						.price-box {
+							display: flex;
+							align-items: center;
+							margin-top: 20upx;
+
+							.now {
+								color: #FF6633;
+								display: flex;
+								align-items: flex-end;
+								margin-right: 20upx;
+								font-family: PingFang SC;
+
+								.unit {
+									font-size: 24upx;
+									line-height: 1.4;
+									margin-right: 4upx;
+								}
+
+								.num {
+									font-size: 36upx;
+									font-weight: bold;
+									line-height: 1;
+								}
+							}
+
+							.old {
+								font-size: 26upx;
+								font-family: PingFang SC;
+								text-decoration: line-through;
+								color: #BBBBBB;
+								line-height: 1;
+							}
+						}
+					}
+				}
+			}
+		}
+
+
+		.box-title {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding-bottom: 24rpx;
+            position: relative;
+			.title-l {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #333333;
+			}
+
+			.title-m {
+				display: flex;
+				align-items: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #999999;
+				margin-right: 4rpx;
+
+				image {
+					width: 32rpx;
+					height: 32rpx;
+				}
+			}
+		}
+
+		.doctor-articles {
+			z-index: 101;
+			margin-top: 40rpx;
+			padding: 0 24rpx;
+			// padding: 32rpx;
+			// background-color: #fff;
+			// border-radius: 16rpx;
+
+			.title-box {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: space-between;
+
+				::v-deep.u-tabs__wrapper__nav__item {
+					padding-left: 0 !important;
+				}
+
+				.title {
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+
+				.more {
+					display: flex;
+					align-items: center;
+					justify-content: flex-end;
+
+					.text {
+						font-size: 24rpx;
+						font-family: PingFang SC;
+						color: #9B9B9B;
+					}
+
+					image {
+						// margin-left: 10rpx;
+						width: 48rpx;
+						height: 48rpx;
+					}
+
+				}
+			}
+
+			.article-box {
+				padding-top: 24rpx;
+				overflow-x: auto;
+				box-sizing: border-box;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+
+				.article {
+					width: 320rpx;
+					height: 328rpx;
+					margin-right: 16rpx;
+					background: #fff;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					border-radius: 16rpx;
+
+					&:last-child {
+						margin-right: 0rpx;
+					}
+
+					.image-box {
+						width: 320rpx;
+						height: 180rpx;
+						position: relative;
+						border-radius: 16rpx 16rpx 0rpx 0rpx;
+
+						.bg {
+							border-radius: 16rpx 16rpx 0rpx 0rpx;
+							width: 320rpx;
+							height: 180rpx;
+						}
+
+						.views {
+							position: absolute;
+							top: 0rpx;
+							left: 0rpx;
+							width: 112rpx;
+							height: 32rpx;
+							display: flex;
+							align-items: center;
+							background: rgba(0, 0, 0, 0.4);
+							border-radius: 16rpx 0rpx 16rpx 0rpx;
+							font-weight: 500;
+							font-size: 20rpx;
+							color: #FFFFFF;
+							font-family: PingFang SC-Bold, PingFang SC;
+
+							image {
+								width: 36rpx;
+								height: 32rpx;
+								margin-right: 8rpx;
+							}
+						}
+
+						.zhibo {
+							position: absolute;
+							top: 50%;
+							left: 50%;
+							transform: translate(-50%, -50%);
+
+							image {
+								width: 56rpx;
+								height: 56rpx;
+							}
+						}
+
+
+						.doctor {
+							margin: 10rpx;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							position: absolute;
+							bottom: 0rpx;
+							left: 0rpx;
+
+							image {
+								border-radius: 50%;
+								width: 64rpx;
+								height: 64rpx;
+							}
+
+							.right {
+								width: 200rpx;
+								margin-left: 10rpx;
+								display: flex;
+								flex-direction: column;
+								align-items: flex-start;
+								justify-content: space-between;
+
+								.doc-name {
+									width: 200rpx;
+									font-size: 30rpx;
+									font-weight: bold;
+									font-family: PingFang SC;
+									color: #fff;
+								}
+
+								.doc-position {
+									width: 100%;
+									font-size: 28rpx;
+									font-family: PingFang SC;
+									color: #fff;
+									font-weight: bold;
+									opacity: 0.8;
+								}
+							}
+						}
+					}
+
+					.article-title-box {
+						width: 100%;
+						padding: 16rpx;
+						display: flex;
+						align-items: flex-start;
+						flex-direction: column;
+						justify-content: space-between;
+						height: 148rpx;
+						box-sizing: border-box;
+
+						.article-title {
+							font-family: PingFang SC, PingFang SC;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #333333;
+							.one-t{
+								width: 100%;
+							}
+						}
+
+						.name-title {
+							display: flex;
+							align-items: center;
+							font-family: PingFang SC, PingFang SC;
+							font-weight: 400;
+							font-size: 22rpx;
+							color: #999999;
+                            .one-t{
+								width: 80%;
+							}
+							image {
+								width: 28rpx;
+								height: 28rpx;
+								margin-right: 14rpx;
+							}
+						}
+
+						.position-title {
+							display: flex;
+							align-items: center;
+							font-family: PingFang SC, PingFang SC;
+							font-weight: 400;
+							font-size: 22rpx;
+							color: #999999;
+                            .one-t{
+								width: 80%;
+							}
+							image {
+								width: 28rpx;
+								height: 28rpx;
+								margin-right: 14rpx;
+							}
+						}
+					}
+
+				}
+
+			}
+		}
+
+		.doctors {
+			z-index: 101;
+			margin: 20rpx 15rpx;
+			padding: 20rpx;
+			box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
+			background-color: #fff;
+			border-radius: 15rpx;
+
+			.title-box {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: space-between;
+
+				.title {
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+
+				.more {
+					display: flex;
+					align-items: center;
+					justify-content: flex-end;
+
+					.text {
+						font-size: 24rpx;
+						font-family: PingFang SC;
+						color: #898E91;
+					}
+
+					image {
+						margin-left: 10rpx;
+						width: 15rpx;
+						height: 20rpx;
+					}
+
+				}
+			}
+
+		}
+
+		.articles {
+			z-index: 101;
+			margin-top: 40rpx;
+			padding: 0 24rpx;
+
+			.title-box {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: space-between;
+
+				::v-deep.u-tabs__wrapper__nav__item {
+					padding-left: 0 !important;
+				}
+
+				.title {
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+
+				.more {
+					display: flex;
+					align-items: center;
+					justify-content: flex-end;
+
+					.text {
+						font-size: 24rpx;
+						font-family: PingFang SC;
+						color: #898E91;
+						// width: calc(100% - 556rpx);
+					}
+
+					image {
+						// margin-left: 10rpx;
+						width: 48rpx;
+						height: 48rpx;
+					}
+
+				}
+			}
+
+			.article-box {
+				margin-top: 15rpx;
+				padding: 20rpx 0rpx 0rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+
+				.item {
+					width: 100%;
+					margin-bottom: 32rpx;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					border-bottom: 1px solid #ECECEC;
+					padding-bottom: 32rpx;
+
+					&:last-child {
+						margin-bottom: 0rpx;
+						border-bottom: 0;
+					}
+
+					.left {
+						flex: 1;
+						height: 160rpx;
+						margin-right: 30rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: space-between;
+						width: calc(100% - 260upx);
+
+						.title {
+							width: 100%;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+
+						.txt {
+							font-family: PingFang SC, PingFang SC;
+							font-size: 26rpx;
+							color: #898E91;
+						}
+
+						.views {
+							font-size: 24upx;
+							font-family: PingFang SC;
+							color: #B2B2B2;
+						}
+					}
+
+					.right {
+						image {
+							border-radius: 10rpx;
+							width: 220rpx;
+							height: 160rpx;
+							// border: 1px solid #eeeeee;
+						}
+					}
+				}
+			}
+		}
+
+		.packages {
+			z-index: 101;
+			margin: 20rpx 15rpx;
+			padding: 20rpx;
+			box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
+			background-color: #fff;
+			border-radius: 15rpx;
+
+			.title-box {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: space-between;
+
+				.title {
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+
+				.more {
+					display: flex;
+					align-items: center;
+					justify-content: flex-end;
+
+					.text {
+						font-size: 24rpx;
+						font-family: PingFang SC;
+						color: #9B9B9B;
+					}
+
+					image {
+						margin-left: 10rpx;
+						width: 15rpx;
+						height: 20rpx;
+					}
+
+				}
+			}
+
+			.package-box {
+				padding: 20rpx 0rpx 0rpx;
+				display: flex;
+				align-items: flex-start;
+				justify-content: flex-start;
+				flex-wrap: wrap;
+
+				.item {
+					width: calc(50% - 20rpx);
+					border-radius: 15rpx;
+					margin: 10rpx;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+
+					&:last-child {}
+
+					.top {
+						width: 100%;
+						height: 300rpx;
+
+						image {
+							border-radius: 15rpx 15rpx 0rpx 0rpx;
+							width: 100%;
+							height: 300rpx;
+						}
+
+					}
+
+					.bottom {
+						width: 100%;
+						margin-top: 15rpx;
+
+						.title {
+							font-weight: bold;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #111111;
+						}
+
+						.price-box {
+							margin-top: 10rpx;
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							width: 100%;
+
+							.price {
+								padding: 5rpx 10rpx;
+								background-color: #0bb3f2;
+								border-radius: 30rpx;
+								font-size: 20upx;
+								font-family: PingFang SC;
+								color: #ffffff;
+							}
+
+							.count {
+								font-size: 24upx;
+								font-family: PingFang SC;
+								color: #333333;
+							}
+
+						}
+					}
+				}
+			}
+
+
+		}
+	}
+
+
+	.official-account {
+		box-sizing: border-box;
+		width: 100%;
+		height: 100upx;
+		position: fixed;
+		bottom: 30upx;
+		z-index: 99;
+		padding: 0 20upx 180rpx 20upx;
+	}
+
+	// 消息
+	.message-box {
+		box-sizing: border-box;
+		width: 100%;
+		height: 84upx;
+		background: #F3FFFD;
+		border: 1px solid #C7E9E5;
+		box-shadow: 0px 4upx 12upx 0px rgba(90, 203, 138, 0.16);
+		border-radius: 16upx;
+		position: fixed;
+		left: 50%;
+		transform: translateX(-50%);
+		bottom: 30upx;
+		z-index: 99;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 0 20upx 0 30upx;
+
+		.left {
+			flex: 1;
+			display: flex;
+			align-items: center;
+
+			image {
+				width: 24upx;
+				height: 24upx;
+				margin-right: 18upx;
+			}
+
+			.text {
+				width: 90%;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #0bb3f2;
+			}
+		}
+
+		.btn {
+			width: 100upx;
+			height: 48upx;
+			line-height: 48upx;
+			text-align: center;
+			font-size: 24upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FFFFFF;
+			border: 1px solid #D2E6FF;
+			background: linear-gradient(135deg, #66b2ef 0%, #0bb3f2 100%);
+			border-radius: 24upx;
+			margin-left: 30upx;
+		}
+
+	}
+
+	.contact-btn {
+		display: inline-block;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+	}
+
+	.popup-box {
+		position: fixed;
+		top: 0;
+		right: 0;
+		left: 0;
+		bottom: 0;
+		z-index: 999;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+
+		.info-mask {
+			position: fixed;
+			top: 0;
+			right: 0;
+			bottom: 0;
+			left: 0;
+			background-color: rgba($color: #000000, $alpha: 0.5);
+			z-index: 999;
+		}
+
+		.info-form {
+			z-index: 1000;
+			width: 450rpx;
+			display: flex;
+			flex-direction: column;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+
+			image {
+				width: 100%;
+			}
+		}
+	}
+</style>

+ 75 - 2576
pages/home/index.vue

@@ -1,2649 +1,148 @@
 <template>
-	<view class="content">
-		<!-- 背景图片 -->
-		<image class="bg" src="@/static/image/top_bg.png" mode="widthFix"></image>
-		<view>
-			<view class="top-inner">
-				<view class="fixed-top-box" :style="{ background: bgColor ,paddingBottom:top>0?'20rpx':''}">
-					<!-- 这里是状态栏 -->
-					<!-- <view class="status_bar" :style="{height: statusBarHeight}"></view> -->
-					<!-- <view class="top-title">
-						<view class="name">互联网医院</view>
-				
-					</view> -->
-					<!-- 搜索框、购物车、客服 -->
-					<view class="func-cont" :style="{marginTop: menuButtonInfo.top}">
-						<view class="search-cont">
-							<image class="icon-search" src="@/static/image/icon_search.png" mode=""></image>
-							<input type="text" disabled value="" placeholder="请输入关键字或作者"
-								placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
-							<view class="btn" @click="toSearch">搜索</view>
-						</view>
-						<!-- 购物车 -->
-						<!-- <uni-badge size="small" :text="cartCount" absolute="rightTop" type="error">
-							<view class="img-item" @click="goAuthUrl('../shopping/cart')">
-								<image src="../../static/images/cart_wihte.png" mode=""></image>
-							</view>
-						</uni-badge>
-						<view class="img-item" style="position: relative;">
-							<image src="../../static/images/customer.png" mode=""></image>
-							<button class="contact-btn" open-type="contact"></button>
-						</view> -->
-					</view>
-					<!-- <view class="tips">
-						
-						<view class="left"></view>
-						<view class="right"  @click="navTo('./cert')">资质证明</view>
-					</view> -->
-				</view>
-			</view>
-			<!-- 头部间距 -->
-			<view style="padding-bottom:100rpx">
-				<view class="status_bar" :style="{height: statusBarHeight}"></view>
-			</view>
-			<!-- 轮播图 -->
-			<view class="banner-box">
-				<view class="inner">
-					<swiper class="swiper" :indicator-dots="true" :circular="true" :autoplay="true" :interval="3000"
-						:duration="1000" indicator-color="rgba(255, 255, 255, 0.6)" indicator-active-color="#ffffff">
-						<swiper-item class="swiper-item" v-for="(item,index) in advList" :key="index"
-							@click="handleAdvClick(item)">
-							<image :src="item.imageUrl" mode=""></image>
-						</swiper-item>
-					</swiper>
-				</view>
-			</view>
-
-		</view>
-		<!-- 养生讲堂 -->
-		<view class="doctor-articles">
-			<view class="box-title">
-				<view class="title-l">在线讲座</view>
-				<view class="title-m" @click="navTo('/pages_live/lecture')">
-					查看更多
-					<image src="@/static/image/icon_more.png" mode=""></image>
+	<view class="container">
+		<image class="bg" src="/static/image/bg_bench.png" mode="widthFix"></image>
+		<view class="status_bar" :style="{height: statusBarHeight}"></view>
+		<view class="content">
+			<view class="title">工作台</view>
+			<view class="summary-section ">
+				<view class="summary-header">
+					<view class="summary-indicator"></view>
+					<text class="summary-title">互联网</text>
 				</view>
-			</view>
-			<view class="title-box">
-				<u-tabs :list="livetabList"
-					:activeStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',textAlign:'center',fontWeight: '500',color: '#fff',background: 'linear-gradient( 90deg, #61A3FF 0%, #207DFF 100%)',borderRadius:'98rpx'}"
-					:inactiveStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',fontWeight: '400',color: '#666666',background:'#fff',borderRadius:'98rpx',textAlign:'center'}"
-					lineColor="#F7F8FA" @click="selectlivetab"></u-tabs>
-			</view>
-			<scroll-view :scroll-x="true">
-				<view class="article-box">
-					<view class="article" @click="navTo('/pages_live/addForm')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="views">
-								<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
-								<view class="status">进行中</view>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
+				<view class="list">
+					<view class="item" @click="navTo('/pages_task/xlTask')">
+						<image class="icon" src="/static/image/xl.png"></image>
+						<text>XL任务</text>
 					</view>
-					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="views">
-								<image mode="aspectFill" src="@/static/image/icon_tobestart.png"></image>
-								<view class="status">待开始</view>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
-					</view>
-					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="views">
-								<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
-								<view class="status">进行中</view>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
+					<view class="item" @click="navTo('/pages_speaker/index')">
+						<image class="icon" src="/static/image/speaker.png" ></image>
+						<text>讲者管理</text>
 					</view>
 				</view>
-
-			</scroll-view>
-		</view>
-
-
-
-		<view class="doctor-articles">
-			<view class="box-title">
-				<view class="title-l">空中课堂</view>
-				<view class="title-m" @click="navTo('/pages_live/lesson')">查看更多
-					<image src="@/static/image/icon_more.png" mode=""></image>
+				<view class="summary-header">
+					<view class="summary-indicator"></view>
+					<text class="summary-title">行政管理</text>
 				</view>
-			</view>
-			<view class="title-box">
-				<u-tabs :list="livetabList"
-					:activeStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',textAlign:'center',fontWeight: '500',color: '#fff',background: 'linear-gradient( 90deg, #61A3FF 0%, #207DFF 100%)',borderRadius:'98rpx'}"
-					:inactiveStyle="{width:'136rpx',height:'56rpx',lineHeight:'56rpx',fontWeight: '400',color: '#666666',background:'#fff',borderRadius:'98rpx',textAlign:'center'}"
-					lineColor="#F7F8FA" @click="selectlivetab"></u-tabs>
-			</view>
-			<scroll-view :scroll-x="true">
-				<view class="article-box">
-					<view class="article" @click="navTo('/pages_live/lessonDetail?articleId=87')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="zhibo">
-								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
-					</view>
-					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="zhibo">
-								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
-					</view>
-					<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId=')">
-						<view class="image-box">
-							<image class="bg" mode="aspectFill" src="@/static/image/bg_invitecard.png"></image>
-							<view class="zhibo">
-								<image mode="aspectFill" src="@/static/image/icon_video.png"></image>
-							</view>
-						</view>
-						<view class="article-title-box">
-							<view class="article-title one-t">王医生学术直播</view>
-							<view class="name-title one-t">
-								<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
-								<view class="one-t">
-									王小明-副主任医师/副主任副主任
-								</view>
-							</view>
-							<view class="position-title">
-								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
-								<view class="one-t">
-									北京人民医院
-								</view>
-							</view>
-						</view>
+				<view class="list">
+					<view class="item" @click="navTo('/pages_task/approvalCenter')">
+						<image class="icon" src="/static/image/approval.png"></image>
+						<text>审批中心</text>
 					</view>
 				</view>
-
-			</scroll-view>
+			</view>
 		</view>
+
 	</view>
 </template>
 
 <script>
-	// import zModal from '@/components/z-modal/z-modal.vue'
-	import {
-		getStoreActivity
-	} from '@/api/activity.js'
-	import {
-		getDepartmentList
-	} from '@/api/doctorOrder.js'
-	import {
-		getMenu,
-		getCanvas,
-		getIndexData,
-		getTuiDoctor,
-		getTuiArticle,
-		getTuiDoctorOrder,
-		getCartCount
-	} from '@/api/index'
-	import {
-		getDoctorArticleList
-	} from '@/api/doctorArticle.js'
-	import {
-		getArticleList
-	} from '@/api/article.js'
-	import {
-		getStoreConfig
-	} from '@/api/common'
-	import {
-		getUserInfo,
-		bindPromoter
-	} from '@/api/user'
 	export default {
 		data() {
 			return {
-				menuButtonInfo: {}, // 胶囊按钮布局信息
-				btnGroup: [{
-					text: '取消',
-					color: '#FFFFFF',
-					bgColor: '#999999',
-					width: '150rpx',
-					height: '80rpx',
-					shape: 'fillet',
-					eventName: 'cancle'
-				}, {
-					text: '确定',
-					color: '#FFFFFF',
-					bgColor: '#0bb3f2',
-					width: '150rpx',
-					height: '80rpx',
-					shape: 'fillet',
-					eventName: 'sure'
-				}],
-				tuiModalControl: false,
-				activity: null,
-				activityShow: false,
-				newProductList: [],
-				hotProductList: [],
-				tuiProductList: [],
-				menus: [],
-				canvas: [],
-				allDoctorTitle: "全部医生",
-				topLen: 0,
-				deptId: 0,
-				depts: [],
-				docTab: 1,
-				top: 0,
-				cartCount: 0,
-				doctorOrderList: [],
-				orderType: 0,
-				cateId: null,
-				articleList: [],
-				advList: [],
-				doctorList: [],
-				articleCateList: [],
-				doctocArticles: [], //养生讲堂
-				articles: [], //养生干货
-				livetabList: [{
-						name: '养生讲堂'
-					},
-					{
-						name: '健康管理'
-					},
-					{
-						name: '养生滋补'
-					}
-				], //养生讲堂TAB
-				articletabList: [{
-						name: '健康案例分享'
-					},
-					{
-						name: '药事服务'
-					}
-				], //文章TAB
 				// 状态栏的高度
-				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
-				// tabBg: tabBg, // tab切换背景
-				// 问诊案例类型
-				orderTypes: [{
-					name: '全部',
-					id: 0,
-				}, {
-					name: '图文',
-					id: 1,
-				}, {
-					name: '语音',
-					id: 2,
-				}],
-				// 限时消息是否显示
-				messageShow: true,
-				yangshengs: [{
-						id: "1",
-						title: "药膳食疗",
-						page: "/pages_index/index/medicatedFoodList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/3cfbd47911cf4753aa9497eac500728d.png"
-					},
-					{
-						id: "2",
-						title: "穴位保健",
-						page: "/pages_index/index/vesselList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e93536a9dc1a4f8ca09545097b12fdea.png"
-					},
-					{
-						id: "3",
-						title: "特供中药",
-						page: "/pages_index/index/questionsList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e896972bd56f4e358188af36f2c5af42.png"
-					},
-					{
-						id: "4",
-						title: "营养特医",
-						page: "/pages_index/index/diseaseList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/d6f1851cccae414b8baf2ba07782f91b.png"
-					},
-					{
-						id: "5",
-						title: "古方精方",
-						page: "/pages_index/index/chineseMedicineList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/ff43572d0d004285b5a3b0ef2663c471.png"
-					},
-					{
-						id: "6",
-						title: "健康案例",
-						page: "/pages_index/index/famousPrescribeList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/45db770e58c34963b0d2ba24a958b617.png"
-					},
-					{
-						id: "7",
-						title: "中西药房",
-						page: "/pages_index/index/doctorArticleList",
-						icon: "https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e793942797b24035b51f94d894bdfa0b.png"
-					},
-					{
-						id: "8",
-						title: "更多",
-						page: "",
-						icon: "/static/images/ysyd_more_icon.png"
-					}
-				],
-			}
-			this.getStoreActivity();
-		},
-		onLoad(option) {
-			this.getMenuButtonInfo(); // 初始化获取胶囊信息
-			if (option.userCode != null) {
-				uni.setStorageSync('userCode', option.userCode);
-				if (this.utils.checkLoginState()) {
-					this.getUserInfo();
-				}
-			}
-			if (option.hasOwnProperty('q') && option.q) {
-				// 通过下面这步解码,可以拿到url的值
-				const url = decodeURIComponent(option.q)
-				this.url = url;
-				// // 对url中携带的参数提取处理
-				const obj = this.utils.urlToObj(url)
-				uni.setStorageSync('userCode', obj.userCode);
-				if (this.utils.checkLoginState()) {
-					this.getUserInfo();
-				}
-			}
-			this.getStoreActivity()
-		},
-		// 暂停所有音频(一般用于页面切换时停止正在播放的音频)
-		onUnload() { //普通页面在 onUnload 生命周期中执行
-			uni.$emit('stop')
-		},
-		onHide() { //tabBar页面在onHide生命周期中执行
-			uni.$emit('stop')
-		},
-		onPageScroll(e) {
-			//console.log(e)
-			this.top = e.scrollTop;
-		},
-		mounted() {
-			//this.getDepartmentList();
-		},
-		onShareAppMessage(res) {
-			return {
-				title: '互联网医院-您的专属健康解决方案',
-				path: `/pages/common/launch`,
-				imageUrl: 'https://user.test.ylrztop.com/images/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
-			}
-		},
-		onReachBottom() {
-			console.log("onReachBottom")
-			// this.$refs.tuiProduct.getTuiProducts();
-		},
-		//分享到朋友圈
-		onShareTimeline(res) {
-			return {
-				title: '互联网医院-您的专属健康解决方案',
-				query: '', //页面参数
-				imageUrl: 'https://user.test.ylrztop.com/images/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				// statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
 			}
 		},
 		computed: {
-			// 计算属性的 getter
-			bgColor: function() {
-				var top = this.top / 30;
-				return 'rgba(202, 230, 255,' + top + ')';
-			},
-		},
-		onShow() {
-			this.getMenu();
-			this.getIndexData()
-			//this.getTuiDoctorOrder();
-			// console.log(uni.getStorageSync('isLocation'))
-			// if(uni.getStorageSync('isLocation')==""){
-			// 	this.getLocation();
-			// }
-			if (this.utils.checkLoginState()) {
-				this.getCartCount();
-			}
-			this.getStoreConfig();
-			//this.getTuiDoctor()
-			// this.getCanvas();
-			this.getDoctorArticleList();
-			this.getArticleList();
-		},
-		methods: {
-			getUserInfo() {
-				getUserInfo().then(
-					res => {
-						if (res.code == 200) {
-							if (res.user != null) {
-								if (res.user.isPromoter == null || res.user.isPromoter == 0) {
-									this.tuiModalControl = true
-								}
-							}
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
-						}
-					},
-					rej => {}
-				);
-			},
-			// 获取胶囊按钮布局参数
-			getMenuButtonInfo() {
-				// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
-				const menuBtn = uni.getMenuButtonBoundingClientRect();
-				if (menuBtn) {
-
-					this.menuButtonInfo = {
-						top: menuBtn.top + 'px', // 胶囊顶部距离
-						height: menuBtn.height + 'px', // 胶囊高度
-						centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
-						right: menuBtn.right + 'px' // 胶囊右侧距离
-					};
-				}
-			},
-			cancleTui(e) {
-				this.tuiModalControl = false
-			},
-			submitTui(e) {
-				console.log(e)
-				// uni.navigateTo({
-				// 	url: '/pages_company/distribution'
-				// })
-				if (e.inputText == null || e.inputText == "") {
-					uni.showToast({
-						icon: 'none',
-						title: "请输入邀请码",
-					});
-					return;
-				}
-				var data = {
-					userCode: e.inputText
-				};
-				bindPromoter(data).then(
-					res => {
-						if (res.code == 200) {
-							uni.showToast({
-								icon: 'none',
-								title: res.msg,
-							});
-							this.tuiModalControl = false
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: res.msg,
-							});
-						}
-					},
-					rej => {}
-				);
-
-			},
-			bindload: function(detail) {},
-			binderror: function(detail) {},
-			closeActivity() {
-				this.activityShow = false;
-				// uni.setStorageSync(this.activity.activityId,null);
-			},
-			getStoreActivity() {
-				let data = {}
-				getStoreActivity(data).then(res => {
-					this.activity = res.activity;
-					if (this.activity != null) {
-						// if(uni.getStorageSync(this.activity.activityId)!=null)
-						// {
-						// 	uni.setStorageSync(this.activity.activityId,1);
-						// 	this.activityShow=true;
-						// }
-						// else{
-						// 	this.activityShow=false;
-						// }
-						this.activityShow = true;
-					} else {
-						this.activityShow = false;
-					}
-				})
-			},
-			showActivity() {
-				this.activityShow = false;
-				uni.navigateTo({
-					url: '/pages_shopping/shopping/activityDetails?activityId=' + this.activity.activityId
-				})
-			},
-			menuClick(item) {
-				if (item.linkType == 1) {
-					if (item.linkUrl == "/pages/shopping/index") {
-						uni.switchTab({
-							url: item.linkUrl
-						})
-					} else if (item.linkUrl == "/pages/healthy/index") {
-						uni.switchTab({
-							url: item.linkUrl
-						})
-					} else {
-
-						uni.navigateTo({
-							url: item.linkUrl
-						})
-					}
 
-				} else if (item.linkType == 0) {
-					uni.showToast({
-						icon: 'none',
-						title: "开发中...",
-					});
-				}
-			},
-			goDev() {
-				uni.showToast({
-					icon: 'none',
-					title: "开发中...",
-				});
-			},
-			//养生讲堂等直播tab
-			selectlivetab(item) {
-				// console.log('item', item);
-			},
-			// 健康案例分享等文章tab
-			selectarticletab(item) {
-				// console.log('item', item);
-			},
-			handleAdvClick(item) {
-				console.log(item);
-				if (item.showType == 1) {
-					uni.setStorageSync('url', item.advUrl);
-					uni.navigateTo({
-						url: "h5"
-					})
-				} else if (item.showType == 2) {
-					uni.navigateTo({
-						url: item.advUrl
-					})
-				} else if (item.showType == 3) {
-					uni.setStorageSync('content', item.content);
-					uni.navigateTo({
-						url: "content"
-					})
-				}
-
-			},
-			deptChange(item) {
-				this.deptId = item.departmentId;
-				this.getTuiDoctor();
-			},
-			getMenu() {
-				getMenu().then(res => {
-					console.log(res)
-					if (res.code == 200) {
-						this.menus = res.data
-					} else {
+		},
+		watch: {
 
-					}
-				});
-			},
-			getCanvas() {
-				getCanvas().then(res => {
-					if (res.code == 200) {
-						console.log(res.data)
-						this.canvas = JSON.parse(res.data.json)
-					}
-				});
-			},
-			getDepartmentList() {
-				this.depts = [];
-				getDepartmentList().then(res => {
-					if (res.code == 200) {
-						var allDept = {
-							departmentId: 0,
-							departmentName: "全部"
-						}
-						this.depts.push(allDept);
-						this.depts = this.depts.concat(res.data);
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: "请求失败",
-						});
-					}
-				});
-			},
-			getTuiDoctor() {
-				let data = {
-					departmentId: this.deptId,
-					doctorType: this.docTab
-				};
-				getTuiDoctor(data).then(
-					res => {
-						if (res.code == 200) {
-							this.doctorList = res.data;
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
-						}
-					},
-					rej => {}
-				);
-			},
-			docTabChange(val) {
-				if (val == 1) {
-					this.allDoctorTitle = "全部医师"
-				}
-				if (val == 2) {
-					this.allDoctorTitle = "全部药师"
-				}
-				if (val == 3) {
-					this.allDoctorTitle = "全部营养师"
-				}
-				this.docTab = val;
-				this.getTuiDoctor();
-			},
-			showImg(urls) {
-				var imgArr = urls.split(',');
-				//预览图片
-				uni.previewImage({
-					urls: imgArr,
-					current: imgArr[0]
-				});
-			},
-			getStoreConfig() {
-				getStoreConfig().then(
-					res => {
-						if (res.code == 200) {
-							uni.setStorageSync('config', JSON.stringify(res.data));
-						}
-					},
-					rej => {}
-				);
+		},
+		onLoad() {
 
-			},
-			goAuthUrl(url) {
-				this.utils.isLogin().then(res => {
-					if (res) {
-						uni.navigateTo({
-							url: url
-						})
-					}
-				})
-			},
-			// 跳转页面
+		},
+		onReachBottom() {},
+		methods: {
 			navTo(url) {
 				uni.navigateTo({
 					url: url
 				})
-			},
-			getLocation() {
-				var that = this;
-				uni.authorize({
-					scope: 'scope.userLocation',
-					success() {
-						uni.getLocation({
-							type: 'gcj02', //腾讯地图使用gcj02获取位置坐标
-							success: function(res) {
-								uni.setStorageSync('isLocation', 1);
-								uni.setStorageSync('lng', res.longitude);
-								uni.setStorageSync('lat', res.latitude);
-							},
-						})
-					},
-					fail(err) {
-						console.log(err)
-					}
-				})
-			},
-			getIndexData() {
-				let data = {};
-				getIndexData(data).then(
-					res => {
-						if (res.code == 200) {
-							this.advList = res.data.advList;
-							this.articleCateList = res.data.articleCateList;
-							if (this.articleCateList != null && this.articleCateList.length > 0) {
-								this.cateId = this.articleCateList[0].cateId;
-								this.getTuiArticle()
-							}
-							this.tuiProductList = res.data.tuiProductList
-							this.newProductList = res.data.newProductList
-							this.hotProductList = res.data.hotProductList
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
-						}
-					},
-					rej => {}
-				);
-			},
-			getCartCount() {
-				this.utils.isLogin().then(res => {
-					if (res) {
-						getCartCount().then(
-							cartRes => {
-								if (cartRes.code == 200) {
-									this.cartCount = cartRes.data;
-								}
-							},
-							rej => {}
-						);
-					}
-				})
-			},
-			getTuiArticle() {
-				let data = {
-					cateId: this.cateId
-				};
-				getTuiArticle(data).then(
-					res => {
-						if (res.code == 200) {
-							this.articleList = res.data;
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
-						}
-					},
-					rej => {}
-				);
-			},
-			getTuiDoctorOrder() {
-				let data = {
-					orderType: this.orderType
-				};
-				getTuiDoctorOrder(data).then(
-					res => {
-						if (res.code == 200) {
-							this.doctorOrderList = res.data;
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
-						}
-					},
-					rej => {}
-				);
-			},
-			showArticle(item) {
-				uni.navigateTo({
-					url: '../healthy/detail?articleId=' + item.articleId
-				})
-			},
-			showProduct(item) {
-				uni.navigateTo({
-					url: '../shopping/productDetails?productId=' + item.productId
-				})
-			},
-			// 顶部搜索
-			toSearch() {
-				uni.navigateTo({
-					url: '/pages_live/search'
-				})
-			},
-			// 健康知识选中
-			articleCateChange(item) {
-				this.cateId = item.cateId;
-				this.getTuiArticle();
-			},
-			// 问诊案例选中
-			orderTypeChange(item) {
-				this.orderType = item.id;
-				console.log(this.orderType)
-				this.getTuiDoctorOrder();
-			},
-			// 关闭限时消息
-			closeMsg() {
-				this.messageShow = false
-			},
-			// 查看全部
-			viewAll(url) {
-				uni.navigateTo({
-					url: '/pages/home/' + url,
-				});
-			},
-			shopDoctor(item) {
-				console.log(item);
-				uni.navigateTo({
-					url: "/pages_doctor/doctorDetail?doctorId=" + item.doctorId
-				})
-			},
-			switchTo(url) {
-				uni.switchTab({
-					url: url
-				})
-				return
-			},
-			yangshengClick(item) {
-				if (item.page == "") {
-					uni.showToast({
-						icon: "none",
-						title: '暂无更多'
-					})
-					return;
-				}
-				uni.navigateTo({
-					url: item.page
-				})
-			},
-			// 在线问诊
-			openIm() {
-				uni.navigateTo({
-					url: '/pages_doctor/doctorOrderIM?orderId=10'
-				})
-			},
-			getDoctorArticleList() {
-				//联网加载数据
-				var that = this;
-				var data = {
-					pageNum: 1,
-					pageSize: 10
-				};
-				getDoctorArticleList(data).then(res => {
-					if (res.code == 200) {
-						this.doctocArticles = res.data.list;
-					}
-				});
-			},
-			getArticleList() {
-				//联网加载数据
-				var that = this;
-				var data = {
-					isTui: 1,
-					pageNum: 1,
-					pageSize: 10,
-				};
-				getArticleList(data).then(res => {
-					if (res.code == 200) {
-						this.articles = res.data.list;
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: "请求失败",
-						});
-					}
-				});
-			},
+			}
 		}
 	}
 </script>
 
-<style lang="scss">
-	.ellipsis1 {
-		overflow: hidden;
-		text-overflow: ellipsis;
-		white-space: nowrap;
-	}
-
-	.fixed-top-box {
-		width: 100%;
-		position: fixed;
-		top: 0;
-		left: 0;
-		z-index: 1000;
-		transition: all 0.5s;
-		background-color: #0bb3f2;
-
-		&.show-back {
-			// background: linear-gradient(135deg, #66b2ef 0%, #0bb3f2 100%);
-		}
-
-		.status_bar {
-
-			width: 100%;
-		}
-	}
-
-	.content {
-		width: 100%;
-		background: #F7F8FA;
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		display: flex;
+		flex-direction: column;
 		position: relative;
-		padding-bottom: 28rpx;
 
 		.bg {
 			width: 100%;
-			// height: 380rpx;
 			position: absolute;
 			top: 0;
 			left: 0;
 		}
 
-		.top-inner {
+		.content {
 			width: 100%;
-			position: absolute;
-			top: 0;
-			left: 0;
-			z-index: 5;
-
-			.top-title {
-				height: 88upx;
-				line-height: 88upx;
-				display: flex;
-				align-items: center;
-				justify-content: flex-start;
-
-				.name {
-					font-size: 42upx;
-					font-family: Source Han Sans CN;
-					font-weight: bold;
-					color: #FFFFFF;
-					padding-left: 41upx;
-				}
-
-				.dot {
-					margin: 0upx 10upx;
-					font-size: 28upx;
-					color: #FFFFFF;
-					opacity: 0.5;
-				}
-
-				.sub-name {
-					font-size: 30upx;
-					font-family: Source Han Sans CN;
-					color: #FFFFFF;
-				}
+			height: 100%;
+			position: relative;
+			z-index: 2;
 
+			.title {
+				font-weight: 600;
+				font-size: 36rpx;
+				color: #333333;
+				height: 88rpx;
+				text-align: center;
+				line-height: 88rpx;
 
 			}
 
-			.func-cont {
-				box-sizing: border-box;
+			.summary-section {
+				padding: 32rpx 24rpx;
 				display: flex;
-				align-items: center;
-				padding: 0 20upx;
+				flex-direction: column;
 
-				.search-cont {
-					box-sizing: border-box;
+				.summary-header {
 					display: flex;
 					align-items: center;
-					justify-content: space-between;
-					width: 500rpx;
-					height: 64rpx;
-					background: rgba(255, 255, 255, 0.6);
-					border-radius: 38rpx 38rpx 38rpx 38rpx;
-					border: 2rpx solid #388BFF;
-					padding-left: 30rpx;
-					padding-right: 8rpx;
+					margin-bottom: 24rpx;
 
-					.icon-search {
-						width: 32rpx;
+					.summary-indicator {
+						width: 6rpx;
 						height: 32rpx;
-						margin-right: 14rpx;
-					}
-
-					input {
-						height: 64rpx;
-						line-height: 64rpx;
-						// flex: 1;
-						font-family: PingFang SC, PingFang SC;
-						font-weight: 400;
-						font-size: 28rpx;
-						color: #999999;
-					}
-
-					.btn {
-						width: 88rpx;
-						height: 48rpx;
 						background: #388BFF;
-						border-radius: 40rpx 40rpx 40rpx 40rpx;
-						font-family: PingFang SC, PingFang SC;
-						font-weight: 400;
-						font-size: 28rpx;
-						color: #FFFFFF;
-						display: flex;
-						align-items: center;
-						justify-content: center;
+						border-radius: 40rpx;
+						margin-right: 16rpx;
 					}
-				}
 
-				v-deep.uni-badge {
-					border: none;
-					background-color: #FF3636;
-					font-family: Roboto;
-				}
-
-				.img-item {
-					width: 44upx;
-					height: 44upx;
-					margin-left: 30upx;
-
-					image {
-						width: 100%;
-						height: 100%;
-					}
-				}
-			}
-
-			.tips {
-				margin: 0upx 20rpx 30rpx;
-				height: 40upx;
-				line-height: 40upx;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-
-				.left {
-					font-size: 30upx;
-					color: #FFFFFF;
-				}
-
-				.right {
-					padding: 5upx 20rpx;
-					font-size: 24upx;
-					color: #FFFFFF;
-					background-color: #0bb3f2;
-					border-radius: 50rpx;
-				}
-			}
-		}
-
-		.banner-box {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			width: 100%;
-
-			.inner {
-				width: 702rpx;
-				height: 280rpx;
-				border-radius: 16rpx;
-				overflow: hidden;
-
-				.swiper,
-				.swiper-item,
-				.swiper-item image {
-					width: 702rpx;
-					height: 280rpx;
-				}
-
-			}
-		}
-
-		.menu-content {
-			border-radius: 16rpx 16rpx 16rpx 16rpx;
-			margin: 20rpx 24rpx;
-			overflow: hidden;
-			padding: 30upx 0;
-			background-color: #ffffff;
-		}
-
-		.menu-box {
-			display: flex;
-			align-items: center;
-			background-color: #FFFFFF;
-			padding-top: 20rpx;
-			border-radius: 12rpx;
-		}
-
-		.online-inquiry {
-			box-sizing: border-box;
-			width: 100%;
-			height: 170upx;
-			padding: 0 20upx;
-			margin-top: 20rpx;
-			// background: linear-gradient(180deg, rgba(255, 255, 255, 0.38) 62%, rgba(255, 255, 255, 0) 100%);
-			display: flex;
-			justify-content: space-between;
-
-			.item {
-				// width: 46.13%;
-				width: 346upx;
-				height: 190upx;
-				position: relative;
-
-				.bg-img,
-				.inner {
-					width: 100%;
-					height: 100%;
-					position: absolute;
-					top: 0;
-					left: 0;
-					z-index: 1;
-					border-radius: 12rpx;
-				}
-
-				.inner {
-					box-sizing: border-box;
-					z-index: 2;
-					display: flex;
-					flex-direction: column;
-					justify-content: center;
-					padding-left: 32upx;
-
-					.title {
-						font-size: 32upx;
-						line-height: 1;
-						font-family: PingFang SC;
-						font-weight: 500;
-						color: #111111;
-						margin-bottom: 20upx;
+					.summary-title {
+						font-size: 36rpx;
 						font-weight: bold;
-					}
-
-					.sub-title {
-						font-size: 24upx;
-						font-family: PingFang SC;
-						font-weight: 500;
-						color: #898E91;
-					}
-
-					image {
-						width: 80upx;
-						height: 90upx;
-						position: absolute;
-						right: 7upx;
-						bottom: 7upx;
-					}
-				}
-			}
-		}
-
-		.index-cont {
-			box-sizing: border-box;
-			// padding: 0 20upx 120rpx;
-			padding: 0 24upx 20upx;
-
-			.pub-item {
-				background: #FFFFFF;
-				border-radius: 16upx;
-				margin-bottom: 20upx;
-
-				.tabs {
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					height: 110rpx;
-					background-color: #F0F3F4;
-
-					.tab {
-						height: 110rpx;
-						display: flex;
-						align-items: center;
-						justify-content: center;
-						position: relative;
-						flex: 1;
-
-						.img {
-							z-index: 1;
-							position: absolute;
-							top: 0rpx;
-							left: 0rpx;
-							width: 100%;
-							height: 100%;
-						}
-
-						.inner {
-							z-index: 2;
-
-							.title {
-								font-size: 32upx;
-								font-family: PingFang SC;
-								font-weight: bold;
-								color: #666666;
-							}
-
-							.active {
-								color: #0bb3f2;
-							}
-						}
-
-					}
-
-
-				}
-
-				.pub-title-box {
-					box-sizing: border-box;
-					padding: 36upx 30upx;
-					display: flex;
-					align-items: center;
-					justify-content: space-between;
-
-					.left {
-						font-size: 32upx;
-						line-height: 1;
-						font-family: PingFang SC;
-						font-weight: bold;
-						color: #111111;
-					}
-
-					.right {
-						display: flex;
-						align-items: center;
-						justify-content: center;
-
-						.text {
-							font-size: 24rpx;
-							line-height: 1;
-							font-family: PingFang SC;
-							font-weight: 500;
-							color: #999999;
-							margin-right: 10upx;
-						}
-
-						image {
-							width: 14upx;
-							height: 24upx;
-						}
-					}
-
-				}
-
-				.doc-tab-box {
-					padding: 14rpx 30rpx 0rpx 30rpx;
-					position: relative;
-
-					.tab-inner {
-						padding: 14upx 0 30upx;
-						display: flex;
-						overflow-x: auto;
-					}
-
-					.item {
-						font-size: 28upx;
-						white-space: nowrap;
-						line-height: 1;
-						font-family: PingFang SC;
-						font-weight: 500;
-						color: #666666;
-						margin-right: 40upx;
-						position: relative;
-
-						&:last-child {
-							margin-right: 0;
-						}
-
-						&.active {
-							font-weight: bold;
-							color: #333333;
-						}
-
-						&.cases {
-							margin-right: 60upx;
-						}
-
-						.text {
-							position: relative;
-							z-index: 1;
-						}
-
-						.tab-bg {
-							width: 72upx;
-							height: 28upx;
-							position: absolute;
-							top: 17upx;
-							left: 50%;
-							transform: translateX(-36upx);
-							z-index: -1;
-						}
-					}
-
-					.right-mask {
-						width: 56upx;
-						height: 34upx;
-						position: absolute;
-						top: 25upx;
-						right: 0upx;
-						z-index: 1;
-					}
-				}
-
-				.doc-list {
-					padding: 20upx;
-
-					.item {
-						box-sizing: border-box;
-						background: #FFFFFF;
-						// border-radius: 16upx;
-						display: flex;
-						border-bottom: 1px solid #F0F0F0;
-						margin-bottom: 30rpx;
-
-						.head-box {
-							width: 120upx;
-							height: 120upx;
-							background: #EDF1F4;
-							border-radius: 50%;
-							overflow: hidden;
-							margin-right: 30upx;
-
-							image {
-								width: 100%;
-								height: 100%;
-							}
-						}
-
-						.info {
-							width: calc(100% - 150upx);
-
-							.top {
-								display: flex;
-								align-items: center;
-								font-family: PingFang SC;
-								line-height: 1;
-
-								.name {
-									font-size: 34upx;
-									font-weight: bold;
-									color: #111111;
-								}
-
-								.line {
-									width: 1px;
-									height: 26upx;
-									background: #DDDDDD;
-									margin: 0 20upx;
-								}
-
-								.other {
-									font-size: 28upx;
-									font-weight: 500;
-									color: #333333;
-								}
-							}
-
-							.unit-box {
-								display: flex;
-								margin-top: 24upx;
-
-								.level {
-									padding: 0 10upx;
-									height: 30upx;
-									line-height: 30upx;
-									font-size: 22upx;
-									font-family: PingFang SC;
-									font-weight: 500;
-									color: #FFFFFF;
-									background: #0bb3f2;
-									border-radius: 10upx 4upx 10upx 4upx;
-									margin-right: 12upx;
-								}
-
-								.name {
-									font-size: 28upx;
-									font-family: PingFang SC;
-									font-weight: 500;
-									color: #333333;
-									line-height: 30upx;
-								}
-							}
-
-							.expertise {
-								font-size: 26upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #666666;
-								line-height: 42upx;
-								margin: 22upx 0 26upx;
-							}
-
-							.rate-box {
-								display: flex;
-								align-items: center;
-
-								.star {
-									display: flex;
-									align-items: center;
-
-									image {
-										width: 22upx;
-										height: 22upx;
-										margin-right: 10upx;
-									}
-
-									text {
-										font-size: 26upx;
-										font-family: PingFang SC;
-										font-weight: bold;
-										color: #CEA764;
-										line-height: 1;
-									}
-								}
-
-								.line {
-									width: 1px;
-									height: 20upx;
-									background: #DDDDDD;
-									margin: 0 20upx;
-								}
-
-								.num-box {
-									display: flex;
-									align-items: center;
-									font-family: PingFang SC;
-
-									.label {
-										font-size: 24upx;
-										font-weight: 500;
-										color: #999999;
-										line-height: 1;
-										margin-right: 7px;
-									}
-
-									.num {
-										font-size: 26upx;
-										font-weight: bold;
-										color: #CEA764;
-										line-height: 1;
-									}
-								}
-							}
-
-							.price-box {
-								display: flex;
-								align-items: center;
-								margin-top: 38upx;
-
-								.btn-item {
-									display: flex;
-									align-items: center;
-									justify-content: center;
-									width: 164upx;
-									height: 56upx;
-									line-height: 56upx;
-									border: 1px solid rgba(43, 199, 185, 0.5);
-									border-radius: 28upx;
-									font-family: PingFang SC;
-									margin-right: 30upx;
-
-									&:last-child {
-										margin-right: 0;
-									}
-
-									.label {
-										font-size: 26upx;
-										font-weight: 500;
-										color: #0bb3f2;
-										margin-right: 5upx;
-									}
-
-									.num {
-										font-size: 28upx;
-										font-weight: bold;
-										color: #0bb3f2;
-									}
-								}
-							}
-						}
-					}
-
-					.item:last-child {
-						border-bottom: none;
-						margin-bottom: 0rpx;
-					}
-
-					.bottom-title {
-						height: 50rpx;
-						display: flex;
-						align-items: center;
-						justify-content: center;
-						font-size: 26rpx;
-						font-family: PingFang SC;
-						font-weight: bold;
-						color: #0bb3f2;
-
-						image {
-							margin-left: 8rpx;
-							width: 14rpx;
-							height: 24rpx;
-						}
-					}
-				}
-
-				// 医师团队
-				.doc-cont {
-					box-sizing: border-box;
-					padding: 0 30upx;
-
-					.inner {
-						padding: 4upx 0 40upx;
-						display: flex;
-						overflow-x: auto;
-					}
-
-					.item {
-						display: flex;
-						align-items: center;
-						flex-direction: column;
-						margin-right: 40upx;
-
-						&:last-child {
-							margin-right: 0;
-						}
-
-						.head-box {
-							width: 120upx;
-							height: 120upx;
-							background: #F2F5F9;
-							border-radius: 50%;
-							margin-bottom: 20upx;
-							overflow: hidden;
-
-							image {
-								width: 100%;
-								height: 100%;
-							}
-						}
-
-						.name {
-							max-width: 120upx;
-							font-size: 28upx;
-							line-height: 1;
-							font-family: PingFang SC;
-							font-weight: 500;
-							color: #111111;
-							margin-bottom: 16upx;
-							text-align: center;
-						}
-
-						.position {
-							max-width: 120upx;
-							font-size: 24upx;
-							line-height: 1;
-							font-family: PingFang SC;
-							font-weight: 500;
-							color: #999999;
-							text-align: center;
-						}
-					}
-				}
-
-				.inner {
-					padding: 0 30upx;
-				}
-
-				// 健康知识
-				.pub-tab-box {
-					position: relative;
-
-					.tab-inner {
-						padding: 14upx 0 30upx;
-						display: flex;
-						overflow-x: auto;
-					}
-
-					.item {
-						font-size: 28upx;
-						white-space: nowrap;
-						line-height: 1;
-						font-family: PingFang SC;
-						font-weight: 500;
-						color: #666666;
-						margin-right: 40upx;
-						position: relative;
-
-						&:last-child {
-							margin-right: 0;
-						}
-
-						&.active {
-							font-weight: bold;
-							color: #333333;
-						}
-
-						&.cases {
-							margin-right: 60upx;
-						}
-
-						.text {
-							position: relative;
-							z-index: 1;
-						}
-
-						.tab-bg {
-							width: 72upx;
-							height: 28upx;
-							position: absolute;
-							top: 17upx;
-							left: 50%;
-							transform: translateX(-36upx);
-							z-index: -1;
-						}
-					}
-
-					.right-mask {
-						width: 56upx;
-						height: 34upx;
-						position: absolute;
-						top: 14upx;
-						right: -30upx;
-						z-index: 1;
-					}
-				}
-
-				.know-list {
-					padding-right: 10upx;
-
-					.item {
-						padding: 30upx 0;
-						display: flex;
-						align-items: center;
-						justify-content: space-between;
-						border-bottom: 1px solid #F0F0F0;
-
-						&:last-child {
-							border-bottom: none;
-						}
-
-						.left {
-							flex: 1;
-							padding-right: 40upx;
-							height: 190upx;
-							display: flex;
-							flex-direction: column;
-							justify-content: space-between;
-
-							.title {
-								font-size: 32upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #111111;
-								line-height: 48upx;
-							}
-
-							.info-box {
-								width: 100%;
-								display: flex;
-								align-items: center;
-								justify-content: space-between;
-
-								.readers {
-									display: flex;
-									align-items: center;
-
-									.head-box {
-										margin-right: 27upx;
-										display: flex;
-										align-items: center;
-
-										.head {
-											width: 48upx;
-											height: 48upx;
-											border-radius: 50%;
-											overflow: hidden;
-											box-shadow: 0 0 0 1px #fff;
-											margin-right: -10upx;
-
-											image {
-												width: 100%;
-												height: 100%;
-											}
-										}
-									}
-
-									.readings {
-										display: flex;
-										align-items: center;
-
-										.eye {
-											width: 26upx;
-											height: 20upx;
-											margin-right: 9upx;
-										}
-
-										.num {
-											font-size: 24upx;
-											font-family: PingFang SC;
-											font-weight: 500;
-											color: #999999;
-											line-height: 1;
-										}
-									}
-								}
-
-								.time {
-									font-size: 24upx;
-									line-height: 1;
-									font-family: PingFang SC;
-									font-weight: 500;
-									color: #999999;
-								}
-							}
-						}
-
-						.right {
-							width: 250upx;
-							height: 190upx;
-							border-radius: 8upx;
-							overflow: hidden;
-
-							image {
-								width: 100%;
-								height: 100%;
-							}
-						}
-					}
-				}
-
-				// 问诊案例
-				.cases-list {
-					padding-bottom: 10upx;
-
-					.item {
-						padding: 30upx 0;
-						border-bottom: 1px solid #F0F0F0;
-
-						&:last-child {
-							border-bottom: none;
-						}
-
-						.dec-text {
-							font-size: 32upx;
-							font-family: PingFang SC;
-							font-weight: bold;
-							color: #111111;
-							line-height: 48upx;
-						}
-
-						.images-box {
-							margin-top: 10upx;
-							display: flex;
-							flex-wrap: wrap;
-
-							.img-item {
-								width: 155upx;
-								height: 155upx;
-								background: #F5F5F5;
-								border-radius: 8upx;
-								margin: 0 10upx 10upx 0;
-								overflow: hidden;
-
-								image {
-									width: 48rpx;
-									height: 48rpx;
-								}
-
-								&:nth-child(4n) {
-									margin-right: 0;
-								}
-							}
-						}
-
-						.doc-info {
-							display: flex;
-							align-items: center;
-							margin: 30upx 0 20upx;
-
-							.head {
-								width: 60upx;
-								height: 60upx;
-								background: #F2F5F9;
-								border-radius: 50%;
-								margin-right: 20upx;
-								overflow: hidden;
-
-								image {
-									width: 100%;
-									height: 100%;
-								}
-							}
-
-							.name {
-								font-size: 28upx;
-								line-height: 1;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #111111;
-							}
-
-							.line {
-								width: 1px;
-								height: 22upx;
-								background: #DDDDDD;
-								margin: 0 16upx;
-							}
-
-							.posit,
-							.address {
-								font-size: 26upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #999999;
-							}
-						}
-
-						.answer-box {
-							width: 100%;
-							// height: 117upx;
-							background: #F5F7F7;
-							border-radius: 10upx;
-							display: flex;
-							flex-direction: column;
-							justify-content: center;
-
-							.text-inner {
-								// height: 84upx;
-								font-size: 28upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #666666;
-								line-height: 42upx;
-								padding: 15upx;
-							}
-						}
-
-						.read-box {
-							margin-top: 30upx;
-							display: flex;
-							align-items: center;
-							justify-content: flex-end;
-
-							image {
-								width: 24upx;
-								height: 19upx;
-								margin-right: 10upx;
-							}
-
-							.text {
-								font-size: 24upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #999999;
-							}
-						}
+						color: #333;
 					}
 				}
 			}
 
-			// 精选药品
-			.feat-title {
-				margin-top: 30upx;
-				padding: 10upx 0 33upx;
+			.list {
 				display: flex;
 				align-items: center;
-				justify-content: center;
-
-				image {
-					width: 37upx;
-					height: 37upx;
-					margin: 0upx 20upx;
-				}
-
-				text {
-					font-size: 36upx;
-					line-height: 1;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #111111;
-				}
-			}
+				margin-bottom: 40rpx;
 
-			.drug-list {
-				display: flex;
-				flex-wrap: wrap;
-
-				// margin-bottom: 20upx;
 				.item {
-					margin-right: 20rpx;
-					margin-bottom: 20rpx;
-					width: 345rpx;
-					background: #FFFFFF;
-					box-shadow: 0px 0px 10rpx 4rpx rgba(199, 199, 199, 0.22);
-					border-radius: 20rpx;
-					overflow: hidden;
-
-					&:nth-child(2n) {
-						margin-right: 0;
-					}
-
-					.img-box {
-						width: 100%;
-						height: 334upx;
-
-						image {
-							width: 100%;
-							height: 100%;
-						}
-					}
-
-					.info-box {
-						box-sizing: border-box;
-						height: 182upx;
-						padding: 20upx;
-
-						.title {
-							height: 80upx;
-							font-size: 26upx;
-							font-family: PingFang SC;
-							font-weight: 500;
-							color: #111111;
-							line-height: 40upx;
-						}
-
-						.price-box {
-							display: flex;
-							align-items: center;
-							margin-top: 20upx;
-
-							.now {
-								color: #FF6633;
-								display: flex;
-								align-items: flex-end;
-								margin-right: 20upx;
-								font-family: PingFang SC;
-
-								.unit {
-									font-size: 24upx;
-									line-height: 1.4;
-									margin-right: 4upx;
-								}
-
-								.num {
-									font-size: 36upx;
-									font-weight: bold;
-									line-height: 1;
-								}
-							}
-
-							.old {
-								font-size: 26upx;
-								font-family: PingFang SC;
-								text-decoration: line-through;
-								color: #BBBBBB;
-								line-height: 1;
-							}
-						}
-					}
-				}
-			}
-		}
-
-
-		.box-title {
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			padding-bottom: 24rpx;
-            position: relative;
-			.title-l {
-				font-family: PingFang SC, PingFang SC;
-				font-weight: 600;
-				font-size: 32rpx;
-				color: #333333;
-			}
-
-			.title-m {
-				display: flex;
-				align-items: center;
-				font-family: PingFang SC, PingFang SC;
-				font-weight: 400;
-				font-size: 28rpx;
-				color: #999999;
-				margin-right: 4rpx;
-
-				image {
-					width: 32rpx;
-					height: 32rpx;
-				}
-			}
-		}
-
-		.doctor-articles {
-			z-index: 101;
-			margin-top: 40rpx;
-			padding: 0 24rpx;
-			// padding: 32rpx;
-			// background-color: #fff;
-			// border-radius: 16rpx;
-
-			.title-box {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				justify-content: space-between;
-
-				::v-deep.u-tabs__wrapper__nav__item {
-					padding-left: 0 !important;
-				}
-
-				.title {
-					font-size: 32upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #111111;
-				}
-
-				.more {
-					display: flex;
-					align-items: center;
-					justify-content: flex-end;
-
-					.text {
-						font-size: 24rpx;
-						font-family: PingFang SC;
-						color: #9B9B9B;
-					}
-
-					image {
-						// margin-left: 10rpx;
-						width: 48rpx;
-						height: 48rpx;
-					}
-
-				}
-			}
-
-			.article-box {
-				padding-top: 24rpx;
-				overflow-x: auto;
-				box-sizing: border-box;
-				display: flex;
-				align-items: center;
-				justify-content: flex-start;
-
-				.article {
-					width: 320rpx;
-					height: 328rpx;
-					margin-right: 16rpx;
-					background: #fff;
 					display: flex;
 					flex-direction: column;
-					align-items: flex-start;
-					justify-content: flex-start;
-					border-radius: 16rpx;
-
-					&:last-child {
-						margin-right: 0rpx;
-					}
-
-					.image-box {
-						width: 320rpx;
-						height: 180rpx;
-						position: relative;
-						border-radius: 16rpx 16rpx 0rpx 0rpx;
-
-						.bg {
-							border-radius: 16rpx 16rpx 0rpx 0rpx;
-							width: 320rpx;
-							height: 180rpx;
-						}
-
-						.views {
-							position: absolute;
-							top: 0rpx;
-							left: 0rpx;
-							width: 112rpx;
-							height: 32rpx;
-							display: flex;
-							align-items: center;
-							background: rgba(0, 0, 0, 0.4);
-							border-radius: 16rpx 0rpx 16rpx 0rpx;
-							font-weight: 500;
-							font-size: 20rpx;
-							color: #FFFFFF;
-							font-family: PingFang SC-Bold, PingFang SC;
-
-							image {
-								width: 36rpx;
-								height: 32rpx;
-								margin-right: 8rpx;
-							}
-						}
-
-						.zhibo {
-							position: absolute;
-							top: 50%;
-							left: 50%;
-							transform: translate(-50%, -50%);
-
-							image {
-								width: 56rpx;
-								height: 56rpx;
-							}
-						}
-
-
-						.doctor {
-							margin: 10rpx;
-							display: flex;
-							align-items: center;
-							justify-content: flex-start;
-							position: absolute;
-							bottom: 0rpx;
-							left: 0rpx;
-
-							image {
-								border-radius: 50%;
-								width: 64rpx;
-								height: 64rpx;
-							}
-
-							.right {
-								width: 200rpx;
-								margin-left: 10rpx;
-								display: flex;
-								flex-direction: column;
-								align-items: flex-start;
-								justify-content: space-between;
-
-								.doc-name {
-									width: 200rpx;
-									font-size: 30rpx;
-									font-weight: bold;
-									font-family: PingFang SC;
-									color: #fff;
-								}
-
-								.doc-position {
-									width: 100%;
-									font-size: 28rpx;
-									font-family: PingFang SC;
-									color: #fff;
-									font-weight: bold;
-									opacity: 0.8;
-								}
-							}
-						}
-					}
-
-					.article-title-box {
-						width: 100%;
-						padding: 16rpx;
-						display: flex;
-						align-items: flex-start;
-						flex-direction: column;
-						justify-content: space-between;
-						height: 148rpx;
-						box-sizing: border-box;
-
-						.article-title {
-							font-family: PingFang SC, PingFang SC;
-							font-weight: 500;
-							font-size: 28rpx;
-							color: #333333;
-							.one-t{
-								width: 100%;
-							}
-						}
-
-						.name-title {
-							display: flex;
-							align-items: center;
-							font-family: PingFang SC, PingFang SC;
-							font-weight: 400;
-							font-size: 22rpx;
-							color: #999999;
-                            .one-t{
-								width: 80%;
-							}
-							image {
-								width: 28rpx;
-								height: 28rpx;
-								margin-right: 14rpx;
-							}
-						}
-
-						.position-title {
-							display: flex;
-							align-items: center;
-							font-family: PingFang SC, PingFang SC;
-							font-weight: 400;
-							font-size: 22rpx;
-							color: #999999;
-                            .one-t{
-								width: 80%;
-							}
-							image {
-								width: 28rpx;
-								height: 28rpx;
-								margin-right: 14rpx;
-							}
-						}
-					}
-
-				}
-
-			}
-		}
-
-		.doctors {
-			z-index: 101;
-			margin: 20rpx 15rpx;
-			padding: 20rpx;
-			box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
-			background-color: #fff;
-			border-radius: 15rpx;
-
-			.title-box {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				justify-content: space-between;
-
-				.title {
-					font-size: 32upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #111111;
-				}
-
-				.more {
-					display: flex;
-					align-items: center;
-					justify-content: flex-end;
-
-					.text {
-						font-size: 24rpx;
-						font-family: PingFang SC;
-						color: #898E91;
-					}
-
-					image {
-						margin-left: 10rpx;
-						width: 15rpx;
-						height: 20rpx;
-					}
-
-				}
-			}
-
-		}
-
-		.articles {
-			z-index: 101;
-			margin-top: 40rpx;
-			padding: 0 24rpx;
-
-			.title-box {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				justify-content: space-between;
-
-				::v-deep.u-tabs__wrapper__nav__item {
-					padding-left: 0 !important;
-				}
-
-				.title {
-					font-size: 32upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #111111;
-				}
-
-				.more {
-					display: flex;
-					align-items: center;
-					justify-content: flex-end;
-
-					.text {
-						font-size: 24rpx;
-						font-family: PingFang SC;
-						color: #898E91;
-						// width: calc(100% - 556rpx);
-					}
-
-					image {
-						// margin-left: 10rpx;
-						width: 48rpx;
-						height: 48rpx;
-					}
-
-				}
-			}
-
-			.article-box {
-				margin-top: 15rpx;
-				padding: 20rpx 0rpx 0rpx;
-				display: flex;
-				flex-direction: column;
-				align-items: flex-start;
-				justify-content: flex-start;
-
-				.item {
-					width: 100%;
-					margin-bottom: 32rpx;
-					display: flex;
-					align-items: flex-start;
-					justify-content: flex-start;
-					border-bottom: 1px solid #ECECEC;
-					padding-bottom: 32rpx;
-
-					&:last-child {
-						margin-bottom: 0rpx;
-						border-bottom: 0;
-					}
-
-					.left {
-						flex: 1;
-						height: 160rpx;
-						margin-right: 30rpx;
-						display: flex;
-						flex-direction: column;
-						align-items: flex-start;
-						justify-content: space-between;
-						width: calc(100% - 260upx);
-
-						.title {
-							width: 100%;
-							font-size: 28upx;
-							font-family: PingFang SC;
-							font-weight: bold;
-							color: #111111;
-						}
-
-						.txt {
-							font-family: PingFang SC, PingFang SC;
-							font-size: 26rpx;
-							color: #898E91;
-						}
-
-						.views {
-							font-size: 24upx;
-							font-family: PingFang SC;
-							color: #B2B2B2;
-						}
-					}
-
-					.right {
-						image {
-							border-radius: 10rpx;
-							width: 220rpx;
-							height: 160rpx;
-							// border: 1px solid #eeeeee;
-						}
-					}
-				}
-			}
-		}
-
-		.packages {
-			z-index: 101;
-			margin: 20rpx 15rpx;
-			padding: 20rpx;
-			box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.05);
-			background-color: #fff;
-			border-radius: 15rpx;
-
-			.title-box {
-				display: flex;
-				flex-direction: row;
-				align-items: center;
-				justify-content: space-between;
-
-				.title {
-					font-size: 32upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #111111;
-				}
-
-				.more {
-					display: flex;
+					justify-content: center;
 					align-items: center;
-					justify-content: flex-end;
-
-					.text {
-						font-size: 24rpx;
-						font-family: PingFang SC;
-						color: #9B9B9B;
-					}
-
-					image {
-						margin-left: 10rpx;
-						width: 15rpx;
-						height: 20rpx;
-					}
-
-				}
-			}
-
-			.package-box {
-				padding: 20rpx 0rpx 0rpx;
-				display: flex;
-				align-items: flex-start;
-				justify-content: flex-start;
-				flex-wrap: wrap;
-
-				.item {
-					width: calc(50% - 20rpx);
-					border-radius: 15rpx;
-					margin: 10rpx;
-					display: flex;
-					flex-direction: column;
-					align-items: flex-start;
-					justify-content: flex-start;
-
-					&:last-child {}
-
-					.top {
-						width: 100%;
-						height: 300rpx;
-
-						image {
-							border-radius: 15rpx 15rpx 0rpx 0rpx;
-							width: 100%;
-							height: 300rpx;
-						}
+					width: 170rpx;
+					height: 184rpx;
+					border-radius: 20rpx 20rpx 20rpx 20rpx;
+					font-size: 28rpx;
+					color: #333333;
 
-					}
-
-					.bottom {
-						width: 100%;
-						margin-top: 15rpx;
-
-						.title {
-							font-weight: bold;
-							font-size: 28upx;
-							font-family: PingFang SC;
-							color: #111111;
-						}
-
-						.price-box {
-							margin-top: 10rpx;
-							display: flex;
-							align-items: center;
-							justify-content: space-between;
-							width: 100%;
-
-							.price {
-								padding: 5rpx 10rpx;
-								background-color: #0bb3f2;
-								border-radius: 30rpx;
-								font-size: 20upx;
-								font-family: PingFang SC;
-								color: #ffffff;
-							}
-
-							.count {
-								font-size: 24upx;
-								font-family: PingFang SC;
-								color: #333333;
-							}
-
-						}
+					.icon {
+						width: 88rpx;
+						height: 88rpx;
+						margin-bottom: 16rpx;
 					}
 				}
 			}
-
-
-		}
-	}
-
-
-	.official-account {
-		box-sizing: border-box;
-		width: 100%;
-		height: 100upx;
-		position: fixed;
-		bottom: 30upx;
-		z-index: 99;
-		padding: 0 20upx 180rpx 20upx;
-	}
-
-	// 消息
-	.message-box {
-		box-sizing: border-box;
-		width: 100%;
-		height: 84upx;
-		background: #F3FFFD;
-		border: 1px solid #C7E9E5;
-		box-shadow: 0px 4upx 12upx 0px rgba(90, 203, 138, 0.16);
-		border-radius: 16upx;
-		position: fixed;
-		left: 50%;
-		transform: translateX(-50%);
-		bottom: 30upx;
-		z-index: 99;
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		padding: 0 20upx 0 30upx;
-
-		.left {
-			flex: 1;
-			display: flex;
-			align-items: center;
-
-			image {
-				width: 24upx;
-				height: 24upx;
-				margin-right: 18upx;
-			}
-
-			.text {
-				width: 90%;
-				font-size: 28upx;
-				font-family: PingFang SC;
-				font-weight: 500;
-				color: #0bb3f2;
-			}
-		}
-
-		.btn {
-			width: 100upx;
-			height: 48upx;
-			line-height: 48upx;
-			text-align: center;
-			font-size: 24upx;
-			font-family: PingFang SC;
-			font-weight: 500;
-			color: #FFFFFF;
-			border: 1px solid #D2E6FF;
-			background: linear-gradient(135deg, #66b2ef 0%, #0bb3f2 100%);
-			border-radius: 24upx;
-			margin-left: 30upx;
-		}
-
-	}
-
-	.contact-btn {
-		display: inline-block;
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		opacity: 0;
-	}
-
-	.popup-box {
-		position: fixed;
-		top: 0;
-		right: 0;
-		left: 0;
-		bottom: 0;
-		z-index: 999;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-
-		.info-mask {
-			position: fixed;
-			top: 0;
-			right: 0;
-			bottom: 0;
-			left: 0;
-			background-color: rgba($color: #000000, $alpha: 0.5);
-			z-index: 999;
-		}
-
-		.info-form {
-			z-index: 1000;
-			width: 450rpx;
-			display: flex;
-			flex-direction: column;
-			justify-content: center;
-			align-items: center;
-			position: relative;
-
-			image {
-				width: 100%;
-			}
 		}
 	}
 </style>

+ 270 - 384
pages/user/index.vue

@@ -1,111 +1,102 @@
 <template>
 	<view>
 		<view class="top-cont">
-			<image class="bg" src="@/static/image/top_bg.png" mode="widthFix"></image>
-			<view class="top-inner">			
+			<image class="bg" src="@/static/image/bg_mine.png" mode="widthFix"></image>
+			<view class="top-inner">
 				<!-- 这里是状态栏 -->
 				<view class="status_bar" :style="{height: statusBarHeight}"></view>
-				<view class="user-info">
-					<view class="left">
-						<view class="head-img">
-							<image :src="user.avatar==null?'/static/image/my_heads_icon64.png':user.avatar" mode="aspectFill"></image>
-						</view>
-						<view class="name-phone">
-							<view class="x-f">
-								<view class="name" v-if="UserInfo">{{user.nickname}}</view>
-								<view class="name" v-else>请先登录</view>
-								<text>{{user.phone?utils.parsePhone(user.phone):'-'}}</text>
-							</view>
-							
-							<!-- <view class="phone">
-							<image class="w32 h32" src="../../static/images/company/phone_icon16.png" mode=""></image>
-							<text>{{user.phone?utils.parsePhone(user.phone):'-'}}</text>
-							</view> -->
-							
-							<view class="vip">
-								<image class="w24 h24" src="../../static/image/icon_v.png" mode=""></image>
-								已认证
-							</view>
-						</view>
-					</view>
-					<view class="right">
-						<view class="set" @click="navgetTo('/pages_user/user/personInfo')">
-							<image class="w48 h48" src="../../static/image/right_arrow_black_icon24.png" mode=""></image>
-						</view>
-						<!-- <uni-badge size="small" :text="msgNum" absolute="rightTop" type="error">
-							<view class="set" @click="navgetTo('/pages_user/user/personInfo')">
-								<image class="w48 h48" src="../../static/images/user/center_set_icon.png" mode=""></image>
+				<view class="content">
+					<view class="user-info">
+						<view class="left">
+							<view class="head-img">
+								<image :src="user.avatar==null?'/static/image/my_heads_icon.png':user.avatar"
+									mode="aspectFill">
+								</image>
+								<image class="gender"
+									:src="isGirl==null?'/static/image/icon_girl.png':'/static/image/icon_boy.png'"
+									mode="aspectFill"></image>
+
 							</view>
-						</uni-badge>
-						<uni-badge size="small" :text="msgNum" absolute="rightTop" type="error">
-							<view class="msg-box" @click="navgetTo('/pages_user/user/message')">
-								<image class="w48 h48" src="../../static/images/user/center_new_icon.png" mode=""></image>
+							<view class="name-phone">
+								<view class="x-f">
+									<view class="name" v-if="UserInfo">{{user.nickname}}</view>
+									<view class="name" v-else>请先登录</view>
+									<view class="lable">办公室主任</view>
+									<!-- <text>{{user.phone?utils.parsePhone(user.phone):'-'}}</text> -->
+								</view>
 							</view>
-						</uni-badge> -->
-					<!-- 	<uni-badge size="small" absolute="rightTop" type="error">
-						<view class="msg-box ml10" @click="navgetTo('/pages_user/user/complaint')">
-							<u-icon name="edit-pen" color="#222426" size="28"></u-icon>
+							<view class="txt">您已加入小蜜蜂1582天了~</view>
 						</view>
-						</uni-badge> -->
 					</view>
-				</view>
-				<view class="vipbox">
-					<image src="@/static/image/img_renzheng.png" mode="widthFix"></image>
-				</view>
-				
-				<view class="content">
+
 					<view class="task-list">
-						<view class="item" v-for="(item,index) in tabs" :key="index"  @click="openLink(item)">
+						<view class="item" v-for="(item,index) in tabs" :key="index" @click="openLink(item)">
 							<view class="left">
 								<image :src="item.icon" mode=""></image>
 								<view class="title-l">{{item.name}}</view>
 							</view>
 							<view class="right">
-								<!-- <view class="num" v-if="item.num!==0">{{item.num}}</view> -->
 								<image src="@/static/image/icon_my_more.png" mode=""></image>
 							</view>
 						</view>
 					</view>
-					<!-- 退出登录按钮 -->
-					<view class="log-out" @click="logOut">退出登录</view>
+
 				</view>
 			</view>
-			
+
 		</view>
-		
+
 	</view>
 </template>
 
 <script>
-	import {getOrderCount} from '@/api/storeOrder'
-	import {getUserInfo} from '@/api/user'
+	import {
+		getOrderCount
+	} from '@/api/storeOrder'
+	import {
+		getUserInfo
+	} from '@/api/user'
 	export default {
 		data() {
 			return {
-				count0:0,
-				count1:0,
-				count2:0,
-				afterSalesCount:0,
-				tabs:[
-					{name:'我的积分',num:12,icon:'/static/image/icon_my_points.png',url:'/pages_user/points'},
-					{name:'服务单确认',num:3,icon:'/static/image/icon_my_servicelist.png',url:''},
-					{name:'银行卡',num:8,icon:'/static/image/icon_my_card.png',url:''},
-					{name:'设置密码',num:0,icon:'/static/image/icon_my_password.png',url:''},
-					{name:'用户协议',num:0,icon:'/static/image/icon_my_useragreement.png',url:'/web/userAgreement'},
+				isGirl: false,
+				count0: 0,
+				count1: 0,
+				count2: 0,
+				afterSalesCount: 0,
+				tabs: [
+					// {
+					// 	name: '我的积分',
+					// 	num: 12,
+					// 	icon: '/static/image/icon_my_points.png',
+					// 	url: '/pages_user/points'
+					// },
+					{
+						name: '个人信息',
+						num: 3,
+						icon: '/static/image/icon_my_information.png',
+						url: '/pages_user/userInfo'
+					},
+					{
+						name: '设置中心',
+						num: 8,
+						icon: '/static/image/icon_my_set.png',
+						url: '/pages/auth/setting'
+					},
 				],
-				user:{
-					isPromoter:0,
-					isWeixinAuth:0,
-					phone:"",
-					nickname:"用户昵称",
-					avatarUrl:"/static/images/detault_head.png"
+				user: {
+					isPromoter: 0,
+					isWeixinAuth: 0,
+					phone: "",
+					nickname: "用户昵称",
+					avatarUrl: "/static/images/detault_head.png"
 				},
 				// 状态栏的高度
 				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
 				// 消息数量
 				msgNum: 0,
-			 isShow:true,
-				 UserInfo: uni.getStorageSync('AppToken')
+				isShow: true,
+				UserInfo: uni.getStorageSync('AppToken')
 			};
 		},
 		onLoad() {
@@ -121,13 +112,13 @@
 			this.$refs.product.getGoodsProducts();
 		},
 		methods: {
-			seeChange(){
-				this.isShow=!this.isShow
+			seeChange() {
+				this.isShow = !this.isShow
 			},
-			callService(){
-				 uni.makePhoneCall({
-					phoneNumber:"4000717770",
-					success:function(){
+			callService() {
+				uni.makePhoneCall({
+					phoneNumber: "4000717770",
+					success: function() {
 						console.log('拨打电话成功');
 					},
 					fail() {
@@ -135,94 +126,72 @@
 					}
 				})
 			},
-			 
-			getOrderCount(){
+
+			getOrderCount() {
 				getOrderCount().then(
 					res => {
-						if(res.code==200){
-							this.count0=res.count0;
-							this.count1=res.count1; 
-							this.count2=res.count2; 
-							this.afterSalesCount=res.afterSalesCount; 
-						} 
+						if (res.code == 200) {
+							this.count0 = res.count0;
+							this.count1 = res.count1;
+							this.count2 = res.count2;
+							this.afterSalesCount = res.afterSalesCount;
+						}
 					},
 					rej => {}
 				);
 			},
-			logOut(){
-			 	uni.showModal({
-			 		title:"提示",
-			 		content:"确认退出登录吗?",
-			 		showCancel:true,
-			 		cancelText:'取消',
-			 		confirmText:'确定',
-			 		success:res=>{
-			 			if(res.confirm){
-							uni.setStorageSync('CompanyUserToken',null);
-			 				uni.setStorageSync('AppToken',null);
-							uni.setStorageSync('userInfo',null);
-							uni.$emit('refreshLogin');
-			 				uni.navigateTo({
-			 					url: '/pages/auth/login'
-			 				})							
-			 			}else{
-			 			}
-			 		}
-			 	})
-			 },
-			 openLink(item){
-				 if(item.name=='用户协议'){
-					 this.openH5()
-					 return;
-				 }
-				 uni.navigateTo({
-				 	url: item.url
-				 })
-				 // this.utils.isLogin().then(res => {
-				 // 	if(res){
-				 // 		uni.navigateTo({
-				 // 			url: url+'?userId='+this.user.userId
-				 // 		})
-				 // 	}
-				 // })
-			 },
-			toManager(){
+
+			openLink(item) {
+				if (item.name == '用户协议') {
+					this.openH5()
+					return;
+				}
+				uni.navigateTo({
+					url: item.url
+				})
+				// this.utils.isLogin().then(res => {
+				// 	if(res){
+				// 		uni.navigateTo({
+				// 			url: url+'?userId='+this.user.userId
+				// 		})
+				// 	}
+				// })
+			},
+			toManager() {
 				// uni.navigateTo({
 				// 	url: '/pages_company/index'
 				// })
-				if(this.utils.checkCompanyUserLoginState()){
+				if (this.utils.checkCompanyUserLoginState()) {
 					uni.navigateTo({
 						url: '/pages_company/index'
 					})
-				}
-				else{
+				} else {
 					uni.navigateTo({
 						url: '/pages_company/auth/login'
 					})
 				}
-				
+
 			},
-			openH5(url){
+			openH5(url) {
 				var requestPath = uni.getStorageSync('requestPath');
-				uni.setStorageSync('url',requestPath+url);
+				uni.setStorageSync('url', requestPath + url);
 				uni.navigateTo({
 					url: '../home/web'
 				})
 			},
-			getUserInfo(){
+			getUserInfo() {
 				getUserInfo().then(
 					res => {
-						if(res.code==200){
-							if(res.user!=null){
-								this.user=res.user;
-							}
-							else{
+						if (res.code == 200) {
+							if (res.user != null) {
+								this.user = res.user;
+							} else {
 								this.utils.loginOut();
 							}
-							
-						}else{
+
+						} else {
 							uni.showToast({
-								icon:'none',
+								icon: 'none',
 								title: "请求失败",
 							});
 						}
@@ -233,9 +202,9 @@
 			// 跳转页面
 			navgetTo(url) {
 				this.utils.isLogin().then(res => {
-					if(res){
+					if (res) {
 						uni.navigateTo({
-							url: url+'?userId='+this.user.userId
+							url: url + '?userId=' + this.user.userId
 						})
 					}
 				})
@@ -251,302 +220,207 @@
 </script>
 
 <style lang="scss">
-	.top-cont{
+	.top-cont {
 		width: 100%;
 		height: 600rpx;
 		position: relative;
-		// background-image: url(../../static/image/top_bg.png);
-		// background-repeat:no-repeat;
-		// background-size:100%;
-		.bg{
+
+		.bg {
 			width: 100%;
 			position: absolute;
 			top: 0;
 			left: 0;
 		}
-		.top-inner{
+
+		.top-inner {
 			width: 100%;
 			height: 100%;
 			position: absolute;
 			top: 0;
 			left: 0;
 			z-index: 2;
-			.user-info{
-				padding: 88upx 30upx 32upx 30upx;
+
+
+
+
+		}
+	}
+
+
+
+	.content {
+		background: linear-gradient(360deg, rgba(244, 249, 255, 0.6) 0%, #FFFFFF 100%);
+		border-radius: 40rpx 40rpx 24rpx 24rpx;
+		border: 2rpx solid #FFFFFF;
+		margin-top: 222upx;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+
+		.user-info {
+			position: relative;
+			top: -72rpx;
+			left: 46rpx;
+			z-index: 4;
+
+			.left {
+				position: relative;
 				display: flex;
-				align-items: center;
-				justify-content: space-between;
-				.left{
+				flex-direction: column;
+
+				.head-img {
+					width: 112upx;
+					height: 112upx;
+					border-radius: 50%;
+					margin-right: 32upx;
+					border: 4upx solid #FFFFFF;
 					position: relative;
-					display: flex;
-					.head-img{
+
+					image {
 						width: 112upx;
 						height: 112upx;
 						border-radius: 50%;
-						overflow: hidden;
-						margin-right: 32upx;
-						border: 4upx solid #FFFFFF;
-						//box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
-						image{
-							width: 100%;
-							height: 100%;
-						}
-					}
-					.name-phone{
-						// padding-top: 15upx;
-						display: flex;
-						align-items: flex-start;
-						flex-direction: column;
-						justify-content: space-around;
-						.name{
-							font-size: 40upx;
-							font-family: PingFang SC;
-							font-weight: bold;
-							color: #111111;
-							line-height: 1;
-						}
-						text{
-							font-family: PingFang SC, PingFang SC;
-							font-weight: 600;
-							font-size: 28rpx;
-						}
-						.phone{
-							width: 220rpx;
-							height: 48rpx;
-							margin-top: 30upx;
-							background: linear-gradient( 90deg, #FEA501 0%, #FECB8A 100%);
-							border-radius: 24rpx 24rpx 24rpx 24rpx;
-							border: 1rpx solid #FEDDB9;
-							display: flex;
-							align-items: center;
-							justify-content: center;
-							text{
-								font-size: 24upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #fff;
-								line-height: 1;
-								margin-left: 4rpx;
-							}
-							
-						}
-						.vip{
-							display: flex;
-							align-items: center;
-							justify-content: center;
-							width: 120rpx;
-							height: 40rpx;
-							background: linear-gradient( 90deg, #FFEBAA 0%, #FFD45D 100%);
-							border-radius: 38rpx 38rpx 38rpx 38rpx;
-							font-family: PingFang SC, PingFang SC;
-							font-weight: 500;
-							font-size: 20rpx;
-							color: #694511;
-						}
-					}
-				}
-				.right{
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					.msg-box{
-						// margin-left: 10upx;
-						width: 48upx;
-						height: 48upx;
-						// image{
-						// 	width: 100%;
-						// 	height: 100%;
-						// }
 					}
-					.set{
-						
-						width: 48rpx;
-						height: 48rpx;
-						// margin-right: 20rpx;
-						// image{
-						// 	width: 100%;
-						// 	height: 100%;
-						// }
+
+					.gender {
+						width: 36rpx;
+						height: 36rpx;
+						position: absolute;
+						right: 0;
+						bottom: 0;
 					}
 				}
-			}
-			.balance{
-				padding: 30rpx;
-				height: 180rpx;
-				margin: 50rpx 20rpx 0;
-				border-radius: 16rpx 16rpx 16rpx 16rpx;
-				background: linear-gradient( 266deg, #E83924 0%, #FEA603 100%);
-				// background-image:url(../../static/images/balancebg.png);
-				// background-repeat: no-repeat;
-				// background-size: 100%;
-				display: flex;
-				align-items: center;
-				justify-content: space-between;
-				.left{
+
+				.name-phone {
 					display: flex;
-					flex-direction: column;
 					align-items: flex-start;
-					justify-content:space-around;
-					height: 100%;
-					.text{
+					flex-direction: column;
+					justify-content: space-around;
+					margin-top: 30rpx;
+
+					.name {
+						font-size: 40upx;
 						font-family: PingFang SC;
-						font-weight: 400;
-						font-size: 26rpx;
-						color: #FFFFFF;
-						text-align: left;
-						margin-right: 16rpx;
+						font-weight: bold;
+						color: #111111;
+						line-height: 1;
 					}
-					.num{
-						font-family: Roboto, Roboto;
+
+					text {
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 600;
+						font-size: 28rpx;
+					}
+
+					.lable {
+						padding: 4rpx 16rpx;
 						font-weight: 500;
-						font-size: 64rpx;
+						font-size: 22rpx;
 						color: #FFFFFF;
+						background: #FAAB0C;
+						margin-left: 18rpx;
+						border-radius: 38rpx 38rpx 38rpx 38rpx;
 					}
-				}
-				.right{
-					width: 132rpx;
-					height: 64rpx;
-					line-height: 64rpx;
-					background: #FFFFFF;
-					border-radius: 32rpx 32rpx 32rpx 32rpx;
-					font-family: PingFang SC, PingFang SC;
-					font-weight: 500;
-					font-size: 26rpx;
-					color: #FF5030;
-					text-align: center;
-				}
-			}
-			.my-order{
-				padding: 20upx 20upx 0;
-				.inner{
-					box-sizing: border-box;
-					height: 245upx;
-					background: #FFFFFF;
-					border-radius: 16upx;
-					padding: 40upx 30upx;
-					display: flex;
-					flex-direction: column;
-					justify-content: space-between;
-					.title-box{
+
+					.phone {
+						width: 220rpx;
+						height: 48rpx;
+						margin-top: 30upx;
+						background: linear-gradient(90deg, #FEA501 0%, #FECB8A 100%);
+						border-radius: 24rpx 24rpx 24rpx 24rpx;
+						border: 1rpx solid #FEDDB9;
 						display: flex;
 						align-items: center;
-						justify-content: space-between;
-						.title{
-							font-size: 36upx;
+						justify-content: center;
+
+						text {
+							font-size: 24upx;
 							font-family: PingFang SC;
-							font-weight: bold;
-							color: #222222;
+							font-weight: 500;
+							color: #fff;
 							line-height: 1;
+							margin-left: 4rpx;
 						}
-						.all-order{
-							display: flex;
-							align-items: center;
-							.text{
-								font-size: 26upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #999999;
-								line-height: 1;
-								margin-right: 8upx;
-							}
-							// image{
-							// 	width: 14upx;
-							// 	height: 24upx;
-							// }
-						}
-					}
-					.status-box{
-						display: flex;
-						align-items: center;
-						justify-content: space-between;
-						padding: 0 10upx;
-						.item{
-							display: flex;
-							flex-direction: column;
-							align-items: center;
-							justify-content: center;
-							image{
-								width: 48upx;
-								height: 48upx;
-								margin-bottom: 18upx;
-							}
-							.text{
-								font-size: 26upx;
-								font-family: PingFang SC;
-								font-weight: 500;
-								color: #111111;
-								line-height: 1;
-							}
-						}
+
 					}
+
+				}
+
+				.txt {
+					font-size: 28rpx;
+					color: #666666;
+					margin-top: 12rpx;
+				}
+			}
+
+			.right {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+
+				.set {
+
+					width: 48rpx;
+					height: 48rpx;
+
 				}
 			}
-			
 		}
-	}
-	.vipbox{
-	   margin-top: 24upx;
-	   padding: 0 24upx;
-	   image{
-		   width: 100%;
-	   }
-	}
-	.content{
-		margin-top: 24upx;
-		padding: 0 24upx;
-		// display: flex;
-		align-items: center;
-		justify-content: center;
-		.task-list{
-			// padding: 24rpx;
+
+		.task-list {
 			display: flex;
 			align-items: center;
 			flex-direction: column;
 			justify-content: flex-start;
 			width: 100%;
-			  box-sizing: border-box; 
-			  border-radius: 24rpx;
-			  background: #FFFFFF;
-			.item{
+
+			.item {
 				width: 100%;
 				display: flex;
 				align-items: center;
 				justify-content: space-between;
-				padding:28rpx 24rpx;
-				box-sizing: border-box; 
+				padding: 28rpx 24rpx;
+				box-sizing: border-box;
+
 				// margin-bottom: 24rpx;
-				.left{
+				.left {
 					display: flex;
 					align-items: center;
 					justify-content: center;
-					image{
+
+					image {
 						width: 48rpx;
 						height: 48rpx;
 						margin-right: 32rpx;
 					}
-					.title-l{
+
+					.title-l {
 						font-family: PingFang SC, PingFang SC;
 						font-weight: 400;
 						font-size: 32rpx;
 						color: #333333;
 					}
 				}
-				.right{
+
+				.right {
 					display: flex;
 					align-items: center;
-					.num{
+
+					.num {
 						text-align: center;
 						width: 50rpx;
 						height: 36rpx;
 						line-height: 36rpx;
-						background: rgba(56,139,255,0.16);
+						background: rgba(56, 139, 255, 0.16);
 						border-radius: 34rpx 34rpx 34rpx 34rpx;
 						font-family: PingFang SC, PingFang SC;
 						font-weight: 400;
 						font-size: 24rpx;
 						color: #388BFF;
 					}
-					image{
+
+					image {
 						width: 32rpx;
 						height: 32rpx;
 						margin-left: 12rpx;
@@ -554,25 +428,28 @@
 				}
 			}
 		}
-		.used-tools{
+
+		.used-tools {
 			box-sizing: border-box;
 			background: #FFFFFF;
 			border-radius: 16upx;
 			padding: 40upx 30upx;
-			
-			.title{
+
+			.title {
 				font-size: 36upx;
 				font-family: PingFang SC;
 				font-weight: bold;
 				color: #222222;
 				line-height: 1;
 			}
-			.tools-list{
+
+			.tools-list {
 				margin-top: 50upx;
 				display: flex;
 				flex-wrap: wrap;
 				width: 100%;
-				.item{
+
+				.item {
 					box-sizing: border-box;
 					width: 25%;
 					display: flex;
@@ -581,11 +458,13 @@
 					justify-content: center;
 					margin-bottom: 50upx;
 					position: relative;
-					image{
+
+					image {
 						width: 48upx;
 						height: 48upx;
 					}
-					.text{
+
+					.text {
 						font-size: 24upx;
 						font-family: PingFang SC;
 						font-weight: 500;
@@ -593,7 +472,8 @@
 						line-height: 1;
 						margin-top: 20upx;
 					}
-					.contact-btn{
+
+					.contact-btn {
 						display: inline-block;
 						position: absolute;
 						top: 0;
@@ -605,7 +485,8 @@
 				}
 			}
 		}
-		.log-out{
+
+		.log-out {
 			height: 88upx;
 			line-height: 88upx;
 			text-align: center;
@@ -618,34 +499,39 @@
 			margin-top: 52upx;
 		}
 	}
-	.sub-btn{
+
+	.sub-btn {
 		position: absolute;
 		width: 100%;
 		height: 100%;
 		opacity: 0;
 	}
-	.like-product{
+
+	.like-product {
 		padding: 0 20rpx;
-		 
+
 	}
-	.banner{
+
+	.banner {
 		padding: 20rpx 20rpx 0rpx 20rpx;
 		height: 200rpx;
 		position: relative;
 		display: flex;
 		align-items: center;
 		justify-content: center;
-		image{
-			width:100%;
+
+		image {
+			width: 100%;
 			height: 100%;
 			border-radius: 16rpx 16rpx 16rpx 16rpx;
 		}
-		.tel_btn{
+
+		.tel_btn {
 			width: 100%;
 			height: 100%;
-			top:0upx;
+			top: 0upx;
 			position: absolute;
-			opacity:0.0;
+			opacity: 0.0;
 		}
 	}
-</style>
+</style>

+ 888 - 566
pages_echarts/statistics.vue

@@ -1,5 +1,23 @@
 <template>
 	<view class="container">
+		<!-- 统计类型切换 -->
+		<view class="stat-tabs">
+			<view 
+				class="stat-tab" 
+				:class="{ active: currentStatType === 'task' }" 
+				@click="switchStatType('task')"
+			>
+				任务统计
+			</view>
+			<view 
+				class="stat-tab" 
+				:class="{ active: currentStatType === 'service' }" 
+				@click="switchStatType('service')"
+			>
+				服务单统计
+			</view>
+		</view>
+		
 		<!-- 日期范围和筛选 -->
 		<view class="date-filter-bar mb16">
 			<view class="date-range" @click="showDatePicker = true">
@@ -12,53 +30,70 @@
 				<text>筛选</text>
 			</view>
 		</view>
-		
-		<!-- 内容区域 -->
-		<scroll-view class="content" scroll-y>
-			<!-- 数据汇总 -->
-			<view class="summary-section x-bc">
-				<view class="summary-header">
-					<view class="summary-indicator"></view>
-					<text class="summary-title">数据汇总</text>
-				</view>
-				<view class="summary-stats">
-					<view class="stat-item">
-						<text class="stat-label">任务数</text>
-						<text class="stat-value">{{ summaryData.taskCount }}</text>
-					</view>
-					<view class="stat-item">
-						<text class="stat-label">总积分</text>
-						<text class="stat-value">{{ summaryData.totalPoints }}</text>
-					</view>
-				</view>
-			</view>
-			
-			<!-- 数据表格 -->
-			<view class="table-section">
-				<view class="table-header">
-					<view class="table-col" style="width: 20%;">任务类型</view>
-					<view class="table-col" style="width: 15%;">积分</view>
-					<view class="table-col" style="width: 20%;">申请人员</view>
-					<view class="table-col" style="width: 20%;">任务状态</view>
-					<view class="table-col" style="width: 25%;">接收时间</view>
-				</view>
-				<view class="table-body">
-					<view class="table-row" v-for="(item, index) in tableData" :key="index">
-						<view class="table-col" style="width: 20%;">{{ item.taskType }}</view>
-						<view class="table-col" style="width: 15%;">{{ item.points }}</view>
-						<view class="table-col" style="width: 20%;">{{ item.applicant }}</view>
-						<view class="table-col" style="width: 20%;">
-							<text class="status-tag" :class="item.status">{{ item.statusText }}</text>
-						</view>
-						<view class="table-col" style="width: 25%;">{{ item.receiveTime }}</view>
-					</view>
-				</view>
-			</view>
-			
-			<!-- 底部提示 -->
-			<view class="no-more">没有更多了~</view>
-		</scroll-view>
-		
+
+		<!-- 内容区域 - 动态显示不同的统计表格 -->
+		<template v-if="currentStatType === 'task'">
+			<!-- 任务统计表格 -->
+			<statistics-table 
+				:summary-title="summaryTitle.task[0]" 
+				:summary-stats="summaryStats.task" 
+				:columns="tableColumns.task"
+				:table-data="tableData.task" 
+				:loading="loading.task" 
+				@load-more="loadMore('task')"
+			>
+				<!-- 状态列自定义插槽 -->
+				<template #col-statusText="{ item }">
+					<text class="status-tag" :class="item.status">{{ item.statusText }}</text>
+				</template>
+			</statistics-table>
+
+			<statistics-table 
+				:summary-title="summaryTitle.task[1]" 
+				:summary-stats="summaryStats.task" 
+				:columns="tableColumns.task"
+				:table-data="tableData.task" 
+				:loading="loading.task" 
+				@load-more="loadMore('task')"
+			>
+				<!-- 状态列自定义插槽 -->
+				<template #col-statusText="{ item }">
+					<text class="status-tag" :class="item.status">{{ item.statusText }}</text>
+				</template>
+			</statistics-table>
+		</template>
+
+		<template v-else-if="currentStatType === 'service'">
+			<!-- 服务单统计表格 -->
+			<statistics-table 
+				:summary-title="summaryTitle.service[0]" 
+				:summary-stats="summaryStats.service" 
+				:columns="tableColumns.service"
+				:table-data="tableData.service" 
+				:loading="loading.service" 
+				@load-more="loadMore('service')"
+			>
+				<!-- 状态列自定义插槽 -->
+				<template #col-statusText="{ item }">
+					<text class="status-tag" :class="item.status">{{ item.statusText }}</text>
+				</template>
+			</statistics-table>
+
+			<statistics-table 
+				:summary-title="summaryTitle.service[1]" 
+				:summary-stats="summaryStats.service" 
+				:columns="tableColumns.service"
+				:table-data="tableData.service" 
+				:loading="loading.service" 
+				@load-more="loadMore('service')"
+			>
+				<!-- 状态列自定义插槽 -->
+				<template #col-statusText="{ item }">
+					<text class="status-tag" :class="item.status">{{ item.statusText }}</text>
+				</template>
+			</statistics-table>
+		</template>
+
 		<!-- 日期选择弹窗 -->
 		<view class="date-picker-popup" v-if="showDatePicker" @click="showDatePicker = false">
 			<view class="date-picker-content" @click.stop>
@@ -83,45 +118,66 @@
 				</view>
 			</view>
 		</view>
-		
+
 		<!-- 筛选弹窗 -->
 		<view class="filter-popup" v-if="showFilter" @click="closeFilter">
 			<view class="filter-content" @click.stop>
 				<view class="filter-header">
 					<view class="filter-title">筛选</view>
-					<view class="filter-close-btn" @click="closeFilter">×</view>
+					<image class="filter-close-btn" src="/static/image/icon_cross.png" @click="closeFilter"></image>
 				</view>
-				
-				<!-- 任务类型筛选 -->
-				<view class="filter-group">
-					<view class="group-label">任务类型</view>
-					<view class="filter-tags">
-						<view 
-							class="filter-tag" 
-							:class="{ active: tempSelectedTaskType === item.value }"
-							v-for="(item, index) in taskTypeOptions" 
-							:key="index"
-							@click="selectTaskType(item.value)">
-							{{ item.label }}
+
+				<!-- 根据统计类型显示不同的筛选条件 -->
+				<template v-if="currentStatType === 'task'">
+					<!-- 任务类型筛选 -->
+					<view class="filter-group">
+						<view class="group-label">任务类型</view>
+						<view class="filter-tags">
+							<view class="filter-tag" :class="{ active: tempSelectedTaskType === item.value }"
+								v-for="(item, index) in taskTypeOptions" :key="index" @click="selectTaskType(item.value)">
+								{{ item.label }}
+							</view>
 						</view>
 					</view>
-				</view>
-				
-				<!-- 任务状态筛选 -->
-				<view class="filter-group">
-					<view class="group-label">任务状态</view>
-					<view class="filter-tags">
-						<view 
-							class="filter-tag" 
-							:class="{ active: tempSelectedTaskStatus === item.value }"
-							v-for="(item, index) in taskStatusOptions" 
-							:key="index"
-							@click="selectTaskStatus(item.value)">
-							{{ item.label }}
+
+					<!-- 任务状态筛选 -->
+					<view class="filter-group">
+						<view class="group-label">任务状态</view>
+						<view class="filter-tags">
+							<view class="filter-tag" :class="{ active: tempSelectedTaskStatus === item.value }"
+								v-for="(item, index) in taskStatusOptions" :key="index"
+								@click="selectTaskStatus(item.value)">
+								{{ item.label }}
+							</view>
 						</view>
 					</view>
-				</view>
-				
+				</template>
+
+				<template v-else-if="currentStatType === 'service'">
+					<!-- 服务单类型筛选 -->
+					<view class="filter-group">
+						<view class="group-label">服务单类型</view>
+						<view class="filter-tags">
+							<view class="filter-tag" :class="{ active: tempSelectedServiceType === item.value }"
+								v-for="(item, index) in serviceTypeOptions" :key="index" @click="selectServiceType(item.value)">
+								{{ item.label }}
+							</view>
+						</view>
+					</view>
+
+					<!-- 服务单状态筛选 -->
+					<view class="filter-group">
+						<view class="group-label">服务单状态</view>
+						<view class="filter-tags">
+							<view class="filter-tag" :class="{ active: tempSelectedServiceStatus === item.value }"
+								v-for="(item, index) in serviceStatusOptions" :key="index"
+								@click="selectServiceStatus(item.value)">
+								{{ item.label }}
+							</view>
+						</view>
+					</view>
+				</template>
+
 				<!-- 操作按钮 -->
 				<view class="filter-actions">
 					<view class="reset-btn" @click="resetFilters">重置</view>
@@ -133,576 +189,842 @@
 </template>
 
 <script>
-// import { getStatisticsData } from '@/api-js/statistics'
-export default {
-	data() {
-		return {
-			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
-			showDatePicker: false,
-			showFilter: false,
-			dateRange: {
-				startDate: '2025-12-01',
-				endDate: '2025-12-25'
-			},
-			tempDateRange: {
-				startDate: '2025-12-01',
-				endDate: '2025-12-25'
-			},
-			selectedTaskType: 'academicLecture', // 默认选中学术讲座
-			selectedTaskStatus: '',
-			taskTypeOptions: [
-				{ label: '医生坐诊', value: 'doctorConsultation' },
-				{ label: '科普讲座', value: 'popularScienceLecture' },
-				{ label: '学术讲座', value: 'academicLecture' },
-				{ label: '科普文章', value: 'popularScienceArticle' },
-				{ label: '科普短视频', value: 'popularScienceShortVideo' },
-				{ label: '科普长视频', value: 'popularScienceLongVideo' },
-				{ label: '空中课堂', value: 'airClassroom' },
-				{ label: '用药调研', value: 'medicationSurvey' },
-				{ label: '问卷调研', value: 'questionnaireSurvey' },
-				{ label: '社群咨询', value: 'communityConsultation' },
-				{ label: '健康问答', value: 'healthQA' }
-			],
-			taskStatusOptions: [
-				{ label: '未完成', value: 'uncompleted' },
-				{ label: '待审核', value: 'pendingReview' },
-				{ label: '已驳回', value: 'rejected' },
-				{ label: '已完成', value: 'completed' },
-				{ label: '已完结', value: 'finished' }
-			],
-			tempSelectedTaskType: 'academicLecture',
-			tempSelectedTaskStatus: '',
-			summaryData: {
-				taskCount: 6,
-				totalPoints: 300
-			},
-			tableData: [
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '100', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' }
-			]
-		}
-	},
-	computed: {
-		dateRangeText() {
-			return `${this.dateRange.startDate} 至 ${this.dateRange.endDate}`
-		}
-	},
-	watch: {
-		showFilter(newVal) {
-			if (newVal) {
-				// 打开弹窗时,同步临时选择值
-				this.tempSelectedTaskType = this.selectedTaskType
-				this.tempSelectedTaskStatus = this.selectedTaskStatus
-			}
-		}
-	},
-	onLoad() {
-		this.tempSelectedTaskType = this.selectedTaskType
-		this.tempSelectedTaskStatus = this.selectedTaskStatus
-		//this.loadData()
-	},
-	onReachBottom() {
-		this.loadMore()
-	},
-	methods: {
-		goBack() {
-			uni.navigateBack()
-		},
-		onStartDateChange(e) {
-			this.tempDateRange.startDate = e.detail.value
+	import StatisticsTable from '@/components/StatisticsTable.vue'
+	// import { getStatisticsData } from '@/api-js/statistics'
+	export default {
+		components: {
+			StatisticsTable
 		},
-		onEndDateChange(e) {
-			this.tempDateRange.endDate = e.detail.value
-		},
-		confirmDateRange() {
-			if (!this.tempDateRange.startDate || !this.tempDateRange.endDate) {
-				uni.showToast({ icon: 'none', title: '请选择完整的日期范围' })
-				return
-			}
-			if (new Date(this.tempDateRange.startDate) > new Date(this.tempDateRange.endDate)) {
-				uni.showToast({ icon: 'none', title: '开始日期不能大于结束日期' })
-				return
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				showDatePicker: false,
+				showFilter: false,
+				currentStatType: 'task', // 当前统计类型: task-任务统计, service-服务单统计
+				
+				// 日期范围
+				dateRange: {
+					startDate: '2025-12-01',
+					endDate: '2025-12-25'
+				},
+				tempDateRange: {
+					startDate: '2025-12-01',
+					endDate: '2025-12-25'
+				},
+				
+				// 任务统计筛选
+				selectedTaskType: 'academicLecture',
+				selectedTaskStatus: '',
+				tempSelectedTaskType: 'academicLecture',
+				tempSelectedTaskStatus: '',
+				
+				// 服务单统计筛选
+				selectedServiceType: 'all',
+				selectedServiceStatus: '',
+				tempSelectedServiceType: 'all',
+				tempSelectedServiceStatus: '',
+				
+				// 任务类型选项
+				taskTypeOptions: [{
+						label: '医生坐诊',
+						value: 'doctorConsultation'
+					},
+					{
+						label: '科普讲座',
+						value: 'popularScienceLecture'
+					},
+					{
+						label: '学术讲座',
+						value: 'academicLecture'
+					},
+					{
+						label: '科普文章',
+						value: 'popularScienceArticle'
+					},
+					{
+						label: '科普短视频',
+						value: 'popularScienceShortVideo'
+					},
+					{
+						label: '科普长视频',
+						value: 'popularScienceLongVideo'
+					},
+					{
+						label: '空中课堂',
+						value: 'airClassroom'
+					},
+					{
+						label: '用药调研',
+						value: 'medicationSurvey'
+					},
+					{
+						label: '问卷调研',
+						value: 'questionnaireSurvey'
+					},
+					{
+						label: '社群咨询',
+						value: 'communityConsultation'
+					},
+					{
+						label: '健康问答',
+						value: 'healthQA'
+					}
+				],
+				
+				// 任务状态选项
+				taskStatusOptions: [{
+						label: '未完成',
+						value: 'uncompleted'
+					},
+					{
+						label: '待审核',
+						value: 'pendingReview'
+					},
+					{
+						label: '已驳回',
+						value: 'rejected'
+					},
+					{
+						label: '已完成',
+						value: 'completed'
+					},
+					{
+						label: '已完结',
+						value: 'finished'
+					}
+				],
+				
+				// 服务单类型选项
+				serviceTypeOptions: [{
+						label: '全部类型',
+						value: 'all'
+					},
+					{
+						label: '技术咨询',
+						value: 'techConsultation'
+					},
+					{
+						label: '售后服务',
+						value: 'afterSales'
+					},
+					{
+						label: '安装服务',
+						value: 'installation'
+					},
+					{
+						label: '维修服务',
+						value: 'repair'
+					},
+					{
+						label: '投诉建议',
+						value: 'complaint'
+					}
+				],
+				
+				// 服务单状态选项
+				serviceStatusOptions: [{
+						label: '待处理',
+						value: 'pending'
+					},
+					{
+						label: '处理中',
+						value: 'processing'
+					},
+					{
+						label: '已完成',
+						value: 'completed'
+					},
+					{
+						label: '已关闭',
+						value: 'closed'
+					},
+					{
+						label: '已取消',
+						value: 'cancelled'
+					}
+				],
+				
+				// 统计标题(分开存储)
+				summaryTitle: {
+					service: [ '汇总统计', '明细统计'],
+					task: ['服务单完成统计', '服务单创建统计']
+				},
+				
+				// 统计数据
+				summaryStats: {
+					task: [{
+						label: '总积分',
+						value: 300
+					}],
+					service: [{
+						label: '总服务单数',
+						value: 45
+					}]
+				},
+				
+				// 表格列定义
+				tableColumns: {
+					task: [{
+							title: '归属',
+							key: 'taskType',
+							width: '20%'
+						},
+						{
+							title: '类型',
+							key: 'points',
+							width: '15%'
+						},
+						{
+							title: '数量',
+							key: 'applicant',
+							width: '20%'
+						},
+						{
+							title: '客户',
+							key: 'statusText',
+							width: '20%',
+							slot: true
+						},
+						{
+							title: '业务员',
+							key: 'receiveTime',
+							width: '25%'
+						},{
+							title: '积分',
+							key: 'receiveTime',
+							width: '25%'
+						}
+					],
+					service: [{
+							title: '项目归属',
+							key: 'serviceNo',
+							width: '25%'
+						},
+						{
+							title: '类型',
+							key: 'serviceType',
+							width: '20%'
+						},
+						{
+							title: '数量',
+							key: 'customerName',
+							width: '20%'
+						},
+						{
+							title: '客户',
+							key: 'statusText',
+							width: '20%',
+							slot: true
+						},
+						{
+							title: '业务员',
+							key: 'createTime',
+							width: '25%'
+						},
+						{
+							title: '积分',
+							key: 'createTime',
+							width: '25%'
+						}
+					]
+				},
+				
+				// 表格数据
+				tableData: {
+					task: [{
+							taskType: '用药调研',
+							points: '20',
+							applicant: '王*明',
+							status: 'uncompleted',
+							statusText: '未完成',
+							receiveTime: '2025-09-25'
+						},
+						{
+							taskType: '科普短视频',
+							points: '20',
+							applicant: '王*明',
+							status: 'uncompleted',
+							statusText: '未完成',
+							receiveTime: '2025-09-25'
+						},
+						{
+							taskType: '用药调研',
+							points: '100',
+							applicant: '王*明',
+							status: 'uncompleted',
+							statusText: '未完成',
+							receiveTime: '2025-09-25'
+						}
+					],
+					service: [{
+							serviceNo: '学术研究',
+							serviceType: '技术咨询',
+							customerName: '李*华',
+							status: 'completed',
+							statusText: '已完成',
+							createTime: '2025-12-25'
+						},
+						{
+							serviceNo: '学术研究',
+							serviceType: '售后服务',
+							customerName: '张*伟',
+							status: 'processing',
+							statusText: '处理中',
+							createTime: '2025-12-24'
+						},
+						{
+							serviceNo: '学术研究',
+							serviceType: '安装服务',
+							customerName: '王*芳',
+							status: 'pending',
+							statusText: '待处理',
+							createTime: '2025-12-23'
+						}
+					]
+				},
+				
+				// 加载状态
+				loading: {
+					task: false,
+					service: false
+				}
 			}
-			this.dateRange = { ...this.tempDateRange }
-			this.showDatePicker = false
-			this.loadData()
-		},
-		closeFilter() {
-			// 关闭弹窗时,恢复临时选择值为当前选择值
-			this.tempSelectedTaskType = this.selectedTaskType
-			this.tempSelectedTaskStatus = this.selectedTaskStatus
-			this.showFilter = false
 		},
-		selectTaskType(value) {
-			// 如果点击的是已选中的,则取消选择
-			if (this.tempSelectedTaskType === value) {
-				this.tempSelectedTaskType = ''
-			} else {
-				this.tempSelectedTaskType = value
+		computed: {
+			dateRangeText() {
+				return `${this.dateRange.startDate} 至 ${this.dateRange.endDate}`
 			}
 		},
-		selectTaskStatus(value) {
-			// 如果点击的是已选中的,则取消选择
-			if (this.tempSelectedTaskStatus === value) {
-				this.tempSelectedTaskStatus = ''
-			} else {
-				this.tempSelectedTaskStatus = value
+		watch: {
+			showFilter(newVal) {
+				if (newVal) {
+					// 打开弹窗时,同步临时选择值
+					if (this.currentStatType === 'task') {
+						this.tempSelectedTaskType = this.selectedTaskType
+						this.tempSelectedTaskStatus = this.selectedTaskStatus
+					} else {
+						this.tempSelectedServiceType = this.selectedServiceType
+						this.tempSelectedServiceStatus = this.selectedServiceStatus
+					}
+				}
+			},
+			currentStatType(newVal) {
+				// 切换统计类型时,重置筛选条件(可选)
+				this.resetFilters()
+				// 重新加载数据
+				this.loadData()
 			}
 		},
-		resetFilters() {
-			this.tempSelectedTaskType = ''
-			this.tempSelectedTaskStatus = ''
+		onLoad() {
+			this.loadData()
 		},
-		confirmFilters() {
-			this.selectedTaskType = this.tempSelectedTaskType
-			this.selectedTaskStatus = this.tempSelectedTaskStatus
-			this.showFilter = false
-			//this.loadData()
+		onReachBottom() {
+			this.loadMore(this.currentStatType)
 		},
-		async loadData() {
-			try {
-				uni.showLoading({ title: '加载中...' })
-				const res = await getStatisticsData({
-					startDate: this.dateRange.startDate,
-					endDate: this.dateRange.endDate,
-					taskType: this.selectedTaskType,
-					taskStatus: this.selectedTaskStatus
-				})
-				uni.hideLoading()
-				if (res.code === 200 && res.data) {
-					this.summaryData = {
-						taskCount: res.data.taskCount || 6,
-						totalPoints: res.data.totalPoints || 300
-					}
-					this.tableData = res.data.list || this.getDefaultData()
+		methods: {
+			// 切换统计类型
+			switchStatType(type) {
+				if (this.currentStatType !== type) {
+					this.currentStatType = type
+				}
+			},
+			
+			goBack() {
+				uni.navigateBack()
+			},
+			
+			onStartDateChange(e) {
+				this.tempDateRange.startDate = e.detail.value
+			},
+			
+			onEndDateChange(e) {
+				this.tempDateRange.endDate = e.detail.value
+			},
+			
+			confirmDateRange() {
+				if (!this.tempDateRange.startDate || !this.tempDateRange.endDate) {
+					uni.showToast({
+						icon: 'none',
+						title: '请选择完整的日期范围'
+					})
+					return
+				}
+				if (new Date(this.tempDateRange.startDate) > new Date(this.tempDateRange.endDate)) {
+					uni.showToast({
+						icon: 'none',
+						title: '开始日期不能大于结束日期'
+					})
+					return
+				}
+				this.dateRange = {
+					...this.tempDateRange
+				}
+				this.showDatePicker = false
+				this.loadData()
+			},
+			
+			closeFilter() {
+				// 关闭弹窗时,恢复临时选择值为当前选择值
+				if (this.currentStatType === 'task') {
+					this.tempSelectedTaskType = this.selectedTaskType
+					this.tempSelectedTaskStatus = this.selectedTaskStatus
+				} else {
+					this.tempSelectedServiceType = this.selectedServiceType
+					this.tempSelectedServiceStatus = this.selectedServiceStatus
+				}
+				this.showFilter = false
+			},
+			
+			// 任务筛选相关方法
+			selectTaskType(value) {
+				if (this.tempSelectedTaskType === value) {
+					this.tempSelectedTaskType = ''
+				} else {
+					this.tempSelectedTaskType = value
+				}
+			},
+			
+			selectTaskStatus(value) {
+				if (this.tempSelectedTaskStatus === value) {
+					this.tempSelectedTaskStatus = ''
+				} else {
+					this.tempSelectedTaskStatus = value
+				}
+			},
+			
+			// 服务单筛选相关方法
+			selectServiceType(value) {
+				if (this.tempSelectedServiceType === value) {
+					this.tempSelectedServiceType = ''
+				} else {
+					this.tempSelectedServiceType = value
+				}
+			},
+			
+			selectServiceStatus(value) {
+				if (this.tempSelectedServiceStatus === value) {
+					this.tempSelectedServiceStatus = ''
+				} else {
+					this.tempSelectedServiceStatus = value
+				}
+			},
+			
+			resetFilters() {
+				if (this.currentStatType === 'task') {
+					this.tempSelectedTaskType = ''
+					this.tempSelectedTaskStatus = ''
 				} else {
-					this.tableData = this.getDefaultData()
+					this.tempSelectedServiceType = 'all'
+					this.tempSelectedServiceStatus = ''
+				}
+			},
+			
+			confirmFilters() {
+				if (this.currentStatType === 'task') {
+					this.selectedTaskType = this.tempSelectedTaskType
+					this.selectedTaskStatus = this.tempSelectedTaskStatus
+				} else {
+					this.selectedServiceType = this.tempSelectedServiceType
+					this.selectedServiceStatus = this.tempSelectedServiceStatus
+				}
+				this.showFilter = false
+				this.loadData()
+			},
+			
+			async loadData() {
+				try {
+					uni.showLoading({
+						title: '加载中...'
+					})
+					
+					// 根据当前统计类型加载数据
+					if (this.currentStatType === 'task') {
+						// 加载任务统计数据
+						// const res = await getTaskStatistics({
+						// 	startDate: this.dateRange.startDate,
+						// 	endDate: this.dateRange.endDate,
+						// 	taskType: this.selectedTaskType,
+						// 	taskStatus: this.selectedTaskStatus
+						// })
+						
+						// 模拟数据
+						setTimeout(() => {
+							uni.hideLoading()
+							// 这里可以更新数据
+						}, 500)
+						
+					} else {
+						// 加载服务单统计数据
+						// const res = await getServiceStatistics({
+						// 	startDate: this.dateRange.startDate,
+						// 	endDate: this.dateRange.endDate,
+						// 	serviceType: this.selectedServiceType,
+						// 	serviceStatus: this.selectedServiceStatus
+						// })
+						
+						// 模拟数据
+						setTimeout(() => {
+							uni.hideLoading()
+							// 这里可以更新数据
+						}, 500)
+					}
+					
+				} catch (e) {
+					uni.hideLoading()
+					console.error('加载数据失败', e)
 				}
-			} catch (e) {
-				uni.hideLoading()
-				console.error('加载数据失败', e)
-				this.tableData = this.getDefaultData()
+			},
+			
+			async loadMore(type) {
+				// 根据类型加载更多数据
+				this.loading[type] = true
+				// 模拟加载更多
+				setTimeout(() => {
+					if (type === 'task') {
+						// 添加更多任务数据
+						this.tableData.task.push(...this.getMoreTaskData())
+					} else {
+						// 添加更多服务单数据
+						this.tableData.service.push(...this.getMoreServiceData())
+					}
+					this.loading[type] = false
+				}, 1000)
+			},
+			
+			getMoreTaskData() {
+				// 返回更多任务数据
+				return [{
+						taskType: '更多任务',
+						points: '30',
+						applicant: '测试*员',
+						status: 'completed',
+						statusText: '已完成',
+						receiveTime: '2025-09-26'
+					},
+					{
+						taskType: '更多任务2',
+						points: '50',
+						applicant: '测试*员2',
+						status: 'pendingReview',
+						statusText: '待审核',
+						receiveTime: '2025-09-27'
+					}
+				]
+			},
+			
+			getMoreServiceData() {
+				// 返回更多服务单数据
+				return [{
+						serviceNo: 'FW20251222004',
+						serviceType: '维修服务',
+						customerName: '赵*强',
+						status: 'closed',
+						statusText: '已关闭',
+						createTime: '2025-12-22'
+					},
+					{
+						serviceNo: 'FW20251221005',
+						serviceType: '投诉建议',
+						customerName: '孙*丽',
+						status: 'cancelled',
+						statusText: '已取消',
+						createTime: '2025-12-21'
+					}
+				]
 			}
-		},
-		async loadMore() {
-			// 加载更多数据
-		},
-		getDefaultData() {
-			// 默认数据,根据图片中的示例
-			return [
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '100', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '用药调研', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' },
-				{ taskType: '科普短视频', points: '20', applicant: '王*明', status: 'uncompleted', statusText: '未完成', receiveTime: '2025-09-25' }
-			]
 		}
 	}
-}
 </script>
 
 <style lang="scss" scoped>
-.container {
-	min-height: 100vh;
-	display: flex;
-	flex-direction: column;
-}
-
-.status-bar {
-	width: 100%;
-	background: #fff;
-}
-
-.header {
-	position: relative;
-	height: 88rpx;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.back-btn {
-		position: absolute;
-		left: 24rpx;
-		width: 40rpx;
-		height: 40rpx;
-		
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	
-	.title {
-		font-size: 36rpx;
-		font-weight: bold;
-		color: #333;
+	.container {
+		min-height: 100vh;
+		background: #f7f8fa;
+		padding-bottom: 20rpx;
 	}
 	
-	.header-right {
-		position: absolute;
-		right: 24rpx;
+	/* 统计类型切换样式 */
+	.stat-tabs {
 		display: flex;
-		align-items: center;
-		gap: 16rpx;
+		background: #fff;
+		padding: 24rpx;
 		
-		.more-icon {
+		.stat-tab {
+			flex: 1;
+			text-align: center;
+			padding: 20rpx 0;
 			font-size: 32rpx;
-			color: #333;
+			color: #999;
+			position: relative;
+			
+			&.active {
+				color: #333333;
+				font-weight: bold;
+				
+				&::after {
+					content: '';
+					position: absolute;
+					bottom: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					width: 60rpx;
+					height: 6rpx;
+					background: #388BFF;
+					border-radius: 3rpx;
+				}
+			}
 		}
 	}
-}
-
-.date-filter-bar {
-	display: flex;
-	align-items: center;
-	justify-content: space-between;
-	padding: 24rpx;
-	background: #fff;
-	// border-bottom: 1rpx solid #f0f0f0;
 	
-	.date-range {
+	.date-filter-bar {
 		display: flex;
 		align-items: center;
-		gap: 8rpx;
+		justify-content: space-between;
+		padding: 24rpx;
+		background: #fff;
 		
-		.clock-icon {
-			font-size: 28rpx;
+		.date-range {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			
+			.date-text {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 28rpx;
+				color: #333333;
+			}
+			
+			.arrow-down {
+				font-size: 20rpx;
+				color: #333333;
+			}
 		}
 		
-		.date-text {
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 500;
+		.filter-btn {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
 			font-size: 28rpx;
-			color: #333333;
-		}
-		
-		.arrow-down {
-			font-size: 20rpx;
-			color: #333333;
+			color: #999999;
 		}
 	}
 	
-	.filter-btn {
-		display: flex;
-		align-items: center;
-		gap: 8rpx;
-		font-size: 28rpx;
-		color: #333;
-		
-		.filter-icon {
-			font-size: 24rpx;
-		}
+	.w32 {
+		width: 32rpx;
 	}
-}
-
-.content {
-	flex: 1;
-	background: #fff;
-}
-
-.summary-section {
-	background: #fff;
-	padding:32rpx 24rpx;
-	// margin-bottom: 32rpx;
 	
-	.summary-header {
-		display: flex;
-		align-items: center;
-		// margin-bottom: 24rpx;
+	.h32 {
+		height: 32rpx;
+	}
+	
+	.mb16 {
+		margin-bottom: 16rpx;
+	}
+	
+	.status-tag {
+		padding: 4rpx 12rpx;
+		border-radius: 4rpx;
+		font-size: 24rpx;
 		
-		.summary-indicator {
-			width: 6rpx;
-			height: 32rpx;
-			background: #388BFF;
-			border-radius: 3rpx;
-			margin-right: 16rpx;
+		&.uncompleted,
+		&.pending {
+			background: #FFF3E0;
+			color: #FF9800;
 		}
 		
-		.summary-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
+		&.completed {
+			background: #E8F5E9;
+			color: #4CAF50;
+		}
+		
+		&.pendingReview {
+			background: #E3F2FD;
+			color: #2196F3;
+		}
+		
+		&.rejected {
+			background: #FFEBEE;
+			color: #F44336;
+		}
+		
+		&.processing {
+			background: #E3F2FD;
+			color: #2196F3;
+		}
+		
+		&.closed,
+		&.cancelled {
+			background: #F5F5F5;
+			color: #9E9E9E;
 		}
 	}
 	
-	.summary-stats {
+	/* 日期选择弹窗样式 */
+	.date-picker-popup {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.5);
+		z-index: 999;
 		display: flex;
-		gap: 48rpx;
+		align-items: flex-end;
+	}
+	
+	.date-picker-content {
+		width: 100%;
+		background: #fff;
+		border-radius: 24rpx 24rpx 0 0;
 		
-		.stat-item {
+		.picker-header {
 			display: flex;
-			flex-direction: row;
 			align-items: center;
-			gap: 16rpx;
+			justify-content: space-between;
+			padding: 24rpx;
 			
-			.stat-label {
-				font-size: 24rpx;
-				color: #999;
+			.picker-cancel {
+				font-size: 30rpx;
+				color: #666;
 			}
 			
-			.stat-value {
-				font-size: 36rpx;
+			.picker-title {
+				font-size: 32rpx;
 				font-weight: bold;
+				color: #333;
+			}
+			
+			.picker-confirm {
+				font-size: 30rpx;
 				color: #388BFF;
 			}
 		}
-	}
-}
-
-.table-section {
-	background: #fff;
-	padding: 0 24rpx;
-	.table-header {
-		display: flex;
-		background: #E3EFFF;
-		padding: 24rpx 16rpx;
 		
-		.table-col {
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 500;
-			font-size: 26rpx;
-			color: #333333;
-			line-height: 40rpx;
-			text-align: left;
-		}
-	}
-	
-	.table-body {
-		.table-row {
-			display: flex;
-			padding: 24rpx 16rpx;
+		.picker-body {
+			padding: 24rpx;
 			
-			&:nth-child(2n) {
-				background: #F7F8FA;
-				border-radius: 8rpx 8rpx 8rpx 8rpx;
-			}
-			
-			.table-col {
-				font-size: 26rpx;
-				color: #333;
+			.date-item {
 				display: flex;
 				align-items: center;
-				text-align: left;
-				font-family: PingFang SC, PingFang SC;
-				font-weight: 400;
-				font-size: 26rpx;
-				line-height: 40rpx;
-				// .status-tag {
-				// 	padding: 4rpx 12rpx;
-				// 	border-radius: 4rpx;
-				// 	font-size: 24rpx;
-					
-				// 	&.uncompleted {
-				// 		background: #FFF3E0;
-				// 		color: #FF9800;
-				// 	}
-					
-				// 	&.completed {
-				// 		background: #E8F5E9;
-				// 		color: #4CAF50;
-				// 	}
-				// }
+				justify-content: space-between;
+				padding: 24rpx 0;
+				&:last-child {
+					border-bottom: none;
+				}
+				
+				.date-label {
+					font-size: 30rpx;
+					color: #333;
+				}
+				
+				.date-value {
+					font-size: 30rpx;
+					color: #388BFF;
+				}
 			}
 		}
 	}
-}
-
-.no-more {
-	text-align: center;
-	padding: 48rpx 0;
-	font-size: 24rpx;
-	color: #999;
-}
-
-.date-picker-popup {
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background: rgba(0, 0, 0, 0.5);
-	z-index: 999;
-	display: flex;
-	align-items: flex-end;
-}
-
-.date-picker-content {
-	width: 100%;
-	background: #fff;
-	border-radius: 24rpx 24rpx 0 0;
 	
-	.picker-header {
+	/* 筛选弹窗样式 */
+	.filter-popup {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.5);
+		z-index: 999;
 		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		padding: 24rpx;
-		border-bottom: 1rpx solid #f0f0f0;
-		
-		.picker-cancel {
-			font-size: 30rpx;
-			color: #666;
-		}
-		
-		.picker-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
-		}
-		
-		.picker-confirm {
-			font-size: 30rpx;
-			color: #388BFF;
-		}
+		align-items: flex-end;
 	}
 	
-	.picker-body {
+	.filter-content {
+		width: 100%;
+		background: #fff;
+		border-radius: 24rpx 24rpx 0 0;
 		padding: 24rpx;
+		max-height: 80vh;
+		overflow-y: auto;
 		
-		.date-item {
+		.filter-header {
 			display: flex;
 			align-items: center;
-			justify-content: space-between;
-			padding: 24rpx 0;
-			border-bottom: 1rpx solid #f0f0f0;
-			
-			&:last-child {
-				border-bottom: none;
-			}
+			justify-content: center;
+			margin-bottom: 32rpx;
+			position: relative;
 			
-			.date-label {
-				font-size: 30rpx;
+			.filter-title {
+				font-size: 32rpx;
+				font-weight: bold;
 				color: #333;
 			}
 			
-			.date-value {
-				font-size: 30rpx;
-				color: #388BFF;
+			.filter-close-btn {
+				width: 44rpx;
+				height: 44rpx;
+				position: absolute;
+				right: 0;
 			}
 		}
-	}
-}
-
-.filter-popup {
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background: rgba(0, 0, 0, 0.5);
-	z-index: 999;
-	display: flex;
-	align-items: flex-end;
-}
-
-.filter-content {
-	width: 100%;
-	background: #fff;
-	border-radius: 24rpx 24rpx 0 0;
-	padding: 24rpx;
-	max-height: 80vh;
-	overflow-y: auto;
-	
-	.filter-header {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		margin-bottom: 32rpx;
-		
-		.filter-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
-		}
-		
-		.filter-close-btn {
-			width: 48rpx;
-			height: 48rpx;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			font-size: 40rpx;
-			color: #999;
-		}
-	}
-	
-	.filter-group {
-		margin-bottom: 40rpx;
-		
-		&:last-of-type {
-			margin-bottom: 0;
-		}
 		
-		.group-label {
-			font-size: 28rpx;
-			font-weight: bold;
-			color: #333;
-			margin-bottom: 20rpx;
-		}
-		
-		.filter-tags {
-			display: flex;
-			flex-wrap: wrap;
-			gap: 16rpx;
+		.filter-group {
+			margin-bottom: 40rpx;
 			
-			.filter-tag {
-				padding: 12rpx 24rpx;
-				background: #f5f5f5;
-				border-radius: 8rpx;
-				font-size: 26rpx;
-				color: #666;
-				border: 1rpx solid transparent;
+			.group-label {
+				font-size: 28rpx;
+				font-weight: bold;
+				color: #333;
+				margin-bottom: 20rpx;
+			}
+			
+			.filter-tags {
+				display: flex;
+				flex-wrap: wrap;
+				gap: 20rpx;
 				
-				&.active {
-					background: #E6F7FF;
-					color: #388BFF;
-					border-color: #388BFF;
+				.filter-tag {
+					padding: 12rpx 24rpx;
+					font-size: 28rpx;
+					color: #333;
+					background: #F7F8FA;
+					border-radius: 70rpx;
+					
+					&.active {
+						background: rgba(56, 139, 255, 0.15);
+						color: #388BFF;
+					}
 				}
 			}
 		}
-	}
-	
-	.filter-actions {
-		display: flex;
-		gap: 24rpx;
-		margin-top: 40rpx;
-		padding-top: 24rpx;
-		border-top: 1rpx solid #f0f0f0;
-		
-		.reset-btn,
-		.confirm-btn {
-			flex: 1;
-			height: 88rpx;
-			line-height: 88rpx;
-			text-align: center;
-			border-radius: 8rpx;
-			font-size: 30rpx;
-		}
-		
-		.reset-btn {
-			background: #fff;
-			color: #666;
-			border: 1rpx solid #e0e0e0;
-		}
 		
-		.confirm-btn {
-			background: #388BFF;
-			color: #fff;
+		.filter-actions {
+			display: flex;
+			gap: 24rpx;
+			margin-top: 40rpx;
+			padding-top: 24rpx;
+			border-top: 1rpx solid #f0f0f0;
+			
+			.reset-btn,
+			.confirm-btn {
+				flex: 1;
+				height: 88rpx;
+				line-height: 88rpx;
+				text-align: center;
+				border-radius: 200rpx;
+				font-size: 28rpx;
+			}
+			
+			.reset-btn {
+				background: #fff;
+				color: #388BFF;
+				border: 2rpx solid #388BFF;
+			}
+			
+			.confirm-btn {
+				background: #388BFF;
+				color: #fff;
+			}
 		}
 	}
-}
-</style>
+</style>

+ 22 - 0
pages_speaker/createTask - 副本.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 864 - 0
pages_speaker/index.vue

@@ -0,0 +1,864 @@
+<template>
+	<view class="container">
+		<view class="top-box">
+			<view class="input-item">
+				<image class="icon" src="@/static/image/search.png" mode=""></image>
+				<input class="" placeholder="请输入讲者姓名" placeholder-class="placeholder" />
+			</view>
+			<view class="filter-item" @click="showFilter = true">
+				<image class="w32 h32 mr4" src="@/static/image/icon_select.png" mode=""></image>
+				<text>筛选</text>
+			</view>
+		</view>
+		<!-- 筛选标签栏 -->
+		<view class="filter-bar">
+			<view class="filter-tabs">
+				<view class="tab-item" :class="{ active: currentTab === item.value }" v-for="(item, index) in tabs"
+					:key="index" @click="switchTab(item.value)">
+					{{ item.label }}
+				</view>
+			</view>
+			<view class="filter-divider"></view>
+			<view class="filter-btn">
+				<text>全员</text>
+				<image class="w32 h32" src="@/static/image/icon_select.png" mode=""></image>
+			</view>
+		</view>
+		<!-- 任务列表 -->
+		<scroll-view class="content" scroll-y>
+			<view class="task-card" v-for="(item, index) in taskList" :key="index" @click="showDetail(item)">
+				<view class="card-header">
+					<view class="card-title">
+						<text>{{ item.title }}</text>
+						<text class="title-little">{{item.titleLittle}}</text>
+						<view class="lable">一级</view>
+					</view>
+					<view class="status-tag" :class="item.status">
+						{{ item.statusText }}
+					</view>
+				</view>
+
+
+				<view class="row">
+					<image class="icon" src="@/static/image/icon_select.png" mode=""></image>
+					<text>湖南省人民医院</text>
+					<view class="line"></view>
+					<text>口腔科</text>
+				</view>
+				<view class="row">
+					<image class="icon" src="/static/image/icon_select.png" mode=""></image>
+					<text class="txt">小蜜蜂:张萌(302、403)、王欣欣(3...小蜜蜂:张萌(302、403)、王欣欣</text>
+					<image class="icon" src="/static/image/icon_expand.png" mode=""></image>
+				</view>
+
+				<view class="card-warning" v-if="item.warning">
+					<text class="warning-icon">⚠</text>
+					<text>{{ item.warning }}</text>
+				</view>
+
+				<view class="card-rejection" v-if="item.rejectionReason">
+					<image class="w28 h28 mr8" src="@/static/image/icon_wrong.png" mode=""></image>
+					<text>驳回原因: {{ item.rejectionReason }}</text>
+				</view>
+				<view class="card-tags">
+					<view class="tag-item points-tag" @click.stop="showCorrelation=true">
+						默认产品组:五级
+					</view>
+				</view>
+				<view class="apply-button">定级申请</view>
+			</view>
+		</scroll-view>
+
+		<!-- 身份筛选 -->
+		<view class="filter-popup" v-if="showFilter" @click="closeFilter">
+			<view class="filter-content" @click.stop>
+				<view class="filter-header">
+					<view class="filter-title">筛选</view>
+					<image class="filter-close-btn" src="@/static/image/icon_close.png" @click="closeFilter" mode="">
+					</image>
+				</view>
+
+				<!-- 身份筛选 -->
+				<view class="filter-group">
+					<view class="group-label">账号身份</view>
+					<view class="tabs-container">
+						<view v-for="(tab, index) in statusTabs" :key="index"
+							:class="['tab-item', activeTab === tab.value ? 'active' : '']"
+							@click="switchFilterTab(tab.value)">
+							<text class="tab-text">{{ tab.label }}</text>
+							<text v-if="tab.count" class="tab-count">{{ tab.count }}</text>
+						</view>
+					</view>
+				</view>
+
+				<!-- 操作按钮 -->
+				<view class="filter-actions">
+					<view class="reset-btn" @click="resetFilters">重置</view>
+					<view class="confirm-btn" @click="confirmFilters">确定</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 关联产品 -->
+		<view class="filter-popup" v-if="showCorrelation" @click="showCorrelation = false">
+			<view class="filter-content correlation-content" @click.stop>
+				<view class="filter-header">
+					<view class="filter-title">关联产品</view>
+					<image class="filter-close-btn" src="@/static/image/icon_close.png" @click="showCorrelation = false"
+						mode="">
+					</image>
+				</view>
+
+				<!-- 注意:这里移出了 filter-header -->
+				<view class="popup-content">
+					<view class="head-item item">
+						<view class="left">小蜜蜂</view>
+						<view class="right">关联产品</view>
+					</view>
+					<view class="item" v-for="(row, index) in productData" :key="index">
+						<view class="left">{{ row.assistant }}</view>
+						<view class="right">
+							<text v-for="(product, idx) in row.products" :key="idx" class="product-tag">
+								{{ product }}<span v-if="idx < row.products.length - 1">、</span>
+							</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<Server />
+	</view>
+</template>
+
+<script>
+	import Server from '@/components/Server.vue'
+	import {
+		getAirClassroomList
+	} from '@/api-js/airClassroom'
+	export default {
+		components: {
+			Server
+		},
+		data() {
+			return {
+				productData: [{
+						assistant: '王小明',
+						products: ['302', '403', '202', '301']
+					},
+					{
+						assistant: '李洋',
+						products: ['301']
+					}
+				],
+				showCorrelation: false, //显示关联产品弹窗
+				activeTab: '',
+				// 状态标签
+				statusTabs: [{
+						label: '医生/药剂师',
+						value: 0
+					},
+					{
+						label: '护士',
+						value: 1
+					},
+					{
+						label: '店员',
+						value: 2
+					},
+					{
+						label: '经济学家',
+						value: 3
+					},
+					{
+						label: '其他',
+						value: 4
+					}
+				],
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				currentTab: 0,
+				showFilter: false,
+				dateRange: {
+					startDate: '',
+					endDate: ''
+				},
+				tempDateRange: {
+					startDate: '',
+					endDate: ''
+				},
+				tabs: [{
+						label: '全部',
+						value: 'all'
+					},
+					{
+						label: '待审核',
+						value: 'reviewing'
+					},
+					{
+						label: '已通过',
+						value: 'approved'
+					},
+					{
+						label: '已驳回',
+						value: 'rejected'
+					}
+				],
+				taskList: []
+			}
+		},
+		watch: {
+			showFilter(newVal) {
+				if (newVal) {
+					// 打开弹窗时,同步临时日期范围为当前日期范围
+					this.tempDateRange = {
+						startDate: this.dateRange.startDate,
+						endDate: this.dateRange.endDate
+					}
+				}
+			}
+		},
+		onLoad() {
+			this.loadData()
+		},
+		onReachBottom() {
+			this.loadMore()
+		},
+		methods: {
+			goBack() {
+				uni.navigateBack()
+			},
+			switchTab(value) {
+				this.currentTab = value
+				this.loadData()
+			},
+			// 弹窗筛选栏切换
+			switchFilterTab(value) {
+				this.activeTab = value
+			},
+			closeFilter() {
+				// 关闭弹窗时,恢复临时日期范围为当前日期范围
+				this.tempDateRange = {
+					startDate: this.dateRange.startDate,
+					endDate: this.dateRange.endDate
+				}
+				this.showFilter = false
+			},
+			onStartDateChange(e) {
+				this.tempDateRange.startDate = e.detail.value
+			},
+			onEndDateChange(e) {
+				this.tempDateRange.endDate = e.detail.value
+			},
+			resetFilters() {
+				this.activeTab = '';
+			},
+			confirmFilters() {
+				// 验证日期范围
+				if (this.tempDateRange.startDate && this.tempDateRange.endDate) {
+					if (new Date(this.tempDateRange.startDate) > new Date(this.tempDateRange.endDate)) {
+						uni.showToast({
+							icon: 'none',
+							title: '开始时间不能大于结束时间'
+						})
+						return
+					}
+				}
+				this.dateRange = {
+					startDate: this.tempDateRange.startDate,
+					endDate: this.tempDateRange.endDate
+				}
+				this.showFilter = false
+				this.loadData()
+			},
+			goComplete(item) {
+				uni.navigateTo({
+					url: `/pages_task/completeTask?id=${item.id}`
+				})
+			},
+			goEdit(item) {
+				uni.navigateTo({
+					url: `/pages_task/completeTask?id=${item.id}&edit=true`
+				})
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: `/pages_task/taskDetail?id=${item.id}`
+				})
+			},
+			async loadData() {
+				try {
+					uni.showLoading({
+						title: '加载中...'
+					})
+					const res = await getAirClassroomList({
+						status: this.currentTab,
+						startDate: this.dateRange.startDate,
+						endDate: this.dateRange.endDate,
+						page: 1,
+						pageSize: 20
+					})
+					uni.hideLoading()
+					if (res.code === 200 && res.data) {
+						this.taskList = res.data.list || this.getDefaultData()
+					} else {
+						this.taskList = this.getDefaultData()
+					}
+				} catch (e) {
+					uni.hideLoading()
+					console.error('加载数据失败', e)
+					this.taskList = this.getDefaultData()
+				}
+			},
+			async loadMore() {
+				// 加载更多数据
+			},
+			getDefaultData() {
+				return [{
+						id: 1,
+						title: '王小明',
+						titleLittle: '主治医师',
+						videoType: '长视频',
+						category: '学术',
+						points: '10',
+						count: '1',
+						startTime: '2025-9-20 13:55',
+						endTime: '2025-9-20 13:55',
+						createTime: '2025-9-20 13:55',
+						status: 'approved',
+						statusText: '已通过'
+					},
+					{
+						id: 2,
+						title: '王小明',
+						titleLittle: '主治医师',
+						videoType: '长视频',
+						category: '学术',
+						points: '10',
+						count: '1',
+						startTime: '2025-9-20 13:55',
+						endTime: '2025-9-20 13:55',
+						createTime: '2025-9-20 13:55',
+						status: 'approved',
+						statusText: '已通过',
+						warning: '有效观看不足5人'
+					},
+					{
+						id: 3,
+						title: '王小明',
+						titleLittle: '主治医师',
+						videoType: '短视频',
+						category: '学术',
+						points: '10',
+						count: '1',
+						startTime: '2025-9-20 13:55',
+						endTime: '2025-9-20 13:55',
+						createTime: '2025-9-20 13:55',
+						status: 'approved',
+						statusText: '待审核'
+					},
+					{
+						id: 4,
+						title: '王小明',
+						titleLittle: '主治医师',
+						videoType: '文章',
+						category: '学术',
+						points: '10',
+						count: '1',
+						startTime: '2025-9-20 13:55',
+						endTime: '2025-9-20 13:55',
+						createTime: '2025-9-20 13:55',
+						status: 'rejected',
+						statusText: '已驳回',
+						rejectionReason: '医师资质不够'
+					},
+					{
+						id: 5,
+						title: '王小明',
+						titleLittle: '主治医师',
+						videoType: '长视频',
+						category: '学术',
+						points: '10',
+						count: '1',
+						startTime: '2025-9-20 13:55',
+						endTime: '2025-9-20 13:55',
+						createTime: '2025-9-20 13:55',
+						status: 'approved',
+						statusText: '已通过'
+					}
+				]
+			}
+		}
+	}
+</script>
+<style lang="stylus">
+	.placeholder {
+		color: #C8C9CC !important;
+		font-size: 28rpx;
+		color: #C8C9CC;
+	}
+</style>
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #f5f5f5;
+		display: flex;
+		flex-direction: column;
+
+		.top-box {
+			padding: 16rpx 32rpx;
+			display: flex;
+			align-items: center;
+			background: #ffffff;
+
+			.input-item {
+				display: flex;
+				align-items: center;
+				flex: 1;
+				height: 72rpx;
+				background: #F7F8FA;
+				border-radius: 38rpx 38rpx 38rpx 38rpx;
+
+				.icon {
+					width: 26rpx;
+					height: 26rpx;
+					margin: 0 10rpx 0 28rpx;
+				}
+			}
+
+			.filter-item {
+				margin-left: 24rpx;
+				display: flex;
+				align-items: center;
+				font-size: 28rpx;
+				color: #999999;
+			}
+		}
+	}
+
+	.status-bar {
+		width: 100%;
+		background: #fff;
+	}
+
+	.header {
+		position: relative;
+		height: 88rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: #fff;
+		border-bottom: 1rpx solid #f0f0f0;
+
+		.back-btn {
+			position: absolute;
+			left: 24rpx;
+			width: 40rpx;
+			height: 40rpx;
+
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.title {
+			font-size: 36rpx;
+			font-weight: bold;
+			color: #333;
+		}
+
+		.header-right {
+			position: absolute;
+			right: 24rpx;
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+
+			.more-icon {
+				font-size: 32rpx;
+				color: #333;
+			}
+		}
+	}
+
+	.filter-bar {
+		display: flex;
+		align-items: center;
+		background: #fff;
+		padding: 0 40rpx;
+
+		.filter-tabs {
+			flex: 1;
+			display: flex;
+			align-items: center;
+			gap: 64rpx;
+			overflow-x: auto;
+
+			.tab-item {
+				padding: 24rpx 0;
+				font-size: 28rpx;
+				color: #999999;
+				white-space: nowrap;
+				position: relative;
+
+				&.active {
+					color: #333333;
+					font-weight: 500;
+
+					&::after {
+						content: '';
+						position: absolute;
+						bottom: 0;
+						left: 0;
+						right: 0;
+						height: 6rpx;
+						background: #388BFF;
+						border-radius: 3rpx 3rpx 3rpx 3rpx;
+					}
+				}
+			}
+		}
+
+		.filter-divider {
+			width: 1rpx;
+			height: 40rpx;
+			background: #e0e0e0;
+			margin: 0 16rpx;
+		}
+
+		.filter-btn {
+			display: flex;
+			align-items: center;
+			padding: 24rpx 0;
+			font-size: 28rpx;
+			color: #666666;
+
+			.filter-icon {
+				font-size: 32rpx;
+				color: #333;
+			}
+		}
+	}
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+	}
+
+	.task-card {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		margin-bottom: 24rpx;
+
+		.card-header {
+			display: flex;
+			align-items: flex-start;
+			justify-content: space-between;
+			margin-bottom: 16rpx;
+
+			.card-title {
+				flex: 1;
+				font-size: 32rpx;
+				font-weight: 600;
+				color: #333;
+				display: flex;
+				align-items: center;
+
+				.title-little {
+					font-size: 24rpx;
+					color: #666666;
+					margin-left: 36rpx;
+				}
+
+				.lable {
+					margin-left: 16rpx;
+					padding: 2rpx 12rpx;
+					font-weight: 500;
+					font-size: 22rpx;
+					color: #C89743;
+					background: #FFF6E5;
+					border-radius: 8rpx 8rpx 8rpx 8rpx;
+				}
+			}
+
+			.status-tag {
+				padding: 8rpx 16rpx;
+				border-radius: 20rpx;
+				font-size: 24rpx;
+
+				// &.pending {
+				// 	background: #E3F2FD;
+				// 	color: #2196F3;
+				// }
+
+				&.reviewing {
+					background: #FFFBEA;
+					color: #FAAB0C;
+				}
+
+				&.approved {
+					background: #E6FAEF;
+					color: #07C160;
+				}
+
+				&.rejected {
+					background: #FFF4F5;
+					color: #CF3546;
+				}
+			}
+		}
+
+		.card-tags {
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+			gap: 12rpx;
+			margin-top: 20rpx;
+
+			.tag-item {
+				padding: 8rpx 16rpx;
+				background: #FFFAF4;
+				border-radius: 8rpx;
+				font-size: 24rpx;
+				color: #5D410F;
+				display: flex;
+				align-items: center;
+
+				&.points-tag {
+					color: #388BFF;
+					background: transparent;
+					border-radius: 8rpx 8rpx 8rpx 8rpx;
+					border: 2rpx solid rgba(56, 139, 255, 0.4);
+				}
+			}
+		}
+
+		.row {
+			display: flex;
+			align-items: center;
+			margin-bottom: 20rpx;
+			font-size: 28rpx;
+			color: #666666;
+
+			.icon {
+				width: 32rpx;
+				height: 32rpx;
+				margin-right: 16rpx;
+			}
+
+			.line {
+				width: 2rpx;
+				height: 28rpx;
+				background: #EAEBEE;
+				border-radius: 0rpx 0rpx 0rpx 0rpx;
+				margin: 0 24rpx;
+			}
+
+			.txt {
+				flex: 1;
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+		}
+
+		.apply-button {
+			padding: 12rpx 40rpx;
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #FFFFFF;
+			background: #388BFF;
+			border-radius: 34rpx 34rpx 34rpx 34rpx;
+			width: fit-content;
+			margin-left: auto;
+		}
+
+		.card-warning {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			padding: 12rpx;
+			background: #FFF3E0;
+			border-radius: 8rpx;
+			margin-bottom: 16rpx;
+			font-size: 26rpx;
+			color: #FF9800;
+
+			.warning-icon {
+				font-size: 28rpx;
+			}
+		}
+
+		.card-rejection {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			padding: 10rpx 20rpx;
+			background: #FFF4F5;
+			border-radius: 8rpx;
+			margin-bottom: 16rpx;
+			font-size: 26rpx;
+			color: #F44336;
+
+			.rejection-icon {
+				font-size: 28rpx;
+			}
+		}
+	}
+
+	.filter-popup {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.5);
+		z-index: 999;
+		display: flex;
+		align-items: flex-end;
+	}
+
+	.filter-content {
+		width: 100%;
+		background: #fff;
+		border-radius: 24rpx 24rpx 0 0;
+		padding: 32rpx;
+		display: flex;
+		flex-direction: column;
+		max-height: 80vh;
+
+		.popup-content {
+			.item {
+				height: 88rpx;
+				display: flex;
+				align-items: center;
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #333333;
+				padding-left: 32rpx;
+			}
+
+			.head-item {
+				font-weight: 600;
+				color: #666666;
+			}
+
+			.left {
+				width: 20%;
+			}
+
+			.right {
+				flex: 1;
+			}
+
+
+		}
+
+		/* 限制最大高度 */
+		.filter-header {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			margin-bottom: 32rpx;
+			position: relative;
+			flex-shrink: 0;
+
+			/* 防止标题区域被压缩 */
+			.filter-title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #333;
+				text-align: center;
+			}
+
+			.filter-close-btn {
+				position: absolute;
+				right: 0;
+				width: 44rpx;
+				height: 44rpx;
+			}
+		}
+
+		.filter-group {
+			margin-bottom: 32rpx;
+
+			.group-label {
+				font-size: 28rpx;
+				font-weight: bold;
+				color: #333;
+				margin-bottom: 20rpx;
+			}
+
+			.tabs-container {
+				display: inline-flex;
+				align-items: center;
+				gap: 32rpx;
+				flex-wrap: wrap;
+
+				.tab-item {
+					display: flex;
+					align-items: center;
+					gap: 8rpx;
+					padding: 12rpx 0;
+					position: relative;
+
+					.tab-text {
+						font-size: 28rpx;
+						color: #666666;
+					}
+
+					.tab-count {
+						font-size: 24rpx;
+						color: #999999;
+						background: #f5f6fa;
+						padding: 2rpx 8rpx;
+						border-radius: 12rpx;
+						min-width: 32rpx;
+						text-align: center;
+						border: 2rpx solid transparent;
+					}
+
+					&.active {
+						color: #333333;
+						background: rgba(56, 139, 255, 0.15);
+						border-radius: 70rpx 70rpx 70rpx 70rpx;
+						border: 2rpx solid #388BFF;
+						padding: 14rpx 32rpx;
+
+					}
+				}
+			}
+		}
+
+		.filter-actions {
+			display: flex;
+			gap: 24rpx;
+			margin-top: 40rpx;
+			padding-top: 24rpx;
+			flex-shrink: 0;
+
+			.reset-btn,
+			.confirm-btn {
+				flex: 1;
+				height: 80rpx;
+				line-height: 80rpx;
+				text-align: center;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+				font-size: 28rpx;
+			}
+
+			.reset-btn {
+				background: #fff;
+				color: #388BFF;
+				border: 2rpx solid #388BFF;
+			}
+
+			.confirm-btn {
+				background: #388BFF;
+				color: #fff;
+			}
+		}
+	}
+</style>

+ 199 - 0
pages_speaker/speakerInvitation.vue

@@ -0,0 +1,199 @@
+<template>
+	<view class="container">
+		<image class="bg" src="@/static/image/bg_invite.png" mode="aspectFill"></image>
+		<!-- 状态栏占位(微信小程序原生适配) -->
+		<view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
+		<view class="return">
+
+			<image class="return-img" src="@/static/image/back_white.png" mode="aspectFill"></image>
+		</view>
+		<!-- 核心内容区:居中布局 -->
+		<view class="main-content">
+			<!-- 页面大标题:讲者邀请 -->
+			<view class="page-title">
+				<image class="title-img" src="@/static/image/img_title.png" mode="aspectFill"></image>
+				<text class="title-txt">讲者邀请</text>
+				<image class="title-img rotate180" src="@/static/image/img_title.png" mode="aspectFill"></image>
+			</view>
+			<!-- 邀请卡片:白色背景+圆角+轻微阴影(1:1匹配UI) -->
+			<view class="invite-card">
+
+				<!-- 邀请人信息区 -->
+				<view class="inviter-section">
+					<image class="inviter-avatar" src="@/static/image/my_heads_icon.png" mode="aspectFill"></image>
+					<text class="inviter-name">王小明</text>
+					<text class="invite-desc">邀请你成为讲者</text>
+				</view>
+
+				<!-- 二维码区域:白色边框+圆角 -->
+				<view class="qrcode-box">
+					<image class="qrcode-img" src="@/static/image/bg_invite.png"></image>
+				</view>
+				<!-- 扫码提示文字 -->
+				<view class="scan-tip">扫一扫,注册学苑</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 仅获取微信小程序状态栏高度,无多余逻辑
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight
+			};
+		},
+		onLoad() {},
+		methods: {}
+	};
+</script>
+
+<style lang="scss" scoped>
+	/* 小程序页面全局重置:消除默认样式 */
+	page {
+		margin: 0;
+		padding: 0;
+		background-color: #F8F7F5;
+		font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
+	}
+
+	/* 根容器:全屏+垂直布局 */
+	.container {
+		min-height: 100vh;
+		display: flex;
+		flex-direction: column;
+		background-color: #F8F7F5;
+		position: relative;
+
+		.bg {
+			position: absolute;
+			top: 0;
+			width: 100%;
+			height: 100%;
+		}
+	}
+
+	/* 状态栏占位:透明背景,仅占高度 */
+	.status-bar {
+		width: 100%;
+		background-color: transparent;
+	}
+
+	.return {
+		position: relative;
+		height: 88rpx;
+		z-index: 2;
+		line-height: 88rpx;
+		.return-img {
+			width: 40rpx;
+			height: 40rpx;
+			margin-left: 32rpx;
+		}
+	}
+
+	/* 核心内容区:水平居中+顶部间距 */
+	.main-content {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding: 52rpx 74rpx 0;
+		box-sizing: border-box;
+		position: relative;
+		z-index: 2;
+
+		/* 页面大标题:讲者邀请(匹配UI字体/大小/颜色) */
+		.page-title {
+			font-weight: 600;
+			font-size: 48rpx;
+			color: #FFFFFF;
+			margin-bottom: 124rpx;
+			display: flex;
+			align-items: center;
+
+			.title-img {
+				width: 134rpx;
+				height: 12rpx;
+			}
+
+			.title-txt {
+				margin: 0 20rpx;
+
+			}
+
+			.rotate180 {
+				transform: rotate(180deg);
+			}
+
+		}
+
+		/* 邀请卡片:白色背景+圆角+轻微阴影(1:1匹配) */
+		.invite-card {
+			width: 100%;
+			background-color: #FFFFFF;
+			border-radius: 32rpx;
+			box-shadow: 0rpx 16rpx 28rpx 0rpx rgba(45, 109, 199, 0.37);
+			padding: 60rpx 40rpx 80rpx;
+			position: relative;
+			box-sizing: border-box;
+
+			/* 邀请人信息区:头像+文字横向布局 */
+			.inviter-section {
+				position: absolute;
+				top: -72rpx;
+				left: 50%;
+				transform: translateX(-50%);
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+
+				.inviter-avatar {
+					width: 144rpx;
+					height: 144rpx;
+					border-radius: 50%;
+					margin-bottom: 18rpx;
+				}
+
+				/* 邀请人姓名 */
+				.inviter-name {
+					color: #000000;
+					font-weight: 600;
+					font-size: 36rpx;
+					margin-bottom: 36rpx;
+				}
+
+				/* 邀请文案 */
+				.invite-desc {
+					font-size: 32rpx;
+					color: #666666;
+				}
+
+			}
+
+			.qrcode-box {
+				width: 372rpx;
+				height: 372rpx;
+				background-color: #FFFFFF;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin: 200rpx auto 40rpx;
+
+				.qrcode-img {
+					width: 372rpx;
+					height: 372rpx;
+
+				}
+			}
+
+			/* 扫码提示文字:居中+浅灰色 */
+			.scan-tip {
+				text-align: center;
+				font-size: 32rpx;
+				color: #333333;
+			}
+		}
+	}
+</style>

+ 748 - 0
pages_task/approvalCenter.vue

@@ -0,0 +1,748 @@
+<template>
+	<view class="container">
+		<!-- 搜索+筛选栏 -->
+		<view class="top-box">
+			<view class="input-item">
+				<image class="icon search-icon" src="@/static/image/search.png" mode="widthFix"></image>
+				<input placeholder="请输入发起人姓名、手机号" placeholder-class="placeholder" />
+			</view>
+		</view>
+
+		<!-- 顶部选项卡 -->
+		<view class="top-tabs">
+			<view class="top-tab-item" :class="{ active: currentTopTab === index }" @click="switchTopTab(index)"
+				v-for="(item, index) in topTabs" :key="index">
+				{{ item.label }}·{{ item.badge }}
+			</view>
+		</view>
+
+		<!-- 核心修改:新增子标签容器,作为popup-box的定位参考 -->
+		<view class="sub-tabs-wrapper">
+			<!-- 动态子标签 -->
+			<view class="sub-tabs">
+				<view class="sub-tab-item" :class="{ active: currentSubTab === item.value }" @click="popShow = !popShow"
+					v-for="(item, index) in currentSubTabsList" :key="index">
+					<text>{{ item.label }}</text>
+					<image class="icon" src="/static/image/icon_expand.png" mode="widthFix"></image>
+				</view>
+			</view>
+			<!-- 动态子标签弹窗:相对于sub-tabs-wrapper定位 -->
+			<view class="popup-box" v-if="popShow">
+				<view class="item" v-for="(item, index) in tabsList" :key="index">
+					{{item}}
+				</view>
+			</view>
+		</view>
+		<!-- popup遮罩层 - 仅在popShow为true时显示 -->
+		<view class="popup-mask" v-if="popShow"></view>
+		<!-- 列表内容 -->
+		<scroll-view class="content" scroll-y>
+			<view class="task-card" v-for="(item, index) in currentList" :key="index" @click="goDetails(item)">
+				<!-- 任务/审核标题+状态 -->
+				<view class="card-top">
+					<text class="card-task-title">{{ item.taskTitle }}</text>
+					<view class="status-tag" :class="item.statusClass">{{ item.statusText }}</view>
+				</view>
+
+				<view class="card-content">
+					<!-- 时间信息 -->
+					<view class="time-info">
+						<view class="time-item">
+							<text class="title">任务名称:</text>
+							<text>王小明医师问卷调查任务</text>
+						</view>
+						<!-- 改为判断index:0对应待办 -->
+						<view class="time-item" v-if="currentTopTab === 0">
+							<text class="title">任务类型:</text>
+							<text>问卷调查</text>
+						</view>
+					</view>
+
+					<!-- 操作按钮:改为判断index:0对应待办 -->
+					<view class="operate-btn-group" v-if="currentTopTab === 0">
+						<view class="share-btn" @click="handleShare(item)">
+							<image class="share-icon" src="/static/image/icon_user.png" mode="widthFix"></image>
+							<text>王彬彬</text>
+						</view>
+						<view class="date">
+							2025-12-24 20:57
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+
+		<!-- 筛选弹窗 -->
+		<view class="filter-popup" v-if="showFilter" @click="closeFilter">
+			<view class="filter-content" @click.stop>
+				<view class="filter-header">
+					<view class="filter-title">筛选</view>
+					<image class="filter-close-btn" src="@/static/image/icon_close.png" @click="closeFilter"
+						mode="widthFix"></image>
+				</view>
+
+				<view class="filter-form">
+					<!-- 任务申请时间 -->
+					<view class="filter-section">
+						<view class="section-label">任务申请时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.applyTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.applyTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 任务完成时间:改为判断index:1对应已办 -->
+					<view class="filter-section" v-if="currentTopTab === 1">
+						<view class="section-label">任务完成时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.finishTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.finishTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 完成审核时间:改为判断index:1对应已办 -->
+					<view class="filter-section" v-if="currentTopTab === 1">
+						<view class="section-label">完成审核时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.auditTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.auditTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 任务归属 -->
+					<view class="filter-section">
+						<view class="section-label">任务归属</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.taskBelong === 'my' }"
+								@click="filters.taskBelong = 'my'">我的任务</view>
+							<view class="filter-btn" :class="{ active: filters.taskBelong === 'dept' }"
+								@click="filters.taskBelong = 'dept'">部门任务</view>
+						</view>
+					</view>
+
+					<!-- 完结状态:改为判断index:1对应已办 -->
+					<view class="filter-section" v-if="currentTopTab === 1">
+						<view class="section-label">完结状态</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.finishStatus === 'unfinished' }"
+								@click="filters.finishStatus = 'unfinished'">未完结</view>
+							<view class="filter-btn" :class="{ active: filters.finishStatus === 'finished' }"
+								@click="filters.finishStatus = 'finished'">已完结</view>
+						</view>
+					</view>
+
+					<!-- 归属类型 -->
+					<view class="filter-section">
+						<view class="section-label">归属类型</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.belongType === 'inner' }"
+								@click="filters.belongType = 'inner'">院内</view>
+							<view class="filter-btn" :class="{ active: filters.belongType === 'outer' }"
+								@click="filters.belongType = 'outer'">院外</view>
+						</view>
+					</view>
+				</view>
+
+				<view class="filter-actions">
+					<view class="reset-btn" @click="resetFilters">重置</view>
+					<view class="confirm-btn" @click="confirmFilters">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				popShow: false,
+				showFilter: false,
+				filters: {
+					applyTimeStart: '',
+					applyTimeEnd: '',
+					finishTimeStart: '',
+					finishTimeEnd: '',
+					auditTimeStart: '',
+					auditTimeEnd: '',
+					taskBelong: 'my',
+					finishStatus: '',
+					belongType: ''
+				},
+				// 顶部选项卡数组
+				topTabs: [{
+						label: '待办',
+						value: 'todo',
+						badge: 1
+					},
+					{
+						label: '已办',
+						value: 'done',
+						badge: 22
+					},
+					{
+						label: '我发起的',
+						value: 'myInitiate',
+						badge: 19
+					}
+				],
+				currentTopTab: 0,
+				currentSubTab: 'all',
+				// 子标签数组
+				taskSubTabs: [{
+						label: '全部审批',
+						value: 'all'
+					},
+					{
+						label: '最新发起',
+						value: 'unfinished'
+					}
+				],
+				tabsList: ['全部审批', '任务创建'],
+				tabsList2: ['最新发起', '最早发起'],
+				auditSubTabs: [{
+						label: '全部',
+						value: 'all'
+					},
+					{
+						label: '驳回',
+						value: 'rejected'
+					}
+				],
+				// 列表数据
+				todoList: [{ // 待办列表(index=0)
+					taskTitle: '任务创建',
+					statusText: '待审核',
+					statusClass: 'status-createPending',
+					speaker: '王小明',
+					level: '一级',
+					hospital: '湖南省人民医院',
+					department: '口腔科',
+					videoType: '长视频',
+					category: '学术',
+					points: 10,
+					count: 1,
+					applyTime: '2025-9-20 13:55',
+					finishTime: '-',
+					auditStatus: '-',
+					showDelete: true,
+					sealImg: '/static/image/img_unfinish.png'
+				}],
+				doneList: [{ // 已办列表(index=1)
+					taskTitle: '任务创建',
+					statusText: '创建驳回',
+					statusClass: 'status-createPending',
+					speaker: '王小明',
+					level: '一级',
+					hospital: '湖南省人民医院',
+					department: '口腔科',
+					videoType: '长视频',
+					category: '学术',
+					points: 10,
+					count: 1,
+					applyTime: '2025-9-20 13:55',
+					showDelete: true,
+					showEdit: true
+				}],
+				myInitiateList: [] // 我发起的列表(index=2)
+			}
+		},
+		computed: {
+			currentSubTabsList() {
+				if (this.currentTopTab === 0) return this.taskSubTabs;
+				if (this.currentTopTab === 1) return this.auditSubTabs;
+				if (this.currentTopTab === 2) return this.taskSubTabs;
+			},
+			currentList() {
+				if (this.currentTopTab === 0) return this.todoList;
+				if (this.currentTopTab === 1) return this.doneList;
+				if (this.currentTopTab === 2) return this.myInitiateList;
+			}
+		},
+		methods: {
+			goDetails(item) {
+				console.log("跳转")
+				uni.navigateTo({
+					url: '/pages_task/approvalTaskDetail'
+				})
+			},
+			switchTopTab(index) {
+				this.currentTopTab = index;
+				this.currentSubTab = 'all';
+				// 切换顶部选项卡时关闭popup
+				this.popShow = false;
+			},
+			closeFilter() {
+				this.showFilter = false
+			},
+			resetFilters() {
+				this.filters = {
+					applyTimeStart: '',
+					applyTimeEnd: '',
+					finishTimeStart: '',
+					finishTimeEnd: '',
+					auditTimeStart: '',
+					auditTimeEnd: '',
+					taskBelong: 'my',
+					finishStatus: '',
+					belongType: ''
+				}
+			},
+			confirmFilters() {
+				this.showFilter = false
+				console.log('筛选条件:', this.filters)
+			},
+			handleShare(item) {
+				uni.showToast({
+					title: '分享功能待实现',
+					icon: 'none'
+				})
+			},
+			handleTaskDelete(item, index) {
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除这条任务吗?',
+					cancelText: '取消',
+					confirmText: '删除',
+					confirmColor: '#FF0000',
+					success: (res) => {
+						if (res.confirm) {
+							this.todoList.splice(index, 1);
+							uni.showToast({
+								title: '任务已删除',
+								icon: 'success',
+								duration: 1500
+							});
+						}
+					}
+				});
+			},
+			handleCopy(item) {
+				uni.showToast({
+					title: '复制创建功能待实现',
+					icon: 'none'
+				})
+			},
+			handleAuditDelete(item, index) {
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除这条审核项吗?',
+					cancelText: '取消',
+					confirmText: '删除',
+					confirmColor: '#FF0000',
+					success: (res) => {
+						if (res.confirm) {
+							this.doneList.splice(index, 1);
+							uni.showToast({
+								title: '审核项已删除',
+								icon: 'success',
+								duration: 1500
+							});
+						}
+					}
+				});
+			},
+			handleEdit(item) {
+				uni.showToast({
+					title: '编辑功能待实现',
+					icon: 'none'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		position: relative;
+
+		// 搜索栏
+		.top-box {
+			padding: 20rpx 32rpx;
+			display: flex;
+			align-items: center;
+			background: #fff;
+			position: relative;
+			z-index: 101;
+
+			.input-item {
+				display: flex;
+				align-items: center;
+				flex: 1;
+				height: 72rpx;
+				background: #F7F8FA;
+				border-radius: 38rpx;
+
+				.search-icon {
+					width: 26rpx;
+					height: 26rpx;
+					margin: 0 10rpx 0 28rpx;
+				}
+
+				input {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333;
+				}
+			}
+		}
+
+		// 顶部选项卡
+		.top-tabs {
+			display: flex;
+			background: #fff;
+			position: relative;
+			z-index: 101;
+
+			.top-tab-item {
+				flex: 1;
+				text-align: center;
+				padding: 24rpx 0;
+				font-size: 28rpx;
+				color: #999;
+				transition: all 0.2s;
+
+				&.active {
+					color: #333;
+					font-weight: 500;
+					position: relative;
+
+					&::after {
+						content: '';
+						position: absolute;
+						bottom: 0;
+						left: 50%;
+						transform: translateX(-50%);
+						border-radius: 3rpx;
+						width: 80rpx;
+						height: 6rpx;
+						background: #388BFF;
+					}
+				}
+			}
+		}
+
+		// popup遮罩层
+		.popup-mask {
+			position: fixed; // 全屏遮罩
+			top: 0;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			background: rgba(0, 0, 0, 0.3);
+			z-index: 99; // 低于子标签容器,高于列表
+		}
+
+		// 核心修改:子标签容器(定位参考)
+		.sub-tabs-wrapper {
+			position: relative; // 作为popup-box的定位参考
+			z-index: 101; // 确保在遮罩层之上
+
+			// 子标签栏
+			.sub-tabs {
+				display: flex;
+				justify-content: space-between;
+				background: #fff;
+				padding: 16rpx 32rpx;
+				gap: 24rpx;
+
+				.sub-tab-item {
+					flex: 1;
+					height: 64rpx;
+					display: flex;
+					border-radius: 70rpx;
+					border: 2rpx solid #F2F2F2;
+					justify-content: center;
+					align-items: center;
+					font-size: 28rpx;
+					color: #666;
+					transition: all 0.2s;
+
+					.icon {
+						width: 28rpx;
+						height: 28rpx;
+						margin-left: 12rpx;
+					}
+				}
+			}
+
+
+
+			// 核心修改:popup-box绝对定位,相对于sub-tabs-wrapper
+			.popup-box {
+				position: absolute;
+				top: 100%; // 紧贴sub-tabs底部
+				left: 0;
+				right: 0;
+				display: flex;
+				padding: 32rpx;
+				background: #FFFFFF;
+				border-radius: 0 0 40rpx 40rpx;
+				z-index: 100; // 高于遮罩层
+				box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08); // 增加阴影提升层级感
+
+				.item {
+					padding: 14rpx 32rpx;
+					height: 72rpx;
+					box-sizing: border-box;
+					background: #F7F8FA;
+					border-radius: 70rpx;
+					font-size: 28rpx;
+					color: #333;
+					flex-wrap: wrap;
+					margin-right: 24rpx;
+
+					&:last-child {
+						margin-right: 0;
+					}
+				}
+			}
+		}
+
+		// 列表区域
+		.content {
+			padding: 24rpx;
+			box-sizing: border-box;
+			min-height: calc(100vh - 300rpx);
+			position: relative;
+			z-index: 98; // 低于遮罩层
+
+			.task-card {
+				background: #fff;
+				border-radius: 24rpx;
+				margin-bottom: 20rpx;
+				border: 2rpx solid #E9F2FF;
+				position: relative;
+				padding-bottom: 24rpx;
+
+				.card-top {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					background: linear-gradient(90deg, #E8F1FF 0%, #FFFFFF 100%);
+					border-radius: 24rpx 24rpx 0 0;
+					padding: 26rpx 24rpx;
+					margin-bottom: 16rpx;
+
+					.card-task-title {
+						font-size: 32rpx;
+						font-weight: 600;
+						color: #333;
+					}
+
+					.status-tag {
+						padding: 8rpx 16rpx;
+						border-radius: 20rpx;
+						font-size: 24rpx;
+
+						&.status-wait {
+							background: #E3F2FD;
+							color: #2196F3;
+						}
+
+						&.status-finish {
+							background: #E6FAEF;
+							color: #07C160;
+						}
+
+						&.status-rejected {
+							background: #FFF4F5;
+							color: #CF3546;
+						}
+
+						&.status-createPending {
+							background: #FFF8E6;
+							color: #FF9500;
+						}
+					}
+				}
+
+				.card-content {
+					padding: 0 24rpx;
+
+					.time-info {
+						font-size: 28rpx;
+						color: #666;
+						display: flex;
+						flex-direction: column;
+						gap: 8rpx;
+						margin-bottom: 24rpx;
+
+						.time-item {
+							display: flex;
+							font-size: 28rpx;
+							color: #333;
+
+							.title {
+								color: #666;
+							}
+						}
+					}
+
+					.operate-btn-group {
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						.share-btn {
+							display: flex;
+							align-items: center;
+							font-size: 28rpx;
+							color: #666;
+
+							.share-icon {
+								width: 36rpx;
+								height: 36rpx;
+								margin-right: 8rpx;
+							}
+						}
+
+						.date {
+							font-size: 24rpx;
+							color: #999;
+						}
+					}
+				}
+			}
+		}
+
+		// 筛选弹窗
+		.filter-popup {
+			position: fixed;
+			top: 0;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			background: rgba(0, 0, 0, 0.5);
+			z-index: 999;
+			display: flex;
+			align-items: flex-end;
+
+			.filter-content {
+				width: 100%;
+				background: #fff;
+				border-radius: 24rpx 24rpx 0 0;
+				padding: 32rpx;
+
+				.filter-header {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-bottom: 32rpx;
+					position: relative;
+
+					.filter-title {
+						font-size: 32rpx;
+						font-weight: bold;
+						color: #333;
+					}
+
+					.filter-close-btn {
+						position: absolute;
+						right: 0;
+						width: 44rpx;
+						height: 44rpx;
+					}
+				}
+
+				.filter-form {
+					padding: 0 0 24rpx 0;
+
+					.filter-section {
+						margin-bottom: 32rpx;
+
+						.section-label {
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #333;
+							margin-bottom: 24rpx;
+						}
+
+						.time-range {
+							display: flex;
+							align-items: center;
+							gap: 16rpx;
+
+							.time-input {
+								flex: 1;
+								height: 72rpx;
+								text-align: center;
+								background: #F7F8FA;
+								border-radius: 8rpx;
+								padding: 0 16rpx;
+								font-size: 26rpx;
+								color: #333;
+							}
+
+							.time-separator {
+								font-size: 24rpx;
+								color: #999;
+							}
+						}
+
+						.btn-group {
+							display: flex;
+							gap: 16rpx;
+
+							.filter-btn {
+								width: 214rpx;
+								height: 72rpx;
+								background: #F7F8FA;
+								border-radius: 70rpx;
+								line-height: 72rpx;
+								text-align: center;
+								font-size: 28rpx;
+								transition: all 0.2s;
+								color: #333;
+
+								&.active {
+									background: rgba(56, 139, 255, 0.15);
+									color: #388BFF;
+								}
+							}
+						}
+					}
+				}
+
+				.filter-actions {
+					display: flex;
+					gap: 24rpx;
+					margin-top: 40rpx;
+
+					.reset-btn,
+					.confirm-btn {
+						flex: 1;
+						height: 80rpx;
+						line-height: 80rpx;
+						text-align: center;
+						border-radius: 200rpx;
+						font-size: 28rpx;
+						transition: all 0.2s;
+					}
+
+					.reset-btn {
+						background: #fff;
+						color: #388BFF;
+						border: 2rpx solid #388BFF;
+
+						&:active {
+							background: #EBF3FF;
+						}
+					}
+
+					.confirm-btn {
+						background: #388BFF;
+						color: #fff;
+
+						&:active {
+							background: #2A78E5;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 785 - 0
pages_task/approvalTaskDetail.vue

@@ -0,0 +1,785 @@
+<template>
+	<view class="container">
+		<view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
+		<view class="top">
+			<image class="return" @click="goBack" src="/static/image/back_white.png"></image>
+			<text>任务详情</text>
+		</view>
+		<scroll-view class="content" scroll-y>
+			<!-- 任务卡片 -->
+			<view class="task-card">
+				<view class="card-header">
+					<view class="card-title">{{ taskData.title }}</view>
+					<view class="card-lable" :class="taskData.class">{{taskData.status}}</view>
+				</view>
+				<view class="card-meta">
+					<view class="meta-tag">{{ taskData.tag }}</view>
+					<view class="meta-id">ID:{{ taskData.id }}</view>
+				</view>
+			</view>
+
+			<!-- 任务信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">任务信息</text>
+				</view>
+				<view class="info-list">
+					<view class="info-item">
+						<text class="info-label">任务名称:</text>
+						<text class="info-value">{{ taskInfo.costSharing }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">任务类型:</text>
+						<text class="info-value">{{ taskInfo.belongProject }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属部门:</text>
+						<text class="info-value">{{ taskInfo.belongDept }}</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 内容信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">项目信息</text>
+				</view>
+				<view class="info-list">
+					<view class="info-item">
+						<text class="info-label">项目名称:</text>
+						<text class="info-value">{{ contentInfo.deliverableName }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">项目活动ID:</text>
+						<text class="info-value">{{ contentInfo.deliverableId }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">项目备注:</text>
+						<text class="info-value">{{ contentInfo.description }}</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 客户信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">客户信息</text>
+				</view>
+				<view class="client-list">
+					<view class="client-item" v-for="(item, index) in clientList" :key="index">
+						<view class="client-info">
+							<image class="avatar" src="/static/image/my_heads_icon.png"></image>
+							<view class="client-txt">
+								<view class="client-name">
+									{{ item.name }}
+									<text class="client-level">{{ item.level }}</text>
+								</view>
+								<view class="client-hospital">
+									<text>{{ item.hospital }} </text>
+									<view class="line"></view>
+									<text>{{ item.department }}</text>
+								</view>
+							</view>
+						</view>
+						<view class="client-stats">
+							<view class="stat-item"><text class="num">{{ item.taskCount }} </text>任务</view>
+							<view class="stat-item"><text class="num">{{ item.points }} </text>积分</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 审批信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">审批信息</text>
+				</view>
+				<view class="approval-list">
+					<view class="approval-item" v-for="(item, index) in approvalInfo" :key="index">
+						<view class="left">
+							<view class="avatar-box">
+								<image class="avatar" src="/static/image/my_heads_icon.png"></image>
+								<image class="icon" src="/static/image/icon_wait.png"></image>
+							</view>
+							<view class="approval-user">
+								<view class="user-name">{{ item.name }}</view>
+								<view class="user-status" :style="{ color: item.statusColor }">{{ item.status }}</view>
+							</view>
+						</view>
+						<text class="approval-time">{{ item.time }}</text>
+						<view class="approval-line" v-if="index < approvalInfo.length - 1"></view>
+					</view>
+				</view>
+				<view class="reason">
+					费用分摊部门填写错误,应该是学术研究事业部,请修改后重新提交。
+				</view>
+			</view>
+		</scroll-view>
+
+		<view class="bottom-bar">
+			<view class="action-buttons">
+				<view class="btn btn-cancel" @click="openRejectPopup">
+					<image class="icon" src="/static/image/icon_approval_no.png"></image>
+					<text>驳回</text>
+				</view>
+				<view class="btn btn-submit" @click="handleNext">
+					<image class="icon" src="/static/image/icon_approval_yes.png"></image>
+					<text>通过</text>
+				</view>
+			</view>
+		</view>
+
+		<!-- 驳回弹窗 -->
+		<u-popup :show="showRejectPopup" mode="bottom" border-radius="24" z-index="9999999">
+			<view class="reject-popup-content">
+				<view class="popup-header">
+					<text class="popup-title">驳回</text>
+					<u-icon name="close" size="20" @click="showRejectPopup = false" />
+				</view>
+
+				<view class="input-area">
+					<textarea v-model="rejectReason" placeholder="请输入驳回意见" class="reason-input" :auto-height="true"
+						maxlength="200" />
+				</view>
+				<view class="btn-group">
+					<u-button text="取消" plain color="#388BFF" class="cancel-btn" @click="showRejectPopup = false" />
+					<u-button text="确认驳回" type="primary" class="confirm-btn" @click="handleConfirmReject" />
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 修改5:弹窗默认隐藏
+				showRejectPopup: true,
+				// 驳回意见
+				rejectReason: '',
+
+				// 仅获取微信小程序状态栏高度,无多余逻辑
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				taskId: '',
+				// 任务基础信息
+				taskData: {
+					title: '王小明医师学术讲座',
+					tag: '学术讲座',
+					id: 'CRW0000001022345',
+					class: 'pending',
+					status: '待审核'
+				},
+				// 任务信息
+				taskInfo: {
+					costSharing: '湖北省药学服务公司',
+					belongProject: '项目名称',
+					belongDept: '中药事业部',
+					belongProduct: '201',
+					applySupplementLive: '否',
+					supplementRoomId: '-',
+					supplementReason: '-'
+				},
+				// 内容信息
+				contentInfo: {
+					deliverableName: '直播',
+					deliverableId: '-',
+					liveRoomUrl: 'http://www.zhibotest123333...',
+					pushUrl: 'http://www.zhibotest123123...',
+					startUrl: 'http://www.zhibotest123123...',
+					liveReplay: '-',
+					playVideo: '-',
+					downloadVideo: '-',
+					viewerCount: '203',
+					validView: '198',
+					description: '这是一段说明,这是一段说明,一行展示不完就换行展示。'
+				},
+				// 客户信息列表
+				clientList: [{
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科',
+						taskCount: '1',
+						points: '30'
+					},
+					{
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科',
+						taskCount: '1',
+						points: '30'
+					}
+				],
+				// 补充材料
+				supplementMaterial: {
+					deliverableName: '-',
+					description: '-',
+					attachment: {
+						name: '文件名称文件名称.pdf',
+						size: '128kb'
+					}
+				},
+				// 审批信息
+				approvalInfo: [{
+						name: '王彬彬',
+						status: '发起申请',
+						statusColor: '#4CAF50',
+						time: '2025-03-04 18:00'
+					},
+					{
+						name: '王小明',
+						status: '待审核',
+						statusColor: '#FF9800',
+						time: ''
+					}
+				]
+			}
+		},
+		onLoad(options) {
+			if (options.id) {
+				this.taskId = options.id
+				this.loadData()
+			}
+		},
+		methods: {
+			// 修改6:新增打开弹窗的方法
+			openRejectPopup() {
+				this.showRejectPopup = true;
+			},
+
+			// 确认驳回
+			handleConfirmReject() {
+				if (!this.rejectReason.trim()) {
+					uni.showToast({
+						title: '请输入驳回意见',
+						icon: 'none'
+					})
+					return
+				}
+				// 这里写你的驳回接口逻辑
+				console.log('提交驳回意见:', this.rejectReason)
+				// 关闭弹窗
+				this.showRejectPopup = false
+				// 重置输入
+				this.rejectReason = ''
+			},
+
+			goBack() {
+				uni.navigateBack()
+			},
+			async loadData() {
+				try {
+					uni.showLoading({
+						title: '加载中...'
+					})
+					// 实际项目中替换为接口请求:const res = await getTaskDetail({ id: this.taskId })
+					// 这里模拟接口赋值
+					uni.hideLoading()
+				} catch (e) {
+					uni.hideLoading()
+					console.error('加载数据失败', e)
+				}
+			},
+			// 复制到剪贴板
+			copyToClipboard(text) {
+				uni.setClipboardData({
+					data: text,
+					success() {
+						uni.showToast({
+							title: '复制成功',
+							icon: 'success'
+						})
+					}
+				})
+			},
+			// 下载附件
+			downloadAttachment() {
+				uni.showToast({
+					title: '开始下载附件',
+					icon: 'none'
+				})
+				// 实际项目中添加下载逻辑:uni.downloadFile + uni.saveFile
+			},
+			// 修改7:补全handlePrev(备用,实际用openRejectPopup)
+			handlePrev() {
+				this.openRejectPopup();
+			},
+			// 补全handleNext方法(避免点击报错)
+			handleNext() {
+				uni.showToast({
+					title: '审批通过逻辑待实现',
+					icon: 'none'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	// 弹窗样式
+	.reject-popup-content {
+		padding: 32rpx;
+		box-sizing: border-box;
+		background: #fff;
+		overflow: hidden;
+
+		.popup-header {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 32rpx;
+
+			.popup-title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #333;
+			}
+		}
+
+		.input-area {
+			margin-bottom: 40rpx;
+
+			.reason-input {
+				min-height: 120rpx;
+				padding: 20rpx;
+				background: #F7F8FA;
+				border-radius: 12rpx;
+				font-size: 28rpx;
+				color: #333;
+				width: 100%; // 新增:确保输入框宽度100%
+				box-sizing: border-box;
+			}
+		}
+
+		.btn-group {
+			display: flex;
+			gap: 24rpx;
+
+			.cancel-btn,
+			.confirm-btn {
+				flex: 1;
+				height: 80rpx;
+				border-radius: 200rpx;
+				font-size: 28rpx;
+			}
+		}
+	}
+
+	// 原有样式
+	.container {
+		min-height: 100vh;
+		background: #f5f5f5;
+		display: flex;
+		flex-direction: column;
+		height: auto;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 532rpx;
+			background: linear-gradient(180deg, rgba(56, 139, 255, 0.79) 0%, rgba(56, 139, 255, 0) 100%);
+		}
+	}
+
+	.top {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 88rpx;
+		position: relative;
+		font-weight: 600;
+		font-size: 36rpx;
+		color: #FFFFFF;
+
+		.return {
+			position: absolute;
+			left: 32rpx;
+			width: 40rpx;
+			height: 40rpx;
+		}
+	}
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+		padding-bottom: 200rpx;
+	}
+
+	/* 任务卡片样式 */
+	.task-card {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		margin-bottom: 24rpx;
+
+		.card-header {
+			display: flex;
+			justify-content: space-between;
+
+			.card-title {
+				font-weight: 500;
+				font-size: 36rpx;
+				color: #333333;
+				margin-bottom: 24rpx;
+			}
+
+			.card-lable {
+				height: 40rpx;
+				box-sizing: border-box;
+				padding: 4rpx 12rpx;
+				font-size: 24rpx;
+				border-radius: 8rpx;
+
+				&.pending {
+					background: #FEF8E3;
+					color: #DE9B14;
+				}
+
+				&.reject {
+					background: #FFF4F5;
+					color: #CF3546;
+				}
+
+				&.pass {
+					color: #07C160;
+					background: #E6FAEF;
+				}
+			}
+		}
+
+		.card-meta {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+			font-size: 24rpx;
+			color: #666;
+
+			.meta-tag {
+				border-radius: 8rpx 8rpx 8rpx 8rpx;
+				border: 2rpx solid rgba(56, 139, 255, 0.4);
+				padding: 4rpx 8rpx;
+				color: #388BFF;
+			}
+		}
+	}
+
+	/* 通用信息区块样式 */
+	.info-section {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		margin-bottom: 24rpx;
+
+		.section-header {
+			display: flex;
+			align-items: center;
+			margin-bottom: 24rpx;
+
+			.section-indicator {
+				width: 6rpx;
+				height: 32rpx;
+				background: #388BFF;
+				border-radius: 3rpx;
+				margin-right: 16rpx;
+			}
+
+			.section-title {
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #333333;
+			}
+		}
+
+		.info-list {
+			.info-item {
+				display: flex;
+				margin-bottom: 24rpx;
+
+				&:last-child {
+					margin-bottom: 0;
+				}
+
+				.info-label {
+					width: 50%;
+					font-size: 28rpx;
+					color: #666;
+					flex-shrink: 0;
+				}
+
+				.info-value {
+					flex: 1;
+					text-align: end;
+					font-size: 28rpx;
+					color: #333;
+				}
+
+				.copy-btn {
+					margin-left: 16rpx;
+					color: #2196F3;
+					font-size: 24rpx;
+					cursor: pointer;
+				}
+
+				.column {
+					flex-direction: column;
+				}
+
+				.attachment-item {
+					margin-top: 24rpx;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					gap: 16rpx;
+					background: #F7F8FA;
+					border-radius: 16rpx 16rpx 16rpx 16rpx;
+
+					.left {
+						display: flex;
+						align-items: center;
+
+						.img {
+							width: 72rpx;
+							height: 72rpx;
+							margin-right: 24rpx;
+						}
+
+						.txt-item {
+							.attachment-name {
+								font-size: 28rpx;
+								color: #333;
+							}
+
+							.attachment-size {
+								font-size: 24rpx;
+								color: #999;
+							}
+						}
+					}
+
+					.download-btn {
+						width: 32rpx;
+						height: 32rpx;
+					}
+				}
+			}
+		}
+	}
+
+	/* 客户信息样式 */
+	.client-list {
+		.client-item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 16rpx 0;
+
+			&:last-child {
+				border-bottom: none;
+			}
+
+			.client-info {
+				display: flex;
+				align-items: center;
+
+				.avatar {
+					width: 88rpx;
+					height: 88rpx;
+					margin-right: 24rpx;
+				}
+
+				.client-txt {
+					.client-name {
+						font-size: 28rpx;
+						font-weight: 500;
+						color: #333;
+
+						.client-level {
+							margin-left: 8rpx;
+							padding: 2rpx 8rpx;
+							background: #FFF6E5;
+							color: #C89743;
+							font-size: 22rpx;
+							border-radius: 8rpx;
+						}
+					}
+				}
+
+				.client-hospital {
+					font-size: 24rpx;
+					color: #666;
+					margin-top: 4rpx;
+					display: flex;
+					align-items: center;
+
+					.line {
+						width: 2rpx;
+						height: 28rpx;
+						background: #EAEBEE;
+						margin: 0 24rpx;
+					}
+				}
+			}
+
+			.client-stats {
+				display: flex;
+				gap: 24rpx;
+				font-size: 24rpx;
+				color: #999999;
+
+				.stat-item {
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+
+					.num {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #333333;
+					}
+				}
+			}
+		}
+	}
+
+	/* 审批信息样式 */
+	.approval-list {
+		.approval-item {
+			position: relative;
+			padding-left: 24rpx;
+			margin-bottom: 68rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			&:last-child {
+				margin-bottom: 0;
+			}
+
+			.left {
+				display: flex;
+				align-items: center;
+
+				.avatar-box {
+					width: 80rpx;
+					height: 80rpx;
+					margin-right: 32rpx;
+					position: relative;
+
+					.avatar {
+						width: 100%;
+						height: 100%;
+					}
+
+					.icon {
+						position: absolute;
+						bottom: 0;
+						right: 0;
+						width: 32rpx;
+						height: 32rpx;
+					}
+				}
+
+				.approval-user {
+					gap: 12rpx;
+
+					.user-name {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #333;
+					}
+
+					.user-status {
+						font-size: 24rpx;
+					}
+				}
+			}
+
+			.approval-time {
+				font-size: 24rpx;
+				color: #999;
+				margin-top: 4rpx;
+			}
+		}
+
+		.approval-line {
+			position: absolute;
+			left: 64rpx;
+			bottom: -64rpx;
+			width: 1rpx;
+			height: 56rpx;
+			background: #BFD8FF;
+		}
+	}
+
+	.reason {
+		font-size: 28rpx;
+		color: #666666;
+		line-height: 40rpx;
+		margin-left: 136rpx;
+		background: #F7F8FA;
+		border-radius: 16rpx;
+		line-height: 40rpx;
+		padding: 20rpx;
+	}
+
+	.bottom-bar {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background: #fff;
+		padding: 24rpx 32rpx;
+		border-top: 1rpx solid #F2F3F5;
+		z-index: 100;
+		display: flex;
+		align-items: center;
+
+		.action-buttons {
+			display: flex;
+			flex: 1;
+			justify-content: space-between;
+
+			.btn {
+				width: 292rpx;
+				height: 88rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				font-weight: 500;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+				cursor: pointer;
+				display: flex;
+				align-items: center;
+
+				&.btn-cancel {
+					background: #fff;
+					border: 2rpx solid #CF3546;
+					color: #CF3546;
+				}
+
+				&.btn-submit {
+					background: #388BFF;
+					color: #fff;
+				}
+
+				.icon {
+					width: 32rpx;
+					height: 32rpx;
+					margin-right: 16rpx;
+				}
+			}
+		}
+	}
+</style>

+ 628 - 0
pages_task/components/TaskBelongingPicker.vue

@@ -0,0 +1,628 @@
+<template>
+	<!-- 任务归属选择组件 -->
+	<view>
+		<!-- 触发区域 -->
+		<slot name="trigger" :openPicker="openPicker" :value="displayValue">
+			<view class="picker-trigger" @click="openPicker">
+				<view class="trigger-label">{{ label }}</view>
+				<view class="trigger-value" :class="{ placeholder: !displayValue }">
+					{{ displayValue || placeholder }}
+				</view>
+				<image class="trigger-icon" src="/static/image/icon_more.png"></image>
+			</view>
+		</slot>
+
+		<!-- 选择器弹出层 -->
+		<u-popup :show="visible" mode="bottom" closeable round="20" @close="closePicker" :safeAreaInsetBottom="true"
+			:zIndex="1001">
+			<view class="task-belonging-picker">
+				<!-- 标题栏 -->
+				<view class="picker-header">
+					<view class="picker-title">{{ title }}</view>
+					<view class="picker-close" @click="closePicker">
+						<text class="close-icon">×</text>
+					</view>
+				</view>
+
+				<!-- 选项卡区域 -->
+				<view class="tab-container">
+					<scroll-view class="tab-scroll" scroll-x :scroll-left="scrollLeft">
+						<view class="tab-list">
+							<view v-for="(tab, index) in tabs" :key="index" class="tab-item"
+								:class="{ active: currentTab === index }" @click="switchTab(index)">
+								<text class="tab-text">{{ getTabTitle(tab, index) }}</text>
+								<view v-if="currentTab === index" class="tab-indicator"></view>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+
+				<!-- 列表区域 -->
+				<scroll-view class="list-container" scroll-y :scroll-top="scrollTop">
+					<view class="option-list">
+						<view v-for="(item, index) in currentOptions" :key="item.id || index" class="option-item"
+							:class="{ 
+                selected: isOptionSelected(item),
+                disabled: item.disabled
+              }" @click="!item.disabled && selectOption(item)">
+							<view class="option-content">
+								<text class="option-name">{{ item.name }}</text>
+								<view v-if="hasChildren(item)" class="option-arrow">
+									<text class="arrow-icon">›</text>
+								</view>
+							</view>
+							<view v-if="isOptionSelected(item)" class="option-selected">
+								<text class="selected-icon">✓</text>
+							</view>
+						</view>
+					</view>
+
+					<!-- 空状态 -->
+					<view v-if="currentOptions.length === 0" class="empty-state">
+						<image class="empty-icon" src="/static/image/empty.png"></image>
+						<text class="empty-text">暂无数据</text>
+					</view>
+				</scroll-view>
+
+				<!-- 确定按钮 -->
+				<view class="picker-footer">
+					<view class="confirm-button" @click="confirmSelection">
+						{{ confirmText }}
+					</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'TaskBelongingPicker',
+
+		props: {
+			// 是否显示弹出层
+			show: {
+				type: Boolean,
+				default: false
+			},
+
+			// 标题
+			title: {
+				type: String,
+				default: '任务归属'
+			},
+
+			// 标签文本
+			label: {
+				type: String,
+				default: '任务归属'
+			},
+
+			// 占位符
+			placeholder: {
+				type: String,
+				default: '请选择任务归属'
+			},
+
+			// 确认按钮文本
+			confirmText: {
+				type: String,
+				default: '确定'
+			},
+
+			// 是否必填
+			required: {
+				type: Boolean,
+				default: true
+			},
+
+			// 初始选中的值
+			value: {
+				type: [Array, String],
+				default: () => []
+			},
+
+			// 数据源
+			data: {
+				type: Array,
+				default: () => []
+			},
+
+			// 最大层级
+			maxLevel: {
+				type: Number,
+				default: 7
+			},
+
+			// 字段映射
+			fieldNames: {
+				type: Object,
+				default: () => ({
+					label: 'name',
+					value: 'id',
+					children: 'children'
+				})
+			}
+		},
+
+		data() {
+			return {
+				visible: false,
+				currentTab: 0,
+				selectedPath: [], // 选中的路径
+				tabs: [], // 选项卡数据
+				scrollLeft: 0,
+				scrollTop: 0,
+				tempSelectedPath: [] // 临时选择的路径(用于取消时恢复)
+			}
+		},
+
+		computed: {
+			// 显示的值
+			displayValue() {
+				if (typeof this.value === 'string') {
+					return this.value
+				}
+
+				if (Array.isArray(this.value) && this.value.length > 0) {
+					return this.value.map(item => item[this.fieldNames.label]).join(' / ')
+				}
+
+				return ''
+			},
+
+			// 当前选项卡对应的选项列表
+			currentOptions() {
+				if (this.selectedPath.length === 0) {
+					return this.data
+				}
+
+				// 根据当前选中的路径获取子级选项
+				let current = this.data
+				for (let i = 0; i < this.currentTab; i++) {
+					if (this.selectedPath[i] && current) {
+						const selectedItem = this.selectedPath[i]
+						const childrenKey = this.fieldNames.children
+						current = selectedItem[childrenKey] || []
+					}
+				}
+				return current || []
+			}
+		},
+
+		watch: {
+			show: {
+				immediate: true,
+				handler(newVal) {
+					this.visible = newVal
+					if (newVal) {
+						this.initPicker()
+					}
+				}
+			},
+
+			value: {
+				deep: true,
+				handler(newVal) {
+					this.initSelectedPath(newVal)
+				}
+			},
+
+			data: {
+				deep: true,
+				handler() {
+					if (this.visible) {
+						this.initTabs()
+					}
+				}
+			}
+		},
+
+		created() {
+			this.initSelectedPath(this.value)
+		},
+
+		methods: {
+			// 初始化选择器
+			initPicker() {
+				this.initTabs()
+				this.initSelectedPath(this.value)
+				this.tempSelectedPath = [...this.selectedPath]
+				this.currentTab = Math.max(this.selectedPath.length - 1, 0)
+				this.scrollToTab(this.currentTab)
+			},
+
+			// 初始化选项卡
+			initTabs() {
+				const defaultTabs = [
+					'中药事业部',
+					'事业1组',
+					'学术研究部',
+					'湖南省药学服务公司',
+					'中药事业部',
+					'中药事业部',
+					'中药事业部'
+				]
+
+				this.tabs = []
+				for (let i = 0; i < this.maxLevel; i++) {
+					this.tabs.push({
+						title: defaultTabs[i] || `层级${i + 1}`,
+						level: i
+					})
+				}
+			},
+
+			// 初始化选中的路径
+			initSelectedPath(value) {
+				if (typeof value === 'string') {
+					// 如果是字符串,解析成数组
+					this.selectedPath = []
+				} else if (Array.isArray(value)) {
+					this.selectedPath = [...value]
+				} else {
+					this.selectedPath = []
+				}
+			},
+
+			// 获取选项卡标题
+			getTabTitle(tab, index) {
+				if (this.selectedPath[index]) {
+					return this.selectedPath[index][this.fieldNames.label]
+				}
+				return tab.title
+			},
+
+			// 打开选择器
+			openPicker() {
+				this.visible = true
+				this.$emit('open')
+				this.$nextTick(() => {
+					this.initPicker()
+				})
+			},
+
+			// 关闭选择器
+			closePicker() {
+				this.visible = false
+				this.selectedPath = [...this.tempSelectedPath]
+				this.$emit('close')
+				this.$emit('update:show', false)
+			},
+
+			// 切换选项卡
+			switchTab(index) {
+				if (index < 0 || index >= this.tabs.length) return
+
+				this.currentTab = index
+				this.scrollToTab(index)
+				this.scrollTop = 0
+			},
+
+			// 滚动到指定选项卡
+			scrollToTab(index) {
+				this.$nextTick(() => {
+					// 简单计算滚动位置,实际可以更精确
+					this.scrollLeft = index * 100
+				})
+			},
+
+			// 判断是否有子级
+			hasChildren(item) {
+				const childrenKey = this.fieldNames.children
+				return item[childrenKey] && item[childrenKey].length > 0
+			},
+
+			// 判断选项是否被选中
+			isOptionSelected(item) {
+				const currentSelected = this.selectedPath[this.currentTab]
+				if (!currentSelected) return false
+
+				const valueKey = this.fieldNames.value
+				return currentSelected[valueKey] === item[valueKey]
+			},
+
+			// 选择选项
+			selectOption(item) {
+				const valueKey = this.fieldNames.value
+				const labelKey = this.fieldNames.label
+				const childrenKey = this.fieldNames.children
+
+				// 更新当前级别的选择
+				this.selectedPath[this.currentTab] = {
+					[valueKey]: item[valueKey],
+					[labelKey]: item[labelKey]
+				}
+
+				// 复制子级数据(如果有)
+				if (item[childrenKey]) {
+					Object.assign(this.selectedPath[this.currentTab], {
+						[childrenKey]: item[childrenKey]
+					})
+				}
+
+				// 清空后续级别的选择
+				for (let i = this.currentTab + 1; i < this.selectedPath.length; i++) {
+					this.selectedPath[i] = null
+				}
+
+				// 如果有子级且未达到最大层级,自动切换到下一级
+				if (this.hasChildren(item) && this.currentTab < this.tabs.length - 1) {
+					setTimeout(() => {
+						this.currentTab++
+						this.scrollToTab(this.currentTab)
+					}, 150)
+				}
+
+				// 触发选择事件
+				this.$emit('select', {
+					level: this.currentTab,
+					item: item,
+					path: this.getCurrentPath()
+				})
+			},
+
+			// 获取当前选择的完整路径
+			getCurrentPath() {
+				return this.selectedPath.filter(item => item !== null)
+			},
+
+			// 确认选择
+			confirmSelection() {
+				const selectedPath = this.getCurrentPath()
+
+				if (this.required && selectedPath.length === 0) {
+					uni.showToast({
+						title: '请选择任务归属',
+						icon: 'none'
+					})
+					return
+				}
+
+				// 保存临时路径
+				this.tempSelectedPath = [...selectedPath]
+
+				// 构建显示文本
+				const displayText = selectedPath
+					.map(item => item[this.fieldNames.label])
+					.join(' / ')
+
+				this.visible = false
+
+				// 触发确认事件
+				this.$emit('confirm', {
+					value: selectedPath,
+					displayText: displayText
+				})
+
+				// 更新外部数据
+				this.$emit('input', selectedPath)
+				this.$emit('update:show', false)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	/* 触发区域样式 */
+	.picker-trigger {
+		display: flex;
+		align-items: center;
+		padding: 30rpx 0;
+		border-bottom: 1px solid #EBEDF0;
+
+		.trigger-label {
+			font-size: 28rpx;
+			color: #333;
+			flex-shrink: 0;
+		}
+
+		.trigger-value {
+			flex: 1;
+			text-align: right;
+			font-size: 28rpx;
+			color: #333;
+			padding-right: 16rpx;
+
+			&.placeholder {
+				color: #C8C9CC;
+			}
+		}
+
+		.trigger-icon {
+			width: 36rpx;
+			height: 36rpx;
+		}
+	}
+
+	/* 选择器弹出层样式 */
+	.task-belonging-picker {
+		height: 70vh;
+		display: flex;
+		flex-direction: column;
+		background: #fff;
+	}
+
+	/* 头部样式 */
+	.picker-header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 32rpx 32rpx 24rpx;
+		border-bottom: 1px solid #f0f0f0;
+	}
+
+	.picker-title {
+		font-size: 32rpx;
+		font-weight: 500;
+		color: #333;
+	}
+
+	.picker-close {
+		width: 48rpx;
+		height: 48rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.close-icon {
+		font-size: 40rpx;
+		color: #999;
+		line-height: 1;
+	}
+
+	/* 选项卡样式 */
+	.tab-container {
+		border-bottom: 1px solid #f0f0f0;
+		background: #fff;
+	}
+
+	.tab-scroll {
+		width: 100%;
+		white-space: nowrap;
+	}
+
+	.tab-list {
+		display: inline-flex;
+		padding: 0 32rpx;
+	}
+
+	.tab-item {
+		position: relative;
+		padding: 24rpx 0;
+		margin-right: 40rpx;
+		flex-shrink: 0;
+
+		&:last-child {
+			margin-right: 0;
+		}
+
+		&.active {
+			.tab-text {
+				color: #576B95;
+				font-weight: 500;
+			}
+		}
+	}
+
+	.tab-text {
+		font-size: 28rpx;
+		color: #666;
+		line-height: 40rpx;
+		white-space: nowrap;
+	}
+
+	.tab-indicator {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		height: 4rpx;
+		background: #576B95;
+		border-radius: 2rpx;
+	}
+
+	/* 列表区域样式 */
+	.list-container {
+		flex: 1;
+		padding: 0 32rpx;
+	}
+
+	.option-list {
+		padding: 24rpx 0;
+	}
+
+	.option-item {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 24rpx 0;
+		border-bottom: 1px solid #f5f5f5;
+
+		&:last-child {
+			border-bottom: none;
+		}
+
+		&.selected {
+			.option-name {
+				color: #576B95;
+			}
+		}
+
+		&.disabled {
+			opacity: 0.5;
+			pointer-events: none;
+		}
+	}
+
+	.option-content {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+	}
+
+	.option-name {
+		font-size: 28rpx;
+		color: #333;
+	}
+
+	.option-arrow {
+		margin-left: 16rpx;
+	}
+
+	.arrow-icon {
+		font-size: 36rpx;
+		color: #999;
+	}
+
+	.option-selected {
+		margin-left: 16rpx;
+	}
+
+	.selected-icon {
+		font-size: 32rpx;
+		color: #576B95;
+		font-weight: bold;
+	}
+
+	/* 空状态样式 */
+	.empty-state {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding: 100rpx 0;
+
+		.empty-icon {
+			width: 200rpx;
+			height: 200rpx;
+			margin-bottom: 32rpx;
+			opacity: 0.5;
+		}
+
+		.empty-text {
+			font-size: 28rpx;
+			color: #999;
+		}
+	}
+
+	/* 底部按钮样式 */
+	.picker-footer {
+		padding: 24rpx 32rpx;
+		border-top: 1px solid #f0f0f0;
+		background: #fff;
+	}
+
+	.confirm-button {
+		height: 80rpx;
+		line-height: 80rpx;
+		text-align: center;
+		background: #576B95;
+		border-radius: 40rpx;
+		font-size: 28rpx;
+		color: #fff;
+		font-weight: 500;
+	}
+</style>

+ 312 - 0
pages_task/components/step.vue

@@ -0,0 +1,312 @@
+<template>
+	<!-- 简化显示版 -->
+	<view class="progress-steps simple">
+		<!-- 动态渲染步骤 -->
+		<template v-for="(step, index) in steps" >
+			<!-- 步骤项 -->
+			<view class="step-item" :class="{ 
+				active: currentStep === step.stepNumber
+			}">
+				<!-- 圆圈部分 -->
+				<view class="step-circle">
+					<!-- 已完成的步骤显示完成图标 -->
+					<image v-if="currentStep > step.stepNumber" 
+						class="icon" 
+						:src="step.doneIcon || '/static/image/icon_step_done.png'">
+					</image>
+					<!-- 当前和未完成的步骤显示数字 -->
+					<text v-else>{{ step.stepNumber }}</text>
+				</view>
+				<!-- 步骤文本 -->
+				<view class="step-text" :class="{ 
+					active: currentStep === step.stepNumber
+					
+				}">
+					{{ step.title }}
+				</view>
+			</view>
+			
+			<!-- 步骤之间的连线(最后一个步骤后不显示) -->
+			<view v-if="index < steps.length - 1" 
+				class="step-line" 
+				:class="{ active: currentStep > step.stepNumber }">
+			</view>
+		</template>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'ProgressSteps',
+		props: {
+			// 当前步骤
+			step: {
+				type: Number,
+				default: 1,
+				validator: (value) => value > 0
+			},
+			// 步骤配置数据(支持数组或JSON字符串)
+			stepsData: {
+				type: [Array, String],
+				default: () => [
+					{ id: 1, stepNumber: 1, title: '填写任务' },
+					{ id: 2, stepNumber: 2, title: '选择客户' },
+					{ id: 3, stepNumber: 3, title: '积分设置' }
+				]
+			},
+			// 完成图标(可覆盖单个步骤的配置)
+			doneIcon: {
+				type: String,
+				default: '/static/image/icon_step_done.png'
+			}
+		},
+		data() {
+			return {
+				currentStep: this.step,
+				steps: []
+			}
+		},
+		created() {
+			this.initSteps()
+		},
+		watch: {
+			current(newVal) {
+				this.currentStep = newVal
+			},
+			stepsData: {
+				handler(newVal) {
+					this.initSteps()
+				},
+				deep: true,
+				immediate: true
+			}
+		},
+		methods: {
+			// 初始化步骤数据
+			initSteps() {
+				let steps = []
+				
+				try {
+					// 如果传入的是字符串,尝试解析为JSON
+					if (typeof this.stepsData === 'string') {
+						steps = JSON.parse(this.stepsData)
+					} else if (Array.isArray(this.stepsData)) {
+						steps = this.stepsData
+					}
+					
+					// 验证和标准化数据
+					steps = steps.map((item, index) => {
+						return {
+							id: item.id || index + 1,
+							stepNumber: item.stepNumber || index + 1,
+							title: item.title || `步骤${index + 1}`,
+							doneIcon: item.doneIcon || this.doneIcon,
+							// 可以添加更多自定义字段
+							...item
+						}
+					})
+					
+					// 按步骤号排序
+					steps.sort((a, b) => a.stepNumber - b.stepNumber)
+					
+					this.steps = steps
+				} catch (error) {
+					console.error('解析步骤数据失败:', error)
+					// 使用默认步骤
+					this.steps = [
+						{ id: 1, stepNumber: 1, title: '填写任务' },
+						{ id: 2, stepNumber: 2, title: '选择客户' },
+						{ id: 3, stepNumber: 3, title: '积分设置' }
+					]
+				}
+			},
+			
+			// 跳转到指定步骤
+			goToStep(stepNumber) {
+				const targetStep = this.steps.find(step => step.stepNumber === stepNumber)
+				if (targetStep && stepNumber >= 1 && stepNumber <= this.steps.length) {
+					const oldStep = this.currentStep
+					this.currentStep = stepNumber
+					
+					// 触发事件
+					this.$emit('step-change', {
+						stepNumber: this.currentStep,
+						stepData: targetStep,
+						oldStep: oldStep
+					})
+					
+					// 点击步骤事件
+					this.$emit('step-click', {
+						stepNumber: stepNumber,
+						stepData: targetStep
+					})
+				}
+			},
+			
+			// 下一步
+			goNext() {
+				if (this.currentStep < this.steps.length) {
+					this.goToStep(this.currentStep + 1)
+					this.$emit('next', this.currentStep)
+				}
+			},
+			
+			// 上一步
+			goPrev() {
+				if (this.currentStep > 1) {
+					this.goToStep(this.currentStep - 1)
+					this.$emit('prev', this.currentStep)
+				}
+			},
+			
+			// 提交
+			handleSubmit() {
+				this.$emit('submit')
+			},
+			
+			// 获取当前步骤数据
+			getCurrentStep() {
+				return this.steps.find(step => step.stepNumber === this.currentStep) || null
+			},
+			
+			// 获取所有步骤
+			getAllSteps() {
+				return [...this.steps]
+			},
+			
+			// 更新步骤数据(可用于动态修改标题等)
+			updateStep(stepNumber, newData) {
+				const index = this.steps.findIndex(step => step.stepNumber === stepNumber)
+				if (index !== -1) {
+					this.steps[index] = { ...this.steps[index], ...newData }
+					this.$forceUpdate() // 强制更新视图
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	/* 简化版样式 - 确保圆圈和连线无缝连接 */
+	.progress-steps.simple {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 16rpx 38rpx;
+		position: relative;
+		margin: 30rpx 48rpx;
+
+		.step-item {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			position: relative;
+			z-index: 2;
+			cursor: pointer;
+			transition: all 0.3s ease;
+
+			&:active {
+				opacity: 0.7;
+			}
+
+			&.active {
+				.step-circle {
+					background: #388BFF;
+					color: #FFFFFF;
+				}
+			}
+
+			&:not(.active) {
+				.step-circle {
+					background: #FFFFFF;
+					color: #C0C4CC;
+					border: 2rpx solid #E4E7ED;
+				}
+			}
+		}
+
+		.step-circle {
+			width: 48rpx;
+			height: 48rpx;
+			border-radius: 50%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 28rpx;
+			font-weight: 500;
+			margin-bottom: 8rpx;
+			position: relative;
+			z-index: 2;
+			box-sizing: border-box;
+			transition: all 0.3s ease;
+
+			.icon {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.step-text {
+			font-size: 28rpx;
+			color: #999999;
+			white-space: nowrap;
+			transition: all 0.3s ease;
+
+			&.active {
+				font-weight: 500;
+				font-size: 28rpx;
+				color: #333333;
+			}
+			
+			
+		}
+
+		.step-line {
+			flex: 1;
+			height: 4rpx;
+			background: #E4E7ED;
+			margin: 0 -30rpx;
+			/* 负边距让线延伸到圆圈边缘 */
+			position: relative;
+			top: -30rpx;
+			max-width: 294rpx;
+			/* 调整到圆圈中心位置 */
+			z-index: 1;
+			min-width: 60rpx;
+			transition: all 0.3s ease;
+
+			&.active {
+				background: #388BFF;
+				opacity: 0.2;
+			}
+		}
+	}
+
+	/* 响应式调整 */
+	@media (max-width: 750px) {
+		.progress-steps.simple {
+			padding: 20rpx 15rpx;
+			margin: 20rpx 30rpx;
+
+			.step-circle {
+				width: 50rpx;
+				height: 50rpx;
+				font-size: 24rpx;
+			}
+
+			.step-text {
+				font-size: 24rpx;
+				
+				&.active {
+					font-size: 24rpx;
+				}
+			}
+
+			.step-line {
+				margin: 0 -25rpx;
+				top: -25rpx;
+				min-width: 40rpx;
+			}
+		}
+	}
+</style>

+ 731 - 0
pages_task/createTask.vue

@@ -0,0 +1,731 @@
+<template>
+	<view class="container">
+		<Step :step="currentStep" :stepsData="currentText" />
+		<scroll-view class="content" scroll-y>
+			<!-- 驳回意见提示 -->
+			<view class="rejection-banner" v-if="rejectionInfo">
+				<view class="rejection-icon">✕</view>
+				<view class="rejection-text">驳回意见: {{ rejectionInfo }}</view>
+			</view>
+
+			<!-- 基本信息 -->
+			<view class="form-section">
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>任务归属</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.institution }"
+						@click="showTaskPopup=true">
+						{{ formData.institution || '请选择任务归属' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>归属项目</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.belongingProject }"
+						@click="showBelongingPopup = true">
+						{{ formData.belongingProject || '请选择归属项目' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>费用分摊</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.costAllocation }"
+						@click="showPicker('费用分摊',costColumns)">
+						{{ formData.costAllocation || '请选择费用分摊主体' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>添加任务备注</text>
+					</view>
+					<EvanSwitch v-model="formData.addRemark"></EvanSwitch>
+				</view>
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>归属类型</text>
+					</view>
+					<text class="txt">院内</text>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>任务类型</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.taskType }"
+						@click="showPicker('任务类型',taskTypeColumns)">
+						{{ formData.taskType || '请选择任务类型' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>计划开始时间</text>
+					</view>
+					<picker mode="date" :value="formData.planStartTime" fields="day" @change="onPlanStartTimeChange">
+						<view class="form-input picker-input" :class="{ placeholder: !formData.planStartTime }">
+							{{ formData.planStartTime || '请选择计划开始时间' }}
+							<image class="icon" src="/static/image/icon_more.png"></image>
+						</view>
+					</picker>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>计划结束时间</text>
+					</view>
+					<picker mode="date" :value="formData.planEndTime" fields="day" @change="onPlanEndTimeChange">
+						<view class="form-input picker-input" :class="{ placeholder: !formData.planEndTime }">
+							{{ formData.planEndTime || '请选择计划结束时间' }}
+							<image class="icon" src="/static/image/icon_more.png"></image>
+						</view>
+					</picker>
+				</view>
+			</view>
+		</scroll-view>
+		<view class="next-button" @click="toNext">下一步</view>
+		<u-picker :title='pickerTitle' :show="showPickerVisible" confirmColor='#576B95' ref="uPicker"
+			:columns="pickerData" @confirm="confirm" @cancel="cancel">
+		</u-picker>
+
+		<u-popup :show="showBelongingPopup" mode="bottom" round="20" @close="closePopup" closeable>
+			<view class="popup-content p32">
+				<view class="popup-header">
+					<text class="title">归属项目</text>
+				</view>
+
+				<view class="search-box">
+					<image class="icon" src="/static/image/search.png"></image>
+					<u-input v-model="searchKeyword" placeholder="请输入归属项目" border="none" clearable />
+				</view>
+
+				<scroll-view scroll-y class="project-list">
+					<view v-for="(project, index) in filteredProjects" :key="index" class="project-item"
+						:class="{ active: selectedIndex === index }" @tap="selectProject(project, index)">
+						<text class="project-name">{{ project.name }}</text>
+						<image class="icon" src="/static/image/icon_right.png"></image>
+					</view>
+				</scroll-view>
+			</view>
+		</u-popup>
+
+		<u-popup :show="showTaskPopup" mode="bottom" round="16" @close="showTaskPopup = false" safeAreaInsetBottom>
+			<view class="popup-content">
+				<view class="popup-header">
+					<text class="popup-title">任务归属</text>
+					<image class="close-icon" src="/static/image/icon_cross.png" @click="showTaskPopup=false"></image>
+				</view>
+				<view class="two-level-container">
+					<scroll-view class="primary-list" scroll-y>
+						<view v-for="(item, index) in primaryOptions" :key="index" class="primary-item"
+							:class="{ 'primary-active': activePrimaryIndex === index }"
+							@click="handlePrimarySelect(index)">
+							<text class="primary-text">{{ item.name }}</text>
+						</view>
+					</scroll-view>
+
+					<scroll-view class="secondary-list" scroll-y>
+						<view v-for="(subItem, subIndex) in currentSecondaryOptions" :key="subIndex"
+							class="secondary-item" :class="{ 'secondary-active': selectedSecondaryItem === subItem }"
+							@click="handleSecondarySelect(subItem)">
+							<text class="secondary-text">{{ subItem }}</text>
+							<u-icon v-if="selectedSecondaryItem === subItem" name="checkbox-mark" color="#2979ff"
+								size="20" />
+						</view>
+					</scroll-view>
+				</view>
+
+				<view class="popup-footer">
+					<button class="confirm-btn" @click="handleConfirm">确定</button>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import Step from '@/pages_task/components/step.vue'
+	import EvanSwitch from '@/components/evan-switch.vue'
+	export default {
+		components: {
+			Step,
+			EvanSwitch
+		},
+		data() {
+			return {
+				showTaskPopup: false,
+				primaryOptions: [{
+						id: 1,
+						name: '中药事业部',
+						children: ['中药一部', '中药二部', '中药三部', '中药四部']
+					},
+					{
+						id: 2,
+						name: '事业1组',
+						children: ['事业1组-项目部', '事业1组-市场部', '事业1组-技术部']
+					},
+					{
+						id: 3,
+						name: '学术研究部',
+						children: ['学术研究一部', '学术研究二部', '学术研究三部']
+					},
+					{
+						id: 4,
+						name: '湖南省药学服务公司',
+						children: ['药学服务一部', '药学服务二部', '药学服务三部']
+					},
+					{
+						id: 5,
+						name: '医药事业部',
+						children: ['医药一部', '医药二部', '医药三部']
+					},
+					{
+						id: 6,
+						name: '医疗事业部',
+						children: ['医疗一部', '医疗二部', '医疗三部']
+					},
+					{
+						id: 7,
+						name: '健康管理部',
+						children: ['健康管理一部', '健康管理二部']
+					},
+					{
+						id: 8,
+						name: '医疗事业部',
+						children: ['医疗一部', '医疗二部', '医疗三部']
+					},
+					{
+						id: 9,
+						name: '健康管理部',
+						children: ['健康管理一部', '健康管理二部']
+					}
+				],
+				activePrimaryIndex: 0,
+				currentSecondaryOptions: [],
+				selectedSecondaryItem: '',
+				selectedPrimaryItem: null,
+				selectedIndex: -1,
+				selectedProject: null,
+				belongingprojects: [{
+						name: '学术交流项目'
+					},
+					{
+						name: '科学调研项目'
+					},
+					{
+						name: '2026年1月医学研究项目'
+					},
+					{
+						name: '2026年2月医学研究项目'
+					},
+					{
+						name: '2026年3月医学研究项目'
+					}
+				],
+				searchKeyword: '',
+				showBelongingPopup: false,
+				showPickerVisible: false,
+				costColumns: [
+					['主体1', '主体2', '主体3'],
+				],
+				taskTypeColumns: [
+					['类型1', '类型2', '类型3'],
+				],
+				currentStep: 1,
+				currentText: [{
+						id: 1,
+						stepNumber: 1,
+						title: '填写任务'
+					},
+					{
+						id: 2,
+						stepNumber: 2,
+						title: '选择客户'
+					},
+					{
+						id: 3,
+						stepNumber: 3,
+						title: '积分设置'
+					}
+				],
+				rejectionInfo: '',
+				formData: {
+					costAllocation: '',
+					planStartTime: '',
+					planEndTime: '',
+					institution: '',
+					belongingProject: '',
+					taskType: '',
+					addRemark: false
+				},
+				pickerTitle: '默认标题',
+				pickerData: []
+			}
+		},
+		onLoad(options) {
+			if (options.rejectionInfo) {
+				this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
+			}
+			// 初始化二级选项
+			this.currentSecondaryOptions = this.primaryOptions[0]?.children || []
+		},
+		computed: {
+			filteredProjects() {
+				if (!this.searchKeyword.trim()) {
+					return this.belongingprojects;
+				}
+				return this.belongingprojects.filter(project =>
+					project.name.includes(this.searchKeyword)
+				);
+			}
+		},
+		methods: {
+			handlePrimarySelect(index) {
+				this.activePrimaryIndex = index;
+				this.currentSecondaryOptions = this.primaryOptions[index].children || [];
+				this.selectedSecondaryItem = '';
+			},
+			handleSecondarySelect(item) {
+				this.selectedSecondaryItem = item;
+				this.selectedPrimaryItem = this.primaryOptions[this.activePrimaryIndex];
+			},
+			handleConfirm() {
+				if (this.selectedSecondaryItem) {
+					const displayText = `${this.selectedPrimaryItem.name} > ${this.selectedSecondaryItem}`;
+					this.formData.institution = displayText;
+					this.showTaskPopup = false;
+				} else {
+					uni.showToast({
+						title: '请选择二级部门',
+						icon: 'none'
+					});
+				}
+			},
+			closePopup() {
+				this.showBelongingPopup = false;
+				this.searchKeyword = '';
+				this.selectedIndex = -1;
+			},
+			selectProject(project, index) {
+				this.selectedIndex = index;
+				this.selectedProject = project;
+				this.formData.belongingProject = project.name;
+				setTimeout(() => {
+					this.showBelongingPopup = false;
+					this.searchKeyword = '';
+					this.selectedIndex = -1;
+				}, 300);
+			},
+			showPicker(title, data) {
+				this.pickerData = data
+				this.pickerTitle = title
+				this.showPickerVisible = true
+			},
+			confirm(e) {
+				if (e.value && e.value.length > 0) {
+					if (this.pickerTitle === '费用分摊') {
+						this.formData.costAllocation = e.value[0]
+					} else if (this.pickerTitle === '任务类型') {
+						this.formData.taskType = e.value[0]
+					}
+				}
+				this.showPickerVisible = false
+			},
+			cancel() {
+				this.showPickerVisible = false
+			},
+			toNext() {
+				uni.navigateTo({
+					url: '/pages_task/selectCustomer'
+				})
+			},
+			onPlanStartTimeChange(e) {
+				this.formData.planStartTime = e.detail.value
+			},
+			onPlanEndTimeChange(e) {
+				this.formData.planEndTime = e.detail.value
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		display: flex;
+		flex-direction: column;
+		position: relative;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 544rpx;
+			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+		}
+
+		.content {
+			flex: 1;
+			box-sizing: border-box;
+
+			.rejection-banner {
+				display: flex;
+				align-items: center;
+				padding: 24rpx;
+				background: #FF5030;
+				color: #fff;
+				margin: 24rpx;
+				border-radius: 8rpx;
+
+				.rejection-icon {
+					width: 40rpx;
+					height: 40rpx;
+					border-radius: 50%;
+					background: rgba(255, 255, 255, 0.3);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: 24rpx;
+					margin-right: 16rpx;
+				}
+
+				.rejection-text {
+					flex: 1;
+					font-size: 28rpx;
+					line-height: 1.5;
+				}
+			}
+
+			.form-section {
+				background: #fff;
+				margin: 20rpx;
+				border-radius: 16rpx;
+				padding: 32rpx;
+
+				.form-item {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #EBEDF0;
+					padding: 30rpx 0;
+
+					&:last-child {
+						border-bottom: 0;
+					}
+
+					.form-label {
+						display: flex;
+						align-items: center;
+						font-size: 28rpx;
+						color: #333;
+						margin-bottom: 16rpx;
+
+						.required {
+							color: #CF3546;
+							margin-right: 4rpx;
+						}
+					}
+
+					.txt {
+						font-size: 28rpx;
+						color: #333333;
+					}
+
+					.form-input {
+						flex: 1;
+						font-size: 28rpx;
+						color: #C8C9CC;
+
+						&.placeholder {
+							color: #C8C9CC;
+						}
+
+						&.picker-input {
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+						}
+
+						.icon {
+							width: 36rpx;
+							height: 36rpx;
+						}
+					}
+				}
+			}
+		}
+
+		.next-button {
+			text-align: center;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			height: 88rpx;
+			line-height: 88rpx;
+			background: #388BFF;
+			border-radius: 200rpx;
+			margin: 32rpx;
+		}
+	}
+
+	::v-deep .u-popup__content {
+		border-radius: 40rpx 40rpx 0 0 !important;
+	}
+
+
+	.popup-content {
+		border-radius: 40rpx 40rpx 0rpx 0rpx;
+		height: 70vh;
+		background-color: #fff;
+
+		.popup-header {
+			padding: 40rpx 30rpx 20rpx;
+			text-align: center;
+
+			.close-icon {
+				width: 44rpx;
+				height: 44rpx;
+				position: absolute;
+				right: 32rpx;
+			}
+
+			flex-shrink: 0;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: 600;
+				color: #333;
+			}
+
+			.popup-title {
+				font-size: 32rpx;
+				font-weight: 600;
+				color: #333;
+			}
+		}
+
+		.search-box {
+			display: flex;
+			align-items: center;
+			background: #F7F8FA;
+			border-radius: 38rpx;
+			padding: 16rpx 28rpx;
+			margin-bottom: 24rpx;
+
+			.icon {
+				width: 26rpx;
+				height: 26rpx;
+				margin-right: 10rpx;
+			}
+		}
+
+		.project-list {
+			height: calc(100% - 200rpx);
+
+			.project-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 28rpx 0;
+				font-size: 28rpx;
+				border-bottom: 1rpx solid #eee;
+
+				&:active {
+					background-color: #f9f9f9;
+				}
+
+				&.active {
+					.project-name {
+						font-weight: 500;
+						color: #388BFF;
+					}
+
+					.icon {
+						opacity: 1;
+					}
+				}
+
+				.project-name {
+					color: #333;
+					transition: all 0.2s ease;
+				}
+
+				.icon {
+					width: 36rpx;
+					height: 36rpx;
+					opacity: 0;
+					transition: opacity 0.2s ease;
+				}
+			}
+		}
+
+		.two-level-container {
+			display: flex;
+			flex: 1;
+			border-top: 1rpx solid #f5f5f5;
+
+			.primary-list {
+				width: 40%;
+				background-color: #f8f9fa;
+
+				.primary-item {
+					padding: 28rpx 20rpx;
+					background: #F2F3F5;
+
+					&:active {
+						background: #FFFFFF;
+					}
+
+					&.primary-active {
+						position: relative;
+						background-color: #fff;
+
+						&::before {
+							content: '';
+							position: absolute;
+							top: 50%;
+							left: 0;
+							transform: translateY(-50%);
+							width: 8rpx;
+							height: 32rpx;
+							background: #388BFF;
+						}
+
+						.primary-text {
+							font-weight: 500;
+						}
+					}
+
+					.primary-text {
+						font-size: 28rpx;
+						color: #666;
+					}
+				}
+			}
+
+			.secondary-list {
+				width: 60%;
+				padding: 0 20rpx;
+
+				.secondary-item {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 28rpx 10rpx;
+					font-size: 28rpx;
+					color: #333;
+
+					&.secondary-active {
+						font-weight: 500;
+						color: #388BFF;
+					}
+				}
+			}
+		}
+
+		.popup-footer {
+			padding: 20rpx 30rpx 40rpx;
+			background-color: #fff;
+			border-top: 1rpx solid #f5f5f5;
+			flex-shrink: 0;
+
+			.confirm-btn {
+				width: 100%;
+				height: 88rpx;
+				line-height: 88rpx;
+				background-color: #2979ff;
+				color: #fff;
+				font-size: 32rpx;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+
+				&:active {
+					opacity: 0.8;
+				}
+			}
+		}
+	}
+
+	@media (prefers-color-scheme: dark) {
+		.popup-content {
+			background-color: #1e1e1e;
+
+			.popup-header {
+
+				.title,
+				.popup-title {
+					color: #fff;
+				}
+			}
+
+			.two-level-container {
+				.primary-list {
+					background-color: #2d2d2d;
+					border-right-color: #3d3d3d;
+
+					.primary-item {
+						border-bottom-color: #3d3d3d;
+
+						&:active {
+							background-color: #3d3d3d;
+						}
+
+						&.primary-active {
+							background-color: #3d3d3d;
+
+							.primary-text {
+								color: #2979ff;
+							}
+						}
+
+						.primary-text {
+							color: #ccc;
+						}
+					}
+				}
+
+				.secondary-list {
+					.secondary-item {
+						border-bottom-color: #3d3d3d;
+
+						&:active {
+							background-color: #3d3d3d;
+						}
+
+						&.secondary-active {
+							background-color: #2d2d2d;
+						}
+
+						.secondary-text {
+							color: #fff;
+						}
+					}
+				}
+			}
+
+			.popup-footer {
+				background-color: #1e1e1e;
+				border-top-color: #3d3d3d;
+			}
+		}
+	}
+</style>

+ 640 - 0
pages_task/editSelectCustomer.vue

@@ -0,0 +1,640 @@
+<template>
+	<view class="container">
+		<Step :step="currentStep" :stepsData="currentText" />
+
+		<scroll-view class="content" scroll-y>
+			<!-- 客户积分设置列表 -->
+			<view class="integral-section">
+				<view class="section-header">
+					<view class="section-title">客户姓名</view>
+					<view class="section-subtitle">积分数值</view>
+				</view>
+
+				<view class="integral-list">
+					<view class="integral-item" v-for="(customer, index) in customerList" :key="customer.id">
+						<view class="customer-info">
+							<view class="customer-name">{{ customer.name }}</view>
+						</view>
+						<view class="integral-input-wrapper">
+							<input class="integral-input" type="number" :placeholder="customer.placeholder"
+								v-model="customer.integral" :disabled="customer.disabled"
+								@input="onIntegralInput(customer)" />
+							<view v-if="customer.integral" class="clear-icon-wrapper"
+								@click.stop="clearIntegral(customer)">
+								<image class="clear-icon" src="/static/image/icon_clear.png"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+
+
+		<!-- 概览弹窗 -->
+		<!-- :show="showOverview" -->
+		<u-popup :show="showOverview" mode="bottom" @close="closeOverviewPopup" round="20" :safeAreaInsetBottom="true">
+			<view class="overview-popup">
+				<!-- 弹窗头部 -->
+				<view class="popup-header">
+					<text class="popup-title">概览</text>
+					<view class="close-btn" @click="closeOverviewPopup">
+						<image class="close-icon" src="/static/image/icon_close.png"></image>
+					</view>
+				</view>
+
+				<!-- 任务信息 -->
+				<view class="overview-section">
+					<view class="row">
+						<text class="line"></text>
+						<view class="section-title">任务信息</view>
+					</view>
+					<view class="info-list">
+						<view class="info-item">
+							<view class="info-label">项目归属:</view>
+							<view class="info-value">湖南省药学服务公司</view>
+						</view>
+						<view class="info-item">
+							<view class="info-label">项目任务:</view>
+							<view class="info-value">科普文章</view>
+						</view>
+						<view class="info-item">
+							<view class="info-label">项目时间:</view>
+							<view class="info-value">2025/11/19 14:12~2025/11/19 14:12</view>
+						</view>
+					</view>
+				</view>
+
+				<!-- 客户信息 -->
+				<view class="overview-section">
+					<view class="row">
+						<text class="line"></text>
+						<view class="section-title">客户信息</view>
+					</view>
+					<view class="customer-table">
+						<!-- 表头 -->
+						<view class="table-header">
+							<view class="table-cell" style="flex: 1.5;">姓名</view>
+							<view class="table-cell" style="flex: 1;">级别</view>
+							<view class="table-cell" style="flex: 1;">积分</view>
+							<view class="table-cell" style="flex: 2;">联系方式</view>
+						</view>
+
+						<!-- 表格内容 -->
+						<view class="table-body">
+							<view class="table-row" v-for="(customer, index) in customerList" :key="customer.id">
+								<view class="table-cell" style="flex: 1.5;">{{ customer.name }}</view>
+								<view class="table-cell" style="flex: 1;">一级</view>
+								<view class="table-cell" style="flex: 1;">{{ customer.integral || '0' }}</view>
+								<view class="table-cell" style="flex: 2;">177****4235</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- 安全区域占位 -->
+				<view class="safe-area"></view>
+			</view>
+		</u-popup>
+
+		<!-- 底部操作栏 -->
+		<view class="bottom-bar">
+			<view class="del-box" @click="deleteSelected">
+				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<text>删除</text>
+			</view>
+			<view class="action-buttons">
+				<view class="btn btn-cancel" @click="handlePrev">上一步</view>
+				<view class="btn btn-submit" @click="submit">提交</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Step from '@/pages_task/components/step.vue'
+	export default {
+		components: {
+			Step
+		},
+		data() {
+			return {currentText: [{
+						id: 1,
+						stepNumber: 1,
+						title: '填写任务'
+					},
+					
+					{
+						id: 2,
+						stepNumber: 2,
+						title: '积分设置'
+					}
+				],
+				currentStep: 2,
+				showOverview: false, // 控制概览弹窗显示
+				customerList: [{
+						id: 1,
+						name: '王小明',
+						integral: '30',
+						placeholder: '请输入积分',
+						disabled: false
+					},
+					{
+						id: 2,
+						name: '李洋',
+						integral: '',
+						placeholder: '请输入积分',
+						disabled: false
+					},
+					{
+						id: 3,
+						name: '钱小燕',
+						integral: '',
+						placeholder: '请输入积分',
+						disabled: false
+					}
+				]
+			}
+		},
+		computed: {
+			totalIntegral() {
+				let total = 0
+				this.customerList.forEach(customer => {
+					const integral = parseInt(customer.integral) || 0
+					total += integral
+				})
+				return total
+			}
+		},
+		methods: {
+			
+			// 显示概览弹窗
+			showOverviewPopup() {
+				this.showOverview = true
+			},
+
+			// 关闭概览弹窗
+			closeOverviewPopup() {
+				this.showOverview = false
+			},
+
+			clearIntegral(customer) {
+				// 使用 $set 确保响应式更新
+				this.$set(customer, 'integral', '')
+			},
+			onIntegralInput(customer) {
+				// 积分输入验证
+				if (customer.integral && parseInt(customer.integral) < 0) {
+					this.$set(customer, 'integral', '0')
+				}
+			},
+			handlePrev() {
+				uni.navigateBack()
+			},
+			submit() {
+				// 重命名方法为 submit 以匹配模板
+				this.handleSubmit();
+				uni.navigateTo({
+					url: '/pages_task/success'
+				})
+			},
+			handleSubmit() {
+				// 验证所有客户积分是否已填写
+				const emptyCustomers = this.customerList.filter(customer => !customer.integral || customer.integral === '')
+				if (emptyCustomers.length > 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请为所有客户设置积分'
+					})
+					return
+				}
+
+				// 验证积分是否为数字
+				const invalidCustomers = this.customerList.filter(customer => {
+					const integral = parseInt(customer.integral)
+					return isNaN(integral) || integral < 0
+				})
+
+				if (invalidCustomers.length > 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请输入有效的积分数值'
+					})
+					return
+				}
+
+				// 提交数据
+				const taskData = {
+					customers: this.customerList.map(customer => ({
+						id: customer.id,
+						name: customer.name,
+						integral: parseInt(customer.integral)
+					})),
+					totalIntegral: this.totalIntegral
+				}
+
+				console.log('提交的任务数据:', taskData)
+
+				// 显示提交成功提示
+				uni.showToast({
+					title: '任务创建成功',
+					success: () => {
+						// 延迟跳转,让用户看到成功提示
+						setTimeout(() => {
+							uni.navigateTo({
+								url: '/pages_task/taskList'
+							})
+						}, 1500)
+					}
+				})
+			},
+			deleteSelected() {
+				// 删除所有客户数据
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除所有客户数据吗?删除后不可恢复。',
+					success: (res) => {
+						if (res.confirm) {
+							// 清空所有客户的积分数据
+							this.customerList.forEach(customer => {
+								this.$set(customer, 'integral', '')
+							})
+
+							uni.showToast({
+								title: '已清空所有客户积分',
+								icon: 'success'
+							})
+						}
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		display: flex;
+		flex-direction: column;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 544rpx;
+			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+		}
+	}
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+		padding-bottom: 200rpx;
+		position: relative;
+	}
+
+	.integral-section {
+		background-color: #ffffff;
+		border-radius: 24rpx;
+		padding: 32rpx 24rpx;
+		margin-bottom: 24rpx;
+
+		.section-header {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 32rpx;
+			padding: 32rpx 0;
+			background: #F5F9FF;
+			border-radius: 16rpx;
+			font-size: 28rpx;
+			color: #666666;
+			text-align: center;
+			font-weight: 600;
+
+			.section-title {
+				flex: 1;
+			}
+
+			.section-subtitle {
+				flex: 1;
+			}
+		}
+
+		.integral-list {
+			.integral-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 32rpx 0;
+				border-bottom: 1rpx solid #F2F3F5;
+
+				&:last-child {
+					border-bottom: none;
+				}
+
+				.customer-info {
+					flex: 1;
+					text-align: center;
+
+					.customer-name {
+						font-size: 32rpx;
+						font-weight: 500;
+						color: #333333;
+					}
+				}
+
+				.integral-input-wrapper {
+					flex: 1;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+
+					.integral-input {
+						width: 100%;
+						font-size: 32rpx;
+						color: #333333;
+						text-align: center;
+						padding: 12rpx 60rpx 12rpx 16rpx;
+						background: #F7F8FA;
+						border-radius: 8rpx;
+
+						&::placeholder {
+							color: #C8C9CC;
+							font-size: 28rpx;
+							text-align: center;
+						}
+
+						&:disabled {
+							background: transparent;
+							opacity: 0.8;
+						}
+					}
+
+					.clear-icon-wrapper {
+						position: absolute;
+						right: 8rpx;
+						width: 48rpx;
+						height: 48rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						z-index: 10;
+						cursor: pointer;
+
+						&:active {
+							opacity: 0.6;
+						}
+
+						.clear-icon {
+							width: 28rpx;
+							height: 28rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/* 概览弹窗样式 */
+	.overview-popup {
+		background-color: #fff;
+		border-radius: 32rpx 32rpx 0 0;
+		max-height: 80vh;
+		overflow-y: auto;
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+
+	.popup-header {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding: 32rpx 40rpx;
+		.popup-title {
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #333333;
+			
+		}
+
+		.close-btn {
+			width: 48rpx;
+			height: 48rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			cursor: pointer;
+			position: absolute;
+			right: 0;
+
+			.close-icon {
+				width: 44rpx;
+				height: 44rpx;
+				margin-right: 32rpx;
+				flex-shrink: 0;
+			}
+
+			&:active {
+				opacity: 0.6;
+			}
+		}
+	}
+
+	.overview-section {
+		padding: 32rpx 40rpx;
+
+		.row {
+			display: flex;
+			align-items: center;
+			margin-bottom: 24rpx;
+
+			&:last-child {
+				border-bottom: none;
+			}
+
+			.line {
+				width: 6rpx;
+				height: 32rpx;
+				background: #388BFF;
+				border-radius: 36rpx;
+				margin-right: 20rpx;
+			}
+
+			.section-title {
+				font-size: 28rpx;
+				font-weight: 600;
+				color: #333333;
+			}
+		}
+
+
+
+
+
+		.info-list {
+			.info-item {
+				display: flex;
+				margin-bottom: 16rpx;
+				align-items: flex-start;
+				font-size: 28rpx;
+
+				&:last-child {
+					margin-bottom: 0;
+				}
+
+				.info-label {
+					color: #999999;
+					flex-shrink: 0;
+					width: 140rpx;
+				}
+
+				.info-value {
+					color: #333333;
+					flex: 1;
+					line-height: 1.4;
+				}
+			}
+		}
+
+		.customer-table {
+			.table-header {
+				display: flex;
+				background: #F5F9FF;
+				border-radius: 8rpx;
+				padding: 20rpx 16rpx;
+				margin-bottom: 8rpx;
+
+				.table-cell {
+					font-size: 24rpx;
+					font-weight: 600;
+					color: #666666;
+					text-align: center;
+				}
+			}
+
+			.table-body {
+				.table-row {
+					display: flex;
+					padding: 20rpx 16rpx;
+					border-bottom: 1rpx solid #F2F3F5;
+
+					&:last-child {
+						border-bottom: none;
+					}
+
+					.table-cell {
+						font-size: 28rpx;
+						color: #333333;
+						text-align: center;
+
+						&:first-child {
+							font-weight: 500;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	.total-section {
+		padding: 32rpx 40rpx;
+		background: #F5F9FF;
+		border-radius: 16rpx;
+		margin: 24rpx 40rpx 40rpx;
+
+		.total-item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 16rpx;
+
+			&:last-child {
+				margin-bottom: 0;
+			}
+
+			.total-label {
+				font-size: 28rpx;
+				color: #666666;
+			}
+
+			.total-value {
+				font-size: 28rpx;
+				font-weight: 600;
+				color: #388BFF;
+			}
+		}
+	}
+
+	.safe-area {
+		height: env(safe-area-inset-bottom);
+	}
+
+	.bottom-bar {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background: #fff;
+		padding: 24rpx 32rpx;
+		border-top: 1rpx solid #F2F3F5;
+		z-index: 100;
+		display: flex;
+		align-items: center;
+
+		.del-box {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			font-size: 24rpx;
+			color: #666666;
+			margin-right: 32rpx;
+			cursor: pointer;
+
+			&:active {
+				opacity: 0.6;
+			}
+		}
+
+		.action-buttons {
+			display: flex;
+			flex: 1;
+			justify-content: space-between;
+
+			.btn {
+				width: 292rpx;
+				height: 88rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				font-weight: 500;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+				cursor: pointer;
+
+				&.btn-cancel {
+					background: #fff;
+					border: 2rpx solid #388BFF;
+					color: #388BFF;
+				}
+
+				&.btn-submit {
+					background: #388BFF;
+					color: #fff;
+				}
+			}
+		}
+	}
+
+	.w40 {
+		width: 40rpx;
+	}
+
+	.h40 {
+		height: 40rpx;
+	}
+</style>

+ 915 - 0
pages_task/fillTask.vue

@@ -0,0 +1,915 @@
+<template>
+	<view class="container">
+		<Step :step="currentStep" :stepsData="currentText" />
+		<scroll-view class="content" scroll-y>
+			<!-- 驳回意见提示 -->
+			<view class="rejection-banner" v-if="rejectionInfo">
+				<view class="rejection-icon">✕</view>
+				<view class="rejection-text">驳回意见: {{ rejectionInfo }}</view>
+			</view>
+
+			<!-- 基本信息 -->
+			<view class="form-section">
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>任务归属</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.institution }"
+						@click="showTaskPopup=true">
+						{{ formData.institution || '请选择任务归属' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>归属项目</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.belongingProject }"
+						@click="showBelongingPopup = true">
+						{{ formData.belongingProject || '请选择归属项目' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>费用分摊</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.costAllocation }"
+						@click="showPicker('费用分摊',costColumns)">
+						{{ formData.costAllocation || '请选择费用分摊主体' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text>添加任务备注</text>
+					</view>
+					<EvanSwitch v-model="formData.addRemark"></EvanSwitch>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>归属类型</text>
+					</view>
+					<text class="txt">院内</text>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>任务类型</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.taskType }"
+						@click="showPicker('任务类型',taskTypeColumns)">
+						{{ formData.taskType || '请选择任务类型' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>计划开始时间</text>
+					</view>
+					<picker mode="date" :value="formData.planStartTime" fields="day" @change="onPlanStartTimeChange">
+						<view class="form-input picker-input" :class="{ placeholder: !formData.planStartTime }">
+							{{ formData.planStartTime || '请选择计划开始时间' }}
+							<image class="icon" src="/static/image/icon_more.png"></image>
+						</view>
+					</picker>
+				</view>
+
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>计划结束时间</text>
+					</view>
+					<picker mode="date" :value="formData.planEndTime" fields="day" @change="onPlanEndTimeChange">
+						<view class="form-input picker-input" :class="{ placeholder: !formData.planEndTime }">
+							{{ formData.planEndTime || '请选择计划结束时间' }}
+							<image class="icon" src="/static/image/icon_more.png"></image>
+						</view>
+					</picker>
+				</view>
+
+				<!-- 观看方式 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>观看方式</text>
+					</view>
+					<view class="radio-group">
+						<label class="radio-item" :class="{ active: formData.viewMode === '公开' }"
+							@click="formData.viewMode = '公开'">
+							<image class="radio-circle" v-if="formData.viewMode === '公开'"
+								src="/static/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+							<text>公开</text>
+						</label>
+						<label class="radio-item" :class="{ active: formData.viewMode === '加密' }"
+							@click="formData.viewMode = '加密'">
+							<image class="radio-circle" v-if="formData.viewMode === '加密'"
+								src="/static/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+							<text>加密</text>
+						</label>
+					</view>
+				</view>
+
+				<!-- 观看要求 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>观看要求</text>
+					</view>
+					<view class="radio-group">
+						<label class="radio-item" :class="{ active: formData.viewRequire === '登录账户' }"
+							@click="formData.viewRequire = '登录账户'">
+							<!-- <view class="radio-circle" :class="{ checked: formData.viewRequire === '登录账户' }"></view> -->
+							<image class="radio-circle" v-if="formData.viewRequire === '登录账户'"
+								src="/static/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+							<text>登录账户</text>
+						</label>
+						<label class="radio-item" :class="{ active: formData.viewRequire === '认证客户' }"
+							@click="formData.viewRequire = '认证客户'">
+							<image class="radio-circle" v-if="formData.viewRequire === '认证客户'"
+								src="/static/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+							<text>认证客户</text>
+						</label>
+					</view>
+				</view>
+			</view>
+			<view class="form-section">
+				<!-- 直播间标题 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>直播间标题</text>
+					</view>
+					<view class="form-input">
+						<input v-model="formData.roomTitle" placeholder="请输入直播间标题" />
+					</view>
+				</view>
+
+				<!-- 封面图 -->
+				<view class="form-item column baseline">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>封面图</text>
+					</view>
+					<view class="upload-area" @click="chooseCoverImage">
+						<image v-if="formData.coverImage" :src="formData.coverImage" class="cover-image" />
+						<view v-else class="upload-placeholder">
+							<text>点击上传封面图</text>
+						</view>
+						<image v-if="formData.coverImage" class="delete-icon" src="/static/image/icon_cross.png"
+							@click.stop="deleteCoverImage" />
+					</view>
+				</view>
+			</view>
+			<view class="form-section">
+				<!-- 申请补充讲者任务 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>申请补充讲者任务</text>
+					</view>
+					<EvanSwitch v-model="formData.applySpeaker"></EvanSwitch>
+				</view>
+			</view>
+		</scroll-view>
+
+		<view class="next-button" @click="toNext">下一步</view>
+
+		<!-- 通用选择器 -->
+		<u-picker :title='pickerTitle' :show="showPickerVisible" confirmColor='#576B95' ref="uPicker"
+			:columns="pickerData" @confirm="confirm" @cancel="cancel">
+		</u-picker>
+
+		<!-- 归属项目弹窗 -->
+		<u-popup :show="showBelongingPopup" mode="bottom" round="20" @close="closePopup" closeable>
+			<view class="popup-content p32">
+				<view class="popup-header">
+					<text class="title">归属项目</text>
+				</view>
+				<view class="search-box">
+					<image class="icon" src="/static/image/search.png"></image>
+					<u-input v-model="searchKeyword" placeholder="请输入归属项目" border="none" clearable />
+				</view>
+				<scroll-view scroll-y class="project-list">
+					<view v-for="(project, index) in filteredProjects" :key="index" class="project-item"
+						:class="{ active: selectedIndex === index }" @tap="selectProject(project, index)">
+						<text class="project-name">{{ project.name }}</text>
+						<image class="icon" src="/static/image/icon_right.png"></image>
+					</view>
+				</scroll-view>
+			</view>
+		</u-popup>
+
+		<!-- 任务归属弹窗 -->
+		<u-popup :show="showTaskPopup" mode="bottom" round="16" @close="showTaskPopup = false" safeAreaInsetBottom>
+			<view class="popup-content">
+				<view class="popup-header">
+					<text class="popup-title">任务归属</text>
+					<image class="close-icon" src="/static/image/icon_cross.png" @click="showTaskPopup=false"></image>
+				</view>
+				<view class="two-level-container">
+					<scroll-view class="primary-list" scroll-y>
+						<view v-for="(item, index) in primaryOptions" :key="index" class="primary-item"
+							:class="{ 'primary-active': activePrimaryIndex === index }"
+							@click="handlePrimarySelect(index)">
+							<text class="primary-text">{{ item.name }}</text>
+						</view>
+					</scroll-view>
+					<scroll-view class="secondary-list" scroll-y>
+						<view v-for="(subItem, subIndex) in currentSecondaryOptions" :key="subIndex"
+							class="secondary-item" :class="{ 'secondary-active': selectedSecondaryItem === subItem }"
+							@click="handleSecondarySelect(subItem)">
+							<text class="secondary-text">{{ subItem }}</text>
+							<u-icon v-if="selectedSecondaryItem === subItem" name="checkbox-mark" color="#2979ff"
+								size="20" />
+						</view>
+					</scroll-view>
+				</view>
+				<view class="popup-footer">
+					<button class="confirm-btn" @click="handleConfirm">确定</button>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import Step from '@/pages_task/components/step.vue'
+	import EvanSwitch from '@/components/evan-switch.vue'
+
+	export default {
+		components: {
+			Step,
+			EvanSwitch
+		},
+		data() {
+			return {
+				showTaskPopup: false,
+				primaryOptions: [{
+						id: 1,
+						name: '中药事业部',
+						children: ['中药一部', '中药二部', '中药三部', '中药四部']
+					},
+					{
+						id: 2,
+						name: '事业1组',
+						children: ['事业1组-项目部', '事业1组-市场部', '事业1组-技术部']
+					},
+					{
+						id: 3,
+						name: '学术研究部',
+						children: ['学术研究一部', '学术研究二部', '学术研究三部']
+					},
+					{
+						id: 4,
+						name: '湖南省药学服务公司',
+						children: ['药学服务一部', '药学服务二部', '药学服务三部']
+					},
+					{
+						id: 5,
+						name: '医药事业部',
+						children: ['医药一部', '医药二部', '医药三部']
+					},
+					{
+						id: 6,
+						name: '医疗事业部',
+						children: ['医疗一部', '医疗二部', '医疗三部']
+					},
+					{
+						id: 7,
+						name: '健康管理部',
+						children: ['健康管理一部', '健康管理二部']
+					},
+					{
+						id: 8,
+						name: '医疗事业部',
+						children: ['医疗一部', '医疗二部', '医疗三部']
+					},
+					{
+						id: 9,
+						name: '健康管理部',
+						children: ['健康管理一部', '健康管理二部']
+					}
+				],
+				activePrimaryIndex: 0,
+				currentSecondaryOptions: [],
+				selectedSecondaryItem: '',
+				selectedPrimaryItem: null,
+				selectedIndex: -1,
+				selectedProject: null,
+				belongingprojects: [{
+						name: '学术交流项目'
+					},
+					{
+						name: '科学调研项目'
+					},
+					{
+						name: '2026年1月医学研究项目'
+					},
+					{
+						name: '2026年2月医学研究项目'
+					},
+					{
+						name: '2026年3月医学研究项目'
+					}
+				],
+				searchKeyword: '',
+				showBelongingPopup: false,
+				showPickerVisible: false,
+				costColumns: [
+					['主体1', '主体2', '主体3']
+				],
+				taskTypeColumns: [
+					['类型1', '类型2', '类型3']
+				],
+				currentStep: 1,
+				currentText: [{
+						id: 1,
+						stepNumber: 1,
+						title: '填写任务'
+					},
+					{
+						id: 2,
+						stepNumber: 2,
+						title: '积分设置'
+					}
+				],
+				rejectionInfo: '',
+				// 核心修复:所有表单字段统一放在formData里
+				formData: {
+					costAllocation: '',
+					planStartTime: '',
+					planEndTime: '',
+					institution: '',
+					belongingProject: '',
+					taskType: '',
+					addRemark: false,
+					viewMode: '公开', // 观看方式默认值
+					viewRequire: '登录账户', // 观看要求默认值
+					roomTitle: '', // 直播间标题
+					coverImage: '', // 封面图
+					applySpeaker: true // 申请补充讲者任务
+				},
+				pickerTitle: '默认标题',
+				pickerData: []
+			}
+		},
+		onLoad(options) {
+			if (options.rejectionInfo) {
+				this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
+			}
+			// 初始化二级选项
+			this.currentSecondaryOptions = this.primaryOptions[0]?.children || []
+		},
+		computed: {
+			filteredProjects() {
+				if (!this.searchKeyword.trim()) {
+					return this.belongingprojects;
+				}
+				return this.belongingprojects.filter(project =>
+					project.name.includes(this.searchKeyword)
+				);
+			}
+		},
+		methods: {
+			// 封面图上传
+			chooseCoverImage() {
+				uni.chooseImage({
+					count: 1,
+					sizeType: ['compressed'],
+					sourceType: ['album', 'camera'],
+					success: (res) => {
+						this.formData.coverImage = res.tempFilePaths[0]
+					}
+				})
+			},
+			// 删除封面图
+			deleteCoverImage() {
+				this.formData.coverImage = ''
+			},
+			// 一级分类选择
+			handlePrimarySelect(index) {
+				this.activePrimaryIndex = index;
+				this.currentSecondaryOptions = this.primaryOptions[index].children || [];
+				this.selectedSecondaryItem = '';
+			},
+			// 二级分类选择
+			handleSecondarySelect(item) {
+				this.selectedSecondaryItem = item;
+				this.selectedPrimaryItem = this.primaryOptions[this.activePrimaryIndex];
+			},
+			// 任务归属确认
+			handleConfirm() {
+				if (this.selectedSecondaryItem) {
+					const displayText = `${this.selectedPrimaryItem.name} > ${this.selectedSecondaryItem}`;
+					this.formData.institution = displayText;
+					this.showTaskPopup = false;
+				} else {
+					uni.showToast({
+						title: '请选择二级部门',
+						icon: 'none'
+					});
+				}
+			},
+			// 关闭归属项目弹窗
+			closePopup() {
+				this.showBelongingPopup = false;
+				this.searchKeyword = '';
+				this.selectedIndex = -1;
+			},
+			// 选择归属项目
+			selectProject(project, index) {
+				this.selectedIndex = index;
+				this.selectedProject = project;
+				this.formData.belongingProject = project.name;
+				setTimeout(() => {
+					this.showBelongingPopup = false;
+					this.searchKeyword = '';
+					this.selectedIndex = -1;
+				}, 300);
+			},
+			// 打开通用选择器
+			showPicker(title, data) {
+				this.pickerData = data
+				this.pickerTitle = title
+				this.showPickerVisible = true
+			},
+			// 通用选择器确认
+			confirm(e) {
+				if (e.value && e.value.length > 0) {
+					if (this.pickerTitle === '费用分摊') {
+						this.formData.costAllocation = e.value[0]
+					} else if (this.pickerTitle === '任务类型') {
+						this.formData.taskType = e.value[0]
+					}
+				}
+				this.showPickerVisible = false
+			},
+			// 通用选择器取消
+			cancel() {
+				this.showPickerVisible = false
+			},
+			// 下一步
+			toNext() {
+				uni.navigateTo({
+					url: '/pages_task/editSelectCustomer'
+				})
+			},
+			// 计划开始时间选择
+			onPlanStartTimeChange(e) {
+				this.formData.planStartTime = e.detail.value
+			},
+			// 计划结束时间选择
+			onPlanEndTimeChange(e) {
+				this.formData.planEndTime = e.detail.value
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.column {
+		flex-direction: column;
+	}
+
+	.baseline {
+		align-items: baseline !important;
+	}
+
+	// 页面容器样式
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		display: flex;
+		flex-direction: column;
+		position: relative;
+
+		// 顶部渐变背景
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 544rpx;
+			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+		}
+
+		// 滚动内容区
+		.content {
+			flex: 1;
+			box-sizing: border-box;
+
+			// 驳回提示
+			.rejection-banner {
+				display: flex;
+				align-items: center;
+				padding: 24rpx;
+				background: #FF5030;
+				color: #fff;
+				margin: 24rpx;
+				border-radius: 8rpx;
+
+				.rejection-icon {
+					width: 40rpx;
+					height: 40rpx;
+					border-radius: 50%;
+					background: rgba(255, 255, 255, 0.3);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: 24rpx;
+					margin-right: 16rpx;
+				}
+
+				.rejection-text {
+					flex: 1;
+					font-size: 28rpx;
+					line-height: 1.5;
+				}
+			}
+
+			// 表单区域
+			.form-section {
+				background: #fff;
+				margin: 20rpx;
+				border-radius: 24rpx;
+				padding: 32rpx;
+
+				// 表单项
+				.form-item {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #EBEDF0;
+					padding: 30rpx 0;
+
+					&:last-child {
+						border-bottom: 0;
+					}
+
+					// 表单标签
+					.form-label {
+						display: flex;
+						align-items: center;
+						font-size: 28rpx;
+						color: #333;
+						margin-bottom: 16rpx;
+
+						.required {
+							color: #CF3546;
+							margin-right: 4rpx;
+						}
+					}
+
+					// 纯文本展示
+					.txt {
+						font-size: 28rpx;
+						color: #333333;
+					}
+
+					// 输入框容器
+					.form-input {
+						flex: 1;
+						font-size: 28rpx;
+						color: #C8C9CC;
+						text-align: end;
+
+						&.placeholder {
+							color: #C8C9CC;
+						}
+
+						&.picker-input {
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+						}
+
+						.icon {
+							width: 36rpx;
+							height: 36rpx;
+						}
+					}
+
+					// 单选组样式(嵌套到form-item里)
+					.radio-group {
+						display: flex;
+						gap: 40rpx;
+
+						.radio-item {
+							display: flex;
+							align-items: center;
+							font-size: 28rpx;
+
+							.radio-circle {
+								width: 36rpx;
+								height: 36rpx;
+								border-radius: 50%;
+								margin-right: 16rpx;
+							}
+
+						}
+					}
+
+					// 上传区域样式(嵌套到form-item里)
+					.upload-area {
+						position: relative;
+						width: 200rpx;
+						height: 120rpx;
+						border: 1rpx dashed #C8C9CC;
+						border-radius: 8rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+
+						.cover-image {
+							width: 100%;
+							height: 100%;
+							border-radius: 8rpx;
+						}
+
+						.upload-placeholder {
+							color: #C8C9CC;
+							font-size: 24rpx;
+						}
+
+						.delete-icon {
+							position: absolute;
+							top: -12rpx;
+							right: -12rpx;
+							width: 32rpx;
+							height: 32rpx;
+							background: #fff;
+							border-radius: 50%;
+						}
+					}
+				}
+			}
+		}
+
+		// 下一步按钮
+		.next-button {
+			text-align: center;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			height: 88rpx;
+			line-height: 88rpx;
+			background: #388BFF;
+			border-radius: 200rpx;
+			margin: 32rpx;
+		}
+	}
+
+	// 弹窗样式
+	::v-deep .u-popup__content {
+		border-radius: 40rpx 40rpx 0 0 !important;
+	}
+
+	.popup-content {
+		border-radius: 40rpx 40rpx 0rpx 0rpx;
+		height: 70vh;
+		background-color: #fff;
+
+		.popup-header {
+			padding: 40rpx 30rpx 20rpx;
+			text-align: center;
+
+			.close-icon {
+				width: 44rpx;
+				height: 44rpx;
+				position: absolute;
+				right: 32rpx;
+			}
+
+			flex-shrink: 0;
+
+			.title,
+			.popup-title {
+				font-size: 32rpx;
+				font-weight: 600;
+				color: #333;
+			}
+		}
+
+		.search-box {
+			display: flex;
+			align-items: center;
+			background: #F7F8FA;
+			border-radius: 38rpx;
+			padding: 16rpx 28rpx;
+			margin-bottom: 24rpx;
+
+			.icon {
+				width: 26rpx;
+				height: 26rpx;
+				margin-right: 10rpx;
+			}
+		}
+
+		.project-list {
+			height: calc(100% - 200rpx);
+
+			.project-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 28rpx 0;
+				font-size: 28rpx;
+				border-bottom: 1rpx solid #eee;
+
+				&:active {
+					background-color: #f9f9f9;
+				}
+
+				&.active {
+					.project-name {
+						font-weight: 500;
+						color: #388BFF;
+					}
+
+					.icon {
+						opacity: 1;
+					}
+				}
+
+				.project-name {
+					color: #333;
+					transition: all 0.2s ease;
+				}
+
+				.icon {
+					width: 36rpx;
+					height: 36rpx;
+					opacity: 0;
+					transition: opacity 0.2s ease;
+				}
+			}
+		}
+
+		.two-level-container {
+			display: flex;
+			flex: 1;
+			border-top: 1rpx solid #f5f5f5;
+
+			.primary-list {
+				width: 40%;
+				background-color: #f8f9fa;
+
+				.primary-item {
+					padding: 28rpx 20rpx;
+					background: #F2F3F5;
+
+					&:active {
+						background: #FFFFFF;
+					}
+
+					&.primary-active {
+						position: relative;
+						background-color: #fff;
+
+						&::before {
+							content: '';
+							position: absolute;
+							top: 50%;
+							left: 0;
+							transform: translateY(-50%);
+							width: 8rpx;
+							height: 32rpx;
+							background: #388BFF;
+						}
+
+						.primary-text {
+							font-weight: 500;
+						}
+					}
+
+					.primary-text {
+						font-size: 28rpx;
+						color: #666;
+					}
+				}
+			}
+
+			.secondary-list {
+				width: 60%;
+				padding: 0 20rpx;
+
+				.secondary-item {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 28rpx 10rpx;
+					font-size: 28rpx;
+					color: #333;
+
+					&.secondary-active {
+						font-weight: 500;
+						color: #388BFF;
+					}
+				}
+			}
+		}
+
+		.popup-footer {
+			padding: 20rpx 30rpx 40rpx;
+			background-color: #fff;
+			border-top: 1rpx solid #f5f5f5;
+			flex-shrink: 0;
+
+			.confirm-btn {
+				width: 100%;
+				height: 88rpx;
+				line-height: 88rpx;
+				background-color: #2979ff;
+				color: #fff;
+				font-size: 32rpx;
+				border-radius: 200rpx;
+
+				&:active {
+					opacity: 0.8;
+				}
+			}
+		}
+	}
+
+	// 暗黑模式适配
+	@media (prefers-color-scheme: dark) {
+		.popup-content {
+			background-color: #1e1e1e;
+
+			.popup-header {
+
+				.title,
+				.popup-title {
+					color: #fff;
+				}
+			}
+
+			.two-level-container {
+				.primary-list {
+					background-color: #2d2d2d;
+					border-right-color: #3d3d3d;
+
+					.primary-item {
+						border-bottom-color: #3d3d3d;
+
+						&:active {
+							background-color: #3d3d3d;
+						}
+
+						&.primary-active {
+							background-color: #3d3d3d;
+
+							.primary-text {
+								color: #2979ff;
+							}
+						}
+
+						.primary-text {
+							color: #ccc;
+						}
+					}
+				}
+
+				.secondary-list {
+					.secondary-item {
+						border-bottom-color: #3d3d3d;
+
+						&:active {
+							background-color: #3d3d3d;
+						}
+
+						&.secondary-active {
+							background-color: #2d2d2d;
+						}
+
+						.secondary-text {
+							color: #fff;
+						}
+					}
+				}
+			}
+
+			.popup-footer {
+				background-color: #1e1e1e;
+				border-top-color: #3d3d3d;
+			}
+		}
+	}
+</style>

+ 669 - 0
pages_task/pointsSettings.vue

@@ -0,0 +1,669 @@
+<template>
+	<view class="container">
+		<Step :step="currentStep" :stepsData="currentText" />
+
+		<scroll-view class="content" scroll-y>
+			<!-- 客户积分设置列表 -->
+			<view class="integral-section">
+				<view class="section-header">
+					<view class="section-title">客户姓名</view>
+					<view class="section-subtitle">积分数值</view>
+				</view>
+
+				<view class="integral-list">
+					<view class="integral-item" v-for="(customer, index) in customerList" :key="customer.id">
+						<view class="customer-info">
+							<view class="customer-name">{{ customer.name }}</view>
+						</view>
+						<view class="integral-input-wrapper">
+							<input class="integral-input" type="number" :placeholder="customer.placeholder"
+								v-model="customer.integral" :disabled="customer.disabled"
+								@input="onIntegralInput(customer)" />
+							<view v-if="customer.integral" class="clear-icon-wrapper"
+								@click.stop="clearIntegral(customer)">
+								<image class="clear-icon" src="/static/image/icon_clear.png"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+
+		<!-- 概览悬浮按钮 -->
+		<view class="suspension" @click="showOverviewPopup">概览</view>
+
+		<!-- 概览弹窗 -->
+		<!-- :show="showOverview" -->
+		<u-popup :show="showOverview" mode="bottom" @close="closeOverviewPopup" round="20" :safeAreaInsetBottom="true">
+			<view class="overview-popup">
+				<!-- 弹窗头部 -->
+				<view class="popup-header">
+					<text class="popup-title">概览</text>
+					<view class="close-btn" @click="closeOverviewPopup">
+						<image class="close-icon" src="/static/image/icon_close.png"></image>
+					</view>
+				</view>
+
+				<!-- 任务信息 -->
+				<view class="overview-section">
+					<view class="row">
+						<text class="line"></text>
+						<view class="section-title">任务信息</view>
+					</view>
+					<view class="info-list">
+						<view class="info-item">
+							<view class="info-label">项目归属:</view>
+							<view class="info-value">湖南省药学服务公司</view>
+						</view>
+						<view class="info-item">
+							<view class="info-label">项目任务:</view>
+							<view class="info-value">科普文章</view>
+						</view>
+						<view class="info-item">
+							<view class="info-label">项目时间:</view>
+							<view class="info-value">2025/11/19 14:12~2025/11/19 14:12</view>
+						</view>
+					</view>
+				</view>
+
+				<!-- 客户信息 -->
+				<view class="overview-section">
+					<view class="row">
+						<text class="line"></text>
+						<view class="section-title">客户信息</view>
+					</view>
+					<view class="customer-table">
+						<!-- 表头 -->
+						<view class="table-header">
+							<view class="table-cell" style="flex: 1.5;">姓名</view>
+							<view class="table-cell" style="flex: 1;">级别</view>
+							<view class="table-cell" style="flex: 1;">积分</view>
+							<view class="table-cell" style="flex: 2;">联系方式</view>
+						</view>
+
+						<!-- 表格内容 -->
+						<view class="table-body">
+							<view class="table-row" v-for="(customer, index) in customerList" :key="customer.id">
+								<view class="table-cell" style="flex: 1.5;">{{ customer.name }}</view>
+								<view class="table-cell" style="flex: 1;">一级</view>
+								<view class="table-cell" style="flex: 1;">{{ customer.integral || '0' }}</view>
+								<view class="table-cell" style="flex: 2;">177****4235</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- 安全区域占位 -->
+				<view class="safe-area"></view>
+			</view>
+		</u-popup>
+
+		<!-- 底部操作栏 -->
+		<view class="bottom-bar">
+			<view class="del-box" @click="deleteSelected">
+				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<text>删除</text>
+			</view>
+			<view class="action-buttons">
+				<view class="btn btn-cancel" @click="handlePrev">上一步</view>
+				<view class="btn btn-submit" @click="submit">提交</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Step from '@/pages_task/components/step.vue'
+	export default {
+		components: {
+			Step
+		},
+		data() {
+			return {currentText: [{
+						id: 1,
+						stepNumber: 1,
+						title: '填写任务'
+					},
+					{
+						id: 2,
+						stepNumber: 2,
+						title: '选择客户'
+					},
+					{
+						id: 3,
+						stepNumber: 3,
+						title: '积分设置'
+					}
+				],
+				currentStep: 3,
+				showOverview: false, // 控制概览弹窗显示
+				customerList: [{
+						id: 1,
+						name: '王小明',
+						integral: '30',
+						placeholder: '请输入积分',
+						disabled: false
+					},
+					{
+						id: 2,
+						name: '李洋',
+						integral: '',
+						placeholder: '请输入积分',
+						disabled: false
+					},
+					{
+						id: 3,
+						name: '钱小燕',
+						integral: '',
+						placeholder: '请输入积分',
+						disabled: false
+					}
+				]
+			}
+		},
+		computed: {
+			totalIntegral() {
+				let total = 0
+				this.customerList.forEach(customer => {
+					const integral = parseInt(customer.integral) || 0
+					total += integral
+				})
+				return total
+			}
+		},
+		methods: {
+			
+			// 显示概览弹窗
+			showOverviewPopup() {
+				this.showOverview = true
+			},
+
+			// 关闭概览弹窗
+			closeOverviewPopup() {
+				this.showOverview = false
+			},
+
+			clearIntegral(customer) {
+				// 使用 $set 确保响应式更新
+				this.$set(customer, 'integral', '')
+			},
+			onIntegralInput(customer) {
+				// 积分输入验证
+				if (customer.integral && parseInt(customer.integral) < 0) {
+					this.$set(customer, 'integral', '0')
+				}
+			},
+			handlePrev() {
+				uni.navigateBack()
+			},
+			submit() {
+				// 重命名方法为 submit 以匹配模板
+				this.handleSubmit();
+				uni.navigateTo({
+					url: '/pages_task/success'
+				})
+			},
+			handleSubmit() {
+				// 验证所有客户积分是否已填写
+				const emptyCustomers = this.customerList.filter(customer => !customer.integral || customer.integral === '')
+				if (emptyCustomers.length > 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请为所有客户设置积分'
+					})
+					return
+				}
+
+				// 验证积分是否为数字
+				const invalidCustomers = this.customerList.filter(customer => {
+					const integral = parseInt(customer.integral)
+					return isNaN(integral) || integral < 0
+				})
+
+				if (invalidCustomers.length > 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请输入有效的积分数值'
+					})
+					return
+				}
+
+				// 提交数据
+				const taskData = {
+					customers: this.customerList.map(customer => ({
+						id: customer.id,
+						name: customer.name,
+						integral: parseInt(customer.integral)
+					})),
+					totalIntegral: this.totalIntegral
+				}
+
+				console.log('提交的任务数据:', taskData)
+
+				// 显示提交成功提示
+				uni.showToast({
+					title: '任务创建成功',
+					success: () => {
+						// 延迟跳转,让用户看到成功提示
+						setTimeout(() => {
+							uni.navigateTo({
+								url: '/pages_task/taskList'
+							})
+						}, 1500)
+					}
+				})
+			},
+			deleteSelected() {
+				// 删除所有客户数据
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除所有客户数据吗?删除后不可恢复。',
+					success: (res) => {
+						if (res.confirm) {
+							// 清空所有客户的积分数据
+							this.customerList.forEach(customer => {
+								this.$set(customer, 'integral', '')
+							})
+
+							uni.showToast({
+								title: '已清空所有客户积分',
+								icon: 'success'
+							})
+						}
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		display: flex;
+		flex-direction: column;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 544rpx;
+			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+		}
+	}
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+		padding-bottom: 200rpx;
+		position: relative;
+	}
+
+	.integral-section {
+		background-color: #ffffff;
+		border-radius: 24rpx;
+		padding: 32rpx 24rpx;
+		margin-bottom: 24rpx;
+
+		.section-header {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 32rpx;
+			padding: 32rpx 0;
+			background: #F5F9FF;
+			border-radius: 16rpx;
+			font-size: 28rpx;
+			color: #666666;
+			text-align: center;
+			font-weight: 600;
+
+			.section-title {
+				flex: 1;
+			}
+
+			.section-subtitle {
+				flex: 1;
+			}
+		}
+
+		.integral-list {
+			.integral-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 32rpx 0;
+				border-bottom: 1rpx solid #F2F3F5;
+
+				&:last-child {
+					border-bottom: none;
+				}
+
+				.customer-info {
+					flex: 1;
+					text-align: center;
+
+					.customer-name {
+						font-size: 32rpx;
+						font-weight: 500;
+						color: #333333;
+					}
+				}
+
+				.integral-input-wrapper {
+					flex: 1;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+
+					.integral-input {
+						width: 100%;
+						font-size: 32rpx;
+						color: #333333;
+						text-align: center;
+						padding: 12rpx 60rpx 12rpx 16rpx;
+						background: #F7F8FA;
+						border-radius: 8rpx;
+
+						&::placeholder {
+							color: #C8C9CC;
+							font-size: 28rpx;
+							text-align: center;
+						}
+
+						&:disabled {
+							background: transparent;
+							opacity: 0.8;
+						}
+					}
+
+					.clear-icon-wrapper {
+						position: absolute;
+						right: 8rpx;
+						width: 48rpx;
+						height: 48rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						z-index: 10;
+						cursor: pointer;
+
+						&:active {
+							opacity: 0.6;
+						}
+
+						.clear-icon {
+							width: 28rpx;
+							height: 28rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	.suspension {
+		position: fixed;
+		text-align: center;
+		line-height: 96rpx;
+		right: 36rpx;
+		top: 70%;
+		width: 96rpx;
+		height: 96rpx;
+		background: linear-gradient(0deg, #388BFF 0%, #388BFF 100%);
+		box-shadow: inset 0rpx 4rpx 8rpx 0rpx rgba(255, 255, 255, 0.25),
+			inset 0rpx -6rpx 8rpx 0rpx rgba(255, 255, 255, 0.25),
+			4rpx 8rpx 12rpx 0rpx rgba(88, 144, 239, 0.29);
+		border-radius: 110rpx;
+		font-size: 28rpx;
+		color: #FFFFFF;
+		z-index: 999;
+		cursor: pointer;
+
+		&:active {
+			opacity: 0.8;
+		}
+	}
+
+	/* 概览弹窗样式 */
+	.overview-popup {
+		background-color: #fff;
+		border-radius: 32rpx 32rpx 0 0;
+		max-height: 80vh;
+		overflow-y: auto;
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+
+	.popup-header {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding: 32rpx 40rpx;
+		.popup-title {
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #333333;
+			
+		}
+
+		.close-btn {
+			width: 48rpx;
+			height: 48rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			cursor: pointer;
+			position: absolute;
+			right: 0;
+
+			.close-icon {
+				width: 44rpx;
+				height: 44rpx;
+				margin-right: 32rpx;
+				flex-shrink: 0;
+			}
+
+			&:active {
+				opacity: 0.6;
+			}
+		}
+	}
+
+	.overview-section {
+		padding: 32rpx 40rpx;
+
+		.row {
+			display: flex;
+			align-items: center;
+			margin-bottom: 24rpx;
+
+			&:last-child {
+				border-bottom: none;
+			}
+
+			.line {
+				width: 6rpx;
+				height: 32rpx;
+				background: #388BFF;
+				border-radius: 36rpx;
+				margin-right: 20rpx;
+			}
+
+			.section-title {
+				font-size: 28rpx;
+				font-weight: 600;
+				color: #333333;
+			}
+		}
+
+
+
+
+
+		.info-list {
+			.info-item {
+				display: flex;
+				margin-bottom: 16rpx;
+				align-items: flex-start;
+				font-size: 28rpx;
+
+				&:last-child {
+					margin-bottom: 0;
+				}
+
+				.info-label {
+					color: #999999;
+					flex-shrink: 0;
+					width: 140rpx;
+				}
+
+				.info-value {
+					color: #333333;
+					flex: 1;
+					line-height: 1.4;
+				}
+			}
+		}
+
+		.customer-table {
+			.table-header {
+				display: flex;
+				background: #F5F9FF;
+				border-radius: 8rpx;
+				padding: 20rpx 16rpx;
+				margin-bottom: 8rpx;
+
+				.table-cell {
+					font-size: 24rpx;
+					font-weight: 600;
+					color: #666666;
+					text-align: center;
+				}
+			}
+
+			.table-body {
+				.table-row {
+					display: flex;
+					padding: 20rpx 16rpx;
+					border-bottom: 1rpx solid #F2F3F5;
+
+					&:last-child {
+						border-bottom: none;
+					}
+
+					.table-cell {
+						font-size: 28rpx;
+						color: #333333;
+						text-align: center;
+
+						&:first-child {
+							font-weight: 500;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	.total-section {
+		padding: 32rpx 40rpx;
+		background: #F5F9FF;
+		border-radius: 16rpx;
+		margin: 24rpx 40rpx 40rpx;
+
+		.total-item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 16rpx;
+
+			&:last-child {
+				margin-bottom: 0;
+			}
+
+			.total-label {
+				font-size: 28rpx;
+				color: #666666;
+			}
+
+			.total-value {
+				font-size: 28rpx;
+				font-weight: 600;
+				color: #388BFF;
+			}
+		}
+	}
+
+	.safe-area {
+		height: env(safe-area-inset-bottom);
+	}
+
+	.bottom-bar {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background: #fff;
+		padding: 24rpx 32rpx;
+		border-top: 1rpx solid #F2F3F5;
+		z-index: 100;
+		display: flex;
+		align-items: center;
+
+		.del-box {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			font-size: 24rpx;
+			color: #666666;
+			margin-right: 32rpx;
+			cursor: pointer;
+
+			&:active {
+				opacity: 0.6;
+			}
+		}
+
+		.action-buttons {
+			display: flex;
+			flex: 1;
+			justify-content: space-between;
+
+			.btn {
+				width: 292rpx;
+				height: 88rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				font-weight: 500;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+				cursor: pointer;
+
+				&.btn-cancel {
+					background: #fff;
+					border: 2rpx solid #388BFF;
+					color: #388BFF;
+				}
+
+				&.btn-submit {
+					background: #388BFF;
+					color: #fff;
+				}
+			}
+		}
+	}
+
+	.w40 {
+		width: 40rpx;
+	}
+
+	.h40 {
+		height: 40rpx;
+	}
+</style>

+ 534 - 0
pages_task/selectCustomer.vue

@@ -0,0 +1,534 @@
+<template>
+	<view class="container">
+		<Step :step="currentStep" :stepsData="currentText" />
+
+		<scroll-view class="content" scroll-y>
+			<!-- 搜索栏 -->
+			<view class="search-section">
+				<view class="search-input-wrapper">
+					<image class="search-icon" src="/static/image/icon_search.png"></image>
+					<input class="search-input" type="text" placeholder="输入客户名称" v-model="searchKeyword"
+						@input="handleSearch" />
+					<image class="clear-icon" src="/static/image/icon_clear.png" v-if="searchKeyword"
+						@click="clearSearch"></image>
+				</view>
+				<view class="section-title">已选择 {{ selectedCustomers.length }} 人:</view>
+				<view class="selected-tags">
+					<view class="selected-tag" v-for="(customer, index) in selectedCustomers" :key="customer.id">
+						<text class="tag-name">{{ customer.name }}</text>
+						<text class="tag-remove" @click="removeCustomer(customer.id)">×</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 已选择客户 -->
+			<view class="selected-section">
+
+			</view>
+
+
+			<!-- 客户列表 -->
+			<view class="customer-list">
+				<view class="customer-item" :class="{ active: isSelected(customer.id) }"
+					v-for="(customer, index) in filteredCustomers" :key="customer.id" @click="toggleCustomer(customer)">
+					<view class="left">
+						<image class="head" src="/static/image/img_avatar_client.png"></image>
+						<view class="customer-info">
+							<view class="customer-header">
+								<view class="customer-name">{{ customer.name }}</view>
+								<view class="customer-level">{{ customer.level }}</view>
+							</view>
+							<view class="customer-details">
+								<view class="customer-hospital">{{ customer.hospital }}</view>
+								<view class="customer-department">{{ customer.department }}</view>
+							</view>
+						</view>
+					</view>
+					<checkbox :value="customer.id" :checked="isSelected(customer.id)" @click.stop="toggleCustomer(customer)"
+						color="#388BFF" />
+				</view>
+			</view>
+		</scroll-view>
+
+		<!-- 底部操作栏 -->
+		<view class="bottom-bar">
+			<view class="del-box" @click="deleteSelected">
+				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<text>删除</text>
+			</view>
+			<view class="action-buttons">
+				<view class="btn btn-cancel" @click="handlePrev">上一步</view>
+				<view class="btn btn-submit" @click="handleNext">下一步</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Step from '@/pages_task/components/step.vue'
+	export default {
+		components: {
+			Step
+		},
+		data() {
+			return {
+				currentText: [{
+						id: 1,
+						stepNumber: 1,
+						title: '填写任务'
+					},
+					{
+						id: 2,
+						stepNumber: 2,
+						title: '选择客户'
+					},
+					{
+						id: 3,
+						stepNumber: 3,
+						title: '积分设置'
+					}
+				],
+				currentStep: 2,
+				searchKeyword: '',
+				selectedCustomers: [{
+						id: 1,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 2,
+						name: '李洋',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					}
+				],
+				customerList: [{
+						id: 1,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 2,
+						name: '李洋',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 3,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 4,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 5,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					},
+					{
+						id: 6,
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科'
+					}
+				]
+			}
+		},
+		computed: {
+			filteredCustomers() {
+				if (!this.searchKeyword.trim()) {
+					return this.customerList
+				}
+				const keyword = this.searchKeyword.toLowerCase()
+				return this.customerList.filter(customer =>
+					customer.name.toLowerCase().includes(keyword) ||
+					customer.hospital.toLowerCase().includes(keyword) ||
+					customer.department.toLowerCase().includes(keyword)
+				)
+			}
+		},
+		methods: {
+			handleSearch() {
+				// 搜索逻辑已经在computed中处理
+			},
+			clearSearch() {
+				this.searchKeyword = ''
+			},
+			isSelected(customerId) {
+				return this.selectedCustomers.some(customer => customer.id === customerId)
+			},
+			toggleCustomer(customer) {
+				const index = this.selectedCustomers.findIndex(item => item.id === customer.id)
+				if (index > -1) {
+					// 已选中,移除
+					this.selectedCustomers.splice(index, 1)
+				} else {
+					// 未选中,添加
+					this.selectedCustomers.push(customer)
+				}
+			},
+			removeCustomer(customerId) {
+				const index = this.selectedCustomers.findIndex(item => item.id === customerId)
+				if (index > -1) {
+					this.selectedCustomers.splice(index, 1)
+				}
+			},
+			deleteSelected() {
+				if (this.selectedCustomers.length === 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请先选择要删除的客户'
+					})
+					return
+				}
+				
+				// 这里可以添加删除逻辑,比如从列表中移除已选中的客户
+				uni.showModal({
+					title: '提示',
+					content: `确定要删除选中的 ${this.selectedCustomers.length} 个客户吗?`,
+					success: (res) => {
+						if (res.confirm) {
+							// 从客户列表中移除已选中的客户
+							const selectedIds = this.selectedCustomers.map(item => item.id)
+							this.customerList = this.customerList.filter(
+								customer => !selectedIds.includes(customer.id)
+							)
+							// 清空已选中的客户
+							this.selectedCustomers = []
+							uni.showToast({
+								title: '删除成功'
+							})
+						}
+					}
+				})
+			},
+			handlePrev() {
+				uni.navigateBack()
+			},
+			handleNext() {
+				if (this.selectedCustomers.length === 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请至少选择一个客户'
+					})
+					return
+				}
+
+				// 跳转到下一步(积分设置)
+				uni.navigateTo({
+					url: '/pages_task/pointsSettings'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #F7F8FA;
+		display: flex;
+		flex-direction: column;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			width: 100%;
+			height: 544rpx;
+			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+		}
+	}
+
+	.step-container {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: #fff;
+		padding: 32rpx 0;
+		margin-bottom: 20rpx;
+
+		.step-item {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			position: relative;
+
+			.step-number {
+				width: 48rpx;
+				height: 48rpx;
+				border-radius: 50%;
+				background: #F2F3F5;
+				color: #C8C9CC;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 28rpx;
+				font-weight: 500;
+				margin-bottom: 8rpx;
+				transition: all 0.3s;
+
+				&.active {
+					background: #388BFF;
+					color: #fff;
+				}
+			}
+
+			.step-text {
+				font-size: 28rpx;
+				color: #C8C9CC;
+				transition: all 0.3s;
+
+				&.active {
+					color: #388BFF;
+					font-weight: 500;
+				}
+			}
+
+			&.active {
+				.step-number {
+					background: #388BFF;
+					color: #fff;
+				}
+
+				.step-text {
+					color: #388BFF;
+					font-weight: 500;
+				}
+			}
+		}
+
+		.step-divider {
+			width: 80rpx;
+			height: 2rpx;
+			background: #EBEDF0;
+			margin: 0 20rpx;
+		}
+	}
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+		padding-bottom: 200rpx;
+	}
+
+
+	.search-section {
+		background-color: #ffffff;
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		padding: 24rpx;
+		margin-bottom: 24rpx;
+
+		.section-title {
+			font-size: 24rpx;
+			color: #999999;
+			margin-bottom: 24rpx;
+		}
+
+		.selected-tags {
+			display: flex;
+			flex-wrap: wrap;
+			gap: 16rpx;
+
+			.selected-tag {
+				display: flex;
+				align-items: center;
+				border-radius: 76rpx 76rpx 76rpx 76rpx;
+				border: 2rpx solid #F5F5F5;
+				padding: 12rpx 24rpx;
+				font-size: 28rpx;
+
+				.tag-name {
+					color: #333;
+					margin-right: 8rpx;
+				}
+
+				.tag-remove {
+					color: #C8C9CC;
+					font-size: 36rpx;
+					line-height: 1;
+					cursor: pointer;
+				}
+			}
+		}
+
+		.search-input-wrapper {
+			background: #F7F8FA;
+			border-radius: 38rpx 38rpx 38rpx 38rpx;
+			position: relative;
+			display: flex;
+			align-items: center;
+			padding: 0 28rpx;
+			height: 72rpx;
+			margin-bottom: 24rpx;
+
+			.search-icon {
+				width: 36rpx;
+				height: 36rpx;
+				margin-right: 16rpx;
+			}
+
+			.search-input {
+				flex: 1;
+				height: 100%;
+				font-size: 28rpx;
+				color: #333;
+			}
+
+			.clear-icon {
+				width: 32rpx;
+				height: 32rpx;
+				margin-left: 16rpx;
+			}
+		}
+	}
+
+	.customer-list {
+		.customer-item {
+			border-radius: 24rpx 24rpx 24rpx 24rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 32rpx;
+			margin-bottom: 12rpx;
+			background-color: #ffffff;
+			cursor: pointer;
+			transition: all 0.3s;
+
+			&.active {
+				background: rgba(56,139,255,0.06);
+			}
+
+			&:last-child {
+				margin-bottom: 0;
+			}
+
+			.left {
+				display: flex;
+				align-items: center;
+
+				.head {
+					width: 88rpx;
+					height: 88rpx;
+					border-radius: 50%;
+					margin-right: 24rpx;
+				}
+
+				.customer-info {
+					flex: 1;
+
+					.customer-header {
+						display: flex;
+						align-items: center;
+						margin-bottom: 12rpx;
+
+						.customer-name {
+							font-weight: 500;
+							font-size: 32rpx;
+							color: #333333;
+							margin-right: 16rpx;
+						}
+
+						.customer-level {
+							font-size: 24rpx;
+							color: #C89743;
+							background: #FFF6E5;
+							border-radius: 8rpx;
+							padding: 4rpx 12rpx;
+						}
+					}
+
+					.customer-details {
+						display: flex;
+						align-items: center;
+
+						.customer-hospital {
+							font-size: 28rpx;
+							color: #666;
+							margin-right: 24rpx;
+							border-right: 2rpx solid #EAEBEE;
+							padding-right: 24rpx;
+						}
+
+						.customer-department {
+							font-size: 28rpx;
+							color: #666;
+						}
+					}
+				}
+			}
+
+		}
+	}
+
+	.bottom-bar {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background: #fff;
+		padding: 24rpx 32rpx;
+		border-top: 1rpx solid #F2F3F5;
+		z-index: 100;
+		display: flex;
+		align-items: center;
+
+		.del-box {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			font-size: 24rpx;
+			color: #666666;
+			margin-right: 32rpx;
+			cursor: pointer;
+		}
+
+		.action-buttons {
+			display: flex;
+			flex: 1;
+			justify-content: space-between;
+
+			.btn {
+				width: 292rpx;
+				height: 88rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				font-weight: 500;
+				border-radius: 200rpx 200rpx 200rpx 200rpx;
+				cursor: pointer;
+
+				&.btn-cancel {
+					background: #fff;
+					border: 2rpx solid #388BFF;
+					color: #388BFF;
+				}
+
+				&.btn-submit {
+					background: #388BFF;
+					color: #fff;
+				}
+			}
+		}
+	}
+</style>

+ 76 - 0
pages_task/success.vue

@@ -0,0 +1,76 @@
+<template>
+	<view class="container">
+		<image class="img" src="/static/image/img_admitsuccess.png"></image>
+		<view class="title">定级材料提交成功!</view>
+		<view class="txt">预计1-2个工作日完成审核,请耐心等待</view>
+		<view class="return" @click="goBack">返回</view>
+	</view>
+</template>
+
+<script>
+	export default {
+
+		data() {
+			return {
+
+			}
+		},
+		watch: {
+
+		},
+		onLoad() {},
+
+		methods: {
+			goBack() {
+				uni.navigateBack()
+			},
+
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #ffffff;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		text-align: center;
+		padding-top: 204rpx;
+
+		.img {
+			width: 248rpx;
+			height: 248rpx;
+		}
+
+		.title {
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #333333;
+			margin-top: 48rpx;
+		}
+
+		.txt {
+			margin-top: 16rpx;
+			font-size: 24rpx;
+			color: #999999;
+			line-height: 36rpx;
+		}
+
+		.return {
+			margin-top: 96rpx;
+			width: 320rpx;
+			height: 80rpx;
+			line-height: 80rpx;
+			background: #388BFF;
+			border-radius: 56rpx 56rpx 56rpx 56rpx;
+			border: 2rpx solid #388BFF;
+			font-size: 28rpx;
+			color: #FFFFFF;
+		}
+
+
+	}
+</style>

+ 575 - 310
pages_task/taskDetail.vue

@@ -1,411 +1,676 @@
 <template>
 	<view class="container">
+		<view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
+		<view class="top">
+			<image class="return" @click="goBack" src="/static/image/back_white.png"></image>
+			<text>任务详情</text>
+		</view>
 		<scroll-view class="content" scroll-y>
 			<!-- 任务卡片 -->
 			<view class="task-card">
 				<view class="card-header">
 					<view class="card-title">{{ taskData.title }}</view>
-					<view class="status-tag" :class="taskData.status">
-						{{ taskData.statusText }}
-					</view>
-				</view>
-				
-				<view class="card-tags">
-					<view class="tag-item video-tag">
-						<text class="tag-icon">▶</text>
-						<text>{{ taskData.videoType }}</text>
-					</view>
-					<view class="tag-item">{{ taskData.category }}</view>
-					<view class="tag-item points-tag">{{ taskData.points }}积分</view>
-					<view class="tag-item">{{ taskData.count }}个</view>
 				</view>
-				
-				<view class="card-dates">
-					<view class="date-item">开始时间: {{ taskData.startTime }}</view>
-					<view class="date-item">结束时间: {{ taskData.endTime }}</view>
+				<view class="card-meta">
+					<view class="meta-tag">{{ taskData.tag }}</view>
+					<view class="meta-id">ID:{{ taskData.id }}</view>
 				</view>
 			</view>
-			
-			<!-- 项目信息 -->
+
+			<!-- 任务信息 -->
 			<view class="info-section">
 				<view class="section-header">
 					<view class="section-indicator"></view>
-					<text class="section-title">项目信息</text>
+					<text class="section-title">任务信息</text>
 				</view>
 				<view class="info-list">
 					<view class="info-item">
-						<text class="info-label">项目名称:</text>
-						<text class="info-value">{{ projectData.projectName }}</text>
+						<text class="info-label">费用分摊:</text>
+						<text class="info-value">{{ taskInfo.costSharing }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属项目:</text>
+						<text class="info-value">{{ taskInfo.belongProject }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属部门:</text>
+						<text class="info-value">{{ taskInfo.belongDept }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属产品:</text>
+						<text class="info-value">{{ taskInfo.belongProduct }}</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">任务ID:</text>
-						<text class="info-value">{{ projectData.taskId }}</text>
+						<text class="info-label">申请补充直播任务:</text>
+						<text class="info-value">{{ taskInfo.applySupplementLive }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">补充任务直播间ID:</text>
+						<text class="info-value">{{ taskInfo.supplementRoomId }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">申请补充任务原因:</text>
+						<text class="info-value">{{ taskInfo.supplementReason }}</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 内容信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">内容信息</text>
+				</view>
+				<view class="info-list">
+					<view class="info-item">
+						<text class="info-label">交付物名称:</text>
+						<text class="info-value">{{ contentInfo.deliverableName }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">交付物ID:</text>
-						<text class="info-value">{{ projectData.deliverableId }}</text>
+						<text class="info-value">{{ contentInfo.deliverableId }}</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">观看人数:</text>
-						<text class="info-value">{{ projectData.viewers }}</text>
+						<text class="info-label">直播间地址:</text>
+						<text class="info-value">{{ contentInfo.liveRoomUrl }}</text>
+						<text class="copy-btn" @click="copyToClipboard(contentInfo.liveRoomUrl)">复制</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">有效观看:</text>
-						<text class="info-value">{{ projectData.validViews }}</text>
+						<text class="info-label">推流地址:</text>
+						<text class="info-value">{{ contentInfo.pushUrl }}</text>
+						<text class="copy-btn" @click="copyToClipboard(contentInfo.pushUrl)">复制</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">标题:</text>
-						<text class="info-value">{{ projectData.title }}</text>
+						<text class="info-label">开播地址:</text>
+						<text class="info-value">{{ contentInfo.startUrl }}</text>
+						<text class="copy-btn" @click="copyToClipboard(contentInfo.startUrl)">复制</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">项目信息:</text>
-						<text class="info-value">{{ projectData.projectInfo || '-' }}</text>
+						<text class="info-label">直播回放:</text>
+						<text class="info-value">{{ contentInfo.liveReplay }}</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">封面图:</text>
-						<view class="cover-image">
-							<image v-if="projectData.coverImage" :src="projectData.coverImage" mode="aspectFill"></image>
-							<text v-else>-</text>
-						</view>
+						<text class="info-label">播放视频:</text>
+						<text class="info-value">{{ contentInfo.playVideo }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">下载视频:</text>
+						<text class="info-value">{{ contentInfo.downloadVideo }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">观众人数:</text>
+						<text class="info-value">{{ contentInfo.viewerCount }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">有效观看:</text>
+						<text class="info-value">{{ contentInfo.validView }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">情况说明:</text>
-						<text class="info-value">{{ projectData.description || '-' }}</text>
+						<text class="info-value">{{ contentInfo.description }}</text>
 					</view>
 				</view>
 			</view>
-			
-			<!-- 申请人员信息 -->
+
+			<!-- 客户信息 -->
 			<view class="info-section">
 				<view class="section-header">
 					<view class="section-indicator"></view>
-					<text class="section-title">申请人员信息</text>
+					<text class="section-title">客户信息</text>
 				</view>
-				<view class="info-list">
-					<view class="info-item">
-						<text class="info-label">申请人姓名:</text>
-						<text class="info-value">{{ applicantData.name }}</text>
+				<view class="client-list">
+					<view class="client-item" v-for="(item, index) in clientList" :key="index">
+						<view class="client-info">
+							<image class="avatar" src="/static/image/my_heads_icon.png"></image>
+							<view class="client-txt">
+								<view class="client-name">
+									{{ item.name }}
+									<text class="client-level">{{ item.level }}</text>
+								</view>
+								<view class="client-hospital">
+									<text>{{ item.hospital }} </text>
+									<view class="line"></view>
+									<text>{{ item.department }}</text>
+								</view>
+							</view>
+						</view>
+						<view class="client-stats">
+							<view class="stat-item"><text class="num">{{ item.taskCount }} </text>任务</view>
+							<view class="stat-item"><text class="num">{{ item.points }} </text>积分</view>
+						</view>
 					</view>
 				</view>
 			</view>
-			
-			<!-- 客户信息 -->
+
+			<!-- 补充材料 -->
 			<view class="info-section">
 				<view class="section-header">
 					<view class="section-indicator"></view>
-					<text class="section-title">客户信息</text>
+					<text class="section-title">补充材料</text>
 				</view>
 				<view class="info-list">
 					<view class="info-item">
-						<text class="info-label">客户名称:</text>
-						<text class="info-value">{{ clientData.name }}</text>
+						<text class="info-label">交付物名称:</text>
+						<text class="info-value">{{ supplementMaterial.deliverableName }}</text>
 					</view>
 					<view class="info-item">
-						<text class="info-label">客户ID:</text>
-						<text class="info-value">{{ clientData.clientId }}</text>
+						<text class="info-label">情况说明:</text>
+						<text class="info-value">{{ supplementMaterial.description }}</text>
 					</view>
-					<view class="info-item">
-						<text class="info-label">归属医院:</text>
-						<text class="info-value">{{ clientData.hospital }}</text>
+					<view class="info-item column">
+						<text class="info-label">附件:</text>
+						<view class="attachment-item">
+							<view class="left">
+								<image class="img" src="/static/image/icon_attachment.png"></image>
+								<view class="txt-item">
+									<view class="attachment-name">{{ supplementMaterial.attachment.name }}</view>
+									<view class="attachment-size">{{ supplementMaterial.attachment.size }}</view>
+								</view>
+							</view>
+							<image class="download-btn" @click="downloadAttachment"
+								src="/static/image/icon_downlad.png"></image>
+						</view>
 					</view>
-					<view class="info-item">
-						<text class="info-label">归属科室:</text>
-						<text class="info-value">{{ clientData.department }}</text>
+				</view>
+			</view>
+
+			<!-- 审批信息 -->
+			<view class="info-section">
+				<view class="section-header">
+					<view class="section-indicator"></view>
+					<text class="section-title">审批信息</text>
+				</view>
+				<view class="approval-list">
+					<view class="approval-item" v-for="(item, index) in approvalInfo" :key="index">
+						<view class="left">
+							<view class="avatar-box">
+								<image class="avatar" src="/static/image/my_heads_icon.png"></image>
+								<image class="icon" src="/static/image/icon_wait.png"></image>
+								<!-- <image class="icon" src="/static/image/icon_pass.png"></image>
+								<image class="icon" src="/static/image/icon_refuse.png"></image> -->
+
+							</view>
+							<view class="approval-user">
+								<view class="user-name">{{ item.name }}</view>
+								<view class="user-status" :style="{ color: item.statusColor }">{{ item.status }}</view>
+							</view>
+						</view>
+						<text class="approval-time">{{ item.time }}</text>
+						<view class="approval-line" v-if="index < approvalInfo.length - 1"></view>
 					</view>
+
+				</view>
+				<view class="reason">
+					费用分摊部门填写错误,应该是学术研究事业部,请修改后重新提交。
 				</view>
+
 			</view>
 		</scroll-view>
-		
-		<!-- 底部按钮 -->
-		<view class="bottom-btn" v-if="taskData.status === 'pending'" @click="goComplete">
-			去完成
-		</view>
 	</view>
 </template>
 
 <script>
-import { getTaskDetail } from '@/api-js/airClassroom'
-export default {
-	data() {
-		return {
-			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
-			taskId: '',
-			taskData: {
-				title: '王小明医生学术视频任务',
-				videoType: '长视频',
-				category: '学术',
-				points: '10',
-				count: '1',
-				startTime: '2025-9-20 13:55',
-				endTime: '2025-9-20 13:55',
-				status: 'pending',
-				statusText: '待完成'
-			},
-			projectData: {
-				projectName: '王小明医学术视频任务',
-				taskId: 'CRW234443000221',
-				deliverableId: 'JF123456',
-				viewers: '688',
-				validViews: '680',
-				title: '康复医学概论',
-				projectInfo: '-',
-				coverImage: '',
-				description: '-'
-			},
-			applicantData: {
-				name: '张菲菲'
-			},
-			clientData: {
-				name: '王小明',
-				clientId: 'C00000001231445',
-				hospital: '江南大学附属医院',
-				department: '消化内科'
+	export default {
+		data() {
+			return {
+				// 仅获取微信小程序状态栏高度,无多余逻辑
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				taskId: '',
+				// 任务基础信息
+				taskData: {
+					title: '王小明医师学术讲座',
+					tag: '学术讲座',
+					id: 'CRW0000001022345'
+				},
+				// 任务信息
+				taskInfo: {
+					costSharing: '湖北省药学服务公司',
+					belongProject: '项目名称',
+					belongDept: '中药事业部',
+					belongProduct: '201',
+					applySupplementLive: '否',
+					supplementRoomId: '-',
+					supplementReason: '-'
+				},
+				// 内容信息
+				contentInfo: {
+					deliverableName: '直播',
+					deliverableId: '-',
+					liveRoomUrl: 'http://www.zhibotest123333...',
+					pushUrl: 'http://www.zhibotest123123...',
+					startUrl: 'http://www.zhibotest123123...',
+					liveReplay: '-',
+					playVideo: '-',
+					downloadVideo: '-',
+					viewerCount: '203',
+					validView: '198',
+					description: '这是一段说明,这是一段说明,一行展示不完就换行展示。'
+				},
+				// 客户信息列表
+				clientList: [{
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科',
+						taskCount: '1',
+						points: '30'
+					},
+					{
+						name: '王小明',
+						level: '一级',
+						hospital: '湖南省人民医院',
+						department: '口腔科',
+						taskCount: '1',
+						points: '30'
+					}
+				],
+				// 补充材料
+				supplementMaterial: {
+					deliverableName: '-',
+					description: '-',
+					attachment: {
+						name: '文件名称文件名称.pdf',
+						size: '128kb'
+					}
+				},
+				// 审批信息
+				approvalInfo: [{
+						name: '王彬彬',
+						status: '发起申请',
+						statusColor: '#4CAF50',
+						time: '2025-03-04 18:00'
+					},
+					{
+						name: '王小明',
+						status: '待审核',
+						statusColor: '#FF9800',
+						time: ''
+					}
+				]
 			}
-		}
-	},
-	onLoad(options) {
-		if (options.id) {
-			this.taskId = options.id
-			this.loadData()
-		}
-	},
-	methods: {
-		goBack() {
-			uni.navigateBack()
 		},
-		goComplete() {
-			uni.navigateTo({
-				url: `/pages_task/completeTask?id=${this.taskId}`
-			})
+		onLoad(options) {
+			if (options.id) {
+				this.taskId = options.id
+				this.loadData()
+			}
 		},
-		async loadData() {
-			try {
-				uni.showLoading({ title: '加载中...' })
-				const res = await getTaskDetail({ id: this.taskId })
-				uni.hideLoading()
-				if (res.code === 200 && res.data) {
-					this.taskData = { ...this.taskData, ...res.data.task }
-					this.projectData = { ...this.projectData, ...res.data.project }
-					this.applicantData = { ...this.applicantData, ...res.data.applicant }
-					this.clientData = { ...this.clientData, ...res.data.client }
+		methods: {
+			goBack() {
+				uni.navigateBack()
+			},
+			async loadData() {
+				try {
+					uni.showLoading({
+						title: '加载中...'
+					})
+					// 实际项目中替换为接口请求:const res = await getTaskDetail({ id: this.taskId })
+					// 这里模拟接口赋值
+					uni.hideLoading()
+				} catch (e) {
+					uni.hideLoading()
+					console.error('加载数据失败', e)
 				}
-			} catch (e) {
-				uni.hideLoading()
-				console.error('加载数据失败', e)
+			},
+			// 复制到剪贴板
+			copyToClipboard(text) {
+				uni.setClipboardData({
+					data: text,
+					success() {
+						uni.showToast({
+							title: '复制成功',
+							icon: 'success'
+						})
+					}
+				})
+			},
+			// 下载附件
+			downloadAttachment() {
+				uni.showToast({
+					title: '开始下载附件',
+					icon: 'none'
+				})
+				// 实际项目中添加下载逻辑:uni.downloadFile + uni.saveFile
 			}
 		}
 	}
-}
 </script>
 
 <style lang="scss" scoped>
-.container {
-	min-height: 100vh;
-	background: #f5f5f5;
-	display: flex;
-	flex-direction: column;
-}
-
-.status-bar {
-	width: 100%;
-	background: #fff;
-}
-
-.header {
-	position: relative;
-	height: 88rpx;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.back-btn {
-		position: absolute;
-		left: 24rpx;
-		width: 40rpx;
-		height: 40rpx;
-		
-		image {
+	.container {
+		min-height: 100vh;
+		background: #f5f5f5;
+		display: flex;
+		flex-direction: column;
+		height: auto;
+
+		&::before {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
 			width: 100%;
-			height: 100%;
+			height: 532rpx;
+			background: linear-gradient(180deg, rgba(56, 139, 255, 0.79) 0%, rgba(56, 139, 255, 0) 100%);
 		}
+
 	}
-	
-	.title {
-		font-size: 36rpx;
-		font-weight: bold;
-		color: #333;
-	}
-	
-	.header-right {
-		position: absolute;
-		right: 24rpx;
+
+	.top {
 		display: flex;
+		justify-content: center;
 		align-items: center;
-		gap: 16rpx;
-		
-		.more-icon {
-			font-size: 32rpx;
-			color: #333;
+		height: 88rpx;
+		position: relative;
+		font-weight: 600;
+		font-size: 36rpx;
+		color: #FFFFFF;
+
+		.return {
+			position: absolute;
+			left: 32rpx;
+			width: 40rpx;
+			height: 40rpx;
 		}
 	}
-}
-
-.content {
-	flex: 1;
-	padding: 24rpx;
-}
-
-.task-card {
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 24rpx;
-	margin-bottom: 24rpx;
-	
-	.card-header {
-		display: flex;
-		align-items: flex-start;
-		justify-content: space-between;
-		margin-bottom: 16rpx;
-		
-		.card-title {
-			flex: 1;
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
-		}
-		
-		.status-tag {
-			padding: 8rpx 16rpx;
-			border-radius: 20rpx;
-			font-size: 24rpx;
-			
-			&.pending {
-				background: #E3F2FD;
-				color: #2196F3;
+
+	.content {
+		flex: 1;
+		padding: 24rpx;
+		box-sizing: border-box;
+	}
+
+	/* 任务卡片样式 */
+	.task-card {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 24rpx;
+		margin-bottom: 24rpx;
+
+		.card-header {
+			.card-title {
+				font-weight: 500;
+				font-size: 36rpx;
+				color: #333333;
+				margin-bottom: 24rpx;
 			}
 		}
-	}
-	
-	.card-tags {
-		display: flex;
-		align-items: center;
-		flex-wrap: wrap;
-		gap: 12rpx;
-		margin-bottom: 16rpx;
-		
-		.tag-item {
-			padding: 8rpx 16rpx;
-			background: #f5f5f5;
-			border-radius: 8rpx;
+
+		.card-meta {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
 			font-size: 24rpx;
 			color: #666;
-			
-			&.video-tag {
-				background: #FFF3E0;
-				color: #FF9800;
-				
-				.tag-icon {
-					margin-right: 4rpx;
-				}
-			}
-			
-			&.points-tag {
-				border: 1rpx solid #388BFF;
+
+			.meta-tag {
+				border-radius: 8rpx 8rpx 8rpx 8rpx;
+				border: 2rpx solid rgba(56, 139, 255, 0.4);
+				padding: 4rpx 8rpx;
 				color: #388BFF;
-				background: transparent;
 			}
 		}
 	}
-	
-	.card-dates {
-		.date-item {
-			font-size: 26rpx;
-			color: #999;
-			margin-bottom: 8rpx;
-		}
-	}
-}
-
-.info-section {
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 24rpx;
-	margin-bottom: 24rpx;
-	
-	.section-header {
-		display: flex;
-		align-items: center;
+
+	/* 通用信息区块样式 */
+	.info-section {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 24rpx;
 		margin-bottom: 24rpx;
-		
-		.section-indicator {
-			width: 6rpx;
-			height: 32rpx;
-			background: #388BFF;
-			border-radius: 3rpx;
-			margin-right: 16rpx;
+
+		.section-header {
+			display: flex;
+			align-items: center;
+			margin-bottom: 24rpx;
+
+			.section-indicator {
+				width: 6rpx;
+				height: 32rpx;
+				background: #388BFF;
+				border-radius: 3rpx;
+				margin-right: 16rpx;
+			}
+
+			.section-title {
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #333333;
+			}
 		}
-		
-		.section-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
+
+		.info-list {
+			.info-item {
+				display: flex;
+				margin-bottom: 24rpx;
+
+				&:last-child {
+					margin-bottom: 0;
+				}
+
+				.info-label {
+					width: 50%;
+					font-size: 28rpx;
+					color: #666;
+					flex-shrink: 0;
+				}
+
+				.info-value {
+					flex: 1;
+					text-align: end;
+					font-size: 28rpx;
+					color: #333;
+				}
+
+				.copy-btn {
+					margin-left: 16rpx;
+					color: #2196F3;
+					font-size: 24rpx;
+					cursor: pointer;
+				}
+
+				.column {
+					flex-direction: column;
+				}
+
+				.attachment-item {
+					margin-top: 24rpx;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					gap: 16rpx;
+					background: #F7F8FA;
+					border-radius: 16rpx 16rpx 16rpx 16rpx;
+
+					.left {
+						display: flex;
+						align-items: center;
+
+						.img {
+							width: 72rpx;
+							height: 72rpx;
+							margin-right: 24rpx;
+						}
+
+						.txt-item {
+							.attachment-name {
+								font-size: 28rpx;
+								color: #333;
+							}
+
+							.attachment-size {
+								font-size: 24rpx;
+								color: #999;
+							}
+						}
+
+					}
+
+
+
+					.download-btn {
+						width: 32rpx;
+						height: 32rpx;
+					}
+				}
+			}
 		}
 	}
-	
-	.info-list {
-		.info-item {
+
+	/* 客户信息样式 */
+	.client-list {
+		.client-item {
 			display: flex;
-			align-items: flex-start;
-			margin-bottom: 24rpx;
-			
+			justify-content: space-between;
+			align-items: center;
+			padding: 16rpx 0;
+
 			&:last-child {
-				margin-bottom: 0;
+				border-bottom: none;
 			}
-			
-			.info-label {
-				width: 160rpx;
-				font-size: 28rpx;
-				color: #666;
-				flex-shrink: 0;
+
+			.client-info {
+				display: flex;
+				align-items: center;
+
+				.avatar {
+					width: 88rpx;
+					height: 88rpx;
+					margin-right: 24rpx;
+				}
+
+				.client-txt {
+					.client-name {
+						font-size: 28rpx;
+						font-weight: 500;
+						color: #333;
+
+						.client-level {
+							margin-left: 8rpx;
+							padding: 2rpx 8rpx;
+							background: #FFF6E5;
+							color: #C89743;
+							font-size: 22rpx;
+							border-radius: 8rpx;
+						}
+					}
+				}
+
+
+				.client-hospital {
+					font-size: 24rpx;
+					color: #666;
+					margin-top: 4rpx;
+					display: flex;
+					align-items: center;
+
+					.line {
+						width: 2rpx;
+						height: 28rpx;
+						background: #EAEBEE;
+						margin: 0 24rpx;
+					}
+				}
+			}
+
+			.client-stats {
+				display: flex;
+				gap: 24rpx;
+				font-size: 24rpx;
+				color: #999999;
+
+				.stat-item {
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+
+					.num {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #333333;
+					}
+				}
 			}
-			
-			.info-value {
-				flex: 1;
-				font-size: 28rpx;
-				color: #333;
+		}
+	}
+
+	/* 审批信息样式 */
+	.approval-list {
+		.approval-item {
+			position: relative;
+			padding-left: 24rpx;
+			margin-bottom: 68rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			&:last-child {
+				margin-bottom: 0;
 			}
-			
-			.cover-image {
-				width: 200rpx;
-				height: 200rpx;
-				border-radius: 8rpx;
-				overflow: hidden;
-				
-				image {
-					width: 100%;
-					height: 100%;
+
+			.left {
+				display: flex;
+				align-items: center;
+
+				.avatar-box {
+					width: 80rpx;
+					height: 80rpx;
+					margin-right: 32rpx;
+					position: relative;
+
+					.avatar {
+						width: 100%;
+						height: 100%;
+					}
+
+					.icon {
+						position: absolute;
+						bottom: 0;
+						right: 0;
+						width: 32rpx;
+						height: 32rpx;
+					}
 				}
+
+
+				.approval-user {
+					gap: 12rpx;
+
+					.user-name {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #333;
+					}
+
+					.user-status {
+						font-size: 24rpx;
+					}
+				}
+			}
+
+
+			.approval-time {
+				font-size: 24rpx;
+				color: #999;
+				margin-top: 4rpx;
 			}
 		}
+
+		.approval-line {
+			position: absolute;
+			left: 64rpx;
+			bottom: -64rpx;
+			width: 1rpx;
+			height: 56rpx;
+			background: #BFD8FF;
+		}
 	}
-}
-
-.bottom-btn {
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	right: 0;
-	height: 88rpx;
-	background: #388BFF;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	font-size: 32rpx;
-	color: #fff;
-	font-weight: 500;
-	z-index: 100;
-}
-</style>
 
+	.reason {
+		font-size: 28rpx;
+		color: #666666;
+		line-height: 40rpx;
+		margin-left: 136rpx;
+	}
+</style>

+ 897 - 0
pages_task/xlTask.vue

@@ -0,0 +1,897 @@
+<template>
+	<view class="container">
+		<!-- 搜索+筛选栏 -->
+		<view class="top-box">
+			<view class="input-item">
+				<image class="icon search-icon" src="@/static/image/search.png" mode="widthFix"></image>
+				<input placeholder="请输入客户姓名/机构名称" placeholder-class="placeholder" />
+			</view>
+			<view class="filter-item" @click="showFilter = true">
+				<image class="filter-icon" src="@/static/image/icon_select.png" mode="widthFix"></image>
+				<text>筛选</text>
+			</view>
+		</view>
+
+		<!-- 顶部选项卡:任务列表/审核列表 -->
+		<view class="top-tabs">
+			<view class="top-tab-item" :class="{ active: currentTopTab === 'task' }" @click="switchTopTab('task')">
+				任务列表
+			</view>
+			<view class="top-tab-item" :class="{ active: currentTopTab === 'audit' }" @click="switchTopTab('audit')">
+				审核列表
+			</view>
+		</view>
+
+		<!-- 动态子标签 -->
+		<view class="sub-tabs">
+			<view class="sub-tab-item" :class="{ active: currentSubTab === item.value }"
+				@click="currentSubTab = item.value" v-for="(item, index) in currentSubTabsList" :key="index">
+				{{ item.label }}
+			</view>
+		</view>
+
+		<!-- 列表内容 -->
+		<scroll-view class="content" scroll-y>
+			<view class="task-card" v-for="(item, index) in currentList" :key="index" @click="goDetails(item)">
+				<!-- 任务/审核标题+状态 -->
+				<view class="card-top">
+					<text class="card-task-title">{{ item.taskTitle }}</text>
+					<view class="status-tag" :class="item.statusClass">{{ item.statusText }}</view>
+				</view>
+
+				<view class="card-content">
+					<!-- 讲者信息 -->
+					<view class="speaker-info">
+						<text class="speaker-name">{{ item.speaker }}</text>
+						<view class="level-tag">{{ item.level }}</view>
+					</view>
+
+					<!-- 医院+科室 -->
+					<view class="org-info">
+						<image class="org-icon" src="@/static/image/icon_hospital.png" mode="widthFix"></image>
+						<text>{{ item.hospital }}</text>
+						<view class="line"></view>
+						<text>{{ item.department }}</text>
+					</view>
+
+					<!-- 标签组 -->
+					<view class="card-tags">
+						<view class="tag-left-group">
+							<view class="tag-item video-tag" v-if="item.videoType">
+								<image class="video-tag-icon" src="@/static/image/icon_longvideo.png" mode="widthFix">
+								</image>
+								<text>{{ item.videoType }}</text>
+							</view>
+							<view class="tag-item category-tag" v-if="item.category">
+								{{ item.category }}
+							</view>
+						</view>
+
+						<view class="tag-right-group">
+							<view class="tag-item points-tag">{{ item.points }}积分</view>
+							<view class="tag-item count-tag">{{ item.count }}个</view>
+							<view class="tag-item count-tag">院内</view>
+						</view>
+					</view>
+
+					<!-- 时间信息 -->
+					<view class="time-info">
+						<view class="time-item">
+							<text>申请时间:</text>
+							<text>{{ item.applyTime }}</text>
+						</view>
+						<view class="time-item" v-if="currentTopTab === 'task'">
+							<text>完成时间:</text>
+							<text>{{ item.finishTime || '-' }}</text>
+						</view>
+						<view class="time-item" v-if="currentTopTab === 'task'">
+							<text>完成审核:</text>
+							<text>{{ item.auditStatus || '-' }}</text>
+						</view>
+					</view>
+
+					<!-- 操作按钮 -->
+					<view class="operate-btn-group" v-if="currentTopTab === 'task'">
+						<view class="share-btn" @click="handleShare(item)">
+							<image class="share-icon" src="/static/image/icon_share.png" mode="widthFix"></image>
+							<text>分享</text>
+						</view>
+						<view class="btn-group">
+							<view class="btn" v-if="item.showDelete" @click="handleTaskDelete(item, index)">删除</view>
+							<view class="btn" @click="handleCopy(item)">复制创建</view>
+						</view>
+					</view>
+					<view class="operate-btn-group flex-end" v-else>
+						<view class="btn-group">
+							<view class="btn" v-if="item.showDelete" @click="handleAuditDelete(item, index)">删除</view>
+							<view class="btn" v-if="item.showEdit" @click="handleEdit(item)">编辑</view>
+						</view>
+					</view>
+
+					<!-- 状态印章 -->
+					<image class="status-seal" :src="item.sealImg" mode="widthFix" v-if="currentTopTab === 'task'">
+					</image>
+				</view>
+			</view>
+		</scroll-view>
+		<view class="side">
+			<view class="side-item" @click="goCreate" >
+				<image class="icon" src="/static/image/icon_close.png"></image>
+			</view>
+			<view class="side-item" @click="goData">
+				<image class="icon" src="/static/image/icon_close.png"></image>
+			</view>
+		</view>
+		<!-- 筛选弹窗 -->
+		<view class="filter-popup" v-if="showFilter" @click="closeFilter">
+			<view class="filter-content" @click.stop>
+				<view class="filter-header">
+					<view class="filter-title">筛选</view>
+					<image class="filter-close-btn" src="@/static/image/icon_close.png" @click="closeFilter"
+						mode="widthFix"></image>
+				</view>
+
+				<view class="filter-form">
+					<!-- 任务申请时间 -->
+					<view class="filter-section">
+						<view class="section-label">任务申请时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.applyTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.applyTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 任务完成时间 -->
+					<view class="filter-section" v-if="currentTopTab === 'audit'">
+						<view class="section-label">任务完成时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.finishTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.finishTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 完成审核时间 -->
+					<view class="filter-section" v-if="currentTopTab === 'audit'">
+						<view class="section-label">完成审核时间</view>
+						<view class="time-range">
+							<input class="time-input" placeholder="开始时间" v-model="filters.auditTimeStart" />
+							<view class="time-separator">-</view>
+							<input class="time-input" placeholder="结束时间" v-model="filters.auditTimeEnd" />
+						</view>
+					</view>
+
+					<!-- 任务归属 -->
+					<view class="filter-section">
+						<view class="section-label">任务归属</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.taskBelong === 'my' }"
+								@click="filters.taskBelong = 'my'">我的任务</view>
+							<view class="filter-btn" :class="{ active: filters.taskBelong === 'dept' }"
+								@click="filters.taskBelong = 'dept'">部门任务</view>
+						</view>
+					</view>
+
+					<!-- 完结状态 -->
+					<view class="filter-section" v-if="currentTopTab === 'audit'">
+						<view class="section-label">完结状态</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.finishStatus === 'unfinished' }"
+								@click="filters.finishStatus = 'unfinished'">未完结</view>
+							<view class="filter-btn" :class="{ active: filters.finishStatus === 'finished' }"
+								@click="filters.finishStatus = 'finished'">已完结</view>
+						</view>
+					</view>
+
+					<!-- 归属类型 -->
+					<view class="filter-section">
+						<view class="section-label">归属类型</view>
+						<view class="btn-group">
+							<view class="filter-btn" :class="{ active: filters.belongType === 'inner' }"
+								@click="filters.belongType = 'inner'">院内</view>
+							<view class="filter-btn" :class="{ active: filters.belongType === 'outer' }"
+								@click="filters.belongType = 'outer'">院外</view>
+						</view>
+					</view>
+				</view>
+
+				<view class="filter-actions">
+					<view class="reset-btn" @click="resetFilters">重置</view>
+					<view class="confirm-btn" @click="confirmFilters">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				showFilter: false,
+				filters: {
+					applyTimeStart: '',
+					applyTimeEnd: '',
+					finishTimeStart: '',
+					finishTimeEnd: '',
+					auditTimeStart: '',
+					auditTimeEnd: '',
+					taskBelong: 'my',
+					finishStatus: '',
+					belongType: ''
+				},
+				currentTopTab: 'task',
+				currentSubTab: 'all',
+				taskSubTabs: [{
+						label: '全部任务',
+						value: 'all'
+					},
+					{
+						label: '未完成',
+						value: 'unfinished'
+					},
+					{
+						label: '已完成',
+						value: 'finished'
+					}
+				],
+				auditSubTabs: [{
+						label: '全部',
+						value: 'all'
+					},
+					{
+						label: '创建待审批',
+						value: 'createPending'
+					},
+					{
+						label: '完成待审批',
+						value: 'finishPending'
+					},
+					{
+						label: '驳回',
+						value: 'rejected'
+					}
+				],
+				taskList: [{
+					taskTitle: '王小明医生的学术讲座',
+					statusText: '待完成',
+					statusClass: 'status-wait',
+					speaker: '王小明',
+					level: '一级',
+					hospital: '湖南省人民医院',
+					department: '口腔科',
+					videoType: '长视频',
+					category: '学术',
+					points: 10,
+					count: 1,
+					applyTime: '2025-9-20 13:55',
+					finishTime: '-',
+					auditStatus: '-',
+					showDelete: true,
+					sealImg: '/static/image/img_unfinish.png'
+				}],
+				auditList: [{
+					taskTitle: '王小明医生的学术讲座',
+					statusText: '创建驳回',
+					statusClass: 'status-rejected',
+					speaker: '王小明',
+					level: '一级',
+					hospital: '湖南省人民医院',
+					department: '口腔科',
+					videoType: '长视频',
+					category: '学术',
+					points: 10,
+					count: 1,
+					applyTime: '2025-9-20 13:55',
+					showDelete: true,
+					showEdit: true
+				}]
+			}
+		},
+		computed: {
+			currentSubTabsList() {
+				return this.currentTopTab === 'task' ? this.taskSubTabs : this.auditSubTabs;
+			},
+			currentList() {
+				return this.currentTopTab === 'task' ? this.taskList : this.auditList;
+			}
+		},
+		methods: {
+			goCreate(){
+				uni.navigateTo({
+					url: '/pages_task/createTask'
+				})
+			},
+			goData(){
+				uni.navigateTo({
+					url: '/pages_echarts/statistics'
+				})
+			},
+			goDetails(item) {
+				uni.navigateTo({
+					url: '/pages_task/taskDetail'
+				})
+			},
+			switchTopTab(type) {
+				this.currentTopTab = type;
+				this.currentSubTab = 'all';
+			},
+			closeFilter() {
+				this.showFilter = false
+			},
+			resetFilters() {
+				this.filters = {
+					applyTimeStart: '',
+					applyTimeEnd: '',
+					finishTimeStart: '',
+					finishTimeEnd: '',
+					auditTimeStart: '',
+					auditTimeEnd: '',
+					taskBelong: 'my',
+					finishStatus: '',
+					belongType: ''
+				}
+			},
+			confirmFilters() {
+				this.showFilter = false
+				console.log('筛选条件:', this.filters)
+			},
+			handleShare(item) {
+				uni.showToast({
+					title: '分享功能待实现',
+					icon: 'none'
+				})
+			},
+			handleTaskDelete(item, index) {
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除这条任务吗?',
+					cancelText: '取消',
+					confirmText: '删除',
+					confirmColor: '#FF0000',
+					success: (res) => {
+						if (res.confirm) {
+							this.taskList.splice(index, 1);
+							uni.showToast({
+								title: '任务已删除',
+								icon: 'success',
+								duration: 1500
+							});
+						}
+					}
+				});
+			},
+			handleCopy(item) {
+				uni.navigateTo({
+					url: '/pages_task/createTask'
+				})
+				// uni.showToast({
+				// 	title: '复制创建功能待实现',
+				// 	icon: 'none'
+				// })
+			},
+			handleAuditDelete(item, index) {
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除这条审核项吗?',
+					cancelText: '取消',
+					confirmText: '删除',
+					confirmColor: '#FF0000',
+					success: (res) => {
+						if (res.confirm) {
+							this.auditList.splice(index, 1);
+							uni.showToast({
+								title: '审核项已删除',
+								icon: 'success',
+								duration: 1500
+							});
+						}
+					}
+				});
+			},
+			handleEdit(item) {
+				uni.showToast({
+					title: '编辑功能待实现',
+					icon: 'none'
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.container {
+		min-height: 100vh;
+		background: #f5f5f5;
+
+		.top-box {
+			padding: 20rpx 32rpx;
+			display: flex;
+			align-items: center;
+			background: #fff;
+
+			.input-item {
+				display: flex;
+				align-items: center;
+				flex: 1;
+				height: 72rpx;
+				background: #F7F8FA;
+				border-radius: 38rpx;
+
+				.search-icon {
+					width: 26rpx;
+					height: 26rpx;
+					margin: 0 10rpx 0 28rpx;
+				}
+
+				input {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333;
+				}
+			}
+
+			.filter-item {
+				margin-left: 24rpx;
+				display: flex;
+				align-items: center;
+				font-size: 28rpx;
+				color: #999;
+
+				.filter-icon {
+					width: 28rpx;
+					height: 28rpx;
+					margin-right: 10rpx;
+				}
+			}
+		}
+
+		.top-tabs {
+			display: flex;
+			background: #fff;
+
+			.top-tab-item {
+				flex: 1;
+				text-align: center;
+				padding: 24rpx 0;
+				font-size: 28rpx;
+				color: #999;
+				transition: all 0.2s;
+
+				&.active {
+					color: #333;
+					font-weight: 500;
+					position: relative;
+
+					&::after {
+						content: '';
+						position: absolute;
+						bottom: 0;
+						left: 50%;
+						transform: translateX(-50%);
+						border-radius: 3rpx;
+						width: 80rpx;
+						height: 6rpx;
+						background: #388BFF;
+					}
+				}
+			}
+		}
+
+		.sub-tabs {
+			display: flex;
+			justify-content: space-between;
+			background: #fff;
+			padding: 16rpx 32rpx;
+			gap: 24rpx;
+
+			.sub-tab-item {
+				padding: 12rpx 24rpx;
+				border-radius: 30rpx;
+				font-size: 28rpx;
+				color: #666;
+				transition: all 0.2s;
+
+				&.active {
+					background: #EBF3FF;
+					color: #388BFF;
+				}
+			}
+		}
+
+		.content {
+			padding: 24rpx;
+			box-sizing: border-box;
+			min-height: calc(100vh - 300rpx);
+
+			.task-card {
+				background: #fff;
+				border-radius: 24rpx;
+				margin-bottom: 20rpx;
+				border: 2rpx solid #E9F2FF;
+				position: relative;
+				padding-bottom: 24rpx;
+
+				.card-top {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					background: linear-gradient(90deg, #E8F1FF 0%, #FFFFFF 100%);
+					border-radius: 24rpx 24rpx 0 0;
+					padding: 26rpx 24rpx;
+					margin-bottom: 16rpx;
+
+					.card-task-title {
+						font-size: 32rpx;
+						font-weight: 600;
+						color: #333;
+					}
+
+					.status-tag {
+						padding: 8rpx 16rpx;
+						border-radius: 20rpx;
+						font-size: 24rpx;
+
+						&.status-wait {
+							background: #E3F2FD;
+							color: #2196F3;
+						}
+
+						&.status-finish {
+							background: #E6FAEF;
+							color: #07C160;
+						}
+
+						&.status-rejected {
+							background: #FFF4F5;
+							color: #CF3546;
+						}
+
+						&.status-createPending {
+							background: #FFF8E6;
+							color: #FF9500;
+						}
+					}
+				}
+
+				.card-content {
+					padding: 0 24rpx;
+
+					.speaker-info {
+						display: flex;
+						align-items: center;
+						margin-bottom: 16rpx;
+
+						.speaker-name {
+							font-weight: 600;
+							font-size: 32rpx;
+							color: #333;
+						}
+
+						.level-tag {
+							margin-left: 16rpx;
+							padding: 2rpx 12rpx;
+							font-size: 22rpx;
+							color: #C89743;
+							background: #FFF6E5;
+							border-radius: 8rpx;
+						}
+					}
+
+					.org-info {
+						display: flex;
+						align-items: center;
+						margin-bottom: 16rpx;
+						font-size: 28rpx;
+						color: #666;
+
+						.org-icon {
+							width: 32rpx;
+							height: 32rpx;
+							margin-right: 16rpx;
+						}
+
+						.line {
+							width: 2rpx;
+							height: 28rpx;
+							background: #EAEBEE;
+							margin: 0 24rpx;
+						}
+					}
+
+					.card-tags {
+						display: flex;
+						align-items: center;
+						flex-wrap: wrap;
+						gap: 12rpx;
+						margin-bottom: 16rpx;
+
+						.tag-left-group {
+							display: flex;
+							gap: 0;
+
+							.video-tag {
+								background: linear-gradient(90deg, #FFE9C7 0%, #F3D091 100%);
+								border-radius: 8rpx 0 0 8rpx;
+								color: #5D410F;
+								display: flex;
+								align-items: center;
+								padding: 8rpx;
+								font-size: 24rpx;
+
+								.video-tag-icon {
+									width: 28rpx;
+									height: 28rpx;
+									margin-right: 10rpx;
+								}
+							}
+
+							.category-tag {
+								border-radius: 0 8rpx 8rpx 0;
+								border: 2rpx solid #F3D191;
+								background: #FFFAF4;
+								color: #5D410F;
+								padding: 8rpx;
+								font-size: 24rpx;
+							}
+						}
+
+						.tag-right-group {
+							display: flex;
+							gap: 12rpx;
+
+							.points-tag {
+								border: 1rpx solid #388BFF;
+								color: #388BFF;
+								background: transparent;
+								border-radius: 8rpx;
+								padding: 8rpx;
+								font-size: 24rpx;
+							}
+
+							.count-tag {
+								border: 2rpx solid #E8E8E8;
+								border-radius: 8rpx;
+								padding: 8rpx;
+								font-size: 24rpx;
+								color: #666;
+							}
+						}
+					}
+
+					.time-info {
+						font-size: 28rpx;
+						color: #666;
+						display: flex;
+						flex-direction: column;
+						gap: 8rpx;
+						margin-bottom: 24rpx;
+
+						.time-item {
+							display: flex;
+
+							&:first-child {
+								color: #333;
+							}
+						}
+					}
+
+					.operate-btn-group {
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						&.flex-end {
+							justify-content: flex-end;
+						}
+
+						.share-btn {
+							display: flex;
+							align-items: center;
+							font-size: 28rpx;
+							color: #666;
+
+							.share-icon {
+								width: 36rpx;
+								height: 36rpx;
+								margin-right: 8rpx;
+							}
+						}
+
+						.btn-group {
+							display: flex;
+							align-items: center;
+
+							.btn {
+								padding: 12rpx 32rpx;
+								font-size: 28rpx;
+								color: #388BFF;
+								border: 2rpx solid #388BFF;
+								margin-left: 16rpx;
+								border-radius: 34rpx;
+								transition: all 0.2s;
+
+								&:active {
+									background: #EBF3FF;
+								}
+							}
+						}
+					}
+
+					.status-seal {
+						position: absolute;
+						right: 24rpx;
+						bottom: 156rpx;
+						width: 152rpx;
+						height: 142rpx;
+						opacity: 0.8;
+					}
+				}
+			}
+		}
+
+		.side {
+			position: absolute;
+			top: 60%;
+			right: 36rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+
+			.side-item {
+				width: 96rpx;
+				height: 96rpx;
+				background: linear-gradient(0deg, #388BFF 0%, #388BFF 100%);
+				box-shadow: inset 0rpx 4rpx 8rpx 0rpx rgba(255, 255, 255, 0.25), inset 0rpx -6rpx 8rpx 0rpx rgba(255, 255, 255, 0.25), 4rpx 8rpx 12rpx 0rpx rgba(88, 144, 239, 0.29);
+				border-radius: 110rpx 110rpx 110rpx 110rpx;
+				margin-bottom: 28rpx;
+				text-align: center;
+				line-height: 96rpx;
+
+				.icon {
+					width: 38rpx;
+					height: 38rpx;
+				}
+
+				&:active {
+					opacity: 0.6;
+				}
+			}
+
+		}
+
+		.filter-popup {
+			position: fixed;
+			top: 0;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			background: rgba(0, 0, 0, 0.5);
+			z-index: 999;
+			display: flex;
+			align-items: flex-end;
+
+			.filter-content {
+				width: 100%;
+				background: #fff;
+				border-radius: 24rpx 24rpx 0 0;
+				padding: 32rpx;
+
+				.filter-header {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-bottom: 32rpx;
+					position: relative;
+
+					.filter-title {
+						font-size: 32rpx;
+						font-weight: bold;
+						color: #333;
+					}
+
+					.filter-close-btn {
+						position: absolute;
+						right: 0;
+						width: 44rpx;
+						height: 44rpx;
+					}
+				}
+
+				.filter-form {
+					padding: 0 0 24rpx 0;
+
+					.filter-section {
+						margin-bottom: 32rpx;
+
+						.section-label {
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #333;
+							margin-bottom: 24rpx;
+						}
+
+						.time-range {
+							display: flex;
+							align-items: center;
+							gap: 16rpx;
+
+							.time-input {
+								flex: 1;
+								height: 72rpx;
+								text-align: center;
+								background: #F7F8FA;
+								border-radius: 8rpx;
+								padding: 0 16rpx;
+								font-size: 26rpx;
+								color: #333;
+							}
+
+							.time-separator {
+								font-size: 24rpx;
+								color: #999;
+							}
+						}
+
+						.btn-group {
+							display: flex;
+							gap: 16rpx;
+
+							.filter-btn {
+								width: 214rpx;
+								height: 72rpx;
+								background: #F7F8FA;
+								border-radius: 70rpx 70rpx 70rpx 70rpx;
+								line-height: 72rpx;
+								text-align: center;
+								font-size: 28rpx;
+								transition: all 0.2s;
+								color: #333333;
+
+								&.active {
+									background: rgba(56, 139, 255, 0.15);
+									color: #388BFF;
+								}
+							}
+						}
+					}
+				}
+
+				.filter-actions {
+					display: flex;
+					gap: 24rpx;
+					margin-top: 40rpx;
+
+					.reset-btn,
+					.confirm-btn {
+						flex: 1;
+						height: 80rpx;
+						line-height: 80rpx;
+						text-align: center;
+						border-radius: 200rpx;
+						font-size: 28rpx;
+						transition: all 0.2s;
+					}
+
+					.reset-btn {
+						background: #fff;
+						color: #388BFF;
+						border: 2rpx solid #388BFF;
+
+						&:active {
+							background: #EBF3FF;
+						}
+					}
+
+					.confirm-btn {
+						background: #388BFF;
+						color: #fff;
+
+						&:active {
+							background: #2A78E5;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 406 - 0
pages_user/userInfo.vue

@@ -0,0 +1,406 @@
+<template>
+	<view class="container">
+		<view class="content">
+			<view class="summary-section ">
+				<view class="summary-header">
+					<view class="summary-indicator"></view>
+					<text class="summary-title">基础信息</text>
+				</view>
+				<view class="list">
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">头像</view>
+						<view class="right">
+							<image class="img" src="/static/image/my_heads_icon.png" mode=""></image>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">姓名</view>
+						<view class="right">
+							<text class="txt">王小明</text>
+						</view>
+					</view>
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">性别</view>
+						<view class="right">
+							<text class="txt">男</text>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+				</view>
+
+				<view class="summary-header">
+					<view class="summary-indicator"></view>
+					<text class="summary-title">岗位信息</text>
+				</view>
+				<view class="list">
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">部门</view>
+						<view class="right">
+							<text class="txt ash">请选择部门</text>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">岗位</view>
+						<view class="right">
+							<text class="txt ">办公室主任</text>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">产品</view>
+						<view class="right">
+							<text class="txt ">301、201</text>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+					<view class="info-item" @click="toChangePassword">
+						<view class="label">直属上级</view>
+						<view class="right">
+							<text class="txt ash">请选择</text>
+							<image class="icon" src="/static/image/icon_my_more.png" mode=""></image>
+						</view>
+					</view>
+
+					<view class="form-section">
+						<view class="form-label">
+							<text>证明材料</text>
+							<text class="tip">工作证、OA信息截图、个人名片等</text>
+						</view>
+						<view class="upload-cover" @click="chooseCoverImage">
+							<image v-if="formData.coverImage" :src="formData.coverImage" mode="aspectFill"></image>
+							<image v-if="formData.coverImage" class="del" @click="del"  src="/static/image/icon_img_delete.png"
+								mode="aspectFill"></image>
+							<view v-else class="upload-placeholder">
+								<image class="icon" src="/static/image/icon_camera.png" mode="aspectFill"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				formData: {
+					coverImage: '/static/image/icon_camera.png',
+				},
+
+			}
+		},
+		computed: {
+
+		},
+		watch: {
+
+		},
+		onLoad() {
+
+		},
+		onReachBottom() {},
+		methods: {
+			chooseCoverImage() {
+				uni.chooseImage({
+					count: 1,
+					sizeType: ['compressed'],
+					sourceType: ['album', 'camera'],
+					success: async (res) => {
+						try {
+							uni.showLoading({
+								title: '上传中...'
+							})
+							const uploadRes = await uploadFile({
+								file: res.tempFilePaths[0],
+								type: 'cover'
+							})
+							uni.hideLoading()
+							if (uploadRes.code === 200 && uploadRes.data) {
+								this.formData.coverImage = uploadRes.data.url
+							}
+						} catch (e) {
+							uni.hideLoading()
+							uni.showToast({
+								icon: 'none',
+								title: '上传失败'
+							})
+						}
+					}
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		background-color: #ffffff;
+		min-height: 100vh;
+		display: flex;
+		flex-direction: column;
+		position: relative;
+
+		.content {
+			width: 100%;
+			height: 100%;
+			position: relative;
+			z-index: 2;
+
+			.title {
+				font-weight: 600;
+				font-size: 36rpx;
+				color: #333333;
+				height: 88rpx;
+				text-align: center;
+				line-height: 88rpx;
+
+			}
+
+			.summary-section {
+				padding: 32rpx 24rpx;
+				display: flex;
+				flex-direction: column;
+
+				.summary-header {
+					display: flex;
+					align-items: center;
+					margin-bottom: 24rpx;
+
+					.summary-indicator {
+						width: 6rpx;
+						height: 32rpx;
+						background: #388BFF;
+						border-radius: 40rpx;
+						margin-right: 16rpx;
+					}
+
+					.summary-title {
+						font-size: 36rpx;
+						font-weight: bold;
+						color: #333;
+					}
+				}
+			}
+
+			.list {
+				margin-bottom: 40rpx;
+
+				.info-item {
+					height: 104upx;
+					padding: 0 30upx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					border-bottom: 1px solid #F5F6FA;
+
+					&:last-child {
+						border-bottom: none;
+					}
+
+					.label {
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 400;
+						color: #0F1826;
+					}
+
+					.right {
+						display: flex;
+						align-items: center;
+						justify-content: center;
+
+						.txt {
+							font-size: 28rpx;
+							color: #333333;
+							margin-right: 8rpx;
+						}
+
+						.ash {
+							color: #C8C9CC;
+						}
+
+						.img {
+							width: 62rpx;
+							height: 62rpx;
+							border-radius: 50%;
+							margin-right: 6rpx;
+						}
+
+						.icon {
+							width: 36rpx;
+							height: 36rpx;
+						}
+					}
+				}
+
+				.form-section {
+					background: #fff;
+					border-radius: 16rpx;
+					padding: 24rpx;
+					margin-bottom: 24rpx;
+
+					.form-label {
+						display: flex;
+						align-items: center;
+						font-size: 28rpx;
+						color: #333;
+
+						.tip {
+							font-size: 24rpx;
+							color: #999999;
+							margin-left: 24rpx;
+						}
+
+					}
+
+					.form-tips {
+						font-size: 24rpx;
+						color: #999;
+						margin-bottom: 16rpx;
+					}
+
+					.form-input-wrapper {
+						position: relative;
+
+						.form-input {
+							width: 100%;
+							min-height: 120rpx;
+							padding: 16rpx;
+							background: #f5f5f5;
+							border-radius: 8rpx;
+							font-size: 28rpx;
+							color: #333;
+						}
+
+						.char-count {
+							position: absolute;
+							right: 16rpx;
+							bottom: 16rpx;
+							font-size: 24rpx;
+							color: #999;
+						}
+					}
+
+					.form-select {
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						height: 80rpx;
+						padding: 0 24rpx;
+						background: #f5f5f5;
+						border-radius: 8rpx;
+						font-size: 28rpx;
+						color: #333;
+
+						.placeholder {
+							color: #999;
+						}
+
+						.arrow-right {
+							font-size: 24rpx;
+							color: #999;
+						}
+					}
+
+					.upload-cover {
+						width: 160rpx;
+						height: 160rpx;
+						border-radius: 16rpx;
+						background: #F7F8FA;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						margin-top: 24rpx;
+						position: relative;
+
+						.del {
+							position: absolute;
+							right: 0;
+							top: 0;
+							width: 28rpx;
+							height: 28rpx;
+						}
+
+						image {
+							width: 100%;
+							height: 100%;
+							border-radius: 8rpx;
+						}
+
+						.upload-placeholder {
+							.icon {
+								width: 48rpx;
+								height: 48rpx;
+							}
+						}
+					}
+
+					.attachment-list {
+						.attachment-item {
+							display: flex;
+							align-items: center;
+							padding: 16rpx;
+							background: #f5f5f5;
+							border-radius: 8rpx;
+							margin-bottom: 16rpx;
+
+							.attachment-icon {
+								font-size: 32rpx;
+								margin-right: 16rpx;
+							}
+
+							.attachment-info {
+								flex: 1;
+								display: flex;
+								flex-direction: column;
+
+								.attachment-name {
+									font-size: 28rpx;
+									color: #333;
+									margin-bottom: 4rpx;
+								}
+
+								.attachment-size {
+									font-size: 24rpx;
+									color: #999;
+								}
+							}
+
+							.attachment-delete {
+								font-size: 40rpx;
+								color: #999;
+								width: 40rpx;
+								height: 40rpx;
+								display: flex;
+								align-items: center;
+								justify-content: center;
+							}
+						}
+
+						.add-attachment {
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							padding: 24rpx;
+							background: #E3F2FD;
+							border-radius: 8rpx;
+							font-size: 28rpx;
+							color: #388BFF;
+
+							.add-icon {
+								font-size: 32rpx;
+								margin-right: 8rpx;
+							}
+						}
+					}
+				}
+
+			}
+		}
+	}
+</style>

BIN
static/image/approval.png


BIN
static/image/back_white.png


BIN
static/image/bg_bench.png


BIN
static/image/bg_invitecard.png


BIN
static/image/bg_login.png


BIN
static/image/bg_mine.png


BIN
static/image/bg_qestion.png


BIN
static/image/btn_bl.png


BIN
static/image/icon_approval_no.png


BIN
static/image/icon_approval_yes.png


BIN
static/image/icon_attachment.png


BIN
static/image/icon_camera.png


BIN
static/image/icon_circle.png


BIN
static/image/icon_circle_sel.png


BIN
static/image/icon_clear.png


BIN
static/image/icon_close.png


BIN
static/image/icon_delete.png


BIN
static/image/icon_down.png


BIN
static/image/icon_downlad.png


BIN
static/image/icon_expand.png


BIN
static/image/icon_hospital.png


BIN
static/image/icon_img_delete.png


BIN
static/image/icon_invite.png


BIN
static/image/icon_like.png


BIN
static/image/icon_my_information.png


BIN
static/image/icon_my_set.png


BIN
static/image/icon_pass.png


BIN
static/image/icon_refuse.png


BIN
static/image/icon_right.png


BIN
static/image/icon_share.png


BIN
static/image/icon_step_done.png


BIN
static/image/icon_task_kzkt.png


BIN
static/image/icon_task_wjdc.png


BIN
static/image/icon_task_yydy.png


BIN
static/image/icon_user.png


BIN
static/image/icon_wait.png


BIN
static/image/icon_wrong.png


BIN
static/image/img_admitsuccess.png


BIN
static/image/img_example1.png


BIN
static/image/img_example2.png


BIN
static/image/img_example3.png


BIN
static/image/img_example4 (1).png


BIN
static/image/img_example4 (2).png


BIN
static/image/img_example4.png


BIN
static/image/img_finished.png


BIN
static/image/img_nocard.png


BIN
static/image/img_title.png


BIN
static/image/img_unfinish.png


+ 0 - 0
static/image/my_heads_icon64.png → static/image/my_heads_icon.png


BIN
static/image/search.png


BIN
static/image/speaker.png


BIN
static/image/xl.png