李妹妹 3 روز پیش
کامیت
a02a4bd094
100فایلهای تغییر یافته به همراه18436 افزوده شده و 0 حذف شده
  1. 17 0
      .gitignore
  2. 157 0
      App.vue
  3. 36 0
      README.en.md
  4. 37 0
      README.md
  5. 24 0
      api-js/account.js
  6. 33 0
      api-js/airClassroom.js
  7. 29 0
      api-js/bankCard.js
  8. 38 0
      api-js/certification.js
  9. 22 0
      api-js/medicationSurvey.js
  10. 28 0
      api-js/onlineLecture.js
  11. 19 0
      api-js/password.js
  12. 24 0
      api-js/points.js
  13. 19 0
      api-js/questionnaire.js
  14. 14 0
      api-js/serviceAgreement.js
  15. 24 0
      api-js/serviceOrder.js
  16. 19 0
      api-js/statistics.js
  17. 28 0
      api-js/withdraw.js
  18. 24 0
      api/activity.js
  19. 37 0
      api/address.js
  20. 6 0
      api/adv.js
  21. 28 0
      api/article.js
  22. 35 0
      api/common.js
  23. 37 0
      api/companyOrder.js
  24. 274 0
      api/companyUser.js
  25. 29 0
      api/coupon.js
  26. 9 0
      api/department.js
  27. 16 0
      api/disease.js
  28. 45 0
      api/doc.js
  29. 11 0
      api/doctorArticle.js
  30. 47 0
      api/doctorOrder.js
  31. 84 0
      api/health.js
  32. 84 0
      api/healthUser.js
  33. 66 0
      api/index.js
  34. 22 0
      api/patient.js
  35. 22 0
      api/payment.js
  36. 21 0
      api/prescribe.js
  37. 66 0
      api/product.js
  38. 14 0
      api/store.js
  39. 29 0
      api/storeAfterSales.js
  40. 92 0
      api/storeOrder.js
  41. 15 0
      api/storeProductPackage.js
  42. 24 0
      api/test.js
  43. 70 0
      api/user.js
  44. 16 0
      api/userSign.js
  45. 276 0
      assets/css/common.less
  46. 137 0
      assets/css/common.scss
  47. 208 0
      assets/css/commonTheme.css
  48. 2 0
      assets/iconfont/iconfont.css
  49. BIN
      assets/iconfont/iconfont.ttf
  50. 89 0
      common/request.js
  51. 21 0
      components/Loading.vue
  52. 146 0
      components/Menu.vue
  53. 251 0
      components/Server.vue
  54. 24 0
      main.js
  55. 93 0
      manifest.json
  56. 28 0
      package-lock.json
  57. 11 0
      package.json
  58. 550 0
      pages.json
  59. 709 0
      pages/auth/login.vue
  60. 107 0
      pages/auth/wxLogin.vue
  61. 85 0
      pages/common/launch.vue
  62. 79 0
      pages/home/content.vue
  63. 2649 0
      pages/home/index.vue
  64. 42 0
      pages/home/web.vue
  65. 198 0
      pages/task/index.vue
  66. 651 0
      pages/user/index.vue
  67. 9 0
      pages/user/test.vue
  68. 708 0
      pages_echarts/statistics.vue
  69. 342 0
      pages_live/ConsultationDetails.vue
  70. 424 0
      pages_live/addForm.vue
  71. 736 0
      pages_live/addUser.vue
  72. 294 0
      pages_live/card.vue
  73. 105 0
      pages_live/healthConsulting.vue
  74. 512 0
      pages_live/healthfiles.vue
  75. 463 0
      pages_live/lecture.vue
  76. 463 0
      pages_live/lesson.vue
  77. 322 0
      pages_live/lessonDetail.vue
  78. 470 0
      pages_live/search.vue
  79. 291 0
      pages_task/activityDetail.vue
  80. 686 0
      pages_task/airClassroom.vue
  81. 511 0
      pages_task/caseCollection.vue
  82. 643 0
      pages_task/completeTask.vue
  83. 308 0
      pages_task/index.vue
  84. 457 0
      pages_task/medicationSurvey.vue
  85. 648 0
      pages_task/onlineLecture.vue
  86. 743 0
      pages_task/science.vue
  87. 240 0
      pages_task/taskCompleteSuccess.vue
  88. 411 0
      pages_task/taskDetail.vue
  89. 503 0
      pages_user/points.vue
  90. BIN
      static/image/Iconly/Light/Calendar.png
  91. BIN
      static/image/back.png
  92. BIN
      static/image/bg_bankcard.png
  93. BIN
      static/image/bg_invitecard.png
  94. BIN
      static/image/bg_login.png
  95. BIN
      static/image/bg_qestion.png
  96. BIN
      static/image/bg_tab_login.png
  97. BIN
      static/image/bg_tab_login2.png
  98. BIN
      static/image/btn_bl.png
  99. BIN
      static/image/btn_sjtj.png
  100. BIN
      static/image/icon_ barrage_on.png

+ 17 - 0
.gitignore

@@ -0,0 +1,17 @@
+# Windows
+[Dd]esktop.ini
+Thumbs.db
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+
+# Node.js
+node_modules/
+
+.project
+unpackage/

+ 157 - 0
App.vue

@@ -0,0 +1,157 @@
+<script>
+	import Vue from 'vue'
+	// import TIM from 'tim-wx-sdk';
+	// import COS from 'cos-wx-sdk-v5';
+	export default {
+		globalData: {  
+			// confirm订单参数
+			confirmParam: []
+		},
+		onLaunch: function() {
+			// uni.$TUIKit = TIM.create({
+			// 	SDKAppID: 1400693126
+			// });
+			// uni.$TUIKit.registerPlugin({
+			// 	'cos-wx-sdk': COS
+			// });
+			// uni.$TUIKitTIM = TIM;
+			// uni.$TUIKitEvent = TIM.EVENT;
+			// uni.$TUIKitVersion = TIM.VERSION;
+			// uni.$TUIKitTypes = TIM.TYPES; // 监听系统级事件
+			// uni.$resetLoginData = this.resetLoginData();
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_READY, this.onSDKReady);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_NOT_READY, this.onSdkNotReady);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.KICKED_OUT, this.onKickedOut);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.ERROR, this.onTIMError);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.NET_STATE_CHANGE, this.onNetStateChange);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_RELOAD, this.onSDKReload);
+			// console.log('IM')
+		},
+		onShow: function () {
+		    console.log('App Show')
+		    uni.getSystemInfo({
+				success: (result) => {
+					// 获取手机系统的状态栏高度(不同手机的状态栏高度不同)
+					// console.log('当前手机的状态栏高度',result.statusBarHeight)
+					let statusBarHeight = result.statusBarHeight + 'px'
+					
+					// 获取右侧胶囊的信息 单位px
+					//#ifndef H5 || APP-PLUS
+					const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+					
+					//bottom: 胶囊底部距离屏幕顶部的距离
+					//height: 胶囊高度
+					//left:   胶囊左侧距离屏幕左侧的距离
+					//right:  胶囊右侧距离屏幕左侧的距离
+					//top:    胶囊顶部距离屏幕顶部的距离
+					//width:  胶囊宽度
+					// console.log(menuButtonInfo.width, menuButtonInfo.height, menuButtonInfo.top)
+					// console.log('计算胶囊右侧距离屏幕右边距离', result.screenWidth - menuButtonInfo.right)
+					let menuWidth = menuButtonInfo.width + 'px'
+					let menuHeight = menuButtonInfo.height + 'px'
+					let menuBorderRadius = menuButtonInfo.height / 2 + 'px'
+					let menuRight = result.screenWidth - menuButtonInfo.right + 'px'
+					let menuTop = menuButtonInfo.top + 'px'
+					let contentTop = result.statusBarHeight + 44 + 'px'
+			
+					let menuInfo = {
+						statusBarHeight: statusBarHeight,//状态栏高度----用来给自定义导航条页面的顶部导航条设计padding-top使用:目的留出系统的状态栏区域
+						menuWidth: menuWidth,//右侧的胶囊宽度--用来给自定义导航条页面的左侧胶囊设置使用
+						menuHeight: menuHeight,//右侧的胶囊高度--用来给自定义导航条页面的左侧胶囊设置使用
+						menuBorderRadius: menuBorderRadius,//一半的圆角--用来给自定义导航条页面的左侧胶囊设置使用
+						menuRight: menuRight,//右侧的胶囊距离右侧屏幕距离--用来给自定义导航条页面的左侧胶囊设置使用
+						menuTop: menuTop,//右侧的胶囊顶部距离屏幕顶部的距离--用来给自定义导航条页面的左侧胶囊设置使用
+						contentTop: contentTop,//内容区距离页面最上方的高度--用来给自定义导航条页面的内容区定位距离使用
+					}
+					uni.setStorageSync('menuInfo', menuInfo)
+					//#endif
+				},
+				fail: (error) => {
+					console.log(error)
+				}
+		    })
+		},
+		onHide: function() {
+			console.log('App Hide')
+		},
+		 
+		methods: {
+			// TODO:
+			resetLoginData() {
+				// this.globalData.expiresIn = '';
+				// this.globalData.sessionID = '';
+				// this.globalData.userInfo = {
+				// 	userID: '',
+				// 	userSig: '',
+				// 	token: '',
+				// 	phone: ''
+				// };
+				// this.globalData.userProfile = null;
+				// logger.log(`| app |  resetLoginData | globalData: ${this.globalData}`);
+			},
+			onTIMError() {},
+			onSDKReady({name}) {
+				 console.log("im注册:"+name)
+				  const isSDKReady = name === uni.$TUIKitEvent.SDK_READY ? true : false
+				  console.log("im注册:"+isSDKReady)
+					uni.$emit('isSDKReady', {
+						isSDKReady: true
+					});
+			},
+			onNetStateChange() {},
+			onSDKReload() {},
+			onSdkNotReady() {},
+			onKickedOut() {
+				uni.showToast({
+					title: '您被踢下线',
+					icon: 'error'
+				});
+				
+			}
+		}
+	}
+</script>
+ <style lang="less">
+	 @import './assets/css/common.less';
+ </style>
+<style lang="scss">
+    /*每个页面公共css */
+	// @import 'animate.css';
+	@import "uview-ui/index.scss";
+	@import './assets/iconfont/iconfont.css';
+	@import './assets/css/common.scss';
+	@import './assets/css/commonTheme.css';
+	::-webkit-scrollbar{
+	    width: 0 !important;
+	    height: 0 !important;
+	    
+	}
+</style>
+<style>
+	/*每个页面公共css */
+	/* 解决小程序和app滚动条的问题 */
+	/* #ifdef MP-WEIXIN || APP-PLUS */
+		::v-deep  ::-webkit-scrollbar {
+		    display: none !important;
+		    width: 0 !important;
+		    height: 0 !important;
+		    -webkit-appearance: none;
+		    background: transparent;
+		    color: transparent;
+		}
+	/* #endif */
+	
+	/* 解决H5 的问题 */
+	/* #ifdef H5 */
+	    uni-scroll-view .uni-scroll-view::-webkit-scrollbar {
+	    	/* 隐藏滚动条,但依旧具备可以滚动的功能 */
+			display: none;
+		    width: 0 !important;
+		    height: 0 !important;
+		    -webkit-appearance: none;
+		    background: transparent;
+		    color: transparent;
+	    }
+	/* #endif */
+</style>
+ 

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# WBCrm_User_Uniapp
+
+#### Description
+kangyangcrm_user_app
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+# WBCrm_User_Uniapp
+
+#### 介绍
+kangyangcrm_user_app
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 24 - 0
api-js/account.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取账号信息
+export function getAccountInfo() {
+	return request('/store/app/account/getInfo', null, 'GET');
+}
+
+// 更新账号信息
+export function updateAccountInfo(data) {
+	return request('/store/app/account/update', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 修改手机号
+export function changePhone(data) {
+	return request('/store/app/account/changePhone', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 发送验证码
+export function sendVerifyCode(data) {
+	return request('/store/app/account/sendVerifyCode', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+

+ 33 - 0
api-js/airClassroom.js

@@ -0,0 +1,33 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取空中课堂任务列表
+export function getAirClassroomList(data) {
+	return request('/store/app/airClassroom/getList', data, 'GET');
+}
+
+// 获取任务详情
+export function getTaskDetail(data) {
+	return request('/store/app/airClassroom/getTaskDetail', data, 'GET');
+}
+
+// 提交任务
+export function submitTask(data) {
+	return request('/store/app/airClassroom/submitTask', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 获取项目分组选项
+export function getGroupOptions() {
+	return request('/store/app/airClassroom/getGroupOptions', null, 'GET');
+}
+
+// 获取项目标签选项
+export function getTagOptions() {
+	return request('/store/app/airClassroom/getTagOptions', null, 'GET');
+}
+
+// 上传文件
+export function uploadFile(data) {
+	return request('/store/app/airClassroom/uploadFile', data, 'POST', 'application/json;charset=UTF-8');
+}
+

+ 29 - 0
api-js/bankCard.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取银行卡列表
+export function getBankCardList() {
+	return request('/store/app/bankCard/getList', null, 'GET');
+}
+
+// 获取银行卡详情
+export function getBankCardDetail(data) {
+	return request('/store/app/bankCard/getDetail', data, 'GET');
+}
+
+// 添加银行卡
+export function addBankCard(data) {
+	return request('/store/app/bankCard/add', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 更新银行卡
+export function updateBankCard(data) {
+	return request('/store/app/bankCard/update', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 删除银行卡
+export function deleteBankCard(data) {
+	return request('/store/app/bankCard/delete', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+

+ 38 - 0
api-js/certification.js

@@ -0,0 +1,38 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取认证信息
+export function getCertificationInfo() {
+	return request('/store/app/certification/getInfo', null, 'GET');
+}
+
+// 更新认证信息
+export function updateCertificationInfo(data) {
+	return request('/store/app/certification/update', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 提交认证审核
+export function submitCertification(data) {
+	return request('/store/app/certification/submit', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 获取认证状态
+export function getCertificationStatus() {
+	return request('/store/app/certification/status', null, 'GET');
+}
+
+// 上传认证图片
+export function uploadCertificationImage(data) {
+	return request('/store/app/certification/uploadImage', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 获取认证审核信息
+export function getCertificationReviewInfo() {
+	return request('/store/app/certification/getReviewInfo', null, 'GET');
+}
+
+// 重新提交认证
+export function resubmitCertification(data) {
+	return request('/store/app/certification/resubmit', data, 'POST', 'application/json;charset=UTF-8');
+}
+

+ 22 - 0
api-js/medicationSurvey.js

@@ -0,0 +1,22 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取用药调研列表
+export function getMedicationSurveyList(data) {
+	return request('/store/app/medicationSurvey/getList', data, 'GET');
+}
+
+// 获取活动详情
+export function getActivityDetail(data) {
+	return request('/store/app/medicationSurvey/getActivityDetail', data, 'GET');
+}
+
+// 提交病例征集
+export function submitCaseCollection(data) {
+	return request('/store/app/medicationSurvey/submitCase', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 获取病例列表
+export function getCaseList(data) {
+	return request('/store/app/medicationSurvey/getCaseList', data, 'GET');
+}

+ 28 - 0
api-js/onlineLecture.js

@@ -0,0 +1,28 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取在线讲座列表
+export function getOnlineLectureList(data) {
+	return request('/store/app/onlineLecture/getList', data, 'GET');
+}
+
+// 获取开播链接
+export function getBroadcastUrl(data) {
+	return request('/store/app/onlineLecture/getBroadcastUrl', data, 'GET');
+}
+
+// 进入微信小程序
+export function enterMiniProgram(data) {
+	return request('/store/app/onlineLecture/enterMiniProgram', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 开始直播
+export function startBroadcast(data) {
+	return request('/store/app/onlineLecture/startBroadcast', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 继续直播
+export function continueBroadcast(data) {
+	return request('/store/app/onlineLecture/continueBroadcast', data, 'POST', 'application/json;charset=UTF-8');
+}
+

+ 19 - 0
api-js/password.js

@@ -0,0 +1,19 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 设置密码
+export function setPassword(data) {
+	return request('/store/app/password/set', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 修改密码
+export function changePassword(data) {
+	return request('/store/app/password/change', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 重置密码
+export function resetPassword(data) {
+	return request('/store/app/password/reset', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+

+ 24 - 0
api-js/points.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取积分信息
+export function getPointsInfo() {
+	return request('/store/app/points/getInfo', null, 'GET');
+}
+
+// 获取积分列表
+export function getPointsList(data) {
+	return request('/store/app/points/getList', data, 'GET');
+}
+
+// 获取积分明细
+export function getPointsDetail(data) {
+	return request('/store/app/points/getDetail', data, 'GET');
+}
+
+// 获取积分汇总信息(包含余额和待入账)
+export function getPointsSummary() {
+	return request('/store/app/points/getSummary', null, 'GET');
+}
+
+

+ 19 - 0
api-js/questionnaire.js

@@ -0,0 +1,19 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取问卷调查列表
+export function getQuestionnaireList(data) {
+	return request('/store/app/questionnaire/getList', data, 'GET');
+}
+
+// 获取问卷调查详情
+export function getQuestionnaireDetail(data) {
+	return request('/store/app/questionnaire/getDetail', data, 'GET');
+}
+
+// 提交问卷调查
+export function submitQuestionnaire(data) {
+	return request('/store/app/questionnaire/submit', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+

+ 14 - 0
api-js/serviceAgreement.js

@@ -0,0 +1,14 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取服务协议列表
+export function getServiceAgreementList() {
+	return request('/store/app/serviceAgreement/getList', null, 'GET');
+}
+
+// 获取服务协议详情
+export function getServiceAgreementDetail(data) {
+	return request('/store/app/serviceAgreement/getDetail', data, 'GET');
+}
+
+

+ 24 - 0
api-js/serviceOrder.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取服务单列表
+export function getServiceOrderList(data) {
+	return request('/store/app/serviceOrder/getList', data, 'GET');
+}
+
+// 获取服务单详情
+export function getServiceOrderDetail(data) {
+	return request('/store/app/serviceOrder/getDetail', data, 'GET');
+}
+
+// 确认服务单
+export function confirmServiceOrder(data) {
+	return request('/store/app/serviceOrder/confirm', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 取消服务单
+export function cancelServiceOrder(data) {
+	return request('/store/app/serviceOrder/cancel', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+

+ 19 - 0
api-js/statistics.js

@@ -0,0 +1,19 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取统计数据
+export function getStatisticsData(data) {
+	return request('/store/app/statistics/getData', data, 'GET');
+}
+
+// 获取统计图表数据
+export function getStatisticsChart(data) {
+	return request('/store/app/statistics/getChart', data, 'GET');
+}
+
+// 导出统计数据
+export function exportStatistics(data) {
+	return request('/store/app/statistics/export', data, 'GET');
+}
+
+

+ 28 - 0
api-js/withdraw.js

@@ -0,0 +1,28 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取提现信息
+export function getWithdrawInfo() {
+	return request('/store/app/withdraw/getInfo', null, 'GET');
+}
+
+// 提交提现申请
+export function submitWithdraw(data) {
+	return request('/store/app/withdraw/submit', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 获取提现记录
+export function getWithdrawList(data) {
+	return request('/store/app/withdraw/getList', data, 'GET');
+}
+
+// 获取提现详情
+export function getWithdrawDetail(data) {
+	return request('/store/app/withdraw/getDetail', data, 'GET');
+}
+
+// 获取银行卡列表(用于提现选择)
+export function getBankCardList() {
+	return request('/store/app/bankCard/getList', null, 'GET');
+}
+

+ 24 - 0
api/activity.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+ 
+ export function getStoreActivity(data) {
+ 	 return request('/store/app/activity/getStoreActivity',data,'GET');
+ }
+ export function getStoreActivityDetails(data) {
+ 	 return request('/store/app/activity/getStoreActivityDetails',data,'GET');
+ }
+ export function share(activityId) {
+ 	 return request('/store/app/activity/share?activityId='+activityId,null,'POST');
+ }
+  
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 

+ 37 - 0
api/address.js

@@ -0,0 +1,37 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getCity() {
+ 	 return request('/user/store/app/address/getCity',null,'GET');
+ }
+ export function getCitys() {
+ 	 return request('/store/app/address/getCitys',null,'GET');
+ }
+ export function getAddressList() {
+ 	 return request('/store/app/address/getAddressList',null,'GET');
+ }
+
+ export function getAddressById(data) {
+ 	 return request('/store/app/address/getAddressById',data,'GET');
+ } 
+ 
+ export function addAddress(data) {
+ 	return request('/store/app/address/addAddress',data,'POST','application/json;charset=UTF-8');
+ }
+
+ export function editAddress(data) {
+ 	return request('/store/app/address/editAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delAddress(data) {
+ 	return request('/store/app/address/delAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function parseAddress(data) {
+ 	return request('/store/app/address/parseAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function delAllAddress(data) {
+ 	return request('/store/app/address/delAllAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

+ 6 - 0
api/adv.js

@@ -0,0 +1,6 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getAdv(data) {
+ 	 return request('/store/app/adv/getAdv',data,'GET');
+ }
+ 

+ 28 - 0
api/article.js

@@ -0,0 +1,28 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getArticleCate() {
+ 	 return request('/store/app/article/getArticleCate',null,'GET');
+ }
+ 
+ export function getArticleList(data) {
+ 	 return request('/store/app/article/getArticleList',data,'GET');
+ }
+
+ export function getArticleByArticleId(data) {
+ 	 return request('/store/app/article/getArticleByArticleId',data,'GET');
+ } 
+ 
+ export function updateView(articleId) {
+ 	 return request('/store/app/article/updateView?articleId='+articleId,null,'POST');
+ } 
+ 
+ export function getArticleViewList(data) {
+ 	 return request('/store/app/article/getArticleViewList',data,'GET');
+ } 
+ 
+
+ 
+ 
+  

+ 35 - 0
api/common.js

@@ -0,0 +1,35 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+
+ export function uploadOSS(data) {
+ 	 return request('/store/app/common/uploadOSS',data,'POST');
+ }
+ export function getTlsSig(data) {
+ 	 return request('/store/app/common/getTlsSig',data,'GET');
+ }
+ 
+ export function getStoreConfig() {
+  	 return request('/store/app/common/getStoreConfig',null,'GET');
+ } 
+ 
+ export function getProductConfig() {
+  	 return request('/store/app/common/getProductConfig',null,'GET');
+ } 
+ 
+ export function getWeixinTemps() {
+ 	 return request('/store/app/common/getWeixinTemps',null,'GET');
+ }
+ export function getWeixinOrderTemps() {
+ 	 return request('/store/app/common/getWeixinOrderTemps',null,'GET');
+ }
+ export function getWeixinPrescribeTemps() {
+ 	 return request('/store/app/common/getWeixinPrescribeTemps',null,'GET');
+ }
+ 
+ 
+ export function getDictByKey(data) {
+  	 return request('/store/app/common/getDictByKey',data,'GET');
+ } 
+ 
+ 

+ 37 - 0
api/companyOrder.js

@@ -0,0 +1,37 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getSalesProducts(data) {
+ 	 return request('/store/app/companyOrder/getSalesProducts',data,'GET');
+ }
+ 
+ export function createSalesOrder(data) {
+ 	 return request('/store/app/companyOrder/createSalesOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function updateSalseOrderMoney(data) {
+ 	 return request('/store/app/companyOrder/updateSalseOrderMoney',data,'GET' );
+ }
+ // 多店铺修改实付金额
+ export function updateSaleOrderMoney(data) {
+ 	 return request('/store/app/companyOrder/updateSaleOrderMoney',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getSalesOrder(data) {
+ 	 return request('/store/app/companyOrder/getSalesOrder',data,'GET' );
+ }
+ export function getSalesOrders(data) {
+ 	 return request('/store/app/companyOrder/getSalesOrders',data,'GET' );
+ }
+ export function addUserCart(data) {
+ 	 return request('/store/app/companyOrder/addUserCart',data,'GET' );
+ }
+ 
+ export function editOrderMoney(data) {
+ 	 return request('/store/app/companyOrder/editOrderMoney',data,'GET' );
+ }
+
+ 
+ 
+  
+ 
+ 

+ 274 - 0
api/companyUser.js

@@ -0,0 +1,274 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function login(data) {
+	return request('/store/app/companyUser/login', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+export function getUserInfo(data) {
+	return request('/store/app/companyUser/getUserInfo', data, 'GET', 'application/json;charset=UTF-8');
+}
+export function getQrImg(data) {
+	return request('/store/app/companyUser/getQrImg', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+export function getCompanyUserCard(data) {
+	return request('/store/app/companyUser/getCompanyUserCard', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取所有投诉类型
+export function getCategory(data) {
+	return request('/app/complaint/category', data, 'GET', 'application/json;charset=UTF-8');
+}
+//提交投诉
+export function submitComplaint(data) {
+	return request('/app/complaint/submitComplaint', data, 'POST', 'application/json;charset=UTF-8');
+}
+//获取投诉列表
+export function getComplaintList(data) {
+	return request('/app/complaint/list', data, 'POST', 'application/json;charset=UTF-8');
+}
+//修改i投诉
+export function updateComplaint(id, data) {
+	return request('/app/complaint/' + id, data, 'PUT', 'application/json;charset=UTF-8');
+}
+//投诉详情
+export function getComplaintById(data) {
+	return request('/app/complaint/' + data, data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//管理
+export function getAdmin(data) {
+	return request('/app/food-record/admin/list', data, 'GET', 'application/json;charset=UTF-8');
+}
+//某日饮食列表
+export function getDayRecords(data) {
+	return request('/app/food-record/getDayRecords', data, 'GET', 'application/json;charset=UTF-8');
+}
+//饮食列表
+export function getMyRecordList(data) {
+	return request('/app/food-record/getMyRecordList', data, 'POST', 'application/json;charset=UTF-8');
+}
+//新增饮食
+export function addRecord(data) {
+	return request('/app/food-record/addRecord', data, 'POST', 'application/json;charset=UTF-8');
+}
+//修改饮食
+export function editRecord(data) {
+	return request('/app/food-record/editRecord', data, 'POST', 'application/json;charset=UTF-8');
+}
+//删除饮食
+export function deleteRecord(data) {
+	return request('/app/food-record/deleteRecord/' + data, data, 'POST', 'application/json;charset=UTF-8');
+}
+//饮食详情
+export function getRecordInfo(data) {
+	return request('/app/food-record/getRecordInfo/' + data, data, 'GET');
+}
+//待办列表
+export function getToDoList(data) {
+	return request('/app/todoItems/listPage', data, 'POST', 'application/json;charset=UTF-8');
+}
+//待办事项详情
+export function getFindById(data) {
+	return request('/app/todoItems/findById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//更新详情
+export function updateById(data) {
+	return request('/app/todoItems/updateById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//商品列表
+export function getServiceList(data) {
+	return request('/app/serviceGoods/listPage', data, 'POST', 'application/json;charset=UTF-8');
+}
+//商品详情
+export function getServiceById(data) {
+	return request('/app/serviceGoods/findById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//新增商品
+export function saveService(data) {
+	return request('/app/serviceGoods/save', data, 'POST', 'application/json;charset=UTF-8');
+}
+//更新商品信息
+export function updateService(data) {
+	return request('/app/serviceGoods/updateById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//删除商品
+export function deleteService(data) {
+	return request('/app/serviceGoods/deleteById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//竞品列表
+export function getCompetitorList(data) {
+	return request('/app/competitorInfo/listPage', data, 'POST', 'application/json;charset=UTF-8');
+}
+//竞品详情
+export function getCompetitorById(data) {
+	return request('/app/competitorInfo/findById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//竞品商品
+export function saveCompetitor(data) {
+	return request('/app/competitorInfo/save', data, 'POST', 'application/json;charset=UTF-8');
+}
+//更新竞品信息
+export function updateCompetitor(data) {
+	return request('/app/competitorInfo/updateById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//删除竞品
+export function deleteCompetitor(data) {
+	return request('/app/competitorInfo/deleteById', data, 'POST', 'application/json;charset=UTF-8');
+}
+//新增体检报告
+export function addReport(data) {
+	return request('/app/medical/report/add', data, 'POST', 'application/json;charset=UTF-8');
+}
+//用户ID查询体检报告信息
+export function getByUserAndDate(data) {
+	return request('/app/medical/report/getByUserAndDate', data, 'GET', 'application/json;charset=UTF-8');
+}
+//用户查询体检报告列表
+export function getUserReportList(data) {
+	return request('/app/medical/report/listByUser/' + data, data, 'GET', 'application/json;charset=UTF-8');
+}
+//查询体检报告列表
+export function getReportList(data) {
+	return request('/app/medical/report/page', data, 'GET', 'application/json;charset=UTF-8');
+}
+//查询体检报告详情
+export function getReportById(data) {
+	return request('/app/medical/report/' + data, data, 'GET', 'application/json;charset=UTF-8');
+}
+//删除体检报告
+export function deleteReport(data) {
+	return request('/app/medical/report/' + data, data, 'DELETE', 'application/json;charset=UTF-8');
+}
+//更新体检报告
+export function updateReport(data) {
+	return request('/app/medical/report/update', data, 'PUT', 'application/json;charset=UTF-8');
+}
+//对比报告
+export function compareReport(data) {
+	return request('/app/medical/report/compareReport', data, 'POST', 'application/json;charset=UTF-8');
+}
+//获取指定报告的指标分类
+export function getAllCateByReportId(data) {
+	return request('/app/medical/result/getAllCateByReportId', data, 'GET', 'application/json;charset=UTF-8');
+}
+//新增指标
+export function addIndicator(data) {
+	return request('/app/medical/indicator/add', data, 'POST', 'application/json;charset=UTF-8');
+}
+//根据分类查询指标
+export function listByCategory(data) {
+	return request('/app/medical/indicator/listByCategory', data, 'GET', 'application/json;charset=UTF-8');
+}
+//查询所有启用的指标
+export function listEnabled(data) {
+	return request('/app/medical/indicator/listEnabled', data, 'GET', 'application/json;charset=UTF-8');
+}
+//过滤所有启用的指标
+export function listAllEnabledByReportId(data) {
+	return request('/app/medical/indicator/listAllEnabledByReportId', data, 'GET', 'application/json;charset=UTF-8');
+}
+//分页查询医疗指标列表
+export function getPage(data) {
+	return request('/app/medical/indicator/page', data, 'GET', 'application/json;charset=UTF-8');
+}
+//更新指标
+export function updateIndicator(data) {
+	return request('/app/medical/indicator/update', data, 'PUT', 'application/json;charset=UTF-8');
+}
+//根据ID查询指标详情
+export function getIndicatorById(data) {
+	return request('/app/medical/indicator/'+ data, data, 'GET', 'application/json;charset=UTF-8');
+}
+//删除指标
+export function deleteIndicator(data) {
+	return request('/app/medical/indicator/' + data, data, 'DELETE', 'application/json;charset=UTF-8');
+}
+
+//新增检查结果
+export function addResult(data) {
+	return request('/app/medical/result/add', data, 'POST', 'application/json;charset=UTF-8');
+}
+//批量新增检查结果
+export function addBatchAdd(data) {
+	return request('/app/medical/result/batchAdd', data, 'POST', 'application/json;charset=UTF-8');
+}
+//批量更新检查结果
+export function updateBatch(data) {
+	return request('/app/medical/result/updateBatch', data, 'POST', 'application/json;charset=UTF-8');
+}
+//根据指标ID查询所有结果
+export function listByIndicator(data) {
+	return request('/app/medical/result/listByIndicator/'+ data, data, 'GET');
+}
+//根据ID查询所有结果
+export function listByReport(data) {
+	return request('/app/medical/result/listByReport/'+ data, data, 'GET');
+}
+//分页查询报告指标检查结果列表
+export function getResult(data) {
+	return request('/app/medical/result/page', data, 'GET');
+}
+//更新检查结果
+export function updateResult(data) {
+	return request('/app/medical/result/update', data, 'PUT', 'application/json;charset=UTF-8');
+}
+//查询检查结果详情
+export function getResultById(data) {
+	return request('/app/medical/result/'+ data, data, 'GET');
+}
+//删除检查结果
+export function deleteResult(data) {
+	return request('/app/medical/result/'+ data, data, 'DELETE');
+}
+
+//查询所有单位
+export function getListAll(data) {
+	return request('/app/medical/unit/listAll', data, 'GET');
+}
+//新建附件
+export function addAttachment(data) {
+	return request('/app/attachment', data, 'POST', 'application/json;charset=UTF-8');
+}
+//查询附件
+export function getAttachment(data) {
+	return request('/app/attachment/list', data, 'GET', 'application/json;charset=UTF-8');
+}
+//新建体检报告
+export function addUrl(data) {
+	return request('/app/attachment/addList', data, 'POST', 'application/json;charset=UTF-8');
+}
+//删除附件
+export function deleteAttachment(data) {
+	return request('/app/attachment/'+data, data, 'DELETE');
+}
+
+//工作完成百分比
+export function queryCateStatis(data) {
+	return request('/app/todoItems/queryCateStatis', data, 'GET');
+}
+//扫码
+export function bindPromoter(data) {
+ 	 return request('/store/app/bindPromoter',data,'POST','application/json;charset=UTF-8');
+ }
+ //日程查询
+ export function getItinerary(data) {
+ 	return request('/app/fs/itinerary/list', data, 'GET');
+ }
+ //日程新增
+ export function addItinerary(data) {
+ 	return request('/app/fs/itinerary/add', data, 'POST','application/json;charset=UTF-8');
+ }
+ //日程查询详情
+ export function getItineraryInfo(data) {
+ 	return request('/app/fs/itinerary/info', data, 'GET');
+ }
+ //更新日程
+ export function updateItinerary(data) {
+ 	return request('/app/fs/itinerary/update', data,'POST','application/json;charset=UTF-8');
+ }
+ //删除日程
+ export function deleteItinerary(data) {
+ 	return request('/app/fs/itinerary/delete', data, 'GET');
+ }

+ 29 - 0
api/coupon.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getCouponIssueList(data) {
+ 	 return request('/user/store/app/coupon/getCouponIssueList',data,'GET');
+ }
+ export function getCompanyCouponIssueList(data) {
+ 	 return request('/store/app/coupon/getCompanyCouponIssueList',data,'GET');
+ }
+ export function getCouponIssueById(data) {
+ 	 return request('/store/app/coupon/getCouponIssueById',data,'GET');
+ }
+ 
+ 
+ 
+ export function receive(data) {
+ 	return request('/store/app/coupon/receive',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyCouponList(data) {
+ 	 return request('/store/app/coupon/getMyCouponList',data,'GET');
+ }
+ export function getMyEnableCouponList(data) {
+ 	 return request('/store/app/coupon/getMyEnableCouponList',data,'GET');
+ }
+ 
+ 
+
+ 

+ 9 - 0
api/department.js

@@ -0,0 +1,9 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getDepartmentList(data) {
+ 	 return request('/store/app/department/getDepartmentList',data,'GET');
+ }
+ 
+  
+  

+ 16 - 0
api/disease.js

@@ -0,0 +1,16 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getDiseaseList(data) {
+ 	 return request('/store/app/disease/getDiseaseList',data,'GET');
+ }
+ export function getDiseaseById(data) {
+ 	 return request('/store/app/disease/getDiseaseById',data,'GET');
+ }
+ 
+ 
+ 
+ 
+  
+  
+  

+ 45 - 0
api/doc.js

@@ -0,0 +1,45 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getMyDocList(data) {
+ 	 return request('/store/app/doc/getMyDocList',data,'GET');
+ }
+ 
+ export function getDocDetails(data) {
+ 	 return request('/store/app/doc/getDocDetails',data,'GET');
+ }
+ 
+ export function addDoc(data) {
+ 	return request('/store/app/doc/addDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function editDoc(data) {
+ 	return request('/store/app/doc/editDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delDoc(data) {
+ 	return request('/store/app/doc/delDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyDocRecordList(data) {
+ 	 return request('/store/app/doc/getMyDocRecordList',data,'GET');
+ }
+ 
+ export function getDocRecordReplyList(data) {
+ 	 return request('/store/app/doc/getDocRecordReplyList',data,'GET');
+ }
+ 
+ 
+ export function addDocRecord(data) {
+ 	return request('/store/app/doc/addDocRecord',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyDocOrderList() {
+ 	 return request('/store/app/doc/getMyDocOrderList',null,'GET');
+ }
+ 
+ export function addDocOrder(data) {
+ 	return request('/store/app/doc/addDocOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

+ 11 - 0
api/doctorArticle.js

@@ -0,0 +1,11 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getDoctorArticleList(data) {
+ 	 return request('/store/app/doctorArticle/getDoctorArticleList',data,'GET');
+ }
+ export function getDoctorArticleById(data) {
+ 	 return request('/store/app/doctorArticle/getDoctorArticleById',data,'GET');
+ }
+  
+   

+ 47 - 0
api/doctorOrder.js

@@ -0,0 +1,47 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ 
+ 
+ export function getDepartmentList(data) {
+ 	 return request('/store/app/doctorOrder/getDepartmentList',data,'GET');
+ } 
+ 
+ export function getDoctorList(data) {
+ 	 return request('/store/app/doctorOrder/getDoctorList',data,'GET');
+ } 
+ 
+ export function getDoctorCase(data) {
+ 	 return request('/store/app/doctorOrder/getDoctorCase',data,'GET');
+ } 
+ 
+ 
+ export function getMyDoctorOrderList(data) {
+ 	 return request('/store/app/doctorOrder/getMyDoctorOrderList',data,'GET');
+ } 
+ 
+ export function getDoctorDetail(data) {
+ 	 return request('/store/app/doctorOrder/getDoctorDetail',data,'GET');
+ } 
+ 
+ export function getDoctorOrderDetail(data) {
+ 	 return request('/store/app/doctorOrder/getDoctorOrderDetail',data,'GET');
+ } 
+ export function create(data) {
+ 	 return request('/store/app/doctorOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pay(data) {
+ 	 return request('/store/app/doctorOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ export function cancelOrder(data) {
+ 	 return request('/store/app/doctorOrder/cancelOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pingOrder(data) {
+ 	 return request('/store/app/doctorOrder/pingOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getImOrderDetail(data) {
+ 	 return request('/store/app/doctorOrder/getImOrderDetail',data,'GET');
+ } 
+ 
+ 

+ 84 - 0
api/health.js

@@ -0,0 +1,84 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+//获取咨询人员列表
+export function getuserlist(data) {
+	return request('/store/app/common/getDicts', data, 'GET');
+}
+//提交咨询内容
+export function submitconsult(data) {
+	return request('/store/app/common/getDicts', data, 'GET');
+}
+//获取用户列表
+export function getInfoList(data) {
+	return request('/companyapp/app/fs/userinfo/list', data, 'GET');
+}
+
+//获取用户基本信息
+export function getInfo(data) {
+	return request('/companyapp/app/fs/userinfo/info', data, 'GET');
+}
+
+//添加用户基本信息
+export function addInfo(data) {
+	return request('/companyapp/app/fs/userinfo/add', data, 'POST','application/json;charset=UTF-8');
+}
+
+//修改用户基本信息
+export function updateInfo(data) {
+	return request('/companyapp/app/fs/userinfo/update', data, 'POST','application/json;charset=UTF-8');
+}
+//删除用户基本信息
+export function deleteInfo(data) {
+	return request('/companyapp/app/fs/userinfo/delete', data, 'GET','application/json;charset=UTF-8');
+}
+//获取会员分类
+export function getMember(data) {
+	return request('/companyapp/app/common/getDictByKey?key=user_member_classify', data, 'GET');
+}
+//主页信息
+export function homeInfo(data) {
+	return request('/companyapp/app/fs/health/profile/home/info', data, 'GET');
+}
+//健康档案主页信息
+export function getDoc(data) {
+	return request('/companyapp/app/fs/health/profile/info', data, 'GET');
+}
+//添加健康档案信息
+export function addDoc(data) {
+	return request('/companyapp/app/fs/health/profile/add', data, 'POST','application/json;charset=UTF-8');
+}
+
+//修改健康档案信息
+export function updateDoc(data) {
+	return request('/companyapp/app/fs/health/profile/update', data, 'POST','application/json;charset=UTF-8');
+}
+//删除健康档案信息
+export function deleteDoc(data) {
+	return request('/companyapp/app/fs/health/profile/delete', data, 'GET','application/json;charset=UTF-8');
+}
+
+//最新数据查询
+export function getLatest(data) {
+	return request('/companyapp/app/fs/health/data/latest/info', data, 'GET','application/json;charset=UTF-8');
+}
+//数据新增
+export function addData(data) {
+	return request('/companyapp/app/fs/health/data/add', data, 'POST','application/json;charset=UTF-8');
+}
+//数据列表查询
+export function getDataList(data) {
+	return request('/companyapp/app/fs/health/data/list', data, 'GET','application/json;charset=UTF-8');
+}
+//数据更新
+export function updateData(data) {
+	return request('/companyapp/app/fs/health/data/update', data, 'POST','application/json;charset=UTF-8');
+}
+//数据数据删除
+export function deleteData(data) {
+	return request('/companyapp/app/fs/health/data/delete', data, 'GET','application/json;charset=UTF-8');
+}
+//数据数据详情
+export function getDataById(data) {
+	return request('/companyapp/app/fs/health/data/info', data, 'GET','application/json;charset=UTF-8');
+}

+ 84 - 0
api/healthUser.js

@@ -0,0 +1,84 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+//获取咨询人员列表
+export function getuserlist(data) {
+	return request('/store/app/common/getDicts', data, 'GET');
+}
+//提交咨询内容
+export function submitconsult(data) {
+	return request('/store/app/common/getDicts', data, 'GET');
+}
+
+//获取用户基本信息
+export function getInfo(data) {
+	return request('/app/fs/userinfo/info', data, 'GET');
+}
+
+//添加用户基本信息
+export function addInfo(data) {
+	return request('/app/fs/userinfo/add', data, 'POST','application/json;charset=UTF-8');
+}
+
+//修改用户基本信息
+export function updateInfo(data) {
+	return request('/app/fsinfo/update', data, 'POST','application/json;charset=UTF-8');
+}
+//删除用户基本信息
+export function deleteInfo(data) {
+	return request('/app/fsinfo/delete', data, 'GET','application/json;charset=UTF-8');
+}
+//获取会员分类
+export function getMember(data) {
+	return request('/app/common/getDictByKey?key=user_member_classify', data, 'GET');
+}
+//主页信息
+export function homeInfo(data) {
+	return request('/app/fs/health/profile/home/info', data, 'GET');
+}
+//健康档案主页信息
+export function getDoc(data) {
+	return request('/app/fs/health/profile/info', data, 'GET');
+}
+//添加健康档案信息
+export function addDoc(data) {
+	return request('/app/fs/health/profile/add', data, 'POST','application/json;charset=UTF-8');
+}
+
+//修改健康档案信息
+export function updateDoc(data) {
+	return request('/app/fs/health/profile/update', data, 'POST','application/json;charset=UTF-8');
+}
+//删除健康档案信息
+export function deleteDoc(data) {
+	return request('/app/fs/health/profile/delete', data, 'GET','application/json;charset=UTF-8');
+}
+
+//最新数据查询
+export function getLatest(data) {
+	return request('/app/fs/health/data/latest/info', data, 'GET','application/json;charset=UTF-8');
+}
+//最新数据查询可视化
+export function getLatestList(data) {
+	return request('/app/fs/health/data/latest/list', data, 'GET','application/json;charset=UTF-8');
+}
+//数据新增
+export function addData(data) {
+	return request('/app/fs/health/data/add', data, 'POST','application/json;charset=UTF-8');
+}
+//数据列表查询
+export function getDataList(data) {
+	return request('/app/fs/health/data/list', data, 'GET','application/json;charset=UTF-8');
+}
+//数据更新
+export function updateData(data) {
+	return request('/app/fs/health/data/update', data, 'POST','application/json;charset=UTF-8');
+}
+//数据数据删除
+export function deleteData(data) {
+	return request('/app/fs/health/data/delete', data, 'GET','application/json;charset=UTF-8');
+}
+//数据数据详情
+export function getDataById(data) {
+	return request('/app/fs/health/data/info', data, 'GET','application/json;charset=UTF-8');
+}

+ 66 - 0
api/index.js

@@ -0,0 +1,66 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function getDicts(data) {
+ 	 return request('/store/app/common/getDicts',data,'GET');
+} 
+export function getCanvas() {
+ 	 return request('/store/app/index/getCanvas',null,'GET');
+} 
+export function getMenu() {
+ 	 return request('/store/app/index/getMenu',null,'GET');
+} 
+export function getIndexData(data) {
+ 	 return request('/store/app/index/getIndexData',data,'GET');
+} 
+export function getTuiArticle(data) {
+ 	 return request('/store/app/index/getTuiArticle',data,'GET');
+} 
+export function getTuiDoctor(data) {
+ 	 return request('/store/app/index/getTuiDoctor',data,'GET');
+} 
+
+export function getTuiDoctorOrder(data) {
+ 	 return request('/store/app/index/getTuiDoctorOrder',data,'GET');
+} 
+
+export function getCartCount() {
+ 	 return request('/store/app/index/getCartCount',null,'GET');
+} 
+
+
+ export function getFamousPrescribeList(data) {
+	 return request('/store/app/index/getFamousPrescribeList',data,'GET');
+ }
+ export function getFamousPrescribeById(data) {
+	 return request('/store/app/index/getFamousPrescribeById',data,'GET');
+ }
+ export function getQuestionsList(data) {
+ 	 return request('/store/app/index/getQuestionsList',data,'GET');
+ }
+ export function getQuestionsById(data) {
+ 	 return request('/store/app/index/getQuestionsById',data,'GET');
+ }
+ export function getMedicatedFoodList(data) {
+ 	 return request('/store/app/index/getMedicatedFoodList',data,'GET');
+ }
+ export function getMedicatedFoodById(data) {
+ 	 return request('/store/app/index/getMedicatedFoodById',data,'GET');
+ }
+ export function getVesselList(data) {
+ 	 return request('/store/app/index/getVesselList',data,'GET');
+ }
+ export function getVesselById(data) {
+ 	 return request('/store/app/index/getVesselById',data,'GET');
+ }
+ export function getChineseMedicineList(data) {
+ 	 return request('/store/app/index/getChineseMedicineList',data,'GET');
+ }
+ export function getChineseMedicineById(data) {
+ 	 return request('/store/app/index/getChineseMedicineById',data,'GET');
+ }
+ 
+ 
+
+ 
+ 

+ 22 - 0
api/patient.js

@@ -0,0 +1,22 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getPatientList() {
+ 	 return request('/store/app/patient/getPatientList',null,'GET');
+ }
+
+ export function getPatientById(data) {
+ 	 return request('/store/app/patient/getPatientById',data,'GET');
+ } 
+ 
+ export function addPatient(data) {
+ 	return request('/store/app/patient/addPatient',data,'POST','application/json;charset=UTF-8');
+ }
+
+ export function editPatient(data) {
+ 	return request('/store/app/patient/editPatient',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delPatient(data) {
+ 	return request('/store/app/patient/delPatient',data,'POST','application/json;charset=UTF-8');
+ }

+ 22 - 0
api/payment.js

@@ -0,0 +1,22 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+  
+ export function payment(data) {
+ 	 return request('/store/app/payment/payment',data,'POST','application/json;charset=UTF-8');
+ }
+  
+  //余额充值套餐列表
+  export function getTemplates(data) {
+  	 return request('/recharge-templates/list',data,'GET');
+  }
+  //余额充值套餐详情
+  export function getTemplatesById(data) {
+  	 return request('/recharge-templates/'+data,data,'GET');
+  }
+ //余额充值套餐支付
+ export function toPayment(data) {
+ 	 return request('/recharge-templates/payment',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

+ 21 - 0
api/prescribe.js

@@ -0,0 +1,21 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function doPrescribe(data) {
+ 	 return request('/store/app/prescribe/doPrescribe',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getMyPrescribeList(data) {
+ 	 return request('/store/app/prescribe/getMyPrescribeList',data,'GET');
+ }
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 

+ 66 - 0
api/product.js

@@ -0,0 +1,66 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+
+ export function getProductCate(data) {
+ 	 return request('/store/app/product/getProductCate',data,'GET');
+ }
+ 
+ export function getProductCateByPid(data) {
+ 	 return request('/store/app/product/getProductCateByPid',data,'GET');
+ }
+ 
+ export function getProducts(data) {
+ 	 return request('/store/app/product/getProducts',data,'GET');
+ }
+ export function getProductDetails(data) {
+ 	 return request('/store/app/product/getProductDetails',data,'GET');
+ }
+ 
+ export function getCarts(data) {
+ 	 return request('/store/app/product/getCarts',data,'GET');
+ }
+ export function addCart(data) {
+ 	 return request('/store/app/product/addCart',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delCart(data) {
+ 	 return request('/store/app/product/delCart',data,'POST','application/json;charset=UTF-8');
+ }
+ export function cartNum(data) {
+ 	 return request('/store/app/product/cartNum',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getCartCount(data) {
+ 	 return request('/store/app/product/getCartCount',data,'GET');
+ }
+ export function getGoodsProduct() {
+ 	 return request('/store/app/product/getGoodsProduct',null,'GET');
+ }
+ export function getGoodsProducts(data) {
+ 	 return request('/store/app/product/getGoodsProducts',data,'GET');
+ }
+ export function getTuiProducts(data) {
+ 	 return request('/store/app/product/getTuiProducts',data,'GET');
+ }
+ export function getStoreProductAttrValueList(data) {
+ 	 return request('/store/app/product/getStoreProductAttrValueList',data,'GET');
+ }
+ 
+ export function getProductStoreStock(data) {
+ 	 return request('/app/product/getProductStoreStock',data,'GET');
+ }
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 

+ 14 - 0
api/store.js

@@ -0,0 +1,14 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ // 获取门店详情
+ export function getStoreById(data) {
+ 	 return request('/store/app/store/getStoreById',data,'GET');
+ }
+ // 获取门店详情新
+ export function getNewStoreById(data) {
+ 	 return request('/store/app/store/'+data,data,'GET');
+ }
+ export function getIndexData(data) {
+  	 return request('/store/app/index/getIndexData',data,'GET');
+ } 

+ 29 - 0
api/storeAfterSales.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getMyStoreOrderItemByOrderId(data) {
+ 	 return request('/store/app/storeAfterSales/getMyStoreOrderItemByOrderId',data,'GET');
+ } 
+ export function applyAfterSales(data) {
+ 	 return request('/store/app/storeAfterSales/store/applyAfterSales',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getAfterSalesList(data) {
+ 	 return request('/store/app/storeAfterSales/getAfterSalesList',data,'GET');
+ } 
+ 
+ export function getAfterSalesDetails(data) {
+ 	 return request('/store/app/storeAfterSales/getAfterSalesDetails',data,'GET');
+ } 
+ export function revoke(data) {
+ 	 return request('/store/app/storeAfterSales/revoke',data,'POST','application/json;charset=UTF-8');
+ }
+ export function addDelivery(data) {
+ 	 return request('/store/app/storeAfterSales/addDelivery',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+ 

+ 92 - 0
api/storeOrder.js

@@ -0,0 +1,92 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getMyStoreOrderList(data) {
+ 	 return request('/store/app/storeOrder/getMyStoreOrderList',data,'GET');
+ } 
+ export function getCompanyStoreOrderList(data) {
+ 	 return request('/store/app/storeOrder/getCompanyStoreOrderList',data,'GET');
+ } 
+ export function getMyStoreOrderById(data) {
+ 	 return request('/store/app/storeOrder/getMyStoreOrderById',data,'GET');
+ } 
+ 
+ 
+ export function getStoreOrderById(data) {
+ 	 return request('/store/app/storeOrder/getStoreOrderById',data,'GET');
+ } 
+ 
+ export function getStoreOrderByCombinationId(data) {
+ 	 return request('/store/app/storeOrder/getStoreOrderByCombinationId',data,'GET');
+ } 
+ export function otherPaymentByCombinationId(data) {
+ 	 return request('/store/app/storeOrder/otherPaymentByCombinationId',data,'POST','application/json;charset=UTF-8');
+ } 
+ 
+ export function confirm(data) {
+ 	 return request('/store/app/storeOrder/confirm',data,'POST','application/json;charset=UTF-8');
+ }
+ export function computed(data) {
+ 	 return request('/store/app/storeOrder/computed',data,'POST','application/json;charset=UTF-8');
+ }
+ export function create(data) {
+ 	 return request('/store/app/storeOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pay(data) {
+ 	 return request('/store/app/storeOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ export function payByCombinationId(data) {
+ 	 return request('/store/app/storeOrder/payByCombinationId',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function editPayType(data) {
+ 	 return request('/store/app/storeOrder/editPayType',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function editPayTypeByCombinationId(data) {
+ 	 return request('/store/app/storeOrder/editPayTypeByCombinationId',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function payRemain(data) {
+ 	 return request('/store/app/storeOrder/payRemain',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function otherPayment(data) {
+ 	 return request('/store/app/storeOrder/otherPayment',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function otherPaymentRemain(data) {
+ 	 return request('/store/app/storeOrder/otherPaymentRemain',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function cancelOrder(data) {
+ 	 return request('/store/app/storeOrder/cancelOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function finishOrder(data) {
+ 	 return request('/store/app/storeOrder/finishOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getExpress(data) {
+ 	 return request('/store/app/storeOrder/getExpress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function confirmPackageOrder(data) {
+ 	 return request('/store/app/storeOrder/confirmPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function computedPackageOrder(data) {
+ 	 return request('/store/app/storeOrder/computedPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function createPackageOrder(data) {
+ 	 return request('/store/app/storeOrder/createPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getOrderCount() {
+ 	 return request('/store/app/storeOrder/getOrderCount',null,'GET');
+ } 
+ 
+ 
+ 
+ 

+ 15 - 0
api/storeProductPackage.js

@@ -0,0 +1,15 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getStoreProductPackage(data) {
+ 	 return request('/store/app/storeProductPackage/getStoreProductPackage',data,'GET');
+ } 
+ 
+ export function getStoreProductPackageDetails(data) {
+ 	 return request('/store/app/storeProductPackage/getStoreProductPackageDetails',data,'GET');
+ } 
+ 
+  
+ 
+ 
+ 

+ 24 - 0
api/test.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getTestList(data) {
+ 	 return request('/store/app/test/getTestList',data,'GET');
+ }
+ export function getTestDetails(data) {
+ 	 return request('/store/app/test/getTestDetails',data,'GET');
+ }
+ 
+ export function getTestTempDetails(data) {
+ 	 return request('/store/app/test/getTestTempDetails',data,'GET');
+ }
+ export function getTestReport(data) {
+ 	 return request('/store/app/test/getTestReport',data,'GET');
+ }
+ export function getTestReportImg(data) {
+ 	 return request('/store/app/test/getTestReportImg',data,'GET');
+ }
+ export function doReport(data) {
+  	return request('/store/app/test/doReport',data,'POST','application/json;charset=UTF-8');
+ }
+  
+  

+ 70 - 0
api/user.js

@@ -0,0 +1,70 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function loginByMiniApp(data) {
+ 	 return request('/store/app/wx/loginByMiniApp',data,'POST','application/json;charset=UTF-8');
+ }
+ export function loginByMp(data) {
+ 	 return request('/store/app/wx/loginByMp',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getUserInfo() {
+ 	 return request('/store/app/user/getUserInfo',null,'GET');
+ }
+ 
+ export function editUser(data) {
+ 	return request('/store/app/user/editUser',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getWeixinInfo(data) {
+ 	return request('/store/app/wx/getWeixinInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ export function checkLogin() {
+ 	 return request('/store/app/user/checkLogin',null,'GET');
+ }
+ export function getTuiImg() {
+ 	 return request('/store/app/user/getTuiImg',null,'GET');
+ }
+ export function getMyTuiOrderList(data) {
+ 	 return request('/store/app/user/getMyTuiOrderList',data,'GET');
+ }
+ export function getTuiMoney() {
+ 	 return request('/store/app/user/getTuiMoney',null,'GET');
+ }
+ export function getMyTuiList(data) {
+ 	 return request('/store/app/user/getMyTuiList',data,'GET');
+ }
+ export function getTuiMoneyLogs(data) {
+ 	 return request('/store/app/user/getTuiMoneyLogs',data,'GET');
+ }
+ 
+ export function getProductFoots(data) {
+ 	 return request('/store/app/user/getProductFoots',data,'GET');
+ }
+ export function delProductFoots(data) {
+ 	 return request('/store/app/user/delProductFoots',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function doExtract(data) {
+ 	 return request('/store/app/user/doExtract',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getExtractList(data) {
+ 	 return request('/store/app/user/getExtractList',data,'GET');
+ }
+ export function applyPromoter(data) {
+ 	 return request('/store/app/user/applyPromoter',data,'POST','application/json;charset=UTF-8');
+ }
+ export function bindPromoter(data) {
+ 	 return request('/store/app/user/bindPromoter',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 

+ 16 - 0
api/userSign.js

@@ -0,0 +1,16 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+ export function getUserSign() {
+ 	 return request('/store/app/sign/getUserSign',null,'GET');
+ }
+ 
+ export function getIntegral(data) {
+ 	 return request('/store/app/sign/getIntegral',data,'GET');
+ }
+ export function doSign(data) {
+ 	 return request('/store/app/sign/sign',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

+ 276 - 0
assets/css/common.less

@@ -0,0 +1,276 @@
+ 
+page {
+  background: #F7F8FA;
+  height: 100%;
+}
+.container{
+  height: 100%;
+}
+rich-text {
+  width: 100%;
+  display: block;
+  img,
+  image {
+    display: block;
+    width: 100%;
+  }
+}
+
+/*单行文本溢出省略号*/
+.one-t {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  transition: all linear 0.2s;
+}
+
+/*多行文本溢出省略号*/
+.more-t {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  transition: all linear 0.2s;
+}
+
+/* ==================
+          flex布局(colorui里面也有相关基础样式)
+ ==================== */
+/* x水平排列*/
+.x-f {
+  display: flex;
+  align-items: center;
+}
+
+/*x两端且水平居中*/
+.x-bc {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+/*x平分且水平居中*/
+.x-ac {
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+}
+
+/*x水平靠上对齐*/
+.x-start {
+  display: flex;
+  align-items: flex-start;
+}
+
+/*x水平靠下对齐*/
+.x-end {
+  display: flex;
+  align-items: flex-end;
+}
+
+/*上下左右居中*/
+.x-c {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+/*y竖直靠左*/
+.y-start {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+/*y竖直靠右*/
+.y-end {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-end;
+}
+
+/*y竖直居中*/
+.y-f {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+// y竖直两端
+.y-b {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+/*y竖直两端居中*/
+.y-bc {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+}
+/* layout */
+.acea-row {
+  display: flex;
+  flex-wrap: wrap;
+  /* 辅助类 */
+}
+.acea-row.row-middle {
+  align-items: center;
+}
+.acea-row.row-top {
+  align-items: flex-start;
+}
+.acea-row.row-bottom {
+  align-items: flex-end;
+}
+.acea-row.row-center {
+  justify-content: center;
+}
+.acea-row.row-right {
+  justify-content: flex-end;
+}
+.acea-row.row-left {
+  justify-content: flex-start;
+}
+.acea-row.row-between {
+  justify-content: space-between;
+}
+.acea-row.row-around {
+  justify-content: space-around;
+}
+.acea-row.row-column-around {
+  flex-direction: column;
+  justify-content: space-around;
+}
+.acea-row.row-column {
+  flex-direction: column;
+}
+.acea-row.row-column-between {
+  flex-direction: column;
+  justify-content: space-between;
+}
+/* 上下左右垂直居中 */
+.acea-row.row-center-wrapper {
+  align-items: center;
+  justify-content: center;
+}
+/* 上下两边居中对齐 */
+.acea-row.row-between-wrapper {
+  align-items: center;
+  justify-content: space-between;
+}
+
+/*每个页面公共css */
+// .ellipsis{
+// 	overflow: hidden;
+// 	text-overflow: ellipsis;
+// 	white-space: nowrap;
+// }
+.ellipsis2{
+	overflow:hidden; 
+	text-overflow:ellipsis;
+	display:-webkit-box; 
+	-webkit-box-orient:vertical;
+	-webkit-line-clamp:2; 
+}
+radio .wx-radio-input{
+  width: 36rpx;
+  height: 36rpx;
+  border: 1px solid #CCCCCC;
+}
+/* 选中后的 背景样式  */
+radio .wx-radio-input.wx-radio-input-checked{
+	background: linear-gradient(135deg, #66b2ef  0%, #008FD3 100%);
+	border: 1px solid #0bb3f2;
+}
+/* 选中后的 对勾样式 (白色对勾) */
+radio .wx-radio-input.wx-radio-input-checked::before{
+	color: #ffffff;
+}
+checkbox .wx-checkbox-input{
+	width: 36rpx;
+	height: 36rpx;
+	border: 1px solid #CCCCCC;
+	border-radius: 50%;
+}
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+	//background: linear-gradient(135deg, #66b2ef 0%, #0bb3f2 100%);
+	background: #388BFF;
+	border: 1px solid #388BFF;
+	border-radius: 50%;
+}
+checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
+	color: #ffffff;
+}
+::-webkit-scrollbar {
+   width: 0;
+   height: 0;
+   color: transparent;
+ }
+ /* 暂无数据 */
+.no-data-box{
+	padding: 100upx 50upx;
+	text-align: center;
+	image{
+		width: 372rpx;
+		height: 240rpx;
+	}
+	.empty-title{
+		margin-top: 20rpx;
+		font-size: 32rpx;
+		color: #bbbbbb;
+		 
+	}
+}
+.Loads {
+  height: 0.8*100rpx;
+  font-size: 0.25*100rpx;
+  color: #000;
+}
+.Loads .iconfont {
+  font-size: 0.3*100rpx;
+  margin-right: 0.1*100rpx;
+  height: 0.32*100rpx;
+  line-height: 0.32*100rpx;
+}
+/*加载动画*/
+@keyframes load {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+.loadingpic {
+  animation: load 3s linear 1s infinite;
+}
+.loading {
+  animation: load linear 1s infinite;
+}
+
+ .back-box{
+	position: relative;
+	.title{
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%,-50%);
+	}
+}
+/* tab颜色 */
+.tab-orange {
+	background: #FF5039 !important;
+}
+.tab-gree{
+	background: #2CAE5C !important;
+}
+.tab-purple {
+	background: #7A73E0 !important;
+}
+.tab-blue {
+	background: #4585F8 !important;
+}

+ 137 - 0
assets/css/common.scss

@@ -0,0 +1,137 @@
+// 字体
+@for $i from 20 through 100{
+    .fs#{$i} {
+			font-size: #{$i}rpx;
+    }
+}
+// 颜色
+@for $i from 0 through 9{
+    .color#{$i} {
+			color: #{$i}#{$i}#{$i};
+    }
+}
+// padding
+@for $i from 1 through 100{
+    .p#{$i} {
+			padding: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .ptb#{$i} {
+			padding-top: #{$i}rpx ;
+			padding-bottom: #{$i}rpx ;
+    }
+}
+@for $i from 1 through 100{
+    .plr#{$i} {
+			padding-left: #{$i}rpx;
+			padding-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 200{
+    .pt#{$i} {
+			padding-top: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .pl#{$i} {
+			padding-left: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .pr#{$i} {
+			padding-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 200{
+    .pb#{$i} {
+			padding-bottom: #{$i}rpx;
+    }
+}
+// margin
+@for $i from 1 through 100{
+    .m#{$i} {
+			margin: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mtb#{$i} {
+			margin-top: #{$i}rpx ;
+			margin-bottom: #{$i}rpx ;
+    }
+}
+@for $i from 1 through 100{
+    .mlr#{$i} {
+			margin-left: #{$i}rpx;
+			margin-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mt#{$i} {
+			margin-top: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .ml#{$i} {
+			margin-left: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mr#{$i} {
+			margin-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mb#{$i} {
+			margin-bottom: #{$i}rpx;
+    }
+}
+// 圆角
+@for $i from 0 through 100{
+    .radius#{$i} {
+			border-radius: #{$i}rpx;
+    }
+}
+// padding 左右+width自动计算
+@for $i from 10 through 60{
+    .w-calc-#{$i} {
+			width: calc(100% - #{$i*2}rpx);
+			padding-left:  #{$i}rpx;
+			padding-right:  #{$i}rpx;
+    }
+}
+
+// gap
+@for $i from 1 through 100{
+	.gap#{$i} {
+		gap: #{$i}rpx;
+	}
+}
+
+// 高
+@for $i from 1 through 900{
+	.h#{$i} {
+		height: #{$i}rpx;
+	}
+}
+// 宽
+@for $i from 1 through 900{
+	.w#{$i} {
+		width: #{$i}rpx;
+	}
+}
+// 宽
+@for $i from 1 through 900{
+	.lh#{$i} {
+		line-height: #{$i}rpx;
+	}
+}
+
+
+// font-weight
+$steps: 100 200 300 400 500 600 700 800 bold;
+@each $i in $steps {
+	.weight-#{$i} {
+		font-weight: $i;
+	}
+}

+ 208 - 0
assets/css/commonTheme.css

@@ -0,0 +1,208 @@
+.hb {
+	height: 100%;
+	box-sizing: border-box;
+}
+
+.hidden {
+	overflow: hidden;
+}
+
+.w100 {
+	width: 100%;
+}
+
+.h100 {
+	height: 100%;
+}
+
+.row {
+	display: flex;
+	flex-direction: row;
+}
+
+.column {
+	display: flex;
+	flex-direction: column;
+}
+
+.justify-start {
+	display: flex;
+	justify-content: flex-start;
+}
+
+.justify-center {
+	display: flex;
+	justify-content: center;
+}
+
+.justify-end {
+	display: flex;
+	justify-content: flex-end;
+}
+
+.justify-around {
+	display: flex;
+	justify-content: space-around;
+}
+
+.justify-evenly {
+	display: flex;
+	justify-content: space-evenly;
+}
+
+.justify-between {
+	display: flex;
+	justify-content: space-between;
+}
+
+.align-start {
+	display: flex;
+	align-items: flex-start;
+}
+
+.align-center {
+	display: flex;
+	align-items: center;
+}
+
+.align-end {
+	display: flex;
+	align-items: flex-end;
+}
+
+.center {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.centerV {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-direction: column;
+}
+
+.wrap {
+	flex-wrap: wrap;
+}
+
+.flex-1 {
+	flex: 1;
+}
+
+.ellipsis {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	box-sizing: border-box;
+	width: 100%;
+	-webkit-line-clamp: 1;
+}
+
+.text-ellipsis {
+	display: -webkit-box;
+	/* 关键属性 */
+	-webkit-box-orient: vertical;
+	/* 排列方向 */
+	-webkit-line-clamp: 2;
+	/* 显示行数 */
+	overflow: hidden;
+	/* 超出隐藏 */
+	text-overflow: ellipsis;
+	/* 超出显示省略号 */
+	word-break: break-all;
+	/* 允许单词断行 */
+}
+
+.lines-2 {
+	-webkit-line-clamp: 2 !important;
+}
+
+.lines-3 {
+	-webkit-line-clamp: 3 !important;
+}
+
+.bold {
+	font-weight: bold;
+}
+
+.line-through {
+	text-decoration: line-through;
+}
+
+.nowrap {
+	white-space: nowrap;
+}
+
+.scrollx {
+	overflow-x: scroll;
+}
+
+.scrolly {
+	overflow-y: scroll;
+}
+
+.color-price {
+	color: #FF5030;
+}
+.color-white {
+	color: #fff;
+}
+
+.color-orange {
+	color: #FC581C;
+}
+.color-red {
+	color: #F22513;
+}
+.color-yellow {
+	color: #FE9000;
+}
+.color-pink {
+	color: #FF4545;
+}
+
+.color-text {
+	color: #222426;
+}
+
+.color-text1 {
+	color: #626468;
+}
+
+.color-text2 {
+	color: #898E91;
+}
+
+.color-text3 {
+	color: #B2B2B2;
+}
+
+.bg-color {
+	background-color: #008FD3;
+}
+
+.bg-price {
+	background-color: #FF5030;
+}
+
+.bg-yellow {
+	background-color: #F5A623;
+}
+
+.bg-gree {
+	background-color: #2CAE5C;
+}
+
+.bg-purple {
+	background-color: #7A73E0;
+}
+
+.bg-white{
+	background-color:#fff;
+}
+.bg-light{
+	background-color:#F5F7FA;
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 0
assets/iconfont/iconfont.css


BIN
assets/iconfont/iconfont.ttf


+ 89 - 0
common/request.js

@@ -0,0 +1,89 @@
+// uni-app请求封装
+export default class Request {
+	http(router, data = {}, method,contentType) {
+		let that = this;
+		// 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')
+		//用户模块
+		if(router.indexOf("/store/app") != -1 || router.indexOf("/app") != -1||  router.indexOf("/recharge-templates") != -1) {
+			path ='https://api.homemdt.net/user';
+		}
+		//企业
+		if(router.indexOf("/companyapp") != -1 ) {
+			path ='https://api.homemdt.net';
+		}
+		uni.setStorageSync('requestPath',path)
+		// uni.showLoading({
+		// 	title: '加载中'
+		// });
+		return new Promise((resolve, reject) => {
+			let token = uni.getStorageSync('AppToken');
+			var httpContentType='application/x-www-form-urlencoded';
+			if(contentType!=undefined){
+				//application/json;charset=UTF-8
+				httpContentType=contentType;
+			}
+			var routers=router;
+			// 请求
+			uni.request({
+				header: {
+					// 'Content-Type': 'application/x-www-form-urlencoded',
+					'Content-Type': httpContentType,
+					'AppToken': token
+				},
+				url: `${path}${router}`,
+				data: data,
+				method: method,
+				success: (res) => {
+					//收到开发者服务器成功返回的回调函数
+					if(res.data.code==401){//没有权限直接退出到登录界面
+						let pages = getCurrentPages();
+						pages.forEach(function(element) {
+						  if(element!=undefined&&element.route=="pages/auth/login"){
+						  	resolve(res.data)
+						  	return;
+						  }
+						});
+						// let url = pages[ pages.length - 1]; //当前页页面实例
+						// //如果登录界面已打开,自动关闭
+						// if(url!=undefined&&url.route=="pages/auth/login"){
+						//  	resolve(res.data)
+						// 	return;
+						// }
+						uni.navigateTo({
+							url:'/pages/auth/login',
+							success: () => {
+								uni.hideLoading();
+								
+							},
+							fail: () => {
+								uni.hideLoading();
+							}
+						})
+						return;
+					}
+					if (res.data.token) {
+						uni.setStorageSync('AppToken',res.data.token)
+					}
+					resolve(res.data)
+				},
+				fail:(res) =>{
+					//接口调用失败的回调函数
+				},
+				complete:(res) =>{
+					//接口调用结束的回调函数(调用成功、失败都会执行)
+					if (res.data && res.data.code == 401) {
+						return false
+					}
+					uni.hideLoading();
+				}
+				
+			})
+		})
+		 
+	}
+	
+}

+ 21 - 0
components/Loading.vue

@@ -0,0 +1,21 @@
+<template>
+  <view class="Loads acea-row row-center-wrapper" v-if="loading || !loaded" style="margin-top: 20rpx;">
+    <template v-if="loading">
+      <view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
+      正在加载中
+    </template>
+    <template v-if="!loading">
+      上拉加载更多
+    </template>
+  </view>
+</template>
+
+<script>
+  export default {
+    name: "Loading",
+    props: {
+      loaded: Boolean,
+      loading: Boolean
+    }
+  };
+</script>

+ 146 - 0
components/Menu.vue

@@ -0,0 +1,146 @@
+<template>
+	<view class="menu-list-box" v-if="carousel" :style="list.length <= menu ? `height:160rpx` : `height:320rpx`">
+		<swiper
+			class="menu-swiper-box"
+			:style="list.length <= menu ? `height:160rpx` : `height:320rpx`"
+			@change="onSwiper"
+			circular
+			:autoplay="false"
+			:interval="3000"
+			:duration="1000"
+		>
+			<swiper-item class="menu-swiper-item" v-for="(itemList, index) in carousel" :key="index" :style="list.length <= menu ? `height:200rpx` : `height:340rpx`">
+				<view class="menu-tab-box">
+					<view class="tab-list"  v-for="item in itemList" :key="item.menuName" @tap="routerTo(item)">
+						<image class="tab-img Shop-selector-circular" :style="{ width: imgW + 'rpx', height: imgW + 'rpx' }" :src="item.icon"></image>
+						<text class="Shop-selector-rect">{{ item.menuName }}</text>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="menu-dots" v-if="carousel.length > 1">
+			<text :class="menuCurrent === index ? 'dot-active' : 'dot'" v-for="(dot, index) in carousel.length" :key="index"></text>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	components: {},
+	data() {
+		return {
+			menuCurrent: 0 //轮播下标
+		};
+	},
+	props: {
+		list: {
+			type: Array,
+			default: []
+		},
+		menu: {
+			default: 4
+		},
+		imgW: {
+			type: Number,
+			default: 88
+		}
+	},
+	computed: {
+		carousel() {
+			if (this.list) {
+				let data = this.sortData(this.list, this.menu * 2);
+				return data;
+			}
+		}
+	},
+	created() {},
+	methods: {
+		// 数据分层
+		sortData(oArr, length) {
+			let arr = [];
+			let minArr = [];
+			oArr.forEach(c => {
+				if (minArr.length === length) {
+					minArr = [];
+				}
+				if (minArr.length === 0) {
+					arr.push(minArr);
+				}
+				minArr.push(c);
+			});
+		 
+			return arr;
+		},
+		// 轮播
+		onSwiper(e) {
+			this.menuCurrent = e.detail.current;
+		},
+		routerTo(item) {
+			 this.$emit('menuClick',item);
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.menu-list-box {
+	padding: 0rpx;
+	// background: #fff;
+	box-sizing: border-box;
+}
+.menu-list-box,
+.menu-swiper-box {
+	position: relative;
+	// background: #fff;
+	.menu-swiper-item {
+		// background: #fff;
+		height: 100%;
+		width: 100%;
+	}
+	.menu-tab-box {
+		display: flex;
+		flex-wrap: wrap;
+		.tab-list {
+			width: 25%;
+			display: -webkit-box;
+			display: -webkit-flex;
+			display: flex;
+			-webkit-box-orient: vertical;
+			-webkit-box-direction: normal;
+			-webkit-flex-direction: column;
+			flex-direction: column;
+			-webkit-box-align: center;
+			-webkit-align-items: center;
+			align-items: center;
+			font-size: 22rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: rgba(51, 51, 51, 1);
+			padding-bottom: 30rpx;
+			.tab-img {
+				border-radius: 25rpx;
+				margin-bottom: 10rpx;
+			}
+		}
+	}
+	.menu-dots {
+		display: flex;
+		position: absolute;
+		left: 50%;
+		transform: translateX(-50%);
+		.dot {
+			width: 40rpx;
+			height: 3rpx;
+			background: #eeeeee;
+			margin-right: 10rpx;
+		}
+
+		.dot-active {
+			width: 40rpx;
+			height: 3rpx;
+			background: #0bb3f2;
+			margin-right: 10rpx;
+		}
+	}
+}
+</style>

+ 251 - 0
components/Server.vue

@@ -0,0 +1,251 @@
+<template>
+	<view>
+		<view 
+		   @click="navTo"
+			class="serve"
+			:style="{ left: left + 'rpx', top: top + 'rpx' }"
+			@touchstart="onTouchStart"
+			@touchmove="onTouchMove"
+			@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>
+</template>
+
+<script>
+	export default {
+		name:"Server",
+		data() {
+			return {
+				left: 0,
+				top: 0,
+				startX: 0,
+				startY: 0,
+				isDragging: false,
+				screenWidth: 0,
+				screenHeight: 0
+			};
+		},
+		mounted() {
+			this.getSystemInfo();
+			this.initPosition();
+		},
+		methods: {
+			navTo(){
+				uni.navigateTo({
+					url: '/pages_echarts/statistics'
+				})
+			},
+			// 初始化位置
+			initPosition() {
+				// 从本地存储加载位置
+				const position = uni.getStorageSync('server_position');
+				if (position) {
+					this.left = position.left;
+					this.top = position.top;
+				} else {
+					// 默认位置:右侧80%高度
+					this.left = 750 - 150 - 20; // 屏幕宽度 - 容器宽度 - 右边距
+					this.top = this.px2rpx(this.screenHeight * 0.8 - 75); // 80%高度,居中偏移
+				}
+			},
+			
+			// 获取系统信息
+			getSystemInfo() {
+				uni.getSystemInfo({
+					success: (res) => {
+						this.screenWidth = res.windowWidth;
+						this.screenHeight = res.windowHeight;
+					}
+				});
+			},
+			
+			// 触摸开始
+			onTouchStart(e) {
+				// 阻止事件冒泡,不影响其他元素
+				e.stopPropagation();
+				e.preventDefault();
+				
+				this.startX = e.touches[0].clientX;
+				this.startY = e.touches[0].clientY;
+				this.isDragging = false;
+			},
+			
+			// 触摸移动
+			onTouchMove(e) {
+				// 阻止事件冒泡和默认行为
+				e.stopPropagation();
+				e.preventDefault();
+				
+				if (!this.startX || !this.startY) return;
+				
+				const currentX = e.touches[0].clientX;
+				const currentY = e.touches[0].clientY;
+				
+				const diffX = currentX - this.startX;
+				const diffY = currentY - this.startY;
+				
+				// 判断是否开始拖拽(移动超过5px)
+				if (!this.isDragging && (Math.abs(diffX) > 5 || Math.abs(diffY) > 5)) {
+					this.isDragging = true;
+				}
+				
+				if (this.isDragging) {
+					// 计算新的位置(rpx)
+					const newLeft = this.rpx2px(this.left) + diffX;
+					const newTop = this.rpx2px(this.top) + diffY;
+					
+					// 边界检查
+					const boundedLeft = Math.max(10, Math.min(newLeft, this.screenWidth - this.rpx2px(150)));
+					const boundedTop = Math.max(10, Math.min(newTop, this.screenHeight - this.rpx2px(150)));
+					
+					// 转换回rpx
+					this.left = this.px2rpx(boundedLeft);
+					this.top = this.px2rpx(boundedTop);
+					
+					// 更新起始位置
+					this.startX = currentX;
+					this.startY = currentY;
+				}
+			},
+			
+			// 触摸结束
+			onTouchEnd(e) {
+				// 阻止事件冒泡
+				e.stopPropagation();
+				e.preventDefault();
+				
+				if (this.isDragging) {
+					// 吸边效果
+					this.attachToEdge();
+					// 保存位置
+					this.savePosition();
+				}
+				this.startX = 0;
+				this.startY = 0;
+				this.isDragging = false;
+			},
+			
+			// 吸边效果
+			attachToEdge() {
+				const containerWidth = 150; // 容器宽度
+				const screenWidthRpx = 750;
+				const centerX = screenWidthRpx / 2;
+				
+				// 根据当前位置决定吸附到左边还是右边
+				if (this.left < centerX) {
+					this.left = 20; // 吸附到左边
+				} else {
+					this.left = screenWidthRpx - containerWidth - 20; // 吸附到右边
+				}
+			},
+			
+			// 保存位置到本地存储
+			savePosition() {
+				uni.setStorageSync('server_position', {
+					left: this.left,
+					top: this.top
+				});
+			},
+			
+			// rpx转px
+			rpx2px(rpx) {
+				return rpx / 750 * this.screenWidth;
+			},
+			
+			// px转rpx
+			px2rpx(px) {
+				return px * 750 / this.screenWidth;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.serve{
+	position: fixed;
+	z-index: 9999;
+	width: 150rpx;
+	height: 150rpx;
+	
+	// 确保拖拽时不影响其他元素
+	touch-action: none;
+	user-select: none;
+	-webkit-user-select: none;
+	
+	.serve-content {
+		width: 100%;
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		
+		// 拖拽时的视觉反馈
+		&:active {
+			opacity: 0.9;
+			transition: opacity 0.2s ease;
+		}
+	}
+	
+	.w130 {
+		width: 130rpx !important;
+		height: 130rpx !important;
+		flex-shrink: 0; // 防止图片变形
+	}
+	
+	.h130 {
+		width: 130rpx !important;
+		height: 130rpx !important;
+		flex-shrink: 0; // 防止图片变形
+	}
+	
+	.text{
+		margin-top: 8rpx;
+		font-weight: 500;
+		font-size: 28rpx;
+		color: #333;
+		background: rgba(255, 255, 255, 0.9);
+		padding: 6rpx 12rpx;
+		border-radius: 20rpx;
+		white-space: nowrap;
+		flex-shrink: 0; // 防止文字变形
+		border: 1rpx solid rgba(0, 0, 0, 0.1);
+		backdrop-filter: blur(10rpx);
+	}
+	
+	.contact-btn {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+		z-index: 10;
+		// 确保按钮不变形
+		border: none;
+		border-radius: 0;
+		background: transparent;
+		padding: 0;
+		margin: 0;
+		
+		&::after {
+			border: none;
+		}
+	}
+}
+
+// 防止拖拽时页面滚动
+page {
+	overflow: hidden;
+	height: 100%;
+}
+</style>

+ 24 - 0
main.js

@@ -0,0 +1,24 @@
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+
+import uView from '@/uni_modules/uview-ui'
+Vue.use(uView)
+// uni.$u.config.unit = 'rpx'
+  
+import utils from './utils/common.js'
+Vue.prototype.utils = utils;
+ 
+import {setData} from './utils/common.js'
+Vue.prototype.setData = setData;
+
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+
+
+ 
+ 

+ 93 - 0
manifest.json

@@ -0,0 +1,93 @@
+{
+    "name" : "壹柒玖康养集团",
+    "appid" : "__UNI__DBD2079",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wxd70f99287830cb51",
+        "lazyCodeLoading" : "requiredComponents",
+        "setting" : {
+            "urlCheck" : false,
+            "minified" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取位置用于给您推送相关信息"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "title" : "壹柒玖康养集团",
+        "devServer" : {
+            "https" : false
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : true
+            }
+        }
+    }
+}

+ 28 - 0
package-lock.json

@@ -0,0 +1,28 @@
+{
+    "name": "shop",
+    "version": "1.0.0",
+    "lockfileVersion": 1,
+    "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=="
+        },
+        "animate.css": {
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-3.7.2.tgz",
+            "integrity": "sha512-0bE8zYo7C0KvgOYrSVfrzkbYk6IOTVPNqkiHg2cbyF4Pq/PXzilz4BRWA3hwEUBoMp5VBgrC29lQIZyhRWdBTw=="
+        },
+        "dayjs": {
+            "version": "1.11.13",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+            "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+        },
+        "uview-ui": {
+            "version": "2.0.36",
+            "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.36.tgz",
+            "integrity": "sha512-ASSZT6M8w3GTO1eFPbsgEFV0U5UujK+8pTNr+MSUbRNcRMC1u63DDTLJVeArV91kWM0bfAexK3SK9pnTqF9TtA=="
+        }
+    }
+}

+ 11 - 0
package.json

@@ -0,0 +1,11 @@
+{
+    "name": "shop",
+    "version": "1.0.0",
+    "description": "",
+    "keywords": [],
+    "dependencies": {
+        "animate.css": "^3.7.2",
+        "dayjs": "^1.11.13",
+        "uview-ui": "^2.0.36"
+    }
+}

+ 550 - 0
pages.json

@@ -0,0 +1,550 @@
+{
+	"easycom": {
+		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+	 },
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/common/launch"
+		},
+		{
+			"path": "pages/auth/login",
+			"style": {
+				"navigationBarTitleText": "授权登录",
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/auth/wxLogin",
+			"style": {
+				"navigationBarTitleText": "公众号授权",
+				"navigationStyle": "custom"
+			}
+			
+		},
+		{
+			"path": "pages/home/index",
+			"style": {
+				"navigationBarTitleText": "互联网医院",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+		    "path" : "pages/task/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "任务中心",
+				"app-plus": {
+					"titleNView": false
+				}
+		    }
+		},
+		{
+			"path": "pages/user/index",
+			"style": {
+				"navigationBarTitleText": "我的",
+                "navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		}
+		,{
+		    "path" : "pages/home/content",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "详情",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		}
+		,{
+		    "path" : "pages/home/web",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "详情",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/user/test",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "测一测",
+				"app-plus": {
+					"titleNView": false
+				}
+		    }
+		}
+		
+    ],
+	"subPackages": [
+		{
+			"root": "pages_task",
+			"pages": [
+				{
+				    "path" : "index",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答专区",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "airClassroom",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "空中课堂",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "taskDetail",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "任务详情",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "completeTask",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "完成任务",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "taskCompleteSuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "完成任务",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "onlineLecture",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "在线讲座",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "science",
+				    "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
+				// 		}
+				//     }
+				// }
+			]
+		},
+		
+		
+		{
+			"root": "pages_user",
+			"pages": [
+				{
+					"path" : "points",
+					"style" :                                                                                    
+					{
+						"navigationBarTitleText": "我的积分",
+						"enablePullDownRefresh": false
+					}
+					
+				}
+				
+			]
+		},
+		{
+			"root": "pages_live",
+			"pages": [
+				{
+					"path": "lecture",
+					"style": {
+						"navigationBarTitleText": "在线讲座",
+						// "enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#fff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "lesson",
+					"style": {
+						"navigationBarTitleText": "空中课堂",
+						// "enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#fff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "lessonDetail",
+					"style": {
+						"navigationBarTitleText": "视频详情",
+						// "enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#000",
+						"navigationBarTextStyle": "white",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "search",
+					"style": {
+						"navigationBarTitleText": "搜索",
+						// "enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#fff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "healthConsulting",
+					"style": {
+						"navigationBarTitleText": "健康咨询",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "healthfiles",
+					"style": {
+						"navigationBarTitleText": "健康档案",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "ConsultationDetails",
+					"style": {
+						"navigationBarTitleText": "病例描述",
+						"enablePullDownRefresh": false,
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "addForm",
+					"style": {
+						"navigationBarTitleText": "直播报名表",
+						"enablePullDownRefresh": false,
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "card",
+					"style": {
+						"navigationBarTitleText": "邀请卡",
+						"enablePullDownRefresh": false,
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},{
+					"path": "addUser",
+					"style": {
+						"navigationBarTitleText": "用户信息",
+						"enablePullDownRefresh": false,
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+			]
+		},{
+			"root": "pages_echarts",
+			"pages": [
+				{
+					"path": "statistics",
+					"style": {
+						"navigationBarTitleText": "数据统计",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#fff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+			]
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "互联网医院",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF"
+	},
+	"tabBar": {
+		"color": "#999999",
+		"selectedColor": "#333333",
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"height": "64px",
+		"fontSize":"12px",
+		"iconWidth":"18px",
+		"spacing": "4px",
+		"list": [{
+				"pagePath": "pages/home/index",
+				"iconPath": "/static/tabbar/icon_home.png",
+				"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/user/index",
+				"iconPath": "/static/tabbar/icon_me.png",
+				"selectedIconPath": "/static/tabbar/icon_sel_me.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 709 - 0
pages/auth/login.vue

@@ -0,0 +1,709 @@
+<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>
+			<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="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>
+</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 = '';
+			}
+		},
+		// 返回主页
+		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:"发送中..."
+			});
+			// 模拟发送验证码
+			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.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);
+		},
+		// 密码登录
+		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'
+			})
+		},
+		getCode(){
+			var that=this;
+			this.utils.getProvider()
+			.then(provider => {
+				console.log('当前的环境商',provider)
+				if (!provider) {
+				  reject()
+				}
+				// uni登录
+				uni.login({
+					provider: provider,
+					success: async loginRes => {
+						that.code = loginRes.code
+					}
+				})
+			})
+			.catch(err => {
+				
+			})
+		},
+		// 微信用户手机号登录
+		phoneLogin(e) {
+			var that=this;
+			if(!this.isAgreement){
+				uni.showToast({
+					icon:'none',
+					title: "请先同意协议后再登录",
+				});
+				return false;
+			}
+			uni.showLoading({
+				title:"处理中..."
+			})
+			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()
+		}
+	}
+}
+</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{
+			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: #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;
+		}
+		.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>

+ 107 - 0
pages/auth/wxLogin.vue

@@ -0,0 +1,107 @@
+<template>
+  <view class="container">
+    
+  </view>
+</template>
+
+<script>
+import { loginByMp } from '@/api/user'
+export default {
+	data() {
+		return {
+			code:null,
+		}
+	},
+	computed: {
+	},
+	onLoad(option) 
+	{
+		// #ifdef H5
+		if (this.checkWeixin()) {
+			let code = this.getUrlCode('code')
+			if (code==null||code==undefined) {
+				uni.showToast({
+					icon:'none',
+					title: "code不存在",
+				});
+			} else {
+				this.code = code
+				this.loginByMp();
+			}
+		} else {
+			uni.showToast({
+				icon:'none',
+				title: "请在微信中打开",
+			});
+			//跳转到手机号密码登录
+		}
+		// #endif
+	},
+	onUnload() {
+	},
+	mounted() {
+    
+	},
+	methods: {
+		loginByMp(){
+			let code = this.code // 获取开发code
+			var tuiUserId=uni.getStorageSync('tuiUserId');
+			uni.showLoading({
+				title:"处理中..."
+			})
+			loginByMp({
+			   code: code,
+			   tuiUserId:tuiUserId
+			})
+			.then( res => {
+				if(res.code==200||res.code==40163){
+					uni.hideLoading();
+					uni.showToast({
+						icon:'none',
+						title: "登录成功",
+					});
+					uni.setStorageSync('AppToken',res.token);
+					uni.setStorageSync('userInfo',JSON.stringify(res.user));
+					//that.getUserInfo()
+					uni.$emit('refreshLogin');
+					uni.reLaunch({
+						url:"/pages/home/index"
+					})
+				}
+				else{
+					uni.hideLoading();
+					uni.showToast({
+						icon:'none',
+						title: res.msg,
+					});
+				}
+			   
+			 })
+			 .catch(error => {
+				console.log(error)
+				uni.hideLoading();
+				uni.showToast({
+					icon:'none',
+					title: "登录接口调用失败",
+				});
+			 })
+		},
+		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
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+</style>

+ 85 - 0
pages/common/launch.vue

@@ -0,0 +1,85 @@
+<template>
+	<view class="content">
+		[[]]
+		<view class="loadding" v-if="loadding==true">
+			<image src="https://user.test.ylrztop.com/images/logo.png"></image>
+			<text class="text">互联网医院</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getDicts} from '@/api/index'
+	export default {
+		data() {
+			return {
+				loadding:true,
+			};
+		},
+		methods: {
+			
+			getDicts:function(){
+				getDicts().then(
+					res => {
+						if(res.code==200){
+							console.log(res)
+							uni.setStorageSync('dicts',JSON.stringify(res));
+							
+						}else{
+							 
+						}
+						this.loadding=false;
+						this.navigatHandler();
+					},
+					rej => {}
+				);
+			},
+			navigatHandler: function() {
+				uni.reLaunch({
+					url: '../home/index',
+					animationType: 'pop-in',
+					animationDuration: 100
+				})
+			},
+			
+		},
+		onLoad() {
+			this.getDicts()
+		}
+	};
+ 
+</script>
+
+.
+<style lang="scss">
+	content {
+		height: 100%;
+		width: 100%;
+		position: relative;
+		padding-top: 0;
+		
+	}
+	.loadding{
+		background-color: #fff;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 9999;
+		image{
+			border-radius: 50%;
+			animation: load linear 1s infinite;
+			width: 120rpx;
+			height:120rpx;
+		}
+		.text{
+			font-size: 28rpx;
+			margin-top: 20rpx;
+		}
+	}
+</style>

+ 79 - 0
pages/home/content.vue

@@ -0,0 +1,79 @@
+<template>
+	<view class="content">
+		 <view   v-html="content"></view>
+	</view>
+</template>
+
+<script>
+ 
+ export default {
+ 	data() {
+ 		return {
+			content:"",
+ 		}
+ 	},
+	onLoad(val) {
+		this.content=uni.getStorageSync('content');
+	}
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.content{
+	height: 100%;
+}
+.logo{
+	padding-top: 15%;
+	text-align: center;
+	image{
+		width: 80px;
+		height: 80px;
+	}
+	p{
+		margin: 10px 0px;
+		font-size: 14px;
+	}
+}
+.set-box{
+	margin-top: 30upx;
+	background: #fff;
+	padding: 0 40upx;
+	.item{
+		
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 25upx 0;
+		.left{
+			display: flex;
+			align-items: center;
+			.text{
+				font-size: 30upx;
+				color: #666;
+			}
+		}
+		.right{
+			width: 10upx;
+			height: 20upx;
+		}
+		.right-text{
+			 
+		}
+	}
+}
+.contact-btn {
+  display: inline-block;
+  position: absolute;
+  width: 100%;
+  background: salmon;
+   opacity: 0;
+}
+
+</style>

+ 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>

+ 42 - 0
pages/home/web.vue

@@ -0,0 +1,42 @@
+<template>
+	<view class="content">
+		 <web-view :src="url"></web-view>
+	</view>
+</template>
+
+<script>
+ 
+ export default {
+ 	data() {
+ 		return {
+			url:"",
+ 		}
+ 	},
+	onLoad(val) {
+		// 待解析的完整 URL
+		// const fullUrl = uni.getStorageSync('url');
+		// this.url=this.utils.getUrl(fullUrl);
+	     this.url=uni.getStorageSync('url');
+	}
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.content{
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	
+}
+ 
+
+</style>

+ 198 - 0
pages/task/index.vue

@@ -0,0 +1,198 @@
+<template>
+	<view>
+		<view class="task-list">
+			<view class="item" v-for="(item,index) in tabs" :key="index" >
+				<view class="left">
+					<image :src="item.icon" mode=""></image>
+					<view class="title-l">{{item.name}}</view>
+				</view>
+				<view class="right" @click="showDetail(item.url)">
+					<view class="num" v-if="item.num!==0">{{item.num}}</view>
+					<image src="@/static/image/icon_more.png" mode=""></image>
+				</view>
+			</view>
+		</view>
+		<Server/>
+	</view>
+</template>
+
+<script>
+	import {getDictByKey} from '@/api/common.js'
+	import {getQuestionsList} from '@/api/index.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import Server from '@/components/Server.vue'
+	export default {
+		mixins: [MescrollMixin], 
+		components: {
+			Server
+		},
+		data() {
+			return {
+				tabs:[
+					{name:'在线讲座',num:12,icon:'/static/image/icon_task_zxjz.png',url:'/pages_task/onlineLecture'},
+					{name:'空中课堂',num:3,icon:'/static/image/icon_task_kzkt.png',url:'/pages_task/airClassroom'},
+					{name:'用药调研',num:8,icon:'/static/image/icon_task_yydy.png',url:''},
+					{name:'问卷调查',num:0,icon:'/static/image/icon_task_wjdc.png',url:''},
+					{name:'科普创作',num:0,icon:'/static/image/icon_task_kpcz.png',url:'/pages_task/science'},
+				],
+				typeOptions:[],
+				questionsType:0,
+				keyword: '',
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://user.test.ylrztop.com/images/empty_icon.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			};
+		},
+		onShow() {
+			this.getDictByKey("sys_questions_type");
+		},
+		methods:{
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_questions_type"){
+								this.typeOptions=res.data;
+							}
+						 
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword:this.keyword,
+					questionsType:this.questionsType,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getQuestionsList(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list; 
+							
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+							 
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			// 关键词选择
+			choseType(item) {
+				this.questionsType = item.dictValue;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(url) {
+				uni.navigateTo({
+					url: url
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.task-list{
+		padding: 24rpx;
+		display: flex;
+		align-items: center;
+		flex-direction: column;
+		justify-content: flex-start;
+		width: 100%;
+		  box-sizing: border-box; 
+		.item{
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			background: #FFFFFF;
+			box-shadow: 0rpx 8rpx 16rpx 0rpx rgba(199,226,254,0.22);
+			border-radius: 24rpx 24rpx 24rpx 24rpx;
+			padding:28rpx 32rpx;
+			box-sizing: border-box; // 核心:padding不撑宽item
+			margin-bottom: 24rpx;
+			.left{
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 72rpx;
+					height: 72rpx;
+					margin-right: 28rpx;
+				}
+				.title-l{
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #333333;
+				}
+			}
+			.right{
+				display: flex;
+				align-items: center;
+				.num{
+					text-align: center;
+					width: 50rpx;
+					height: 36rpx;
+					line-height: 36rpx;
+					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{
+					width: 32rpx;
+					height: 32rpx;
+					margin-left: 12rpx;
+				}
+			}
+		}
+	}
+</style>

+ 651 - 0
pages/user/index.vue

@@ -0,0 +1,651 @@
+<template>
+	<view>
+		<view class="top-cont">
+			<image class="bg" src="@/static/image/top_bg.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>
+						</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>
+						</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>
+						</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="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'
+	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'},
+				],
+				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')
+			};
+		},
+		onLoad() {
+			console.log("onload")
+		},
+		onShow() {
+			console.log("onshow")
+			//this.getUserInfo();
+			//this.getOrderCount();
+		},
+		onReachBottom() {
+			console.log("onReachBottom")
+			this.$refs.product.getGoodsProducts();
+		},
+		methods: {
+			seeChange(){
+				this.isShow=!this.isShow
+			},
+			callService(){
+				 uni.makePhoneCall({
+					phoneNumber:"4000717770",
+					success:function(){
+						console.log('拨打电话成功');
+					},
+					fail() {
+						console.log('打电话失败了');
+					}
+				})
+			},
+			 
+			getOrderCount(){
+				getOrderCount().then(
+					res => {
+						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(){
+				// uni.navigateTo({
+				// 	url: '/pages_company/index'
+				// })
+				if(this.utils.checkCompanyUserLoginState()){
+					uni.navigateTo({
+						url: '/pages_company/index'
+					})
+				}
+				else{
+					uni.navigateTo({
+						url: '/pages_company/auth/login'
+					})
+				}
+				
+			},
+			openH5(url){
+				var requestPath = uni.getStorageSync('requestPath');
+				uni.setStorageSync('url',requestPath+url);
+				uni.navigateTo({
+					url: '../home/web'
+				})
+			},
+			getUserInfo(){
+				getUserInfo().then(
+					res => {
+						if(res.code==200){
+							if(res.user!=null){
+								this.user=res.user;
+							}
+							else{
+								this.utils.loginOut();
+							}
+							
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 跳转页面
+			navgetTo(url) {
+				this.utils.isLogin().then(res => {
+					if(res){
+						uni.navigateTo({
+							url: url+'?userId='+this.user.userId
+						})
+					}
+				})
+			},
+			// 查看订单
+			showOrder(status) {
+				uni.navigateTo({
+					url: '/pages_user/user/storeOrder?status=' + status
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-cont{
+		width: 100%;
+		height: 600rpx;
+		position: relative;
+		// background-image: url(../../static/image/top_bg.png);
+		// background-repeat:no-repeat;
+		// background-size:100%;
+		.bg{
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+		.top-inner{
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 2;
+			.user-info{
+				padding: 88upx 30upx 32upx 30upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.left{
+					position: relative;
+					display: flex;
+					.head-img{
+						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%;
+						// }
+					}
+				}
+			}
+			.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{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content:space-around;
+					height: 100%;
+					.text{
+						font-family: PingFang SC;
+						font-weight: 400;
+						font-size: 26rpx;
+						color: #FFFFFF;
+						text-align: left;
+						margin-right: 16rpx;
+					}
+					.num{
+						font-family: Roboto, Roboto;
+						font-weight: 500;
+						font-size: 64rpx;
+						color: #FFFFFF;
+					}
+				}
+				.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{
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						.title{
+							font-size: 36upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #222222;
+							line-height: 1;
+						}
+						.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;
+							}
+						}
+					}
+				}
+			}
+			
+		}
+	}
+	.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;
+			display: flex;
+			align-items: center;
+			flex-direction: column;
+			justify-content: flex-start;
+			width: 100%;
+			  box-sizing: border-box; 
+			  border-radius: 24rpx;
+			  background: #FFFFFF;
+			.item{
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding:28rpx 24rpx;
+				box-sizing: border-box; 
+				// margin-bottom: 24rpx;
+				.left{
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					image{
+						width: 48rpx;
+						height: 48rpx;
+						margin-right: 32rpx;
+					}
+					.title-l{
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 400;
+						font-size: 32rpx;
+						color: #333333;
+					}
+				}
+				.right{
+					display: flex;
+					align-items: center;
+					.num{
+						text-align: center;
+						width: 50rpx;
+						height: 36rpx;
+						line-height: 36rpx;
+						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{
+						width: 32rpx;
+						height: 32rpx;
+						margin-left: 12rpx;
+					}
+				}
+			}
+		}
+		.used-tools{
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 30upx;
+			
+			.title{
+				font-size: 36upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #222222;
+				line-height: 1;
+			}
+			.tools-list{
+				margin-top: 50upx;
+				display: flex;
+				flex-wrap: wrap;
+				width: 100%;
+				.item{
+					box-sizing: border-box;
+					width: 25%;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					margin-bottom: 50upx;
+					position: relative;
+					image{
+						width: 48upx;
+						height: 48upx;
+					}
+					.text{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #333;
+						line-height: 1;
+						margin-top: 20upx;
+					}
+					.contact-btn{
+						display: inline-block;
+						position: absolute;
+						top: 0;
+						left: 0;
+						width: 100%;
+						height: 100%;
+						opacity: 0;
+					}
+				}
+			}
+		}
+		.log-out{
+			height: 88upx;
+			line-height: 88upx;
+			text-align: center;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #666666;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			margin-top: 52upx;
+		}
+	}
+	.sub-btn{
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+	}
+	.like-product{
+		padding: 0 20rpx;
+		 
+	}
+	.banner{
+		padding: 20rpx 20rpx 0rpx 20rpx;
+		height: 200rpx;
+		position: relative;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		image{
+			width:100%;
+			height: 100%;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+		}
+		.tel_btn{
+			width: 100%;
+			height: 100%;
+			top:0upx;
+			position: absolute;
+			opacity:0.0;
+		}
+	}
+</style>

+ 9 - 0
pages/user/test.vue

@@ -0,0 +1,9 @@
+<template>
+	<web-view src="https://www.baidu.com/"></web-view>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 708 - 0
pages_echarts/statistics.vue

@@ -0,0 +1,708 @@
+<template>
+	<view class="container">
+		<!-- 日期范围和筛选 -->
+		<view class="date-filter-bar mb16">
+			<view class="date-range" @click="showDatePicker = true">
+				<image class="w32 h32" src="@/static/image/icon_time.png" mode=""></image>
+				<text class="date-text">{{ dateRangeText }}</text>
+				<text class="arrow-down">▼</text>
+			</view>
+			<view class="filter-btn" @click="showFilter = true">
+				<image class="w32 h32" src="@/static/image/icon_select.png" mode=""></image>
+				<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>
+		
+		<!-- 日期选择弹窗 -->
+		<view class="date-picker-popup" v-if="showDatePicker" @click="showDatePicker = false">
+			<view class="date-picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-cancel" @click="showDatePicker = false">取消</view>
+					<view class="picker-title">选择日期范围</view>
+					<view class="picker-confirm" @click="confirmDateRange">确定</view>
+				</view>
+				<view class="picker-body">
+					<view class="date-item">
+						<text class="date-label">开始日期</text>
+						<picker mode="date" :value="tempDateRange.startDate" @change="onStartDateChange">
+							<view class="date-value">{{ tempDateRange.startDate || '请选择' }}</view>
+						</picker>
+					</view>
+					<view class="date-item">
+						<text class="date-label">结束日期</text>
+						<picker mode="date" :value="tempDateRange.endDate" @change="onEndDateChange">
+							<view class="date-value">{{ tempDateRange.endDate || '请选择' }}</view>
+						</picker>
+					</view>
+				</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>
+				</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 }}
+						</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>
+					</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>
+// 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
+		},
+		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() {
+			// 关闭弹窗时,恢复临时选择值为当前选择值
+			this.tempSelectedTaskType = this.selectedTaskType
+			this.tempSelectedTaskStatus = this.selectedTaskStatus
+			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
+			}
+		},
+		resetFilters() {
+			this.tempSelectedTaskType = ''
+			this.tempSelectedTaskStatus = ''
+		},
+		confirmFilters() {
+			this.selectedTaskType = this.tempSelectedTaskType
+			this.selectedTaskStatus = this.tempSelectedTaskStatus
+			this.showFilter = false
+			//this.loadData()
+		},
+		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()
+				} else {
+					this.tableData = this.getDefaultData()
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+				this.tableData = this.getDefaultData()
+			}
+		},
+		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;
+	}
+	
+	.header-right {
+		position: absolute;
+		right: 24rpx;
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		
+		.more-icon {
+			font-size: 32rpx;
+			color: #333;
+		}
+	}
+}
+
+.date-filter-bar {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 24rpx;
+	background: #fff;
+	// border-bottom: 1rpx solid #f0f0f0;
+	
+	.date-range {
+		display: flex;
+		align-items: center;
+		gap: 8rpx;
+		
+		.clock-icon {
+			font-size: 28rpx;
+		}
+		
+		.date-text {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #333333;
+		}
+		
+		.arrow-down {
+			font-size: 20rpx;
+			color: #333333;
+		}
+	}
+	
+	.filter-btn {
+		display: flex;
+		align-items: center;
+		gap: 8rpx;
+		font-size: 28rpx;
+		color: #333;
+		
+		.filter-icon {
+			font-size: 24rpx;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	background: #fff;
+}
+
+.summary-section {
+	background: #fff;
+	padding: 24rpx;
+	margin-bottom: 32rpx;
+	
+	.summary-header {
+		display: flex;
+		align-items: center;
+		// margin-bottom: 24rpx;
+		
+		.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;
+				// .status-tag {
+				// 	padding: 4rpx 12rpx;
+				// 	border-radius: 4rpx;
+				// 	font-size: 24rpx;
+					
+				// 	&.uncompleted {
+				// 		background: #FFF3E0;
+				// 		color: #FF9800;
+				// 	}
+					
+				// 	&.completed {
+				// 		background: #E8F5E9;
+				// 		color: #4CAF50;
+				// 	}
+				// }
+			}
+		}
+	}
+}
+
+.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 {
+		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;
+		}
+	}
+	
+	.picker-body {
+		padding: 24rpx;
+		
+		.date-item {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 24rpx 0;
+			border-bottom: 1rpx solid #f0f0f0;
+			
+			&:last-child {
+				border-bottom: none;
+			}
+			
+			.date-label {
+				font-size: 30rpx;
+				color: #333;
+			}
+			
+			.date-value {
+				font-size: 30rpx;
+				color: #388BFF;
+			}
+		}
+	}
+}
+
+.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-tag {
+				padding: 12rpx 24rpx;
+				background: #f5f5f5;
+				border-radius: 8rpx;
+				font-size: 26rpx;
+				color: #666;
+				border: 1rpx solid transparent;
+				
+				&.active {
+					background: #E6F7FF;
+					color: #388BFF;
+					border-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;
+		}
+	}
+}
+</style>

+ 342 - 0
pages_live/ConsultationDetails.vue

@@ -0,0 +1,342 @@
+<template>
+	<view>
+		<u-alert type="warning" :description='description'></u-alert>
+		<view class="p20 column">
+			<view class="bg-white p30 radius16">
+				<view class="justify-between align-center">
+					<view class="bold">咨询人<text class="color-price">*</text></view>
+					<view class="justify-start align-center">
+						<image src="/static/images/health/add_modify.png" class="w24 h24"></image>
+						<view class="fs24 ml8">添加/修改</view>
+					</view>
+				</view>
+				<scroll-view :scroll-x="true" class="peoplebox">
+					<view class="scroll-content ">
+						<view v-for="(item,index) in peoplelist" :key="index" @click="actpeople(item,index)"
+						:class="actitem==index?'act-box':'noact-box'" class="item-list ">
+							<image :src="item.sex=='男'?maleurl:famaleurl" class="w72 h72 radius36 "></image>
+							<view class="ml12">
+								<view class="fs26 bold">{{item.name}}</view>
+								<view class="justify-start align-center color-text2 fs24">
+									<text>{{item.sex}}</text>
+									<text class="ml4">{{item.age}}岁</text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+				<view class="justify-start align-center center ptb20" v-if="peoplelist.length==0">
+					<u-icon name="plus-circle"></u-icon>
+					<text class="fs28 color-text1">用药人列表为空,请添加</text>
+				</view>
+			</view>
+			<view class="bg-white p30 radius16 mt30">
+				<view class="bold">您最想咨询的问题是什么<text class="color-price">*</text></view>
+				<view class="textinput">
+					<textarea  auto-height maxlength='500' placeholder="请输入内容" :value='consulting' @input='lookvalue'/>
+				</view>
+				<view class="justify-between align-center">
+					<image src="/static/images/health/voice_icon.png" class="w48 h48"></image>
+					<text class="fs24 color-text1">{{consultingNum}}/500</text>
+				</view>
+			</view>
+			<view class="bg-white p30 radius16 mt30">
+				<view class="bold">此次病情是否去线下就诊过<text class="color-price">*</text></view>
+				<view class="justify-start align-center mt20">
+					<view v-for="(item,index) in seedoctor" :key="index" :class="actsee==index?'bg-color color-white':'bg-light'"
+					@click="selectsee(item,index)" class="ptb20 plr30 mr20 radius12" >{{item.name}}</view>
+				</view>
+			</view>
+			<view class="bg-white p30 radius16 mt30">
+				<view class="bold">上传检测报告或患处照片<text class="color-price">*</text></view>
+				<view class="justify-start align-center mt20">
+					<view v-for="(item,index) in imgList" :key="index"  @tap="viewImage" :data-url="imgList[index]"
+					class="img-box justify-start align-center mr20">
+						<image :src="item" class="w120 h120 radius8 " mode="aspectFill" @click="showImg(item)"></image>
+						<image class="close-img" src="@/static/images/close32.png" mode="" @tap.stop="delImg" :data-index="index"></image>
+					</view>
+					<view class="column align-center bg-light w120 h120 radius8 center" @tap="chooseImage" v-if="imgList.length<4" >
+						<u-icon name="plus" ></u-icon>
+						<view class="fs24">上传报告</view>
+					</view>
+				</view>
+				<view class="justify-between fs24 color-text1 mt20">
+					<view>最多上传4张图片</view>
+					<view><text>{{imgList.length}}</text>/4</view>
+				</view>
+			</view>
+			<view class="h200"></view>
+		</view>
+		<view class="footer center">
+			<view class="bg-color radius44 color-white h88 lh88 center" style="width: 90%;"
+			@click="submit">生成方案</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getuserlist,submitconsult} from '@/api/health.js'
+	export default {
+		data() {
+			return {
+				description:'为了您的健康,请认真填写以下内容,以便药师为您更好的分析,提供患有针对性的解决方案!',
+				peoplelist:[
+					{
+						name:'任继峰',
+						sex:'男',
+						age:'55',
+						id:0
+					},
+					{
+						name:'任继峰',
+						sex:'男',
+						age:'55',
+						id:1
+					},
+					{
+						name:'朱丽君',
+						sex:'女',
+						age:'55',
+						id:2
+					},
+					{
+						name:'朱丽君',
+						sex:'女',
+						age:'55',
+						id:3
+					}
+				],
+				famaleurl:"/static/images/health/female_profile.png",
+				maleurl:"/static/images/health/male_profile.png",
+				actitem:null,
+				userid:null,
+				consulting:null,
+				consultingNum:0,
+				seedoctor:[
+					{
+						name:'就诊过',
+						value:0
+					},
+					{
+						name:'未就诊',
+						value:1
+					}
+				],
+				actsee:null,
+				imgList:[],
+				photos:[]
+			}
+		},
+		methods: {
+			// 选择上传的图片
+			chooseImage() {
+				console.log('图片')
+				var that = this;
+				uni.showActionSheet({
+					itemList: ['相册', '拍照'],
+					success: function(res) {
+						if (res.tapIndex == 0) {
+							//从相册选择
+							that.chooseImageFunction('album')
+						} else if (res.tapIndex == 1) {
+							//拍照
+							that.chooseImageFunction('camera')
+						}
+					},
+					fail: function(res) {
+						
+					}
+				});
+			},
+			chooseImageFunction: function(type) {
+				var that = this;
+				uni.chooseImage({
+					count: 4, // 默认9
+					sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+					sourceType: [type],
+					success: (res) => {
+						uni.uploadFile({
+							url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+							filePath: res.tempFilePaths[0],
+							name: 'file',
+							formData: {
+								'user': 'test'  // 上传附带参数
+							},
+							success: (uploadFileRes) => {
+								// 根据接口具体返回格式   赋值具体对应url
+								if (this.imgList.length != 0) {
+									this.imgList = this.imgList.concat(res.tempFilePaths)
+								} else {
+									this.imgList = res.tempFilePaths
+									
+								}
+						 
+								this.photos = this.photos.concat(JSON.parse(uploadFileRes.data).url)
+							}
+						});
+						 
+					}
+				});
+			},
+			// 查看图片
+			viewImage(e) {
+				uni.previewImage({
+					urls: this.imgList,
+					current: e.currentTarget.dataset.url
+				});
+			},
+			// 删除上传的图片
+			delImg(e) {
+				var that = this;
+				uni.showModal({
+					title: '提示',
+					content: '确定要删除照片吗?',
+					cancelText: '取消',
+					confirmText: '确定',
+					success: res => {
+						if (res.confirm) {
+							that.imgList.splice(e.currentTarget.dataset.index, 1)
+							this.photos.splice(e.currentTarget.dataset.index, 1);
+						}
+					},
+				})
+			},
+			submit(){
+				if(this.userid==null){
+					uni.showToast({
+						icon:'none',
+						title:'请选择咨询人!',
+					});
+					return
+				}
+				if(this.consulting==null){
+					uni.showToast({
+						icon:'none',
+						title:'请输入咨询内容!',
+					});
+					return
+				}
+				if(this.actsee==null){
+					uni.showToast({
+						icon:'none',
+						title:'请选择是否线下就诊过!',
+					});
+					return
+				}
+				if(this.actsee==0){
+					if(this.imagelist.length==0){
+						uni.showToast({
+							icon:'none',
+							title:'如果在线下就诊过,请上传检测报告!',
+						});
+						return
+					}
+				}
+				const data={
+					id:this.userid,
+					doctor:this.actsee,
+					imgurl:this.imagelist
+				}
+				submitconsult().then(res=>{
+					if(res.code==200){
+						uni.showToast({
+							icon:'none',
+							title:'提交成功',
+						});
+					}else{
+						uni.showToast({
+							icon:'none',
+							title:res.msg,
+						});
+					}
+				})
+			},
+			actpeople(item,index){
+				this.actitem=index
+				this.userid=item.id
+			},
+			lookvalue(e){
+				this.consulting=e.detail.value
+				this.consultingNum=e.detail.cursor
+				if(this.consultingNum==500){
+					uni.showToast({
+						icon:'none',
+						title:'最大输入500字符!',
+					});
+				}
+			},
+			selectsee(item,index){
+				this.actsee=item.value
+			},
+			showImg(img) {
+				if(img!=null){
+					var imgs=[];
+					imgs.push(img)
+					//预览图片
+					uni.previewImage({
+						urls: imgs,
+						current: imgs[0]
+					});
+				}
+				else{
+					//预览图片
+					uni.previewImage({
+						urls: this.imagelist,
+						current: this.imagelist[0]
+					});
+				}
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.peoplebox{
+	  white-space: nowrap;
+	  margin-top: 30rpx;
+	  ::-webkit-scrollbar {
+	    display: none;
+	  }
+	 .scroll-content{
+		  display: flex;
+		flex-wrap: nowrap;
+	 }
+	.item-list{
+		padding: 20rpx 28rpx;
+		width: fit-content;
+		display: flex;
+		justify-content: start;
+		border-radius: 12rpx;
+		margin-right: 20rpx;
+	}
+	.noact-box{
+		background-color: #F5F7FA;
+	}
+	.act-box{
+		background-color: #F0FAFF;
+		border: 2rpx solid #008FD3;
+	}
+}
+.img-box{
+	position: relative;
+}
+.close-img{
+		width: 32upx;
+		height: 32upx;
+		position: absolute;
+		top:2upx;
+		right: 2upx;
+	}
+.textinput{
+	margin-top: 30rpx;
+	height:200rpx;
+	overflow-y: scroll;
+}
+.footer{
+	padding: 40rpx 0; 
+	width: 100%;
+	position: fixed;
+	bottom: 0;
+	background-color: #fff;
+}
+</style>

+ 424 - 0
pages_live/addForm.vue

@@ -0,0 +1,424 @@
+<template>
+	<view class="content">
+		<view class="inner">
+			<view class="form-box">
+				<view class="form-item">
+					<text class="label"><text class="color-price">*</text> 姓名</text>
+					<input  class="input-width" type="text" v-model="form.productName" placeholder="请输入姓名"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label"><text class="color-price">*</text> 医院</text>
+					<input  class="input-width" type="text" v-model="form.productName" placeholder="请输入医院"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label"><text class="color-price">*</text> 科室</text>
+					<input  class="input-width" type="text" v-model="form.productName" placeholder="请输入科室"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label"><text class="color-price">*</text> 职称</text>
+					<input  class="input-width" type="text" v-model="form.productName" placeholder="请输入职称"
+						placeholder-class="form-input" />
+				</view>
+			</view>
+		</view>
+		<view class="btn-box">
+			<view class="sub-btn" @click="submit()">
+				<!-- <image src="/static/images/health/nav_add_icon24.png" class="w48 h48"></image> -->
+				<text>确认并进入直播间</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getServiceById,updateService,saveService
+	} from '@/api/companyUser.js'
+	export default {
+		data() {
+			return {
+				startDate:this.utils.timeFormat(new Date()),
+				type: null,
+				patientId: null,
+				famaleurl:"/static/images/health/female_profile.png",
+				maleurl:"/static/images/health/my_heads.png",
+				checked:1,
+				array:['是','否'],
+				tags: [{
+					name: '心脏病',
+					checked:true,
+					id: 1
+				},
+				{
+					name: '脑梗死',
+						checked:false,
+					id: 2
+				},{
+					name: '肾病',
+						checked:false,
+					id: 3
+				},{
+					name: '脂肪肝',
+						checked:false,
+					id: 4
+				}],
+				form: {
+						"amount": null,
+						"memberStatus": null,
+						"plannedCompletionDate": null,
+						"productName":null,
+						"purchaseQuantity":1,
+						"purchaseTimes":null,
+						"remark": null,
+						"surplusTimes":null,
+				},
+				id:null
+			};
+		},
+		onLoad(options) {
+			this.type = options.type;
+			this.form.userId=options.userId
+			this.form.companyUserId=options.companyUserId;
+			console.log(this.type)
+			if (this.type == 'edit') {
+				this.id=options.id;
+				this.getServiceInfo();
+			}
+		},
+		methods: {
+			sexChange(type) {
+				this.form.sex = type
+			},
+			radioClick(item) {
+			        this.checked=item.id
+			      },
+			getServiceInfo() {
+				var data = {
+					id: this.id
+				};
+				getServiceById(data).then(
+					res => {
+						if (res.code == 200) {
+							this.form = res.data;
+                            this.form.plannedCompletionDate=this.utils.timeFormat(res.data.plannedCompletionDate,'yyyy-mm-dd')
+							this.startDate=this.form.plannedCompletionDate
+						} else {
+							uni.showToast({
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			submit() {
+				uni.navigateTo({
+					url: '/pages_live/card'
+				})
+				// if (this.form.productName == null || this.form.productName == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "名称不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.purchaseQuantity == null|| this.form.purchaseQuantity == 0) {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "数量不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.amount == null|| this.form.amount == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "金额不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.plannedCompletionDate == null|| this.form.plannedCompletionDate == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "时间不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.purchaseTimes == null|| this.form.purchaseTimes == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "购买次数不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.surplusTimes == null|| this.form.surplusTimes == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "剩余次数不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.form.memberStatus == null|| this.form.memberStatus == '') {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: "会员情况不能为空",
+				// 	});
+				// 	return;
+				// }
+				// if (this.type == "add") {
+				// 	this.saveService()
+				// } else if (this.type == "edit") {
+				// 	this.updateService()
+				// }
+               
+			},
+			updateService() {
+				updateService(this.form).then(
+					res => {
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'success',
+								title: "操作成功",
+							});
+							setTimeout(function() {
+								uni.$emit('refreshBuyOrder');
+								uni.navigateBack({
+									delta: 1
+								})
+							}, 500);
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			saveService() {
+				saveService(this.form).then(
+					res => {
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'success',
+								title: "操作成功",
+							});
+							setTimeout(function() {
+								uni.$emit('refreshBuyOrder');
+								uni.navigateBack({
+									delta: 1
+								})
+							}, 500);
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 出生日期选择
+			bindDateChange: function(e) {
+				this.form.plannedCompletionDate = e.target.value
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+	}
+
+	.content {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		//  justify-content: space-between;
+        background: #FFFFFF;
+		.inner {
+			// height: calc(100% - 120upx);
+			// padding: 20upx;
+
+			.form-box {
+				padding: 0 32upx;
+				
+				border-radius: 16upx;
+				margin-bottom: 20upx;
+
+				.form-title {
+					font-family: PingFang SC;
+					font-weight: 600;
+					font-size: 40rpx;
+					color: #222426;
+					text-align: left;
+					padding: 30rpx 0;
+					display: block;
+				}
+
+				.form-item {
+					padding: 30upx 0;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					border-bottom: 1px solid #F1F1F1;
+
+					// &:last-child {
+					// 	border-bottom: none;
+					// }
+        
+					.label {
+						width: 200upx;
+						text-align: left;
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 400;
+						font-size: 28rpx;
+						color: #666666;
+						flex-shrink: 0;
+					}
+                   
+					input {
+						flex:1;
+						text-align: right;
+					}
+               .num-box{
+               	input{
+               		text-align: center !important;
+               	}
+               }
+					.form-input {
+						
+						font-size: 28rpx;
+						font-family: PingFang SC;
+						font-weight: 400;
+						color: #C8C9CC;
+						text-align: right;
+					}
+
+					.form-item-tag{
+						margin-right: 16rpx;
+						.tag{
+							border-radius: 8rpx 8rpx 8rpx 8rpx;
+							border: 2rpx solid #ECECEC;
+							display: flex;
+							align-items: center;
+							padding: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 400;
+							font-size: 24rpx;
+							&.active{
+								background: #F0FAFF;
+								border: 2rpx solid #008FD3;
+								color: #008FD3;
+							}
+						}
+						
+						
+						
+					}
+					.right{
+						display: flex;
+						align-items: center;
+					}
+					.sex-box{
+						flex:1;
+						display: flex;
+						align-items: center;
+						justify-content: flex-end;
+						.sex-item{
+							width: 146rpx;
+							height: 64rpx;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							background: #F5F7FA;
+							border-radius: 32rpx 32rpx 32rpx 32rpx;
+							margin-left: 16rpx;
+							.u-icon__icon{
+								margin: 0;
+							}
+							text{
+								// font-family: PingFang SC, PingFang SC;
+								font-weight: 400;
+								font-size: 28rpx;
+								color: #898E91;
+								margin-left: 12rpx;
+							}
+							&.active{
+								background: #FCF0E7;
+								text{
+									color:#FF5030
+								}
+							}
+						}
+					}
+					.form-textarea{
+						font-size: 30upx;
+						color: #999999;
+						height: 100upx;
+						padding: 4upx 0;
+					}
+					 
+					.birth-picker {
+						flex: 1;
+						display: flex;
+						align-items: center;
+						
+						.right-box{
+							width: 100%;
+							display: flex;
+							align-items: center;
+							.input-box{
+								// width: 470upx;
+							}
+							.arrow{
+								width: 13upx;
+								height: 23upx;
+								margin-left: 20upx;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		.btn-box {
+			height: 120upx;
+			padding: 0 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+            margin-top: 86rpx;
+			// position: fixed;
+			// width: 90%;
+			// bottom: 0;
+			// left: 50%;
+			// transform: translate(-50%,-50%);
+			// background: #FFFFFF;
+			.sub-btn {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 32rpx;
+				color: #FFFFFF;
+				background: #388BFF ;
+				border-radius: 44upx;
+				margin-bottom: 40upx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					margin-right: 16rpx;
+				}
+			}
+		}
+	}
+</style>

+ 736 - 0
pages_live/addUser.vue

@@ -0,0 +1,736 @@
+<template>
+	<view class="content">
+		<view class="inner">
+			<view class="form-box">
+				<text class="form-title">基本信息</text>
+				<view class="form-item justify-between">
+					<text class="label">头像</text>
+					<view class="right">
+						<image :src="form.avatar==null?maleurl:form.avatar" class="w90 h90"></image>
+						<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						<button class="wx-head" type="balanced" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
+						</button>
+					</view>
+				</view>
+				<view class="form-item">
+					<text class="label">姓名<text class="color-price">*</text></text>
+					<input class="input-width" type="text" v-model="form.username" placeholder="请输入姓名"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">性别<text class="color-price">*</text></text>
+					<view class="sex-box">
+						<view :class="form.sex==0?'sex-item active':'sex-item'"  @click="sexChange(0)" >
+							<u-icon name="man" :color="form.sex==0?'#008FD3':'#EBF8FF'" size="20"></u-icon>
+							<text>男</text>
+						</view>
+						<view :class="form.sex==1?'sex-item active2':'sex-item'"  @click="sexChange(1)" >
+							<u-icon name="woman" :color="form.sex==1?'#FF5030':'#898E91'" size="20"></u-icon>
+							<text>女</text>
+						</view>
+					</view>
+				</view>
+				<view class="form-item">
+					<text class="label">出生年月<text class="color-price">*</text></text>
+					<picker class="birth-picker" mode="date"   @change="bindDateChange">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.birthdate" placeholder="请选择出生年月" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+				</view>
+				<view class="form-item">
+					<text class="label">手机号<text class="color-price">*</text></text>
+					<input maxlength="11" class="input-width" type="number" v-model="form.phone" placeholder="请输入手机号" placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">身份证号<text class="color-price">*</text></text>
+					<input maxlength="18" class="input-width" type="idcard" v-model="form.idCard" placeholder="请如实填写身份证号" placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">退休前工作单位<text class="color-price">*</text></text>
+					<input class="input-width" type="text" v-model="form.previousEmployer" placeholder="请输入工作单位"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">可支配收入<text class="color-price">*</text></text>
+					<input  class="input-width" type="digit" v-model="form.disposableIncome" placeholder="请输入支配收入"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">实际消费<text class="color-price">*</text></text>
+					<input class="input-width" type="digit" v-model="form.actualConsumption" placeholder="请输入实际消费"
+						placeholder-class="form-input" />
+				</view>
+			</view>
+			<view class="form-box">
+				<text class="form-title">家庭地址及居住情况</text>
+				
+				<view class="form-item">
+					<text class="label">市区<text class="color-price">*</text></text>
+					<picker class="birth-picker" mode="region" level="city"  @change="bindCityChange">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.city" placeholder="请选择市区" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+					
+				</view>
+				<view class="form-item">
+					<text class="label">小区名称</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.residentialCommunity" placeholder="请输入小区名称"
+						placeholder-class="form-input" />
+				
+				</view>
+				<view class="form-item">
+					<text class="label">门牌</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.houseNumber" placeholder="请输入门牌号"
+						placeholder-class="form-input" />
+				
+				</view>
+				
+				
+				<view class="form-item">
+					<text class="label">面积</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.area" placeholder="请输入面积"
+						placeholder-class="form-input" />
+				</view>
+				
+                 <view class="form-item">
+					<text class="label">楼层</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.floor" placeholder="请输入楼层"
+						placeholder-class="form-input" />
+				</view>
+			</view>
+			<view class="form-box">
+				<text class="form-title">家庭情况</text>
+				<view class="form-item">
+					<text class="label">伴侣</text>
+					<input class="input-width" type="text" v-model="form.partnerName" placeholder="请输入伴侣姓名"
+						placeholder-class="form-input" />
+				
+				</view>
+				<view class="form-item">
+					<text class="label">伴侣年龄</text>
+					<input class="input-width" type="number" v-model="form.partnerAge" placeholder="请输入伴侣年龄"
+						placeholder-class="form-input" />
+				
+				</view>
+				
+				
+				<view class="form-item">
+					<text class="label">子辈单位</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.partnerEmployer" placeholder="请输入子辈工作单位"
+						placeholder-class="form-input" />
+				</view>
+				
+				 <view class="form-item">
+					<text class="label">孙辈学校</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.grandchildrenSchool" placeholder="请输入所在学校"
+						placeholder-class="form-input" />
+				</view>
+			</view>
+			<view class="form-box">
+				<text class="form-title">会员情况</text>
+				<view class="form-item justify-between">
+					<text class="label">是否是会员</text>
+				<radio-group style="display: flex;align-items: center;">
+					<label style="margin-right: 50upx;">
+						<radio @click="radioClick(1)" value="1" :checked="form.isMember==1"
+							style="margin-right: 16upx;" />
+						<text class="sex-text">是</text>
+					</label>
+					<label>
+						<radio @click="radioClick(0)" value="0" :checked="form.isMember==0"
+							style="margin-right: 16upx;" />
+						<text class="sex-text">否</text>
+					</label>
+				</radio-group>
+				</view>
+				<view class="form-item">
+					<text class="label">会员分类</text>
+					<picker class="birth-picker" mode="selector"  @change="bindMemberChange($event,tags)" :range="tags" range-key="dictLabel">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.memberLevel" placeholder="请选择会员分类" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+				
+				</view>
+				
+				
+				<view class="form-item">
+					<text class="label">加入时间</text>
+					<picker class="birth-picker" mode="date"   @change="bindJoinChange">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.joinTime" placeholder="请选择加入时间" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+				</view>
+				
+				 <view class="form-item">
+					<text class="label">到期时间</text>
+					<picker class="birth-picker" mode="date"   @change="bindEndChange">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.expiryTime" placeholder="请选择到期时间" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+				</view>
+				<view class="form-item">
+					<text class="label">管理月份</text>
+					<picker class="birth-picker" mode="date" fields="month" @change="bindMonthChange">
+						<view class="right-box">
+							<view class="input-box">
+								<input type="text" :value="form.managementMonth" placeholder="请选择管理月份" placeholder-class="form-input" disabled="disabled" />
+							</view>
+							<image class="w48 h48" src="/static/images/health/right_arrow_right_icon24.png"></image>
+						</view>
+					</picker>
+				</view>
+			</view>
+			<view class="form-box">
+				<text class="form-title">特殊情况</text>
+				<view class="form-item">
+					<text class="label">职位</text>
+					<input class="input-width" type="text" v-model="form.position" placeholder="请输入职位"
+						placeholder-class="form-input" />
+				
+				</view>
+				<view class="form-item">
+					<text class="label">癖好</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.hobbies" placeholder="请输入癖好"
+						placeholder-class="form-input" />
+				
+				</view>
+				
+				
+				<view class="form-item">
+					<text class="label">平日喜好</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.specialties" placeholder="请输入平日喜好"
+						placeholder-class="form-input" />
+				</view>
+				
+				 <view class="form-item">
+					<text class="label">信仰</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.faith" placeholder="请输入信仰"
+						placeholder-class="form-input" />
+				</view>
+				<view class="form-item">
+					<text class="label">担忧</text>
+					<input maxlength="10" class="input-width" type="text" v-model="form.concerns" placeholder="请输入担忧"
+						placeholder-class="form-input" />
+				</view>
+			</view>
+			<view class="form-box">
+				<text class="form-title">其他<text class="color-price">*</text></text>
+				<view class="form-item">
+				<!-- 	<text class="label">备注</text> -->
+					<textarea maxlength="200" class="form-textarea" v-model="form.problemsToSolve" placeholder="请输入用户想解决的问题"  placeholder-class="textarea-input" />
+				</view>
+				<view class="form-item">
+					<!-- <text class="label">备注</text> -->
+					<textarea maxlength="200" class="form-textarea" v-model="form.healthSuggestions" placeholder="请输入健康管理师对用户的建议"   placeholder-class="textarea-input"/>
+				</view>
+			</view>
+		
+		</view>
+		<view class="btn-box">
+			<view class="sub-btn" @click="submit()">保存</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getInfo,updateInfo,deleteInfo,addInfo,getMember} from '@/api/healthUser.js'
+	import {
+		getDocDetails,
+		addDoc,
+		editDoc
+	} from '@/api/doc.js'
+	export default {
+		data() {
+			return {
+				type: null,
+				patientId: null,
+				famaleurl:"/static/images/health/female_profile.png",
+				maleurl:"/static/images/health/my_heads.png",
+				checked:1,
+				// 定义直辖市列表,用于判断特殊处理
+				      municipalities: ['北京市', '上海市', '天津市', '重庆市'],
+				array:[
+					{id:1,name:'是'},
+					{id:0,name:'否'},
+					],
+				tags: [],
+				isAdd:null,
+				form: {
+					"username": null,
+					avatar:null,
+					"sex":0, 
+					"birthdate": null, 
+					"age": 0,
+					"phone":  null,
+					"idCard":  null,
+					"previousEmployer":  null,
+					"disposableIncome": null,
+					"actualConsumption":  null,
+					"city":  null,
+					"residentialCommunity": null,
+					"houseNumber": null, 
+					"area":  null, 
+					"floor":  null,
+					"partnerName":  null,
+					"partnerAge":  null,
+					"partnerEmployer":  null,
+					"grandchildrenSchool": null,
+					"isMember":  1, 
+					"memberLevel":  null, 
+					"joinTime": null,
+					"expiryTime": null,
+					"managementMonth":null,
+					"position":null,
+					"hobbies": null,
+					"specialties": null,
+					"faith": null, 
+					"concerns": null,
+					"problemsToSolve": null,
+					"healthSuggestions": null,
+				}
+			};
+		},
+		onLoad(options) {
+			this.type = options.type;
+			this.userId=options.userId;
+			this.companyUserId=options.companyUserId;
+			this.form.userId=options.userId;
+			this.form.companyUserId=options.companyUserId;
+			if (this.type == 'edit') {
+				this.getInfo();
+			}
+			this.getMember()
+		},
+		methods: {
+			sexChange(type) {
+				this.form.sex = type
+			},
+			radioClick(id) {
+			        this.form.isMember=id
+			      },
+			getMember(){
+				getMember().then(
+					res => {
+						if (res.code == 200) {
+							this.tags= res.data;
+						    
+						} else {
+							uni.showToast({
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		getInfo() {
+			var data = {
+				userId: this.userId
+			};
+			getInfo(data).then(
+				res => {
+					if (res.code == 200) {
+		                this.form = res.data;
+					} else {
+						uni.showToast({
+							title: res.msg,
+						});
+					}
+				},
+				rej => {}
+			);
+		},
+			onChooseAvatar(e){
+				// 处理用户取消的情况
+				    if (e.detail.errMsg && e.detail.errMsg.includes('cancel')) {
+				      console.log('选择头像已取消')
+				      return
+				    }
+				let {
+					avatarUrl
+				} = e.detail;
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: avatarUrl,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						this.form.avatar =JSON.parse(uploadFileRes.data).url
+					}
+				});
+			},
+			submit() {
+				if (this.form.username == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "姓名不能为空",
+					});
+					return;
+				}
+				if (this.form.phone == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "手机号不能为空",
+					});
+					return;
+				}
+				if (this.form.idCard == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "身份证号不能为空",
+					});
+					return;
+				}
+				if (this.form.sex == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "性别不能为空",
+					});
+					return;
+				}
+				if (this.form.birthdate == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "出生年月不能为空",
+					});
+					return;
+				}
+				if (this.form.city == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "市区不能为空",
+					});
+					return;
+				}
+				if (this.form.problemsToSolve == null) {
+					uni.showToast({
+						icon: 'none',
+						title: "用户问题不能为空",
+					});
+					return;
+				}
+				if(this.type=="add"){
+					this.addDoc()
+				}
+				else if(this.type=="edit"){
+					this.editDoc()
+				}
+                // uni.navigateTo({
+                // 	url: '/pages_health/doc?type=edit&docId='
+                // })
+			},
+	editDoc() {
+		updateInfo(this.form).then(
+			res => {
+				if (res.code == 200) {
+					uni.showToast({
+						icon: 'success',
+						title: "操作成功",
+					});
+					setTimeout(function() {
+						uni.$emit('refreshDoc');
+						uni.$emit('refreshHealthFiles');
+						uni.navigateBack({
+							delta: 1
+						})
+					}, 500);
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: res.msg,
+					});
+				}
+			},
+			rej => {}
+		);
+	},
+	addDoc() {
+		addInfo(this.form).then(
+			res => {
+				if (res.code == 200) {
+					uni.showToast({
+						icon: 'success',
+						title: "操作成功",
+					});
+					setTimeout(function() {
+						uni.$emit('refreshDoc');
+						uni.$emit('refreshHealthFiles');
+						uni.navigateBack({
+							delta: 1
+						})
+					}, 500);
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: res.msg,
+					});
+				}
+			},
+			rej => {}
+		);
+	},
+			// 出生日期选择
+			bindDateChange: function(e) {
+				this.form.birthdate = e.target.value
+			},
+			//市区
+			bindCityChange:function(e) {
+				const region = e.detail.value; // 格式: [省, 市, 区]
+				      let displayText = '';
+				      // 处理直辖市重复问题
+				      if (this.municipalities.includes(region[0])) {
+				        // 直辖市:省和市名称相同,只显示一次
+				        // 格式变为 "北京市 海淀区" 而非 "北京市 北京市 海淀区"
+				        displayText = `${region[0]}`;
+				      } else {
+				        // 非直辖市:正常显示省市区
+				        displayText = region;
+				      }
+				      this.form.city = displayText;
+				
+				},
+				//会员情况
+				// bindIsMemberChange:function(e) {
+				// 	this.form.isMember = e
+				// 	},
+				//会员分类
+				bindMemberChange:function(e,list) {
+					var index=e.target.value
+					this.form.memberLevel = list[e.target.value].dictLabel
+					},
+					//加入时间
+					bindJoinChange:function(e) {
+						this.form.joinTime = e.target.value
+						},
+						//到期时间
+						bindEndChange:function(e) {
+							this.form.expiryTime = e.target.value
+							},
+							//月份
+							bindMonthChange:function(e) {
+								this.form.managementMonth = e.target.value
+								},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+	}
+
+	.content {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+
+		.inner {
+			// height: calc(100% - 120upx);
+			padding: 20upx;
+
+			.form-box {
+				padding: 0 30upx;
+				background: #FFFFFF;
+				border-radius: 16upx;
+				margin-bottom: 20upx;
+
+				.form-title {
+					font-family: PingFang SC;
+					font-weight: 600;
+					font-size: 40rpx;
+					color: #222426;
+					text-align: left;
+					padding: 30rpx 0;
+					display: block;
+				}
+
+				.form-item {
+					padding: 30upx 0;
+					display: flex;
+					align-items: flex-start;
+					border-bottom: 1px solid #F1F1F1;
+
+					&:last-child {
+						border-bottom: none;
+					}
+        
+					.label {
+						width: 300upx;
+						text-align: left;
+						font-size: 32upx;
+						line-height: 44upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+						flex-shrink: 0;
+					}
+
+					input {
+						text-align: right;
+					}
+               
+					.form-input {
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
+						text-align: right;
+					}
+
+					.form-item-tag{
+						margin-right: 16rpx;
+						.tag{
+							border-radius: 8rpx 8rpx 8rpx 8rpx;
+							border: 2rpx solid #ECECEC;
+							display: flex;
+							align-items: center;
+							padding: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 400;
+							font-size: 24rpx;
+							&.active{
+								background: #F0FAFF;
+								border: 2rpx solid #008FD3;
+								color: #008FD3;
+							}
+						}
+						
+						
+						
+					}
+					.right{
+						display: flex;
+						align-items: center;
+						position: relative;
+						image{
+							border-radius: 50%;
+						}
+						.wx-head{
+							position: absolute;
+							width: 140upx;
+							height: 80upx;
+							opacity: 0;
+						}
+					}
+					.sex-box{
+						flex:1;
+						display: flex;
+						align-items: center;
+						justify-content: flex-end;
+						.sex-item{
+							width: 146rpx;
+							height: 64rpx;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							background: #F5F7FA;
+							border-radius: 32rpx 32rpx 32rpx 32rpx;
+							margin-left: 16rpx;
+							.u-icon__icon{
+								margin: 0;
+							}
+							text{
+								// font-family: PingFang SC, PingFang SC;
+								font-weight: 400;
+								font-size: 28rpx;
+								color: #898E91;
+								margin-left: 12rpx;
+							}
+							&.active{
+								background: #EBF8FF;
+								text{
+									color:#008FD3
+								}
+							}
+							&.active2{
+								background: #FCF0E7;
+								text{
+									color:#FF5030
+								}
+							}
+						}
+					}
+					.form-textarea{
+						font-size: 30upx;
+						// color: #999999;
+						height: 100upx;
+						padding: 4upx 0;
+					}
+					 .textarea-input{
+						 color: #999999;
+					 }
+					.birth-picker {
+						flex: 1;
+						display: flex;
+						align-items: center;
+						
+						.right-box{
+							width: 100%;
+							display: flex;
+							align-items: center;
+							.input-box{
+								// width: 470upx;
+							}
+							.arrow{
+								width: 13upx;
+								height: 23upx;
+								margin-left: 20upx;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		.btn-box {
+			height: 120upx;
+			padding: 0 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+			// position: fixed;
+			// width: 90%;
+			// bottom: 0;
+			// left: 50%;
+			// transform: translate(-50%,-50%);
+			// background: #FFFFFF;
+			.sub-btn {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-size: 32upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #FFFFFF;
+				background: #008FD3 ;
+				border-radius: 44upx;
+				margin-bottom: 40upx;
+			}
+		}
+	}
+</style>

+ 294 - 0
pages_live/card.vue

@@ -0,0 +1,294 @@
+<template>
+	<view class="content">
+		<view class="inner">
+			<view class="bg">
+				<image class="w622 h622" src="@/static/image/bg_invitecard.png" mode=""></image>
+				<view class="infor">
+					<view class="title one-t">康复医学概论</view>
+					<view class="name-title">
+						<image class="w32 h32 " src="@/static/image/icon_doctor_fill.png" mode=""></image>
+						<view class="one-t">王小明 | 消化内科 | 北京人民医院</view>
+						</view>
+					<view class="time-title">
+						<image class="w32 h32 " src="@/static/image/icon_doctor_fill.png" mode=""></image>
+						<view class="one-t">2025年12月13日 18:00</view>
+						</view>
+				</view>
+			</view>
+				
+				<view class="code">
+					<image class="w176 h176 " src="@/static/image/icon_doctor_fill.png" mode=""></image>
+					<view class="tips">长按识别二维码,观看直播</view>
+				</view>
+		</view>
+		<view class="share-box">
+			<view class="weixin" style="margin-right: 176rpx;">
+				<image class="w100 h100 " src="@/static/image/icon_share_wechat.png" mode=""></image>
+				<text>微信好友</text>
+				<button class="share" data-name="shareBtn" open-type="share"></button>
+			</view>
+			<view class="setimg" @tap="saveInviteCard">
+				<image class="w100 h100 " src="@/static/image/icon_share_save.png" mode=""></image>
+				<text>保存图片</text>
+			</view>
+		</view>
+		<canvas type="2d" id="inviteCardCanvas" style="width: 622rpx; height: 920rpx; position: fixed; top: -9999rpx; left: -9999rpx;"></canvas>
+	</view>
+</template>
+
+<script>
+	import {
+		getCompetitorById,saveCompetitor,updateCompetitor
+	} from '@/api/companyUser.js'
+	export default {
+		data() {
+			return {
+			 bgImg: "/static/image/bg_invitecard.png",
+			      doctorIcon: "/static/image/icon_doctor_fill.png",
+			      qrCodeImg: "/static/image/icon_doctor_fill.png", // 替换为真实二维码
+			      wechatIcon: "/static/image/icon_share_wechat.png",
+			      saveIcon: "/static/image/icon_share_save.png"
+				
+			};
+		},
+		onLoad(options) {
+			// this.type = option.type;
+			// this.form.userId=options.userId
+			// this.form.companyUserId=options.companyUserId;
+			// console.log(this.type)
+			// if (this.type == 'edit') {
+			// 	this.id=option.id;
+			// 	this.getCompetitorInfo();
+			// }
+			uni.showShareMenu({
+				withShareTicket:true,
+				//小程序的原生菜单中显示分享按钮,才能够让发送给朋友与分享到朋友圈两个按钮可以点击
+				menus:["shareAppMessage"] //不设置默认发送给朋友
+			})
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			// if(this.utils.isLogin()){
+			// 	var user=JSON.parse( uni.getStorageSync('userInfo'))
+			// 	return {
+			// 		title: this.product.productName,
+			// 		path: '/pages/shopping/productDetails?productId='+this.product.productId+"&userId="+user.userId,
+			// 		imageUrl: 'https://user.test.ylrztop.com/images/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			// 	}
+			// }
+		},
+		methods: {
+		  // 保存邀请卡图片
+		  			async saveInviteCard() {
+		  				try {
+		  					uni.showLoading({ title: "生成图片中..." });
+		  
+		  					// 1. 获取canvas上下文(Uniapp兼容写法)
+		  					const query = uni.createSelectorQuery().in(this);
+		  					const canvasRes = await new Promise((resolve) => {
+		  						query.select("#inviteCardCanvas").node().exec((res) => {
+		  							resolve(res[0]);
+		  						});
+		  					});
+		  					if (!canvasRes.node) {
+		  						throw new Error("获取Canvas失败");
+		  					}
+		  					const canvas = canvasRes.node;
+		  					const ctx = canvas.getContext("2d");
+		  
+		  					// 2. 适配设备像素比,保证图片高清
+		  					const systemInfo = uni.getSystemInfoSync();
+		  					const dpr = systemInfo.pixelRatio || 1;
+		  					canvas.width = 622 * dpr;
+		  					canvas.height = 920 * dpr; // 与canvas样式高度统一
+		  					ctx.scale(dpr, dpr);
+		  
+		  					// 3. 加载并绘制背景图
+		  					const bgImg = await this.loadImage(this.bgImg,canvas);
+		  					ctx.drawImage(bgImg, 0, 0, 622, 622);
+		  
+		  					// 4. 绘制文字(标题/医生/时间)
+		  					ctx.font = "bold 32rpx PingFang SC"; // 匹配样式中的字体和大小
+		  					ctx.fillStyle = "#FFFFFF";
+		  					ctx.fillText("康复医学概论", 46, 580); // 调整坐标匹配UI布局
+		  
+		  					ctx.font = "24rpx PingFang SC";
+		  					ctx.fillText("王小明 | 消化内科 | 北京人民医院", 46, 616);
+		  					ctx.fillText("2025年12月13日 18:00", 46, 652);
+		  
+		  					// 5. 绘制二维码
+		  					const qrImg = await this.loadImage(this.qrCodeImg,canvas);
+		  					const qrX = (622 - 176) / 2; // 二维码居中
+		  					ctx.drawImage(qrImg, qrX, 622 + 32, 176, 176); // 匹配code区域的padding
+		  
+		  					// 6. 绘制二维码提示文字
+		  					ctx.font = "24rpx PingFang SC";
+		  					ctx.fillStyle = "#999999";
+		  					const tipsText = "长按识别二维码,观看直播";
+		  					const textWidth = ctx.measureText(tipsText).width;
+		  					const tipsX = (622 - textWidth) / 2;
+		  					ctx.fillText(tipsText, tipsX, 622 + 32 + 176 + 16); // 匹配tips的margin-top
+		  
+		  					// 7. 导出canvas为临时图片
+		  					const tempFilePath = await new Promise((resolve, reject) => {
+		  						uni.canvasToTempFilePath({
+		  							canvas: canvas,
+		  							x: 0,
+		  							y: 0,
+		  							width: 622,
+		  							height: 920,
+		  							destWidth: 622 * dpr,
+		  							destHeight: 920 * dpr,
+		  							success: (res) => resolve(res.tempFilePath),
+		  							fail: (err) => reject(err)
+		  						}, this);
+		  					});
+		  
+		  					uni.hideLoading();
+		  
+		  					// 8. 申请相册权限并保存图片
+		  					try {
+		  						await uni.authorize({ scope: "scope.writePhotosAlbum" });
+		  					} catch (authErr) {
+		  						// 授权失败时引导用户手动开启
+		  						uni.showModal({
+		  							title: "提示",
+		  							content: "需要相册权限才能保存图片,请前往设置开启",
+		  							confirmText: "去设置",
+		  							success: (res) => {
+		  								if (res.confirm) uni.openSetting();
+		  							}
+		  						});
+		  						return;
+		  					}
+		  
+		  					await uni.saveImageToPhotosAlbum({ filePath: tempFilePath });
+		  					uni.showToast({ title: "图片保存成功", icon: "success" });
+		  
+		  				} catch (err) {
+		  					uni.hideLoading();
+		  					uni.showToast({ title: "保存失败", icon: "none" });
+		  					console.error("保存图片失败:", err);
+		  				}
+		  			},
+		  			// 优化图片加载方法,适配Uniapp静态资源
+		  			loadImage(src,canvas) {
+		  							return new Promise((resolve, reject) => {
+		  								// 处理@/static路径为绝对路径
+		  								// const realSrc = src.replace("@", "");
+		  								const img = canvas.createImage();
+		  								// 小程序环境下添加跨域标识
+		  								img.crossOrigin = "anonymous";
+		  								img.src = src;
+		  								img.onload = () => resolve(img);
+		  								img.onerror = (err) => reject(err);
+		  							});
+		  						}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+	}
+
+	.content {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+	.inner{
+		width: 622rpx;
+		height: 920rpx;
+		margin: 64rpx;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 32rpx 0rpx rgba(170,168,168,0.12);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		.bg{
+			position: relative;
+			// padding: 32rpx 46rpx;
+			.infor{
+				width: 100%;
+				position: absolute;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				padding-left:46rpx;
+				bottom: 24rpx;
+				
+				.title{
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 600;
+					font-size: 32rpx;
+					color: #FFFFFF;
+					margin-bottom: 26rpx;
+					width: 80%;
+				}
+				.name-title,.time-title{
+					width: 100%;
+					display: flex;
+					align-items: center;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 600;
+					font-size: 24rpx;
+					color: #FFFFFF;
+					line-height: 36rpx;
+					margin-bottom: 8rpx;
+					image{
+						margin-right: 14rpx;
+					}
+					.one-t{
+						width: 80%;
+					}
+				}
+				
+			}
+			
+		}
+	}
+	.code{
+		padding: 32rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		background: #FFFFFF;
+		.tips{
+			margin-top: 16rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #999999;
+			line-height: 36rpx;
+		}
+	}
+		.share-box{
+			margin-top: 108rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.weixin,.setimg{
+				display: flex;
+				align-items: center;
+				flex-direction: column;
+				position: relative; 
+				text{
+					margin-top: 18rpx;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 44rpx;
+				}
+			}
+			.share{
+				display: inline-block;
+						position: absolute;
+						top: 0;
+						left: 0;
+						width: 100%;
+						height: 100%;
+						opacity: 0;
+			}
+		}
+	}
+</style>

+ 105 - 0
pages_live/healthConsulting.vue

@@ -0,0 +1,105 @@
+<template>
+	<view class="hb column hidden container ">
+		<image class="bg" src="https://user.test.ylrztop.com/images/health_counseling_bg.png" mode="widthFix"></image>
+		<view :style="{height: statusBarHeight,background: bgColor }"></view>
+		<u-navbar
+			title="健康咨询" titleStyle="font-weight: bold;"
+			@rightClick="rightClick"
+			:autoBack="true"
+			:bg-color="bgColor"
+		>
+		</u-navbar>
+		<scroll-view class="content" :scroll-y="true">
+			<view v-for="(index,item) in 10" :key="index" class="healthlist justify-start">
+				<image src="https://user.test.ylrztop.com/images/71014b69fdcc4b56ae2a84bdc28f11c3.png" mode="aspectFill" class="w280 h210 radius12"></image>
+				<view class="column justify-between ml20">
+					<view>
+						<view class="color-text bold fs36">翟佳滨教授专家团队</view>
+						<view class="fs24 mt8 color-orange">专家团队会诊咨询</view>
+					</view>
+					<view class="healthbox" @click="toDetails">会诊咨询</view>
+				</view>
+			</view>
+			<view class="h120"></view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				statusBarHeight:'',
+				top:0
+			}
+		},
+		computed: {
+			// 计算属性的 getter
+			bgColor: function() {
+				var top=this.top/30;
+				return 'rgba(11,179,242, ' + top + ')';
+			},
+		},
+		onLoad() {
+		    // 获取系统信息
+		    const sys = uni.getSystemInfoSync()
+		    this.statusBarHeight = sys.statusBarHeight+'px'
+		},
+		onUnload() { //普通页面在 onUnload 生命周期中执行
+		    uni.$emit('stop')
+		},
+		onHide() { //tabBar页面在onHide生命周期中执行
+		    uni.$emit('stop')
+		},
+		onPageScroll(e) {
+		  	//console.log(e)
+		  	this.top=e.scrollTop;
+		},
+		methods: {
+			toDetails(){
+				uni.navigateTo({
+					url:'/pages_health/ConsultationDetails'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.container{
+	position: relative;
+	.bg{
+		width: 100%;
+		height: 380rpx;
+		position: absolute;
+		top: 0;
+		left: 0;
+		z-index: -1;
+	}
+}
+.content{
+	padding-top: calc(var(--status-bar-height) + 140rpx);
+	  height: 100vh;
+	  box-sizing: border-box;
+	  width: 100%;
+	  .healthlist{
+		  width: 85%;
+		  padding: 32rpx;
+		  margin: 0 auto;
+		  background: #FFFFFF;
+		  box-shadow: 0rpx 0rpx 20rpx 8rpx rgba(0,143,211,0.1);
+		  border-radius: 16rpx;
+		  margin-bottom: 20rpx !important;
+	  }
+}
+.healthbox{
+	width: 200rpx;
+	height: 72rpx;
+	background: linear-gradient( 180deg, #27B7FB 0%, #008FD3 100%);
+	box-shadow: 0rpx 8rpx 8rpx 0rpx rgba(0,143,211,0.2);
+	border-radius: 36rpx 36rpx 36rpx 36rpx;
+	text-align: center;
+	line-height: 72rpx;
+	color: #FFFFFF;
+}
+</style>

+ 512 - 0
pages_live/healthfiles.vue

@@ -0,0 +1,512 @@
+<template>
+	<view class="hb column hidden container">
+		<image class="bg" src="https://user.test.ylrztop.com/images/jkda_top_bg.png" mode="widthFix"></image>
+		<view :style="{height: statusBarHeight,background: bgColor }"></view>
+		<u-navbar title="健康档案" titleStyle="font-weight: bold;" @rightClick="rightClick" :autoBack="true"
+			:bg-color="bgColor">
+		</u-navbar>
+		<scroll-view class="content" :scroll-y="true">
+			<view class="justify-between align-center bg-white radius12 p28">
+				<view class="justify-start align-center">
+					<image :src="info.avatar||maleurl" class="w140 h140"></image>
+					<view class="ml30">
+						<view class="bold fs32 mb12">{{info.username||'-'}}</view>
+						<view class="justify-start align-center fs24">
+							<text class="orangebox">{{info.sex==0?'男':'女'}}</text>
+							<text class="orangebox ml12">{{info.age||'-'}}岁</text>
+						</view>
+					</view>
+				</view>
+				<u-icon name="arrow-right" @click="goToUser"></u-icon>
+			</view>
+			<view class="fs36 bold mt20">健康数据</view>
+			<view class="health-monitoring">
+				<view class="health-monitoring-item" @click="handleMonitoring(0)">
+					<view class="health-monitoring-title">
+						<view>
+							<view class="health-monitoring-maintitle bold">{{BMI?BMI.toFixed(2):'--'}}</view>
+							<view :class="bmiCategory=='超重'||bmiCategory=='肥胖'?'text-color':''">{{bmiCategory}}</view>
+						</view>
+						<image src="/static/images/health/BMI_icon.png" mode="aspectFill"></image>
+					</view>
+					<view class="health-bmi mt40">
+						<view class="justify-between align-center mb12">
+							<view class="justify-start align-center ">
+								<text class="color-text2 fs24 mr20">身高</text>
+								<view class="fs24">{{form.height?form.height+'cm':'--'}}</view>
+							</view>
+							<image src="/static/images/health/services_edit_icon.png" class="w32 h32"></image>
+						</view>
+						<view class="justify-between align-center">
+							<view class="justify-start align-center ">
+								<text class="color-text2 fs24 mr20">体重</text>
+								<view class="fs24">{{form.weight?form.weight+'kg':'--'}}</view>
+							</view>
+							<image src="/static/images/health/services_edit_icon.png" class="w32 h32"></image>
+						</view>
+					</view>
+				</view>
+				<view class="health-monitoring-item" v-for="(item,index) in infoList" :key="index"
+					@click="handleMonitoring(item,index+1)">
+					<view class="health-monitoring-title">
+						<view>
+							<view class="health-monitoring-maintitle bold">{{item.title}}</view>
+							<view v-if='index<2'>{{item.type==0?'正常':item.type==1?'偏小':'偏大'}}</view>
+							<view v-if='index>1'>{{item.type==0?'正常':item.type==1?'轻微':'严重'}}</view>
+						</view>
+						<image :src="item.icon" mode="aspectFill"></image>
+					</view>
+					<view>
+						<view class="health-monitoring-res resnum">{{item.value.value1 || '--'}}</view>
+						<view class="health-monitoring-time">{{item.value.measurementDate|| '--'}}
+							{{item.value.measurementTime|| '--'}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="fs36 bold mtb20">健康史</view>
+			<view class="cardbox">
+				<view class="health-item" @click="handleEditHealth()">
+					<image class="health-bgicon" src="https://user.test.ylrztop.com/images/jbs_icon.png"></image>
+					<view class="health-item-info">
+						<view class="cardbox-maintitle" style="margin-bottom: 0;">疾病史</view>
+						<view class="text-overflow" style="margin-top: 20rpx;">{{form.otherMedicalHistory || "尚未记录"}}
+						</view>
+					</view>
+				</view>
+				<view class="health-item" @click="handleEditHealth()">
+					<image class="health-bgicon" src="https://user.test.ylrztop.com/images/zzs_icon.png"></image>
+					<view class="health-item-info">
+						<view class="cardbox-maintitle" style="margin-bottom: 0;">症状史</view>
+						<view class="text-overflow" style="margin-top: 20rpx;">{{form.symptomHistory || "尚未记录"}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="h80"></view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		getUserInfo
+	} from '@/api/user.js'
+	import {
+		getInfo,
+		getDoc,
+		homeInfo
+	} from '@/api/healthUser.js'
+	import carKeyboard from '../uni_modules/uview-ui/libs/config/props/carKeyboard';
+	export default {
+		data() {
+			return {
+				statusBarHeight: '',
+				top: 0,
+				null: 0,
+				famaleurl: "/static/images/health/female_profile.png",
+				maleurl: "/static/images/health/my_heads.png",
+				img: [
+					
+					"/static/images/health/hip_circumference_icon.png",
+					"/static/images/health/blood_sugar_icon.png",
+					"/static/images/health/blood_pressure_icon.png",
+					"/static/images/health/uric_acid_icon.png"
+				],
+				indexInfo: [],
+				bgColor: 'rgba(11,179,242,0)',
+				user: null,
+				bmiCategory: '',
+				info: {},
+				infoList: [{
+					title:'腰围',
+					icon:"/static/images/health/waist_circumference_icon.png",
+					type:0,
+					value:{}
+				},{
+					title:'臀围',
+					icon:"/static/images/health/hip_circumference_icon.png",
+					type:0,
+					value:{}
+				},{
+					title:'血糖',
+					icon:"/static/images/health/blood_sugar_icon.png",
+					type:0,
+					value:{}
+				},{
+					title:'血压',
+					icon:"/static/images/health/blood_pressure_icon.png",
+					type:0,
+					value:{}
+				},{
+					title:'尿酸',
+					icon:"/static/images/health/uric_acid_icon.png",
+					type:0,
+					value:{}
+				}
+				],
+				form: null,
+				dataMap: {},
+				BMI: null
+
+			}
+		},
+		computed: {
+			// 计算属性的 getter
+			// bgColor: function() {
+			// 	var top=this.top/30;
+			// 	return 'rgba(11,179,242, ' + top + ')';
+			// },
+		},
+		onLoad() {
+			// 获取系统信息
+			const sys = uni.getSystemInfoSync()
+			this.statusBarHeight = sys.statusBarHeight + 'px'
+
+			// uni.navigateTo({
+			// 	url: '/pages_health/doc?type=edit&docId='
+			// })
+			this.getUserInfo()
+			uni.$on('refreshHealthFiles', () => {
+				this.getDoc()
+				this.getUserInfo()
+				// this.homeInfo()
+			})
+
+			// this.getInfo()
+
+		},
+		onUnload() { //普通页面在 onUnload 生命周期中执行
+			uni.$off('refreshHealthFiles');
+			uni.$emit('stop')
+		},
+		onHide() { //tabBar页面在onHide生命周期中执行
+			uni.$emit('stop')
+		},
+		onPageScroll(e) {
+			//console.log(e)
+			// this.top=e.scrollTop;
+		},
+		methods: {
+			getUserInfo() {
+				getUserInfo().then(
+					res => {
+						if (res.code == 200) {
+							if (res.user != null) {
+								this.user = res.user;
+								this.getInfo(this.user.userId)
+								this.homeInfo(this.user.userId)
+							} else {
+								this.utils.loginOut();
+							}
+
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getInfo(id) {
+				var that = this
+				var data = {
+					userId: id
+				};
+				getInfo(data).then(
+					res => {
+						if (res.code == 200) {
+							var data = res.data
+							if (res.data.birthdate == null) {
+								uni.showToast({
+									icon: 'none',
+									title: "请先完善用户信息",
+								});
+								setTimeout(function() {
+									uni.navigateTo({
+										url: '/pages_health/addUser?type=edit&userId=' + id
+									})
+								}, 500);
+
+							} else {
+								this.getDoc(id, data)
+							}
+
+						} else {
+							uni.showToast({
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getDoc(id, form) {
+				var data = {
+					userId: id
+				};
+				getDoc(data).then(
+					res => {
+						if (res.code == 200) {
+							this.form = res.data
+							this.$set(this, 'form', res.data)
+							if (this.form.weight && this.form.height) {
+								const heightInMeter = this.form.height / 100; // cm → m
+								this.BMI = this.form.weight / (heightInMeter * heightInMeter);
+								// console.log(this.BMI,'bmi')
+								this.setBmiCategory(); // 同步BMI分类
+							} else {
+								this.BMI = null;
+								this.bmiCategory = '未填写';
+							}
+							if (form.birthdate !== null && res.data == null) {
+								uni.navigateTo({
+									url: '/pages_health/addDoc?userId=' + id
+								})
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			setBmiCategory() {
+				if (!this.BMI) return;
+				if (this.BMI < 18.5) {
+					this.bmiCategory = '偏瘦';
+				} else if (this.BMI < 24) {
+					this.bmiCategory = '正常';
+				} else if (this.BMI < 28) {
+					this.bmiCategory = '超重';
+				} else {
+					this.bmiCategory = '肥胖';
+				}
+			},
+
+			homeInfo(id) {
+				var data = {
+					userId: id
+				};
+				homeInfo(data).then(
+					res => {
+						if (res.code == 200) {
+							this.info = res.data
+							const valueList = Object.values(res.data.dataMap);
+							const list = valueList.filter(item => item !== null);
+							for (var i = 0; i < this.infoList.length; i++) {
+							  // 假设list与infoList长度相同且对应
+							  this.infoList[i].type = list[i].level;
+							  this.infoList[i].value = list[i];
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			handleMonitoring(item, index) {
+				console.log(index, 'index')
+				switch (index) {
+					case 1:
+						uni.navigateTo({
+							url: '/pages_echarts/waistLine?userId=' + this.user.userId
+						})
+						break;
+					case 2:
+						uni.navigateTo({
+							url: '/pages_echarts/hips?userId=' + this.user.userId
+						})
+						break;
+					case 3:
+						uni.navigateTo({
+							url: '/pages_echarts/bloodSugar?userId=' + this.user.userId
+						})
+						break;
+					case 4:
+						uni.navigateTo({
+							url: '/pages_echarts/bloodPressure?userId=' + this.user.userId
+						})
+						break;
+					case 5:
+						uni.navigateTo({
+							url: '/pages_echarts/acid?userId=' + this.user.userId
+						})
+						break;
+					default:
+						uni.navigateTo({
+							url: '/pages_health/addDoc?type=add&userId=' + this.user.userId
+						})
+						break;
+				}
+			},
+			handleEditHealth(item, index) {
+				uni.navigateTo({
+					url: '/pages_health/addDoc?type=add&userId=' + this.user.userId
+				})
+			},
+			goToUser() {
+				console.log(this.info, '---')
+				if (this.info !== null) {
+					uni.navigateTo({
+						url: '/pages_health/addUser?type=edit&userId=' + this.user.userId
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		position: relative;
+		background: #EFF3F7;
+
+		.bg {
+			width: 100%;
+			height: 380rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 0;
+		}
+	}
+
+	.text-color {
+		color: #FF4B33;
+		width: 72rpx;
+		height: 40rpx;
+		text-align: center;
+		line-height: 40rpx;
+		border-radius: 8rpx 8rpx 8rpx 8rpx;
+		border: 1rpx solid #FFA599;
+	}
+
+	.content {
+		padding-top: calc(var(--status-bar-height) + 140rpx) !important;
+		// height: 100vh;
+		box-sizing: border-box;
+		width: 100%;
+		padding: 20rpx;
+	}
+
+	.orangebox {
+		border-radius: 24rpx;
+		border: 1rpx solid #FFA599;
+		color: #FF4B33;
+		font-size: 24rpx;
+		padding: 4rpx 20rpx;
+	}
+
+	.health-monitoring {
+		// @include u-flex(row, center, flex-start);
+		display: flex;
+		justify-content: space-between;
+		flex-wrap: wrap;
+		// gap: 16rpx;
+		margin-top: 20rpx;
+		margin-bottom: -16rpx;
+		margin-right: -16rpx;
+
+		&-item {
+			width: 343rpx;
+			min-height: 264rpx;
+			margin: 0 16rpx 16rpx 0;
+			overflow: hidden;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			padding: 24rpx 34rpx 24rpx 24rpx;
+			box-sizing: border-box;
+		}
+
+		&-maintitle {
+			margin-bottom: 4rpx;
+			font-size: 30rpx;
+			color: #333333;
+		}
+
+		&-title {
+			// @include u-flex(row, center, space-between);
+			display: flex;
+			justify-content: space-between;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #999999;
+
+			image {
+				width: 72rpx;
+				height: 72rpx;
+				flex-shrink: 0;
+			}
+		}
+
+		.resnum {
+			font-family: DIN, DIN;
+			font-weight: 500;
+			font-size: 64rpx;
+		}
+
+		&-res {
+			height: 78rpx;
+			margin: 20rpx 0 6rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 48rpx;
+			color: #333333;
+		}
+
+		&-time {
+			font-weight: 400;
+			font-size: 22rpx;
+			color: #999999;
+		}
+	}
+
+	.cardbox {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+		flex-wrap: wrap;
+		gap: 16rpx 14rpx;
+
+		&-maintitle {
+			margin-bottom: 4rpx;
+			font-weight: 600;
+			font-size: 30rpx;
+			color: #333333;
+		}
+	}
+
+	.health-item {
+		width: 343rpx;
+		height: 224rpx;
+		padding: 24rpx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		overflow: hidden;
+		position: relative;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #999999;
+	}
+
+	.health-item-info {
+		position: relative;
+	}
+
+	.health-bgicon {
+		position: absolute;
+		right: 0;
+		bottom: 0;
+		width: 168rpx;
+		height: 168rpx;
+	}
+</style>

+ 463 - 0
pages_live/lecture.vue

@@ -0,0 +1,463 @@
+<template>
+	<view>
+		<view class="top-content">
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="../../static/images/search.png" mode=""></image>
+					<input type="text" v-model="searchValue" placeholder="请输入关键字或作者" confirm-type="search"
+						@confirm="doSearch"
+						placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<view class="keyword-list">
+				<!-- 关键字列表 -->
+				<!-- <scroll-view   scroll-x="true" > -->
+				<view class="inner">
+					<view v-for="(item,index) in cates" :key="index" :class="choseCateId == item.cateId?'item active':'item'" @click="choseCate(item)">
+						{{ item.cateName }}
+					</view>
+				</view>
+			<!-- </scroll-view> -->
+				<!-- <u-tabs :list="cates" :activeStyle="{fontWeight: '500',color: '#333333',fontSize: '32rpx',lineHeight:'88rpx'}"
+					:inactiveStyle="{color: '#999999',fontSize: '28rpx',lineHeight:'88rpx'}" @click="choseCate(item)"
+					scrollable="false" lineColor="#388BFF"></u-tabs> -->
+			</view>
+		</view>
+
+		<mescroll-body :top="top" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
+			:down="downOption" :up="upOption">
+			<view class="know-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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 ">
+							<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="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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">
+							<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+						<view class="position-title one-t">
+							<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>北京人民医院
+						</view>
+					</view>
+				</view>
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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">
+							<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>
+		</mescroll-body>
+
+	</view>
+</template>
+
+<script>
+	import {
+		getArticleCate,
+		getArticleList
+	} from '@/api/article'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				top: '0px',
+				cates: [
+					{cateName: '全部',cateId:0},
+					{cateName:'待开播',cateId:1},
+					{cateName: '直播中',cateId:2},
+					{cateName:'看回放',cateId:3},
+				],
+				choseCateId: 0,
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				searchValue: '',
+				mescroll: null,
+				// 上拉加载的配置
+				downOption: {
+
+				},
+				upOption: {
+					onScroll: true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon: '/static/images/no_data.png',
+						tip: '暂无数据'
+					},
+					textNoMore: '没有更多了~'
+				},
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onShow() {
+			//this.getArticleCate();
+			var that = this;
+			setTimeout(function() {
+				let query = uni.createSelectorQuery().select(".top-content");
+				query.boundingClientRect(function(data) { //data - 各种参数
+					console.log(data.height) // 获取元素宽度
+					that.top = data.height + "px";
+				}).exec()
+			}, 500);
+		},
+		methods: {
+			doSearch() {
+				this.mescroll.resetUpScroll()
+			},
+			getArticleCate() {
+				var that = this;
+				let data = {};
+				getArticleCate(data).then(
+					res => {
+						if (res.code == 200) {
+							this.cates = res.data.map(person => ({
+								name: person.cateName
+							}));
+
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword: this.searchValue,
+					cateId: this.choseCateId,
+					page: page.num,
+					pageSize: page.size
+				};
+				getArticleList(data).then(res => {
+					if (res.code == 200) {
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			// 关键词选择
+			choseCate(item) {
+				this.choseCateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './addForm?articleId='
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #EFF3F7;
+	}
+
+	.status_bar {
+		width: 100%;
+
+	}
+
+	.top-content {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+
+	.top-title {
+		height: 88upx;
+		line-height: 88upx;
+		font-size: 42upx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41upx;
+	}
+
+	.search-cont {
+		padding: 16upx 30upx;
+         background: #fff;
+		.inner {
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F8FA;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+
+			.icon-search {
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+
+			input {
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+
+	.keyword-list {
+		box-sizing: border-box;
+		// padding: 10upx 27upx;
+		height: 88rpx;
+        background: #FFFFFF;
+		flex-shrink: 0;
+		.inner {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+		}
+
+		.item {
+			flex:1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-shrink: 0;
+			height: 88upx;
+			line-height: 88upx;
+			font-size: 28upx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #999999;
+            position: relative;
+			&.active {
+				font-weight: 500;
+				color: #333333;
+				&::after {
+					content: "";
+					width: 56upx;
+					height: 6upx;
+					background: #388BFF;
+					position: absolute;
+					bottom: 0;
+					border-radius: 3rpx 3rpx 3rpx 3rpx;
+				}
+			}
+		}
+	}
+
+	.know-list {
+		margin-top: 24upx;
+		padding: 0 24upx;
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		flex-shrink: 0;
+		flex-wrap: wrap; 
+		width: 100%;
+		box-sizing: border-box;
+		.item {
+			box-sizing: border-box;
+			width: calc(50% - 10rpx); 
+			height: 340rpx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			display: flex;
+			align-items: center;
+			justify-content: flex-start;
+			flex-direction: column;
+			margin-bottom: 18rpx;
+			margin-right: 18rpx;
+			&:nth-child(2){
+				margin-right:0;
+			}
+            .image-box {
+            	width: 100%;
+            	height: 192rpx;
+            	position: relative;
+            	border-radius: 16rpx 16rpx 0rpx 0rpx;
+            
+            	.bg {
+            		border-radius: 16rpx 16rpx 0rpx 0rpx;
+            		width: 100%;
+            		height: 100%;
+            	}
+            
+            	.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;
+            		}
+            	}
+            }
+			.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;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 463 - 0
pages_live/lesson.vue

@@ -0,0 +1,463 @@
+<template>
+	<view>
+		<view class="top-content">
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="../../static/images/search.png" mode=""></image>
+					<input type="text" v-model="searchValue" placeholder="请输入关键字或作者" confirm-type="search"
+						@confirm="doSearch"
+						placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<view class="keyword-list">
+				<!-- 关键字列表 -->
+				<!-- <scroll-view   scroll-x="true" >
+				<view class="inner">
+					<view v-for="(item,index) in cates" :key="index" :class="choseCateId == item.cateId?'item active':'item'" @click="choseCate(item)">
+						{{ item.cateName }}
+					</view>
+				</view>
+			</scroll-view> -->
+				<u-tabs :list="cates" :activeStyle="{fontWeight: '500',color: '#333333',fontSize: '32rpx',lineHeight:'88rpx'}"
+					:inactiveStyle="{color: '#999999',fontSize: '28rpx',lineHeight:'88rpx'}" @click="choseCate(item)"
+					scrollable="false" lineColor="#388BFF"></u-tabs>
+			</view>
+		</view>
+
+		<mescroll-body :top="top" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
+			:down="downOption" :up="upOption">
+			<view class="know-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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 ">
+							<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="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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">
+							<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+						<view class="position-title one-t">
+							<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>北京人民医院
+						</view>
+					</view>
+				</view>
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></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">
+							<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>
+		</mescroll-body>
+
+	</view>
+</template>
+
+<script>
+	import {
+		getArticleCate,
+		getArticleList
+	} from '@/api/article'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				top: '0px',
+				cates: [
+					{name: '全部',cateId:0},
+					{name:'内分泌',cateId:1},
+					{name:'肾病',cateId:2},
+					{name:'心血管',cateId:3},
+					{name:'风湿免疫',cateId:4},
+					{name:'风湿免疫',cateId:5},
+				],
+				choseCateId: 0,
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				searchValue: '',
+				mescroll: null,
+				// 上拉加载的配置
+				downOption: {
+
+				},
+				upOption: {
+					onScroll: true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon: '/static/images/no_data.png',
+						tip: '暂无数据'
+					},
+					textNoMore: '没有更多了~'
+				},
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onShow() {
+			//this.getArticleCate();
+			var that = this;
+			setTimeout(function() {
+				let query = uni.createSelectorQuery().select(".top-content");
+				query.boundingClientRect(function(data) { //data - 各种参数
+					console.log(data.height) // 获取元素宽度
+					that.top = data.height + "px";
+				}).exec()
+			}, 500);
+		},
+		methods: {
+			doSearch() {
+				this.mescroll.resetUpScroll()
+			},
+			getArticleCate() {
+				var that = this;
+				let data = {};
+				getArticleCate(data).then(
+					res => {
+						if (res.code == 200) {
+							this.cates = res.data.map(person => ({
+								name: person.cateName
+							}));
+
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword: this.searchValue,
+					cateId: this.choseCateId,
+					page: page.num,
+					pageSize: page.size
+				};
+				getArticleList(data).then(res => {
+					if (res.code == 200) {
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			// 关键词选择
+			choseCate(item) {
+				this.choseCateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './detail?articleId=' + item.articleId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #EFF3F7;
+	}
+
+	.status_bar {
+		width: 100%;
+
+	}
+
+	.top-content {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+
+	.top-title {
+		height: 88upx;
+		line-height: 88upx;
+		font-size: 42upx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41upx;
+	}
+
+	.search-cont {
+		padding: 16upx 30upx;
+         background: #fff;
+		.inner {
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F8FA;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+
+			.icon-search {
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+
+			input {
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+
+	.keyword-list {
+		box-sizing: border-box;
+		padding:0 24rpx;
+		height: 88rpx;
+        background: #FFFFFF;
+		flex-shrink: 0;
+		.inner {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+		}
+
+		.item {
+			flex:1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-shrink: 0;
+			height: 88upx;
+			line-height: 88upx;
+			font-size: 28upx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #999999;
+            position: relative;
+			&.active {
+				font-weight: 500;
+				font-size: 32rpx;
+				color: #333333;
+				&::after {
+					content: "";
+					width: 56upx;
+					height: 6upx;
+					background: #388BFF;
+					position: absolute;
+					bottom: 0;
+					border-radius: 3rpx 3rpx 3rpx 3rpx;
+				}
+			}
+		}
+	}
+
+	.know-list {
+		margin-top: 24upx;
+		padding: 0 24upx;
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		flex-shrink: 0;
+		flex-wrap: wrap; 
+		width: 100%;
+		box-sizing: border-box;
+		.item {
+			box-sizing: border-box;
+			width: calc(50% - 10rpx); 
+			height: 340rpx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			display: flex;
+			align-items: center;
+			justify-content: flex-start;
+			flex-direction: column;
+			margin-bottom: 18rpx;
+			margin-right: 18rpx;
+			&:nth-child(2){
+				margin-right:0;
+			}
+            .image-box {
+            	width: 100%;
+            	height: 192rpx;
+            	position: relative;
+            	border-radius: 16rpx 16rpx 0rpx 0rpx;
+            
+            	.bg {
+            		border-radius: 16rpx 16rpx 0rpx 0rpx;
+            		width: 100%;
+            		height: 100%;
+            	}
+            
+            	.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;
+            		}
+            	}
+            }
+			.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;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 322 - 0
pages_live/lessonDetail.vue

@@ -0,0 +1,322 @@
+<template>
+	<view class="content">
+		<view class="detail-cont">
+			<view class="title">全球肾脏新药研究生态驱动创新突破降蛋白瓶颈</view>
+			<view class="info">
+				<view class="time">
+					<u-icon name="clock" color="#fff" size="14"></u-icon>2025-12-30</view>
+				<view class="reads ">
+					<u-icon name="eye" color="#fff" size="14"></u-icon>10</view>
+			</view>
+			<view class="video">
+				<video class="myVideo" id="myVideo" src="http://bjzmkytcpv.ylrzcloud.com/course/20251117/1763364883777.m3u8"
+				@error="videoErrorCallback"   controls ></video>
+			</view>
+			<!-- 正文 -->
+			<!-- <view class="full-text"  >
+				<view v-html="item.content"></view>
+			</view> -->
+	        <view class="tips">
+				<image class="w48 h48" src="@/static/image/icon_warning.png" mode=""></image>
+				<view class="text-box">本内容仅代表嘉宾观点,不代表本站立场。仅供医学药学专业人士查看,不构成实际治疗建议。</view>
+			</view>
+			<view class="actor x-f">
+				<image class="w88 h88" src="@/static/image/my_heads_icon64.png" mode=""></image>
+				<view class="infor y-start">
+					<view class="name">王小明 主任医师</view>
+					<view class="position">江南大学附属医院·肾内科</view>
+				</view>
+			</view>
+			<view class="full-text">
+				<view>
+					全球肾脏新药研究生态驱动创新突破降蛋白瓶颈,这里展示摘要。
+				</view>
+			</view>
+			<view class="tag">#转载#肾病</view>
+		</view>
+	</view> 
+</template>
+
+<script>
+	// import {getAdvList} from '@/api/adv.js'
+	import {getDoctorArticleById} from '@/api/doctorArticle.js'
+	export default {
+		data() {
+			return {
+				advs:[],
+				advImgs:[],
+				src: '',
+				articleId:null,
+				item:{},
+			};
+		},
+		onLoad(option) {
+			this.articleId=option.articleId;
+			 
+		},
+		onShow() {
+			//this.getAdvList()
+			//this.getDoctorArticleById();
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.item.title,
+				path: '/pages_index/index/doctorArticleDetails?articleId='+this.articleId,
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.item.title,
+				query:'articleId='+this.articleId,//页面参数
+			}
+			
+		},
+		methods:{
+			handleAdvClick(index){
+				var ad=this.advs[index];
+				console.log(ad.advUrl);
+				if(ad.showType==1){
+					uni.setStorageSync('url',ad.advUrl);
+					uni.navigateTo({
+						url:"h5"
+					})
+				}
+				else if(ad.showType==2){
+					uni.navigateTo({
+						url:ad.advUrl
+					})
+				}
+				else if(ad.showType==3){
+					 uni.setStorageSync('content',ad.content);
+					 uni.navigateTo({
+					 	url:"content"
+					 })
+				}
+				
+			},
+			getAdvList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					advType:10
+				};
+				getAdvList(data).then(res => {
+					if(res.code==200){
+						that.advImgs=[];
+						that.advs=[];
+						res.data.forEach(function(element) {
+							if(element.imageUrl!=null&&element.imageUrl!=""){
+								that.advs.push(element);
+								that.advImgs.push(element.imageUrl);
+							}
+						});
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			 
+			videoErrorCallback: function(e) {
+				uni.showModal({
+					content: e.target.errMsg,
+					showCancel: false
+				})
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			getDoctorArticleById(){
+				let data = {articleId:this.articleId};
+				getDoctorArticleById(data).then(
+					res => {
+						if(res.code==200){
+							this.item=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.content{
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		background: #000;
+	}
+	.detail-cont{
+		width:100%;
+		flex: 1;
+		overflow-y: auto;
+		// background: #fff;
+		.title{
+			padding:0 30upx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 40rpx;
+			color: #FFFFFF;
+			line-height: 60rpx;
+		}
+		.info{
+			padding:0 30upx;
+			display: flex;
+			align-items: center;
+			margin-top: 16rpx;
+			margin-bottom: 32rpx;
+			.time{
+					
+				display: flex;
+				align-items: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #FFFFFF;
+				line-height: 44rpx;
+				.u-icon{
+					margin-right: 10rpx;
+				}
+			}
+			.reads{
+				margin-left: 32rpx;
+				display: flex;
+				align-items: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #FFFFFF;
+				line-height: 44rpx;
+				.u-icon{
+					margin-right: 10rpx;
+				}
+			}
+		
+			}
+		.full-text{
+			padding:0 30upx;
+			width: calc(100% - 60rpx);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF;
+			line-height: 44rpx;
+		}
+	.tips{
+		width: calc(100% - 60rpx);
+		margin-bottom:184rpx;
+		display: flex;
+		align-items: center;
+		padding: 16rpx 24rpx;
+		margin-top: 40rpx;
+		background: rgba(255, 255, 255, 0.1);
+		border-radius: 18rpx 18rpx 18rpx 18rpx;
+		.text-box{
+			flex:1;
+			margin-left: 16rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			line-height: 40rpx;
+			
+		}
+		
+	}
+	.actor{
+		padding:0 30upx;
+		margin-bottom: 32rpx;
+		.infor{
+			margin-left: 24rpx;
+			height: 88rpx;
+			justify-content: space-around;
+			.name{
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 600;
+				font-size: 28rpx;
+				color: #FFFFFF;
+				line-height: 36rpx;
+			}
+			.position{
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #FFFFFF;
+				line-height: 32rpx;
+			}
+		}
+	}
+	.tag{
+		padding:0 30upx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #FFFFFF;
+		line-height: 44rpx;
+	}
+		.video{
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			video{
+				width: 100%;
+			}
+		}
+	}
+	.ad{
+		margin-bottom: 50rpx;
+		width: 100%;
+		 padding: 15rpx;
+		 background: #FFFFFF;
+		 border-radius: 18rpx 18rpx 18rpx 18rpx;
+	}
+	.inquiry{
+		position: fixed;
+		right: 22upx;
+		bottom: 193upx;
+		z-index: 99;
+		.content{
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			image{
+				box-sizing: border-box;
+				width: 100upx;
+				height: 100upx;
+				border-radius: 50%;
+				z-index: 9;
+				border: 2rpx solid #0bb3f2;
+			}
+			.text{
+				margin-top: 15upx;
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #0bb3f2;
+			}
+			 
+		}
+		
+	}
+	 
+</style>

+ 470 - 0
pages_live/search.vue

@@ -0,0 +1,470 @@
+<template>
+	<view>
+		<view class="top-content">
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="../../static/images/search.png" mode=""></image>
+					<input type="text" v-model="searchValue" placeholder="请输入关键字或作者" confirm-type="search"
+						@confirm="doSearch"
+						placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<view class="keyword-list">
+				<!-- 关键字列表 -->
+				<!-- <scroll-view   scroll-x="true" > -->
+				<view class="inner">
+					<view v-for="(item,index) in cates" :key="index" :class="choseCateId == item.cateId?'item active':'item'" @click="choseCate(item)">
+						{{ item.cateName }}
+					</view>
+				</view>
+			<!-- </scroll-view> -->
+				<!-- <u-tabs :list="cates" :activeStyle="{fontWeight: '500',color: '#333333',fontSize: '32rpx',lineHeight:'88rpx'}"
+					:inactiveStyle="{color: '#999999',fontSize: '28rpx',lineHeight:'88rpx'}" @click="choseCate(item)"
+					scrollable="false" lineColor="#388BFF"></u-tabs> -->
+			</view>
+		</view>
+
+		<mescroll-body :top="top" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
+			:down="downOption" :up="upOption">
+			<view class="know-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></image>
+						<view v-if="choseCateId==0" class="views" >
+							<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
+							<view class="status">进行中</view>
+						</view>
+						<view v-else 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 ">
+							<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="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></image>
+						<view v-if="choseCateId==0" class="views" >
+							<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
+							<view class="status">进行中</view>
+						</view>
+						<view v-else 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">
+							<image mode="aspectFill" src="@/static/image/icon_doctor.png"></image>
+							<view class="position-title">
+								<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>
+								<view class="one-t">
+									北京人民医院
+								</view>
+							</view>
+						</view>
+						<view class="position-title one-t">
+							<image mode="aspectFill" src="@/static/image/icon_hospital.png"></image>北京人民医院
+						</view>
+					</view>
+				</view>
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="image-box">
+						<image class="bg" mode="aspectFill" :src="item.imageUrl"></image>
+						<view v-if="choseCateId==0" class="views" >
+							<image mode="aspectFill" src="@/static/image/icon_goon.png"></image>
+							<view class="status">进行中</view>
+						</view>
+						<view v-else 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">
+							<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>
+		</mescroll-body>
+
+	</view>
+</template>
+
+<script>
+	import {
+		getArticleCate,
+		getArticleList
+	} from '@/api/article'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				top: '0px',
+				cates: [
+					{cateName: '在线讲座',cateId:0},
+					{cateName:'空中课堂',cateId:1},
+				],
+				choseCateId: 0,
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				searchValue: '',
+				mescroll: null,
+				// 上拉加载的配置
+				downOption: {
+
+				},
+				upOption: {
+					onScroll: true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon: '/static/images/no_data.png',
+						tip: '暂无数据'
+					},
+					textNoMore: '已经到底了'
+				},
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onShow() {
+			//this.getArticleCate();
+			var that = this;
+			setTimeout(function() {
+				let query = uni.createSelectorQuery().select(".top-content");
+				query.boundingClientRect(function(data) { //data - 各种参数
+					console.log(data.height) // 获取元素宽度
+					that.top = data.height + "px";
+				}).exec()
+			}, 500);
+		},
+		methods: {
+			doSearch() {
+				this.mescroll.resetUpScroll()
+			},
+			getArticleCate() {
+				var that = this;
+				let data = {};
+				getArticleCate(data).then(
+					res => {
+						if (res.code == 200) {
+							this.cates = res.data.map(person => ({
+								name: person.cateName
+							}));
+
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword: this.searchValue,
+					cateId: this.choseCateId,
+					page: page.num,
+					pageSize: page.size
+				};
+				getArticleList(data).then(res => {
+					if (res.code == 200) {
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			// 关键词选择
+			choseCate(item) {
+				this.choseCateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './detail?articleId=' + item.articleId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #EFF3F7;
+	}
+
+	.status_bar {
+		width: 100%;
+
+	}
+
+	.top-content {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+
+	.top-title {
+		height: 88upx;
+		line-height: 88upx;
+		font-size: 42upx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41upx;
+	}
+
+	.search-cont {
+		padding: 16upx 30upx;
+         background: #fff;
+		.inner {
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F8FA;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+
+			.icon-search {
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+
+			input {
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+
+	.keyword-list {
+		box-sizing: border-box;
+		// padding: 10upx 27upx;
+		height: 88rpx;
+        background: #FFFFFF;
+		flex-shrink: 0;
+		.inner {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+		}
+
+		.item {
+			flex:1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-shrink: 0;
+			height: 88upx;
+			line-height: 88upx;
+			font-size: 28upx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #999999;
+            position: relative;
+			&.active {
+				font-weight: 500;
+				color: #333333;
+				&::after {
+					content: "";
+					width: 56upx;
+					height: 6upx;
+					background: #388BFF;
+					position: absolute;
+					bottom: 0;
+					border-radius: 3rpx 3rpx 3rpx 3rpx;
+				}
+			}
+		}
+	}
+
+	.know-list {
+		margin-top: 24upx;
+		padding: 0 24upx;
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		flex-shrink: 0;
+		flex-wrap: wrap; 
+		width: 100%;
+		box-sizing: border-box;
+		.item {
+			box-sizing: border-box;
+			width: calc(50% - 10rpx); 
+			height: 340rpx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			display: flex;
+			align-items: center;
+			justify-content: flex-start;
+			flex-direction: column;
+			margin-bottom: 18rpx;
+			margin-right: 18rpx;
+			&:nth-child(2){
+				margin-right:0;
+			}
+            .image-box {
+            	width: 100%;
+            	height: 192rpx;
+            	position: relative;
+            	border-radius: 16rpx 16rpx 0rpx 0rpx;
+            
+            	.bg {
+            		border-radius: 16rpx 16rpx 0rpx 0rpx;
+            		width: 100%;
+            		height: 100%;
+            	}
+            
+            	.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;
+            		}
+            	}
+            }
+			.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;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 291 - 0
pages_task/activityDetail.vue

@@ -0,0 +1,291 @@
+<template>
+	<view class="container">
+		<!-- 状态栏占位 -->
+		<view class="status-bar" :style="{height: statusBarHeight}"></view>
+		
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<image src="@/static/image/back.png" mode="aspectFill"></image>
+			</view>
+			<view class="title">活动详情</view>
+			<view class="header-right">
+				<text class="more-icon">⋯</text>
+				<text class="more-icon">○</text>
+			</view>
+		</view>
+		
+		<scroll-view class="content" scroll-y>
+			<!-- 活动头部 -->
+			<view class="activity-header">
+				<view class="logo-section">
+					<view class="logo-icon">预定</view>
+					<view class="logo-text">YOUR LOGO</view>
+					<view class="logo-url">www.gaoding.com</view>
+				</view>
+				
+				<view class="activity-title">
+					<view class="title-main">{{ activityData.title }}</view>
+					<view class="title-en">{{ activityData.titleEn }}</view>
+					<view class="title-date">{{ activityData.date }}</view>
+				</view>
+			</view>
+			
+			<!-- 活动主图 -->
+			<view class="activity-banner">
+				<image class="banner-image" :src="activityData.bannerImage" mode="aspectFill"></image>
+				<view class="banner-text">{{ activityData.bannerText }}</view>
+			</view>
+		</scroll-view>
+		
+		<!-- 底部按钮 -->
+		<view class="bottom-btn" :class="activityData.buttonClass" @click="handleAction">
+			{{ activityData.buttonText }}
+		</view>
+	</view>
+</template>
+
+<script>
+import { getActivityDetail } from '@/api-js/medicationSurvey'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			activityId: '',
+			activityData: {
+				title: '世界关节炎日',
+				titleEn: 'WORLD ARTHRISTIS DAY',
+				date: '2024年10月12日',
+				bannerImage: '',
+				bannerText: '早预防・早诊断・早治疗',
+				status: 'notStarted', // notStarted, inProgress, ended
+				buttonText: '活动未开始',
+				buttonClass: 'not-started',
+				completedCount: 0,
+				totalCount: 3
+			}
+		}
+	},
+	onLoad(options) {
+		if (options.id) {
+			this.activityId = options.id
+			this.loadData()
+		}
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		handleAction() {
+			if (this.activityData.status === 'notStarted') {
+				uni.showToast({
+					icon: 'none',
+					title: '活动未开始'
+				})
+			} else if (this.activityData.status === 'ended') {
+				uni.showToast({
+					icon: 'none',
+					title: '活动已结束'
+				})
+			} else {
+				// 跳转到病例征集页面
+				uni.navigateTo({
+					url: `/pages_task/caseCollection?activityId=${this.activityId}`
+				})
+			}
+		},
+		async loadData() {
+			try {
+				uni.showLoading({ title: '加载中...' })
+				const res = await getActivityDetail({ id: this.activityId })
+				uni.hideLoading()
+				if (res.code === 200 && res.data) {
+					this.activityData = { ...this.activityData, ...res.data }
+					this.updateButtonText()
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+			}
+		},
+		updateButtonText() {
+			if (this.activityData.status === 'notStarted') {
+				this.activityData.buttonText = '活动未开始'
+				this.activityData.buttonClass = 'not-started'
+			} else if (this.activityData.status === 'ended') {
+				this.activityData.buttonText = '活动已结束'
+				this.activityData.buttonClass = 'ended'
+			} else {
+				this.activityData.buttonText = `上传病例 ${this.activityData.completedCount}/${this.activityData.totalCount}`
+				this.activityData.buttonClass = 'upload-case'
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.container {
+	min-height: 100vh;
+	background: linear-gradient(180deg, #E6F3FF 0%, #FFFFFF 100%);
+	display: flex;
+	flex-direction: column;
+}
+
+.status-bar {
+	width: 100%;
+	background: transparent;
+}
+
+.header {
+	position: relative;
+	height: 88rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background: transparent;
+	
+	.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;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 24rpx;
+}
+
+.activity-header {
+	margin-bottom: 32rpx;
+	
+	.logo-section {
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		margin-bottom: 24rpx;
+		
+		.logo-icon {
+			width: 48rpx;
+			height: 48rpx;
+			background: #388BFF;
+			border-radius: 50%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 20rpx;
+			color: #fff;
+		}
+		
+		.logo-text {
+			font-size: 28rpx;
+			font-weight: bold;
+			color: #388BFF;
+		}
+		
+		.logo-url {
+			font-size: 24rpx;
+			color: #388BFF;
+		}
+	}
+	
+	.activity-title {
+		.title-main {
+			font-size: 48rpx;
+			font-weight: bold;
+			color: #388BFF;
+			margin-bottom: 8rpx;
+		}
+		
+		.title-en {
+			font-size: 36rpx;
+			font-weight: bold;
+			color: #388BFF;
+			margin-bottom: 8rpx;
+		}
+		
+		.title-date {
+			font-size: 28rpx;
+			color: #388BFF;
+		}
+	}
+}
+
+.activity-banner {
+	position: relative;
+	width: 100%;
+	height: 600rpx;
+	border-radius: 16rpx;
+	overflow: hidden;
+	background: linear-gradient(135deg, #E6F3FF 0%, #FFFFFF 100%);
+	
+	.banner-image {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.banner-text {
+		position: absolute;
+		bottom: 40rpx;
+		left: 50%;
+		transform: translateX(-50%);
+		font-size: 28rpx;
+		color: #fff;
+		white-space: nowrap;
+	}
+}
+
+.bottom-btn {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	height: 88rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	color: #fff;
+	font-weight: 500;
+	z-index: 100;
+	
+	&.not-started {
+		background: #87CEEB;
+	}
+	
+	&.upload-case {
+		background: #388BFF;
+	}
+	
+	&.ended {
+		background: #999;
+	}
+}
+</style>
+

+ 686 - 0
pages_task/airClassroom.vue

@@ -0,0 +1,686 @@
+<template>
+	<view class="container">
+		
+		<!-- 筛选标签栏 -->
+		<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" @click="showFilter = true">
+				<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">{{ item.title }}</view>
+					<view class="status-tag" :class="item.status">
+						{{ item.statusText }}
+					</view>
+				</view>
+				<view class="card-tags">
+					<view class="tag-item video-tag" v-if="item.videoType">
+						<image class="w28 h28 mr10" src="@/static/image/icon_longvideo.png" mode=""></image>
+						<text>{{ item.videoType }}</text>
+					</view>
+					<view class="tag-item" v-if="item.category">
+						{{ item.category }}
+					</view>
+					<view class="tag-item points-tag">
+						{{ item.points }}积分
+					</view>
+					<view class="tag-item">
+						{{ item.count }}个
+					</view>
+				</view>
+				
+				<view class="card-dates">
+					<view class="date-item">
+						<text>开始时间: {{ item.startTime }}</text>
+					</view>
+					<view class="date-item">
+						<text>结束时间: {{ item.endTime }}</text>
+					</view>
+				</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">
+					<text class="rejection-icon">❌</text>
+					<text>驳回原因: {{ item.rejectionReason }}</text>
+				</view>
+				
+				<view class="card-footer">
+					<view class="footer-date">{{ item.createTime }}</view>
+					<view class="footer-actions">
+						<view class="action-btn" v-if="item.status === 'pending'" @click="goComplete(item)">
+							去完成
+						</view>
+						<view class="action-btn" v-if="item.status === 'rejected'" @click="goEdit(item)">
+							编辑
+						</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>
+					<view class="filter-close-btn" @click="closeFilter">×</view>
+				</view>
+				
+				<!-- 申请时间筛选 -->
+				<view class="filter-group">
+					<view class="group-label">申请时间</view>
+					<view class="date-range-inputs">
+						<picker mode="date" :value="tempDateRange.startDate" @change="onStartDateChange">
+							<view class="date-input" :class="{ placeholder: !tempDateRange.startDate }">
+								{{ tempDateRange.startDate || '开始时间' }}
+							</view>
+						</picker>
+						<text class="date-separator">-</text>
+						<picker mode="date" :value="tempDateRange.endDate" @change="onEndDateChange">
+							<view class="date-input" :class="{ placeholder: !tempDateRange.endDate }">
+								{{ tempDateRange.endDate || '结束时间' }}
+							</view>
+						</picker>
+					</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>
+import { getAirClassroomList } from '@/api-js/airClassroom'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			currentTab: 'all',
+			showFilter: false,
+			dateRange: {
+				startDate: '',
+				endDate: ''
+			},
+			tempDateRange: {
+				startDate: '',
+				endDate: ''
+			},
+			tabs: [
+				{ label: '全部', value: 'all' },
+				{ label: '未完成', value: 'pending' },
+				{ 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()
+		},
+		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.tempDateRange = {
+				startDate: '',
+				endDate: ''
+			}
+		},
+		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: '王小明医生空中任务',
+					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: 'pending',
+					statusText: '待完成'
+				},
+				{
+					id: 2,
+					title: '王小明医生空中任务',
+					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: 'pending',
+					statusText: '待完成',
+					warning: '有效观看不足5人'
+				},
+				{
+					id: 3,
+					title: '王小明医生空中任务',
+					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: 'reviewing',
+					statusText: '待审核'
+				},
+				{
+					id: 4,
+					title: '王小明医生空中任务',
+					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: '王小明医生空中任务',
+					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="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 {
+			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 24rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	.filter-tabs {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		gap: 32rpx;
+		overflow-x: auto;
+		
+		.tab-item {
+			padding: 24rpx 0;
+			font-size: 28rpx;
+			color: #666;
+			white-space: nowrap;
+			position: relative;
+			
+			&.active {
+				color: #388BFF;
+				font-weight: bold;
+				
+				&::after {
+					content: '';
+					position: absolute;
+					bottom: 0;
+					left: 0;
+					right: 0;
+					height: 4rpx;
+					background: #388BFF;
+				}
+			}
+		}
+	}
+	
+	.filter-divider {
+		width: 1rpx;
+		height: 40rpx;
+		background: #e0e0e0;
+		margin: 0 16rpx;
+	}
+	
+	.filter-btn {
+		padding: 24rpx 0;
+		
+		.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: bold;
+			color: #333;
+		}
+		
+		.status-tag {
+			padding: 8rpx 16rpx;
+			border-radius: 20rpx;
+			font-size: 24rpx;
+			
+			&.pending {
+				background: #E3F2FD;
+				color: #2196F3;
+			}
+			
+			&.reviewing {
+				background: #FFF3E0;
+				color: #FF9800;
+			}
+			
+			&.approved {
+				background: #E8F5E9;
+				color: #4CAF50;
+			}
+			
+			&.rejected {
+				background: #FFEBEE;
+				color: #F44336;
+			}
+		}
+	}
+	
+	.card-tags {
+		display: flex;
+		align-items: center;
+		flex-wrap: wrap;
+		gap: 12rpx;
+		margin-bottom: 16rpx;
+		
+		.tag-item {
+			padding: 8rpx 16rpx;
+			background:#FFFAF4;
+			border-radius: 8rpx;
+			font-size: 24rpx;
+			color: #5D410F;
+			display: flex;
+			align-items: center;
+			&.video-tag {
+				background: linear-gradient( 90deg, #FFE9C7 0%, #F3D091 100%);
+				
+				.tag-icon {
+					margin-right: 4rpx;
+				}
+			}
+			
+			&.points-tag {
+				border: 1rpx solid #388BFF;
+				color: #388BFF;
+				background: transparent;
+			}
+		}
+	}
+	
+	.card-dates {
+		margin-bottom: 16rpx;
+		
+		.date-item {
+			font-size: 26rpx;
+			color: #999;
+			margin-bottom: 8rpx;
+		}
+	}
+	
+	.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: 12rpx;
+		background: #FFEBEE;
+		border-radius: 8rpx;
+		margin-bottom: 16rpx;
+		font-size: 26rpx;
+		color: #F44336;
+		
+		.rejection-icon {
+			font-size: 28rpx;
+		}
+	}
+	
+	.card-footer {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding-top: 16rpx;
+		border-top: 1rpx solid #f0f0f0;
+		
+		.footer-date {
+			font-size: 24rpx;
+			color: #999;
+		}
+		
+		.footer-actions {
+			.action-btn {
+				padding: 12rpx 32rpx;
+				background: #388BFF;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				color: #fff;
+			}
+		}
+	}
+}
+
+.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;
+	
+	.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: 32rpx;
+		
+		.group-label {
+			font-size: 28rpx;
+			font-weight: bold;
+			color: #333;
+			margin-bottom: 20rpx;
+		}
+		
+		.date-range-inputs {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+			
+			.date-input {
+				flex: 1;
+				height: 80rpx;
+				line-height: 80rpx;
+				padding: 0 24rpx;
+				background: #f5f5f5;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				color: #333;
+				text-align: center;
+				
+				&.placeholder {
+					color: #999;
+				}
+			}
+			
+			.date-separator {
+				font-size: 28rpx;
+				color: #666;
+			}
+		}
+	}
+	
+	.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;
+		}
+	}
+}
+</style>
+

+ 511 - 0
pages_task/caseCollection.vue

@@ -0,0 +1,511 @@
+<template>
+	<view class="container">
+		<!-- 状态栏占位 -->
+		<view class="status-bar" :style="{height: statusBarHeight}"></view>
+		
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<image src="@/static/image/back.png" mode="aspectFill"></image>
+			</view>
+			<view class="title">病例征集</view>
+			<view class="header-right">
+				<text class="more-icon">⋯</text>
+				<text class="more-icon">○</text>
+			</view>
+		</view>
+		
+		<scroll-view class="content" scroll-y>
+			<!-- 表单标题 -->
+			<view class="form-header">
+				<view class="form-title">{{ formData.title }}</view>
+				<view class="form-tips">
+					<view class="tip-item">请您根据患者真实情况选择并填写</view>
+					<view class="tip-item">我们承诺对您及患者所提供的所有信息严格保密</view>
+				</view>
+			</view>
+			
+			<!-- 表单内容 -->
+			<view class="form-section">
+				<!-- 患者姓名 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>1、患者姓名</text>
+					</view>
+					<input 
+						class="form-input" 
+						v-model="formData.patientName" 
+						placeholder="请输入患者姓名"
+					/>
+				</view>
+				
+				<!-- 患者性别 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>2、患者性别</text>
+					</view>
+					<view class="radio-group">
+						<view 
+							class="radio-item" 
+							:class="{ active: formData.patientGender === 'male' }"
+							@click="formData.patientGender = 'male'">
+							<view class="radio-icon">
+								<text v-if="formData.patientGender === 'male'">✓</text>
+							</view>
+							<text>男</text>
+						</view>
+						<view 
+							class="radio-item" 
+							:class="{ active: formData.patientGender === 'female' }"
+							@click="formData.patientGender = 'female'">
+							<view class="radio-icon">
+								<text v-if="formData.patientGender === 'female'">✓</text>
+							</view>
+							<text>女</text>
+						</view>
+					</view>
+				</view>
+				
+				<!-- 患者年龄 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>3、患者年龄</text>
+					</view>
+					<input 
+						class="form-input" 
+						v-model="formData.patientAge" 
+						type="number"
+						placeholder="请输入患者年龄 (岁)"
+					/>
+				</view>
+				
+				<!-- 处方日期 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>4、处方日期</text>
+					</view>
+					<picker mode="date" :value="formData.prescriptionDate" @change="onDateChange">
+						<view class="form-input picker-input" :class="{ placeholder: !formData.prescriptionDate }">
+							{{ formData.prescriptionDate || '请选择处方日期' }}
+							<text class="calendar-icon">📅</text>
+						</view>
+					</picker>
+				</view>
+				
+				<!-- 心脏病类型 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>5、您被诊断的心脏病类型 (多选)</text>
+					</view>
+					<view class="checkbox-group">
+						<view 
+							class="checkbox-item" 
+							:class="{ active: formData.diseaseTypes.includes('coronary') }"
+							@click="toggleDiseaseType('coronary')">
+							<view class="checkbox-icon">
+								<text v-if="formData.diseaseTypes.includes('coronary')">✓</text>
+							</view>
+							<text>冠心病</text>
+						</view>
+						<view 
+							class="checkbox-item" 
+							:class="{ active: formData.diseaseTypes.includes('heartFailure') }"
+							@click="toggleDiseaseType('heartFailure')">
+							<view class="checkbox-icon">
+								<text v-if="formData.diseaseTypes.includes('heartFailure')">✓</text>
+							</view>
+							<text>心力衰竭</text>
+						</view>
+						<view 
+							class="checkbox-item" 
+							:class="{ active: formData.diseaseTypes.includes('arrhythmia') }"
+							@click="toggleDiseaseType('arrhythmia')">
+							<view class="checkbox-icon">
+								<text v-if="formData.diseaseTypes.includes('arrhythmia')">✓</text>
+							</view>
+							<text>心律失常</text>
+						</view>
+					</view>
+				</view>
+				
+				<!-- 图片上传 -->
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>6、图片上传</text>
+					</view>
+					<view class="upload-section">
+						<view class="upload-item" v-for="(image, index) in formData.images" :key="index">
+							<image class="uploaded-image" :src="image" mode="aspectFill"></image>
+							<view class="delete-btn" @click="removeImage(index)">×</view>
+						</view>
+						<view class="upload-item upload-placeholder" @click="chooseImage" v-if="formData.images.length < 2">
+							<text class="camera-icon">📷</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		
+		<!-- 提交按钮 -->
+		<view class="submit-btn" @click="handleSubmit">提交</view>
+	</view>
+</template>
+
+<script>
+import { submitCaseCollection } from '@/api-js/medicationSurvey'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			activityId: '',
+			formData: {
+				title: '心脏相关疾病病例征集表',
+				patientName: '',
+				patientGender: 'male',
+				patientAge: '',
+				prescriptionDate: '',
+				diseaseTypes: ['coronary', 'heartFailure'],
+				images: []
+			}
+		}
+	},
+	onLoad(options) {
+		if (options.activityId) {
+			this.activityId = options.activityId
+		}
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		onDateChange(e) {
+			this.formData.prescriptionDate = e.detail.value
+		},
+		toggleDiseaseType(type) {
+			const index = this.formData.diseaseTypes.indexOf(type)
+			if (index > -1) {
+				this.formData.diseaseTypes.splice(index, 1)
+			} else {
+				this.formData.diseaseTypes.push(type)
+			}
+		},
+		chooseImage() {
+			uni.chooseImage({
+				count: 2 - this.formData.images.length,
+				sizeType: ['compressed'],
+				sourceType: ['album', 'camera'],
+				success: (res) => {
+					this.formData.images = [...this.formData.images, ...res.tempFilePaths]
+				}
+			})
+		},
+		removeImage(index) {
+			this.formData.images.splice(index, 1)
+		},
+		async handleSubmit() {
+			// 表单验证
+			if (!this.formData.patientName) {
+				uni.showToast({
+					icon: 'none',
+					title: '请输入患者姓名'
+				})
+				return
+			}
+			if (!this.formData.patientAge) {
+				uni.showToast({
+					icon: 'none',
+					title: '请输入患者年龄'
+				})
+				return
+			}
+			if (!this.formData.prescriptionDate) {
+				uni.showToast({
+					icon: 'none',
+					title: '请选择处方日期'
+				})
+				return
+			}
+			if (this.formData.diseaseTypes.length === 0) {
+				uni.showToast({
+					icon: 'none',
+					title: '请至少选择一种心脏病类型'
+				})
+				return
+			}
+			if (this.formData.images.length === 0) {
+				uni.showToast({
+					icon: 'none',
+					title: '请至少上传一张图片'
+				})
+				return
+			}
+			
+			try {
+				uni.showLoading({ title: '提交中...' })
+				const res = await submitCaseCollection({
+					activityId: this.activityId,
+					...this.formData
+				})
+				uni.hideLoading()
+				if (res.code === 200) {
+					uni.showToast({
+						icon: 'success',
+						title: '提交成功'
+					})
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: res.msg || '提交失败'
+					})
+				}
+			} catch (e) {
+				uni.hideLoading()
+				uni.showToast({
+					icon: 'none',
+					title: '提交失败'
+				})
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.container {
+	min-height: 100vh;
+	background: linear-gradient(180deg, #E6F3FF 0%, #FFFFFF 100%);
+	display: flex;
+	flex-direction: column;
+}
+
+.status-bar {
+	width: 100%;
+	background: transparent;
+}
+
+.header {
+	position: relative;
+	height: 88rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background: transparent;
+	
+	.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;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 24rpx;
+}
+
+.form-header {
+	margin-bottom: 32rpx;
+	
+	.form-title {
+		font-size: 36rpx;
+		font-weight: bold;
+		color: #333;
+		margin-bottom: 16rpx;
+	}
+	
+	.form-tips {
+		.tip-item {
+			font-size: 24rpx;
+			color: #666;
+			margin-bottom: 8rpx;
+		}
+	}
+}
+
+.form-section {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 24rpx;
+}
+
+.form-item {
+	margin-bottom: 32rpx;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+	
+	.form-label {
+		display: flex;
+		align-items: center;
+		font-size: 28rpx;
+		color: #333;
+		margin-bottom: 16rpx;
+		
+		.required {
+			color: #FF5030;
+			margin-right: 4rpx;
+		}
+	}
+	
+	.form-input {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 24rpx;
+		background: #f5f5f5;
+		border-radius: 8rpx;
+		font-size: 28rpx;
+		color: #333;
+		
+		&.placeholder {
+			color: #999;
+		}
+		
+		&.picker-input {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			
+			.calendar-icon {
+				font-size: 32rpx;
+			}
+		}
+	}
+	
+	.radio-group,
+	.checkbox-group {
+		display: flex;
+		gap: 24rpx;
+		
+		.radio-item,
+		.checkbox-item {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			font-size: 28rpx;
+			color: #333;
+			
+			.radio-icon,
+			.checkbox-icon {
+				width: 40rpx;
+				height: 40rpx;
+				border: 2rpx solid #ddd;
+				border-radius: 50%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 24rpx;
+				color: #388BFF;
+			}
+			
+			.checkbox-icon {
+				border-radius: 4rpx;
+			}
+			
+			&.active {
+				.radio-icon,
+				.checkbox-icon {
+					border-color: #388BFF;
+					background: #E6F7FF;
+				}
+			}
+		}
+	}
+	
+	.upload-section {
+		display: flex;
+		gap: 16rpx;
+		flex-wrap: wrap;
+		
+		.upload-item {
+			width: 200rpx;
+			height: 200rpx;
+			border-radius: 8rpx;
+			overflow: hidden;
+			position: relative;
+			
+			.uploaded-image {
+				width: 100%;
+				height: 100%;
+			}
+			
+			.delete-btn {
+				position: absolute;
+				top: 8rpx;
+				right: 8rpx;
+				width: 40rpx;
+				height: 40rpx;
+				background: rgba(0, 0, 0, 0.5);
+				border-radius: 50%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				color: #fff;
+			}
+			
+			&.upload-placeholder {
+				background: #f5f5f5;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				
+				.camera-icon {
+					font-size: 60rpx;
+				}
+			}
+		}
+	}
+}
+
+.submit-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>
+

+ 643 - 0
pages_task/completeTask.vue

@@ -0,0 +1,643 @@
+<template>
+	<view class="container">
+
+		
+		<scroll-view class="content" scroll-y>
+			<!-- 标题 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text class="required">*</text>
+					<text>标题</text>
+				</view>
+				<view class="form-input-wrapper">
+					<textarea 
+						class="form-input" 
+						v-model="formData.title" 
+						placeholder="请输入标题"
+						maxlength="50"
+						@input="onTitleInput"
+					></textarea>
+					<view class="char-count">{{ titleLength }}/50</view>
+				</view>
+			</view>
+			
+			<!-- 摘要 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text>摘要 (选填)</text>
+				</view>
+				<view class="form-input-wrapper">
+					<textarea 
+						class="form-input" 
+						v-model="formData.summary" 
+						placeholder="请输入摘要"
+						maxlength="100"
+						@input="onSummaryInput"
+					></textarea>
+					<view class="char-count">{{ summaryLength }}/100</view>
+				</view>
+			</view>
+			
+			<!-- 项目分组 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text class="required">*</text>
+					<text>项目分组</text>
+				</view>
+				<view class="form-select" @click="showGroupPicker = true">
+					<text :class="formData.groupId ? '' : 'placeholder'">
+						{{ formData.groupName || '请选择分组' }}
+					</text>
+					<text class="arrow-right">></text>
+				</view>
+			</view>
+			
+			<!-- 项目标签 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text class="required">*</text>
+					<text>项目标签</text>
+				</view>
+				<view class="form-select" @click="showTagPicker = true">
+					<text :class="formData.tagId ? '' : 'placeholder'">
+						{{ formData.tagName || '请选择标签' }}
+					</text>
+					<text class="arrow-right">></text>
+				</view>
+			</view>
+			
+			<!-- 上传封面 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text class="required">*</text>
+					<text>上传封面</text>
+				</view>
+				<view class="form-tips">仅支持jpg/png文件,单个图片不超过2M</view>
+				<view class="upload-cover" @click="chooseCoverImage">
+					<image v-if="formData.coverImage" :src="formData.coverImage" mode="aspectFill"></image>
+					<view v-else class="upload-placeholder">
+						<text class="camera-icon">📷</text>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 上传附件 -->
+			<view class="form-section">
+				<view class="form-label">
+					<text class="required">*</text>
+					<text>上传附件</text>
+				</view>
+				<view class="form-tips">支持MP4等文件,单个文件不超过500M</view>
+				<view class="attachment-list">
+					<view class="attachment-item" v-for="(item, index) in formData.attachments" :key="index">
+						<text class="attachment-icon">📎</text>
+						<view class="attachment-info">
+							<text class="attachment-name">{{ item.name }}</text>
+							<text class="attachment-size">{{ item.size }}</text>
+						</view>
+						<text class="attachment-delete" @click="removeAttachment(index)">×</text>
+					</view>
+					<view class="add-attachment" @click="chooseAttachment">
+						<text class="add-icon">+</text>
+						<text>添加附件</text>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		
+		<!-- 提交按钮 -->
+		<view class="submit-btn" @click="handleSubmit">提交</view>
+		
+		<!-- 分组选择弹窗 -->
+		<view class="picker-popup" v-if="showGroupPicker" @click="showGroupPicker = false">
+			<view class="picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-cancel" @click="showGroupPicker = false">取消</view>
+					<view class="picker-title">选择分组</view>
+					<view class="picker-confirm" @click="confirmGroup">确定</view>
+				</view>
+				<view class="picker-body">
+					<view class="picker-item" 
+						:class="{ active: tempGroupId === item.id }"
+						v-for="(item, index) in groupOptions" 
+						:key="index"
+						@click="tempGroupId = item.id; tempGroupName = item.name">
+						{{ item.name }}
+					</view>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 标签选择弹窗 -->
+		<view class="picker-popup" v-if="showTagPicker" @click="showTagPicker = false">
+			<view class="picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-cancel" @click="showTagPicker = false">取消</view>
+					<view class="picker-title">选择标签</view>
+					<view class="picker-confirm" @click="confirmTag">确定</view>
+				</view>
+				<view class="picker-body">
+					<view class="picker-item" 
+						:class="{ active: tempTagId === item.id }"
+						v-for="(item, index) in tagOptions" 
+						:key="index"
+						@click="tempTagId = item.id; tempTagName = item.name">
+						{{ item.name }}
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { submitTask, getGroupOptions, getTagOptions, uploadFile } from '@/api-js/airClassroom'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			taskId: '',
+			isEdit: false,
+			showGroupPicker: false,
+			showTagPicker: false,
+			tempGroupId: '',
+			tempGroupName: '',
+			tempTagId: '',
+			tempTagName: '',
+			formData: {
+				title: '',
+				summary: '',
+				groupId: '',
+				groupName: '',
+				tagId: '',
+				tagName: '',
+				coverImage: '',
+				attachments: []
+			},
+			groupOptions: [
+				{ id: '1', name: '学术' },
+				{ id: '2', name: '临床' },
+				{ id: '3', name: '科研' }
+			],
+			tagOptions: [
+				{ id: '1', name: '长视频' },
+				{ id: '2', name: '短视频' },
+				{ id: '3', name: '文章' }
+			]
+		}
+	},
+	computed: {
+		titleLength() {
+			return this.formData.title.length
+		},
+		summaryLength() {
+			return this.formData.summary.length
+		}
+	},
+	onLoad(options) {
+		if (options.id) {
+			this.taskId = options.id
+		}
+		if (options.edit === 'true') {
+			this.isEdit = true
+			this.loadTaskData()
+		}
+		this.loadOptions()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		onTitleInput(e) {
+			this.formData.title = e.detail.value
+		},
+		onSummaryInput(e) {
+			this.formData.summary = e.detail.value
+		},
+		confirmGroup() {
+			this.formData.groupId = this.tempGroupId
+			this.formData.groupName = this.tempGroupName
+			this.showGroupPicker = false
+		},
+		confirmTag() {
+			this.formData.tagId = this.tempTagId
+			this.formData.tagName = this.tempTagName
+			this.showTagPicker = false
+		},
+		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: '上传失败' })
+					}
+				}
+			})
+		},
+		chooseAttachment() {
+			uni.chooseFile({
+				count: 1,
+				type: 'file',
+				success: async (res) => {
+					const file = res.tempFiles[0]
+					if (file.size > 500 * 1024 * 1024) {
+						uni.showToast({ icon: 'none', title: '文件大小不能超过500M' })
+						return
+					}
+					try {
+						uni.showLoading({ title: '上传中...' })
+						const uploadRes = await uploadFile({
+							file: file.path,
+							type: 'attachment'
+						})
+						uni.hideLoading()
+						if (uploadRes.code === 200 && uploadRes.data) {
+							this.formData.attachments.push({
+								name: file.name,
+								size: this.formatFileSize(file.size),
+								url: uploadRes.data.url
+							})
+						}
+					} catch (e) {
+						uni.hideLoading()
+						uni.showToast({ icon: 'none', title: '上传失败' })
+					}
+				}
+			})
+		},
+		removeAttachment(index) {
+			this.formData.attachments.splice(index, 1)
+		},
+		formatFileSize(bytes) {
+			if (bytes < 1024) return bytes + 'B'
+			if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + 'KB'
+			return (bytes / (1024 * 1024)).toFixed(2) + 'MB'
+		},
+		async loadOptions() {
+			try {
+				const [groupRes, tagRes] = await Promise.all([
+					getGroupOptions(),
+					getTagOptions()
+				])
+				if (groupRes.code === 200 && groupRes.data) {
+					this.groupOptions = groupRes.data
+				}
+				if (tagRes.code === 200 && tagRes.data) {
+					this.tagOptions = tagRes.data
+				}
+			} catch (e) {
+				console.error('加载选项失败', e)
+			}
+		},
+		async loadTaskData() {
+			// 加载已有任务数据
+		},
+		async handleSubmit() {
+			if (!this.formData.title) {
+				uni.showToast({ icon: 'none', title: '请输入标题' })
+				return
+			}
+			if (!this.formData.groupId) {
+				uni.showToast({ icon: 'none', title: '请选择项目分组' })
+				return
+			}
+			if (!this.formData.tagId) {
+				uni.showToast({ icon: 'none', title: '请选择项目标签' })
+				return
+			}
+			if (!this.formData.coverImage) {
+				uni.showToast({ icon: 'none', title: '请上传封面' })
+				return
+			}
+			if (this.formData.attachments.length === 0) {
+				uni.showToast({ icon: 'none', title: '请上传附件' })
+				return
+			}
+			
+			try {
+				uni.showLoading({ title: '提交中...' })
+				const res = await submitTask({
+					taskId: this.taskId,
+					...this.formData
+				})
+				uni.hideLoading()
+				if (res.code === 200) {
+					uni.navigateTo({
+						url: '/pages_task/taskCompleteSuccess'
+					})
+				} else {
+					uni.showToast({ icon: 'none', title: res.msg || '提交失败' })
+				}
+			} catch (e) {
+				uni.hideLoading()
+				uni.showToast({ icon: 'none', title: '提交失败' })
+			}
+		}
+	}
+}
+</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 {
+			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;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 24rpx;
+	padding-bottom: 120rpx;
+}
+
+.form-section {
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	margin-bottom: 24rpx;
+	
+	.form-label {
+		display: flex;
+		align-items: center;
+		margin-bottom: 16rpx;
+		font-size: 28rpx;
+		color: #333;
+		
+		.required {
+			color: #FF5030;
+			margin-right: 4rpx;
+		}
+	}
+	
+	.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: 200rpx;
+		height: 200rpx;
+		background: #f5f5f5;
+		border-radius: 8rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		
+		image {
+			width: 100%;
+			height: 100%;
+			border-radius: 8rpx;
+		}
+		
+		.upload-placeholder {
+			.camera-icon {
+				font-size: 60rpx;
+			}
+		}
+	}
+	
+	.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;
+			}
+		}
+	}
+}
+
+.submit-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;
+}
+
+.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;
+}
+
+.picker-content {
+	width: 100%;
+	background: #fff;
+	border-radius: 24rpx 24rpx 0 0;
+	
+	.picker-header {
+		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;
+		}
+	}
+	
+	.picker-body {
+		padding: 24rpx;
+		max-height: 600rpx;
+		overflow-y: auto;
+		
+		.picker-item {
+			padding: 24rpx 0;
+			font-size: 30rpx;
+			color: #333;
+			border-bottom: 1rpx solid #f0f0f0;
+			
+			&:last-child {
+				border-bottom: none;
+			}
+			
+			&.active {
+				color: #388BFF;
+				font-weight: bold;
+			}
+		}
+	}
+}
+</style>
+

+ 308 - 0
pages_task/index.vue

@@ -0,0 +1,308 @@
+<template>
+	<view>
+		<view class="top-content">
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="/static/images/search.png" mode=""></image>
+					<input type="text" v-model="keyword" placeholder="输入服务包搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<view class="cate-list">
+				<!-- 关键字列表 -->
+				<scroll-view   scroll-x="true" >
+					<view class="inner">
+						<view v-for="(item,index) in typeOptions" :key="index" :class="questionsType == item.dictValue?'item active':'item'" @click="choseType(item)">
+							{{ item.dictLabel }}
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<mescroll-body  top="192rpx"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="article-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="left">
+						<view class="title ellipsis2">{{ item.title }}</view>
+						<view class="info-box">
+							<view class="readers">
+								<view class="readings">
+									<image class="eye" src="/static/images/eye.png" ></image>
+									<text class="num">{{item.views}}</text>
+								</view>
+							</view>
+							<view class="time">{{item.createTime}}</view>
+						</view>
+					</view>
+					 
+				</view>
+			</view>
+		</mescroll-body>
+		<Server/>
+	</view>
+</template>
+
+<script>
+	import {getDictByKey} from '@/api/common.js'
+	import {getQuestionsList} from '@/api/index.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import Server from '@/components/Server.vue'
+	export default {
+		mixins: [MescrollMixin], 
+		components: {
+			Server
+		},
+		data() {
+			return {
+				typeOptions:[],
+				questionsType:0,
+				keyword: '',
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://user.test.ylrztop.com/images/empty_icon.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			};
+		},
+		onShow() {
+			this.getDictByKey("sys_questions_type");
+		},
+		methods:{
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_questions_type"){
+								this.typeOptions=res.data;
+							}
+						 
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword:this.keyword,
+					questionsType:this.questionsType,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getQuestionsList(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list; 
+							
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+							 
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			// 关键词选择
+			choseType(item) {
+				this.questionsType = item.dictValue;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './questionsDetails?id=' + item.id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-content{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+	.top-title{
+		height: 88upx;
+		line-height: 88upx;
+		font-size: 42upx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41upx;
+		background-color: #FFFFFF;
+	}
+	.search-cont{
+		padding: 16upx 30upx;
+		background-color: #FFFFFF;
+		.inner{
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F7F7;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+			.icon-search{
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+			input{
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+	.cate-list{
+		box-sizing: border-box;
+		background: #fff;
+		padding: 10upx 27upx;
+		height: 100upx;
+		.inner{
+			display: flex;
+		}
+		.item{
+			flex-shrink: 0;
+			padding: 0 24upx;
+			height: 64upx;
+			line-height: 64upx;
+			font-size: 28upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #0bb3f2;
+			background: #ffffff;
+			border: 1px solid #66b2ef   ;
+			border-radius: 32upx;
+			margin: 0 20upx 20upx 0;
+			&.active{
+				color: #FFFFFF;
+				background: #0bb3f2   ;
+				border: 1px solid #0bb3f2;
+			}
+		}
+	}
+	.article-list{
+		margin-top: 20upx;
+		padding: 0 10upx;
+		.item{
+			width: 100%;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 20upx;
+			.left{
+				flex: 1;
+				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{
+					margin-top: 20rpx;
+					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;
+					}
+				}
+			}
+			 
+		}
+	}
+</style>

+ 457 - 0
pages_task/medicationSurvey.vue

@@ -0,0 +1,457 @@
+<template>
+	<view class="container">
+		<!-- 状态栏占位 -->
+		<view class="status-bar" :style="{height: statusBarHeight}"></view>
+		
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<image src="@/static/image/back.png" mode="aspectFill"></image>
+			</view>
+			<view class="title">用药调研</view>
+			<view class="header-right">
+				<text class="more-icon">⋯</text>
+				<text class="more-icon">○</text>
+			</view>
+		</view>
+		
+		<!-- 标签栏 -->
+		<view class="tabs-bar">
+			<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>
+		
+		<!-- 调研列表 -->
+		<scroll-view class="content" scroll-y>
+			<view class="survey-card" v-for="(item, index) in surveyList" :key="index" @click="goToDetail(item)">
+				<!-- 卡片头部背景 -->
+				<view class="card-header-bg" :style="{ backgroundImage: `url(${item.bannerImage})` }">
+					<view class="banner-content">
+						<view class="banner-title">{{ item.bannerTitle }}</view>
+						<view class="banner-subtitle" v-if="item.bannerSubtitle">{{ item.bannerSubtitle }}</view>
+						<view class="banner-info" v-if="item.bannerInfo">{{ item.bannerInfo }}</view>
+					</view>
+				</view>
+				
+				<!-- 卡片内容 -->
+				<view class="card-body">
+					<view class="collection-time">
+						征集时间: {{ item.collectionStartTime }} 至 {{ item.collectionEndTime }}
+					</view>
+					<view class="description">{{ item.description }}</view>
+					<view class="progress-section">
+						<view class="progress-bar">
+							<view class="progress-fill" :style="{ width: item.progressPercent + '%' }"></view>
+						</view>
+						<view class="progress-text">{{ item.completedCount }}/{{ item.totalCount }}</view>
+					</view>
+					<view class="card-action">
+						<view class="action-btn" :class="item.buttonClass" @click.stop="handleAction(item)">
+							{{ item.buttonText }}
+						</view>
+					</view>
+				</view>
+			</view>
+			
+			<view class="no-more">没有更多了~</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+import { getMedicationSurveyList } from '@/api-js/medicationSurvey'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			currentTab: 'incomplete',
+			tabs: [
+				{ label: '未完成', value: 'incomplete' },
+				{ label: '未开始', value: 'notStarted' },
+				{ label: '已结束', value: 'ended' }
+			],
+			surveyList: []
+		}
+	},
+	onLoad() {
+		this.loadData()
+	},
+	onReachBottom() {
+		this.loadMore()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		switchTab(tab) {
+			this.currentTab = tab
+			this.loadData()
+		},
+		goToDetail(item) {
+			uni.navigateTo({
+				url: `/pages_task/activityDetail?id=${item.id}`
+			})
+		},
+		handleAction(item) {
+			if (item.status === 'notStarted') {
+				uni.showToast({
+					icon: 'none',
+					title: '活动未开始'
+				})
+			} else if (item.status === 'ended') {
+				uni.showToast({
+					icon: 'none',
+					title: '活动已结束'
+				})
+			} else {
+				// 跳转到填写问卷或上传病例页面
+				uni.navigateTo({
+					url: `/pages_task/caseCollection?activityId=${item.id}`
+				})
+			}
+		},
+		async loadData() {
+			try {
+				uni.showLoading({ title: '加载中...' })
+				const res = await getMedicationSurveyList({
+					status: this.currentTab,
+					page: 1,
+					pageSize: 20
+				})
+				uni.hideLoading()
+				if (res.code === 200 && res.data) {
+					this.surveyList = res.data.list || this.getDefaultData()
+				} else {
+					this.surveyList = this.getDefaultData()
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+				this.surveyList = this.getDefaultData()
+			}
+		},
+		async loadMore() {
+			// 加载更多数据
+		},
+		getDefaultData() {
+			if (this.currentTab === 'notStarted') {
+				return [
+					{
+						id: 1,
+						bannerImage: '',
+						bannerTitle: '正规医院体检',
+						bannerSubtitle: '守护您的健康',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 0,
+						totalCount: 3,
+						progressPercent: 0,
+						status: 'notStarted',
+						buttonText: '未开始',
+						buttonClass: 'not-started'
+					},
+					{
+						id: 2,
+						bannerImage: '',
+						bannerTitle: '2025广东省医师协会眼科医师分会',
+						bannerSubtitle: '眼外伤与眼眶病学术会议',
+						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 0,
+						totalCount: 3,
+						progressPercent: 0,
+						status: 'notStarted',
+						buttonText: '未开始',
+						buttonClass: 'not-started'
+					}
+				]
+			} else if (this.currentTab === 'incomplete') {
+				return [
+					{
+						id: 3,
+						bannerImage: '',
+						bannerTitle: '正规医院体检',
+						bannerSubtitle: '守护您的健康',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 0,
+						totalCount: 3,
+						progressPercent: 0,
+						status: 'incomplete',
+						buttonText: '填写问卷',
+						buttonClass: 'fill-questionnaire'
+					},
+					{
+						id: 4,
+						bannerImage: '',
+						bannerTitle: '2025广东省医师协会眼科医师分会',
+						bannerSubtitle: '眼外伤与眼眶病学术会议',
+						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 1,
+						totalCount: 3,
+						progressPercent: 33,
+						status: 'incomplete',
+						buttonText: '填写问卷',
+						buttonClass: 'fill-questionnaire'
+					}
+				]
+			} else {
+				return [
+					{
+						id: 5,
+						bannerImage: '',
+						bannerTitle: '正规医院体检',
+						bannerSubtitle: '守护您的健康',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 0,
+						totalCount: 3,
+						progressPercent: 0,
+						status: 'ended',
+						buttonText: '活动已结束',
+						buttonClass: 'ended'
+					},
+					{
+						id: 6,
+						bannerImage: '',
+						bannerTitle: '2025广东省医师协会眼科医师分会',
+						bannerSubtitle: '眼外伤与眼眶病学术会议',
+						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
+						collectionStartTime: '2025-05-29 00:00',
+						collectionEndTime: '2025-05-29 00:00',
+						description: '全国14家医院抗菌药物合理用药调研',
+						completedCount: 0,
+						totalCount: 3,
+						progressPercent: 0,
+						status: 'ended',
+						buttonText: '活动已结束',
+						buttonClass: 'ended'
+					}
+				]
+			}
+		}
+	}
+}
+</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 {
+			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;
+		}
+	}
+}
+
+.tabs-bar {
+	display: flex;
+	background: #fff;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	.tab-item {
+		flex: 1;
+		height: 88rpx;
+		line-height: 88rpx;
+		text-align: center;
+		font-size: 28rpx;
+		color: #666;
+		position: relative;
+		
+		&.active {
+			color: #388BFF;
+			font-weight: bold;
+			
+			&::after {
+				content: '';
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				right: 0;
+				height: 4rpx;
+				background: #388BFF;
+			}
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 24rpx;
+}
+
+.survey-card {
+	background: #fff;
+	border-radius: 16rpx;
+	margin-bottom: 24rpx;
+	overflow: hidden;
+	
+	.card-header-bg {
+		position: relative;
+		height: 240rpx;
+		background: linear-gradient(135deg, #87CEEB 0%, #98D8C8 100%);
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 24rpx;
+		
+		.banner-content {
+			width: 100%;
+			text-align: center;
+			
+			.banner-title {
+				font-size: 36rpx;
+				font-weight: bold;
+				color: #fff;
+				margin-bottom: 8rpx;
+			}
+			
+			.banner-subtitle {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #fff;
+				margin-bottom: 8rpx;
+			}
+			
+			.banner-info {
+				font-size: 24rpx;
+				color: #fff;
+				margin-bottom: 8rpx;
+			}
+		}
+	}
+	
+	.card-body {
+		padding: 24rpx;
+		
+		.collection-time {
+			font-size: 24rpx;
+			color: #999;
+			margin-bottom: 16rpx;
+		}
+		
+		.description {
+			font-size: 28rpx;
+			color: #333;
+			margin-bottom: 16rpx;
+		}
+		
+		.progress-section {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+			margin-bottom: 16rpx;
+			
+			.progress-bar {
+				flex: 1;
+				height: 8rpx;
+				background: #f0f0f0;
+				border-radius: 4rpx;
+				overflow: hidden;
+				
+				.progress-fill {
+					height: 100%;
+					background: #388BFF;
+					border-radius: 4rpx;
+					transition: width 0.3s;
+				}
+			}
+			
+			.progress-text {
+				font-size: 24rpx;
+				color: #388BFF;
+				min-width: 60rpx;
+			}
+		}
+		
+		.card-action {
+			display: flex;
+			justify-content: flex-end;
+			
+			.action-btn {
+				padding: 12rpx 32rpx;
+				border-radius: 8rpx;
+				font-size: 26rpx;
+				color: #fff;
+				
+				&.fill-questionnaire {
+					background: #388BFF;
+				}
+				
+				&.not-started {
+					background: #ccc;
+				}
+				
+				&.ended {
+					background: #999;
+				}
+			}
+		}
+	}
+}
+
+.no-more {
+	text-align: center;
+	padding: 48rpx 0;
+	font-size: 24rpx;
+	color: #999;
+}
+</style>
+

+ 648 - 0
pages_task/onlineLecture.vue

@@ -0,0 +1,648 @@
+<template>
+	<view class="container">
+		<!-- 搜索栏 -->
+		<view class="search-bar">
+			<view class="search-input-wrapper">
+				<text class="search-icon">🔍</text>
+				<input 
+					class="search-input" 
+					v-model="keyword" 
+					placeholder="请输入关键字"
+					@confirm="doSearch"
+				/>
+			</view>
+		</view>
+		
+		<!-- 标签栏 -->
+		<view class="tabs-bar">
+			<view class="tab-item" 
+				:class="{ active: currentTab === 'incomplete' }" 
+				@click="switchTab('incomplete')">
+				未完成
+			</view>
+			<view class="tab-item" 
+				:class="{ active: currentTab === 'completed' }" 
+				@click="switchTab('completed')">
+				已完成
+			</view>
+		</view>
+		
+		<!-- 讲座列表 -->
+		<scroll-view class="content" scroll-y>
+			<view class="lecture-card" v-for="(item, index) in lectureList" :key="index">
+				<view class="card-thumbnail">
+					<image class="thumbnail-img" :src="item.thumbnail" mode="aspectFill"></image>
+					<view class="thumbnail-status" v-if="item.status === 'inProgress'">
+						<text class="status-text">进行中</text>
+					</view>
+					<view class="thumbnail-date" v-else-if="item.scheduledTime">
+						<text class="date-icon">🕐</text>
+						<text class="date-text">{{ item.scheduledTime }}</text>
+					</view>
+				</view>
+				
+				<view class="card-content">
+					<view class="card-title">{{ item.title }}</view>
+					<view class="card-tags">
+						<view class="tag-item">{{ item.category }}</view>
+						<view class="tag-item">{{ item.type }}</view>
+					</view>
+					<view class="card-points">{{ item.points }} 积分</view>
+					<view class="card-views" v-if="currentTab === 'completed'">
+						<text class="eye-icon">👁</text>
+						<text>{{ item.viewCount }}</text>
+					</view>
+					<view class="card-action">
+						<view class="action-btn" 
+							v-if="item.status === 'inProgress' || item.status === 'scheduled'"
+							@click.stop="openChannelPicker(item)">
+							{{ item.status === 'inProgress' ? '继续开播' : '去开播' }}
+						</view>
+					</view>
+				</view>
+			</view>
+			
+			<view class="no-more">没有更多了~</view>
+		</scroll-view>
+		
+		<!-- 选择开播渠道弹窗 -->
+		<view class="channel-picker-popup" v-if="showChannelPicker" @click="showChannelPicker = false">
+			<view class="channel-picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-title">选择开播渠道</view>
+					<view class="picker-close" @click="showChannelPicker = false">×</view>
+				</view>
+				
+				<!-- 电脑浏览器开播 -->
+				<view class="channel-option">
+					<view class="option-icon">💻</view>
+					<view class="option-content">
+						<view class="option-title">电脑浏览器开播</view>
+						<view class="option-url-wrapper">
+							<text class="option-url">{{ broadcastUrl }}</text>
+							<view class="copy-btn" @click="copyUrl">复制链接</view>
+						</view>
+						<view class="option-tips">复制至谷歌浏览器,登录账号即可开播</view>
+					</view>
+				</view>
+				
+				<!-- 微信小程序开播 -->
+				<view class="channel-option">
+					<view class="option-icon wechat">💬</view>
+					<view class="option-content">
+						<view class="option-title">微信小程序开播</view>
+						<view class="option-action">
+							<view class="enter-btn" @click="enterMiniProgram">立即进入</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { getOnlineLectureList, getBroadcastUrl, enterMiniProgram } from '@/api-js/onlineLecture'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			keyword: '',
+			currentTab: 'incomplete',
+			showChannelPicker: false,
+			broadcastUrl: 'https://www.test.coe.huahua...',
+			currentLecture: null,
+			lectureList: []
+		}
+	},
+	onLoad() {
+		this.loadData()
+	},
+	onReachBottom() {
+		this.loadMore()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		doSearch() {
+			this.loadData()
+		},
+		switchTab(tab) {
+			this.currentTab = tab
+			this.loadData()
+		},
+		async openChannelPicker(item) {
+			this.currentLecture = item
+			// try {
+			// 	const res = await getBroadcastUrl({ lectureId: item.id })
+			// 	if (res.code === 200 && res.data) {
+			// 		this.broadcastUrl = res.data.url
+			// 	}
+			// } catch (e) {
+			// 	console.error('获取开播链接失败', e)
+			// }
+			this.showChannelPicker = true
+		},
+		copyUrl() {
+			uni.setClipboardData({
+				data: this.broadcastUrl,
+				success: () => {
+					uni.showToast({
+						icon: 'success',
+						title: '链接已复制'
+					})
+				}
+			})
+		},
+		async enterMiniProgram() {
+			try {
+				const res = await enterMiniProgram({ lectureId: this.currentLecture.id })
+				if (res.code === 200 && res.data) {
+					// 跳转到微信小程序
+					uni.navigateToMiniProgram({
+						appId: res.data.appId,
+						path: res.data.path,
+						success: () => {
+							this.showChannelPicker = false
+						}
+					})
+				}
+			} catch (e) {
+				uni.showToast({
+					icon: 'none',
+					title: '进入失败'
+				})
+			}
+		},
+		async loadData() {
+			try {
+				uni.showLoading({ title: '加载中...' })
+				const res = await getOnlineLectureList({
+					keyword: this.keyword,
+					status: this.currentTab,
+					page: 1,
+					pageSize: 20
+				})
+				uni.hideLoading()
+				if (res.code === 200 && res.data) {
+					this.lectureList = res.data.list || this.getDefaultData()
+				} else {
+					this.lectureList = this.getDefaultData()
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+				this.lectureList = this.getDefaultData()
+			}
+		},
+		async loadMore() {
+			// 加载更多数据
+		},
+		getDefaultData() {
+			if (this.currentTab === 'incomplete') {
+				return [
+					{
+						id: 1,
+						title: '康复医学概论',
+						thumbnail: '/static/image/lecture1.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						status: 'inProgress',
+						scheduledTime: ''
+					},
+					{
+						id: 2,
+						title: '中医养生至冬病夏天治...',
+						thumbnail: '/static/image/lecture2.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						status: 'scheduled',
+						scheduledTime: '05-12 12:00'
+					},
+					{
+						id: 3,
+						title: '康复医学概论',
+						thumbnail: '/static/image/lecture3.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						status: 'scheduled',
+						scheduledTime: '05-24 16:00'
+					}
+				]
+			} else {
+				return [
+					{
+						id: 4,
+						title: '康复医学概论',
+						thumbnail: '/static/image/lecture1.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						viewCount: '123',
+						scheduledTime: '05-12 12:00'
+					},
+					{
+						id: 5,
+						title: '康复医学概论',
+						thumbnail: '/static/image/lecture2.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						viewCount: '123',
+						scheduledTime: '05-12 12:00'
+					},
+					{
+						id: 6,
+						title: '康复医学概论',
+						thumbnail: '/static/image/lecture3.png',
+						category: '学术讲座',
+						type: '单人讲座',
+						points: '32.50',
+						viewCount: '123',
+						scheduledTime: '05-12 12:00'
+					}
+				]
+			}
+		}
+	}
+}
+</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 {
+			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;
+		}
+	}
+}
+
+.search-bar {
+	padding: 24rpx;
+	background: #fff;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	.search-input-wrapper {
+		display: flex;
+		align-items: center;
+		height: 72rpx;
+		background: #f5f5f5;
+		border-radius: 36rpx;
+		padding: 0 24rpx;
+		
+		.search-icon {
+			font-size: 32rpx;
+			margin-right: 16rpx;
+			color: #999;
+		}
+		
+		.search-input {
+			flex: 1;
+			font-size: 28rpx;
+			color: #333;
+		}
+	}
+}
+
+.tabs-bar {
+	display: flex;
+	background: #fff;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	.tab-item {
+		flex: 1;
+		height: 88rpx;
+		line-height: 88rpx;
+		text-align: center;
+		font-size: 28rpx;
+		color: #666;
+		position: relative;
+		
+		&.active {
+			color: #388BFF;
+			font-weight: bold;
+			
+			&::after {
+				content: '';
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				right: 0;
+				height: 4rpx;
+				background: #388BFF;
+			}
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	padding: 24rpx;
+}
+
+.lecture-card {
+	display: flex;
+	background: #fff;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	margin-bottom: 24rpx;
+	
+	.card-thumbnail {
+		position: relative;
+		width: 240rpx;
+		height: 180rpx;
+		border-radius: 12rpx;
+		overflow: hidden;
+		margin-right: 24rpx;
+		flex-shrink: 0;
+		
+		.thumbnail-img {
+			width: 100%;
+			height: 100%;
+		}
+		
+		.thumbnail-status {
+			position: absolute;
+			top: 8rpx;
+			left: 8rpx;
+			padding: 4rpx 12rpx;
+			background: #FF9800;
+			border-radius: 4rpx;
+			
+			.status-text {
+				font-size: 20rpx;
+				color: #fff;
+			}
+		}
+		
+		.thumbnail-date {
+			position: absolute;
+			top: 8rpx;
+			left: 8rpx;
+			display: flex;
+			align-items: center;
+			gap: 4rpx;
+			padding: 4rpx 12rpx;
+			background: rgba(0, 0, 0, 0.5);
+			border-radius: 4rpx;
+			
+			.date-icon {
+				font-size: 20rpx;
+			}
+			
+			.date-text {
+				font-size: 20rpx;
+				color: #fff;
+			}
+		}
+	}
+	
+	.card-content {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		
+		.card-title {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: #333;
+			margin-bottom: 12rpx;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+		}
+		
+		.card-tags {
+			display: flex;
+			align-items: center;
+			gap: 12rpx;
+			margin-bottom: 12rpx;
+			
+			.tag-item {
+				padding: 4rpx 12rpx;
+				background: #f5f5f5;
+				border-radius: 4rpx;
+				font-size: 22rpx;
+				color: #666;
+			}
+		}
+		
+		.card-points {
+			font-size: 26rpx;
+			color: #333;
+			margin-bottom: 12rpx;
+		}
+		
+		.card-views {
+			display: flex;
+			align-items: center;
+			gap: 4rpx;
+			font-size: 24rpx;
+			color: #999;
+			margin-bottom: 12rpx;
+			
+			.eye-icon {
+				font-size: 24rpx;
+			}
+		}
+		
+		.card-action {
+			display: flex;
+			justify-content: flex-end;
+			
+			.action-btn {
+				padding: 12rpx 32rpx;
+				background: #388BFF;
+				border-radius: 8rpx;
+				font-size: 26rpx;
+				color: #fff;
+			}
+		}
+	}
+}
+
+.no-more {
+	text-align: center;
+	padding: 48rpx 0;
+	font-size: 24rpx;
+	color: #999;
+}
+
+.channel-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: center;
+	justify-content: center;
+}
+
+.channel-picker-content {
+	width: 90%;
+	max-width: 600rpx;
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 24rpx;
+	
+	.picker-header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 32rpx;
+		
+		.picker-title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+		}
+		
+		.picker-close {
+			width: 48rpx;
+			height: 48rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 40rpx;
+			color: #999;
+		}
+	}
+	
+	.channel-option {
+		display: flex;
+		align-items: flex-start;
+		margin-bottom: 32rpx;
+		
+		&:last-child {
+			margin-bottom: 0;
+		}
+		
+		.option-icon {
+			width: 64rpx;
+			height: 64rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 48rpx;
+			margin-right: 24rpx;
+			flex-shrink: 0;
+			
+			&.wechat {
+				background: #07C160;
+				border-radius: 8rpx;
+			}
+		}
+		
+		.option-content {
+			flex: 1;
+			
+			.option-title {
+				font-size: 30rpx;
+				font-weight: bold;
+				color: #333;
+				margin-bottom: 16rpx;
+			}
+			
+			.option-url-wrapper {
+				display: flex;
+				align-items: center;
+				gap: 16rpx;
+				margin-bottom: 12rpx;
+				
+				.option-url {
+					flex: 1;
+					padding: 12rpx 16rpx;
+					background: #f5f5f5;
+					border-radius: 8rpx;
+					font-size: 24rpx;
+					color: #666;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+				}
+				
+				.copy-btn {
+					padding: 12rpx 24rpx;
+					background: #388BFF;
+					border-radius: 8rpx;
+					font-size: 24rpx;
+					color: #fff;
+					white-space: nowrap;
+				}
+			}
+			
+			.option-tips {
+				font-size: 22rpx;
+				color: #999;
+			}
+			
+			.option-action {
+				display: flex;
+				justify-content: flex-end;
+				
+				.enter-btn {
+					padding: 12rpx 32rpx;
+					background: #388BFF;
+					border-radius: 8rpx;
+					font-size: 28rpx;
+					color: #fff;
+				}
+			}
+		}
+	}
+}
+</style>
+

+ 743 - 0
pages_task/science.vue

@@ -0,0 +1,743 @@
+<template>
+	<view class="container">
+		
+		<!-- 筛选标签栏 -->
+		<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" @click="showFilter = true">
+				<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">{{ item.title }}</view>
+					<view class="status-tag" :class="item.status">
+						{{ item.statusText }}
+					</view>
+				</view>
+				<view class="card-tags">
+					<view class="tag-item video-tag" v-if="item.videoType">
+						<image class="w28 h28 mr10" src="@/static/image/icon_longvideo.png" mode=""></image>
+						<text>{{ item.videoType }}</text>
+					</view>
+					<view class="tag-item" v-if="item.category">
+						{{ item.category }}
+					</view>
+					<view class="tag-item points-tag">
+						{{ item.points }}积分
+					</view>
+					<view class="tag-item">
+						{{ item.count }}个
+					</view>
+				</view>
+				
+				<view class="card-dates">
+					<view class="date-item">
+						<text>开始时间: {{ item.startTime }}</text>
+					</view>
+					<view class="date-item">
+						<text>结束时间: {{ item.endTime }}</text>
+					</view>
+				</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">
+					<text class="rejection-icon">❌</text>
+					<text>驳回原因: {{ item.rejectionReason }}</text>
+				</view>
+				
+				<view class="card-footer">
+					<view class="footer-date">{{ item.createTime }}</view>
+					<view class="footer-actions">
+						<view class="action-btn" v-if="item.status === 'pending'" @click="goComplete(item)">
+							去完成
+						</view>
+						<view class="action-btn" v-if="item.status === 'rejected'" @click="goEdit(item)">
+							编辑
+						</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>
+					<view class="filter-close-btn" @click="closeFilter">×</view>
+				</view>
+				
+				<!-- 申请时间筛选 -->
+				<view class="filter-group">
+					<view class="group-label">申请时间</view>
+					<view class="date-range-inputs">
+						<picker mode="date" :value="tempDateRange.startDate" @change="onStartDateChange">
+							<view class="date-input" :class="{ placeholder: !tempDateRange.startDate }">
+								{{ tempDateRange.startDate || '开始时间' }}
+							</view>
+						</picker>
+						<text class="date-separator">-</text>
+						<picker mode="date" :value="tempDateRange.endDate" @change="onEndDateChange">
+							<view class="date-input" :class="{ placeholder: !tempDateRange.endDate }">
+								{{ tempDateRange.endDate || '结束时间' }}
+							</view>
+						</picker>
+					</view>
+				</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 }}
+						</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>
+import { getAirClassroomList } from '@/api-js/airClassroom'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			currentTab: 'all',
+			showFilter: false,
+			dateRange: {
+				startDate: '',
+				endDate: ''
+			},
+			tempDateRange: {
+				startDate: '',
+				endDate: ''
+			},
+			selectedTaskType: 'article', // 默认选中科普文章
+			tempSelectedTaskType: 'article',
+			taskTypeOptions: [
+				{ label: '科普文章', value: 'article' },
+				{ label: '科普短视频', value: 'shortVideo' },
+				{ label: '科普长视频', value: 'longVideo' }
+			],
+			tabs: [
+				{ label: '全部', value: 'all' },
+				{ label: '未完成', value: 'pending' },
+				{ 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
+				}
+				this.tempSelectedTaskType = this.selectedTaskType
+			}
+		}
+	},
+	onLoad() {
+		this.loadData()
+	},
+	onReachBottom() {
+		this.loadMore()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		switchTab(value) {
+			this.currentTab = value
+			this.loadData()
+		},
+		closeFilter() {
+			// 关闭弹窗时,恢复临时日期范围和任务类型为当前值
+			this.tempDateRange = {
+				startDate: this.dateRange.startDate,
+				endDate: this.dateRange.endDate
+			}
+			this.tempSelectedTaskType = this.selectedTaskType
+			this.showFilter = false
+		},
+		selectTaskType(value) {
+			// 如果点击的是已选中的,则取消选择
+			if (this.tempSelectedTaskType === value) {
+				this.tempSelectedTaskType = ''
+			} else {
+				this.tempSelectedTaskType = value
+			}
+		},
+		onStartDateChange(e) {
+			this.tempDateRange.startDate = e.detail.value
+		},
+		onEndDateChange(e) {
+			this.tempDateRange.endDate = e.detail.value
+		},
+		resetFilters() {
+			this.tempDateRange = {
+				startDate: '',
+				endDate: ''
+			}
+			this.tempSelectedTaskType = ''
+		},
+		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.selectedTaskType = this.tempSelectedTaskType
+			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,
+					taskType: this.selectedTaskType,
+					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: '王小明医生空中任务',
+					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: 'pending',
+					statusText: '待完成'
+				},
+				{
+					id: 2,
+					title: '王小明医生空中任务',
+					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: 'pending',
+					statusText: '待完成',
+					warning: '有效观看不足5人'
+				},
+				{
+					id: 3,
+					title: '王小明医生空中任务',
+					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: 'reviewing',
+					statusText: '待审核'
+				},
+				{
+					id: 4,
+					title: '王小明医生空中任务',
+					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: '王小明医生空中任务',
+					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="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 {
+			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 24rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	.filter-tabs {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		gap: 32rpx;
+		overflow-x: auto;
+		
+		.tab-item {
+			padding: 24rpx 0;
+			font-size: 28rpx;
+			color: #666;
+			white-space: nowrap;
+			position: relative;
+			
+			&.active {
+				color: #388BFF;
+				font-weight: bold;
+				
+				&::after {
+					content: '';
+					position: absolute;
+					bottom: 0;
+					left: 0;
+					right: 0;
+					height: 4rpx;
+					background: #388BFF;
+				}
+			}
+		}
+	}
+	
+	.filter-divider {
+		width: 1rpx;
+		height: 40rpx;
+		background: #e0e0e0;
+		margin: 0 16rpx;
+	}
+	
+	.filter-btn {
+		padding: 24rpx 0;
+		
+		.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: bold;
+			color: #333;
+		}
+		
+		.status-tag {
+			padding: 8rpx 16rpx;
+			border-radius: 20rpx;
+			font-size: 24rpx;
+			
+			&.pending {
+				background: #E3F2FD;
+				color: #2196F3;
+			}
+			
+			&.reviewing {
+				background: #FFF3E0;
+				color: #FF9800;
+			}
+			
+			&.approved {
+				background: #E8F5E9;
+				color: #4CAF50;
+			}
+			
+			&.rejected {
+				background: #FFEBEE;
+				color: #F44336;
+			}
+		}
+	}
+	
+	.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;
+			font-size: 24rpx;
+			color: #666;
+			
+			&.video-tag {
+				background: #FFF3E0;
+				color: #FF9800;
+				
+				.tag-icon {
+					margin-right: 4rpx;
+				}
+			}
+			
+			&.points-tag {
+				border: 1rpx solid #388BFF;
+				color: #388BFF;
+				background: transparent;
+			}
+		}
+	}
+	
+	.card-dates {
+		margin-bottom: 16rpx;
+		
+		.date-item {
+			font-size: 26rpx;
+			color: #999;
+			margin-bottom: 8rpx;
+		}
+	}
+	
+	.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: 12rpx;
+		background: #FFEBEE;
+		border-radius: 8rpx;
+		margin-bottom: 16rpx;
+		font-size: 26rpx;
+		color: #F44336;
+		
+		.rejection-icon {
+			font-size: 28rpx;
+		}
+	}
+	
+	.card-footer {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding-top: 16rpx;
+		border-top: 1rpx solid #f0f0f0;
+		
+		.footer-date {
+			font-size: 24rpx;
+			color: #999;
+		}
+		
+		.footer-actions {
+			.action-btn {
+				padding: 12rpx 32rpx;
+				background: #388BFF;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				color: #fff;
+			}
+		}
+	}
+}
+
+.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;
+	
+	.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: 32rpx;
+		
+		.group-label {
+			font-size: 28rpx;
+			font-weight: bold;
+			color: #333;
+			margin-bottom: 20rpx;
+		}
+		
+		.date-range-inputs {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+			
+			.date-input {
+				flex: 1;
+				height: 80rpx;
+				line-height: 80rpx;
+				padding: 0 24rpx;
+				background: #f5f5f5;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				color: #333;
+				text-align: center;
+				
+				&.placeholder {
+					color: #999;
+				}
+			}
+			
+		.date-separator {
+			font-size: 28rpx;
+			color: #666;
+		}
+	}
+	
+	.filter-tags {
+		display: flex;
+		flex-wrap: wrap;
+		gap: 16rpx;
+		
+		.filter-tag {
+			padding: 12rpx 24rpx;
+			background: #f5f5f5;
+			border-radius: 8rpx;
+			font-size: 26rpx;
+			color: #666;
+			border: 1rpx solid transparent;
+			
+			&.active {
+				background: #388BFF;
+				color: #fff;
+				border-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;
+		}
+	}
+}
+</style>
+

+ 240 - 0
pages_task/taskCompleteSuccess.vue

@@ -0,0 +1,240 @@
+<template>
+	<view class="container">
+		<!-- 状态栏占位 -->
+		<view class="status-bar" :style="{height: statusBarHeight}"></view>
+		
+		<!-- 顶部导航栏 -->
+		<view class="header">
+			<view class="back-btn" @click="goBack">
+				<image src="@/static/image/back.png" mode="aspectFill"></image>
+			</view>
+			<view class="title">完成任务</view>
+			<view class="header-right">
+				<text class="more-icon">⋯</text>
+				<text class="more-icon">○</text>
+			</view>
+		</view>
+		
+		<view class="content">
+			<view class="success-content">
+				<view class="success-icon-wrapper">
+					<view class="success-icon">
+						<text class="checkmark">✓</text>
+					</view>
+					<view class="success-ring ring1"></view>
+					<view class="success-ring ring2"></view>
+					<view class="decoration dot1"></view>
+					<view class="decoration dot2"></view>
+					<view class="decoration plus"></view>
+					<view class="decoration dot3"></view>
+				</view>
+				<view class="success-text">任务已完成</view>
+			</view>
+			
+			<view class="back-btn-large" @click="goBackToList">
+				返回任务列表
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px'
+		}
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		goBackToList() {
+			uni.navigateBack({
+				delta: 2
+			})
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.container {
+	min-height: 100vh;
+	background: #fff;
+	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;
+	}
+	
+	.header-right {
+		position: absolute;
+		right: 24rpx;
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		
+		.more-icon {
+			font-size: 32rpx;
+			color: #333;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	padding: 48rpx;
+}
+
+.success-content {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-bottom: 80rpx;
+	
+	.success-icon-wrapper {
+		position: relative;
+		width: 200rpx;
+		height: 200rpx;
+		margin-bottom: 48rpx;
+		
+		.success-icon {
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			width: 120rpx;
+			height: 120rpx;
+			background: #4CAF50;
+			border-radius: 50%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			z-index: 3;
+			
+			.checkmark {
+				font-size: 80rpx;
+				color: #fff;
+				font-weight: bold;
+			}
+		}
+		
+		.success-ring {
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			border-radius: 50%;
+			border: 2rpx solid rgba(76, 175, 80, 0.3);
+			
+			&.ring1 {
+				width: 160rpx;
+				height: 160rpx;
+				z-index: 2;
+			}
+			
+			&.ring2 {
+				width: 200rpx;
+				height: 200rpx;
+				z-index: 1;
+			}
+		}
+		
+		.decoration {
+			position: absolute;
+			
+			&.dot1 {
+				top: 20rpx;
+				left: 20rpx;
+				width: 12rpx;
+				height: 12rpx;
+				background: rgba(76, 175, 80, 0.3);
+				border-radius: 50%;
+			}
+			
+			&.dot2 {
+				top: 30rpx;
+				right: 40rpx;
+				width: 8rpx;
+				height: 8rpx;
+				background: #FFC107;
+				border-radius: 50%;
+			}
+			
+			&.plus {
+				top: 10rpx;
+				right: 20rpx;
+				width: 16rpx;
+				height: 16rpx;
+				color: rgba(76, 175, 80, 0.3);
+				font-size: 16rpx;
+			}
+			
+			&.dot3 {
+				bottom: 30rpx;
+				right: 30rpx;
+				width: 8rpx;
+				height: 8rpx;
+				background: #FFC107;
+				border-radius: 50%;
+			}
+		}
+	}
+	
+	.success-text {
+		font-size: 36rpx;
+		font-weight: bold;
+		color: #333;
+	}
+}
+
+.back-btn-large {
+	width: 100%;
+	max-width: 600rpx;
+	height: 88rpx;
+	background: #388BFF;
+	border-radius: 44rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	color: #fff;
+	font-weight: 500;
+}
+</style>
+

+ 411 - 0
pages_task/taskDetail.vue

@@ -0,0 +1,411 @@
+<template>
+	<view class="container">
+		<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>
+			</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">{{ projectData.projectName }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">任务ID:</text>
+						<text class="info-value">{{ projectData.taskId }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">交付物ID:</text>
+						<text class="info-value">{{ projectData.deliverableId }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">观看人数:</text>
+						<text class="info-value">{{ projectData.viewers }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">有效观看:</text>
+						<text class="info-value">{{ projectData.validViews }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">标题:</text>
+						<text class="info-value">{{ projectData.title }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">项目信息:</text>
+						<text class="info-value">{{ projectData.projectInfo || '-' }}</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>
+					</view>
+					<view class="info-item">
+						<text class="info-label">情况说明:</text>
+						<text class="info-value">{{ projectData.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="info-list">
+					<view class="info-item">
+						<text class="info-label">申请人姓名:</text>
+						<text class="info-value">{{ applicantData.name }}</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">{{ clientData.name }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">客户ID:</text>
+						<text class="info-value">{{ clientData.clientId }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属医院:</text>
+						<text class="info-value">{{ clientData.hospital }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">归属科室:</text>
+						<text class="info-value">{{ clientData.department }}</text>
+					</view>
+				</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: '消化内科'
+			}
+		}
+	},
+	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}`
+			})
+		},
+		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 }
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+			}
+		}
+	}
+}
+</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 {
+			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;
+		}
+	}
+}
+
+.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;
+			}
+		}
+	}
+	
+	.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;
+			font-size: 24rpx;
+			color: #666;
+			
+			&.video-tag {
+				background: #FFF3E0;
+				color: #FF9800;
+				
+				.tag-icon {
+					margin-right: 4rpx;
+				}
+			}
+			
+			&.points-tag {
+				border: 1rpx solid #388BFF;
+				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;
+		margin-bottom: 24rpx;
+		
+		.section-indicator {
+			width: 6rpx;
+			height: 32rpx;
+			background: #388BFF;
+			border-radius: 3rpx;
+			margin-right: 16rpx;
+		}
+		
+		.section-title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+		}
+	}
+	
+	.info-list {
+		.info-item {
+			display: flex;
+			align-items: flex-start;
+			margin-bottom: 24rpx;
+			
+			&:last-child {
+				margin-bottom: 0;
+			}
+			
+			.info-label {
+				width: 160rpx;
+				font-size: 28rpx;
+				color: #666;
+				flex-shrink: 0;
+			}
+			
+			.info-value {
+				flex: 1;
+				font-size: 28rpx;
+				color: #333;
+			}
+			
+			.cover-image {
+				width: 200rpx;
+				height: 200rpx;
+				border-radius: 8rpx;
+				overflow: hidden;
+				
+				image {
+					width: 100%;
+					height: 100%;
+				}
+			}
+		}
+	}
+}
+
+.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>
+

+ 503 - 0
pages_user/points.vue

@@ -0,0 +1,503 @@
+<template>
+	<view class="container">
+		<!-- 状态栏占位 -->
+		<scroll-view class="content" scroll-y>
+			<!-- 积分卡片 -->
+			<view class="points-card">
+				<view class="card-decoration">
+					<text class="star-icon">⭐</text>
+				</view>
+				<view class="card-content">
+					<view class="card-label">积分账户</view>
+					<view class="card-balance">{{ pointsData.balance || '0.00' }}</view>
+					<view class="card-pending">支出待入账: {{ pointsData.pendingExpense || '0.00' }}</view>
+					<view class="withdraw-btn" @click="goWithdraw">去提现</view>
+				</view>
+			</view>
+			
+			<!-- 筛选和汇总区域 -->
+			<view class="filter-summary-section">
+				<view class="filter-row">
+					<view class="date-picker" @click="showDatePicker = true">
+						<text>{{ selectedDate }}</text>
+						<text class="arrow-down">▾</text>
+					</view>
+					<view class="type-buttons">
+						<view class="type-btn" :class="{ active: incomeType === 'income' }" @click="switchType('income')">
+							收入
+						</view>
+						<view class="type-btn" :class="{ active: incomeType === 'expense' }" @click="switchType('expense')">
+							支出
+						</view>
+					</view>
+					<view class="total-amount">
+						收入{{ summaryData.totalIncome || '0.00' }}
+					</view>
+				</view>
+				<view class="type-filter" @click="showTypePicker = true">
+					<text>{{ selectedType || '全部类型' }}</text>
+					<text class="arrow-down">▾</text>
+				</view>
+			</view>
+			
+			<!-- 交易列表 -->
+			<view class="transaction-list">
+				<view class="transaction-item" v-for="(item, index) in transactionList" :key="index">
+					<view class="item-left">
+						<view class="item-title">{{ item.title }}</view>
+						<view class="item-time">{{ item.dateTime }}</view>
+					</view>
+					<view class="item-amount" :class="item.type">
+						{{ item.type === 'income' ? '+' : '-' }}{{ item.amount }}
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		
+		<!-- 日期选择弹窗 -->
+		<view class="date-picker-popup" v-if="showDatePicker" @click="showDatePicker = false">
+			<view class="picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-cancel" @click="showDatePicker = false">取消</view>
+					<view class="picker-title">选择年月</view>
+					<view class="picker-confirm" @click="confirmDate">确定</view>
+				</view>
+				<view class="picker-body">
+					<picker mode="date" fields="month" :value="tempDate" @change="onDateChange">
+						<view class="picker-item">
+							<text>{{ tempDate || '请选择年月' }}</text>
+						</view>
+					</picker>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 类型选择弹窗 -->
+		<view class="type-picker-popup" v-if="showTypePicker" @click="showTypePicker = false">
+			<view class="picker-content" @click.stop>
+				<view class="picker-header">
+					<view class="picker-cancel" @click="showTypePicker = false">取消</view>
+					<view class="picker-title">选择类型</view>
+					<view class="picker-confirm" @click="confirmType">确定</view>
+				</view>
+				<view class="picker-body">
+					<view class="picker-item" 
+						:class="{ active: tempType === item.value }"
+						v-for="(item, index) in typeOptions" 
+						:key="index"
+						@click="tempType = item.value">
+						{{ item.label }}
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { getPointsList, getPointsInfo } from '@/api-js/points'
+export default {
+	data() {
+		return {
+			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+			showDatePicker: false,
+			showTypePicker: false,
+			selectedDate: '2025-12',
+			tempDate: '2025-12',
+			incomeType: 'income', // income: 收入, expense: 支出
+			selectedType: '全部类型',
+			tempType: '全部类型',
+			typeOptions: [
+				{ label: '全部类型', value: '全部类型' },
+				{ label: '医生座诊', value: '医生座诊' },
+				{ label: '科普讲座', value: '科普讲座' },
+				{ label: '用药调研', value: '用药调研' },
+				{ label: '科普短视频', value: '科普短视频' }
+			],
+			pointsData: {
+				balance: '320.00',
+				pendingExpense: '30.00'
+			},
+			summaryData: {
+				totalIncome: '600.00'
+			},
+			transactionList: []
+		}
+	},
+	onLoad() {
+		this.loadData()
+	},
+	onReachBottom() {
+		this.loadMore()
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack()
+		},
+		goWithdraw() {
+			uni.navigateTo({
+				url: '/pages/user/withdraw'
+			})
+		},
+		onDateChange(e) {
+			this.tempDate = e.detail.value
+		},
+		confirmDate() {
+			this.selectedDate = this.tempDate
+			this.showDatePicker = false
+			this.loadData()
+		},
+		confirmType() {
+			this.selectedType = this.tempType
+			this.showTypePicker = false
+			this.loadData()
+		},
+		switchType(type) {
+			this.incomeType = type
+			this.loadData()
+		},
+		async loadData() {
+			try {
+				uni.showLoading({ title: '加载中...' })
+				const [infoRes, listRes] = await Promise.all([
+					getPointsInfo(),
+					getPointsList({
+						date: this.selectedDate,
+						type: this.incomeType,
+						category: this.selectedType === '全部类型' ? '' : this.selectedType,
+						page: 1,
+						pageSize: 20
+					})
+				])
+				uni.hideLoading()
+				
+				if (infoRes.code === 200 && infoRes.data) {
+					this.pointsData = {
+						balance: (infoRes.data.balance || 0).toFixed(2),
+						pendingExpense: (infoRes.data.pendingExpense || 0).toFixed(2)
+					}
+				}
+				
+				if (listRes.code === 200 && listRes.data) {
+					this.transactionList = listRes.data.list || this.getDefaultData()
+					this.summaryData = {
+						totalIncome: (listRes.data.totalIncome || 0).toFixed(2)
+					}
+				} else {
+					this.transactionList = this.getDefaultData()
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载数据失败', e)
+				this.transactionList = this.getDefaultData()
+			}
+		},
+		async loadMore() {
+			// 加载更多数据
+		},
+		getDefaultData() {
+			// 默认数据,根据图片中的示例
+			return [
+				{ title: '医生座诊', dateTime: '2021-07-29 19:55', amount: '300', type: 'income' },
+				{ title: '科普讲座', dateTime: '2021-07-29 19:55', amount: '300', type: 'income' }
+			]
+		}
+	}
+}
+</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 {
+			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;
+		}
+	}
+}
+
+.content {
+	flex: 1;
+	background: #f5f5f5;
+}
+
+.points-card {
+	position: relative;
+	margin: 24rpx;
+	background: linear-gradient(135deg, #FF9800 0%, #FFC107 100%);
+	border-radius: 24rpx;
+	padding: 48rpx 32rpx;
+	overflow: hidden;
+	
+	.card-decoration {
+		position: absolute;
+		top: 20rpx;
+		right: 20rpx;
+		width: 120rpx;
+		height: 120rpx;
+		background: rgba(255, 255, 255, 0.2);
+		border-radius: 50%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		
+		.star-icon {
+			font-size: 60rpx;
+		}
+	}
+	
+	.card-content {
+		position: relative;
+		z-index: 1;
+		
+		.card-label {
+			font-size: 28rpx;
+			color: rgba(255, 255, 255, 0.9);
+			margin-bottom: 16rpx;
+		}
+		
+		.card-balance {
+			font-size: 72rpx;
+			font-weight: bold;
+			color: #fff;
+			margin-bottom: 16rpx;
+		}
+		
+		.card-pending {
+			font-size: 24rpx;
+			color: rgba(255, 255, 255, 0.8);
+			margin-bottom: 32rpx;
+		}
+		
+		.withdraw-btn {
+			display: inline-block;
+			padding: 16rpx 48rpx;
+			background: #fff;
+			border-radius: 44rpx;
+			font-size: 28rpx;
+			color: #FF9800;
+			font-weight: 500;
+		}
+	}
+}
+
+.filter-summary-section {
+	background: #fff;
+	margin: 0 24rpx 24rpx;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	
+	.filter-row {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 24rpx;
+		
+		.date-picker {
+			display: flex;
+			align-items: center;
+			gap: 8rpx;
+			font-size: 28rpx;
+			color: #333;
+			
+			.arrow-down {
+				font-size: 20rpx;
+				color: #999;
+			}
+		}
+		
+		.type-buttons {
+			display: flex;
+			gap: 16rpx;
+			
+			.type-btn {
+				padding: 12rpx 32rpx;
+				border-radius: 44rpx;
+				font-size: 26rpx;
+				background: #f5f5f5;
+				color: #333;
+				
+				&.active {
+					background: #FF9800;
+					color: #fff;
+				}
+			}
+		}
+		
+		.total-amount {
+			font-size: 28rpx;
+			color: #333;
+			font-weight: 500;
+		}
+	}
+	
+	.type-filter {
+		display: flex;
+		align-items: center;
+		gap: 8rpx;
+		font-size: 28rpx;
+		color: #333;
+		
+		.arrow-down {
+			font-size: 20rpx;
+			color: #999;
+		}
+	}
+}
+
+.transaction-list {
+	background: #fff;
+	margin: 0 24rpx 24rpx;
+	border-radius: 16rpx;
+	padding: 24rpx;
+}
+
+.transaction-item {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 24rpx 0;
+	border-bottom: 1rpx solid #f0f0f0;
+	
+	&:last-child {
+		border-bottom: none;
+	}
+	
+	.item-left {
+		flex: 1;
+		
+		.item-title {
+			font-size: 30rpx;
+			color: #333;
+			margin-bottom: 8rpx;
+		}
+		
+		.item-time {
+			font-size: 24rpx;
+			color: #999;
+		}
+	}
+	
+	.item-amount {
+		font-size: 32rpx;
+		font-weight: bold;
+		
+		&.income {
+			color: #FF5030;
+		}
+		
+		&.expense {
+			color: #333;
+		}
+	}
+}
+
+.date-picker-popup,
+.type-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;
+}
+
+.picker-content {
+	width: 100%;
+	background: #fff;
+	border-radius: 24rpx 24rpx 0 0;
+	
+	.picker-header {
+		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: #FF9800;
+		}
+	}
+	
+	.picker-body {
+		padding: 24rpx;
+		max-height: 600rpx;
+		overflow-y: auto;
+		
+		.picker-item {
+			padding: 24rpx 0;
+			font-size: 30rpx;
+			color: #333;
+			border-bottom: 1rpx solid #f0f0f0;
+			
+			&:last-child {
+				border-bottom: none;
+			}
+			
+			&.active {
+				color: #FF9800;
+				font-weight: bold;
+			}
+		}
+	}
+}
+</style>

BIN
static/image/Iconly/Light/Calendar.png


BIN
static/image/back.png


BIN
static/image/bg_bankcard.png


BIN
static/image/bg_invitecard.png


BIN
static/image/bg_login.png


BIN
static/image/bg_qestion.png


BIN
static/image/bg_tab_login.png


BIN
static/image/bg_tab_login2.png


BIN
static/image/btn_bl.png


BIN
static/image/btn_sjtj.png


BIN
static/image/icon_ barrage_on.png


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است