فهرست منبع

第一次提交

puyao 1 ماه پیش
والد
کامیت
76a123d461
98فایلهای تغییر یافته به همراه7534 افزوده شده و 6746 حذف شده
  1. 8 0
      .idea/.gitignore
  2. 8 0
      .idea/modules.xml
  3. 6 0
      .idea/vcs.xml
  4. 12 0
      .idea/xiaohongqun_company_course_app.iml
  5. 21 110
      App.vue
  6. 63 20
      api/course.js
  7. 120 84
      api/courseManage.js
  8. 0 25
      api/crm.js
  9. 0 28
      api/qw.js
  10. 12 3
      api/user.js
  11. 20 11
      common/request.js
  12. 0 0
      components/chart.vue
  13. 75 60
      components/courseItem.vue
  14. 15 16
      components/dropdownPanel.vue
  15. 127 31
      components/liveCourse.vue
  16. 439 0
      components/living.vue
  17. 347 0
      components/qiweiUrgeCourse.vue
  18. 79 0
      components/tabbar/tabbar.vue
  19. 303 0
      components/userUrgeCourse.vue
  20. 124 35
      components/vipUserItem.vue
  21. 5 2
      manifest.json
  22. 260 190
      pages.json
  23. 24 8
      pages/auth/login.vue
  24. 563 0
      pages/auth/wxlogin.vue
  25. 46 5
      pages/common/launch.vue
  26. 102 0
      pages/course/course.vue
  27. 205 0
      pages/courseManage/course/becomeSale.vue
  28. 255 0
      pages/courseManage/course/courseVideo.vue
  29. 0 263
      pages/courseManage/course/index.vue
  30. 0 22
      pages/courseManage/course/living.vue
  31. 0 736
      pages/courseManage/dataIndex/index.vue
  32. 0 132
      pages/courseManage/index.vue
  33. 265 57
      pages/courseManage/manage/changeVip.vue
  34. 140 24
      pages/courseManage/manage/exprotList.vue
  35. 125 30
      pages/courseManage/manage/lableSetup.vue
  36. 173 135
      pages/courseManage/manage/manageDetail.vue
  37. 36 25
      pages/courseManage/manage/manageIndex.vue
  38. 1 1
      pages/courseManage/manage/userDataDetail.vue
  39. 146 128
      pages/courseManage/operation/index.vue
  40. 92 96
      pages/courseManage/statistics.vue
  41. 65 83
      pages/courseManage/vip/ManageDetail.vue
  42. 0 22
      pages/courseManage/vip/dropDownList.vue
  43. 0 1420
      pages/courseManage/vip/index.vue
  44. 1339 47
      pages/customer/index.vue
  45. 142 0
      pages/enterprise/enterprise.vue
  46. 744 6
      pages/index/index.vue
  47. 41 0
      pages/urgeCourse/urgeCourse.vue
  48. 0 43
      pages/user/ai/index.vue
  49. 0 168
      pages/user/courseSop/sop.vue
  50. 0 89
      pages/user/courseSop/sopLogsDetails.vue
  51. 0 302
      pages/user/courseSop/sopLosList.vue
  52. 0 131
      pages/user/crm/components/customerInfo.vue
  53. 0 225
      pages/user/crm/customerDetails.vue
  54. 0 235
      pages/user/crm/importWxUser.vue
  55. 0 193
      pages/user/crm/lineCustomer.vue
  56. 0 193
      pages/user/crm/myCustomer.vue
  57. 3 2
      pages/user/editUser.vue
  58. 102 144
      pages/user/index.vue
  59. 0 168
      pages/user/qwSop/sop.vue
  60. 0 90
      pages/user/qwSop/sopLogsDetails.vue
  61. 0 302
      pages/user/qwSop/sopLosList.vue
  62. 13 11
      pages/user/userInfo.vue
  63. 201 0
      pages/user/users/becomeVIP.vue
  64. 72 11
      pages/user/users/userInfo.vue
  65. 58 15
      pages/user/users/users.vue
  66. 223 0
      pages/user/wxuser.vue
  67. 301 566
      pages_course/video.vue
  68. 3 2
      project.config.json
  69. 10 1
      router/router.js
  70. BIN
      static/image/course_expiration_img.png
  71. BIN
      static/images/changeLable.png
  72. BIN
      static/images/home.png
  73. BIN
      static/images/home_select.png
  74. BIN
      static/images/icon_ai.png
  75. BIN
      static/images/icon_cust.png
  76. BIN
      static/images/icon_phone.png
  77. BIN
      static/images/jiantou.png
  78. BIN
      static/images/menu_info.png
  79. BIN
      static/images/my.png
  80. BIN
      static/images/my_select.png
  81. BIN
      static/images/order.png
  82. BIN
      static/images/order_select.png
  83. BIN
      static/images/report.png
  84. BIN
      static/images/report_select.png
  85. BIN
      static/images/send.png
  86. BIN
      static/images/sms.png
  87. BIN
      static/images/vipmage.png
  88. BIN
      static/logo.png
  89. BIN
      static/manergevip/Refresh.png
  90. BIN
      static/manergevip/about.png
  91. BIN
      static/manergevip/companyphone.png
  92. BIN
      static/manergevip/icon-down.png
  93. BIN
      static/manergevip/icon-pullup.png
  94. BIN
      static/manergevip/no-vip.png
  95. BIN
      static/manergevip/serve.png
  96. BIN
      static/manergevip/setup.png
  97. BIN
      static/manergevip/sop.png
  98. BIN
      static/manergevip/vip.png

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/xiaohongqun_company_course_app.iml" filepath="$PROJECT_DIR$/.idea/xiaohongqun_company_course_app.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 12 - 0
.idea/xiaohongqun_company_course_app.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 21 - 110
App.vue

@@ -10,19 +10,14 @@
 		},
 		onLaunch: function() {
 			console.log('App Launch')
-			uni.hideTabBar();
-			var that=this;
-			uni.$on('initSocket', () => {
-				that.initSocket()
-			})
-			uni.$on('sendMsg', (item) => {
-				that.sendMsg(item)
-			})
-			uni.$on('closeWebSocket', () => {
-				that.closeWebSocket()
-			})
+			// uni.hideTabBar();
 			
 		},
+		onLoad() {
+			 // #ifndef MP-WEIXIN 
+			    uni.hideNavigationBar(); // H5 隐藏导航栏
+			// #endif
+		},
 		onShow: function() {
 			console.log('App Show')
 		},
@@ -31,105 +26,9 @@
 		},
 		onUnload() {
 			
-			console.log(pingpangTimes)
-			clearInterval(pingpangTimes)
-			
 		},
 		methods:{
 			
-			closeWebSocket(){
-				if(socket!=null){
-					uni.closeSocket();
-				}
-				clearInterval(pingpangTimes)
-			},
-			initSocket(){
-				console.log("initSocket")
-				//创建一个socket连接
-				var userId=uni.getStorageSync('companyUserId') ;
-				var that=this;
-				console.log(wsUrl)
-				socket=uni.connectSocket({
-					url:wsUrl+userId,
-					multiple:true,
-					success: res=>{
-						console.log('WebSocket连接已打开!');
-						isSocketOpen=true
-						//先确保清除了之前的心跳定时器
-						clearInterval(pingpangTimes)
-						uni.onSocketMessage((res)=>{
-							console.log("收到消息")
-							const redata = JSON.parse(res.data);
-							console.log(redata);
-							if(redata.cmd=="heartbeat"){
-								  //心跳
-								  console.log("heartbeat")
-							}
-							else if(redata.cmd=="getWeixinId"){
-								uni.$emit('getWeixinId',redata); 
-							}
-							else if(redata.cmd=="getWeixinList"){
-								uni.$emit('getWeixinList',redata); 
-							}
-							else if(redata.cmd=="sendSop"){
-								uni.$emit('sendSop',redata); 
-							}
-							  
-						})
-						pingpangTimes=setInterval(()=>{
-							var userId=uni.getStorageSync('userId') ;
-							var data={cmd:"heartbeat",userId: "w-"+userId};
-							console.log(data)
-							uni.sendSocketMessage({
-								data:JSON.stringify(data),
-								success:()=>{
-									console.log('WebSocket发送心条数据!');
-								},
-								fail:()=>{
-									isSocketOpen=false
-								}
-							});
-						},5000)
-					},
-					error: res=>{
-						console.log(res)
-					},
-				})
-				//监听socket打开
-				uni.onSocketOpen(()=>{
-					isSocketOpen=true
-					console.log('WebSocket连接已打开!!');
-				})
-				//监听socket关闭
-				uni.onSocketClose(()=>{
-					isSocketOpen=false
-					console.log('WebSocket连接已关闭!');
-				})
-				//监听socket错误
-				uni.onSocketError(()=>{
-					isSocketOpen=false
-					console.log('WebSocket连接打开失败');
-				})
-				
-			},
-			sendMsg(data){
-				if(isSocketOpen){
-					var userId=uni.getStorageSync('companyUserId') ;
-					uni.sendSocketMessage({
-						data: JSON.stringify(data),
-						success:()=>{
-							
-							console.log("发送成功")
-						},
-						fail:()=>{
-							console.log("发送失败")
-						}
-					});
-					
-				}
-				
-			},
-		
 		}
 	}
 </script>
@@ -147,6 +46,18 @@
 		text-overflow: ellipsis;
 		white-space: nowrap;
 	}
+	.single-line-ellipsis {
+		width: 480rpx; /* 设置固定宽度 */
+		white-space: nowrap; /* 文本不换行 */
+		overflow: hidden; /* 隐藏超出部分 */
+		text-overflow: ellipsis; /* 超出部分用省略号表示 */
+	}
+	.single-ellipsis {
+		width: 260rpx; /* 设置固定宽度 */
+		white-space: nowrap; /* 文本不换行 */
+		overflow: hidden; /* 隐藏超出部分 */
+		text-overflow: ellipsis; /* 超出部分用省略号表示 */
+	}
 	.ellipsis2{
 		overflow:hidden; 
 		text-overflow:ellipsis;
@@ -215,7 +126,7 @@
 			color: $--base-color-gray;
 		}
 		.base-color-red{
-				color: $--base-color-red;
+				color:#ee0a25;
 		}
 		.base-color-dark {
 			color: $--base-color-dark;
@@ -241,10 +152,10 @@
 			background: $--base-bg2;
 		}
 		.base-bg-red{
-			background: $--base-bg-red;
+			background: #ee0a25;
 		}
 		.base-bg-f{
-			background-color: $--base-bg-f;
+			background-color:#fff;
 		}
 		.base-bg-f8{
 			background-color: $--base-color-f8;

+ 63 - 20
api/course.js

@@ -1,24 +1,67 @@
 import Request from '../common/request.js';
 let request = new Request().http
 
- export function getCourseSopList(data) {
- 	 return request('/app/courseSop/getCourseSopList',data,'GET');
+export function loginByMp(data) {
+ 	 return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
  }
- 
- 
- 
- export function getCourseSopLogsList(data) {
- 	 return request('/app/courseSop/getCourseSopLogsList',data,'GET');
- }
- 
- 
- export function getCourseSopLogsDetail(data) {
- 	 return request('/app/qwSop/getCourseSopLogsDetail',data,'GET');
- }
- 
- 
- 
- 
- export function updateCourseSopLogs(data) {
- 	 return request('/app/qwSop/updateCourseSopLogs',data,'POST','application/json;charset=UTF-8');
- }
+
+// 获取真实链接
+export function getRealLink(data) {
+	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+
+// h5课程简介
+export function getH5CourseByVideoId(data) {
+	return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+	return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+
+// 答题发红包
+export function courseAnswer(data) {
+	return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// // 记录看课时间(旧)
+// export function getFinishCourseVideo(data) {
+// 	return request('/app/course/getFinishCourseVideo', data, 'POST', 'application/json;charset=UTF-8');
+// }
+
+// 记录看课时间(新)
+export function getFinishCourseVideo(data) {
+	return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 关注客服
+export function getIsAddKf(data) {
+	return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+	return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 每十分钟获得积分
+export function getIntegralByH5Video(data) {
+	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 发送奖励
+export function sendReward(data) {
+	return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 播放错误上报
+export function getErrMsg(data) {
+	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+}
+
+
+// 获取getWxConfig
+export function getWxConfig(data) {
+	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}

+ 120 - 84
api/courseManage.js

@@ -3,39 +3,29 @@ let request = new Request().http
 
 // 统计经销商会员总数和群管总数
 export function getCompanyUserAndUserCount(data) {
-	return request('/fsUser/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
+	return request('/app/fs/user/firstPage/summaryCount', data,'GET','application/json;charset=UTF-8');
 }
 
 // 课程统计
 export function getCourseCount(data) {
-	return request('/fsCourseWatchLog/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
-}
-
-// 答题统计
-export function getQuesCount(data) {
-	return request('/fsAnswerLog/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
-}
-
-// 红包统计
-export function getRecPacketCount(data) {
-	return request('/fsCourseRedPacket/getRecPacketCount', data,'POST','application/json;charset=UTF-8');
+	return request('/app/fs/user/firstPage/statistics', data,'GET','application/json;charset=UTF-8');
 }
 
 // 获取课程列表
 export function getFsCourseList(data) {
-	return request('/fsCourse/getFsCourseList', data,'POST','application/json;charset=UTF-8');
+	return request('/app/fs/course/courseList', data,'GET','application/json;charset=UTF-8');
 }
 
 // 根据训练营查询节目
 export function getCourseVdieoList(data) {
-	const url = '/fsCourse/getCourseVdieoPageList?courseId='+data.courseId +'&pageNum='+data.pageNum + '&pageSize='+data.pageSize+'&status='+data.status
-	return request(url, null,'POST','application/json;charset=UTF-8');
+	const url = '/app/fs/course/pageList?periodId='+data.periodId +'&pageNum='+data.pageNum + '&pageSize='+data.pageSize+'&keyword='+data.keyword
+	return request(url, null,'GET','application/json;charset=UTF-8');
 }
 
-// 根据观看记录查询用户
+// 根据观看记录查询用户(课程分析)
 export function getUserLogListByCourseId(data) {
-	const url = '/fsCourse/getUserLogListByCourseId'
-	return request(url, data,'POST','application/json;charset=UTF-8');
+	const url = '/app/fs/course/participationRecord'
+	return request(url, data,'GET','application/json;charset=UTF-8');
 }
 
 // 修改用户
@@ -46,55 +36,43 @@ export function updateFsUser(data) {
 
 //根据经销商或群管查询会员列表
 export function getfsuserList(data){
-	const url = '/fsUser/getFsUserList'
+	const url = '/app/fs/user/pageList'
 	return request(url, data, 'POST','application/json;charset=UTF-8')
 }
 
-//查询公司标签列表
+//查询会员标签列表
  export function getcompanyTaglist(data) {
- 	 return request('/company/companyTag/list',data,'GET');
+ 	 return request('/app/fs/user/tagList',data,'GET');
  }
   
   //添加黑名单
   export function Addblacklist(data){
-  	const url = '/black'
+  	const url = '/app/fs/user/disabled'
   	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
   //修改公司会员打标签
   export function changeLable(data){
-  	const url = '/company/companyTagUser/edit'
-  	return request(url, data, 'POST','application/json;charset=UTF-8')
-  }
-  
-  //修改公司会员打标签
-  export function getBlackvipNumber(data){
-  	const url = '/black/blackCount'
-  	return request(url, data, 'POST','application/json;charset=UTF-8')
-  }
-  
-  //查询被拉黑的用户列表
-  export function getBlackvipList(data){
-  	const url = '/fsUser/getBlackUserList'
+  	const url = '/app/fs/user/changeUserTags'
   	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
   //查询答题数据(会员详情)
   export function getanswerlist(data){
-  	const url = '/fsAnswerLog/getUserAnswerCount'
-  	return request(url, data, 'POST','application/json;charset=UTF-8')
+  	const url = '/app/fs/user/details'
+  	return request(url, data, 'GET','application/json;charset=UTF-8')
   }
   
   //移除黑名单(会员详情)
   export function removebalcklist(data){
-  	const url = '/black/delete'
-  	return request(url, data, 'GET','application/json;charset=UTF-8')
+  	const url = '/app/fs/user/enabled'
+  	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
-  
+
   //生成小节课程 (链接)
   export function sharecourselink(data){
-  	const url = '/fsCourseWatchLog/createLinkUrl'
+  	const url = '/app/fs/course/courseSortLink'
   	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
@@ -104,46 +82,39 @@ export function getfsuserList(data){
   	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
-  //查询用户详情
-  export function getuserdetail(data){
-  	const url = '/fsUser'
-  	return request(url, data, 'GET','application/json;charset=UTF-8')
-  } 
-  
-  //查询看课转化率
+  //查询看课转化率(漏斗图)
   export function getcourseRate(data){
-  	const url = '/fsCourse/getConversion'
-  	return request(url, data, 'POST','application/json;charset=UTF-8')
+  	const url = '/app/fs/user/firstPage/graphic'
+  	return request(url, data, 'GET','application/json;charset=UTF-8')
   } 
-  
-  //标签统计
-  export function getlableNum(data){
-  	const url = '/company/companyTag/getTagCount'
+  //查询详情看课转化率(漏斗图)
+  export function getcourseRates(data){
+  	const url = '/app/fs/user/graphic/details'
   	return request(url, data, 'GET','application/json;charset=UTF-8')
   } 
   
 //根据经销商或群管查询会员总数
   export function getvipNum(data){
-  	const url = '/fsUser/getFsUserListCount'
-  	return request(url, data, 'POST','application/json;charset=UTF-8')
+  	const url = '/app/fs/user/totalNumber'
+  	return request(url, data, 'GET','application/json;charset=UTF-8')
   } 
   
 //根据经销商 运营:查询课程数,群管数,参与会员
 export function getshopCoursenum(data){
-	const url = '/fsCourse/getCourseVdieoCount'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
+	const url = '/app/fs/user/statistics/details'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 } 
 
 //根据经销商 获取群管排名
 export function getGroupRanklist(data){
-	const url = '/companyUser/getCompanyUserTOP20'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
+	const url = '/app/fs/user/firstPage/userRanking'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 } 
 
 //根据经销商 获取课程排名
 export function getCourseRanklist(data){
-	const url = '/fsCourse/getCourseTOP20'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
+	const url = '/app/fs/user/firstPage/courseRanking'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 } 
 
 //根据经销商 获取红包领取记录
@@ -160,20 +131,20 @@ export function getuserbalance(data){
 
 //根据经销商 查询所属群管
 export function getusergroup(data){
-	const url = '/companyUser/getCompanyUserList'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
+	const url = '/app/companyUser/getCompanyUserList'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 } 
 
 //根据经销商 新增公司标签
 export function addCompanyLabel(data){
-	const url = '/company/companyTag'
+	const url = '/app/companyTag/add'
 	return request(url, data, 'POST','application/json;charset=UTF-8')
 } 
 
 //根据经销商 删除公司标签
 export function deleteCompanyLabel(data){
-	const url = '/company/companyTag/delete'
-	return request(url, data, 'GET','application/json;charset=UTF-8')
+	const url = '/app/companyTag/delete?tagIds='+data
+	return request(url, data, 'POST','application/json;charset=UTF-8')
 }
 
 //根据经销商 获取红包价格表
@@ -184,44 +155,38 @@ export function getredPrice(data){
 
 //根据经销商 查询所属群管列表
 export function getgroupList(data){
-	const url = '/companyUser/CompanyUserListByCompanyId'
+	const url = '/app/companyUser/companyUserListByCompanyId'
 	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
 //根据经销商 查询群管的课程
 export function getcourseList(data){
-	const url = '/fsCourse/courseList'
+	const url = '/app/fs/user/courseAnalysis'
 	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
 //根据经销商 修改群管信息
 export function updategroupinfo(data){
-	const url = '/companyUser/updateCompanyUser'
+	const url = '/app/companyUser/updateUserInfo'
 	return request(url, data, 'POST','application/json;charset=UTF-8')
 }
 
 //根据经销商 获取群管详情
 export function getGroupDetail(data){
-	const url = '/companyUser/getCompanyUser'
+	const url = '/app/companyUser/getCompanyUserInfo?companyUserId'
 	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
-//根据经销商 批量更换会员归属
-export function changevipUser(data){
-	const url = '/companyUser/updateCompanyUseruser'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
-}
-
 //根据经销商  修改全部会员群管
 export function changevipUserAll(data){
-	const url = '/companyUser/updateAllCompanyUser'
-	return request(url, data, 'GET','application/json;charset=UTF-8')
+	const url = '/app/companyUser/changeUserParentApply'
+	return request(url, data, 'POST','application/json;charset=UTF-8')
 }
 
 //根据经销商  查询标签下会员
 export function gettagsUser(data){
-	const url = '/company/companyTagUser/getUserList'
-	return request(url, data, 'POST','application/json;charset=UTF-8')
+	const url = '/app/companyTag/tagSubUsers'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
 // h5课程简介
@@ -256,7 +221,7 @@ export function getaddcourseLog(data) {
 
 // 生成海报和看图二维码
 export function buildCode(data) {
-	return request('/fsCourse/generatePostAndQrCode',data, 'POST',  'application/json;charset=UTF-8');
+	return request('/app/fs/course/courseImage',data, 'POST',  'application/json;charset=UTF-8');
 }
 
 //是否可以看课
@@ -281,10 +246,81 @@ export function becomeVipuser(data) {
 
 //生成分享海报,新建会员
 export function becomeVipuserImg(data) {
-	return request('/companyUser/generatePostAndQrCode', data, 'POST', 'application/json;charset=UTF-8');
+	return request('/app/fs/user/userImage', data, 'POST', 'application/json;charset=UTF-8');
 }
 
 //获取jssdk
 export function getSDK(data){
-	return request('/app/wx/mp/authPage', data, 'GET', 'application/json;charset=UTF-8');
+	return request('/app/wx/mp/getWeiXinConfig', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取公司所有销售
+export function getusersales(data){
+	return request('/app/fs/user/allCompanyUser', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取催课面板
+export function geturgeCourse(data){
+	return request('/app/qwWorkTask/list', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取企微账号
+export function geturgeqiwei(data){
+	return request('/app/qwWorkTask/getMyQwUserList', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取课程视频详情
+export function getcourseDetail(data){
+	return request('/app/fs/course/videoDetails', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//通过销售审核
+export function subsalesaudit(data){
+	return request('/app/user/audit?userIds='+data, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//解除销售黑名单
+export function changesalesState(data){
+	return request('/app/user/changeUserState?userIds='+data,data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//注册销售账户
+export function loginsales(data){
+	return request('/app/companyUser/resisterCompanyUser',data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//获取课程小节下拉列表
+export function getvideolist(data){
+	return request('/app/fs/course/videoList',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取公司所有标签
+export function getallTags(data){
+	return request('/app/companyTag/list',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取更换会员归属审核列表
+export function getchangeslist(data){
+	return request('/app/companyUser/applyList',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//更改用户姓名,备注
+export function getchangesUserInfo(data){
+	return request('/app/fs/user/changeUserInfo',data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//管理 获取会员人数等
+export function getmanagepopnum(data){
+	return request('/app/fs/user/companyUser/summaryCount',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+
+//管理 获取管理课程统计
+export function getmanagecourse(data){
+	return request('/app/fs/user/companyUser/details',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//催课 获取会员注册
+export function getWorkTask(data){
+	return request('/app/qwWorkTask/getUserList',data,  'GET', 'application/json;charset=UTF-8');
 }

+ 0 - 25
api/crm.js

@@ -1,25 +0,0 @@
-import Request from '../common/request.js';
-let request = new Request().http
-
-
- export function getLineCustomerList(data) {
- 	 return request('/app/crmCustomer/getLineCustomerList',data,'GET');
- }
- 
- 
- export function getMyCustomerList(data) {
- 	 return request('/app/crmCustomer/getMyCustomerList',data,'GET');
- }
- 
- export function getCustomerDetails(data) {
- 	 return request('/app/crmCustomer/getCustomerDetails',data,'GET');
- }
- 
- export function editCrmCustomer(data) {
- 	 return request('/app/crmCustomer/editCrmCustomer',data,'POST','application/json;charset=UTF-8');
- }
- 
- export function addCrmCustomer(data) {
- 	 return request('/app/crmCustomer/addCrmCustomer',data,'POST','application/json;charset=UTF-8');
- }
- 

+ 0 - 28
api/qw.js

@@ -1,28 +0,0 @@
-import Request from '../common/request.js';
-let request = new Request().http
-
-
- export function getConfigSignature(data) {
- 	 return request('/qw/qwJsApi/getConfigSignature',data,'GET');
- }
- 
- 
- export function getQwSopList(data) {
- 	 return request('/app/qwSop/getQwSopList',data,'GET');
- }
- 
- 
- export function getQwSopLogsList(data) {
- 	 return request('/app/qwSop/getQwSopLogsList',data,'GET');
- }
- 
- 
- export function getQwSopLogsDetail(data) {
- 	 return request('/app/qwSop/getQwSopLogsDetail',data,'GET');
- }
- 
- 
- 
- export function updateQwSopLogs(data) {
- 	 return request('/app/qwSop/updateQwSopLogs',data,'POST','application/json;charset=UTF-8');
- }

+ 12 - 3
api/user.js

@@ -24,8 +24,17 @@ let request = new Request().http
  }
  
  export function loginByMp(data) {
- 	 return request('/app/user/loginByMp',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/app/wx/h5/mp/loginByMp',data,'POST','application/json;charset=UTF-8');
+ }
+ // 成为会员
+ export function registerCourses(data) {
+ 	 return request('/app/fs/user/beMember',data,'POST','application/json;charset=UTF-8');
+ }
+ export function setUserInfo(data) {
+ 	 return request('/app/user/setUserInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ //微信小程序登录
+ export function loginByMiniApp(data) {
+ 	 return request('/app/wx/miniapp/login',data,'POST','application/json;charset=UTF-8');
  }
- 
- 
  

+ 20 - 11
common/request.js

@@ -2,10 +2,10 @@
 export default class Request {
 	http(router, data = {}, method,contentType) {
 		let that = this;
-		// let path = 'http://42.194.245.189:8007';
-		// let path = 'http://42.194.245.189:8007';
-		// let path = 'http://192.168.10.155:8007'
-		let path = 'https://h5api.wxcourse.cdwjyyh.com'
+		// let path = 'http://1.95.39.2:7015'
+		let path = 'http://192.168.10.131:7015'
+		// let path = 'http://192.168.10.150:7015'
+		// let path = 'http://120.46.11.55:7015'//正式
 		uni.setStorageSync('requestPath',path)
 		// uni.showLoading({
 		// 	title: '加载中'
@@ -34,17 +34,26 @@ export default class Request {
 					//收到开发者服务器成功返回的回调函数
 					if(res.data.code==401){//没有权限直接退出到登录界面
 						let pages = getCurrentPages();
-						let url = pages[ pages.length - 1]; //当前页页面实例
+						let currentPage  = pages[ pages.length - 1]; //当前页页面实例
+						
+						 // 条件编译判断平台,设置不同登录页路径
+						  let loginPage = '';
+						  // #ifdef H5
+						  loginPage = '/pages/auth/login';
+						  // #endif
+						  // #ifdef MP-WEIXIN
+						  loginPage = '/pages/auth/wxlogin';
+						  // #endif
+						  
 						//如果登录界面已打开,自动关闭
-						if(url!=undefined&&url.route=="pages/auth/login"){
-							resolve(res.data)
-							return;
-						}
+						if (currentPage.route === loginPage.replace(/^\//, '')) {
+						    resolve(res.data);
+						    return;
+						  }
 						uni.reLaunch({
-							url:'/pages/auth/login',
+							url:loginPage,
 							success: () => {
 								uni.hideLoading();
-								
 							},
 							fail: () => {
 								uni.hideLoading();

+ 0 - 0
pages/courseManage/components/chart.vue → components/chart.vue


+ 75 - 60
pages/courseManage/components/courseItem.vue → components/courseItem.vue

@@ -7,7 +7,7 @@
 			</view>
 			<view class="courselist-con-r">
 				<view @click.passive.stop>
-					<text class="more-t">{{info.title}}</text>
+					<text class="more-t ">{{info.title}}</text>
 					<view class="btn_icon" style="margin-left: 5px;" @click="copyId">ID
 						<image src="@/static/images/copy_icon.png" mode="aspectFill"></image>
 					</view>
@@ -21,23 +21,26 @@
 				</view>
 			</view>
 		</view>
-		<view class="courselist-footer x-f">
-			<view class="courselist-footer-item x-c" v-show="user.userType==1" @click="handleShare"><u-icon
+		<view class="courselist-footer x-f ">
+			<view class="courselist-footer-item x-c "  @click="handleShare"><u-icon
 					name="share-square" color="#1677ff" size="18"></u-icon>分享课程</view>
 			<view class="courselist-footer-item x-c shishi" v-show="activeTab == 1" @click="handleStatistics"><u-icon
-					name="share-square" color="#1677ff" size="18"></u-icon>实时统计</view>
+					name="share-square" color="#1677ff" size="18"></u-icon>课程统计</view>
 			<view class="courselist-footer-item x-c shuju" v-show="activeTab == 2" @click="handleStatistics"><u-icon
 					name="share-square" color="#1677ff" size="18"></u-icon>数据统计</view>
 		</view>
 		<!-- 分享弹窗 -->
 		<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare" @open="openShare">
 			<view class="sharePop x-ac">
-				<view class="sharePop-item y-f" @click="shareimg">
+				<!--#ifdef MP-WEIXIN-->
+				<view class="sharePop-item y-f card-share" >
 					<image src="@/static/images/card_icon.png" mode="aspectFill"
 						style="width: 80rpx; height: 80rpx;margin-top: 20rpx;"></image>
 					<view style="font-weight: bold;margin-bottom: 4px;">生成卡片</view>
 					<view style="font-size: 12px;color: #888;">指导分享轻松转发</view>
+					<button open-type="share" class="share" @click="handleClick()">分享课程</button>
 				</view>
+				<!--#endif-->
 				<view class="sharePop-item y-f" @click="buildimg">
 					<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
 					<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
@@ -64,17 +67,17 @@
 		<u-notify ref="uNotify" message=""></u-notify>
 		<!-- 生成海报 -->
 		<u-popup :show="setImg" @close="closeimg" :round="12" style="z-index: 999;">
-			<view class="w100 h400">
-				<image :src="codeLink.url" class="codeimg w660" mode="widthFix"></image>
+			<view class="w100 h540 center">
+				<image :src="codeLink.url" mode="aspectFill" ></image>
 			</view>
-			<view class="justify-around mtb40">
+			<view class="justify-around mb40">
 				<!-- <view class="column justify-center align-center" @click="shareimg">
 					<image src='@/static/image/wechat.png' class="w80 h80"></image>
 					<view class="mt10">微信好友</view>
 				</view> -->
 				<view class="column justify-center align-center" @click="downimg">
 					<image src='@/static/image/downicon.png' class="w80 h80"></image>
-					<view class="mt10 mb100">长按海报保存</view>
+					<view class=" mb10">长按图片保存</view>
 				</view>
 			</view>
 		</u-popup>
@@ -86,7 +89,7 @@
 				<view class="column colorf fs32 xu-box fs40
 				align-center justify-center">
 					<view class="justify-center">点击右上角
-						<image src="../../../static/image/wxmore.png" class="w50 h50 mlr10"></image>
+						<image src="@/static/image/wxmore.png" class="w50 h50 mlr10"></image>
 					</view>
 					<view class="mt20">选择 “转发给朋友”</view>
 					<view style="color: #cbcbcb;" class="fs28 mt40">点击任意位置关闭弹窗</view>
@@ -121,6 +124,9 @@
 					return {}
 				}
 			},
+			parentMethod:{
+				type: Function
+			}
 		},
 		data() {
 			return {
@@ -138,7 +144,7 @@
 				isLongPress: false,
 				painterSrc: '',
 				showzhidao: false,
-				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
+				imgs:'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png'
 			}
 		},
 		onLoad() {},
@@ -147,6 +153,17 @@
 
 		},
 		methods: {
+			handleClick(){
+				console.log(123)
+				this.parentMethod();
+				 this.$emit('trigger-share', {
+					 title: this.info.courseName+this.info.title,
+					 path: "/pages_course/viedo",
+					 params: { companyId: this.user.companyId, companyUserId: this.user.userId,
+					 courseId:this.info.courseId,videoId:this.info.courseId },
+					 img:this.info.thumbnail||this.imgs
+				   });
+			},
 			// 获取jssdk
 			getjssdklist() {
 				const param = {
@@ -163,16 +180,16 @@
 					});
 				})
 			},
-
 			shareimg() {
 				let self = this
 				//分享好友
-				// 配置--你到时候把配置全局 --就是这些东西  调接口拿
+				// 配置--配置全局
 				console.log(self.info.thumbnail + self.copylink, 11111)
 				wx.ready(function() { //需在用户可能点击分享按钮前就先调用
 					wx.updateAppMessageShareData({
 						title: self.info.courseName + self.info.title, // 分享标题
-						desc: self.info.title, // 分享描述
+						desc: self.info.description, // 分享描述
+						// link: self.copylink,
 						link: self.copylink,
 						// 分享链接,该链接域名或路径必须与当前页面对应的公众 号JS安全域名一致
 						imgUrl: self.info.thumbnail||self.imgs, // 分享图标
@@ -188,21 +205,6 @@
 								duration: 1000
 							});
 						},
-						// fail: function(err) {
-						// 	console.log(err);
-						// 	uni.showToast({
-						// 		title: JSON.stringify(err),
-						// 		icon: 'none',
-						// 		duration: 2000
-						// 	})
-						// },
-						// complete: function(res) {
-						// 	uni.showToast({
-						// 		title: JSON.stringify(res),
-						// 		icon: 'none',
-						// 		duration: 2000
-						// 	})
-						// },
 						
 					})
 
@@ -288,14 +290,17 @@
 					companyId: this.user.companyId,
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
-					time: this.time,
-					type: this.type,
+					effectiveDuration: this.time,
 					videoId: this.info.videoId,
+					imgUrl:this.info.thumbnail,
+					title:this.info.title,
+					duration:this.info.duration
 				}).then(res => {
 					if (res.code == 200) {
-						this.codeLink = res.data
+						this.codeLink = res.posterImage
 						this.setImg = true
 						this.getlink()
+						console.log(this.codeLink)
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -305,18 +310,19 @@
 				})
 			},
 			toCourseDetail(info) {
-
 				uni.navigateTo({
 					// url: '/pages/courseManage/course/learning?course='+JSON.stringify(info)
-					url: `/pages/courseManage/course/learning?course=${JSON.stringify(info)}&isvip=1`
-					// url:'/pages/courseManage/course/learning?course=JSON.stringify(info)&param2=2'
+					// url: `/pages/courseManage/course/learning?course=${JSON.stringify(info)}&isvip=1`
+					url:'/pages/courseManage/course/courseVideo?videoId='+info.videoId
 				})
 
 			},
 			handleShare() {
 				this.showShare = true
+				// #ifdef H5
 				this.getjssdklist()
-				this.getlink('preload'); // 提前加载链接
+				// #endif
+				// this.getlink('preload'); // 提前加载链接
 			},
 			closeShare() {
 				this.showShare = false
@@ -338,16 +344,15 @@
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
 					time: this.time,
-					type: this.type,
 					videoId: this.info.videoId,
 				}
 				sharecourselink(params).then(res => {
 					if (res.code == 200) {
-						this.copylink = res.data
+						this.copylink = res.url
 						if (this.copylink.startsWith('http://')) {
 							this.copylink = this.copylink.replace('http://', 'https://');
 						  }
-						console.log(this.copylink)
+						// console.log(this.copylink)
 						setTimeout(() => {
 							uni.setClipboardData({
 								data: this.copylink,
@@ -382,12 +387,12 @@
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
 					time: this.time,
-					type: this.type,
+					// type: this.type,
 					videoId: this.info.videoId,
 				}
 				sharecourselink(params).then(res => {
 					if (res.code == 200) {
-						this.copylink = res.data
+						this.copylink = res.url
 						// 强制使用 HTTPS
 						  if (this.copylink.startsWith('http://')) {
 							this.copylink = this.copylink.replace('http://', 'https://');
@@ -409,6 +414,7 @@
 					duration: this.info.duration,
 					fileId: this.info.fileId,
 					courseName: this.info.courseName,
+					videoId:this.info.videoId,
 				}
 				uni.navigateTo({
 					url: '/pages/courseManage/statistics?info=' + JSON.stringify(info)
@@ -416,17 +422,21 @@
 			},
 			copyId() {
 				uni.setClipboardData({
-					data: this.info.fileId,
+					data: this.info.title,
 					success: () => {
-						this.$refs.uNotify.show({
-							top: 0,
-							type: 'success',
-							// color: '#000',
-							// bgColor: '#e8e8e8',
-							message: '复制课程ID成功',
-							duration: 1000 * 2,
-							fontSize: 20,
-							safeAreaInsetTop: true
+						// this.$refs.uNotify.show({
+						// 	top: 0,
+						// 	type: 'success',
+						// 	// color: '#000',
+						// 	// bgColor: '#e8e8e8',
+						// 	message: '复制课程标题成功',
+						// 	duration: 1000 * 2,
+						// 	fontSize: 20,
+						// 	safeAreaInsetTop: true
+						// })
+						uni.showToast({
+							icon: 'none',
+							title: '复制课程标题成功'
 						})
 					}
 				});
@@ -436,6 +446,18 @@
 </script>
 
 <style scoped lang="scss">
+	.card-share{
+		position: relative;
+	}
+	.share{
+			display: inline-block;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			opacity: 0;
+		}
 	.imgshe {
 		display: flex;
 		flex-direction: row-reverse
@@ -451,13 +473,6 @@
 		}
 	}
 
-	.codeimg {
-		position: absolute;
-		z-index: 99999;
-		left: 40rpx;
-		top: 40rpx;
-	}
-
 	#codeurl {
 		position: relative;
 	}
@@ -470,8 +485,8 @@
 
 	.sharePop {
 		background-color: #fff;
-		padding: 50px 0;
-		padding-bottom: 100px;
+		padding: 20px 0;
+		padding-bottom: 60px;
 		border-radius: 20px 20px 0 0;
 
 		&-item {

+ 15 - 16
pages/courseManage/components/dropdownPanel.vue → components/dropdownPanel.vue

@@ -7,13 +7,13 @@
 					v-for="(item, index) in navData" :key="index" @click="navClick(item,index)">
 					<view v-if="item.special&&item.name=='批量'" class="x-f" style="align-items: end;">
 						<u-icon name="file-text" :color="index === actNav ?'#2979ff':'#222'" size="20"></u-icon>
-						{{index === actNav ? '取消批量':'批量'}}
+						{{index === actNav ? '取消':'批量'}}
 					</view>
 					<template v-else>
 						<text style="width: max-content;">{{item.name}}</text>
-						<image src="https://i.loli.net/2020/07/15/QsHxlr1gbSImvWt.png" mode="" class="icon-triangle"
-							v-if="index === actNav"></image>
-						<image src="https://i.loli.net/2020/07/15/xjVSvzWcH9NO7al.png" mode="" class="icon-triangle"
+							<image src="/static/manergevip/icon-pullup.png" mode="" class="icon-triangle"
+								v-if="index === actNav"></image>
+						<image src="/static/manergevip/icon-down.png" mode="" class="icon-triangle"
 							v-else></image>
 					</template>
 				</view>
@@ -39,10 +39,10 @@
 				type: Number,
 				default: 40
 			},
-			// top: {
-			//     type: String,
-			//     default: 'calc(var(--window-statsu-bar) + 44px)'
-			// },
+			top: {
+			    type: String,
+			    default: ''
+			},
 			border: {
 				type: Boolean,
 				default: false
@@ -72,7 +72,6 @@
 		},
 		data() {
 			return {
-				top: 0,
 				navData: [],
 				popupShow: false,
 				showMask: false,
@@ -97,13 +96,13 @@
 		},
 		mounted() {
 			const query = uni.createSelectorQuery().in(this);
-			query
-				.select(".filter-wrapper")
-				.boundingClientRect((data) => {
-					// console.log(data)
-					this.top = data.top + 'px'
-				})
-				.exec();
+			// query
+			// 	.select(".filter-wrapper")
+			// 	.boundingClientRect((data) => {
+			// 		// console.log(data)
+			// 		this.top = data.top + 'px'
+			// 	})
+			// 	.exec();
 		},
 		methods: {
 			reset() {

+ 127 - 31
pages/courseManage/live/index.vue → components/liveCourse.vue

@@ -23,28 +23,41 @@
 					<text>{{item.name}}</text><u-icon class="arrow-down" name="arrow-down" :color="searchbarNav == index ?'#1677ff':'#999'" size="12"></u-icon>
 				</view>
 			</view> -->
-			<view>
-				<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+			<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+				<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds" 
+					:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
+					@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
+					:upper-threshold="100" :lower-threshold="100" @refresherabort="triggereds = false"
+					@scrolltolower="reachBottoms">
+					<view  class="justify-between align-center mb20 mlr20 ">
+						<u-search placeholder="搜索训练营" v-model="keyword" :showAction="false" height="30px"
+							@search='searchKeyword'></u-search>
+					</view>
 					<view v-if="searchbarNav == 0">
 						<view class="boxnav x-bc">
 							<view class="boxnav-item" v-for="(item,index) in courseList" :key="index">
 								<view class="boxnav-item-info one-t"
-									:class="courserIndex == item.courseId ? 'boxnav-active':''"
-									@click="handleCourse(item)">{{item.courseName}}</view>
+									:class="courserIndex == index ? 'boxnav-active':''"
+									@click="handleCourse(item,index)">{{item.periodName}}</view>
 							</view>
 						</view>
 					</view>
-				</dropdownPanel>
-			</view>
+					<u-loadmore :status="status" />
+				</scroll-view>
+			</dropdownPanel>
+		</view>
+		<view  class="justify-between align-center mb20 mlr20 mt20 ">
+			<u-search placeholder="请输入课程名称" v-model="keywordlist" :showAction="false" height="30px"
+				@search='searchKeywordlist' bgColor='#fff'></u-search>
 		</view>
 		<view class="container-right" >
 			<scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true" :refresher-triggered="triggered"
-				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
+				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh" :scroll-top='scrollTop'
 				@refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
-				@refresherabort="triggered = false" @scrolltolower="reachBottom">
+				@refresherabort="triggered = false" @scrolltolower="reachBottom" @scroll="scroll">
 				<view class="list">
 					<courseItem :from="'course'" :activeTab="1" v-for="(item,index) in dataList" :key="index"
-						:info="item" />
+						:info="item"  @trigger-share="handleShare" :parent-method="parentMethod"/>
 					<u-loadmore :status="loadStatus" />
 				</view>
 			</scroll-view>
@@ -53,19 +66,19 @@
 </template>
 
 <script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import {
 		getFsCourseList,
 		getCourseVdieoList
 	} from "@/api/courseManage.js"
-	import dropdownPanel from "../components/dropdownPanel.vue"
-	import courseItem from "../components/courseItem.vue"
+	import dropdownPanel from "@/components/dropdownPanel.vue"
+	import courseItem from "@/components/courseItem.vue"
 	export default {
-		mixins: [MescrollMixin],
+		name:"liveCourse",
 		components: {
 			courseItem,
 			dropdownPanel
 		},
+		props: ['parentMethod'],
 		data() {
 			return {
 				user: {},
@@ -78,13 +91,12 @@
 					// 	value: 1,
 					// },
 				],
-				defaultIndex: [0, 0],
 				contentH: 0,
 				activeTab: 1,
 				courseList: [],
 				courseId: '',
 				searchbarNav: 0,
-				courserIndex: 0,
+				courserIndex: '',
 				searchbar: [{
 						name: '训练营-营期'
 					},
@@ -119,6 +131,20 @@
 				},
 				triggered: false,
 				loadStatus: 'loadmore',
+				//课程选择列表
+				pageNum:1,
+				pageSize: 10,
+				triggereds: false,
+				status: 'loadmore',
+				keyword:'',
+				isEnableds:true,
+				keywordlist:'',
+				actid:'',
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+				shareConfig:''
 			}
 		},
 		mounted() {
@@ -128,35 +154,96 @@
 			this.getFsCourseList()
 		},
 		methods: {
+			handleShare(config) {
+			      // 保存分享配置到父页面数据
+			      this.shareConfig = config;
+			      console.log(config)
+				  this.$emit('child-data-update', this.shareConfig);
+			      // 调起分享面板(微信小程序需主动调用)
+			      // #ifdef MP-WEIXIN
+			      uni.showShareMenu();
+			      // #endif
+			  },
+			scroll: function(e) {
+				// console.log(e)
+				this.old.scrollTop = e.detail.scrollTop
+			},
 			onChange(index) {
 				this.searchbarNav = index
 			},
 			reset() {
-				this.courserIndex = ''
+				this.courseId = ''
+				this.keyword=''
+				this.courseList=[]
+				this.getFsCourseList()
 			},
-			handleCourse(item) {
-				this.courserIndex = item.courseId
+			handleCourse(item,index) {
+				this.courserIndex = index
+				this.actid=item.periodId
 			},
 			confirm() {
-				this.courseId = this.courserIndex
+				this.courseId = this.actid
 				console.log(this.courseId)
+				this.params.pageNum=1
+				this.getListData()
+			},
+			searchKeyword(value){
+				this.courseList=[]
+				this.keyword = value
 				this.getFsCourseList()
 			},
+			searchKeywordlist(value){
+				this.dataList=[]
+				this.keywordlist = value
+				this.getListData()
+			},
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getFsCourseList('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottoms() {
+				// status这个是加载状态
+				if (this.status === 'loadmore') {
+					this.status = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getFsCourseList() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
 			// 训练营
-			getFsCourseList() {
+			getFsCourseList(type) {
 				const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
 				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
+					pageNum:this.pageNum,
+					pageSize:this.pageSize,
+					keyword:this.keyword
 				}
 				getFsCourseList(param).then(res => {
 					if (res.code == 200) {
-						this.courseList = res.data || []
-						// this.courseId = this.courseList && this.courseList.length > 0 ? this.courseList[0]
-						// 	.courseId : ''
-						// this.searchbar[0].name = this.courseList && this.courseList.length > 0 ? this.courseList[0]
-						// 	.courseName : '训练营-营期'
+						if (type == 'refresh') {
+							this.courseList = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.courseList = [...this.courseList, ...res.data.list]
+						}
+						if ( res.data.isLastPage) {
+							this.status = 'nomore'
+						} else {
+							this.status = 'loadmore'
+						}
+						this.searchbar[0].name = this.courseList && this.courseList.length > 0 ? this.courseList[0]
+							.courseName : '训练营-营期'
 							console.log(this.courseId)
 						// this.mescroll.resetUpScroll()
 						this.getListInit()
@@ -187,8 +274,8 @@
 				})
 				this.loadStatus = 'loading'
 				const result = await getCourseVdieoList({
-					courseId: this.courseId,
-					status: '',
+					periodId: this.courseId,
+					keyword:this.keywordlist,
 					...this.params
 				})
 				if (result) {
@@ -207,6 +294,14 @@
 					} else {
 						this.loadStatus = 'loadmore';
 					}
+					// 当页数为1时,重置滚动位置
+					    if (this.params.pageNum === 1) {
+							console.log(this.scrollTop)
+					      this.scrollTop = this.old.scrollTop
+					      this.$nextTick(function() {
+					      	this.scrollTop = 0
+					      });
+					    }
 					uni.hideLoading()
 				} else {
 					uni.showToast({
@@ -254,6 +349,7 @@
 		color: #222;
 		display: flex;
 		flex-direction: column;
+		height: 100vh;
 	}
 
 	.boxnav {
@@ -367,7 +463,7 @@
 		flex: 1;
 		height: calc(100% - 80rpx);
 		overflow-y: scroll;
-		padding-bottom: 80rpx;
+		// padding-bottom: 80rpx;
 		.list {
 			padding: 10px;
 			box-sizing: border-box;

+ 439 - 0
components/living.vue

@@ -0,0 +1,439 @@
+<template>
+	<view class="container">
+		<view class="headbox">
+			<view class="headnav x-bc">
+				<view :class="activeTab == 0 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(0)">
+					<view>直播计划</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/idle.png" mode="aspectFill"></image>
+				</view>
+				<view :class="activeTab == 1? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(1)">
+					<view>今日直播</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/streaming.png" mode="aspectFill"></image>
+				</view>
+				<view :class="activeTab == 2 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(2)">
+					<view>往日直播</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/finished.png" mode="aspectFill"></image>
+				</view>
+			</view>
+			<view>
+				<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+					<view class="p20 fs28 column flex-1 hb hidden" v-if="searchbarNav == 0">
+						<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
+							:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
+							@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
+							:upper-threshold="100" :lower-threshold="100" @refresherabort="triggereds = false"
+							@scrolltolower="reachBottoms">
+							<view v-for="(item,index) in courseList" class="m10 p10 center"
+							 :key="index" style="border-bottom: 2rpx solid #eee;" :class="courserIndex == index ? 'select':''"
+							 @click="handleCourse(item,index)">{{item.courseName}}
+							</view>
+							<u-loadmore :status="status" />
+						</scroll-view>
+					</view>
+					<view v-if="searchbarNav == 1">
+						///
+					</view>
+				</dropdownPanel>
+			</view>
+		</view>
+		<!-- <view  class="justify-between align-center mb20 mlr20 mt20 ">
+			<u-search placeholder="请输入课程名称" v-model="keywordlist" :showAction="false" height="30px"
+				@search='searchKeywordlist' bgColor='#fff'></u-search>
+		</view> -->
+		<view class="container-right" >
+			<scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true" :refresher-triggered="triggered"
+				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh" :scroll-top='scrollTop'
+				@refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
+				@refresherabort="triggered = false" @scrolltolower="reachBottom" @scroll="scroll()">
+				<view class="list">
+					<courseItem :from="'course'" :activeTab="1" v-for="(item,index) in dataList" :key="index"
+						:info="item" />
+				</view>
+				<u-loadmore :status="loadStatus" />
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getFsCourseList,
+		getCourseVdieoList
+	} from "@/api/courseManage.js"
+	import dropdownPanel from "@/components/dropdownPanel.vue"
+	import courseItem from "@/components/courseItem.vue"
+	export default {
+		name:"living",
+		components: {
+			courseItem,
+			dropdownPanel
+		},
+		data() {
+			return {
+				user: {},
+				filterData: [{
+						name: '训练营-营期',
+						value: 0,
+					},
+					{
+						name: '课程状态',
+						value: 1,
+					},
+				],
+				defaultIndex: [0, 0],
+				contentH: 0,
+				activeTab: 1,
+				courseList: [],
+				courseId: '',
+				searchbarNav: 0,
+				courserIndex: '',
+				searchbar: [{
+						name: '训练营-营期'
+					},
+					{
+						name: '课程状态'
+					}
+				],
+				downOption: {
+					use: true,
+					auto: false
+				},
+				upOption: {
+					onScroll: false,
+					use: true, // 是否启用上拉加载; 默认true
+					auto: true,
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore: "已经到底了",
+					empty: {
+						icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: [],
+				params: {
+					pageNum: 1,
+					pageSize: 10
+				},
+				triggered: false,
+				loadStatus: 'loadmore',
+				//课程选择列表
+				pageNum:1,
+				pageSize: 10,
+				triggereds: false,
+				status: 'loadmore',
+				keyword:'',
+				isEnableds:true,
+				keywordlist:'',
+				actid:'',
+				scrollTop:'',//控制滚动位置
+				 old: {
+					scrollTop: 0
+				}
+			}
+		},
+		mounted() {
+			const windowHeight = uni.getSystemInfoSync().windowHeight
+			this.contentH = `calc(${windowHeight}px - 132px - 56px)`
+			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
+			this.getFsCourseList()
+		},
+		methods: {
+			scroll: function(e) {
+				console.log(e)
+				this.old.scrollTop = e.detail.scrollTop
+			},
+			goTop: function(e) {
+				console.log(e)
+				this.scrollTop = this.old.scrollTop
+				this.$nextTick(function() {
+					this.scrollTop = 0
+				});
+			},
+			onChange(index) {
+				this.searchbarNav = index
+			},
+			reset() {
+				this.courseId = ''
+				this.keyword=''
+				this.courseList=[]
+				this.getFsCourseList()
+			},
+			handleCourse(item,index) {
+				this.courserIndex = index
+				this.actid=item.courseId
+			},
+			confirm() {
+				this.courseId = this.actid
+				this.params.pageNum=1
+				// console.log(this.courseId)
+				this.$nextTick(()=>{
+					this.getListData()
+				})
+			},
+			searchKeyword(value){
+				this.courseList=[]
+				this.keyword = value
+				this.getFsCourseList()
+			},
+			searchKeywordlist(value){
+				this.dataList=[]
+				this.keywordlist = value
+				this.getListData()
+			},
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getFsCourseList('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottoms() {
+				// status这个是加载状态
+				if (this.status === 'loadmore') {
+					this.status = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getFsCourseList() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			// 训练营
+			getFsCourseList(type) {
+				const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
+				const param = {
+					pageNum:this.pageNum,
+					pageSize:this.pageSize,
+					keyword:this.keyword
+				}
+				getFsCourseList(param).then(res => {
+					if (res.code == 200) {
+						if (type == 'refresh') {
+							this.courseList = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.courseList = [...this.courseList, ...res.data.list]
+						}
+						if ( res.data.isLastPage) {
+							this.status = 'nomore'
+						} else {
+							this.status = 'loadmore'
+						}
+						this.searchbar[0].name = this.courseList && this.courseList.length > 0 ? this.courseList[0]
+							.courseName : '训练营-营期'
+							// console.log(this.courseId)
+						// this.mescroll.resetUpScroll()
+						this.getListInit()
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			},
+			handleNav(type) {
+				this.activeTab = type
+			},
+			clickSearchbar(type) {
+				this.searchbarNav = type == this.searchbarNav ? 'colse' : type
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			getListInit() {
+				this.params.pageNum = 1
+				this.getListData('refresh')
+			},
+			async getListData(type = 'refresh') {
+				uni.showLoading({
+					title: "加载中..."
+				})
+				this.loadStatus = 'loading'
+				const result = await getCourseVdieoList({
+					courseId: this.courseId,
+					keyword:this.keywordlist,
+					...this.params
+				})
+				if (result) {
+					const {
+						isLastPage,
+						total,
+						list,
+					} = result.data
+					if (type == 'refresh') {
+						this.dataList = list
+					} else {
+						this.dataList = [...this.dataList, ...list]
+					}
+					if (isLastPage) {
+						this.loadStatus = 'nomore';
+					} else {
+						this.loadStatus = 'loadmore';
+					}
+					// 当页数为1时,重置滚动位置
+					    if (this.params.pageNum === 1) {
+							console.log(this.scrollTop)
+					      this.$nextTick(() => {
+					        this.scrollTop = 0; // 确保DOM更新后重置
+					      });
+					    }
+					uni.hideLoading()
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: "请求失败",
+					});
+					this.dataList = []
+				}
+			},
+			/**
+			 * 触底添加下一页
+			 */
+			reachBottom(options) {
+				if (this.loadStatus === 'loadmore') {
+					this.loadStatus = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.params.pageNum += 1;
+						this.getListData('more')
+						uni.hideNavigationBarLoading()
+					}, 500);
+				}
+			},
+			/**
+			 * 下拉列表页
+			 */
+			pullDownRefresh(options) {
+				this.triggered = true;
+				setTimeout(() => {
+					this.triggered = false;
+					uni.stopPullDownRefresh()
+					this.params.pageNum = 1;
+					this.getListData('refresh')
+				}, 500)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222;
+		// display: flex;
+		// flex-direction: column;
+	}
+
+	.headbox {
+		background-color: #fff;
+	}
+
+	.headnav {
+		padding: 15px 12px;
+		margin: 0 -10px -10px 0;
+		box-sizing: border-box;
+
+		image {
+			height: 60px;
+			width: 50px;
+			position: absolute;
+			z-index: 0;
+			bottom: 0;
+			right: 0;
+			display: none;
+		}
+
+		&-item {
+			flex: 1;
+			font-size: 16px;
+			padding: 10px;
+			border-radius: 10px;
+			background: #f5f5f5;
+			margin: 0 10px 10px 0;
+			position: relative;
+			z-index: 1;
+			overflow: hidden;
+			color: #555;
+		}
+
+		&-active {
+			background-color: rgb(231, 241, 255) !important;
+
+			.headnav-num {
+				color: #1677ff !important;
+			}
+
+			image {
+				display: block !important;
+			}
+		}
+
+		&-num {
+			font-family: DIN, DIN;
+			font-weight: bold;
+			font-size: 25px;
+			margin: 5px 0;
+		}
+	}
+
+	.searchbar {
+		flex: 1;
+		padding-bottom: 10px;
+
+		.arrow-down {
+			margin-left: 5px;
+		}
+
+		&-active {
+			color: #1677ff !important;
+
+			.arrow-down {
+				transform: rotate(180deg);
+			}
+		}
+	}
+
+	.coursebox {
+		position: relative;
+		overflow-y: auto;
+		box-sizing: border-box;
+	}
+
+	.courselist {
+		padding: 12px;
+		box-sizing: border-box;
+
+	}
+
+	.container-right {
+		flex: 1;
+		height: calc(100% - 80rpx);
+		overflow-y: scroll;
+		// padding-bottom: 80rpx;
+		.list {
+			padding: 10px;
+			box-sizing: border-box;
+			width: 100%;
+		}
+	}
+	.select {
+		color: #1773ff;
+		background-color: #e6ecff;
+	}
+</style>

+ 347 - 0
components/qiweiUrgeCourse.vue

@@ -0,0 +1,347 @@
+<template>
+	<view class="column " style="height: 100%;">
+		<view class="bgf justify-between pb16  flex-1" style="z-index:2;">
+			<dropdownPanel :filterData='filterData' @confirm="confirm" @reset="reset" @onChange="onChange"
+				style="flex: 1;">
+				<view class="p20 fs28 column flex-1 scrolly hb hidden" v-if="searchbarNav == 0">
+					<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledC"
+						:refresher-triggered="triggeredC" refresher-background="rgba(0,0,0,0)"
+						@refresherrefresh="pullDownRefreshC" @refresherrestore="triggeredC = false"
+						:upper-threshold="100" :lower-threshold="100" @refresherabort="triggeredC = false"
+						@scrolltolower="reachBottomC">
+						<view v-for="(item,index) in qiweilist" :key="item.index" class="m10 p10 center"
+							:class="qiweiuser.dictLabel==item.dictLabel?'select':''"
+							style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item)">
+							{{item.dictLabel}}
+						</view>
+						<u-loadmore :status="statusC" />
+					</scroll-view>
+				</view>
+			</dropdownPanel>
+		</view>
+		<view class="bgf p20 justify-between align-center ">
+			<view style="color: #666;font-size: 24rpx;" @click="showtime=!showtime">{{date||"请选择时间"}}</view>
+			<view class="justify-between">
+				<view :class="timeact==index?'tabtime selecttime':'tabtime'" v-for="(item,index) in timeTab"
+					:key="index" @click="seltime(index)">
+					{{item}}
+				</view>
+			</view>
+		</view>
+		<view class="justify-between align-center p20 ">
+			<view class="fs24">共{{list.length}}条数据</view>
+		</view>
+		<view class="column hb hidden">
+			<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
+				style="height: calc(100vh - 300rpx);" :refresher-triggered="triggereds"
+				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefreshs"
+				@refresherrestore="triggereds = false" :upper-threshold="100" :lower-threshold="100"
+				@refresherabort="triggereds = false" @scrolltolower="reachBottoms">
+				<view class="list-box" v-for="(item,index) in list" :key="index">
+					<view class="justify-between align-center ptb40">
+						<view>{{item.title}}</view>
+						<view class="justify-start align-center">
+							<u-icon name="file-text" color="#999999" size="20" class="mr10"></u-icon>
+							<u-icon name="more-circle" color="#999999" size="16"></u-icon>
+						</view>
+					</view>
+				</view>
+				<u-loadmore :status="statusA" />
+			</scroll-view>
+		</view>
+		<view class="">
+			<u-calendar :show="showtime" :maxDate='maxDate' :minDate='minDate' @confirm="confirmData"
+				:closeOnClickOverlay='true' @close="closedata"></u-calendar>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		geturgeCourse,
+		geturgeqiwei
+	} from "@/api/courseManage.js";
+	import dropdownPanel from "@/components/dropdownPanel.vue"
+	export default {
+		name: "qiweiUrgeCourse",
+		components: {
+			dropdownPanel
+		},
+		data() {
+			return {
+				actnav: 0,
+				showsel: false,
+				timeTab: ['今天', '昨天'],
+				timeact: 0,
+				isAgreement: false,
+				littleTime: ['01', '02', '03', '04', '05', '06', '07'],
+				qiweilist: [],
+				qiweiuser: [],
+				valuetime: '',
+				showtime: false,
+				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
+				maxDate: '',
+				minDate: '',
+				date: '',
+				list: [],
+				//分页
+				triggereds: false,
+				isEnableds: true,
+				statusA: 'nomore',
+				pageNum: 1,
+				pageSize: 8,
+				filterData: [{
+					name: '选择企微账号',
+					value: 0,
+				}, ],
+				searchbarNav: 0,
+				//企微分页
+				triggeredC: false,
+				isEnabledC: true,
+				statusC: 'nomore',
+				pageNumC: 1,
+				pageSizeC: 6,
+			}
+		},
+		mounted() {
+			this.getCourselist()
+			this.getqiweilist()
+			this.gettimeDate()
+		},
+		methods: {
+			getCourseOne(e) {
+				this.qiweiuser = e
+				console.log(e)
+			},
+			reachBottomC() {
+				// status这个是加载状态
+				console.log(12345)
+				if (this.statusC === 'loadmore') {
+					this.statusC = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNumC++
+						this.getqiweilist() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//列表展示下拉
+			pullDownRefreshC() {
+				// 下拉
+				console.log(12345)
+				this.triggeredC = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggeredC = false;
+					uni.stopPullDownRefresh()
+					this.pageNumC = 1;
+					this.getqiweilist('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			confirm() {
+				this.filterData[0].name = this.qiweiuser.dictLabel
+				this.getCourselist()
+			},
+			reset() {
+				this.qiweiuser = []
+				this.filterData[0].name = '请选择企微账号'
+				this.getCourselist()
+			},
+			onChange(index) {
+				this.searchbarNav = index
+			},
+			reachBottoms() {
+				// status这个是加载状态
+				if (this.statusA === 'loadmore') {
+					this.statusA = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getCourselist() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//列表展示下拉
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getCourselist('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			confirmData(e) {
+				this.showtime = !this.showtime
+				this.date = e[0]
+				this.pageNum = 1
+				this.getCourselist()
+			},
+			gettimeDate() {
+				// 获取当前时间
+				const currentDate = new Date();
+
+				// 获取一个月前的时间
+				const oneMonthAgo = new Date(currentDate);
+				oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
+				this.minDate = oneMonthAgo.getTime();
+
+				// 获取一个月后的时间
+				const oneMonthLater = new Date(currentDate);
+				oneMonthLater.setMonth(oneMonthLater.getMonth() + 1);
+				this.maxDate = oneMonthLater.getTime();
+
+			},
+			selcourse() {
+				this.showsel = !this.showsel
+			},
+			close() {
+				this.showsel = !this.showsel
+			},
+			seltime(index) {
+				this.timeact = index
+				this.pageNum = 1
+				if (index == 0) {
+					this.date = this.todayday
+				} else {
+					let yesterday = new Date();
+					yesterday.setDate(yesterday.getDate() - 1);
+					this.date = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+				}
+				this.getCourselist()
+			},
+			handleget() {
+				this.isAgreement = !this.isAgreement
+			},
+			getCourselist(type) {
+				// console.log(this.qiweiuser.dictValue)
+				if (this.qiweiuser.dictValue == undefined) {
+					uni.showToast({
+						icon: 'none',
+						title: '请选择企微账号'
+					})
+					return
+				}
+				const parmas = {
+					qwUserId: this.qiweiuser.dictValue,
+					corpId: this.qiweiuser.corpId,
+					date: this.date,
+					pageNum: this.pageNum,
+					pageSize: this.pageSize
+				}
+				geturgeCourse(parmas).then(res => {
+					if (res.code == 200) {
+						const dataList = res.data.list
+						if (type == 'refresh') {
+							this.list = dataList
+						} else {
+							this.list = [...this.list, ...dataList]
+						}
+						this.statusC = res.data.isLastPage ? 'nomore' : 'loadmore';
+						console.log(this.list)
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			getqiweilist(type) {
+				const data = {
+					pageNum: this.pageNumC,
+					pageSize: this.pageSizeC
+				}
+				geturgeqiwei(data).then(res => {
+					if (res.code == 200) {
+						if (type == 'refresh') {
+							this.qiweilist = res.data.list
+						} else {
+							this.qiweilist = [...this.qiweilist, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.statusC = 'nomore'
+						} else {
+							this.statusC = 'loadmore'
+						}
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			confirmuser(e) {
+				this.showsel = !this.showsel
+				this.qiweiuser = e.value[0]
+				this.pageNum = 1
+				this.getCourselist()
+			},
+			canceluser() {
+				this.showsel = !this.showsel
+			},
+			closeuser() {
+				this.showsel = !this.showsel
+			},
+			closedata() {
+				this.showtime = !this.showtime
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.icon-triangle {
+		width: 16rpx;
+		height: 16rpx;
+		margin-left: 10rpx;
+	}
+
+	.select {
+		color: #1773ff;
+		background-color: #e6ecff;
+	}
+
+	.tabtime {
+		background-color: #f0f0f0;
+		text-align: center;
+		width: 140rpx;
+		padding: 12rpx 0;
+		border-radius: 200rpx;
+		margin-left: 20rpx;
+		font-size: 24rpx;
+	}
+
+	.selecttime {
+		color: #fff;
+		background-color: #1773ff;
+	}
+
+	/deep/ .uni-checkbox-input {
+		border-radius: 50% !important;
+	}
+
+	.timelitle {
+		background-color: #c2c2c2;
+		color: #fff;
+		border-radius: 50%;
+		width: 40rpx;
+		text-align: center;
+		line-height: 40rpx;
+		height: 40rpx;
+		margin-right: 6rpx;
+	}
+
+	.list-box {
+		background-color: #fff;
+		padding: 28rpx;
+		margin-bottom: 12rpx;
+	}
+</style>

+ 79 - 0
components/tabbar/tabbar.vue

@@ -0,0 +1,79 @@
+<template>
+	<!-- 使用得时候必须加上style  不然没有--colorxxxxx之类得变量 -->
+	<view class="tabbar align-center">
+		<view v-for="(item, index) in tabbarList" :key="index" @click="switchTabs(item)" class="tablist">
+			<view class="column align-center justify-center" >
+				<image :src="actindex==index?item.selectedIconPath:item.iconPath" class="w48 h48"></image>
+				<text class="fs24 base-textcol" :class="actindex==index?'actcolor':'morecolor'">{{item.Text}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tabbar",
+		props: {
+			actindex: {
+				type: Number,
+				default: 0
+			}
+		},
+		data() {
+			return {
+				tabbarList: [],
+			};
+		},
+		mounted() {
+			this.themeicon()
+		},
+		methods: {
+			switchTabs(item) {
+				// 到时候要设置两个tabbar   但是一教育页面得隐藏掉   这里得页面不能配置到tabbar得list里面
+				uni.navigateTo({
+					url: item.url
+				})
+			},
+			themeicon() {
+				const theme = this.themes
+				this.tabbarList = [{
+						iconPath: '/static/manageTabIcon/training.png',
+						selectedIconPath: '/static/manageTabIcon/training_on.png',
+						Text: '企业理念',
+						url: '/pages/enterprise/enterprise'
+					},
+					{
+						iconPath:  '/static/manageTabIcon/manage.png',
+						selectedIconPath:  '/static/manageTabIcon/manage_on.png',
+						Text: '我的',
+						url: '/pages/user/wxuser'
+					},
+				]
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.tabbar {
+		display: flex;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: #fff;
+		z-index: 1000;
+		height: 120rpx;
+		padding-bottom: 20rpx;
+	}
+
+	.tablist {
+		width: 50%;
+	}
+	.morecolor{
+		color: #626468;
+	}
+	.actcolor {
+		color: #1773ff;
+	}
+</style>

+ 303 - 0
components/userUrgeCourse.vue

@@ -0,0 +1,303 @@
+<template>
+	<view>
+		<dropdownPanel :filterData='filterData' @confirm="confirmA" @reset="resetA" @onChange="onChangeA"
+			style="flex: 1;">
+			<view class="p20 fs28 column flex-1 hb hidden" v-if="searchbarNav == 0">
+				<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledA"
+					:refresher-triggered="triggeredA" refresher-background="rgba(0,0,0,0)"
+					@refresherrefresh="pullDownRefreshA" @refresherrestore="triggeredA = false" :upper-threshold="100"
+					:lower-threshold="100" @refresherabort="triggeredA = false" @scrolltolower="reachBottomA">
+					<view v-for="(item,index) in courseListA" :key="item.index" class="m10 p10 center"
+						:class="courseListAid==item.periodId?'select':''" style="border-bottom: 2rpx solid #eee;"
+						@click="getCourseOne(item)">
+						{{item.periodName}}
+					</view>
+					<u-loadmore :status="statusA" />
+				</scroll-view>
+			</view>
+			<view class="p20 fs28 column flex-1 hb hidden" v-if="searchbarNav == 1">
+				<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledC"
+					:refresher-triggered="triggeredC" refresher-background="rgba(0,0,0,0)"
+					@refresherrefresh="pullDownRefreshC" @refresherrestore="triggeredC = false" :upper-threshold="100"
+					:lower-threshold="100" @refresherabort="triggeredC = false" @scrolltolower="reachBottomC">
+					<view v-for="(item,index) in courseListC" :key="item.index" class="m10 p10 center"
+						:class="actC==index?'select':''" style="border-bottom: 2rpx solid #eee;"
+						@click="getCoursetwo(item,index)">
+						{{item.courseName}}
+					</view>
+					<u-loadmore :status="statusC" />
+				</scroll-view>
+			</view>
+		</dropdownPanel>
+		<view>
+			<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled"
+				:refresher-triggered="triggered" refresher-background="rgba(0,0,0,0)"
+				@refresherrefresh="pullDownRefresh" @refresherrestore="triggere = false" :upper-threshold="100"
+				:lower-threshold="100" @refresherabort="triggered = false" @scrolltolower="reachBottom">
+				<view class="list-box" v-for="(item,index) in userlist" :key="index">
+					<view class="justify-start align-center">
+						<u-avatar :src="item.avatar" size="50"></u-avatar>
+						<view class="ml20">
+							<view>{{item.name}}</view>
+							<view class="fs24 mt10 base-color">{{item.title}}</view>
+						</view>
+					</view>
+				</view>
+				<u-loadmore :status="status" />
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import dropdownPanel from "@/components/dropdownPanel.vue"
+	import {
+		getFsCourseList,
+		getCourseVdieoList,
+		getWorkTask
+	} from "@/api/courseManage.js";
+	export default {
+		name: "userUrgeCourse",
+		components: {
+			dropdownPanel
+		},
+		data() {
+			return {
+				filterData: [{
+					name: '营期',
+					value: 0,
+				}, {
+					name: '课程',
+					value: 1,
+				}],
+				searchbarNav: 0,
+				//营期分页
+				triggeredA: false,
+				isEnabledA: true,
+				statusA: 'nomore',
+				pageNumA: 1,
+				pageSizeA: 6,
+				//课程分页
+				triggeredC: false,
+				isEnabledC: true,
+				statusC: 'nomore',
+				pageNumC: 1,
+				pageSizeC: 6,
+				//获取营期/课程列表
+				courseListA: [],
+				courseListAid: '',
+				courseListC: [],
+				courseListCid: '',
+				actC: '',
+				//获取会员列表
+				//课程分页
+				triggered: false,
+				isEnabled: true,
+				status: 'nomore',
+				pageNum: 1,
+				pageSize: 8,
+				userlist:[]
+			};
+		},
+		mounted() {
+			this.getcourseA()
+			this.getlist()
+		},
+		methods: {
+			reachBottom() {
+				if (this.status === 'loadmore') {
+					this.status = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getlist() 
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//列表展示下拉
+			pullDownRefresh() {
+				this.triggered = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggered = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getlist('refresh') 
+				}, 1000)
+			},
+			getlist(type){
+				const data={
+					pageNum:this.pageNum,
+					pageSize:this.pageSize
+				}
+				getWorkTask(data).then(res=>{
+					if (res.code == 200) {
+						if (type == 'refresh') {
+							this.userlist = res.data.list
+						} else {
+							this.userlist = [...this.userlist, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.status = 'nomore'
+						} else {
+							this.status = 'loadmore'
+						}
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			onChangeA(index) {
+				this.searchbarNav = index
+				if(index==1){
+					if(this.courseListAid==''){
+						uni.showToast({
+							icon: 'none',
+							title: '请先选择营期'
+						})
+					}
+				}
+			},
+			confirmA() {
+			},
+			resetA() {
+				this.courseListAid = ''
+			},
+			getCourseOne(item) {
+				//获取营期列表
+				this.courseListAid = item.periodId
+				this.filterData[0].name = item.periodName
+				this.courseListC=[]
+				this.pageNumC=1
+				this.getcourseB()
+				// console.log(this.courseListAid)
+			},
+			getCoursetwo(item, index) {
+				//获取课程列表
+				this.actC = index
+				this.courseListCid = item.courseId
+				this.filterData[1].name = item.courseName
+				// console.log(item)
+			},
+			reachBottomA() {
+				// status这个是加载状态
+				if (this.statusA === 'loadmore') {
+					this.statusA = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNumA++
+						this.getcourseA() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//列表展示下拉
+			pullDownRefreshA() {
+				// 下拉
+				this.triggeredA = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggeredA = false;
+					uni.stopPullDownRefresh()
+					this.pageNumA = 1;
+					this.getcourseA('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottomC() {
+				// status这个是加载状态
+				if (this.statusC === 'loadmore') {
+					this.statusC = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNumC++
+						this.getcourseB() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//列表展示下拉
+			pullDownRefreshC() {
+				// 下拉
+				this.triggeredC = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggeredC = false;
+					uni.stopPullDownRefresh()
+					this.pageNumC = 1;
+					this.getcourseB('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			getcourseA(type) {
+				//获取营期列表
+				const data = {
+					pageNum: this.pageNumA,
+					pageSize: this.pageSizeA,
+				}
+				getFsCourseList(data).then(res => {
+					if (res.code == 200) {
+						if (type == 'refresh') {
+							this.courseListA = res.data.list
+						} else {
+							this.courseListA = [...this.courseListA, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.statusA = 'nomore'
+						} else {
+							this.statusA = 'loadmore'
+						}
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			getcourseB(type) {
+				//获取课程列表
+				const data = {
+					pageNum: this.pageNumC,
+					pageSize: this.pageSizeC,
+					periodId: this.courseListAid,
+					keyword: ''
+				}
+				getCourseVdieoList(data).then(res => {
+					if (res.code == 200) {
+						if (type == 'refresh') {
+							this.courseListC = res.data.list
+						} else {
+							this.courseListC = [...this.courseListC, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.statusC = 'nomore'
+						} else {
+							this.statusC = 'loadmore'
+						}
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.select {
+		color: #1773ff;
+		background-color: #e6ecff;
+	}
+	.list-box {
+		background-color: #fff;
+		padding: 28rpx;
+		margin-bottom: 12rpx;
+	}
+</style>

+ 124 - 35
pages/courseManage/components/vipUserItem.vue → components/vipUserItem.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="pb130 column flex-1 hb">
+	<view class=" column flex-1 hb" style="height: 100vh;">
 		<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggered"
 			refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
 			@refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
@@ -15,11 +15,13 @@
 							<u-avatar :src='item.avatar'></u-avatar>
 							<view class="list-item-head-l">
 								<view style="flex: 1;overflow: hidden;display: flex;" @click.passive.stop>
-									<text class="list-item-name one-t">{{item.nickName}}</text>
+									<text class="list-item-name one-t single-line-ellipsis" 
+									style="width: fit-content;">{{item.nickname}}</text>
 									<image class="list-item-copy" src="@/static/images/copy_icon.png" mode="aspectFill"
-										@click="copyId(item.userId)">
+										@click="copyId(item.nickname)">
 									</image>
 								</view>
+								<text class="list-item-name one-t fs24 base-color-9 ">备注:{{item.remark}}</text>
 								<view class="list-item-re">注册时间:{{item.createTime?item.createTime.substring(0,10):'--'}}
 								</view>
 							</view>
@@ -28,40 +30,34 @@
 							v-if="!isShowSelectAll" @click="tophone(item.phone)" @click.passive.stop></image>
 					</view>
 					<view class="list-item-desc">
-						<view class="taglist">
-							<!-- <view><u-tag text="停止看课三天" size="mini" color="#1677ff" bgColor="#fff" borderColor="#fff"></u-tag></view>
-						
-						<view v-for="(tag,i) in item.tags ? item.tags.split(',') : []" >
+						<view class="taglist  ">
+							<view><u-tag :text="item.companyUserNickName" 
+							size="mini" color="#029aff" bgColor="#fff" borderColor="#fff"></u-tag></view>
+						<view v-for="(tag,i) in item.tag ? item.tag.split(',') : []" :key="index">
 							<u-tag :text="tag" size="mini" color="#999" bgColor="#fff" borderColor="#fff"></u-tag>
-						</view> -->
-							<!-- <view class="base-color-red">停止看课 3 天</view>
-						<view class="u-border-right u-border-left plr10 base-color-9">
-							参与营期 <text class="bold pl6 base-color-3">1</text></view>
-						<view class="base-color-9">缺课数量 <text class="base-color-red pl8">2</text></view> -->
 						</view>
-						<!-- <view style="margin-top: 5px;">
-						<text class="label" style="color:red;margin-right: 20px;">停止看课{{item.watchCount || 0}}天</text>
-						<text class="label">参与营期</text><text class="value-num">{{item.watchCount || 0}}</text>
-						<text class="label">缺课数量</text><text class="value-num" style="color:red">{{item.watchComlpleteCount || 0}}</text>
-					</view> -->
-						<view class="justify-start">
-							<view class="base-color mr8 pr8 u-border-right" v-if="user.userType==0">
-								{{item.companyUsernickName}}
-							</view>
-							<view class="justify-around">
-								<view v-for="(item,index) in item.tagsName" :key="index" class="mlr4">{{item}}</view>
-							</view>
+						</view>
+						<view style="margin-top: 5px;" v-if="item.status==1">
+							<text class="label u-border-right pr20" style="color:#00af05;" v-if="item.courseCountStatus==1">正常看课</text>
+							<text class="label u-border-right pr20" style="color:#ff8921;" 
+							v-else-if="item.courseCountStatus==2">停止看课{{item.stopWatchDays || 0}}天</text>
+							<text class="label u-border-right pr20" style="color:#f00;" v-else>未看过课</text>
+							<text class="label pl20 ">参与营期</text><text class="value-num ">{{item.partCourseCount || 0}}</text>
+							<text class="label u-border-left pl20">缺课数量</text><text class="value-num" style="color:red">{{item.missCourseCount || 0}}</text>
 						</view>
 					</view>
-					<view class="justify-between" v-if="!isShowSelectAll" @click.passive.stop>
-						<view @click="morepage(item)">更多</view>
+					<view class="justify-between align-center" v-if="!isShowSelectAll" @click.passive.stop>
+						<view @click="changemore(item)" 
+						 class="fs24 u-border ptb4 plr18 radius40 base-color-6">更多</view>
 						<view class="justify-start">
 							<view class="btn-box base-color base-bg-sure bor-blue" @click="openModel('label',item)"
-								v-if="item.isBlack==0">改标签</view>
+								v-if="item.status==1">改标签</view>
+							<view class="btn-box base-color-red base-bg-false bor-red"
+								@click="openModel('disable',item)" v-if="item.status==1">禁用</view>
 							<view class="btn-box base-color-red base-bg-false bor-red"
-								@click="openModel('disable',item)" v-if="item.isBlack==0">禁用</view>
-							<view class="btn-box base-color-red base-bg-false bor-red" @click="openModel('change',item)"
-								v-if="item.isBlack==0 && user.userType==0">更换归属</view>
+								@click="openModel('disabled',item)" v-if="item.status==0">取消禁用</view>
+							<!-- <view class="btn-box base-color-red base-bg-false bor-red" @click="openModel('change',item)"
+								v-if="item.status!=7 && user.userType==0">更换归属</view> -->
 						</view>
 
 					</view>
@@ -69,11 +65,25 @@
 			</view>
 			<u-loadmore :status="status" />
 		</scroll-view>
+		<u-popup :show="showmore" @close="closemore" @open="openmore" >
+			<view class="column align-center">
+				<view class="m20" v-for="(items,index) in morelist"
+				 :key="items.value" @click="nameMore(items)">
+					{{items.name}}</view>
+				<u-modal :show="showlist" :title="titlelist" @confirm="confirmchange" >
+					<view class="slot-content">
+						<u-input :placeholder="contpl" v-model="changelist" v-if="selnum==0"></u-input>
+						<u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==1"></u-input>
+					</view>
+				</u-modal>
+			</view>
+		</u-popup>
 		<u-notify ref="uNotify" message=""></u-notify>
 	</view>
 </template>
 
 <script>
+	import {getchangesUserInfo} from '@/api/courseManage.js'
 	export default {
 		props: {
 			viplist: {
@@ -88,7 +98,7 @@
 				type: Object,
 				default: () => ({
 					pageNum: 1,
-					pageSize: 12,
+					pageSize: 8,
 				})
 			},
 			status: {
@@ -104,12 +114,90 @@
 				user: [],
 				isEnabled: true,
 				triggered: false,
+				stopWatchDays:'停止看课三天',
+				showmore:false,
+				contpl:'',
+				changelist:'',
+				changeremark:'',
+				selnum:'',
+				titlelist:'',
+				showlist:false,
+				groupid:'',
+				openData:[],
+				morelist:[
+					{
+						name:'改姓名',
+						value:0,
+						text:'请输入姓名'
+					},
+					{
+						name:'改备注',
+						value:1,
+						text:'请输入备注'
+					}
+				],
 			}
 		},
 		mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 		},
 		methods: {
+			changemore(data){
+				this.openData=data
+				this.groupid=data.userId,
+				this.showmore=!this.showmore
+			},
+			confirmchange(){
+				this.updatagroup()
+				console.log(this.openData.userId)
+				console.log(this.changeremark)
+				console.log(this.changelist)
+				this.showlist=false
+				setTimeout(()=>{
+					this.showmore=false
+				},200)
+			},
+			updatagroup(){
+				const data={
+					fsUserId:this.openData.userId,
+					remark:this.changeremark,
+					nickName:this.changelist
+				}
+				getchangesUserInfo(data).then(res=>{
+					if(res.code==200){
+						uni.showToast({
+							icon: 'none',
+							title: "修改成功"
+						})
+						this.$emit('changelistname')
+					}else{
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			nameMore(item){
+				console.log(item)
+				this.titlelist=item.name
+				this.contpl=item.text
+				this.selnum=item.value
+				console.log(this.openData)
+				if(item.value==0){
+					this.changelist=this.openData.nickname
+					this.changeremark=this.openData.remark
+					this.showlist=true
+				}else if(item.value==1){
+					this.changelist=this.openData.nickname
+					this.changeremark=this.openData.remark
+					this.showlist=true
+				}
+			},
+			closemore(){
+				this.showmore=!this.showmore
+			},
+			openmore(){},
 			tophone(phone){
 				console.log(phone)
 				if(phone==null){
@@ -186,7 +274,7 @@
 			},
 			morepage(item) {
 				uni.navigateTo({
-					url: '/pages/courseManage/vip/ManageDetail'
+					url: '/pages/courseManage/vip/ManageDetail?id='+item.userId
 				})
 				uni.setStorageSync('detailUser', item)
 			},
@@ -195,6 +283,8 @@
 					this.$emit('getlableId', item.userId)
 				} else if (tag == 'disable') {
 					this.$emit('getuserId', item.userId)
+				}else if (tag == 'disabled') {
+					this.$emit('getuserIds', item.userId)
 					console.log(item.userId)
 				} else {
 					this.$emit('change', item.userId)
@@ -283,7 +373,7 @@
 
 		&-re {
 			font-size: 10px;
-			margin-top: 5px;
+			// margin-top: 5px;
 		}
 
 		&-desc {
@@ -308,9 +398,8 @@
 			flex-wrap: wrap;
 			color: #555;
 			padding-top: 5px;
-
 			view {
-				margin: 0 5px 5px 0;
+				margin: 0 5px 0 0;
 			}
 		}
 

+ 5 - 2
manifest.json

@@ -1,5 +1,5 @@
 {
-    "name" : "御君方管理",
+    "name" : "直播管理",
     "appid" : "__UNI__7F50713",
     "description" : "",
     "versionName" : "1.0.8",
@@ -109,7 +109,7 @@
     "quickapp" : {},
     /* 小程序特有相关 */
     "mp-weixin" : {
-        "appid" : "wx93ce67750e3cfba3",
+        "appid" : "wxd70f99287830cb51",
         "setting" : {
             "urlCheck" : true
         },
@@ -137,6 +137,9 @@
     "locale" : "zh-Hans",
     "fallbackLocale" : "zh-Hans",
     "h5" : {
+        "devServer" : {
+            "disableHostCheck" : true
+        },
         "router" : {
             "mode" : "hash",
             "base" : "./"

+ 260 - 190
pages.json

@@ -26,10 +26,12 @@
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"navigationBarTitleText": "首页",
-                "enablePullDownRefresh": false
+				"navigationBarTextStyle": "white",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
 			}
 		}
         ,{
@@ -37,8 +39,11 @@
             "style" :                                                                                    
             {
 				"navigationBarTextStyle": "white",
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom",
+                "app-plus": {
+                	"bounce": "none"
+                }
             }
             
         }
@@ -48,8 +53,12 @@
             {
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-                "navigationBarTitleText": "客户",
-                "enablePullDownRefresh": false
+                "navigationBarTitleText": "会员数据",
+                "enablePullDownRefresh": false,
+				// "navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
             }
             
         }
@@ -63,17 +72,6 @@
 		        "enablePullDownRefresh": false
 		    }
 		    
-		}
-		,{
-		    "path" : "pages/user/ai/index",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "AI智能客服",
-		        "enablePullDownRefresh": false
-		    }
-		    
 		}
 		,{
 		    "path" : "pages/user/about",
@@ -82,7 +80,16 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 		        "navigationBarTitleText": "关于我们",
-		        "enablePullDownRefresh": false
+				"enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
 		    }
 		    
 		}
@@ -103,8 +110,17 @@
 		    {
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "用户信息",
-		        "enablePullDownRefresh": false
+		        "navigationBarTitleText": "设置",
+		        "enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
 		    }
 		    
 		}
@@ -115,73 +131,16 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 		        "navigationBarTitleText": "用户信息",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/qwSop/sop",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "群发列表",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/qwSop/sopLosList",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "群发记录",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/qwSop/sopLogsDetails",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "记录详情",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/courseSop/sop",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "群发列表",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/courseSop/sopLosList",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "群发记录",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/courseSop/sopLogsDetails",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "记录详情",
-		        "enablePullDownRefresh": false
+		        "enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
 		    }
 		    
 		}
@@ -189,14 +148,19 @@
 		    "path" : "pages/user/users/users",
 		    "style" :                                                                                    
 		    {
+				"navigationBarTitleText": "销售审核",
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "员工列表",
-		        "enablePullDownRefresh": false,
-		        "navigationStyle": "custom",
-		        "app-plus": {
-		        	"bounce": "none"
-		        }
+				"enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
 		    }
 		    
 		}
@@ -214,75 +178,42 @@
 		        }
 		    }
 		    
-		}
-		,{
-		    "path" : "pages/user/crm/lineCustomer",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "线索客户",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/crm/myCustomer",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "我的客户",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/crm/customerDetails",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "客户详情",
-		        "enablePullDownRefresh": false
-		    }
-		    
-		}
-		,{
-		    "path" : "pages/user/crm/importWxUser",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "导入客户",
-		        "enablePullDownRefresh": false
-		    }
-		    
 		},{
-		    "path" : "pages/courseManage/index",
+		    "path" : "pages/courseManage/statistics",
 		    "style" :                                                                                    
 		    {
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 		        "navigationBarTitleText": "",
 		        "enablePullDownRefresh": false,
-				"navigationStyle": "custom",
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
 		    } 
-		},{
-		    "path" : "pages/courseManage/statistics",
+		},
+		{
+		    "path" : "pages/courseManage/operation/index",
 		    "style" :                                                                                    
 		    {
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "",
+		        "navigationBarTitleText": "课程数据详情",
 		        "enablePullDownRefresh": false,
-				"navigationStyle": "custom",
-				"app-plus": {
-					"bounce": "none"
-				}
+		        // #ifdef H5
+		        "navigationStyle": "custom", 
+		        // #endif
+		        // #ifndef H5
+		        "navigationStyle": "default",
+		        // #endif
+		        "app-plus": {
+		        	"bounce": "none"
+		        }
 		    } 
 		},
 		{
@@ -293,34 +224,36 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
 			}
 		},
 		{
-			"path" : "pages/courseManage/course/learning",
+			"path" : "pages/courseManage/manage/exprotList",
 			"style" : 
 			{
+				"navigationBarTitleText" : "审核列表",
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-				"navigationBarTitleText": "课程详情",
 				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
 			}
 		},
-		{
-			"path" : "pages/courseManage/manage/exprotList",
-			"style" : 
-			{
-				"navigationBarTitleText" : "导出列表",
-				"navigationBarBackgroundColor": "#ffffff"
-			}
-		},
 		{
 			"path" : "pages/courseManage/manage/lableSetup",
 			"style" : 
@@ -329,7 +262,12 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
@@ -357,7 +295,13 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
+				        // #ifdef H5
+				        "navigationStyle": "custom",
+				        // #endif
+				        // 小程序保留默认
+				        // #ifndef H5
+				        "navigationStyle": "default",
+				        // #endif
 				"app-plus": {
 					"bounce": "none"
 				}
@@ -371,7 +315,12 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 				"enablePullDownRefresh": false,
+				// #ifdef H5
 				"navigationStyle": "custom",
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
@@ -405,54 +354,175 @@
 			}
 		},
 		{
-			"path" : "pages/courseManage/course/living",
+			"path" : "pages/courseManage/manage/manageIndex",
+			"style" : 
+			{
+				"navigationBarTitleText" : "管理",
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/courseManage/course/courseVideo",
+			"style" : 
+			{
+				"navigationBarTitleText" : "课程详情",
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": false,
+				// #ifdef H5
+				"navigationStyle": "custom", 
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/courseManage/course/becomeSale",
+			"style" : 
+			{
+				"navigationBarTitleText" : "注册"
+			}
+		},
+		{
+			"path" : "pages/course/course",
+			"style" : 
+			{
+				"navigationBarTitleText" : "课程库",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": true,
+				// "navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/urgeCourse/urgeCourse",
+			"style" : 
+			{
+				"navigationBarTitleText" : "催课面板",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/user/users/becomeVIP",
+			"style" : 
+			{
+				"navigationBarTitleText" : "注册会员",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/auth/wxlogin",
 			"style" : 
 			{
-				"navigationBarTitleText" : ""
+				"navigationBarTitleText" : "登录",
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/enterprise/enterprise",
+			"style" : 
+			{
+				"navigationBarTitleText" : "",
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/user/wxuser",
+			"style" : 
+			{
+				"navigationBarTitleText" : "",
+				"navigationStyle": "custom"
 			}
 		}
-		 
     ],
+	"subPackages": [
+		{
+			"root": "pages_course",
+			"pages": [
+				{
+					"path": "video",
+					"style": {
+						"navigationBarTitleText": "看课",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+			]
+		}
+	],
 	"globalStyle": {
-		// "navigationStyle": "custom", // 设置成 custom 即可解决微信H5双标题的问题
-		"navigationBarTitleText": "销售管理端",
-		"navigationBarBackgroundColor": "#115296",
-		"backgroundColor": "#ffffff"
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "看课管理",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF"
 	},
 	"tabBar": {
-		"animation": false,
 		"color": "#7e7e7e",
-		"selectedColor": "#115296",
+		"selectedColor": "#1773ff",
 		"borderStyle": "white",
 		"backgroundColor": "#ffffff",
-		"height": "64px",
+		"height": "70px",
 		"fontSize":"12px",
-		"iconWidth":"18px",
-		"spacing": "4px",
+		"iconWidth":"20px",
+		"spacing": "8px",
 		"list": [
-			// {
-			// 	"pagePath": "pages/index/index",
-			// 	"iconPath": "/static/images/home.png",
-			// 	"selectedIconPath": "/static/images/home_select.png",
-			// 	"text": "首页"
-			// },
+			{
+				"pagePath": "pages/index/index",
+				"iconPath": "/static/manageTabIcon/data.png",
+				"selectedIconPath": "/static/manageTabIcon/data_on.png",
+				"text": "数据"
+			},
+			{
+				"pagePath": "pages/course/course",
+				"iconPath": "/static/manageTabIcon/liveclasses.png",
+				"selectedIconPath": "/static/manageTabIcon/liveclasses_on.png",
+				"text": "课程库"
+			},
 			{
 				"pagePath": "pages/customer/index",
-				"iconPath": "/static/images/order.png",
-				"selectedIconPath": "/static/images/order_select.png",
-				"text": "客户"
+				"iconPath": "/static/manageTabIcon/vip.png",
+				"selectedIconPath": "/static/manageTabIcon/vip_on.png",
+				"text": "会员"
 			},
 			{
-				"pagePath": "pages/msg/index",
-				"iconPath": "/static/images/report.png",
-				"selectedIconPath": "/static/images/report_select.png",
-				"text": "消息"
+				"pagePath": "pages/urgeCourse/urgeCourse",
+				"iconPath": "/static/manageTabIcon/training.png",
+				"selectedIconPath": "/static/manageTabIcon/training_on.png",
+				"text": "催课"
 			},
 			{
 				"pagePath": "pages/user/index",
-				"iconPath": "/static/images/my.png",
-				"selectedIconPath": "/static/images/my_select.png",
-				"text": "我的"
+				"iconPath": "/static/manageTabIcon/manage.png",
+				"selectedIconPath": "/static/manageTabIcon/manage_on.png",
+				"text": "管理"
 			}
 		]
 	}

+ 24 - 8
pages/auth/login.vue

@@ -12,7 +12,7 @@
 						 <!-- <text>帐号</text> -->
 						 <view class="input-account">
 							 <input v-model="account"
-							  placeholder="请输入帐号" type="text" ></input>
+							  placeholder="请输入帐号/手机号" type="text" ></input>
 						 </view>
 					 </view> 
 					 <view class="login-item">
@@ -45,11 +45,26 @@ export default {
 			password:"",
 		}
 	},
-	onLoad(option) 
-	{
+	onLoad(option) {
 	},
 	mounted() {
 
+	},
+	onShow() {
+		// let loginPage = '';
+		// // #ifdef MP-WEIXIN
+		// loginPage = '/pages/auth/wxlogin';
+		// // #endif
+		// loginPage = '/pages/auth/login';
+		// uni.reLaunch({
+		// 	url:loginPage,
+		// 	success: () => {
+		// 		uni.hideLoading();
+		// 	},
+		// 	fail: () => {
+		// 		uni.hideLoading();
+		// 	}
+		// })
 	},
 	methods: {
 	    login(){
@@ -84,7 +99,8 @@ export default {
 						uni.setStorageSync('companyUserInfo',JSON.stringify(res.data.user));
 						uni.$emit('initSocket');
 						uni.reLaunch({
-							url: '../user/index',
+							// url: '../user/index',
+							url: "/pages/index/index",
 							animationType: 'pop-in',
 							animationDuration: 100
 						})
@@ -191,14 +207,14 @@ page{
 					justify-content: center;
 					width: 100%;
 					height: 80rpx;
-					background: linear-gradient(to right, #115296 0%, #115296 100%);
-					background: -moz-linear-gradient(to right, #115296 0%, #115296 100%);
-					box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+					// background: linear-gradient(to bottom, #cfe3ff, #cabbfd);
+					background: #5c82ff;
+					box-shadow: 0px 7rpx 6rpx 0px rgba(0, 0, 0, 0.2);
 					border-radius: 40rpx;
 					font-size: 30rpx;
 					font-family: PingFang SC;
 					font-weight: 500;
-					color: rgba(255, 255, 255, 1);
+					color: rgba(255, 255, 255, 1.0);
 				}
 			}
 			

+ 563 - 0
pages/auth/wxlogin.vue

@@ -0,0 +1,563 @@
+<template>
+  <view class="container">
+    <!-- #ifdef MP-WEIXIN -->
+    <view  class="force-login-wrap">
+      <view class="force-login__content y-f">
+        <view class="logo">
+        	<view class="logo-img">
+        		<image  src="/static/logo.png"></image>
+				<!-- <image  src="https://rk-hw079058881.obs.cn-north-9.myhuaweicloud.com/fs/20250424/1745461007445.png"></image> -->
+        	</view>
+        	<view class="title">壹道正气</view>
+        </view>
+        <view class="login-notice">为了提供更优质的服务,请先登录</view>
+		<!-- <button
+			class="author-btn"
+			@click="wxLogin()"  >微信授权登录</button> -->
+		<view class="btns">
+			<button
+				class="author-btn"
+				open-type="getPhoneNumber"
+				@getphonenumber="phoneLogin"  >一键授权手机号登录</button>
+			<button class="author-btn" v-if="isAgreement==false" @click="handleAgree()">一键授权手机号登录</button>
+			
+		</view>
+		<!-- <button
+			class="author-btn"
+			open-type="getPhoneNumber"
+			@getphonenumber="phoneLogin"  >微信授权登录</button> -->
+		<button class="close-btn" @tap="back">暂不登录</button>
+			
+		<view class="tips">
+			<checkbox  :checked="isAgreement" @click="handleAgreement()" iconColor="#48a2e1"
+			 style="transform:scale(0.9)"/>
+			<view  @click="handleAgreement()">您同意并接受</view>
+		 	<view class="btn"  @click="openH5('/h5/userAgreement')">《用户协议》</view>
+		 	<view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+		</view>
+      </view>
+    </view>
+    <!-- #endif -->
+	 
+    
+  </view>
+</template>
+
+<script>
+import { loginByMiniApp,getUserInfo } from '@/api/user'
+export default {
+	data() {
+		return {
+			code:null,
+			isAgreement:false,
+		}
+	},
+	computed: {
+	},
+	onLoad(option) 
+	{
+		// #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() {
+	},
+	mounted() {
+    
+	},
+	methods: {
+		handleAgree(){
+			console.log(123)
+			
+			if(!this.isAgreement){
+			  	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
+		},
+		//获取微信CODE
+		getWxCode() {
+			//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
+			//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
+			var appId="wxd70f99287830cb51";
+			var url="https://api.zxfh.cdwjyyh.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/h5'
+			})
+		},
+		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 => {
+				
+			})
+		},
+		wxLogin() {
+			var that=this;
+			if(!this.isAgreement){
+				uni.showToast({
+					icon:'none',
+					title: "请先同意协议后再登录",
+				});
+				return false;
+			}
+			uni.showLoading({
+				title:"处理中..."
+			})
+			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: "登录成功",
+								});
+								console.log(res);
+								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,
+				});
+			})
+		},
+		// 微信用户手机号登录
+		phoneLogin(e) {
+			
+			var that=this;
+			if(!this.isAgreement){
+				uni.showToast({
+					icon:'none',
+					title: "请先同意协议后再登录",
+				});
+				return false;
+			}
+			uni.showLoading({
+				title:"处理中..."
+			})
+			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){
+									console.log(res)
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录成功",
+									});
+									uni.setStorageSync('AppToken',res.token);
+									uni.setStorageSync('userInfo',JSON.stringify(res.companyUser));
+									uni.hideLoading()
+									//that.getUserInfo()
+									uni.$emit('refreshLogin');
+									// uni.navigateBack({
+									// 	delta:1
+									// })
+									uni.navigateTo({
+										url:'/pages/enterprise/enterprise'
+									})
+								}
+								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.navigateBack()
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+	radio .wx-radio-input{
+	  width: 36rpx;
+	  height: 36rpx;
+	  border: 1px solid #CCCCCC;
+	}
+	/* 选中后的 背景样式  */
+	radio .wx-radio-input.wx-radio-input-checked{
+		background: linear-gradient(135deg, #48a2e1 0%, #60CDC3 100%);
+		border: 1px solid #48a2e1;
+	}
+	/* 选中后的 对勾样式 (白色对勾) */
+	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, #48a2e1 0%, #60CDC3 100%);
+		border: 1px solid #48a2e1;
+		border-radius: 50%;
+	}
+	checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
+		color: #ffffff;
+	}
+.container {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  position: relative;
+}
+
+.force-login-wrap {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  z-index: 11111;
+  top: 0;
+
+  .force-login__content {
+    position: absolute;
+    left: 50%;
+    top: 40%;
+    transform: translate(-50%, -50%);
+
+    .logo{
+    	display: flex;
+    	flex-direction: column;
+    	justify-content: center;
+    	align-items: center;
+    	.logo-img{
+    		border: 4upx solid #FFFFFF;
+    		box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
+    		border-radius: 50%;
+    		width: 80px;
+    		height: 80px;
+    		image{
+    			border-radius: 50%;
+    			width: 100%;
+    			height: 100%;
+    			overflow: hidden;
+    		}
+    	}
+    	
+    	.title{
+    		margin-top: 20rpx;
+    		font-size: 35rpx;
+    		font-family: PingFang SC;
+    		font-weight: bold;
+    		color: #000;
+    		margin-bottom: 30rpx;
+    	}
+    }
+
+    .login-notice {
+      font-size: 28rpx;
+      font-family: PingFang SC;
+      font-weight: 400;
+      color: #000;
+      line-height: 44rpx;
+      width: 500rpx;
+      text-align: center;
+      margin-bottom: 80rpx;
+    }
+	.btns{
+		position: relative;
+		width: 630rpx;
+		height: 80rpx;
+		.author-btn{				
+			z-index:100;
+			position: absolute;
+			width: 630rpx;
+			height: 80rpx;
+			background: linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+			background: -moz-linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+			// box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+			border-radius: 40rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: rgba(255, 255, 255, 1);
+		}
+	}
+	.author-btn{
+		z-index:100;
+		// position: absolute;
+		width: 630rpx;
+		height: 80rpx;
+		background: linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+		background: -moz-linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+		// box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+		border-radius: 40rpx;
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: rgba(255, 255, 255, 1);
+	}
+    .author-btn {
+      width: 630rpx;
+      height: 80rpx;
+      background: linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+      background: -moz-linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+      // box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+      border-radius: 40rpx;
+      font-size: 30rpx;
+      font-family: PingFang SC;
+      font-weight: 500;
+      color: rgba(255, 255, 255, 1);
+    }
+
+    .close-btn {
+      width: 630rpx;
+      height: 80rpx;
+      margin-top: 30rpx;
+      border-radius: 40rpx;
+      border: 2rpx solid #48a2e1;
+      background: none;
+      font-size: 30rpx;
+      font-family: PingFang SC;
+      font-weight: 500;
+      color: #48a2e1;
+    }
+  }
+}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	checkbox{
+	}
+	.btn{
+		color: #48a2e1;
+	}
+}
+
+
+.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: #48a2e1;
+				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 #48a2e1;
+				background: none;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #48a2e1;
+			}
+		}
+	}
+}
+.auth_btn{
+	width: 100%;
+	height: 100%;
+	top:0upx;
+	position: absolute;
+	opacity:0.0;
+}
+</style>

+ 46 - 5
pages/common/launch.vue

@@ -1,11 +1,13 @@
 <template>
 	<view class="content">
-		 
+		 <view class="loadding" v-if="loadding==true">
+		 	<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png"></image>
+		 	<text class="text">壹道正气</text>
+		 </view>
 	</view>
 </template>
 
 <script>
-	import { getConfigSignature } from '@/api/qw.js'
 	export default {
 		data() {
 			return {
@@ -24,13 +26,29 @@
 		methods: {
 			navigatHandler() {
 				if (!this.utils.isLogin()) {
+					// #ifdef H5
 					uni.reLaunch({
-						url: '../auth/login',
+						url: '/pages/auth/login',
 					})
+					// #endif
+					// #ifdef MP-WEIXIN
+					uni.reLaunch({
+						url: '/pages/auth/wxlogin',
+					})
+					// #endif
 				} else {
+					// #ifdef H5
 					uni.reLaunch({
-						url: '../user/index',
+						url: '/pages/index/index',
 					})
+					// #endif
+					// #ifdef MP-WEIXIN
+					console.log('现在')
+					uni.reLaunch({
+						url: '/pages/enterprise/enterprise',
+					})
+					// #endif
+					
 				}
 			},
 			getUserId() {
@@ -110,7 +128,7 @@
 	};
  
 </script>
-<style>
+<style lang="scss">
 	page{
 		background-color: #fff;
 	}
@@ -119,5 +137,28 @@
 		height: 100%;
 		width: 100%;
 		position: relative;
+	}
+	.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>

+ 102 - 0
pages/course/course.vue

@@ -0,0 +1,102 @@
+<template>
+	<view class="column hidden" style="height: 100%;">
+		<!-- <view class="p20 bgf" style="z-index: 999;">
+			<u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff"
+				:fontSize="15" :bold="false" @change="sectionChange" ></u-subsection>
+		</view>
+		<living v-if="current==0" style="margin-top: -240rpx;"></living> -->
+		<liveCourse @child-data-update="onChildDataUpdate" :parent-method="handleParentMethod"></liveCourse>
+	</view>
+</template>
+
+<script>
+	import liveCourse from "@/components/liveCourse.vue"
+	import living from "@/components/living.vue"
+	export default {
+		components: {
+			living,
+			liveCourse
+		},
+		data() {
+			return {
+				list: [{
+					name: '直播课',
+				}, {
+					name: '训练营'
+				}],
+				current:0,
+				childdata:[]
+			}
+		},
+		onLoad() {
+			wx.showShareMenu({
+			      withShareTicket: true, // 支持群聊分享带shareTicket
+			      menus: ['shareAppMessage'] // 同时启用两种分享
+			    })
+		},
+		mounted() {
+		},
+		methods: {
+			handleParentMethod() {
+			      uni.showToast({ title: '父组件方法被调用' });
+				  if (!this.childdata || Object.keys(this.childdata).length === 0) {
+				          uni.showToast({ title: '数据未准备好,无法分享', icon: 'none' });
+				          return;
+				      }
+					  this.$nextTick(()=>{
+						  setTimeout(()=>{
+								  uni.share({
+										  provider: 'weixin',
+										  scene: 'WXSceneSession', // 分享到会话
+										  type: 0,
+										  title: this.childdata.title,
+										  path: this.childdata.path+"?course="+this.childdata.params,
+										  imageUrl: this.childdata.img,
+										  success: (res) => {
+											console.log('分享成功', res);
+											uni.showToast({
+											  title: '分享成功',
+											  icon: 'none'
+											});
+										  },
+										  fail: (err) => {
+											console.log('分享失败', err);
+											uni.showToast({
+											  title: '分享失败,请稍后再试',
+											  icon: 'none'
+											});
+										  }
+										});
+						  },200)
+					  })
+				  
+				 
+			    },
+			onChildDataUpdate(data){
+				this.childdata=data
+				console.log('父组件',data)
+			},
+			onShareAppMessage() {
+			    return {
+			      title:this.childdata.title ,  // 分享卡片标题
+			      path:this.childdata.path+"?course="+this.childdata.params, // 目标页面路径
+			      // 携带参数:将当前页面的数据拼接到路径中
+			      imageUrl: this.childdata.img, // 分享卡片封面图(可选)
+			      success: (res) => {
+			        console.log("分享成功", res);
+			      },
+			      fail: (err) => {
+			        console.log("分享失败", err);
+			      },
+				}
+			},
+			sectionChange(index){
+				this.current=index
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+</style>

+ 205 - 0
pages/courseManage/course/becomeSale.vue

@@ -0,0 +1,205 @@
+<template>
+	<view class="centerV hb base-bg-f">
+		<image src="/static/logo.png" class="w110 h110"></image>
+		<view class="fs48 bold mt30">注册账户</view>
+		<view class="login">
+			 <view class="login-item">
+				 <view class="input-pwd input-phone">
+					 <input v-model="phoneNumber"  maxlength="11"
+					  placeholder="请输入电话号码" type="number" ></input>
+				 </view>
+			 </view> 
+			 <view class="login-item">
+				 <view class="input-account">
+					 <input v-model="nickName" 
+					  placeholder="请输入名字" type="text" ></input>
+				 </view>
+			 </view> 
+			 <view class="login-item">
+				 <!-- <text>密码</text> -->
+				 <view class="input-pwd">
+					 <input v-model="password" maxlength="16"
+					  placeholder="请输入密码" type="password" ></input>
+				 </view>
+			 </view> 
+			 <view class="btns">
+				 <view class="login-btn" @click="login">注册账号</view>
+			 </view>
+		</view>
+		<u-popup :show="showvip" @close="close" @open="open"
+		 mode='center' round='20' style="flex: 0;" >
+			<view class="VIPvie w600 h600 column justify-center align-center">
+				<image src="../../../static/manergevip/becomeTrue.png" class="h400 w400"></image>
+				<view class="bold fs50 center mt100">{{tips}}!</view>
+				<view class="gologin" @click="loginNav">去登录</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import { loginsales } from '@/api/courseManage.js'
+	export default {
+		data() {
+			return {
+				tips:'',
+				showvip:false,
+				companyId:'',
+				phoneNumber:'',
+				nickName:'',
+				password:''
+			}
+		},
+		onLoad(option) {
+			this.companyId = option.id
+		},
+		methods: {
+			close() {},
+			open() {},
+			login(){
+				const data={
+					companyId:this.companyId,
+					phoneNumber:this.phoneNumber,
+					nickName:this.nickName,
+					password:this.password
+				}
+				if(this.phoneNumber==''){
+					uni.showToast({ title: '请输入手机号!', icon: 'none' });
+					return
+				}
+				if(this.nickName==''){
+					uni.showToast({ title: '请输入名字!', icon: 'none' });
+					return
+				}
+				if(this.password==''){
+					uni.showToast({ title: '请输入密码!', icon: 'none' });
+					return
+				}
+				if(!uni.$u.test.mobile(this.phoneNumber)){
+					uni.showToast({ title: '请输入正确的手机号码!', icon: 'none' });
+					return
+				}
+				loginsales(data).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						this.showvip=true
+						this.tips='恭喜账户注册成功'
+						uni.showToast({
+							title: '注册成功',
+							icon: 'none',
+						});
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+							duration: 2000
+						});
+					}
+				})
+			},
+			loginNav(){
+				// 条件编译判断平台,设置不同登录页路径
+				 let loginPage = '';
+				 // #ifdef H5
+				 loginPage = '/pages/auth/login';
+				 // #endif
+				 // #ifdef MP-WEIXIN
+				 loginPage = '/pages/auth/wxlogin';
+				 // #endif
+				uni.navigateTo({
+					url:loginPage
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.VIPvie {
+	width: 580rpx;
+	background: linear-gradient(to bottom, #c3dbfe 2%, #f6fbfe 50%);
+	border-radius: 20rpx;
+	height: 640rpx;
+	position: relative;
+
+	image {
+		position: absolute;
+		top: -120rpx;
+		left: 16%;
+	}
+}
+.login{
+width: 100%;
+padding: 30rpx 50rpx;
+.login-item{
+	margin-bottom: 30rpx;
+	text-align: left;
+	.input-account{
+		margin-top: 20rpx;
+		margin-bottom: 20rpx;
+		border-radius:40rpx;
+		border:solid 1rpx #e4e4e4;
+		height: 80rpx;	
+		width: 100%;
+		background:url('/static/account.png') no-repeat 0 center;
+		background-size: 30rpx 30rpx;
+		background-position: 30rpx;
+		input{
+			margin-left: 80rpx;
+			height: 80rpx;
+			line-height: 80rpx
+		}
+	 
+	}
+	.input-pwd{
+		margin-top: 20rpx;
+		margin-bottom: 20rpx;
+		border-radius:40rpx;
+		border:solid 1rpx #e4e4e4;
+		height: 80rpx;	
+		width: 100%;
+		background:url('/static/password.png') no-repeat 0 center;
+		background-size: 30rpx 30rpx;
+		background-position: 30rpx;
+		input{
+			margin-left: 80rpx;
+			height: 80rpx;
+			line-height: 80rpx
+		}
+	}
+	.input-phone{
+		background:url('/static/manergevip/companyphone.png') no-repeat 0 center;
+		background-size: 40rpx 40rpx;
+		background-position: 24rpx;
+	}
+}
+.btns{
+	margin: 60rpx 0rpx;
+	.login-btn {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		width: 100%;
+		height: 80rpx;
+		// background: linear-gradient(to bottom, #cfe3ff, #cabbfd);
+		background: #5c82ff;
+		box-shadow: 0px 7rpx 6rpx 0px rgba(0, 0, 0, 0.2);
+		border-radius: 40rpx;
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: rgba(255, 255, 255, 1.0);
+	}
+}
+
+}
+.gologin{
+	color: #80b9ff;
+	margin-top: 40rpx;
+	border: #80b9ff solid 2rpx;
+	padding:10rpx 30rpx;
+	font-size: 24rpx;
+	border-radius: 40rpx;
+	margin-bottom: 20rpx;
+}
+</style>

+ 255 - 0
pages/courseManage/course/courseVideo.vue

@@ -0,0 +1,255 @@
+<template>
+	<view class="column">
+		<view class="video-box" >
+			<video id="myVideo" :src='listdetail.videoUrl' show-mute-btn='false'
+			vslide-gesture-in-fullscreen='true'   loop='true' enable-progress-gesture='true'
+			 enable-danmu controls='true'  autoplay="true" object-fit='contain' show-center-play-btn='true'
+			class="videotop" ></video> 
+		</view>
+		<view class="title-content" id="title-content">
+			<!-- 课程标题 -->
+			<view >
+				{{listdetail.title}} 
+			</view>
+			<view class="fs24" style="color: #666;font-weight: normal;">
+				{{listdetail.description}}
+			</view>
+			<view class="fs24" style="color: #999;font-weight: normal;">课程视频时长:{{formatSeconds(listdetail.duration)}}</view>
+		</view>
+		<!-- 问题 -->
+		<view class="ques-content ">
+			<view class="ques-content-tit">问答题</view>
+			<view class="center fs32" v-if="listdetail.questionBankList.length<1" style="color: #666;">暂无问答题</view>
+			<view v-for="(item,index) in listdetail.questionBankList" :key="index">
+				<view class="ques-title">
+					<text>{{index + 1}}.</text>
+					<view class="ques-type" v-show="item.type == 1 || item.type == 2">
+						{{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
+					</view>
+					<text >{{item.title}}</text>
+				</view>
+				<view :class="option.isAnswer== 1 ?'ques-option ques-option-active':'ques-option'"
+					v-for="(option,idx) in item.question" :key="idx">
+					<view>
+						{{numberToLetter(idx)}}.
+					</view>
+					<view>{{option.name}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="footer">
+			<view class="justify-between" >
+				<!-- <view class="copybtn flex-1 mr40" @click="buildimg">生成海报</view> -->
+				<view class="copybtn flex-1" @click="copyshareLink()">复制分享链接</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getcourseDetail,
+		sharecourselink
+	} from '@/api/courseManage'
+	import {
+		numberToLetter
+	} from "@/utils/tools.js"
+	export default {
+		data() {
+			return {
+				videoId:'',
+				listdetail:[],
+				user:{},
+				copylink:''
+			}
+		},
+		onLoad(option) {
+			this.videoId=option.videoId
+		},
+		onShow() {
+			this.getdetail()
+			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
+		},
+		methods: {
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			//转化时间格式
+			 formatSeconds(seconds) {
+			  const hours = Math.floor(seconds / 3600);
+			  const minutes = Math.floor((seconds % 3600) / 60);
+			  const remainingSeconds = seconds % 60;
+			  
+			  // 补零函数:确保两位数显示
+			  const pad = (num) => num.toString().padStart(2, '0');
+			  
+			  return `${pad(hours)}:${pad(minutes)}:${pad(remainingSeconds)}`;
+			},
+			// 获取视频详情
+			getdetail() {
+				const param = {
+					videoId:this.videoId
+				}
+				getcourseDetail(param).then(res => {
+					if(res.code==200){
+						this.listdetail=res.data
+						this.listdetail.questionBankList= this.listdetail.questionBankList.map(item => ({
+							...item,
+							question: JSON.parse(item.question),
+							answer: '',
+						}))
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+				})
+			},
+			copyshareLink(){
+				const params = {
+					companyId: this.user.companyId,
+					companyUserId: this.user.userId,
+					courseId: this.listdetail.courseId,
+					time: this.time,
+					videoId: this.listdetail.videoId,
+				}
+				sharecourselink(params).then(res => {
+					if (res.code == 200) {
+						this.copylink = res.url
+						// if (this.copylink.startsWith('http://')) {
+						// 	this.copylink = this.copylink.replace('http://', 'https://');
+						//   }
+						// console.log(this.copylink)
+						setTimeout(() => {
+							uni.setClipboardData({
+								data: this.copylink,
+								success: () => {
+									uni.showToast({
+										title: '链接已复制',
+										icon: 'none',
+										duration: 2000
+									});
+								},
+								fail: () => {
+									uni.showToast({
+										title: '复制失败',
+										icon: 'none'
+									});
+								}
+							});
+						}, 100)
+				
+						console.log(this.copylink)
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+				console.log(123)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.video-box {
+	width: 100%;
+	height: 420rpx;
+	overflow: hidden;
+	position: relative;
+
+	#myVideo {
+		width: 100%;
+		height: 100%;
+	}
+}
+.title-content {
+	padding: 20rpx 32rpx;
+	background-color: #fff;
+	font-size: 28rpx;
+	font-weight: bold;
+	line-height: 1.6;
+	
+}
+.ques-content-tit {
+	font-family: PingFang SC, PingFang SC;
+	font-weight: 600;
+	font-size: 36rpx;
+	color: #222222;
+}
+.ques-content {
+	background-color: #fff;
+	margin-top: 20rpx;
+	padding: 32rpx 32rpx;
+	padding-bottom: 140rpx;
+	box-sizing: border-box;
+	ont-family: PingFang SC, PingFang SC;
+	font-weight: 400;
+	font-size: 28rpx;
+	color: #222222;
+}
+.ques-title {
+	margin: 32rpx 0 34rpx 0;
+	font-weight: 500;
+	font-size: 32rpx;
+	white-space: normal;
+}
+.ques-type {
+	flex-shrink: 0;
+	min-width: 72rpx;
+	height: 40rpx;
+	padding: 0 12rpx;
+	margin: 0 12rpx;
+	box-sizing: border-box;
+	background: #ff8901;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	line-height: 40rpx;
+	text-align: center;
+	font-family: PingFang SC, PingFang SC;
+	font-weight: 400;
+	font-size: 24rpx;
+	color: #FFFFFF;
+	display: inline-block;
+}
+
+.ques-option {
+	min-height: 88rpx;
+	padding: 24rpx 32rpx;
+	box-sizing: border-box;
+	margin-bottom: 24rpx;
+	background: #F5F7FA;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	display: flex;
+	align-items: center;
+
+	&-active {
+		color: #1db131 !important;
+		background: #e8fcee !important;
+	}
+}
+.footer {
+	border-top: 1rpx solid #ededef;
+	background: #fff;
+	width: 100%;
+	position: fixed;
+	bottom: 0;
+	padding: 24rpx 32rpx;
+	box-sizing: border-box;
+	z-index: 9;
+	.copybtn {
+		background: #FF5C03;
+		color: #fff;
+		text-align: center;
+		font-size: 28rpx;
+		border-radius: 80rpx;
+		padding: 20rpx 0;
+	}
+}
+</style>

+ 0 - 263
pages/courseManage/course/index.vue

@@ -1,263 +0,0 @@
-<template>
-	<view>
-		<view class="training-camp">
-			<view class="training-camp-btn" @click="choose">{{title}}</view>
-		</view>
-		<u-picker ref="upicker" :show="show" :columns="columns" title="训练营选择" keyName="courseName" @confirm="confirm"
-			@cancel="cancel"></u-picker>
-		<view class="container-body x-start" :style="{height: contentH,width:'100%'}">
-			<view class="container-right">
-				<scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true"
-					:refresher-triggered="triggered" refresher-background="rgba(0,0,0,0)"
-					@refresherrefresh="pullDownRefresh" @refresherrestore="triggered = false" :upper-threshold="100"
-					:lower-threshold="100" @refresherabort="triggered = false" @scrolltolower="reachBottom">
-					<view class="list">
-						<courseItem :from="'course'" :activeTab="0" v-for="(item,index) in dataList" :key="index"
-							:info="item" />
-						<u-loadmore :status="loadStatus" />
-					</view>
-				</scroll-view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		getFsCourseList,
-		getCourseVdieoList
-	} from "@/api/courseManage.js"
-	import courseItem from "../components/courseItem.vue"
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	import MescrollMoreItemMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more-item.js";
-	export default {
-		mixins: [MescrollMixin, MescrollMoreItemMixin],
-		components: {
-			courseItem
-		},
-		data() {
-			return {
-				title: '请选择训练营',
-				contentH: 0,
-				show: false,
-				columns: [
-					[]
-				],
-				downOption: {
-					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
-				},
-				upOption: {
-					auto: false, // 不自动加载
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量
-					},
-					noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
-					toTop: {
-						width: 0,
-					}
-				},
-				keyword: "",
-				dataList: [],
-				user: {},
-				courseList: [],
-				chooseIndex: [0],
-				courseId: '',
-				mescroll: null,
-				params: {
-					pageNum: 1,
-					pageSize: 10
-				},
-				triggered: false,
-				loadStatus: 'loadmore',
-			}
-		},
-		mounted() {
-			console.log("======cou")
-			const windowHeight = uni.getSystemInfoSync().windowHeight
-			this.contentH = `calc(${windowHeight}px - 52px - 56px)`
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			this.getFsCourseList()
-		},
-		methods: {
-			choose() {
-				this.show = true
-				this.$refs.upicker.setIndexs(this.chooseIndex)
-			},
-			cancel() {
-				this.show = false
-			},
-			confirm(e) {
-				this.chooseIndex = e.indexs
-				this.courseId = e.value[0].courseId
-				this.title = e.value[0].courseName
-				this.show = false
-				// this.mescroll.resetUpScroll()
-				this.getListInit()
-			},
-			// 训练营
-			getFsCourseList() {
-				const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getFsCourseList(param).then(res => {
-					if (res.code == 200) {
-						this.courseList = res.data || []
-						this.columns = [this.courseList]
-						this.courseId = this.courseList && this.courseList.length > 0 ? this.courseList[0]
-							.courseId : ''
-						this.title = this.courseList && this.courseList.length > 0 ? this.courseList[0]
-							.courseName : '请选择训练营'
-						this.getListInit()
-						// this.mescroll.resetUpScroll()
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			getListInit() {
-				this.params.pageNum = 1
-				this.getListData('refresh')
-			},
-			async getListData(type = 'refresh') {
-				uni.showLoading({
-					title: "加载中..."
-				})
-				this.loadStatus = 'loading'
-				const result = await getCourseVdieoList({
-					courseId: this.courseId,
-					status: '',
-					...this.params
-				})
-				if (result) {
-					const {
-						isLastPage,
-						total,
-						list,
-					} = result.data
-					if (type == 'refresh') {
-						this.dataList = list
-					} else {
-						this.dataList = [...this.dataList, ...list]
-					}
-					if (isLastPage) {
-						this.loadStatus = 'nomore';
-					} else {
-						this.loadStatus = 'loadmore';
-					}
-					uni.hideLoading()
-				} else {
-					uni.showToast({
-						icon: 'none',
-						title: "请求失败",
-					});
-					this.dataList = []
-				}
-			},
-			/**
-			 * 触底添加下一页
-			 */
-			reachBottom(options) {
-				if (this.loadStatus === 'loadmore') {
-					this.loadStatus = 'loading'
-					uni.showNavigationBarLoading()
-					setTimeout(() => {
-						this.params.pageNum += 1;
-						this.getListData('more')
-						uni.hideNavigationBarLoading()
-					}, 500);
-				}
-			},
-			/**
-			 * 下拉列表页
-			 */
-			pullDownRefresh(options) {
-				this.triggered = true;
-				setTimeout(() => {
-					this.triggered = false;
-					uni.stopPullDownRefresh()
-					this.params.pageNum = 1;
-					this.getListData('refresh')
-				}, 500)
-			}
-		}
-	}
-</script>
-
-<style>
-	page {
-		background-color: #f5f4f5;
-	}
-</style>
-<style lang="scss" scoped>
-	.training-camp {
-		padding: 10px;
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #222222;
-
-		&-btn {
-			font-size: 15px;
-			width: 100%;
-			height: 32px;
-			line-height: 32px;
-			text-align: center;
-			background-color: #fff;
-			border-radius: 50px;
-			border: 1px solid #ccc;
-		}
-	}
-
-	.container-left {
-		flex-shrink: 0;
-		background-color: #fff;
-		width: 80px;
-		height: 100%;
-		overflow-y: auto;
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #222222;
-
-		.active {
-			background-color: #f5f4f5;
-			font-weight: bold;
-			position: relative;
-
-			&::after {
-				content: "";
-				height: 15px;
-				width: 4px;
-				background-color: #1677ff;
-				position: absolute;
-				top: 50%;
-				left: 0;
-				transform: translateY(-50%);
-			}
-		}
-
-		.classification {
-			padding: 20px 16px;
-			box-sizing: border-box;
-		}
-	}
-
-	.container-right {
-		flex: 1;
-		height: 100%;
-		overflow-y: scroll;
-
-		.list {
-			padding: 10px;
-			box-sizing: border-box;
-			width: 100%;
-		}
-	}
-</style>

+ 0 - 22
pages/courseManage/course/living.vue

@@ -1,22 +0,0 @@
-<template>
-	<view class="column">
-		
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		methods: {
-			
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-</style>

+ 0 - 736
pages/courseManage/dataIndex/index.vue

@@ -1,736 +0,0 @@
-<!-- 数据组件页面 -->
-<template>
-	<view class="column flex-1 hb">
-		<view class="topdata">
-			<view class="topdata-box">
-				<view>数据汇总</view>
-				<view class="x-bc">
-					<view class="topdata-item">
-						<view class="topdata-item-num"><text>{{companyUserUserCount}}</text>人</view>
-						<view>会员总数</view>
-					</view>
-					<view class="topdata-item">
-						<view class="topdata-item-num"><text>{{companyUserCount}}</text>人</view>
-						<view>今日新增会员</view>
-					</view>
-				</view>
-			</view>
-			<view>
-				<u-collapse ref="puyaodameinvRef" :value="['0']" :border='false' @change='changelable'>
-					<u-collapse-item name="0" :border='false'>
-						<view slot="title">
-							<text class="bold fs32">标签统计</text>
-							<text class="fs24 base-color-9 ml12">左滑查看更多</text>
-						</view>
-						<text slot="value" class="statistics-slot-title">{{collapseLable?'展开':'收回'}}</text>
-						<view slot="right-icon">
-							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-						</view>
-						<view class="">
-							<view class=" mb20 morelable">
-								<view class="base-bg-f5 p20  radius20 boxlable mr40"
-									v-for="(item,index) in lablelistnum" :key="index" style="display: inline-block;">
-									<view class="base-color-3 ">{{item.tag}}</view>
-									<view class="base-color mt8">
-										<text class="fs40 bold">{{item.count}}</text>
-										人
-									</view>
-								</view>
-							</view>
-						</view>
-					</u-collapse-item>
-				</u-collapse>
-			</view>
-			<view class="searchbox">
-				<view class="searchbox-bar x-ac">
-					<view :class="queryParam.type == index ? 'searchbox-item searchbox-active':'searchbox-item'"
-						v-for="(item,index) in typeOption" :key="index" @click="handleType(index)">{{item.label}}</view>
-				</view>
-				<view class="x-ac ss" v-show="queryParam.type == 3">
-					<view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
-							size="20"></u-icon>{{startTime}}</view>
-					<view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
-							size="20"></u-icon>{{endTime}}</view>
-				</view>
-			</view>
-		</view>
-		<u-calendar :show="showCalendar" :mode="mode" @confirm="confirmCalendar" style="flex: 0;"
-		 @close="closeCalendar"></u-calendar>
-		<view class="statistics pb120" :style="{height: contentH}">
-			<u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
-				<u-collapse-item name="course">
-					<text slot="title" class="statistics-title">课程统计</text>
-					<text slot="value"
-						class="statistics-slot-title">{{collapseValue.includes('course')?'收回':'展开'}}</text>
-					<view slot="right-icon">
-						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-					</view>
-					<view class="collapse-content x-ac">
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">观看人数</view>
-							<view class="collapse-content-num"><text>{{courseCount.count || 0}}</text>人</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(courseCount.count,courseCount.yesterdayCount)}}</view>
-							<view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayCount || 0}}</view>
-						</view>
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">完播人数</view>
-							<view class="collapse-content-num"><text>{{courseCount.completeCount || 0}}</text>人</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(courseCount.completeCount,courseCount.yesterdayCountCompleteCount)}}
-							</view>
-							<view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayCountCompleteCount || 0}}
-							</view>
-						</view>
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">完播率</view>
-							<view class="collapse-content-num"><text>{{courseCount.rate || 0}}</text>%</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(courseCount.rate,courseCount.yesterdayRate)}}</view>
-							<view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayRate || 0}}</view>
-						</view>
-					</view>
-				</u-collapse-item>
-				<u-collapse-item name="questions">
-					<text slot="title" class="statistics-title">答题统计</text>
-					<text slot="value"
-						class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
-					<view slot="right-icon">
-						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-					</view>
-					<view class="collapse-content x-ac">
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">答题人数</view>
-							<view class="collapse-content-num"><text>{{quesCount.count || 0}}</text>人</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(quesCount.count,quesCount.yesterdayCount)}}</view>
-							<view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayCount || 0}}</view>
-						</view>
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">正确人数</view>
-							<view class="collapse-content-num"><text>{{quesCount.completeCount || 0}}</text>人</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(quesCount.completeCount,quesCount.yesterdayCountCompleteCount)}}</view>
-							<view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayCountCompleteCount || 0}}</view>
-						</view>
-						<view class="collapse-content-item">
-							<view class="collapse-content-title">正确率</view>
-							<view class="collapse-content-num"><text>{{quesCount.rate || 0}}</text>%</view>
-							<view style="color: #1677ff;" v-show="queryParam.type == 0">
-								较昨天持平{{compare(quesCount.rate,quesCount.yesterdayRate)}}</view>
-							<view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayRate || 0}}</view>
-						</view>
-					</view>
-				</u-collapse-item>
-				<u-collapse-item name="redenvelope">
-					<text slot="title" class="statistics-title">红包统计</text>
-					<text slot="value"
-						class="statistics-slot-title">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
-					<view slot="right-icon">
-						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-					</view>
-					<view>
-						<view class="collapse-content x-ac">
-							<view class="collapse-content-item">
-								<view class="collapse-content-title">答题红包数</view>
-								<view class="collapse-content-num"><text>{{redPacketCount.count || 0}}</text>个</view>
-								<view style="color: #1677ff;" v-show="queryParam.type == 0">
-									较昨天持平{{compare(redPacketCount.count,redPacketCount.yesterdayCount)}}</view>
-								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayCount || 0}}</view>
-							</view>
-							<view class="collapse-content-item">
-								<view class="collapse-content-title">答题红包金额</view>
-								<view class="collapse-content-num"><text>{{redPacketCount.amount || '0.00'}}</text>元
-								</view>
-								<view style="color: #1677ff;" v-show="queryParam.type == 0">
-									较昨天持平{{compare(redPacketCount.amount,redPacketCount.yesterdayAmount,1)}}</view>
-								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayAmount || '0.00'}}
-								</view>
-							</view>
-						</view>
-						<view class="collapse-content x-ac" style="padding: 8px 0;">
-							<view class="collapse-content-item">
-								<view class="collapse-content-title">新会员奖励数</view>
-								<view class="collapse-content-num"><text>{{redPacketCount.newCount || 0}}</text>个</view>
-								<view style="color: #1677ff;" v-show="queryParam.type == 0">
-									较昨天持平{{compare(redPacketCount.newCount,redPacketCount.yesterdayNewCount)}}</view>
-								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayNewCount || 0}}</view>
-							</view>
-							<view class="collapse-content-item">
-								<view class="collapse-content-title">新会员奖励金额</view>
-								<view class="collapse-content-num">
-									<text>{{redPacketCount.totalAmount || '0.00'}}</text>元
-								</view>
-								<view style="color: #1677ff;" v-show="queryParam.type == 0">
-									较昨天持平{{compare(redPacketCount.totalAmount,redPacketCount.yesterdayTotalAmount,1)}}
-								</view>
-								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayTotalAmount || '0.00'}}
-								</view>
-							</view>
-						</view>
-					</view>
-				</u-collapse-item>
-				<u-collapse-item name="funnel" v-if="user.userType==0">
-					<text slot="title" class="statistics-title">转化漏斗图</text>
-					<text slot="value"
-						class="statistics-slot-title">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
-					<view slot="right-icon">
-						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-					</view>
-					<view >
-						<funnelChart :getratelist="getrateimg" />
-					</view>
-				</u-collapse-item>
-				<u-collapse-item name="rank"  v-if="user.userType==0">
-					<text slot="title" class="statistics-title">排行榜</text>
-					<text slot="value"
-						class="statistics-slot-title">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
-					<view slot="right-icon">
-						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
-					</view>
-					<view class="flex-1">
-						<view class="mt40">
-							<view class="justify-between align-center">
-								<view class="base-color-3 bold fs32">群管排行榜</view>
-								<view class="justify-start" @click="ordergroup(1)" 
-								v-if="orderGroup=='asc'">
-									<u-icon name="list-dot" size="20"></u-icon>
-									<view>按正序(前20名)</view>
-								</view>
-								<view class="justify-start" @click="ordergroup(0)" v-else>
-									<u-icon name="list-dot" size="20"></u-icon>
-									<view>按倒序(后20名)</view>
-								</view>
-							</view>
-							<view class="centerV">
-								<u-tabs :list="list1" @click="clickTab" lineColor='#1773ff' lineWidth='40'
-									activeStyle="font-weight:bold"></u-tabs>
-							</view>
-							<view class="justify-start align-center mtb28" 
-							v-for="(item,index) in rankListA"
-							:key="index">
-								<u-avatar :src="item.avatar" size="40"></u-avatar>
-								<view class="flex-1 ml20">
-									<view class="justify-between mb16">
-										<view class="base-color-3">{{item.name}}</view>
-										<view>{{item.rate}}%</view>
-									</view>
-									<u-line-progress :percentage="30" activeColor='#1773ff'/>
-								</view>
-							</view>
-							<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
-						</view>
-						<view class="mt60 column flex-1">
-							<view class="justify-between align-center">
-								<view class="base-color-3 bold fs32">课程排行榜</view>
-								<view class="justify-start" @click="ordergroupB(1)" 
-								v-if="orderGroupB=='asc'">
-									<u-icon name="list-dot" size="20"></u-icon>
-									<view>按正序(前20名)</view>
-								</view>
-								<view class="justify-start" @click="ordergroupB(0)" v-else>
-									<u-icon name="list-dot" size="20"></u-icon>
-									<view>按倒序(后20名)</view>
-								</view>
-							</view>
-							<view class="centerV">
-								<u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff' lineWidth='40'
-									activeStyle="font-weight:bold"></u-tabs>
-							</view>
-							<view class="justify-start align-center"
-							v-for="(item,index) in rankListB"
-							:key="index">
-								<view class="flex-1 ml20">
-									<view class="justify-between mb16">
-										<view class="base-color-3">{{item.name}}</view>
-										<view>{{item.rate}}%</view>
-									</view>
-									<u-line-progress :percentage="30" activeColor='#ed0922'/>
-								</view>
-							</view>
-							<view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
-						</view>
-					</view>
-				</u-collapse-item>
-			</u-collapse>
-		</view>
-	</view>
-</template>
-
-<script>
-	import code from "../../../uni_modules/uview-ui/libs/config/props/code"
-	import funnelChart from "../components/chart.vue"
-	import {
-		getCompanyUserAndUserCount,
-		getCourseCount,
-		getQuesCount,
-		getRecPacketCount,
-		getlableNum,
-		getcourseRate,
-		getGroupRanklist,
-		getCourseRanklist
-	} from "@/api/courseManage.js"
-	export default {
-		components: {
-			funnelChart,
-		},
-		data() {
-			return {
-				list1: [{
-					name: '按完播率',
-				}, {
-					name: '按正确率'
-				}],
-				orderGroup:'asc',
-				orderGroupB:'asc',
-				showCalendar: false,
-				mode: 'range',
-				typeOption: [{
-					label: '今日',
-					value: 0
-				}, {
-					label: '昨日',
-					value: 1
-				}, {
-					label: '本月',
-					value: 2
-				}, {
-					label: '自定义',
-					value: 3
-				}],
-				queryParam: {
-					type: 0
-				},
-				contentH: 0,
-				collapseValue: ['course', 'questions', 'redenvelope', 'funnel','rank'],
-				user: {},
-				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
-				startTime: '',
-				endTime: '',
-				companyUserCount: 0,
-				companyUserUserCount: 0,
-				courseCount: {},
-				quesCount: {},
-				redPacketCount: {},
-				collapseLable: false,
-				lablelistnum: [],
-				getrateimg: {},
-				rankListA:[],
-				rankListB:[],
-				activeA:0,
-				activeB:0
-			}
-		},
-		computed: {
-			compare() {
-				return (today, yesterday, type) => {
-					const num = Number(yesterday || 0) - Number(today || 0)
-					return type == 1 ? num.toFixed(2) : 0
-				}
-			}
-		},
-		mounted() {
-			this.getHeight()
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			// this.getUserCount()
-			// this.resetDate()
-			this.getlableData()
-			this.getrateList()
-			this.getrankCourse()
-			this.getrankgroup()
-		},
-		methods: {
-			clickTab(item) {
-				this.activeA=item.index+1
-				this.getrankgroup()
-				console.log(this.activeA)
-			},
-			clickTabB(item) {
-				this.activeB=item.index+1
-				this.getrankCourse()
-				console.log(this.activeA)
-			},
-			ordergroup(item){
-				if(item==0){
-					this.orderGroup='asc'
-					this.getrankgroup()
-				}else{
-					this.orderGroup='desc'
-					this.getrankgroup()
-				}
-			},
-			ordergroupB(item){
-				if(item==0){
-					this.orderGroupB='asc'
-					this.getrankCourse()
-				}else{
-					this.orderGroupB='desc'
-					this.getrankCourse()
-				}
-			},
-			getrankCourse(){
-				//获取课程排行
-				this.startTime = this.todayday
-				this.endTime = this.todayday
-				this.resetDate()
-				const params = {
-					companyId: this.user.companyId,
-					endTime: this.endTime+' 23:59:59',
-					startTime: this.startTime+' 00:00:00',
-					order:this.orderGroupB,
-					type: this.activeB, // 0:经销商/1:群管
-				}
-				getCourseRanklist(params).then(res=>{
-					if (res.code == 200) {
-						this.rankListB = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getrankgroup(){
-				//获取群管排行
-				this.startTime = this.todayday
-				this.endTime = this.todayday
-				this.resetDate()
-				const params = {
-					companyId: this.user.companyId,
-					endTime: this.endTime+' 23:59:59',
-					startTime: this.startTime+' 00:00:00',
-					order:this.orderGroup,
-					type: this.activeA, // 0:经销商/1:群管
-				}
-				getGroupRanklist(params).then(res=>{
-					if (res.code == 200) {
-						console.log(res)
-						this.rankListA = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getrateList() {
-				//获取漏斗图
-				this.startTime = this.todayday
-				this.endTime = this.todayday
-				this.resetDate()
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					endTime: this.endTime+' 23:59:59',
-					startTime: this.startTime+' 00:00:00',
-					courseId: this.courseid,
-					videoId: this.courseids,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getcourseRate(params).then(res => {
-					if (res.code == 200) {
-						this.getrateimg = res
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getlableData() {
-				const params = {
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getlableNum(params).then(res => {
-					if (res.code == 200) {
-						this.lablelistnum = res.data
-						this.$nextTick(() => {
-							this.$refs.puyaodameinvRef.init()
-						})
-						console.log(res)
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			changelable(e) {
-				if (e[0].status = 'open') {
-					this.collapseLable = true
-				}
-			},
-			getHeight() {
-				const windowHeight = uni.getSystemInfoSync().windowHeight
-				const query = uni.createSelectorQuery().in(this);
-				query
-					.select(".topdata")
-					.boundingClientRect((data) => {
-						this.contentH = `calc(${windowHeight}px - ${data.height}px - 56px)`
-					})
-					.exec();
-			},
-			resetDate() {
-				if (this.queryParam.type == 0) {
-					this.startTime = this.todayday
-					this.endTime = this.todayday
-				} else if (this.queryParam.type == 1) {
-					let yesterday = new Date();
-					yesterday.setDate(yesterday.getDate() - 1);
-
-					this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
-					this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
-				} else if (this.queryParam.type == 2) {
-					let today = new Date();
-					let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
-
-					this.startTime = uni.$u.timeFormat(this.todayday, 'yyyy-mm') + '-01'
-					this.endTime = uni.$u.timeFormat(lastDayOfMonth, 'yyyy-mm-dd')
-				} else if (this.queryParam.type == 3) {
-					this.startTime = this.todayday
-					this.endTime = this.todayday
-				}
-				this.getCount()
-			},
-			handleType(type) {
-				if (this.queryParam.type == type) {
-					return
-				}
-				this.queryParam.type = type
-				if (this.queryParam.type == 3) {
-					this.getHeight()
-				}
-				this.resetDate()
-				this.getrateList()
-				this.getrankCourse()
-				this.getrankgroup()
-			},
-			changeCollapse(e) {
-				this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
-			},
-			closeCalendar() {
-				this.showCalendar = false
-			},
-			confirmCalendar(e) {
-				this.startTime = e[0]
-				this.endTime = e[e.length - 1]
-				this.showCalendar = false
-				this.getCount()
-			},
-			getUserCount() {
-				const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					courseId: '',
-					endTime: day + ' 23:59:59',
-					startTime: day + ' 00:00:00',
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getCompanyUserAndUserCount(param).then(res => {
-					if (res.code == 200) {
-						this.companyUserCount = res.data.companyUserCount || 0
-						this.companyUserUserCount = res.data.companyUserUserCount || 0
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			getCount() {
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					courseId: '',
-					endTime: this.endTime + ' 23:59:59',
-					startTime: this.startTime + ' 00:00:00',
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				this.getCourseCount(param)
-				this.getQuesCount(param)
-				this.getRecPacketCount(param)
-			},
-			getCourseCount(param) {
-				getCourseCount(param).then(res => {
-					if (res.code == 200) {
-						this.courseCount = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			getQuesCount(param) {
-				getQuesCount(param).then(res => {
-					if (res.code == 200) {
-						this.quesCount = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			getRecPacketCount(param) {
-				getRecPacketCount(param).then(res => {
-					if (res.code == 200) {
-						this.redPacketCount = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.boxlable {
-		width: 47%;
-	}
-
-	.morelable {
-		width: 100%;
-		overflow-x: auto;
-		/* 添加横向滚动条 */
-		white-space: nowrap;
-	}
-
-	.container {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #222222;
-	}
-
-	.calendar-day {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 12px;
-		color: #999;
-		flex: 1;
-		margin: 10px 10px 0 10px;
-		background-color: #f5f5f5;
-		border-radius: 4px;
-	}
-
-	.topdata {
-		padding-top: 25px;
-		background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
-
-		&-box {
-			padding: 12px;
-			margin: 0 12px 0 12px;
-			background-color: rgba(255, 255, 255, 0.5);
-			border-radius: 8px 8px;
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 400;
-			font-size: 14px;
-			color: #222222;
-		}
-
-		&-item {
-			width: 50%;
-			text-align: center;
-			padding: 8px;
-			box-sizing: border-box;
-
-			&-num {
-				color: #1677ff;
-
-				text {
-					font-family: DIN, DIN;
-					font-weight: bold;
-					font-size: 25px;
-				}
-			}
-		}
-
-		.searchbox {
-			background-color: #fff;
-			border-radius: 8rpx 8rpx 0 0;
-			padding: 15px;
-
-			&-item {
-				height: 23px;
-				line-height: 23px;
-				width: 65px;
-				background: #f5f5f5;
-				text-align: center;
-				border-radius: 5px;
-				font-family: PingFang SC, PingFang SC;
-				font-weight: 400;
-				font-size: 12px;
-				color: #888;
-			}
-
-			&-active {
-				color: #fff !important;
-				background-color: #1677ff !important;
-			}
-		}
-	}
-
-	.statistics {
-		background-color: #fff;
-		overflow-y: auto;
-		box-sizing: border-box;
-
-		&-title {
-			font-family: PingFang SC, PingFang SC;
-			font-weight: bold;
-			font-size: 16px;
-			color: #222222;
-		}
-
-		&-slot-title {
-			font-size: 12px;
-			color: #1677ff;
-		}
-
-		.collapse-content {
-			margin: 0 -8px -8rpx 0;
-
-			&-item {
-				flex: 1;
-				padding: 12px;
-				box-sizing: border-box;
-				border-radius: 10px;
-				background: #f5f5f5;
-				font-family: PingFang SC, PingFang SC;
-				font-weight: 400;
-				font-size: 10px;
-				color: #222222;
-				margin: 0 8px 8rpx 0;
-			}
-
-			&-title {
-				font-size: 14px;
-				margin-bottom: 10px;
-			}
-
-			&-num {
-				color: #1677ff;
-				font-size: 10px;
-
-				text {
-					font-family: DIN, DIN;
-					font-weight: bold;
-					font-size: 25px;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 132
pages/courseManage/index.vue

@@ -1,132 +0,0 @@
-<template>
-	<view>
-		<view class="app-wrapper" :style="{height: '100vh'}">
-			<dataIndex v-if="templateView == 'dataIndex'"></dataIndex>
-			<liveIndex ref="mescrollItem1" v-show="templateView == 'liveIndex'"></liveIndex>
-			<operationIndex ref="mescrollItem1" :key="templateView" v-show="templateView == 'operationIndex'">
-			</operationIndex>
-			<courseIndex ref="mescrollItem2" v-show="templateView == 'courseIndex'"></courseIndex>
-			<vipIndex ref="mescrollItem3" v-show="templateView == 'vipIndex'"></vipIndex>
-			<manageIndex ref="mescrollItem3" v-show="templateView == 'manageIndex'"></manageIndex>
-		</view>
-		<view class="myTabBar x-f x-bc">
-			<view class="myTabBar-item x-f y-f" @click="handleTab('dataIndex')">
-				<image src="@/static/manageTabIcon/data.png" mode="aspectFill" v-if="templateView!=='dataIndex'">
-				</image>
-				<image src="@/static/manageTabIcon/data_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='dataIndex'?'base-color':''">数据</text>
-			</view>
-			<view class="myTabBar-item x-f y-f" @click="handleTab('operationIndex')" v-if="user.userType==0">
-				<image src="@/static/manageTabIcon/liveclasses.png" mode="aspectFill"
-					v-if="templateView!=='operationIndex'"></image>
-				<image src="@/static/manageTabIcon/liveclasses_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='operationIndex'?'base-color':''">运营</text>
-			</view>
-			<view class="myTabBar-item x-f y-f" @click="handleTab('liveIndex')" v-if="user.userType==1">
-				<image src="@/static/manageTabIcon/liveclasses.png" mode="aspectFill" v-if="templateView!=='liveIndex'">
-				</image>
-				<image src="@/static/manageTabIcon/liveclasses_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='liveIndex'?'base-color':''">直播课</text>
-			</view>
-			<view class="myTabBar-item x-f y-f" @click="handleTab('courseIndex')">
-				<image src="@/static/manageTabIcon/training.png" mode="aspectFill" v-if="templateView!=='courseIndex'">
-				</image>
-				<image src="@/static/manageTabIcon/training_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='courseIndex'?'base-color':''" v-if="user.userType==1">训练营</text>
-				<text :class="templateView=='courseIndex'?'base-color':''" v-else>课程库</text>
-			</view>
-			<view class="myTabBar-item x-f y-f" @click="handleTab('vipIndex')">
-				<image src="@/static/manageTabIcon/vip.png" mode="aspectFill" v-if="templateView!=='vipIndex'"></image>
-				<image src="@/static/manageTabIcon/vip_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='vipIndex'?'base-color':''">会员</text>
-			</view>
-			<view class="myTabBar-item x-f y-f" @click="handleTab('manageIndex')" v-if="user.userType==0">
-				<image src="@/static/manageTabIcon/manage.png" mode="aspectFill" v-if="templateView!=='manageIndex'">
-				</image>
-				<image src="@/static/manageTabIcon/manage_on.png" mode="aspectFill" v-else></image>
-				<text :class="templateView=='manageIndex'?'base-color':''">管理</text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js";
-	import MescrollMoreMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more.js";
-	import dataIndex from "./dataIndex/index.vue"
-	import liveIndex from "./live/index.vue"
-	import courseIndex from "./course/index.vue"
-	import vipIndex from "./vip/index.vue"
-	import operationIndex from './operation/index.vue'
-	import manageIndex from './manage/index.vue'
-	export default {
-		mixins: [ MescrollCompMixin,MescrollMoreMixin], //mescroll-body写在子组件时
-		components: {
-			dataIndex,
-			liveIndex,
-			courseIndex,
-			vipIndex,
-			operationIndex,
-			manageIndex
-		},
-		data() {
-			return {
-				templateView: 'vipIndex',
-				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
-				windowHeight: uni.getSystemInfoSync().windowHeight,
-				bodyHeight: 0,
-				tabIndex: 0,
-				user: []
-			}
-		},
-		onLoad() {
-			// console.log(this.windowHeight);
-			this.bodyHeight = `calc(${this.windowHeight}px - 56px)`
-			uni.setNavigationBarTitle({
-				title: '数据'
-			});
-		},
-		mounted() {
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			if (this.user.userType == 0) {
-				this.templateView = 'manageIndex'
-			} else {
-				this.templateView = 'vipIndex'
-			}
-		},
-		methods: {
-			handleTab(tem) {
-				this.templateView = tem
-				// console.log(tem)
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.app-wrapper {
-		width: 100%;
-	}
-
-	.myTabBar {
-		height: 64px;
-		border-top: 1px solid #f5f5f5;
-		box-sizing: border-box;
-		width: 100%;
-		background-color: #fff;
-		position: fixed;
-		bottom: var(--window-bottom);
-		left: 0;
-		font-size: 10px;
-
-		image {
-			width: 24px;
-			height: 24px;
-			margin-bottom: 3px;
-		}
-
-		&-item {
-			flex: 1;
-		}
-	}
-</style>

+ 265 - 57
pages/courseManage/manage/changeVip.vue

@@ -8,10 +8,10 @@
 			</view>
 		</view>
 		<view class="pl20 " v-if="active==0">
-			<view class="mb20 fs28">选择接收群管</view>
+			<view class="mb20 fs28">选择接收销售</view>
 			<view class="base-bg-f8 p10 justify-between align-center mr20 pl20">
-				<text class="mr20">接收群管</text>
-				<u-input placeholder="请选择接收群管" @focus="selsome" border="none"
+				<text class="mr20">接收销售</text>
+				<u-input placeholder="请选择接收销售" @focus="selsome" border="none"
 				v-model="username"></u-input>
 			</view>
 			<view class='fs24 mtb12 base-color base-bg-sure mr20 pl20 ptb4'>
@@ -30,10 +30,10 @@
 				<u-input placeholder="请选择会员" border="none" @focus='changelabelvip'
 				v-model="tagsuser"></u-input>
 			</view>
-			<view class="mb20 fs28 mt20">选择接收群管</view>
+			<view class="mb20 fs28 mt20">选择接收销售</view>
 			<view class="base-bg-f8 p10 justify-between align-center mr20 pl20">
-				<text class="mr20">接收群管</text>
-				<u-input placeholder="请选择接收群管" border="none" @focus='changeuser'
+				<text class="mr20">接收销售</text>
+				<u-input placeholder="请选择接收销售" border="none" @focus='changeuser'
 				v-model="username"></u-input>
 			</view>
 		</view>
@@ -44,21 +44,19 @@
 		<u-picker :show="show" :columns="columns" @cancel='show=!show' 
 		@confirm='receiveA' keyName="nickName"
 		></u-picker>
-		<u-picker :show="showa" :columns="columnsa" @cancel='showa=!showa' 
-		@confirm='receiveB' keyName="tag"
-		 ></u-picker>
 		<u-picker :show="showb" :columns="columnsb" @cancel='showb=!showb' 
 		@confirm='receiveC' keyName="nickName"
 		></u-picker>
 		<u-popup :show="showvip" @close="close" @open="open" >
 			<view class="p20 h400">
-				<view class="justify-between mb20" style="flex-direction: row-reverse">
-					<u-icon name="close-circle" color="#ccc" size="28" 
-					@click="showvip=!showvip"></u-icon>
+				<view class="mb20" style="text-align: center;">
+					<view style="display: inline-block; ">选择会员</view>
+					<u-icon name="close-circle" color="#ccc" size="28"
+					@click="showvip=!showvip" style="display: inline-block;float: right;"></u-icon>
 				</view>
 				<view class="justify-start wrap">
 					<view class="p16 mlr12" v-for="(item,index) in tagsuserlist" :key="index">
-						<u-tag :text="item.nickName" :plain="!item.checked" type="primary" :name="index"
+						<u-tag :text="item.userName" :plain="!item.checked" type="primary" :name="index"
 								@click="checkboxClick">
 						</u-tag>
 					</view>
@@ -68,14 +66,48 @@
 				</view>
 			</view>
 		</u-popup>
+		<u-popup :show="showPop" :round="12" @close="closePop" class="model" :zIndex="10076" style="flex: 0;">
+			<view class="popbox">
+				<view class="popbox-head">
+					<u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="showPop=!showPop"></u-icon>
+					标签筛选
+				</view>
+				<view class="popbox-body">
+					<view class="mb20" >
+						<u-search placeholder="请输入标签  多个标签用 , 隔开" v-model="tagkeywords" :showAction="false" height="30px"
+							@search='getcompanyTag'></u-search>
+					</view>
+					<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
+						:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
+						@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false" :upper-threshold="100"
+						:lower-threshold="100" @refresherabort="triggereds = false" @scrolltolower="reachBottoms">
+						<view class="tagbox-list x-f" style="white-space: nowrap;flex-wrap: wrap;">
+							<view class="tagbox-item x-f tag-active" v-if="columnsa.length<=0">暂无标签</view>
+							<view class="mlr10 mb10" v-for="(item,index) in columnsa" :key='item.tagId'>
+									<u-tag :text="item.tag" :plain="!item.checked" :name="index"
+										@click="chooseTag(index)"></u-tag>
+							</view>
+						</view>
+						<view class="center fs24 mt20">
+							<text class="mr20" @click="getTagpage('last')">上一页</text>
+							<text class="base-color-red">{{pagetag.pageNum}}/{{pagetag.pages}}</text>
+							<text class="ml20" @click="getTagpage('next')">下一页</text>
+						</view>
+					</scroll-view>
+				</view>
+				<view class="popbox-footer x-bc">
+					<button class="popbox-footer-btn" @click="resetPop" >重置</button>
+					<button class="popbox-footer-btn con-btn" @click="confirmPop">确定</button>
+				</view>
+			</view>
+		</u-popup>
 	</view>
 </template>
 
 <script>
 	import {
 		getgroupList,
-		changevipUser,
-		getcompanyTaglist,
+		getallTags,
 		changevipUserAll,
 		gettagsUser,
 	} from "@/api/courseManage.js"
@@ -107,7 +139,16 @@
 				tagsuser:'',
 				tagsuserlist:[],
 				user:[],
-				usertagsid:[]
+				usertagsid:[],
+				showPop:false,
+				tagkeywords:'',
+				tagpageNum:1,
+				tagpageSize:10,
+				triggereds:false,
+				statusA: 'loadmore',
+				isEnableds: true,
+				pagetag:[],
+				ids:[]
 			}
 		},
 		onLoad(option) {
@@ -118,15 +159,81 @@
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 		},
 		methods: {
+			resetPop(){
+				this.tagkeywords=''
+				this.usertag=''
+				this.tagpageNum=1
+				this.gettaglist()
+			},
+			getcompanyTag(value){
+				this.tagkeywords=value
+				this.tagpageNum=1
+				this.gettaglist()
+			},
+			confirmPop() {
+				// this.queryParam.typeIndex = this.typeIndex
+				this.showPop = false
+				this.usertag = this.columnsa.filter(item => item.checked).map(v => v.tag).join(',')
+				this.tagsid = this.columnsa.filter(item => item.checked).map(v => v.tagId).join(',')
+				this.ids= this.columnsa.filter(item => item.checked).map(v => v.tagId)
+				//filtter(过滤)  筛选所有checked==true的  然后map返回每一项的id
+				// if (this.idx.length == 0) {
+				// 	this.showCompanytag = this.companytag
+				// }
+			},
+			chooseTag(i) {
+				this.columnsa[i].checked = !this.columnsa[i].checked
+			},
+			getTagpage(type){
+				//标签页数选择
+				if(type=='last'){
+					if(this.tagpageNum>=2){
+						this.tagpageNum--
+						this.gettaglist()
+					}else{
+						uni.showToast({
+							title: '已经是第一页',
+							icon: 'none',
+							duration: 1000
+						}); 
+					}
+				}else{
+					if(this.tagpageNum<this.pagetag.pages){
+						this.tagpageNum++
+						this.gettaglist()
+					}else{
+						uni.showToast({
+							title: '已经是最后一页',
+							icon: 'none',
+							duration: 1000
+						}); 
+					}
+				}
+			},
+			//标签展示下拉
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.tagpageNum = 1;
+					this.gettaglist('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			closePop(){
+				this.showPop=!this.showPop
+				console.log(123)
+			},
 			checkboxClick(name){
-				console.log(name)
 				this.tagsuserlist[name].checked = !this.tagsuserlist[name].checked
-				console.log(this.tagsuser)
 			},
 			getuserid(){
 				this.tagsuser = this.tagsuserlist.filter(item => item.checked)
-				.map(v => v.nickName).join(',')
-				this.usertagsid = this.tagsuserlist.filter(item => item.checked)
+				.map(v => v.userName).join(',')
+				this.ids = this.tagsuserlist.filter(item => item.checked)
 				.map(v => v.userId)
 				this.showvip=!this.showvip
 			},
@@ -148,11 +255,9 @@
 				}
 			},
 			gettagUserlist(){
+				console.log(this.tagsid)
 				const param={
-					companyId:this.user.companyId,
-					// companyUserId:this.groupid,
-					tagIds:this.tagsid,
-					companyUserId:this.userid
+					tagId:this.tagsid,
 				}
 				gettagsUser(param).then(res=>{
 					if(res.code==200){
@@ -166,33 +271,13 @@
 					}
 				})
 			},
-			changesomevip(){
-				//更换部分会员归属
-				const param={
-					companyId:this.user.companyId,
-					companyUserId:this.groupid,
-					tagIds:this.tagsid,
-					userId:this.usertagsid
-				}
-				changevipUser(param).then(res=>{
-					if(res.code==200){
-						uni.showToast({
-							icon: 'none',
-							title: '更换会员归属成功'
-						})
-					}else{
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
 			changeall(){
-				//更换全部会员
+				//更换会员归属
 				const param={
-					newCompanyUserId:this.userid,
-					oldCompanyUserId:this.groupid
+					from:this.groupid,
+					to:this.userid,
+					type:this.active,
+					ids:this.ids
 				}
 				changevipUserAll(param).then(res=>{
 					if(res.code==200){
@@ -213,7 +298,7 @@
 					if(this.userid==''){
 						uni.showToast({
 							icon: 'none',
-							title: '请选择接收群管'
+							title: '请选择接收销售'
 						})
 					}else{
 						this.changeall()
@@ -224,13 +309,18 @@
 							icon: 'none',
 							title: '请选择标签'
 						})
-					}else if(this.usertagsid==''){
+					}else if(this.ids==''){
 						uni.showToast({
 							icon: 'none',
 							title: '请选择会员'
 						})
+					}else if(this.userid==''){
+						uni.showToast({
+							icon: 'none',
+							title: '请选择接收销售'
+						})
 					}else{
-						this.changesomevip()
+						this.changeall()
 					}
 				}
 			},
@@ -259,17 +349,41 @@
 			},
 			changelabel(){
 				this.tagsuser=''
-				this.showa=true
+				this.showPop=true
 				this.gettaglist()
 			},
 			changeuser(){
 				this.showb=true
 				this.getgrouplist()
 			},
-			gettaglist(){
-				getcompanyTaglist().then(res=>{
+			gettaglist(type){
+				//获取标签列表
+				const data={
+					pageNum:this.tagpageNum,
+					pageSize:this.tagpageSize,
+					keyword:this.tagkeywords
+				}
+				getallTags(data).then(res=>{
 					if(res.code==200){
-						this.columnsa=[res.data]
+						const dataList = res.data.list.map(item => {
+							return {
+								...item,
+								checked: false,
+							}
+						})
+						if (type == 'refresh') {
+							this.columnsa = dataList
+						}else {
+							// this.columnsa = [...this.columnsa, ...dataList]
+							this.columnsa = dataList
+						}
+						if (res.data.isLastPage) {
+							this.statusA = 'nomore'
+						} else {
+							this.statusA = 'loadmore'
+						}
+						this.pagetag=res.data
+						this.changetag = this.columnsa
 					}else{
 						uni.showToast({
 							icon: 'none',
@@ -279,7 +393,7 @@
 				})
 			},
 			getgrouplist(){
-				//获取群管列表
+				//获取销售列表
 				getgroupList().then(res=>{
 					if(res.code==200){
 						this.columns=[res.data]
@@ -298,6 +412,100 @@
 </script>
 
 <style lang="scss" scoped>
+	.popbox {
+		background-color: #fff;
+		border-radius: 12px;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #333;
+	
+		&-head {
+			padding: 15px;
+			font-weight: bold;
+			font-size: 15px;
+			text-align: center;
+			position: relative;
+		}
+	
+		.close-circle {
+			position: absolute;
+			right: 10px;
+			top: 50%;
+			transform: translateY(-50%);
+		}
+	
+		&-body {
+			padding: 10px 10px;
+		}
+	
+		.radiobox {
+			&-item {
+				padding: 10px 0;
+				border-bottom: 1px solid #f5f5f5;
+	
+				&:last-child {
+					border-bottom: none;
+				}
+			}
+		}
+	
+		&-footer {
+			padding: 15px 0;
+		}
+	
+		&-footer-btn {
+			flex: 1;
+			height: 44px;
+			line-height: 44px;
+			margin: 0 10px;
+			border-radius: 50px;
+			border: none;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #333;
+	
+			&::after {
+				border: none;
+			}
+		}
+	
+		.con-btn {
+			background-color: #1677ff;
+			color: #fff;
+		}
+	
+		.choosetitle {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 15px;
+			color: #333;
+		}
+	
+		.invitetip {
+			margin-top: 10px;
+			background-color: #ebf5fb;
+			color: #1677ff;
+			padding: 5px 10px;
+			border-radius: 5px;
+		}
+	
+		.sharePop-item {
+			padding: 0 10px;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			display: inline-flex !important;
+	
+			image {
+				height: 48px;
+				width: 48px;
+				margin-bottom: 10px;
+			}
+		}
+	}
 page{
 	background-color: #fff;
 }

+ 140 - 24
pages/courseManage/manage/exprotList.vue

@@ -1,47 +1,163 @@
 <template>
 	<view class="column flex-1 hb">
-		<view class="p20">
-			<view class="fs28 base-color-6 justify-between">
-				<view>今日</view>
-				<view class="justify-start align-center base-color">
-					<image src="../../../static/manergevip/Refresh.png"
-					 class="w30 h30" ></image>
-					 <text class="ml8">刷新</text>
-				</view>
-			</view>
-			<view class="justify-start mtb20 pb20" style="border-bottom: #eee solid 2rpx;">
-				<image src="../../../static/images/send.png" class="w60 h60"></image>
-				<view class="ml20">
-					<view class="fs28">数据表格名称</view>
-					<view class="justify-start fs24 base-color-6">
-						<view>0MB</view>
-						<view class="plr12 mlr12" 
-						style="border-right: 2rpx solid #ddd;border-left: 2rpx solid #ddd">2024-01-26 16:37:30</view>
-						<view>已过期</view>
+		<view class="p20 bgf">
+			<u-subsection :list="list" :current="actnav" @change="sectionChange" bgColor='#def1ff' inactiveColor="#666"></u-subsection>
+		</view>
+		<view class="column  scrolly">
+			<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggered"
+				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
+				@refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
+				@refresherabort="triggered = false" @scrolltolower="reachBottom">
+				<view v-for="(item,index) in listgood" :key="index" class="listcss" @click="getlist(item)">
+					<view class="justify-between align-center">
+						<view class="w180 justify-between fs28 align-center ">
+							<u-avatar :src="item.fromAvatar" size="25"></u-avatar>
+							<text class="ml10 single-ellipsis">{{item.fromName}}</text>
+						</view>
+						<view class="column align-center">
+							<text class="fs24 base-color-9">更换为</text>
+							<image src="/static/images/jiantou.png" class="w60 h40"></image>
+						</view>
+						<view class="w180 justify-between fs28 align-center ">
+							<u-avatar :src="item.toAvatar" size="25"></u-avatar>
+							<text class="ml10 single-ellipsis">{{item.toName}}</text>
+						</view>
 					</view>
+					<view class="justify-between">
+						<view class="fs24 base-color-9">{{item.applyTime}}</view>
+						<view class="fs24 base-color-9 " style="color: orange;" v-if="actnav==0">待审核</view>
+						<view class="fs24 base-color-9 base-color" v-if="actnav==1">审核通过</view>
+						<view class="fs24 base-color-9 base-color-red" v-if="actnav==2">审核未通过</view>
+					</view>
+					
 				</view>
-			</view>
-			<view class="fs28 base-color-6">昨日</view>
-			<view class="fs28 base-color-6">以往</view>
+			</scroll-view>
+			<u-loadmore :status="status" />
 		</view>
+		<u-popup :show="show" @close="close" @open="open" :closeOnClickOverlay="true"
+		mode="center" round='10'>
+			<view class="poplist scrolly">
+				<view class="center mb20">更换会员</view>
+				<view v-for="(item,index) in nowlist" :key="index" class="justify-start align-center">
+					<u-avatar :src="item.avatar" size="25"></u-avatar>
+					<view class="fs28 ml16 base-color-6">昵称:</view>
+					<view class="fs28 base-color-6">{{item.userName}}</view>
+				</view>
+			</view>
+		</u-popup>
 	</view>
 </template>
 
 <script>
+	import {
+		getchangeslist
+	} from "@/api/courseManage.js"
 	export default {
 		data() {
 			return {
+				list: ['待审核', '通过审核', '审核未通过'],
+				actnav:0,
+				triggered: false,
+				status: 'loadmore',
+				isEnabled: true,
+				pageNum: 1,
+				pageSize: 10,
+				listgood:[],
+				show:false,
+				nowlist:[]
 			}
 		},
+		onShow() {
+			this.getexaminelist()
+		},
 		methods: {
-			
+			getlist(item){
+				this.show=!this.show
+				this.nowlist=item.users
+				console.log(this.nowlist)
+			},
+			close(){
+				this.show=!this.show
+				console.log(this.show)
+			},
+			open(){},
+			pullDownRefresh() {
+				// 下拉刷新
+				this.triggered = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggered = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getexaminelist('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottom() {
+				// status这个是加载状态
+				console.log(111);
+				if (this.status === 'loadmore') {
+					this.status = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getexaminelist() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			sectionChange(index){
+				this.listgood=[]
+				this.actnav=index
+				this.getexaminelist()
+			},
+			getexaminelist(type){
+				this.listgood=[]
+				const data={
+					pageNum: this.pageNum,
+					pageSize: this.pageSize,
+					status:this.actnav
+				}
+				getchangeslist(data).then(res=>{
+					if(res.code==200){
+						// refresh 下拉
+						if (type == 'refresh') {
+							this.listgood = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.listgood = [...this.listgood, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.status = 'nomore'
+						} else {
+							this.status = 'loadmore'
+						}
+					}else{
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			}
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
-	page{
+	// page{
+	// 	background-color: #fff;
+	// }
+	.listcss{
 		background-color: #fff;
+		margin: 20rpx;
+		padding: 20rpx;
+		border-radius: 10rpx;
+	}
+	.poplist{
+		width: 500rpx;
+		height: 600rpx;
+		border-radius: 20rpx;
+		padding: 20rpx;
 	}
-
 </style>

+ 125 - 30
pages/courseManage/manage/lableSetup.vue

@@ -1,6 +1,6 @@
 <template>
-	<view class="column flex-1 hb">
-		<view class="align-center justify-between p20">
+	<view class="column  hb bgf">
+		<view class="align-center justify-between p20 bgf ">
 			<view class="justify-start fs28 align-center">
 				<u-icon name="bookmark-fill" color="#1677ff" size="28"></u-icon>
 				<view>自定义标签</view>
@@ -8,22 +8,33 @@
 			<view class="fs28" @click="isShowSelectAll=!isShowSelectAll">
 			{{isShowSelectAll?'取消多选':'多选'}}</view>
 		</view>
+		<view class="mtb20 mlr20" >
+			<u-search placeholder="请输入标签  多个标签用 , 隔开" v-model="tagkeywords" :showAction="false" height="30px"
+				@search='getcompanyTag' ></u-search>
+		</view>
 		<view class="column flex-1 scrolly plr20" >
-			<view class="justify-start" v-for="(item,index) in companylabel"
-				:key="index">
-				<u-checkbox-group @change="selectlist(index)">
-					<u-checkbox :checked="item.checked" shape="circle" activeColor="#FF6C47" :name="true"
-						label="" labelColor="#333" v-if="isShowSelectAll"/>
-				</u-checkbox-group>
-				<view class="justify-start align-center ptb16 flex-1" 
-				style="border-bottom: 2rpx solid #e7e7e7;" >
-					<u-icon name="list" color="#666" size="24"></u-icon>
-					<view class="fs28 ml12">{{item.tag}}</view>
+			<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggereds"
+				refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefreshs"
+				@refresherrestore="triggereds = false" :upper-threshold="100" :lower-threshold="100"
+				@refresherabort="triggereds = false" @scrolltolower="reachBottoms">
+				<view class="justify-start " v-for="(item,index) in companylabel"
+					:key="index">
+					<u-checkbox-group @change="selectlist(index)">
+						<u-checkbox :checked="item.checked" shape="circle" activeColor="#FF6C47" :name="true"
+							label=" " labelColor="#333" v-if="isShowSelectAll"/>
+					</u-checkbox-group>
+					<view class="justify-start align-center ptb16 flex-1" 
+					style="border-bottom: 2rpx solid #e7e7e7;" >
+						<u-icon name="list" color="#666" size="24"></u-icon>
+						<view class="fs28 ml12">{{item.tag}}</view>
+					</view>
 				</view>
-			</view>
+				<u-loadmore :status="statusA" />
+			</scroll-view>
 		</view>
+		<view class="h120"></view>
 		<view class="footbtn">
-			<view  v-if="isShowSelectAll" class="justify-between p20">
+			<view  v-if="isShowSelectAll" class="justify-between p20 bgf">
 				<view class="align-center justify-between" v-if="isShowSelectAll">
 					<u-checkbox-group @change="selectAll">
 						<u-checkbox :checked="isSelectAll" shape="circle" activeColor="#FF6C47" 
@@ -40,18 +51,20 @@
 			<view class='base-bg radius50 m20 p20 center colorf'
 			 @click="addLable" v-else>新增标签</view>
 		</view>
-		<u-modal :show="showlist" title="新增标签" @confirm="confirmchange"
-		 :showCancelButton="true" @cancel="cancel" style="flex: 0;">
-			<view class="slot-content">
-				<u-input placeholder="请输入新增标签" v-model="addlable"></u-input>
-			</view>
-		</u-modal>
+		<view>
+			<u-modal :show="showlist" title="新增标签" @confirm="confirmchange"
+			 :showCancelButton="true" @cancel="cancel" style="flex: 0;">
+				<view class="slot-content">
+					<u-input placeholder="请输入新增标签" v-model="addlable"></u-input>
+				</view>
+			</u-modal>
+		</view>
 	</view>
 </template>
 
 <script>
 	import {
-		getcompanyTaglist,
+		getallTags,
 		addCompanyLabel,
 		deleteCompanyLabel
 	} from "@/api/courseManage.js"
@@ -65,21 +78,77 @@
 				isSelectAll:false,
 				isSelected:false,
 				selectedCount:0,
-				selectidAll:[]
+				selectidAll:[],
+				tagpageNum:1,
+				tagpageSize:13,
+				tagkeywords:'',
+				statusA:"nomore",
+				triggereds:false,
+				isEnabled:true
 			}
 		},
 		mounted() {
 			this.getcompanylabel()
 		},
+		watch:{
+			selectedCount(oldVal,newVal){
+				return oldVal
+				console.log('message changed from', oldVal, 'to', newVal)
+			}
+		},
 		methods: {
+			getcompanyTag(value){
+				this.companylabel=[]
+				this.tagkeywords = value
+				this.tagpageNum=1
+				this.getcompanylabel()
+			},
+			reachBottoms() {
+				// status这个是加载状态
+				console.log(111);
+				if (this.statusA === 'loadmore') {
+					this.statusA = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.tagpageNum++
+						this.getcompanylabel() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			//标签展示下拉
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.tagpageNum = 1;
+					this.getcompanylabel('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
 			changeProhibit(){
+				const alltag=this.selectidAll.join(',')
+				console.log(this.selectidAll)
 				//删除标签
+				if(this.selectidAll==''){
+					uni.showToast({
+						icon: 'none',
+						title: '请选择标签'
+					})
+					return
+				}
 				const params={
-					tagIds:this.selectidAll
+					tagIds:alltag
 				}
 				console.log(this.selectidAll)
-				deleteCompanyLabel(params).then(res=>{
+				deleteCompanyLabel(alltag).then(res=>{
 					if(res.code==200){
+						this.companylabel=[]
+						this.tagpageNum=1
+						this.selectidAll=[]
 						uni.showToast({
 							icon: 'none',
 							title: '标签删除成功'
@@ -93,15 +162,31 @@
 					}
 				})
 			},
-			getcompanylabel(){
-				getcompanyTaglist().then(res=>{
+			getcompanylabel(type ){
+				this.tagkeywords =this.tagkeywords.replace(/,/g,',')
+				const data ={
+					pageNum:this.tagpageNum,
+					pageSize:this.tagpageSize,
+					keyword:this.tagkeywords
+				}
+				getallTags(data).then(res=>{
 					if(res.code==200){
-						this.companylabel = res.data.map(item => {
+						const dataList = res.data.list.map(item => {
 							return {
 								...item,
 								checked: false,
 							}
 						})
+						if (type == 'refresh') {
+							this.companylabel = dataList
+						}else {
+							this.companylabel = [...this.companylabel, ...dataList]
+						}
+						if (res.data.isLastPage) {
+							this.statusA = 'nomore'
+						} else {
+							this.statusA = 'loadmore'
+						}
 					}else {
 						uni.showToast({
 							icon: 'none',
@@ -116,6 +201,9 @@
 				}
 				addCompanyLabel(params).then(res=>{
 					if(res.code==200){
+						this.tagpageNum=1
+						this.companylabel=[]
+						this.addlable=''
 						uni.showToast({
 							icon: 'none',
 							title: '标签添加成功'
@@ -134,14 +222,14 @@
 			},
 			selectlist(i){
 				// 单选 /反选
-				console.log(i)
 				let arr = {
 					...this.companylabel[i],
 					checked: !this.companylabel[i].checked
 				}
 				this.$set(this.companylabel, i, arr)
+				const seletnum = this.companylabel.filter(item => item.checked).map(item => item.tagId)
 				this.selectidAll = this.companylabel.filter(item => item.checked).map(item => item.tagId)
-				console.log(this.selectidAll)
+				this.selectedCount=seletnum.length
 				this.isSelectAll = this.companylabel.every(item => item.checked)
 				if (this.isSelectAll) {
 					this.companylabel = this.companylabel.map(item => {
@@ -163,6 +251,8 @@
 						checked: this.isSelectAll
 					}
 				})
+				const seletnum = this.companylabel.filter(item => item.checked).map(item => item.tagId)
+				this.selectedCount=seletnum.length
 				console.log(this.companylabel)
 			},
 			confirmchange(){
@@ -184,5 +274,10 @@
 </script>
 
 <style lang="scss">
-
+.footbtn{
+	position: fixed;
+	bottom: 0;
+	width: 100%;
+	background-color: #fff;
+}
 </style>

+ 173 - 135
pages/courseManage/manage/manageDetail.vue

@@ -1,16 +1,17 @@
 <template>
 	<view class="column flex-1 hb">
 		<view class="header p20">
-			<view class="justify-start">
+			<view class="justify-start align-center">
 				<u-avatar :src="grouplist.avatar" size="50"></u-avatar>
-				<view>
-					<view class="justify-start align-center ml20">
+				<view class="ml20">
+					<view class="justify-start align-center ">
 						<text class="fs32 bold mr8">{{grouplist.nickName}}</text>
 						<image class="w40 h40" src="@/static/images/copy_icon.png" @click="copyId" mode="aspectFill">
 					</view>
+					<view class="fs24 base-color-9 mt10">备注:{{grouplist.remark ||'暂无'}}</view>
 				</view>
 			</view>
-			<view class="ptb20">-</view>
+			<view class="ptb20 fs24 base-color-6">手机号码:{{grouplist.phonenumber||'暂无'}}</view>
 		</view>
 		<view class="bgf">
 			<view class="centerV">
@@ -21,35 +22,50 @@
 				<view class="base-bg-sure boxs">
 					<view class="bold">会员总数</view>
 					<view class="base-color fs28">
-						<text class="fs40 bold">{{companyUserUserCount}}</text>人
+						<text class="fs40 bold">{{companyUserCount.userTotal}}</text>人
 					</view>
 				</view>
 				<view class="base-bg-sure boxs">
 					<view class="bold">今日新增会员</view>
 					<view class="base-color fs28">
-						<text class="fs40 bold">{{companyUserCount}}</text>人
+						<text class="fs40 bold">{{companyUserCount.todayNewUser}}</text>人
 					</view>
 				</view>
 				<view class="base-bg-sure boxs">
 					<view class="bold">会员红包数</view>
-					<view class="base-color fs28"><text class="fs40 bold">{{redbaglist.count}}</text>个</view>
+					<view class="base-color fs28"><text class="fs40 bold">{{companyUserCount.userRedPacketNum}}</text>个</view>
 				</view>
 				<view class="base-bg-sure boxs">
 					<view class="bold">新会员红包金额</view>
-					<view class="base-color fs28"><text class="fs40 bold">{{redbaglist.amount}}</text>元</view>
+					<view class="base-color fs28"><text class="fs40 bold">{{companyUserCount.todayUserRedPacketAmount}}</text>元</view>
 				</view>
 			</view>
 			<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
 				<view v-if="searchbarNav == 0">
+					<view class="mb20" >
+						<u-search placeholder="请输入标签  多个标签用 , 隔开" v-model="keywordC" :showAction="false" height="30px"
+							@search='getcompanyTagC'></u-search>
+					</view>
 					<view class="p20 fs28 column flex-1 scrolly">
-						<view v-for="(item,index) in courseOne" :key="item.index"
-							:class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
-							style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
-							{{item.courseName}}
-						</view>
+						<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledC"
+							:refresher-triggered="triggeredC" refresher-background="rgba(0,0,0,0)"
+							@refresherrefresh="pullDownRefreshC" @refresherrestore="triggeredC = false"
+							:upper-threshold="100" :lower-threshold="100" @refresherabort="triggeredC = false"
+							@scrolltolower="reachBottomC">
+							<view v-for="(item,index) in courseOne" :key="item.index"
+								:class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
+								style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
+								{{item.courseName}}
+							</view>
+						</scroll-view>
+						<u-loadmore :status="statusC" />
 					</view>
 				</view>
 				<view class="p20 fs28 column flex-1 hidden h100" v-if="searchbarNav == 1">
+					<view class="mb20" >
+						<u-search placeholder="请输入标签  多个标签用 , 隔开" v-model="keyword" :showAction="false" height="30px"
+							@search='getcompanyTag'></u-search>
+					</view>
 					<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
 						:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
 						@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
@@ -75,14 +91,15 @@
 					v-for="(item,index) in courselist" :key="index">
 					<view class="justify-start align-center pb20" style="border-bottom: #eee solid 2rpx;">
 						<view class="doingimg">
-							<image src="../../../static/manergevip/book.png" class='w150 h90 radius16'></image>
+							<!-- <image src="../../../static/manergevip/book.png" class='w150 h90 radius16'></image> -->
+							<image :src="item.thumbnail" class='w150 h90 radius16'></image>
 							<view class="doing">进行中</view>
 						</view>
 						<view class="ml20">
 							<view class="justify-start align-center">
 								<view>{{item.courseName}}</view>
 								<view class="justify-start align-center base-color">ID
-									<image class="w40 h40" @click="copyCourseId(item.courseId)"
+									<image class="w40 h40" @click="copyCourseId(item.courseName)"
 										src="@/static/images/copy_icon.png" mode="aspectFill">
 								</view>
 							</view>
@@ -95,42 +112,42 @@
 					<view class="justify-between fs28 mt20">
 						<view class="flex-1">
 							<view class="mb8 base-color-6">观看人数</view>
-							<view>{{item.count}}</view>
+							<view>{{item.countVO.courseWatchNum}}</view>
 						</view>
 						<view class="flex-1">
 							<view class="mb8 base-color-6">完播人数</view>
-							<view>{{item.completeCount}}
-								<text class="base-color-red ml16">完播率{{item.completeRate.toFixed(2)}}%</text>
+							<view>{{item.countVO.courseCompleteNum}}
+								<text class="base-color-red ml16">完播率{{item.countVO.completeRate}}%</text>
 							</view>
 						</view>
 					</view>
 					<view class="justify-between fs28 mt20 pb20" style="border-bottom: #eee solid 2rpx;">
 						<view class="flex-1">
 							<view class="mb8 base-color-6">答题红包数</view>
-							<view>{{item.redPacketCount}}</view>
+							<view>{{item.countVO.redPacketNum}}</view>
 						</view>
 						<view class="flex-1">
 							<view class="mb8 base-color-6">答题红包金额</view>
-							<view>{{item.amount}}元</view>
+							<view>{{item.countVO.redPacketAmount}}元</view>
 						</view>
 					</view>
 					<view class="justify-between mt20">
 						<view class="flex-1">
 							<view class="base-color-6 mb8 ">答题人数</view>
-							<view>{{item.answerCount}}</view>
+							<view>{{item.countVO.answerNum}}</view>
 						</view>
 						<view class="flex-1">
 							<view class="base-color-6 mb8 ">正确人数</view>
-							<view>{{item.answerRightCount}}</view>
+							<view>{{item.countVO.answerRightNum}}</view>
 						</view>
 						<view class="flex-1">
-							<view class="base-color-6 mb8 ">正确率</view>
-							<view>{{item.answerRightRate.toFixed(2)}}%</view>
+							<!-- <view class="base-color-6 mb8 ">正确率</view>
+							<view>{{item.answerRightRate.toFixed(2)||0}}%</view> -->
 						</view>
 					</view>
-					<view class="centerV mt20">
+					<!-- <view class="centerV mt20">
 						<view class="colorf base-bg ptb12 w400 radius80 center ">课程数据</view>
-					</view>
+					</view> -->
 				</view>
 				<u-loadmore :status="status" />
 				<view class="h90 "></view>
@@ -139,8 +156,13 @@
 		<view class="column flex-1 scrolly " v-show="showCont==1"
 			style="height: calc(100% - 100rpx);padding-bottom: 100rpx;">
 			<u-collapse ref="collapseRef" :border="false" :value="collapseValue" @change="changeCollapse">
-				<u-collapse-item name="course">
-					<text slot="title" class="bold fs32">课程统计</text>
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="course" title="课程统计">
+				<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
+					<u-collapse-item name="course">
+						<text slot="title"  class="bold fs32">课程统计</text>
+						<!-- #endif -->
 					<text slot="value" class="base-color fs24">{{collapseValue.includes('course')?'收回':'展开'}}</text>
 					<view slot="right-icon">
 						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -149,23 +171,28 @@
 						<view class="base-bg-f radius16 p30 flex-1">
 							<view class="mb12 bold">营期</view>
 							<view class="base-color">
-								<text class="bold fs40">{{courseCount.course}}</text>期
+								<text class="bold fs40">{{courseCount.courseNum}}</text>期
 							</view>
 						</view>
 						<view class="base-bg-f radius16 p20 flex-1 mlr20">
 							<view class="mb12 bold">课程数</view>
-							<view class="base-color"><text class="bold fs40">{{courseCount.count}}
+							<view class="base-color"><text class="bold fs40">{{courseCount.videoNum}}
 								</text>课</view>
 						</view>
 						<view class="base-bg-f radius16 p20 flex-1">
 							<view class="mb12 bold">参与会员</view>
 							<view class="base-color"><text class="bold fs40">
-									{{courseCount.watchCount}}</text>人</view>
+									{{courseCount.courseUserNum}}</text>人</view>
 						</view>
 					</view>
 				</u-collapse-item>
-				<u-collapse-item name="redenvelope">
-					<text slot="title" class="bold fs32">答题统计</text>
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="redenvelope" title="答题统计">
+				<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
+					<u-collapse-item name="redenvelope">
+						<text slot="title"  class="bold fs32">答题统计</text>
+						<!-- #endif -->
 					<text slot="value"
 						class="base-color fs24">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
 					<view slot="right-icon">
@@ -173,24 +200,29 @@
 					</view>
 					<view class="justify-around ">
 						<view class="base-bg-f radius16 p30 flex-1">
-							<view class="mb12 bold">答题人</view>
+							<view class="mb12 bold">答题人</view>
 							<view class="base-color"><text class="bold fs40">
-									{{answerlist.count}}</text>人</view>
+									{{courseCount.answerNum}}</text>人</view>
 						</view>
 						<view class="base-bg-f radius16 p20 flex-1 mlr20">
-							<view class="mb12 bold">正确人</view>
+							<view class="mb12 bold">正确人</view>
 							<view class="base-color"><text class="bold fs40">
-									{{answerlist.completeCount}}</text>人</view>
+									{{courseCount.answerRightNum}}</text>人</view>
 						</view>
 						<view class="base-bg-f radius16 p20 flex-1">
 							<view class="mb12 bold">正确率</view>
 							<view class="base-color"><text class="bold fs40">
-									{{answerlist.rate.toFixed(2)}}</text>%</view>
+									{{courseCount.answerRightRate}}</text>%</view>
 						</view>
 					</view>
 				</u-collapse-item>
-				<u-collapse-item name="live">
-					<text slot="title" class="bold fs32">红包统计</text>
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="live" title="红包统计">
+				<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
+					<u-collapse-item name="live">
+						<text slot="title"  class="bold fs32">红包统计</text>
+						<!-- #endif -->
 					<text slot="value" class="base-color fs24">{{collapseValue.includes('live')?'收回':'展开'}}</text>
 					<view slot="right-icon">
 						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -199,7 +231,7 @@
 						<view class="base-bg-f radius16 p30 flex-1">
 							<view class="mb12 bold">红包个数</view>
 							<view class="base-color"><text class="bold fs40">
-									{{redbaglist.count}}</text>个</view>
+									{{courseCount.redPacketNum}}</text>个</view>
 						</view>
 						<view class="base-bg-f radius16 p20  mlr20 justify-start align-center">
 							<image src="../../../static/images/redenvelope.png" class="w102 h102"></image>
@@ -207,7 +239,7 @@
 								<view class="mb12 bold">答题红包金额</view>
 								<view class="base-color">
 									<text class="bold fs40">
-										{{redbaglist.amount}}
+										{{courseCount.redPacketAmount}}
 									</text>元
 								</view>
 							</view>
@@ -218,37 +250,37 @@
 			<view class="h90 "></view>
 		</view>
 		<view class="foot-box justify-between bgf p20 align-center">
-			<view class="fs28 base-color-6" @click="showmore=!showmore">更多</view>
+			<view class="fs28 base-color-6" @click="showmore=true">更多</view>
 			<view class="base-color-red base-bg-false plr20 fs28 ptb8 radius40 bold" @click="changevipDetail()">更换会员归属
 			</view>
 		</view>
-		<u-popup :show="showmore" @close="closemore" @open="openmore" style="flex: 0;">
-			<view class="column align-center">
-				<view class="m20" v-for="(item,index) in morelist" :key="item.value" @click="nameMore(item)">
-					{{item.name}}
-				</view>
-				<u-modal :show="showlist" :title="titlelist" @confirm="confirmchange">
-					<view class="slot-content">
-						<u-input :placeholder="contpl" v-model="changelist" v-if="selnum==1"></u-input>
-						<u-input :placeholder="contpl" v-model="changephone" v-if="selnum==2"></u-input>
-						<u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==3"></u-input>
+		<view>
+			<u-popup :show="showmore" @close="closemore" @open="openmore" style="flex: 0;">
+				<view class="column align-center">
+					<view class="m20" v-for="(item,index) in morelist" :key="item.value" @click="nameMore(item)">
+						{{item.name}}
 					</view>
-				</u-modal>
-			</view>
-		</u-popup>
-
+					<u-modal :show="showlist" :title="titlelist" @confirm="confirmchange">
+						<view class="slot-content">
+							<u-input :placeholder="contpl" v-model="changelist" v-if="selnum==1"></u-input>
+							<u-input :placeholder="contpl" v-model="changephone" v-if="selnum==2" maxlength="11" ></u-input>
+							<u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==3"></u-input>
+						</view>
+					</u-modal>
+				</view>
+			</u-popup>
+		</view>
 	</view>
 </template>
 
 <script>
-	import dropdownPanel from "../components/dropdownPanel.vue"
+	import dropdownPanel from "@/components/dropdownPanel.vue"
 	import {
 		getFsCourseList,
 		getCourseVdieoList,
-		getCompanyUserAndUserCount,
+		getmanagepopnum,
 		getRecPacketCount,
-		getshopCoursenum,
-		getQuesCount,
+		getmanagecourse,
 		getcourseList,
 		updategroupinfo,
 		getGroupDetail
@@ -264,7 +296,7 @@
 				list1: [{
 					name: '课程分析'
 				}, {
-					name: '群管数据'
+					name: '销售数据'
 				}],
 				filterData: [{
 						name: '训练营-营期',
@@ -315,8 +347,7 @@
 				pageNums: 1,
 				pageSizes: 5,
 				redprice: '',
-				companyUserCount: 0,
-				companyUserUserCount: 0,
+				companyUserCount: [],
 				redbaglist: [],
 				courseCount: [],
 				answerlist: [],
@@ -327,7 +358,14 @@
 				pageNum: 1,
 				pageSize: 3,
 				grouplist: [],
-				selnum: 0
+				selnum: 0,
+				keyword:'',
+				triggeredC: false,
+				statusC: 'loadmore',
+				isEnabledC: true,
+				pageNumC: 1,
+				pageSizeC: 10,
+				keywordC:'',
 			}
 		},
 		onLoad(option) {
@@ -337,30 +375,63 @@
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.grouplist = uni.getStorageSync("grouplist")
 			this.getvipcount()
-			this.getredbaglist()
 			this.getcout()
 			this.getcoursegroup()
 			this.getgroupdetail()
 		},
 		methods: {
+			getcompanyTagC(value){
+				this.keywordC=value
+				this.getCourseList()
+			},
+			pullDownRefreshC() {
+				// 下拉
+				this.triggeredC = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggeredC = false;
+					uni.stopPullDownRefresh()
+					this.pageNumC = 1;
+					this.getCourseList('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottomC() {
+				// status这个是加载状态
+				if (this.statusC === 'loadmore') {
+					this.statusC = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNumC++
+						this.getCourseList() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			getcompanyTag(value){
+				this.keyword=value
+				this.getCourseListsmall()
+			},
 			copyId() {
 				uni.setClipboardData({
-					data: String(this.groupid),
+					data: String(this.grouplist.nickName),
 					success: () => {
 						uni.showToast({
-							title: '用户id复制成功',
+							title: '用户昵称复制成功',
 							icon: 'none',
 							duration: 2000
 						});
+						this.showmore = false
 					},
 				})
 			},
 			copyCourseId(id) {
+				console.log(id)
 				uni.setClipboardData({
 					data: String(id),
 					success: () => {
 						uni.showToast({
-							title: '课程id复制成功',
+							title: '课程标题复制成功',
 							icon: 'none',
 							duration: 2000
 						});
@@ -369,7 +440,7 @@
 			},
 			getgroupdetail() {
 				const param = {
-					userId: this.groupid
+					companyUserId : this.groupid
 				}
 				getGroupDetail(param).then(res => {
 					this.grouplist = res.data
@@ -379,7 +450,7 @@
 				console.log(Number(this.groupid))
 				const param = {
 					nickName: this.changelist,
-					phonenumber: this.changephone,
+					phoneNumber: this.changephone,
 					remark: this.changeremark,
 					userId: this.groupid
 				}
@@ -423,15 +494,11 @@
 			},
 			getcoursegroup(type) {
 				const param = {
-					companyId: this.user.companyId,
 					companyUserId: this.groupid,
 					courseId: this.courseid,
 					videoId: this.courseids,
-					endTime: '',
-					startTime: '',
 					pageNum: this.pageNum,
 					pageSize: this.pageSize,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
 				}
 				getcourseList(param).then(res => {
 					console.log(res)
@@ -458,32 +525,14 @@
 			},
 			getcout() {
 				const param = {
-					companyId: this.user.companyId,
 					companyUserId: this.groupid,
 					courseId: this.courseid,
 					videoId: this.courseids,
-					endTime: '',
-					startTime: '',
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
 				}
 				this.getCourselist(param)
-				this.getanswer(param)
-			},
-			getanswer(param) {
-				getQuesCount(param).then(res => {
-					if (res.code == 200) {
-						// console.log(res)
-						this.answerlist = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
 			},
 			getCourselist(param) {
-				getshopCoursenum(param).then(res => {
+				getmanagecourse(param).then(res => {
 					if (res.code == 200) {
 						this.courseCount = res.data
 					} else {
@@ -494,43 +543,14 @@
 					}
 				})
 			},
-			getredbaglist() {
-				//红包统计
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.groupid,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					courseId: this.courseid,
-					videoId: this.courseids,
-					endTime: '',
-					startTime: '',
-				}
-				getRecPacketCount(params).then(res => {
-					if (res.code == 200) {
-						// console.log(res)
-						this.redbaglist = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
 			getvipcount() {
 				//获取会员总数
 				const param = {
-					companyId: this.user.companyId,
 					companyUserId: this.groupid,
-					courseId: '',
-					endTime: '',
-					startTime: '',
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
 				}
-				getCompanyUserAndUserCount(param).then(res => {
+				getmanagepopnum(param).then(res => {
 					if (res.code == 200) {
-						this.companyUserCount = res.data.companyUserCount || 0
-						this.companyUserUserCount = res.data.companyUserUserCount || 0
+						this.companyUserCount=res.data
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -569,17 +589,29 @@
 			getCourseTwo(id) {
 				this.courseids = id
 			},
-			getCourseList() {
+			getCourseList(type) {
+				this.courseOne=[]
 				//获取课程列表
 				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
+					keyword:this.keywordC,
+					pageNum: this.pageNumC,
+					pageSize: this.pageSizeC, 
 				}
 				getFsCourseList(param).then(res => {
 					if (res.code == 200) {
-						this.courseOne = res.data
+						// this.courseOne = res.data.list
 						// console.log(res)
+						if (type == 'refresh') {
+							this.courseOne = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.courseOne = [...this.courseOne, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.statusC = 'nomore'
+						} else {
+							this.statusC = 'loadmore'
+						}
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -593,8 +625,8 @@
 				const param = {
 					courseId: this.courseid,
 					pageNum: this.pageNums,
-					pageSize: this.pageSizes, //
-					status: ''
+					pageSize: this.pageSizes, 
+					keyword:this.keyword
 				}
 				getCourseVdieoList(param).then(res => {
 					if (res.code == 200) {
@@ -620,6 +652,12 @@
 				this.$nextTick(() => {
 					this.$refs?.collapseRef?.init()
 				})
+				this.courseid=''
+				this.courseids=''
+				this.keyword=''
+				this.getvipcount()
+				this.getcout()
+				this.getcoursegroup()
 				console.log(e.index)
 			},
 			onChange(index) {
@@ -641,13 +679,13 @@
 				if (this.searchbarNav == 0) {
 					this.courseid = ''
 					this.getcout()
-					this.getredbaglist()
+					// this.getredbaglist()
 					this.courselist = []
 					this.getcoursegroup()
 				} else {
 					this.courseids = ''
 					this.getcout()
-					this.getredbaglist()
+					// this.getredbaglist()
 					this.courselist = []
 					this.getcoursegroup()
 				}
@@ -667,7 +705,7 @@
 				this.contpl = item.text
 				this.selnum = item.value
 				if (item.value == 0) {
-
+					this.copyId()
 				} else if (item.value == 1) {
 					this.changelist = this.grouplist.nickName
 					this.showlist = true

+ 36 - 25
pages/courseManage/manage/index.vue → pages/courseManage/manage/manageIndex.vue

@@ -1,20 +1,20 @@
 <template>
 	<view class="column flex-1 hb">
-		<view class="header-box ptb32 pl20">
+		<view class="header-box ptb52 pl20">
 			<view class="justify-between align-center">
 				<view class="justify-start">
 					<u-avatar :src="user.avatar" size="50"></u-avatar>
-					<view class="column colorf ml16">
+					<view class="column colorf ml16" style="color: #666;">
 						<text>{{user.userName}}</text>
 						<text class="mt20 fs24">ID:{{user.companyId}}</text>
 					</view>
 				</view>
-				<view class="column justify-between mr4 ">
-					<!-- <view class="box-btn base-color" @click="exportlist">导出列表</view> -->
-					<view class="box-btn base-color" @click="lableSetup">标签设置</view>
+				<view class="column justify-between mr20 ">
+					<view class="box-btn base-color mb16" @click="exportlist">审核详情</view>
+					<!-- <view class="box-btn base-color centerV" @click="lableSetup">标签设置</view> -->
 				</view>
 			</view>
-			<view class="base-bg-f8 mr4 radius20 p32 mt32 justify-start pb32">
+			<!-- <view class="bgf mr4 radius20 p32 mt32 justify-start pb32">
 				<view class="flex-1 pb20" @click="userdataDetail">
 					<view class="bold">账户可用余额</view>
 					<view class="bold fs48 base-color">{{balanceuserDay.balance}}</view>
@@ -24,7 +24,7 @@
 							{{PickerName}}</text>已发金额</view>
 					<view class="bold fs48 base-color">{{balanceuserDay.todayMoney}}</view>
 				</view>
-			</view>
+			</view> -->
 		</view>
 		<view class="bgf centerV" style="border-radius: 10rpx 10rpx 0 0; margin-top: -8rpx;">
 			<u-tabs :list="list1" @click="clickTab" lineColor='#1773ff' lineWidth='40'
@@ -43,38 +43,45 @@
 							<view class="justify-start align-center">
 								<text class="fs28 bold">{{item.nickName}}</text>
 								<image class="w40 h40" src="@/static/images/copy_icon.png" 
-								@click="copyId(item.userId)" mode="aspectFill">
+								@click="copyId(item.nickName)" mode="aspectFill">
 							</view>
-							<view class="fs24 base-color-6">id:{{item.userId}}</view>
+							<view class="fs24 base-color-6">备注:{{item.remark}}</view>
 						</view>
 					</view>
 					<view class="justify-around mt32">
 						<view class="column align-center">
 							<view class="fs24 base-color-3">今日观看人数</view>
 							<view class="base-color fs28">
-								<text class="bold fs40 base-color">{{item.count}}</text>人
+								<text class="bold fs40 base-color">{{item.todayWatchCount}}</text>人
 							</view>
 						</view>
 						<view class="column align-center">
 							<view class="fs24 base-color-3">今日完播人数</view>
 							<view class="base-color fs28">
-								<text class="bold fs40 base-color">{{item.completeCount}}</text>人
+								<text class="bold fs40 base-color">{{item.todayFinishCount}}</text>人
 							</view>
 						</view>
 						<view class="column align-center">
 							<view class="fs24 base-color-3">今日完播率</view>
 							<view class="base-color fs28">
-								<text class="bold fs40 base-color">{{item.rate.toFixed(2)}}</text>%
+								<text class="bold fs40 base-color" >{{item.todayFinishRate.toFixed(2)}}</text>%
 							</view>
 						</view>
 						<view class="column align-center">
 							<view class="fs24 base-color-3">今日红包金额</view>
 							<view class="base-color fs28">
-								<text class="bold fs40 base-color">{{item.amount}}</text>元
+								<text class="bold fs40 base-color">{{item.todayRedPacketAmount}}</text>元
 							</view>
 						</view>
 					</view>
-					<view class="base-bg-f8 pl20">-</view>
+					<view class="base-bg-f8 pl20 fs24 ptb8 mt4 radius20" >
+						<text class="base-color-6">更换归属状态:</text>
+						<text style="color: orange;" v-if="item.applyStatus==0">待审核</text>
+						<text style="color: green;" v-if="item.applyStatus==1">审核通过</text>
+						<text class="base-color-red" v-if="item.applyStatus==2">审核未通过</text>
+						<text class=" base-color" v-if="item.applyStatus==3">暂无</text>
+					</view>
+					
 					<view class="justify-between fs24 mt20 align-center"  @click.passive.stop>
 						<view >
 							<text @click="showmoreA(item)">更多</text></view>
@@ -87,7 +94,7 @@
 	
 				</view>
 				<u-loadmore :status="status" />
-				<view class="ptb80"></view>
+				<view class="ptb20"></view>
 			</scroll-view>
 		</view>
 		<!-- <image class="invite-member" src="@/static/images/invite-member-icon.png" mode="aspectFill" @click="vipInvite">
@@ -109,8 +116,10 @@
 				</view>
 			</u-popup>
 		</view>
-		<u-picker :show="showday" :columns="columns" keyName="label" style="flex:0;" @cancel="cancel"
-			@confirm='confirm'></u-picker>
+		<view class="">
+			<u-picker :show="showday" :columns="columns" keyName="label" style="flex:0;" @cancel="cancel"
+				@confirm='confirm'></u-picker>
+		</view>
 	</view>
 </template>
 
@@ -124,7 +133,7 @@
 		data() {
 			return {
 				list1: [{
-						name: '群管理员(0)',
+						name: '销售员(0)',
 					},
 					// {
 					// 	name: '待审群管(0)'
@@ -201,7 +210,7 @@
 		mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.getredlist()
-			this.getuserbalancelist()
+			// this.getuserbalancelist()
 		},
 		methods: {
 			showmoreA(data){
@@ -219,7 +228,7 @@
 				console.log( Number(this.groupid))
 				const param={
 					nickName:this.changelist,
-					phonenumber:this.changephone,
+					phoneNumber:this.changephone,
 					remark:this.changeremark,
 					userId: this.groupid
 				}
@@ -229,6 +238,7 @@
 							icon: 'none',
 							title: "修改成功"
 						})
+						this.getredlist('refresh')
 					}else{
 						uni.showToast({
 							icon: 'none',
@@ -270,8 +280,6 @@
 				this.showlist=false
 				setTimeout(()=>{
 					this.showmore=false
-					this.getredlist()
-					console.log(this.getredlist())
 				},200)
 			},
 			copyId(id) {
@@ -336,7 +344,7 @@
 				 getusergroup(params).then(res => {
 					if (res.code == 200) {
 						console.log(res)
-						this.list1[0].name = '群管理员(' + res.data.total + ')'
+						this.list1[0].name = '销售员(' + res.data.total + ')'
 						// refresh 下拉
 						if (type == 'refresh') {
 							this.redpacklist = res.data.list
@@ -428,14 +436,17 @@
 
 <style lang="scss" scoped>
 	.header-box {
-		background: linear-gradient(to right, rgba(66, 144, 240, 1.0), rgba(39, 107, 254, 1));
+		// background: linear-gradient(to right, rgba(66, 144, 240, 1.0), rgba(39, 107, 254, 1));
+		background: linear-gradient(to bottom, #dae9ff, #e1e1fd);
+		
 	}
 
 	.box-btn {
 		font-size: 28rpx;
-		background-color: #f8f8f8;
+		background-color: #fff;
 		border-radius: 8rpx;
 		padding: 4rpx 20rpx;
+		width: fit-content;
 	}
 
 	.invite-member {

+ 1 - 1
pages/courseManage/manage/userDataDetail.vue

@@ -112,7 +112,7 @@
 		getFsCourseList,
 		getCourseVdieoList
 	} from "@/api/courseManage.js"
-	import dropdownPanel from "../components/dropdownPanel.vue"
+	import dropdownPanel from "@/components/dropdownPanel.vue"
 	export default {
 		components: {
 			dropdownPanel

+ 146 - 128
pages/courseManage/operation/index.vue

@@ -21,13 +21,20 @@
 			<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
 				<view class="column flex-1 hb hidden">
 					<view v-if="searchbarNav == 0">
-						<view class="p20 fs28 column flex-1 scrolly">
-							<view v-for="(item,index) in courseOne" :key="item.index"
-								:class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
-								style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
-								{{item.courseName}}
+						<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
+							:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
+							@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
+							:upper-threshold="100" :lower-threshold="100" @refresherabort="triggereds = false"
+							@scrolltolower="reachBottoms">
+							<view class="p20 fs28 column flex-1 scrolly">
+								<view v-for="(item,index) in courseOne" :key="item.index"
+									:class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
+									style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
+									{{item.courseName}}
+								</view>
 							</view>
-						</view>
+							<u-loadmore :status="statusA" />
+						</scroll-view>
 					</view>
 					<view v-else class="p20 fs28 column flex-1 hidden">
 						<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled"
@@ -50,8 +57,13 @@
 		<view class="bgf m20 radius8 column flex-1 scrolly" style="max-height: 100%;">
 			<view class="column flex-1 scrolly">
 				<u-collapse ref="collapseRef" :border="false" :value="collapseValue" @change="changeCollapse">
-					<u-collapse-item name="course">
-						<text slot="title" class="bold fs32">课程统计</text>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="course" title="课程统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="course">
+							<text slot="title" class="bold fs32">课程统计</text>
+							<!-- #endif -->
 						<text slot="value" class="base-color fs24">{{collapseValue.includes('course')?'收回':'展开'}}</text>
 						<view slot="right-icon">
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -60,22 +72,27 @@
 							<view class="base-bg-f8 radius16 p30 flex-1">
 								<view class="mb12 bold">营期</view>
 								<view class="base-color"><text class="bold fs40">
-										{{courselist.course}}</text>期</view>
+										{{courselist.courseNum}}</text>期</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1 mlr20">
 								<view class="mb12 bold">课程数</view>
 								<view class="base-color"><text class="bold fs40">
-										{{courselist.count}}</text>课</view>
+										{{courselist.videoNum}}</text>课</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1">
 								<view class="mb12 bold">参与会员</view>
 								<view class="base-color"><text class="bold fs40">
-										{{courselist.watchCount}}</text>人</view>
+										{{courselist.courseUserNum}}</text>人</view>
 							</view>
 						</view>
 					</u-collapse-item>
-					<!-- <u-collapse-item name="questions">
-						<text slot="title" class="bold fs32">直播统计</text>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="questions" title="看课统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="questions">
+							<text slot="title" class="bold fs32">看课统计</text>
+							<!-- #endif -->
 						<text slot="value"
 							class="base-color fs24">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
 						<view slot="right-icon">
@@ -83,21 +100,26 @@
 						</view>
 						<view class="justify-around ">
 							<view class="base-bg-f8 radius16 p30 flex-1">
-								<view class="mb12 bold">观看人</view>
-								<view class="base-color"><text class="bold fs40">3</text>人</view>
+								<view class="mb12 bold">观看人</view>
+								<view class="base-color"><text class="bold fs40">{{courselist.courseWatchNum}}</text>人</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1 mlr20">
-								<view class="mb12 bold">完播人</view>
-								<view class="base-color"><text class="bold fs40">3</text>人</view>
+								<view class="mb12 bold">完播人</view>
+								<view class="base-color"><text class="bold fs40">{{courselist.courseCompleteNum}}</text>人</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1">
 								<view class="mb12 bold">完播率</view>
-								<view class="base-color"><text class="bold fs40">3</text>%</view>
+								<view class="base-color"><text class="bold fs40">{{courselist.courseCompleteRate}}</text>%</view>
 							</view>
 						</view>
-					</u-collapse-item> -->
-					<u-collapse-item name="redenvelope">
-						<text slot="title" class="bold fs32">答题统计</text>
+					</u-collapse-item>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="redenvelope" title="答题统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="redenvelope">
+							<text slot="title" class="bold fs32">答题统计</text>
+							<!-- #endif -->
 						<text slot="value"
 							class="base-color fs24">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
 						<view slot="right-icon">
@@ -105,24 +127,29 @@
 						</view>
 						<view class="justify-around ">
 							<view class="base-bg-f8 radius16 p30 flex-1">
-								<view class="mb12 bold">答题人</view>
+								<view class="mb12 bold">答题人</view>
 								<view class="base-color"><text class="bold fs40">
-										{{answerlist.count}}</text>人</view>
+										{{courselist.answerNum}}</text>人</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1 mlr20">
-								<view class="mb12 bold">正确人</view>
+								<view class="mb12 bold">正确人</view>
 								<view class="base-color"><text class="bold fs40">
-										{{answerlist.completeCount}}</text>人</view>
+										{{courselist.answerRightNum}}</text>人</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20 flex-1">
 								<view class="mb12 bold">正确率</view>
 								<view class="base-color"><text class="bold fs40">
-										{{answerlist.rate}}</text>%</view>
+										{{courselist.answerRightRate}}</text>%</view>
 							</view>
 						</view>
 					</u-collapse-item>
-					<u-collapse-item name="live">
-						<text slot="title" class="bold fs32">红包统计</text>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="live" title="红包统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="live">
+							<text slot="title" class="bold fs32">红包统计</text>
+							<!-- #endif -->
 						<text slot="value" class="base-color fs24">{{collapseValue.includes('live')?'收回':'展开'}}</text>
 						<view slot="right-icon">
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -131,31 +158,42 @@
 							<view class="base-bg-f8 radius16 p30 flex-1">
 								<view class="mb12 bold">红包个数</view>
 								<view class="base-color"><text class="bold fs40">
-										{{redbaglist.count}}</text>个</view>
+										{{courselist.redPacketNum}}</text>个</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20  mlr20 justify-start align-center">
 								<image src="../../../static/images/redenvelope.png" class="w102 h102"></image>
 								<view class="ml20">
 									<view class="mb12 bold">答题红包金额</view>
 									<view class="base-color">
-										<text class="bold fs40">{{redbaglist.amount}}</text>元
+										<text class="bold fs40">{{courselist.redPacketAmount}}</text>元
 									</view>
 								</view>
 							</view>
 						</view>
 					</u-collapse-item>
-					<u-collapse-item name="funnel">
-						<text slot="title" class="bold fs32">转化漏斗图</text>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="funnel" title="转化漏斗图" v-if="!ratelistState">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="funnel" v-if="!ratelistState">
+							<text slot="title" class="bold fs32">转化漏斗图</text>
+							<!-- #endif -->
 						<text slot="value" class="base-color fs24">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
 						<view slot="right-icon">
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
 						</view>
-						<view>
+						<view v-show="!ratelistState">
 							<funnelChart :getratelist="getrateimg" />
 						</view>
+						<view v-show="ratelistState" class="center">暂无数据</view>
 					</u-collapse-item>
-					<u-collapse-item name="rank">
-						<text slot="title" class="bold fs32">排行榜</text>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="rank" title="排行榜">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="rank">
+							<text slot="title" class="bold fs32">排行榜</text>
+							<!-- #endif -->
 						<text slot="value" class="base-color fs24">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
 						<view slot="right-icon">
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -177,15 +215,16 @@
 									<u-tabs :list="list1" @click="clickTab" lineColor='#1773ff' lineWidth='40'
 										activeStyle="font-weight:bold"></u-tabs>
 								</view>
-								<view class="justify-start align-center mtb28" v-for="(item,index) in rankListA"
+								<view class="justify-start align-center mtb28" v-for="(items,index) in rankListA"
 									:key="index">
-									<u-avatar :src="item.avatar" size="40"></u-avatar>
+									<u-avatar :src="items.avatar" size="40"></u-avatar>
 									<view class="flex-1 ml20">
 										<view class="justify-between mb16">
-											<view class="base-color-3">{{item.name}}</view>
-											<view>{{item.rate}}%</view>
+											<view class="base-color-3 single-line-ellipsis">{{items.userName}}</view>
+											<view v-if="activeA==1">{{items.completeRate}}%</view>
+											<view v-else>{{items.answerRightRate}}%</view>
 										</view>
-										<u-line-progress :percentage="30" activeColor='#1773ff' />
+										<u-line-progress :percentage="activeA==1?items.completeRate:items.answerRightRate" activeColor='#ed0922' />
 									</view>
 								</view>
 								<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
@@ -206,13 +245,14 @@
 									<u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff' lineWidth='40'
 										activeStyle="font-weight:bold"></u-tabs>
 								</view>
-								<view class="justify-start align-center" v-for="(item,index) in rankListB" :key="index">
+								<view class="justify-start align-center" style="height: fit-content;" v-for="(item,index) in rankListB" :key="index">
 									<view class="flex-1 ml20">
 										<view class="justify-between mb16">
-											<view class="base-color-3">{{item.name}}</view>
-											<view>{{item.rate}}%</view>
+											<view class="base-color-3 single-line-ellipsis">{{item.videoName}}</view>
+											<view v-if="activeB==1">{{item.completeRate}}%</view>
+											<view v-else>{{item.answerRightRate}}%</view>
 										</view>
-										<u-line-progress :percentage="30" activeColor='#ed0922' />
+										<u-line-progress :percentage="activeB==1?item.completeRate:item.answerRightRate" activeColor='#ed0922' />
 									</view>
 								</view>
 								<view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
@@ -221,7 +261,6 @@
 					</u-collapse-item>
 				</u-collapse>
 			</view>
-			<view class="h120"></view>
 		</view>
 	</view>
 </template>
@@ -229,17 +268,15 @@
 <script>
 	import {
 		getFsCourseList,
-		getCourseVdieoList,
+		getvideolist,
 		getshopCoursenum,
-		getQuesCount,
-		getRecPacketCount,
-		getcourseRate,
+		getcourseRates,
 		getGroupRanklist,
 		getCourseRanklist
 	} from "@/api/courseManage.js"
-	import dropdownPanel from "../components/dropdownPanel.vue"
+	import dropdownPanel from "@/components/dropdownPanel.vue"
 	import parse from "../../../uni_modules/uview-ui/libs/config/props/parse"
-	import funnelChart from "../components/chart.vue"
+	import funnelChart from "@/components/chart.vue"
 	export default {
 		components: {
 			dropdownPanel,
@@ -272,7 +309,6 @@
 				pageSize: 10,
 				courselist: [],
 				answerlist: [],
-				redbaglist: [],
 				getrateimg: {},
 				list1: [{
 					name: '按完播率',
@@ -285,13 +321,17 @@
 				rankListB: {},
 				activeA: 1,
 				activeB: 1,
+				triggereds: false,
+				statusA: 'loadmore',
+				isEnableds: true,
+				pageNums: 1,
+				pageSizes: 10,
+				ratelistState:false
 			}
 		},
 		async mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.getCoursestatistics()
-			this.getquslist()
-			this.getredbaglist()
 			this.getrateList()
 			this.getrankgroup()
 			await this.getrankCourse()
@@ -327,7 +367,7 @@
 					companyId: this.user.companyId,
 					endTime: '',
 					startTime: '',
-					courseId: this.courseid,
+					periodId: this.courseid,
 					videoId: this.courseids,
 					order: this.orderGroupB,
 					type: this.activeB, // 0:经销商/1:群管
@@ -348,9 +388,7 @@
 				//获取群管排行
 				const params = {
 					companyId: this.user.companyId,
-					endTime: '',
-					startTime: '',
-					courseId: this.courseid,
+					periodId: this.courseid,
 					videoId: this.courseids,
 					order: this.orderGroup,
 					type: this.activeA, // 0:经销商/1:群管
@@ -370,16 +408,12 @@
 			getrateList() {
 				//获取漏斗图
 				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					endTime: '',
-					startTime: '',
-					courseId: this.courseid,
+					periodId: this.courseid,
 					videoId: this.courseids,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
 				}
-				getcourseRate(params).then(res => {
+				getcourseRates(params).then(res => {
 					if (res.code == 200) {
+						this.ratelistState = res.data.every(item => item.value === 0);
 						this.getrateimg = res
 					} else {
 						uni.showToast({
@@ -389,62 +423,11 @@
 					}
 				})
 			},
-			getredbaglist() {
-				//红包统计
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					courseId: this.courseid,
-					videoId: this.courseids,
-					endTime: '',
-					startTime: '',
-				}
-				getRecPacketCount(params).then(res => {
-					if (res.code == 200) {
-						// console.log(res)
-						this.redbaglist = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getquslist() {
-				//答题统计
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					courseId: this.courseid,
-					videoId: this.courseids,
-					endTime: '',
-					startTime: '',
-				}
-				getQuesCount(params).then(res => {
-					if (res.code == 200) {
-						// console.log(res)
-						this.answerlist = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
 			getCoursestatistics() {
 				//课程统计
 				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					courseId: this.courseid,
-					// videoId:this.courseids,
-					endTime: '',
-					startTime: '',
+					periodId: this.courseid,
+					videoId:this.courseids,
 				}
 				getshopCoursenum(params).then(res => {
 					if (res.code == 200) {
@@ -459,6 +442,31 @@
 				})
 
 			},
+			pullDownRefreshs() {
+				// 下拉
+				this.triggereds = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggereds = false;
+					uni.stopPullDownRefresh()
+					this.pageNums = 1;
+					this.getCourseList('refresh') //触底  不穿执行else
+					// 请求接口里面需要判断是不是最后一页   是最后一页 status赋值为‘loadmore’没有更多了
+					// 请求接口
+				}, 1000)
+			},
+			reachBottoms() {
+				// status这个是加载状态
+				console.log(111);
+				if (this.statusA === 'loadmore') {
+					this.statusA = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNums++
+						this.getCourseList() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
 			pullDownRefresh() {
 				// 下拉
 				this.triggered = true; //下拉了状态为true
@@ -490,16 +498,25 @@
 			getCourseTwo(id) {
 				this.courseids = id
 			},
-			getCourseList() {
+			getCourseList(type) {
+				this.courseOne=[]
 				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
+					pageNum: this.pageNums,
+					pageSize: this.pageSizes,
 				}
 				getFsCourseList(param).then(res => {
 					if (res.code == 200) {
-						this.courseOne = res.data
-						// console.log(res)
+						if (type == 'refresh') {
+							this.courseOne = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.courseOne = [...this.courseOne, ...res.data.list]
+						}
+						if (res.data.isLastPage) {
+							this.statusA = 'nomore'
+						} else {
+							this.statusA = 'loadmore'
+						}
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -513,9 +530,8 @@
 					courseId: this.courseid,
 					pageNum: this.pageNum,
 					pageSize: this.pageSize, //
-					status: ''
 				}
-				getCourseVdieoList(param).then(res => {
+				getvideolist(param).then(res => {
 					if (res.code == 200) {
 						// refresh 下拉
 						if (type == 'refresh') {
@@ -558,8 +574,6 @@
 			},
 			confirm() {
 				this.getCoursestatistics()
-				this.getquslist()
-				this.getredbaglist()
 				this.getrateList()
 				this.getrankgroup()
 				this.getrankCourse()
@@ -571,6 +585,10 @@
 				} else {
 					this.courseids = ''
 				}
+				this.getCoursestatistics()
+				this.getrateList()
+				this.getrankgroup()
+				this.getrankCourse()
 			},
 			clickTab(item) {
 				this.activeA = item.index + 1

+ 92 - 96
pages/courseManage/statistics.vue

@@ -4,24 +4,22 @@
 		<view class="container-body">
 			<view class="coursebox">
 				<view class="coursebox-info">
-					<!-- <view class="status">进行中</view> -->
-					<!-- <view class="status" style="background-color: #ff4746;">已结束</view> -->
 					<view class="coursebox-name">
-						<text class="more-t">{{info.title}}</text>
+						<text class="more-t">{{info.title}}-{{info.courseName}}</text>
 						<view class="btn_icon" @click="copyId">ID
 							<image src="@/static/images/copy_icon.png" mode="aspectFill"></image>
 						</view>
 					</view>
-					<!-- <view class="coursebox-name">7.明医有话说-杜老师给您讲讲抑郁杜老师给您讲讲抑郁</view> -->
 					<view style="margin-top: 5px;">{{info.courseName}}</view>
 					<view class="coursebox-time x-start">
-						<view class="coursebox-time-item" style="margin-right: 14px;">
+						<!-- <view class="coursebox-time-item" style="margin-right: 14px;">
 							<view>直播时间</view>
 							<view class="coursebox-time-t">{{info.createTime}}</view>
-						</view>
+						</view> -->
 						<view class="coursebox-time-item duration">
-							<view>课程时长</view>
-							<view class="coursebox-time-t">{{$formatSeconds(info.duration || 0,1)}}</view>
+							<view class="fs24">课程时长</view>
+							<view class="coursebox-time-t">
+							{{formatSeconds(info.duration || 0,1)}}</view>
 						</view>
 					</view>
 				</view>
@@ -30,9 +28,13 @@
 				<u-tabs :list="list1" :current='current' :scrollable="false" :lineWidth="40" lineColor="#1677ff"
 					:activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTab"></u-tabs>
 				<u-collapse :border='false' :value='collapseValue' @change="changeCollapse" v-if="current == 0">
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="live" title="课程数据">
+					<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
 					<u-collapse-item name="live">
-						<view slot="title" class="statistics-title">直播数据<text
-								class="statistics-title-tip">2分钟自动更新</text></view>
+						<text slot="title" class="bold fs32">课程数据</text>
+					<!-- #endif -->
 						<view slot="value"
 							class="statistics-slot-title">{{collapseValue.includes('live')?'收回':'展开'}}</view>
 						<view slot="right-icon">
@@ -41,22 +43,26 @@
 						<view class="collapse-content x-ac">
 							<view class="collapse-content-item">
 								<view class="collapse-content-title">观看人数</view>
-								<view class="collapse-content-num"><text>{{courseCount.count || 0}}</text>人</view>
+								<view class="collapse-content-num"><text>{{courseCount.courseWatchNum || 0}}</text>人</view>
 							</view>
 							<view class="collapse-content-item">
 								<view class="collapse-content-title">完播人数</view>
-								<view class="collapse-content-num"><text>{{courseCount.completeCount || 0}}</text>人
+								<view class="collapse-content-num"><text>{{courseCount.courseCompleteNum || 0}}</text>人
 								</view>
 							</view>
 							<view class="collapse-content-item">
 								<view class="collapse-content-title">完播率</view>
-								<view class="collapse-content-num"><text>{{courseCount.rate || 0}}</text>%</view>
+								<view class="collapse-content-num"><text>{{courseCount.courseCompleteRate || 0}}</text>%</view>
 							</view>
 						</view>
 					</u-collapse-item>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="questions" title="答题数据">
+					<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
 					<u-collapse-item name="questions">
-						<view slot="title" class="statistics-title">答题数据<view
-								class="statistics-title-tip">2分钟自动更新</view></view>
+						<text slot="title" class="bold fs32">答题数据</text>
+					<!-- #endif -->
 						<view slot="value"
 							class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</view>
 						<view slot="right-icon">
@@ -66,16 +72,16 @@
 							<view class="x-ac">
 								<view class="collapse-content-item">
 									<view class="collapse-content-title">答题人数</view>
-									<view class="collapse-content-num"><text>{{quesCount.count || 0}}</text>人</view>
+									<view class="collapse-content-num"><text>{{courseCount.answerNum || 0}}</text>人</view>
 								</view>
 								<view class="collapse-content-item">
 									<view class="collapse-content-title">正确人数</view>
-									<view class="collapse-content-num"><text>{{quesCount.completeCount || 0}}</text>人
+									<view class="collapse-content-num"><text>{{courseCount.answerRightNum || 0}}</text>人
 									</view>
 								</view>
 								<view class="collapse-content-item">
 									<view class="collapse-content-title">答题红包数</view>
-									<view class="collapse-content-num"><text>{{redPacketCount.count || 0}}</text>个
+									<view class="collapse-content-num"><text>{{courseCount.redPacketNum || 0}}</text>个
 									</view>
 								</view>
 							</view>
@@ -84,22 +90,27 @@
 									<image src="@/static/images/redenvelope.png" mode="aspectFill"></image>
 									<text>答题红包金额</text>
 								</view>
-								<view class="collapse-content-num"><text>{{redPacketCount.amount || '0.00'}}</text>元
+								<view class="collapse-content-num"><text>{{courseCount.redPacketAmount || '0.00'}}</text>元
 								</view>
 							</view>
 						</view>
 					</u-collapse-item>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="funnelplot" title="转化漏斗图">
+					<!-- #endif -->
+					<!-- #ifndef MP-WEIXIN -->
 					<u-collapse-item name="funnelplot">
-						<view slot="title" class="statistics-title">转化漏斗图<view
-								class="statistics-title-tip">2分钟自动更新</view></view>
+						<text slot="title" class="bold fs32">转化漏斗图</text>
+					<!-- #endif -->
 						<view slot="value"
 							class="statistics-slot-title">{{collapseValue.includes('funnelplot')?'收回':'展开'}}</view>
 						<view slot="right-icon">
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
 						</view>
-						<view style="height: 600rpx;">
+						<view style="height: 600rpx;" v-if="!ratelistState">
 							<funnelChart :getratelist="getrateimg"/>
 						</view>
+						<view v-show="ratelistState" class="center">暂无数据</view>
 					</u-collapse-item>
 				</u-collapse>
 			</view>
@@ -107,10 +118,15 @@
 			<view v-if="current == 1">
 				<view class="participate-search">
 					<view class="x-bc">
-						<u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false"
-							height="30px"></u-search>
-						<u-button type="primary" class="refresh" color='#1677ff' size="small" :disabled="disabled"
-							text="刷新" @click="refresh"></u-button>
+						<view class="flex-1">
+							<u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false"
+								height="30px" @search="getkeyword"></u-search>
+						</view>
+						<view>
+							<u-button type="primary" class="refresh" color='#1677ff' size="small" :disabled="disabled"
+								text="刷新" @click="refresh"></u-button>
+						</view>
+						
 					</view>
 					<view class="x-bc">
 						<u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff"
@@ -146,8 +162,8 @@
 							</view>
 							<view class="list-item-desc">
 								<view class="taglist">
-									<view v-for="(tag,i) in item.tags ? item.tags.split(',') : []">
-										<u-tag :text="tag" size="mini" color="#999" bgColor="#f5f5f5"
+									<view v-for="(e,i) in item.tags">
+										<u-tag :text="e.tag" size="mini" color="#999" bgColor="#f5f5f5"
 											borderColor="#f5f5f5"></u-tag>
 									</view>
 								</view>
@@ -155,9 +171,10 @@
 									<text class="label">观看次数</text><text
 										class="value-num">{{item.watchCount || 0}}</text>
 									<text class="label">完播次数</text><text
-										class="value-num">{{item.watchComlpleteCount || 0}}</text>
+										class="value-num">{{item.finishCount || 0}}</text>
 									<text class="label">累计时长</text><text
-										class="value-num">{{item.watchTime || '--'}}</text>
+										class="value-num"> {{$formatSeconds(item.watchTime,1)}}</text>
+										
 								</view>
 								<view style="margin-top: 5px;">
 									<text class="label">红包领取状态</text>
@@ -168,12 +185,12 @@
 								<view style="margin-top: 5px;"><text class="label">观看时间</text><text
 										class="value-num">{{item.watchDate}}</text></view>
 							</view>
-							<view class="list-item-footer x-f">
+							<!-- <view class="list-item-footer x-f">
 								<view class="list-item-footer-btn x-f" @click="openModel('name',item)">改姓名</view>
 								<view class="list-item-footer-btn x-f" @click="openModel('remark',item)">改备注</view>
 								<view class="list-item-footer-btn footer-tagbtn x-f" @click="openModel('tag',item)">改标签
 								</view>
-							</view>
+							</view> -->
 						</view>
 					</view>
 				</mescroll-body>
@@ -211,18 +228,15 @@
 <script>
 	import {
 		getCompanyUserAndUserCount,
-		getCourseCount,
-		getQuesCount,
-		getRecPacketCount,
+		getshopCoursenum,
 		getUserLogListByCourseId,
 		updateFsUser,
 		getcompanyTaglist,
 		changeLable,
 		changeUserName,
-		getuserdetail,
-		getcourseRate
+		getcourseRates
 	} from "@/api/courseManage.js"
-	import funnelChart from './components/chart.vue'
+	import funnelChart from '@/components/chart.vue'
 	export default {
 		components: {
 			funnelChart,
@@ -296,17 +310,19 @@
 				user: {},
 				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
 				courseCount: {},
-				quesCount: {},
-				redPacketCount: {},
 				courseId: '',
 				chooseUserId: '',
 				companytag:[],
 				selectidtag:[],
-				getrateimg:[]
+				getrateimg: {},
+				ratelistState:false,
+				videoId:''
 			}
 		},
 		onLoad(option) {
-			this.info = option.info ? JSON.parse(option.info) : {}
+			this.info = option.info ? JSON.parse(option.info) : {},
+			this.videoId=this.info.videoId
+			console.log(this.info)
 			uni.setNavigationBarTitle({
 				title: '数据统计'
 			});
@@ -317,19 +333,29 @@
 				this.getCount()
 		},
 		methods: {
+			getkeyword(value){
+				this.keyword=value
+				this.upCallback()
+			},
+			//转化时间格式
+			 formatSeconds(seconds) {
+			  const hours = Math.floor(seconds / 3600);
+			  const minutes = Math.floor((seconds % 3600) / 60);
+			  const remainingSeconds = seconds % 60;
+			  
+			  // 补零函数:确保两位数显示
+			  const pad = (num) => num.toString().padStart(2, '0');
+			  
+			  return `${pad(hours)}:${pad(minutes)}:${pad(remainingSeconds)}`;
+			},
 			getrateList(){
 				//获取漏斗图
 				const params={
-					companyId: this.user.companyId,
-					companyUserId: '',
-					courseId:this.info.courseId,
-					endTime:'',
-					startTime:'',
-					type:this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					userId:'',
+					videoId:this.info.courseId,
 				}
-				getcourseRate(params).then(res=>{
+				getcourseRates(params).then(res=>{
 					if(res.code==200){
+						this.ratelistState = res.data.every(item => item.value === 0);
 						this.getrateimg=res
 						console.log(res)
 					}else{
@@ -401,11 +427,11 @@
 			},
 			copyId() {
 				uni.setClipboardData({
-					data: this.info.fileId,
+					data: this.info.courseName,
 					success: () => {
 						uni.showToast({
-							title: '复制课程ID成功',
-							icon: 'success'
+							title: '复制课程标题成功',
+							icon: 'none'
 						})
 					}
 				});
@@ -438,17 +464,16 @@
 				//联网加载数据
 				var that = this;
 				var data = {
-					courseId: this.courseId,
-					order: this.typeoptionOrder[this.searchTypeIndex],
-					tagIds: [],
+					videoId: this.videoId,
 					type: this.list2[this.currentType].value, // 0:答题正确 1:未完播 2:已完播 3:未播放
 					pageNum: page.num,
-					pageSize: page.size
+					pageSize: page.size,
+					keyword:this.keyword
 				};
 				uni.showLoading({
 					title: "加载中..."
 				})
-				this.list2[this.currentType].name = this.list2[this.currentType].label
+				// this.list2[this.currentType].name = this.list2[this.currentType].label
 				getUserLogListByCourseId(data).then(res => {
 					uni.hideLoading()
 					if (res.code == 200) {
@@ -460,7 +485,7 @@
 							that.dataList = that.dataList.concat(res.data.list);
 
 						}
-						this.list2[this.currentType].name = this.list2[this.currentType].label + (res.data.total)
+						// this.list2[this.currentType].name = this.list2[this.currentType].label + (res.data.total)
 						that.mescroll.endBySize(res.data.list.length, res.data.total);
 
 					} else {
@@ -475,19 +500,14 @@
 			},
 			getCount() {
 				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					courseId: this.courseId,
-					endTime: this.todayday + ' 23:59:59',
-					startTime: this.todayday + ' 00:00:00',
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
+					videoId: this.courseId,
+					// endTime: this.todayday + ' 23:59:59',
+					// startTime: this.todayday + ' 00:00:00',
 				}
 				this.getCourseCount(param)
-				this.getQuesCount(param)
-				this.getRecPacketCount(param)
 			},
 			getCourseCount(param) {
-				getCourseCount(param).then(res => {
+				getshopCoursenum(param).then(res => {
 					if (res.code == 200) {
 						this.courseCount = res.data
 					} else {
@@ -498,30 +518,6 @@
 					}
 				})
 			},
-			getQuesCount(param) {
-				getQuesCount(param).then(res => {
-					if (res.code == 200) {
-						this.quesCount = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
-			getRecPacketCount(param) {
-				getRecPacketCount(param).then(res => {
-					if (res.code == 200) {
-						this.redPacketCount = res.data
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg,
-						});
-					}
-				})
-			},
 			openModel(type, item) {
 				this.chooseUserId = item.userId
 				if (type == 'name') {
@@ -609,7 +605,7 @@
 			top: 0;
 			left: 0;
 			width: 100%;
-			height: 210px;
+			height: 280px;
 		}
 
 		&-body {}
@@ -619,7 +615,7 @@
 			font-family: PingFang SC, PingFang SC;
 			font-weight: 400;
 			font-size: 14px;
-			color: #999;
+			color: #888;
 
 			.status {
 				position: absolute;
@@ -638,7 +634,7 @@
 
 			&-info {
 				padding: 12px;
-				background-color: rgba(255, 255, 255, 0.88);
+				background-color: rgba(255, 255, 255, 0.8);
 				border-radius: 12px;
 				overflow: hidden;
 				position: relative;
@@ -672,7 +668,7 @@
 
 			.duration {
 				position: relative;
-				padding-left: 14px;
+				// padding-left: 14px;
 
 				&::after {
 					content: "";

+ 65 - 83
pages/courseManage/vip/ManageDetail.vue

@@ -4,19 +4,24 @@
 			<view class="justify-start p30 bgcolf radius12">
 				<u-avatar :src='detailUser.avatar'></u-avatar>
 				<view class="ml16">
-					<view class="bold fs28">{{detailUser.nickName?detailUser.nickName:detailUser.phone}}</view>
+					<view class="bold fs28">{{detailUser.nickname}}</view>
 					<view class="fs24 base-color-3">注册时间:{{detailUser.createTime}}</view>
 				</view>
 			</view>
 		</view>
-		<view class="plr20 ptb32 justify-around">
+		<view class="plr20 ptb32 justify-around bgf">
 			<view v-for="(item,index) in typeOption" :key="item.value" class='fs24 base-color-3 ptb4 plr20 radius4'
-				@click="tabActive(index)" :class="tabindex==index?'actsel':'notact'">{{item.label}}</view>
+				@click="tabActive(item)" :class="tabindex==index?'actsel':'notact'">{{item.label}}</view>
 		</view>
-		<view>
+		<view class="bgf pb40">
 			<u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
-				<!-- <u-collapse-item name="course">
-					<text slot="title" >直播统计</text>
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="course" title="看课统计">
+				<!-- #endif -->
+				<!-- #ifndef MP-WEIXIN -->
+				<u-collapse-item name="course">
+						<text slot="title" class="bold">看课统计</text>
+						<!-- #endif -->
 					<text slot="value" class="base-color fs24">{{collapseValue.includes('course')?'收回':'展开'}}</text>
 					<view slot="right-icon">
 						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -24,16 +29,21 @@
 					<view class="justify-between">
 						<view class="justify-between livebox">
 							<view class="base-color-3">观看次数</view>
-							<view class="base-color fs24"><text class="fs32 bold">0</text>次</view>
+							<view class="base-color fs24"><text class="fs32 bold">{{answerlist.watchTimes}}</text>次</view>
 						</view>
 						<view class="livebox justify-between">
 							<view class="base-color-3">完播次数</view>
-							<view class="base-color fs24"><text class="fs32 bold">0</text>次</view>
+							<view class="base-color fs24"><text class="fs32 bold">{{answerlist.completeWatchCount}}</text>次</view>
 						</view>
 					</view>
-				</u-collapse-item> -->
-				<u-collapse-item name="course">
-					<text slot="title">答题统计</text>
+				</u-collapse-item>
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="questions" title="答题统计">
+				<!-- #endif -->
+				<!-- #ifndef MP-WEIXIN -->
+				<u-collapse-item name="questions">
+						<text slot="title" class="bold">答题统计</text>
+						<!-- #endif -->
 					<text slot="value" class="base-color fs24">{{collapseValue.includes('course')?'收回':'展开'}}</text>
 					<view slot="right-icon">
 						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -42,19 +52,19 @@
 						<view class=" liveboxs">
 							<view class="base-color-3">答题次数</view>
 							<view class="base-color fs24">
-								<text class="fs32 bold">{{answerlist.answerCount}}</text>次
+								<text class="fs32 bold">{{answerlist.answerTime}}</text>次
 							</view>
 						</view>
 						<view class="liveboxs ">
 							<view class="base-color-3">正确次数</view>
 							<view class="base-color fs24">
-								<text class="fs32 bold">{{answerlist.rightCount}}</text>次
+								<text class="fs32 bold">{{answerlist.answerRightTime}}</text>次
 							</view>
 						</view>
 						<view class="liveboxs ">
 							<view class="base-color-3">答题红包数</view>
 							<view class="base-color fs24">
-								<text class="fs32 bold">{{answerlist.redSize}}</text>次
+								<text class="fs32 bold">{{answerlist.answerRedPacketTime}}</text>次
 							</view>
 						</view>
 					</view>
@@ -65,15 +75,15 @@
 				<view class="ml20">
 					<view class="base-color-3">答题红包金额</view>
 					<view class="base-color fs24"><text class="fs32 bold mr4">
-					{{answerlist.totalAmount==0?'00.00':answerlist.totalAmount}}</text>元</view>
+					{{answerlist.answerRedPacketAmount==0?'00.00':answerlist.answerRedPacketAmount}}</text>元</view>
 				</view>
 			</view>
 		</view>
 		<view class="justify-center botfun">
 			<view class="justify-start align-center bottom-btns" style="border: 2rpx solid #ee0a25;"
-			@click="disableUser" :class="this.detailUser.isBlack==0?'':'base-bg-red'">
-				<u-icon name="close-circle" :color="this.detailUser.isBlack==0?'#ee0a25':'#fff'" size="22" ></u-icon>
-				<view class=" ml12" :class="this.detailUser.isBlack==0?'base-color-red':'colorf'">{{answerText}}</view>
+			@click="disableUser" :class="this.detailUser.status==1?'bgf':'base-bg-red'">
+				<u-icon name="close-circle" :color="this.detailUser.status==1?'#ee0a25':'#fff'" size="22" ></u-icon>
+				<view class=" ml12" :class="this.detailUser.status==1?'base-color-red':'colorf'">{{answerText}}</view>
 			</view>
 			<!-- <view class="justify-start align-center bottom-btns" style="border: 2rpx solid #1677ff;">
 				<u-icon name="pushpin" color="#1677ff" size="22"></u-icon>
@@ -116,69 +126,45 @@
 				collapseValue: ['course', 'questions', 'redenvelope'],
 				detailUser: [],
 				user: [],
-				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
-				startTime: '',
-				endTime: '',
 				answerlist:[],
 				answerText:'禁用',
-				userId:[]
+				userId:[],
+				id:'',
+				dateTag:''
 			}
 		},
-		
-		mounted() {
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			this.detailUser = uni.getStorageSync('detailUser')
-			console.log(this.detailUser)
+		onShow() {
 			this.getAnswerlists()
+			this.detailUser =uni.getStorageSync('detailUser')
+			if(this.detailUser.status==0){
+				this.answerText='取消禁用'
+			}
+		},
+		mounted() {
+			
+		},
+		onLoad(option) {
+			this.id=option.id
 		},
 		methods: {
-			tabActive(index) {
-				console.log(index)
-				this.tabindex = index
-				if(index==0){
-					this.startTime=''
-					 this.endTime=''
-					 this.getAnswerlists()
-				}else if(index==1){
-					this.startTime = this.todayday + ' 00:00:00'
-					this.endTime = this.todayday + ' 23:59:59'
-					this.getAnswerlists()
-				}else if(index==2){
-					let yesterday = new Date();
-					yesterday.setDate(yesterday.getDate() - 1);
-					this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
-					this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 23:59:59'
-					this.getAnswerlists()
-				}else if(index==3){
-					let yesterday = new Date();
-					yesterday.setDate(yesterday.getDate() - 2);
-					this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
-					this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 23:59:59'
-					this.getAnswerlists()
-				}else{
-					let yesterday = new Date();
-					yesterday.setDate(yesterday.getDate() - 6);
-					this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
-					this.endTime = this.todayday + ' 23:59:59'
-					this.getAnswerlists()
-				}
+			tabActive(item) {
+				this.tabindex = item.value
+				this.dateTag=item.label
+				console.log(item.label)
+				this.getAnswerlists()
 			},
 			changeCollapse(e) {
 				this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
 			},
 			getAnswerlists() {
 				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					courseId: this.tabindex,
-					startTime: this.startTime,
-					endTime: this.endTime,
-					userId: this.detailUser.userId
+					dateTag:this.dateTag,
+					userId: this.id
 				}
 				getanswerlist(params).then(res => {
 					if (res.code == 200) {
 						this.answerlist=res.data
+						console.log(this.answerlist)
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -188,13 +174,13 @@
 				})
 			},
 			disableUser(){
-				if(this.detailUser.isBlack==0){
+				if(this.detailUser.status==1){
 					this.addblack()
-					this.detailUser.isBlack=1
+					this.detailUser.status=0
 					this.answerText='已禁用'
 				}else{
 					this.deleteblack()
-					this.detailUser.isBlack=0
+					this.detailUser.status==1
 					this.answerText='禁用'
 				}
 			},
@@ -202,12 +188,9 @@
 				//添加到黑名单
 				this.userId[0]=this.detailUser.userId
 				const params={
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					id:'',
-					userId: this.userId
+					array: this.userId
 				}
-				Addblacklist(params).then(res=>{
+				Addblacklist(this.userId).then(res=>{
 					if(res.code==200){
 						console.log(res)
 						uni.showToast({
@@ -215,8 +198,9 @@
 							title: '用户成功被禁用'
 						})
 						setTimeout(()=>{
-							uni.navigateTo({
-								url:'/pages/courseManage/index'
+							console.log(1232)
+							uni.navigateBack({
+								data:1
 							})
 						},500)
 					}else{
@@ -229,18 +213,16 @@
 			},
 			deleteblack(){
 				//移除黑名单
-				const params={
-					userId:this.detailUser.userId
-				}
-				removebalcklist(params).then(res=>{
+				this.userId[0]=this.detailUser.userId
+				removebalcklist(this.userId).then(res=>{
 					if(res.code){
 						uni.showToast({
 							icon: 'none',
 							title: '用户成功取消禁用'
 						})
 						setTimeout(()=>{
-							uni.navigateTo({
-								url:'/pages/courseManage/index'
+							uni.switchTab({
+								url:'/pages/customer/index'
 							})
 						},500)
 					}else{
@@ -256,9 +238,9 @@
 </script>
 
 <style lang="scss" scoped>
-	page {
-		background-color: #fff;
-	}
+	// page {
+	// 	background-color: #fff;
+	// }
 
 	.topBgline {
 		background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));

+ 0 - 22
pages/courseManage/vip/dropDownList.vue

@@ -1,22 +0,0 @@
-<template>
-	<!-- 必须保证父组件高度是确认的 -->
-	<view class="dropd_own_list column">
-		
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.dropd_own_list {
-		height: 100%;
-	}
-</style>

+ 0 - 1420
pages/courseManage/vip/index.vue

@@ -1,1420 +0,0 @@
-<template>
-	<view class="container column">
-		<view class="headbox">
-			<view style="padding: 10px 10px 0 10px;" class="mb20">
-				<u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff"
-					:fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
-				<view style="margin-top: 10px;" v-if="current==0">
-					<u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false" height="30px"
-						@search='searchKeyword'></u-search>
-				</view>
-				<view class="x-bc" v-if="current==0">
-					<u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff"
-						:activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTypeTab"></u-tabs>
-					<!-- <view class="participate-order x-f">
-						<image src="@/static/images/order_icon2.png" mode="aspectFill"
-							v-if="searchTypeIndex == 0 || searchTypeIndex == 2"></image>
-						<image src="@/static/images/order_icon.png" mode="aspectFill" v-else></image>
-						<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
-							{{typeoption[searchTypeIndex]}}
-						</picker>
-					</view> -->
-				</view>
-				<view class="tagbox x-bc" v-if="current==0">
-					<view class="tagbox-left x-f">
-						<!-- <view class="x-f" @click="openPop('search')">{{array[queryParam.typeIndex].name}}<u-icon name="arrow-down-fill" color="#2979ff" size="11" style="margin: 0 3px;"></u-icon></view> -->
-						<view class="tagbox-list x-f">
-							<view class="tagbox-item x-f" v-for="(item,index) in showCompanytag" :key='item.tagId'
-								:class="item.checked?'checked-bg':''">
-								{{item.tag}}
-							</view>
-						</view>
-					</view>
-					<view class="tagbox-right x-f" @click="openPop('tag')">筛选<u-icon name="arrow-down" color="#1677ff"
-							size="12"></u-icon></view>
-				</view>
-			</view>
-			<view v-if="current==0">
-				<dropdownPanel :filterData='filterData' @onClick="getactNav" :itemname='itemname' @onChange="onChange"
-					@confirm="confirm" @reset="reset" :ispopshow='ispopshow'>
-					<view v-if="filterData[searchbarNav].type == 'registerTime'">
-						<view class="boxnav x-bc ">
-							<view class="boxnav-item" style="width: 25%;"
-								v-for="(item,index) in filterData[searchbarNav].option" :key="index">
-								<view class="boxnav-item-info one-t"
-									:class="registerTimeIndex == index ? 'boxnav-active':''"
-									@click="handleParamItem('registerTime',index)">{{item.label}}</view>
-							</view>
-							<view class="boxnav-item x-ac" style="width: 100%;" v-show="registerTimeIndex == 4">
-								<view class="calendar-day x-c" @click="$refs.calendar.open()">
-									<u-icon name="calendar" color="#999"
-										size="20"></u-icon>{{queryParam.startTime || '选择日期'}}
-								</view>
-								<view class="calendar-day x-c" @click="$refs.calendar.open()">
-									<u-icon name="calendar" color="#999"
-										size="20"></u-icon>{{queryParam.endTime || '选择日期'}}
-								</view>
-							</view>
-						</view>
-					</view>
-					<view v-if="filterData[searchbarNav].type == 'watchStatus'">
-						<view class="boxnav x-bc">
-							<view class="boxnav-item" v-for="(item,index) in filterData[searchbarNav].option"
-								:key="index">
-								<view class="boxnav-item-info one-t"
-									:class="watchStatusIndex == index ? 'boxnav-active':''"
-									@click="handleParamItem('watchStatus',index)">{{item.label}}</view>
-							</view>
-						</view>
-					</view>
-					<view v-if="filterData[searchbarNav].type == 'nowatchStatus'">
-						<view class="boxnav x-bc">
-							<view class="boxnav-item" v-for="(item,index) in filterData[searchbarNav].option"
-								:key="index">
-								<view class="boxnav-item-info one-t"
-									:class="nowatchStatusIndex == index ? 'boxnav-active':''"
-									@click="handleParamItem('nowatchStatus',index)">{{item.label}}</view>
-							</view>
-						</view>
-					</view>
-				</dropdownPanel>
-			</view>
-		</view>
-		<uni-calendar ref="calendar" :clear-date="true" :date="date" :insert="false" :lunar="false"
-			:startDate="$u.timeFormat(new Date().getTime() - (3600 * 24 * 365 * 1000), 'yyyy-mm-dd')" :range='true'
-			@confirm="confirmCalendar" :endDate="$u.timeFormat(new Date().getTime(), 'yyyy-mm-dd')" />
-		<!-- 搜索选择弹窗/标签筛选 -->
-		<u-popup :show="showPop" :round="12" @close="closePop" class="model" :zIndex="10076" style="flex: 0;">
-			<view class="popbox">
-				<view class="popbox-head">
-					<u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="closePop"></u-icon>
-					{{popTitle}}
-				</view>
-				<view class="popbox-body">
-					<view class="radiobox" v-show="popTitle == '搜索选择'">
-						<label class="radiobox-item x-bc mbline" v-for="(item, index) in array" :key="item.value"
-							@click="bindTypeChange(index)">
-							<view>{{item.name}}</view>
-							<radio :value="item.value" :checked="index === typeIndex" style="transform:scale(0.75)" />
-						</label>
-					</view>
-					<view class="tagbox-list x-f">
-						<!-- <view class="tagbox-item x-f tag-active" @click="chooseTag">未打标签</view> -->
-						<view class="mlr10 " v-for="(item,index) in companytag" :key='item.tagId'>
-							<u-tag :text="item.tag" :plain="!item.checked" :name="index"
-								@click="chooseTag(index)"></u-tag>
-						</view>
-					</view>
-				</view>
-				<view class="popbox-footer x-bc">
-					<button class="popbox-footer-btn" @click="resetPop" v-show="popTitle == '标签筛选'">重置</button>
-					<button class="popbox-footer-btn" @click="closePop" v-show="popTitle == '搜索选择'">取消</button>
-					<button class="popbox-footer-btn con-btn" @click="confirmPop">确定</button>
-				</view>
-			</view>
-		</u-popup>
-		<view class="userbox column hb hidden">
-			<!-- <mescroll-body  bottom="0" ref="mescrollRef" @init="mescrollInit" :down="downOption" :up="upOption" @down="downCallback" @up="upCallback"> -->
-			<view class="userlist column hb hidden">
-				<!-- <dropDownList /> -->
-				<vipUserItem :viplist='userList' :isShowSelectAll="isShowSelectAll" @changeItem="changeItem"
-					@getuserId='singleChange' @getlableId='singleChangeLable' @change='changesinglevip'
-					@pullDownRefresh="current==0?getfsuserListdata('refresh'):getbalckList('refresh')"
-					@reachBottom="current==0?getfsuserListdata('more'):getbalckList('more')"
-					@changePageOptions="e=>pageOptions=e" :pageOptions="pageOptions" :status="status"
-					@changeStatus="e=>status=e" />
-				<u-empty mode="list" icon="http://cdn.uviewui.com/uview/empty/car.png" v-if="userList.length==0">
-				</u-empty>
-				<view class="justify-between base-bg-f foot-select" v-if="isShowSelectAll">
-					<view class="align-center justify-between" v-if="isShowSelectAll">
-						<u-checkbox-group @change="selectAll">
-							<u-checkbox :checked="isSelectAll" shape="circle" activeColor="#FF6C47" :name="true"
-								label="全选" labelColor="#333" /><text class="fs24 base-color-9 ml12">已选 {{selectedCount}}
-								个</text>
-						</u-checkbox-group>
-					</view>
-					<view class="justify-center ">
-						<button class="base-bg-red radius100 colorf h62 fs28 lh62 mlr10"
-							@click="changeProhibit">禁用</button>
-						<button class="base-bg-blue radius100 colorf h62 fs28 lh62"
-							@click="showTagSelect=!showTagSelect">改标签</button>
-						<button class="base-bg-f radius100 base-color-red h62 ml10 fs28 lh60"
-							style="border: #ef4c50 solid 2rpx;" v-if="user.userType==0"
-							@click="changevipuser">更换归属</button>
-					</view>
-				</view>
-			</view>
-			<!-- </mescroll-body> -->
-		</view>
-		<!-- <u-picker :show="showTagSelect" :columns="companytag" keyName="tag" @cancel='showTagSelect=false'
-			@confirm='singleChangeLable' ></u-picker> -->
-		<u-popup :show="showTagSelect" @close='closetagselect' :closeOnClickOverlay='true'
-		 mode="bottom" style="z-index: 99999;">
-			<view class=" w100 bgf">
-				<view class="plr28 ptb16 justify-between" style="flex-direction: row-reverse">
-					<u-icon class="" name="close-circle" color="#ccc" size="24" @click="closetagselect"></u-icon>
-				</view>
-				<view class="justify-start p32">
-					<view class="mlr10 " v-for="(item,index) in changetag" :key='item.tagId'>
-						<u-tag :text="item.tag" :plain="!item.checked" :name="index" @click="choosechangeTag"></u-tag>
-					</view>
-				</view>
-				<view class="justify-between p32">
-					<view class="changetagbtn base-bg-f8" @click="showTagSelect=!showTagSelect">取消</view>
-					<view class="changetagbtn colorf base-bg-blue" @click="suretagchangeAll">确定</view>
-				</view>
-			</view>
-		</u-popup>
-		<image class="invite-member" src="@/static/images/invite-member-icon.png" mode="aspectFill" @click="vipInvite"
-			v-if='!isShowSelectAll && user.userType==1'>
-		</image>
-		<!-- 邀请弹窗 -->
-		<u-popup :show="invitePop" :round="12" @close="invitePop = false" :zIndex="10074" style="flex: 0;">
-			<view class="popbox">
-				<view class="popbox-head">
-					<u-icon class="close-circle" name="close-circle" color="#ccc" size="24"
-						@click="invitePop = false"></u-icon>
-					分享方式
-				</view>
-				<view class="popbox-body">
-					<view class="choosetitle x-bc">
-						<view>选择标签</view>
-						<view v-if="sharetaglist" style="color:#1677ff"
-						 @click="addtag(0)">{{zhanshitag}}</view>
-						<view class="x-f" style="color:#1677ff;"v-else
-						@click="addtag(0)">
-							<u-icon name="plus" color="#1677ff" size="14" 
-							style="margin-right: 5px;"></u-icon>添加标签
-						</view>
-					</view>
-					<view class="invitetip">选择标签,当会员注册成功后,即可自动打标签</view>
-					<!-- <view class="tagbox-list x-f" style="margin-top: 10px;margin-left: 0px;">
-						<view class="tagbox-item x-f" @click="chooseTag">未打标签</view>
-						<view class="tagbox-item x-f tag-active">未打标签</view>
-					</view> -->
-					<view class="x-bc" style="margin-top: 30px;">
-						<view class="sharePop-item y-f " @click="shareimg" style="text-align: center;">
-							<image src="@/static/images/card_icon.png" mode="aspectFill"
-							style="width: 80rpx; height: 80rpx;margin-top: 20rpx;"></image>
-							<view style="font-weight: bold;margin-bottom: 4px;">生成卡片</view>
-							<view style="font-size: 12px;color: #888;">指导分享轻松转发</view>
-						</view>
-						<view class="sharePop-item y-f " @click="buildimg"  style="text-align: center;">
-							<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
-							<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
-							<view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
-						</view>
-						<view class="sharePop-item y-f " @click="copyLink"  style="text-align: center;">
-							<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
-							<view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
-							<view style="font-size: 12px;color: #888; " >生成链接一键复制</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</u-popup>
-		<!-- 设置链接有效时长弹窗 -->
-		<u-modal :show="setTimeShow" content='content' class="model" @confirm="confirmTime">
-			<view class="setTimebox">
-				<view class="timetip">不传默认以系统参数为准</view>
-				<view class="x-f">
-					<text style="margin-right: 20px;">链接有效时长(分钟)</text>
-					<u-input fontSize="14px" placeholder="链接有效时长" border="none" v-model="time" maxlength="5"></u-input>
-				</view>
-			</view>
-		</u-modal>
-		<!-- 长按保存海报 -->
-		<u-popup :show="setImg"  @close="closeimg" :round="12">
-			<view  class="w100 h500">
-				<image :src="codeLink.url" class="codeimg w660" mode="widthFix"></image>
-			</view>
-			<view class="justify-around mtb40">
-				<view class="column justify-center align-center" @click="downimg">
-					<image src='@/static/image/downicon.png' class="w80 h80"></image>
-					<view class="mt10">长按图片保存</view>
-				</view>
-			</view>
-		</u-popup>
-		<!-- 卡片分享引导 -->
-		<u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
-			<view class="point-box">
-				<view class="imgshe" >
-					<image src='@/static/image/point.png' class="w300 h300"></image>
-				</view>
-				<view class="column colorf fs32 xu-box fs40
-				align-center justify-center">
-					<view class="justify-center">点击右上角
-					<image src="../../../static/image/wxmore.png"
-					class="w50 h50 mlr10"></image>
-					</view>
-					<view class="mt20">选择 “转发给朋友”</view>
-					<view style="color: #cbcbcb;" class="fs28 mt40">点击任意位置关闭弹窗</view>
-				</view>
-			</view>
-		</u-overlay>
-		<!-- 更改归属 -->
-		<u-picker :show="showcol" :columns="columns" @cancel='showcol=!showcol' @confirm='receiveA'
-			keyName="nickName"></u-picker>
-	</view>
-</template>
-
-<script>
-	import {
-		getfsuserList,
-		getcompanyTaglist,
-		Addblacklist,
-		changeLable,
-		getBlackvipNumber,
-		getBlackvipList,
-		getvipNum,
-		changevipUser,
-		getgroupList,
-		becomeVipuser,
-		becomeVipuserImg,
-		getSDK
-	} from "@/api/courseManage.js";
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	import vipUserItem from "../components/vipUserItem.vue"
-	import dropDownList from "./dropDownList.vue"
-	import dropdownPanel from "../components/dropdownPanel.vue"
-	import {
-		data
-	} from "../../../uni_modules/uview-ui/libs/mixin/mixin";
-	import html2canvas from 'html2canvas'
-	import wx from 'weixin-js-sdk'
-	export default {
-		mixins: [MescrollMixin],
-		components: {
-			vipUserItem,
-			dropdownPanel,
-			dropDownList
-		},
-		data() {
-			return {
-				showcol: false,
-				setImg:false,
-				columns: [],
-				showTagSelect: false,
-				list: [{
-					name: '会员(0)',
-
-				}, {
-					name: '小黑屋(0)'
-				}],
-				userList: [],
-				current: 0,
-				keyword: "",
-				companytag: [],
-				showCompanytag: [],
-				selectedList: [], //已经选中标签列表
-				list2: [{
-					name: '全部',
-				}, {
-					name: '今日新增',
-				}, {
-					name: '今日完播'
-				}, {
-					name: '未看过课'
-				}],
-				currentType: 0,
-				activeStyle: {
-					color: '#1677ff',
-					fontSize: '14px',
-					fontWeight: 'bold'
-				},
-				inactiveStyle: {
-					fontSize: '14px'
-				},
-				searchTypeIndex: 0,
-				typeArray: ['连续缺课天数多到少', '连续缺课天数少到多', '按注册时间晚到早', '会员姓名0-9-A-Z'],
-				typeoption: ['连续缺课', '连续缺课', '注册时间', '会员姓名'],
-				array: [{
-						value: '0',
-						name: '关联搜索',
-					},
-					{
-						value: '1',
-						name: '精准搜索'
-					}
-				],
-				typeIndex: 0,
-				popTitle: '搜索选择',
-				showPop: false,
-				filterData: [{
-						name: '注册时间',
-						value: 0,
-						type: 'registerTime',
-						option: [{
-							label: '全部',
-						}, {
-							label: '今天',
-						}, {
-							label: '昨天',
-						}, {
-							label: '近7天',
-						}, {
-							label: '自定义',
-						}]
-					}, {
-						name: '看课状态',
-						value: 1,
-						type: 'watchStatus',
-						option: [{
-							label: '全部',
-						}, {
-							label: '未看过课',
-						}, {
-							label: '正常看课',
-						}, {
-							label: '停止看课',
-						}]
-					},
-					{
-						name: '批量',
-						value: 3,
-						type: 'piliang',
-						special: true,
-						stopPrevent: true
-					}
-				],
-				searchbarNav: 0,
-				registerTimeIndex: 0,
-				watchStatusIndex: 0,
-				watchStatusIndex: 0,
-				showCalendar: false,
-				date: '',
-				mode: 'range',
-				queryParam: {
-					typeIndex: 0,
-					startTime: '',
-					endTime: ''
-				},
-				mescroll: null,
-				downOption: {
-					use: true,
-					auto: false
-				},
-				upOption: {
-					onScroll: false,
-					use: true, // 是否启用上拉加载; 默认true
-					auto: true,
-					page: {
-						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore: "已经到底了",
-					empty: {
-						icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: [],
-				invitePop: false,
-				setTimeShow: false,
-				time: "",
-				user: {},
-				idx: [],
-				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
-				startTime: '',
-				endTime: '',
-				isShowSelectAll: false, //是否显示全选
-				isSelectAll: false, //是否全选
-				ispopshow: false,
-				selectidAll: [],
-				changetag: [],
-				selectidtag: '',
-				itemname: '',
-				userid: '',
-				groupid: [],
-				pageOptions: {
-					pageNum: 1,
-					pageSize: 5,
-				},
-				status: 'loadmore',
-				sharetag:1,
-				sharetaglist:[],
-				codeLink: [],
-				zhanshitag:'',
-				copyLinks:'',
-				showzhidao:false,
-				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
-			}
-		},
-		onLoad() {
-			uni.setNavigationBarTitle({
-				title: '数据统计'
-			});
-			// this.getjssdklist()
-		},
-		onShow() {
-			this.getfsuserListdata()
-			this.getcompanyTag()
-			this.getblacknum()
-		},
-		mounted() {
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			this.getfsuserListdata()
-			this.getcompanyTag()
-			this.getblacknum()
-		},
-		computed: {
-			selectedCount() {
-				return this.userList.filter(item => item.checked).length;
-			},
-		},
-		methods: {
-			getjssdklist() {
-				const param = {
-					url: window.location.href
-				}
-				getSDK(param).then(res => {
-					wx.config({
-						appId: res.data.appId, // 必填,公众号的唯一标识
-						timestamp: res.data.timestamp, // 必填,生成签名的时间戳
-						nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
-						signature: res.data.signature, // 必填,签名
-						jsApiList: ["updateAppMessageShareData"] // 必填,需要使用的JS接口列表
-					});
-				})
-			},
-			shareimg(){
-				//分享好友
-				let self = this
-				// 配置--你到时候把配置全局 --就是这些东西  调接口拿
-				wx.ready(function() { //需在用户可能点击分享按钮前就先调用
-					wx.updateAppMessageShareData({
-						title: self.user.userName+"邀请您成为会员", // 分享标题
-						desc: self.user.deptName, // 分享描述
-						link:self.copyLinks, 
-						imgUrl: self.codeLink.url ||self.imgs, // 分享图标
-						success: function(res) {
-							self.showzhidao=true
-							self.setImg=false
-							self.showShare=false
-							// 设置成功
-							uni.showToast({
-								title: '卡片已生成',
-								icon: 'none',
-								duration: 1000
-							}); 
-						},
-						fail: function(err) {
-							console.log(err);
-							uni.showToast({
-								title: '卡片生成失败,请重试',
-								icon: 'none',
-								duration: 2000
-							})
-						}
-					})
-				});
-			},
-			downimg(){
-			},
-			closeimg(){
-				this.setImg=false
-				this.invitePop=false
-			},
-			buildimg() {
-				this.setImg=!this.setImg
-				this.getshareimg()
-			},
-			addtag(add){
-				this.sharetag=add
-				this.showTagSelect=!this.showTagSelect
-			},
-			changevipuser() {
-				this.showcol = !this.showcol
-				this.getgrouplist()
-			},
-			getgrouplist() {
-				//获取群管列表
-				getgroupList().then(res => {
-					if (res.code == 200) {
-						this.columns = [res.data]
-						// console.log(this.columns)
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			changeall() {
-				//更换全部会员
-				console.log(1)
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.userid,
-					userId: this.groupid
-				}
-				changevipUser(param).then(res => {
-					if (res.code == 200) {
-						uni.showToast({
-							icon: 'none',
-							title: '更换会员归属成功'
-						})
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			receiveA(e) {
-				console.log(e)
-				this.userid = e.value[0].userId
-				if (this.isShowSelectAll == true) {
-					this.groupid = this.selectidAll
-					this.changeall()
-					this.showcol = !this.showcol
-					setTimeout(() => {
-						this.getfsuserListdata()
-					}, 200)
-				} else {
-					this.changeall()
-					this.showcol = !this.showcol
-					this.getfsuserListdata()
-				}
-				this.isSelectAll = false
-			},
-			getvipListnum() {
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					queryValue: this.currentType,
-					regiesterStartTime: this.startTime,
-					regiesterEndTime: this.endTime,
-					searchValue: this.keyword,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					watchCourseType: this.watchStatusIndex,
-					tagIds: this.idx
-				}
-				getvipNum(param).then(res => {
-					if (res.code == 200) {
-						this.list[0].name = "会员" + '(' + res.data + ')'
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getactNav(data) {
-				console.log(data)
-				if (data.value == 3) {
-					this.itemname = data.name
-					this.isShowSelectAll = !this.isShowSelectAll
-				} else {
-					this.isShowSelectAll = false
-				}
-			},
-			getblacknum() {
-				//获取小黑屋数量
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getBlackvipNumber(params).then(res => {
-					if (res.code == 200) {
-						this.list[1].name = "小黑屋" + '(' + res.data + ')'
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			getbalckList(type = "refresh") {
-				//获取小黑屋用户列表
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-				}
-				getBlackvipList(params).then(res => {
-					if (res.code == 200) {
-						if (type == 'refresh') {
-							this.userList = res.data.list
-						} else {
-							this.userList = [...this.userList, ...res.data.list]
-						}
-						if (res.data.isLastPage) {
-							this.status = 'nomore'
-						} else {
-							this.status = 'loadmore'
-						}
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			closetagselect() {
-				this.showTagSelect = !this.showTagSelect
-			},
-			suretagchangeAll() {
-				if(this.sharetag==0){
-					this.sharetaglist = this.changetag.filter(item => item.checked).map(v => v.tagId).join(',')
-					this.showTagSelect = !this.showTagSelect
-					this.zhanshitag = this.changetag.filter(item => item.checked).map(v => v.tag).join(',')
-					console.log(this.sharetaglist)
-				}else{
-					//多选改标签确认按钮
-					this.showTagSelect = !this.showTagSelect
-					if (this.selectidAll.length == 0) {
-						uni.showToast({
-							icon: 'none',
-							title: '未选中用户'
-						})
-						return
-					}
-					this.selectidtag = this.changetag.filter(item => item.checked).map(v => v.tagId).join(',')
-					this.changeLabelmore()
-				}
-			},
-			singleChangeLable(data) {
-				this.showTagSelect = !this.showTagSelect
-				this.selectidAll[0] = data
-			},
-			changesinglevip(data) {
-				this.showcol = !this.showcol
-				console.log(data)
-				this.groupid[0] = data
-				this.getgrouplist()
-			},
-			changeLabelmore() {
-				//改标签选择按钮
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					creatTime: '',
-					createBy: '',
-					createTime: '',
-					id: '',
-					params: {},
-					remark: '',
-					searchValue: '',
-					updateBy: '',
-					tagIds: this.selectidtag,
-					updateTime: '',
-					userId: this.selectidAll
-				}
-				changeLable(params).then(res => {
-					if (res.code == 200) {
-						this.getfsuserListdata()
-						const timer = setTimeout(function() {
-							uni.showToast({
-								icon: 'none',
-								title: '标签更改成功'
-							})
-						}, 500);
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			changeOwnership() {
-				//更换归属(经销商功能)
-			},
-			getcompanyTag() {
-				getcompanyTaglist().then(res => {
-					if (res.code == 200) {
-						this.showCompanytag = res.data
-						this.companytag = res.data.map(item => {
-							return {
-								...item,
-								checked: false,
-							}
-						})
-						this.changetag = this.companytag
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-
-				})
-			},
-			getfsuserListdata(type = "refresh") {
-				const param = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					queryValue: this.currentType,
-					regiesterStartTime: this.startTime,
-					regiesterEndTime: this.endTime,
-					searchValue: this.keyword,
-					type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
-					watchCourseType: this.watchStatusIndex,
-					tagIds: this.idx,
-					...this.pageOptions
-				}
-
-				getfsuserList(param).then(res => {
-					if (res.code == 200) {
-						let dataList = res.data.list.map(item => {
-							return {
-								...item,
-								checked: false,
-							}
-						})
-						if (type == 'refresh') {
-							this.userList = dataList
-						} else {
-							this.userList = [...this.userList, ...dataList]
-						}
-						if (res.data.isLastPage) {
-							this.status = 'nomore'
-						} else {
-							this.status = 'loadmore'
-						}
-						this.list[0].name = "会员" + '(' + res.data.total + ')'
-						// this.getvipListnum()
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			onChange(index) {
-				if (index == 2) return
-				this.searchbarNav = index
-			},
-			searchKeyword(value) {
-				this.keyword = value
-				this.getfsuserListdata()
-			},
-			singleChange(data) {
-				this.selectidAll[0] = data
-				this.changeProhibit()
-			},
-			changeProhibit() {
-
-				//批量禁用选择按钮
-				const params = {
-					companyId: this.user.companyId,
-					companyUserId: this.user.userId,
-					creatTime: '',
-					createBy: '',
-					createTime: '',
-					id: '',
-					params: {},
-					remark: '',
-					searchValue: '',
-					updateBy: '',
-					updateTime: '',
-					userId: this.selectidAll
-				}
-				Addblacklist(params).then(res => {
-					if (res.code == 200) {
-						this.getfsuserListdata()
-						// 创建一个在**秒后执行的定时器
-						const timer = setTimeout(function() {
-							uni.showToast({
-								icon: 'none',
-								title: '禁用成功'
-							})
-						}, 500);
-						this.getblacknum()
-					} else {
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			// 全选
-			selectAll() {
-				// 先设置全选
-				this.isSelectAll = !this.isSelectAll
-				// 然后设置列表  checked没得this不会报错吗  这是返回新数组 
-				console.log(this.isSelectAll)
-				this.userList = this.userList.map(item => {
-					// 每一项的 checked为 全选的状态
-					return {
-						...item,
-						checked: this.isSelectAll
-					}
-				})
-				this.selectidAll = this.userList.filter(item => item.checked).map(item => item.userId)
-				console.log(this.isSelectAll)
-			},
-			// 单选 /反选 
-			changeItem(i) {
-
-				let arr = {
-					...this.userList[i],
-					checked: !this.userList[i].checked
-				}
-				this.$set(this.userList, i, arr)
-				this.selectidAll = this.userList.filter(item => item.checked).map(item => item.userId)
-				console.log(this.selectidAll)
-				this.isSelectAll = this.userList.every(item => item.checked)
-				if (this.isSelectAll) {
-					this.userList = this.userList.map(item => {
-						return {
-							...item,
-							checked: this.isSelectAll
-						}
-					})
-				}
-				this.selectidAll = this.userList.filter(item => item.checked).map(item => item.userId)
-			},
-			reset() {
-				//重置时间选择等筛选
-				const type = this.filterData[this.searchbarNav].type
-				console.log(this.registerTimeIndex)
-				if (type == 'registerTime') {
-					this.registerTimeIndex = ''
-					this.endTime = ''
-					this.startTime = ''
-					this.getfsuserListdata()
-					// console.log(this.getfsuserListdata())
-				} else if (type == 'watchStatus') {
-					this.watchStatusIndex = 0
-					this.getfsuserListdata()
-				} else {
-			
-				}
-			},
-			confirm(e) {
-				this.pageOptions.pageNum=1
-				const type = this.filterData[this.searchbarNav].type
-				const value = this.registerTimeIndex
-				if (type == 'registerTime') {
-					if (value == 0) {
-						this.startTime = ''
-						this.endTime = ''
-						this.getfsuserListdata()
-					} else if (value == 1) {
-						this.startTime = this.todayday + ' 00:00:00'
-						this.endTime = this.todayday + ' 23:59:59'
-						this.getfsuserListdata()
-					} else if (value == 2) {
-						let yesterday = new Date();
-						yesterday.setDate(yesterday.getDate() - 1);
-						this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
-						this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 23:59:59'
-						this.getfsuserListdata()
-					} else if (value == 3) {
-						let yesterday = new Date();
-						yesterday.setDate(yesterday.getDate() - 6);
-						this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
-						this.endTime = this.todayday + ' 23:59:59'
-						this.getfsuserListdata()
-					} else {
-						this.getfsuserListdata()
-					}
-				} else if (type == 'watchStatus') {
-					// this.watchStatusIndex=value
-					this.getfsuserListdata()
-					console.log(this.watchStatusIndex)
-				}
-				// this.mescroll.resetUpScroll()
-			},
-			
-			handleParamItem(type, index) {
-				if (type == 'registerTime') {
-					this.registerTimeIndex = index
-				} else if (type == 'watchStatus') {
-					this.watchStatusIndex = index
-					console.log(index)
-				} else {
-					this.ispopshow = false
-				}
-			},
-			sectionChange(index) {
-				this.current = index;
-				if (index == 0) {
-					this.getfsuserListdata()
-					// this.getvipListnum()
-				} else {
-					this.getbalckList()
-					this.getblacknum()
-				}
-			},
-			clickTypeTab(e) {
-				this.currentType = e.index
-				this.getfsuserListdata()
-			},
-			bindPickerChange(e) {
-				console.log('picker发送选择改变,携带值为', e.detail.value)
-				this.searchTypeIndex = e.detail.value
-			},
-			openPop(type) {
-				this.popTitle = type == 'search' ? '搜索选择' : type == 'tag' ? '标签筛选' : ''
-				this.typeIndex = this.queryParam.typeIndex
-				this.showPop = true
-				if (type == 'tag') {
-				}
-			},
-			closePop() {
-				this.showPop = false
-			},
-			resetPop(i) {
-				this.idx = []
-				this.companytag.forEach(tag => {
-					tag.checked = false; // 将所有标签的show属性重置为true
-				});
-				this.showPop = false
-				this.$nextTick(()=>{
-					this.getfsuserListdata()
-				})
-			},
-			closeCalendar() {
-				this.showCalendar = false
-			},
-			confirmCalendar(e) {
-				// this.startTime = e[0]
-				// this.endTime =  e[e.length-1]
-				this.showCalendar = false
-				this.queryParam.startTime = e.range.after
-				this.queryParam.endTime = e.range.before
-				this.endTime = e.range.before + ' 23:59:59'
-				this.startTime = e.range.after + ' 00:00:00'
-				console.log(e)
-				// this.getCount()
-			},
-			bindTypeChange(i) {
-				this.typeIndex = i
-			},
-			confirmPop() {
-				this.queryParam.typeIndex = this.typeIndex
-				this.showPop = false
-				this.showCompanytag = this.companytag.filter(item => item.checked)
-				this.idx = this.showCompanytag.map(v => v.tagId)
-				//filtter(过滤)  筛选所有checked==true的  然后map返回每一项的id
-				if (this.idx.length == 0) {
-					this.showCompanytag = this.companytag
-				}
-				this.$nextTick(()=>{
-					this.getfsuserListdata("refresh")
-				})
-			},
-			chooseTag(i) {
-				this.companytag[i].checked = !this.companytag[i].checked
-			},
-			choosechangeTag(i) {
-				this.changetag[i].checked = !this.changetag[i].checked
-			},
-			vipInvite() {
-				this.invitePop = true
-				this.sharetaglist=null
-				this.getlink('preload')
-				this.getjssdklist()
-			},
-			copyLink() {
-				this.setTimeShow = true
-			},
-			confirmTime() {
-				this.setTimeShow = false
-				this.showShare = false
-				this.getshareLink()
-			},
-			getshareimg(){
-				//生成海报
-				uni.showLoading({
-					title: '正在生成中...'
-				})
-				const param={
-					code:'',
-					companyId:this.user.companyId,
-					companyUserId:this.user.userId
-				}
-				becomeVipuserImg(param).then(res=>{
-					if(res.code==200){
-						this.codeLink=res.data
-						this.getlink()
-						console.log(res)
-					}else{
-						uni.showToast({
-							title: res.msg,
-							icon: 'none',
-							duration: 2000
-						});
-					}
-				})
-			},
-			getlink(type){
-				//生成链接
-				const param={
-					code:'',
-					companyId:this.user.companyId,
-					companyUserId:this.user.userId,
-					tagids:this.sharetaglist,
-					limitTime:this.time
-				}
-				becomeVipuser(param).then(res=>{
-					if(res.code==200){
-						this.copyLinks=res.data
-						if (this.copyLinks.startsWith('http://')) {
-							this.copyLinks = this.copyLinks.replace('http://', 'https://');
-						  }
-						console.log('28835',this.copyLinks)
-						console.log(this.copyLinks,'235')
-					}else{
-					}
-				})
-			},
-			getshareLink(){
-				//生成链接
-				const param={
-					code:'',
-					companyId:this.user.companyId,
-					companyUserId:this.user.userId,
-					tagids:this.sharetaglist,
-					limitTime:this.time
-				}
-				becomeVipuser(param).then(res=>{
-					if(res.code==200){
-						this.copyLinks=res.data
-						if (this.copyLinks.startsWith('http://')) {
-							this.copyLinks = this.copyLinks.replace('http://', 'https://');
-						  }
-						console.log(this.copyLinks)
-						setTimeout(()=>{
-							uni.setClipboardData({
-								data: String(this.copyLinks),
-								success: () => {
-								  uni.showToast({
-									title: '复制成功',
-									icon: 'none',
-									duration: 2000
-								  });
-								  setTimeout(()=>{
-									  this.invitePop=false
-								  },200)
-								  },
-							})
-						},100)
-					}else{
-						uni.showToast({
-							icon: 'none',
-							title: res.msg
-						})
-					}
-				})
-			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data = {
-					courseId: this.courseId,
-					status: '',
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title: "加载中..."
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.imgshe{
-		display: flex;
-		flex-direction: row-reverse
-	}
-	.point-box{
-		height: 100%;
-		width: 100%;
-		.xu-box{
-			border: #f5f5f5 4rpx dashed;
-			padding: 20rpx 20rpx;
-		}
-	}
-	.codeimg {
-		position: absolute;
-		z-index: 9999;
-		left: 40rpx;
-		top: 40rpx;
-	}
-	
-	#codeurl {
-		position: relative;
-	}
-	.checked-bg {
-		border: 1px solid #1677ff !important;
-		color: #1677ff !important;
-		background-color: #e7f1fe !important;
-	}
-
-	.changetagbtn {
-		width: 45%;
-		height: 80rpx;
-		border-radius: 50rpx;
-		text-align: center;
-		line-height: 80rpx;
-	}
-
-	::v-deep {
-		.foot-select {
-			width: 100%;
-			padding: 20rpx 20rpx;
-			z-index: 10000 !important;
-			position: fixed;
-			bottom: 0;
-			margin-left: -24rpx !important;
-		}
-	}
-
-	::v-deep {
-		.model .u-fade-enter-active {
-			z-index: 10075 !important;
-			
-		}
-	}
-
-	::v-deep {
-		.uni-calendar__mask {
-			z-index: 11000 !important;
-		}
-
-		.uni-calendar__content {
-			z-index: 12000 !important;
-		}
-	}
-
-	.container {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #222222;
-		height: 100%;
-		overflow: hidden;
-	}
-
-	.boxnav {
-		flex-wrap: wrap;
-		padding: 0 0 0 10px;
-
-		&-item {
-			width: 50%;
-			overflow: hidden;
-		}
-
-		&-item-info {
-			border: 1px solid #f5f5f5;
-			text-align: center;
-			color: #222;
-			background-color: #f5f5f5;
-			border-radius: 3px;
-			padding: 5px;
-			margin: 0 10px 10px 0;
-		}
-
-		&-active {
-			border: 1px solid #1677ff !important;
-			color: #1677ff !important;
-			background-color: #e7f1fe !important;
-		}
-	}
-
-	.calendar-day {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 12px;
-		color: #999;
-		flex: 1;
-		min-height: 30px;
-		background-color: #f5f5f5;
-		border-radius: 4px;
-		margin: 0 10px 10px 0;
-	}
-
-	.setTimebox {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		width: fit-content;
-		height: fit-content;
-	}
-
-	.timetip {
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #2979ff;
-		text-align: center;
-		margin-bottom: 5px;
-	}
-
-	.popbox {
-		background-color: #fff;
-		border-radius: 12px;
-		font-family: PingFang SC, PingFang SC;
-		font-weight: 400;
-		font-size: 14px;
-		color: #333;
-
-		&-head {
-			padding: 15px;
-			font-weight: bold;
-			font-size: 15px;
-			text-align: center;
-			position: relative;
-		}
-
-		.close-circle {
-			position: absolute;
-			right: 10px;
-			top: 50%;
-			transform: translateY(-50%);
-		}
-
-		&-body {
-			padding: 10px 10px;
-		}
-
-		.radiobox {
-			&-item {
-				padding: 10px 0;
-				border-bottom: 1px solid #f5f5f5;
-
-				&:last-child {
-					border-bottom: none;
-				}
-			}
-		}
-
-		&-footer {
-			padding: 15px 0;
-		}
-
-		&-footer-btn {
-			flex: 1;
-			height: 44px;
-			line-height: 44px;
-			margin: 0 10px;
-			border-radius: 50px;
-			border: none;
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 400;
-			font-size: 14px;
-			color: #333;
-
-			&::after {
-				border: none;
-			}
-		}
-
-		.con-btn {
-			background-color: #1677ff;
-			color: #fff;
-		}
-
-		.choosetitle {
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 400;
-			font-size: 15px;
-			color: #333;
-		}
-
-		.invitetip {
-			margin-top: 10px;
-			background-color: #ebf5fb;
-			color: #1677ff;
-			padding: 5px 10px;
-			border-radius: 5px;
-		}
-
-		.sharePop-item {
-			padding: 0 10px;
-			box-sizing: border-box;
-			font-family: PingFang SC, PingFang SC;
-			font-weight: 400;
-			font-size: 14px;
-			display: inline-flex !important;
-
-			image {
-				height: 48px;
-				width: 48px;
-				margin-bottom: 10px;
-			}
-		}
-	}
-
-	.headbox {
-		background-color: #fff;
-
-		.subsection {
-			height: 45px;
-			padding: 4px;
-		}
-
-		.participate-order {
-			font-size: 12px;
-
-			image {
-				width: 15px;
-				height: 15px;
-			}
-		}
-	}
-
-	.tag-active {
-		background-color: #ffeceb !important;
-		color: #f93e3e !important;
-		border: 1px solid #f93e3e !important;
-	}
-
-	.tagbox {
-		padding: 10px 0;
-		font-size: 12px;
-		color: #1677ff;
-
-		&-list {
-			margin: 0 0 -6px 6px;
-			flex-wrap: wrap;
-		}
-
-		&-item {
-			height: 26px;
-			padding: 0 8px;
-			margin: 0 6px 6px 0;
-			border-radius: 4px;
-			background-color: #f5f5f5;
-			color: #999;
-			border: 1px solid #f5f5f5;
-			box-sizing: border-box;
-			font-size: 12px;
-		}
-	}
-
-	.invite-member {
-		height: 55px;
-		width: 50px;
-		position: fixed;
-		bottom: 80px;
-		right: 10px;
-		cursor: pointer;
-	}
-
-	.userlist {
-		padding: 24rpx;
-	}
-</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1339 - 47
pages/customer/index.vue


+ 142 - 0
pages/enterprise/enterprise.vue

@@ -0,0 +1,142 @@
+<template>
+	<view class="column" style="height: 100%;position: relative;">
+		<view class="top-content ">
+			<view class="status_bar" :style="{height: statusBarHeight+'px'}"></view>
+			<!-- 这里是状态栏 -->
+			<view class="top-title">企业理念</view>
+		</view>
+		<view :style="{marginTop: `calc(${statusBarHeight}px + 88rpx)`}">
+			<view class="imgbox">
+				<image :src="enterpriseimg[0]" mode="widthFix"></image>
+				<view class="myVideobox">
+					<video id="myVideo" :src='enterpriseurl'
+					show-mute-btn='true' @fullscreenchange='changvideo'
+					vslide-gesture-in-fullscreen='true' :muted='muted' loop='true'
+					@error="videoErrorCallback"  enable-danmu  controls  autoplay="true"
+					class="videotop"></video>
+					<!-- <video class="myVideo" id="myVideo" :src="enterpriseurl"
+					                  @error="videoErrorCallback"   controls></video> -->
+				</view>
+			</view>
+			<view class="imgbox column">
+				<image :src="enterpriseimg[1]" mode="widthFix"></image>
+				<image :src="enterpriseimg[2]" mode="widthFix"></image>
+				<image :src="enterpriseimg[3]" mode="widthFix"></image>
+			</view>
+		</view>
+		<tabbar :actindex="0"></tabbar>
+	</view>
+</template>
+
+<script>
+	// import{getenterprise} from '@/api/index.js'
+	import tabbar from '@/components/tabbar/tabbar.vue'
+	export default {
+		components: {
+			tabbar
+		},
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				enterpriseurl:'https://hylj-1323137866.cos.ap-chongqing.myqcloud.com/userVideo/2025328/1743138661878.mp4',
+				enterpriseimg:[
+					'https://cos.his.cdwjyyh.com/fs/20250328/35a52839074940cb9ba7c1208140e3c7.png',
+					'https://cos.his.cdwjyyh.com/fs/20250328/39f2e5fc37da4240850313e69caa120c.png',
+					'https://cos.his.cdwjyyh.com/fs/20250328/628f59a6f3864541a0599886fae8e54e.png',
+					'https://cos.his.cdwjyyh.com/fs/20250328/f13448a48d3c491ab40b44e749983fed.png'
+				],
+				muted:true,
+			}
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: "御君方互联网医院",
+				path: '/pages/index/index',
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: "御君方互联网医院",
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		mounted() {
+			const imgs = []
+			// this.enterpriseimg= imgs.split(',')
+			// this.enterpriseurl='https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250115/1736925706514.mp4'
+			// this.getenterprise()
+		},
+		methods: {
+			changvideo(e){
+				if(e.target.fullScreen==true){
+					this.muted=false
+				}else{
+					this.muted=true
+				}
+				e.target.fullScreen
+			},
+			getenterprise(){
+				getenterprise().then(res=>{
+					this.enterpriseurl=res.data.videoUrl
+					this.enterpriseimg=res.data.images
+					const url=this.enterpriseimg.split(',')
+					this.enterpriseimg=url
+					uni.setStorageSync('enterpriseurl',this.enterpriseurl)
+					console.log(res)
+				})
+			},
+			videoErrorCallback: function(e) {
+				
+			},
+			// navToTest() {
+			// 	 const course = {"companyId":100,"companyUserId":6806,"corpId":"ww5a88c4f879f204c5","courseId":63,"link":"1899022782092541952","linkType":3,"qwExternalId":9914983,"qwUserId":"18931","videoId":409}
+			// 	 uni.navigateTo({
+			// 		url: '/pages_course/video?course='+JSON.stringify(course)
+			// 	 })
+			// }
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.top-content {
+	width: 100%;
+	z-index: 10;
+	position: fixed;
+	top: 0;
+	left: 0;
+	background-color: #FFFFFF;
+	.top-title {
+		height: 88rpx;
+		line-height: 88rpx;
+		font-size: 42rpx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41rpx;
+		background-color: #FFFFFF;
+	}
+}
+.imgbox{
+	position: relative;
+	image{
+		width: 100%;
+		display: block;
+	}
+}
+.videotop{
+	width: calc(100% - 60rpx);
+	height: 421rpx;
+	border-radius: 20rpx;
+	position: absolute;
+	bottom: 30rpx;
+	left: 50%;
+	z-index: 9;
+	transform: translateX(-50%);
+}
+</style>

+ 744 - 6
pages/index/index.vue

@@ -1,22 +1,760 @@
+<!-- 数据组件页面 -->
 <template>
-	<view>
-		
+	<view class="column flex-1 hb">
+		<view class="topdata">
+			<!-- #ifdef MP-WEIXIN -->
+			<view class="h110"></view>
+			<!-- #endif -->
+			<view class="topdata-box" @click="operation">
+				<view class="justify-between">
+					<view>数据汇总</view>
+					<view class="justify-between center">
+						<text class="fs24 " style="color: #666;">查看详细数据</text>
+						<u-icon name="arrow-right-double" color="#666666" size="14"></u-icon>
+					</view>
+				</view>
+				<view class="x-bc">
+					<view class="topdata-item">
+						<view class="topdata-item-num"><text>{{companyUserUserCount}}</text>人</view>
+						<view>会员总数</view>
+					</view>
+					<view class="topdata-item">
+						<view class="topdata-item-num"><text>{{companyUserCount}}</text>人</view>
+						<view>今日新增会员</view>
+					</view>
+				</view>
+			</view>
+			<view>
+				<u-collapse ref="pydameinvRef" :value="['show']" :border='false' @change='changelable'>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="show" title="标签统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="show">
+							<view slot="title">
+								<text class="bold fs32">标签统计</text>
+								<text class="fs24 base-color-9 ml12">左滑查看更多</text>
+							</view>
+							<!-- #endif -->
+							<text slot="value" class="statistics-slot-title">{{collapseLable?'展开':'收回'}}</text>
+							<view slot="right-icon">
+								<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+							</view>
+							<view class="">
+								<!-- #ifdef MP-WEIXIN -->
+								<view class="fs24 mb12">左滑查看更多</view>
+								<!-- #endif -->
+								<view class=" mb20 morelable">
+									<view class="base-bg-f5 p20  radius20 boxlable mr40"
+										v-for="(item,index) in lablelistnum" :key="index"
+										style="display: inline-block;">
+										<view class="base-color-3 ">{{item.tagName}}</view>
+										<view class="base-color mt8">
+											<text class="fs40 bold">{{item.number}}</text>
+											人
+										</view>
+									</view>
+								</view>
+							</view>
+						</u-collapse-item>
+				</u-collapse>
+			</view>
+			<view class="searchbox">
+				<view class="searchbox-bar x-ac">
+					<view :class="queryParam.type == index ? 'searchbox-item searchbox-active':'searchbox-item'"
+						v-for="(item,index) in typeOption" :key="index" @click="handleType(index)">{{item.label}}</view>
+				</view>
+				<view class="x-ac ss" v-show="queryParam.type == 3">
+					<view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
+							size="20"></u-icon>{{startTime}}</view>
+					<view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
+							size="20"></u-icon>{{endTime}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="">
+			<u-calendar :show="showCalendar" :mode="mode" @confirm="confirmCalendar" style="flex: 0; overflow: hidden;"
+				@close="closeCalendar"></u-calendar>
+		</view>
+		<view class="statistics pb120" :style="{height: contentH}">
+			<u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
+				<!-- #ifdef MP-WEIXIN -->
+				<u-collapse-item name="course" title="课程统计">
+				<!-- #endif -->
+				<!-- #ifndef MP-WEIXIN -->
+				<u-collapse-item name="course">
+						<text slot="title" class="statistics-title">课程统计</text>
+						<!-- #endif -->
+						<text slot="value"
+							class="statistics-slot-title">{{collapseValue.includes('course')?'收回':'展开'}}</text>
+						<view slot="right-icon">
+							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+						</view>
+						<view class="collapse-content x-ac">
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">观看人数</view>
+								<view class="collapse-content-num"><text>{{courseCount.courseWatchNum || 0}}</text>人
+								</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">
+									较昨天持平{{compare(courseCount.courseWatchNum,yesterdayVO.courseWatchNum)}}</view>
+								<view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseWatchNum || 0}}</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">完播人数</view>
+								<view class="collapse-content-num"><text>{{courseCount.courseCompleteNum || 0}}</text>人
+								</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">
+									较昨天持平{{compare(courseCount.courseCompleteNum,yesterdayVO.courseCompleteNum)}}
+								</view>
+								<view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseCompleteNum || 0}}
+								</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">完播率</view>
+								<view class="collapse-content-num"><text>{{courseCount.courseCompleteRate || 0}}</text>%
+								</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">
+									较昨天持平{{compare(courseCount.courseCompleteRate,yesterdayVO.courseCompleteRate)}}
+								</view>
+								<view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseCompleteRate || 0}}</view>
+							</view>
+						</view>
+					</u-collapse-item>
+					<!-- #ifdef MP-WEIXIN -->
+					<u-collapse-item name="questions" title="答题统计">
+					<!-- #endif -->
+						<!-- #ifndef MP-WEIXIN -->
+						<u-collapse-item name="questions">
+							<text slot="title" class="statistics-title">答题统计</text>
+							<!-- #endif -->
+							<text slot="value"
+								class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
+							<view slot="right-icon">
+								<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+							</view>
+							<view class="collapse-content x-ac">
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">答题人数</view>
+									<view class="collapse-content-num"><text>{{courseCount.answerNum || 0}}</text>人
+									</view>
+									<view style="color: #1677ff;" v-show="queryParam.type == 0">
+										较昨天持平{{compare(courseCount.answerNum,yesterdayVO.answerNum)}}</view>
+									<view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerNum || 0}}</view>
+								</view>
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">正确人数</view>
+									<view class="collapse-content-num"><text>{{courseCount.answerRightNum || 0}}</text>人
+									</view>
+									<view style="color: #1677ff;" v-show="queryParam.type == 0">
+										较昨天持平{{compare(courseCount.answerRightNum,yesterdayVO.answerRightNum)}}</view>
+									<view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerRightNum || 0}}</view>
+								</view>
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">正确率</view>
+									<view class="collapse-content-num">
+										<text>{{courseCount.answerRightRate || 0}}</text>%
+									</view>
+									<view style="color: #1677ff;" v-show="queryParam.type == 0">
+										较昨天持平{{compare(courseCount.answerRightRate,yesterdayVO.answerRightRate)}}</view>
+									<view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerRightRate || 0}}</view>
+								</view>
+							</view>
+						</u-collapse-item>
+						<!-- #ifdef MP-WEIXIN -->
+						<u-collapse-item name="redenvelope" title="红包统计">
+						<!-- #endif -->
+							<!-- #ifndef MP-WEIXIN -->
+							<u-collapse-item name="redenvelope">
+								<text slot="title" class="statistics-title">红包统计</text>
+								<!-- #endif -->
+								<text slot="value"
+									class="statistics-slot-title">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
+								<view slot="right-icon">
+									<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+								</view>
+								<view>
+									<view class="collapse-content x-ac">
+										<view class="collapse-content-item">
+											<view class="collapse-content-title">答题红包数</view>
+											<view class="collapse-content-num">
+												<text>{{courseCount.redPacketNum || 0}}</text>个
+											</view>
+											<view style="color: #1677ff;" v-show="queryParam.type == 0">
+												较昨天持平{{compare(courseCount.redPacketNum,yesterdayVO.redPacketNum)}}
+											</view>
+											<view v-show="queryParam.type == 0">昨天{{yesterdayVO.redPacketNum || 0}}
+											</view>
+										</view>
+										<view class="collapse-content-item">
+											<view class="collapse-content-title">答题红包金额</view>
+											<view class="collapse-content-num">
+												<text>{{courseCount.redPacketAmount || '0.00'}}</text>元
+											</view>
+											<view style="color: #1677ff;" v-show="queryParam.type == 0">
+												较昨天持平{{compare(courseCount.redPacketAmount,yesterdayVO.redPacketAmount,1)}}
+											</view>
+											<view v-show="queryParam.type == 0">
+												昨天{{yesterdayVO.redPacketAmount || '0.00'}}
+											</view>
+										</view>
+									</view>
+									<!-- <view class="collapse-content x-ac" style="padding: 8px 0;">
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">新会员奖励数</view>
+								<view class="collapse-content-num"><text>{{redPacketCount.newCount || 0}}</text>个</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">
+									较昨天持平{{compare(redPacketCount.newCount,redPacketCount.yesterdayNewCount)}}</view>
+								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayNewCount || 0}}</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">新会员奖励金额</view>
+								<view class="collapse-content-num">
+									<text>{{redPacketCount.totalAmount || '0.00'}}</text>元
+								</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">
+									较昨天持平{{compare(redPacketCount.totalAmount,redPacketCount.yesterdayTotalAmount,1)}}
+								</view>
+								<view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayTotalAmount || '0.00'}}
+								</view>
+							</view>
+						</view> -->
+								</view>
+							</u-collapse-item>
+							<!-- #ifdef MP-WEIXIN -->
+							<u-collapse-item name="funnel" title="转化漏斗图" v-if="!ratelistState">
+							<!-- #endif -->
+								<!-- #ifndef MP-WEIXIN -->
+								<u-collapse-item name="funnel" v-if="!ratelistState">
+									<text slot="title" class="statistics-title">转化漏斗图</text>
+									<!-- #endif -->
+									<text slot="value"
+										class="statistics-slot-title">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
+									<view slot="right-icon">
+										<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+									</view>
+									<view v-show="!ratelistState">
+										<funnelChart :getratelist="getrateimg" />
+									</view>
+									<view v-show="ratelistState" class="center">暂无数据</view>
+								</u-collapse-item>
+								<!-- #ifdef MP-WEIXIN -->
+								<u-collapse-item name="rank" title="排行榜">
+								<!-- #endif -->
+									<!-- #ifndef MP-WEIXIN -->
+									<u-collapse-item name="rank">
+										<text slot="title" class="statistics-title">排行榜</text>
+										<!-- #endif -->
+										<text slot="value"
+											class="statistics-slot-title">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
+										<view slot="right-icon">
+											<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+										</view>
+										<view class="flex-1">
+											<view class="mt40">
+												<view class="justify-between align-center">
+													<view class="base-color-3 bold fs32">群管排行榜</view>
+													<view class="justify-start" @click="ordergroup(1)"
+														v-if="orderGroup=='asc'">
+														<u-icon name="list-dot" size="20"></u-icon>
+														<view>按正序(前20名)</view>
+													</view>
+													<view class="justify-start" @click="ordergroup(0)" v-else>
+														<u-icon name="list-dot" size="20"></u-icon>
+														<view>按倒序(后20名)</view>
+													</view>
+												</view>
+												<view class="centerV">
+													<u-tabs :list="list1" @click="clickTab" lineColor='#1773ff'
+														lineWidth='40' activeStyle="font-weight:bold"></u-tabs>
+												</view>
+												<view class="justify-start align-center mtb28"
+													v-for="(item,index) in rankListA" :key="index">
+													<u-avatar :src="item.avatar" size="40"></u-avatar>
+													<view class="flex-1 ml20">
+														<view class="justify-between mb16">
+															<view class="base-color-3 single-line-ellipsis">
+																{{item.userName}}
+															</view>
+															<view v-if="index==0">{{item.completeRate}}%</view>
+															<view v-else>{{item.answerRightRate}}%</view>
+														</view>
+														<u-line-progress :percentage="item.completeRate"
+															activeColor='#1773ff' v-if="index==0" />
+														<u-line-progress :percentage="item.answerRightRate"
+															activeColor='#1773ff' v-else />
+													</view>
+												</view>
+												<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
+											</view>
+											<view class="mt60 column flex-1">
+												<view class="justify-between align-center">
+													<view class="base-color-3 bold fs32">课程排行榜</view>
+													<view class="justify-start" @click="ordergroupB(1)"
+														v-if="orderGroupB=='asc'">
+														<u-icon name="list-dot" size="20"></u-icon>
+														<view>按正序(前20名)</view>
+													</view>
+													<view class="justify-start" @click="ordergroupB(0)" v-else>
+														<u-icon name="list-dot" size="20"></u-icon>
+														<view>按倒序(后20名)</view>
+													</view>
+												</view>
+												<view class="centerV">
+													<u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff'
+														lineWidth='40' activeStyle="font-weight:bold"></u-tabs>
+												</view>
+												<view class="justify-start align-center"
+													v-for="(item,index) in rankListB" :key="index">
+													<view class="flex-1 ml20">
+														<view class="justify-between mb16">
+															<view class="base-color-3 single-line-ellipsis">
+																{{item.videoName}}
+															</view>
+															<view v-if="index==0">{{item.completeRate}}%</view>
+															<view v-else>{{item.answerRightRate}}%</view>
+														</view>
+														<u-line-progress :percentage="item.completeRate"
+															activeColor='#1773ff' v-if="index==0" />
+														<u-line-progress :percentage="item.answerRightRate"
+															activeColor='#1773ff' v-else />
+													</view>
+												</view>
+												<view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
+											</view>
+										</view>
+									</u-collapse-item>
+			</u-collapse>
+		</view>
 	</view>
 </template>
 
 <script>
+	import code from "@/uni_modules/uview-ui/libs/config/props/code"
+	import funnelChart from "@/components/chart.vue"
+	import {
+		getCompanyUserAndUserCount,
+		getCourseCount,
+		getcourseRate,
+		getGroupRanklist,
+		getCourseRanklist
+	} from "@/api/courseManage.js"
 	export default {
+		components: {
+			funnelChart,
+		},
 		data() {
 			return {
-				
+				list1: [{
+					name: '按完播率',
+				}, {
+					name: '按正确率'
+				}],
+				orderGroup: 'asc',
+				orderGroupB: 'asc',
+				showCalendar: false,
+				mode: 'range',
+				typeOption: [{
+					label: '今日',
+					value: 0
+				}, {
+					label: '昨日',
+					value: 1
+				}, {
+					label: '本月',
+					value: 2
+				}, {
+					label: '自定义',
+					value: 3
+				}],
+				queryParam: {
+					type: 0
+				},
+				contentH: 0,
+				contentHs: 0,
+				collapseValue: ['course', 'questions', 'redenvelope', 'funnel', 'rank'],
+				user: {},
+				todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
+				startTime: '',
+				endTime: '',
+				companyUserCount: 0,
+				companyUserUserCount: 0,
+				courseCount: {
+					courseWatchNum: 0
+				},
+				collapseLable: false,
+				lablelistnum: [],
+				getrateimg: {},
+				rankListA: [],
+				rankListB: [],
+				activeA: 0,
+				activeB: 0,
+				yesterdayVO: [],
+				ratelistState: false
+			}
+		},
+		computed: {
+			compare() {
+				return (today, yesterday, type) => {
+					const num = Number(yesterday || 0) - Number(today || 0)
+					return type == 1 ? num.toFixed(2) : 0
+				}
 			}
 		},
+		onShow() {
+			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
+			// this.resetDate()
+			this.getrateList()
+			this.getrankCourse()
+			this.getrankgroup()
+			this.getUserCount()
+		},
+		mounted() {
+			this.getHeight()
+		},
 		methods: {
-			
+			operation() {
+				console.log(123)
+				uni.navigateTo({
+					url: '/pages/courseManage/operation/index'
+				})
+			},
+			clickTab(item) {
+				this.activeA = item.index + 1
+				this.getrankgroup()
+				console.log(this.activeA)
+			},
+			clickTabB(item) {
+				this.activeB = item.index + 1
+				this.getrankCourse()
+				console.log(this.activeA)
+			},
+			ordergroup(item) {
+				if (item == 0) {
+					this.orderGroup = 'asc'
+					this.getrankgroup()
+				} else {
+					this.orderGroup = 'desc'
+					this.getrankgroup()
+				}
+			},
+			ordergroupB(item) {
+				if (item == 0) {
+					this.orderGroupB = 'asc'
+					this.getrankCourse()
+				} else {
+					this.orderGroupB = 'desc'
+					this.getrankCourse()
+				}
+			},
+			getrankCourse() {
+				//获取课程排行
+				this.startTime = this.todayday
+				this.endTime = this.todayday
+				// this.resetDate()
+				const params = {
+					endTime: this.endTime + ' 23:59:59',
+					startTime: this.startTime + ' 00:00:00',
+					order: this.orderGroupB,
+					type: this.activeB, // 1-按完播率,2-按正确率
+				}
+				getCourseRanklist(params).then(res => {
+					if (res.code == 200) {
+						this.rankListB = res.data
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			getrankgroup() {
+				//获取群管排行
+				this.startTime = this.todayday
+				this.endTime = this.todayday
+				// this.resetDate()
+				const params = {
+					endTime: this.endTime + ' 23:59:59',
+					startTime: this.startTime + ' 00:00:00',
+					order: this.orderGroup,
+					type: this.activeA, // 1-按完播率,2-按正确率
+				}
+				getGroupRanklist(params).then(res => {
+					if (res.code == 200) {
+						console.log(res)
+						this.rankListA = res.data
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			getrateList() {
+				//获取漏斗图
+				this.startTime = this.todayday
+				this.endTime = this.todayday
+				this.resetDate()
+				const params = {
+					endTime: this.endTime + ' 23:59:59',
+					startTime: this.startTime + ' 00:00:00',
+				}
+				getcourseRate(params).then(res => {
+					if (res.code == 200) {
+						this.ratelistState = res.data.every(item => item.value === 0);
+						this.getrateimg = res
+						// console.log('漏斗',allZero)
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg
+						})
+					}
+				})
+			},
+			changelable(e) {
+				if (e[0].status == 'open') {
+					console.log(e)
+					this.collapseLable = false
+				} else {
+					this.collapseLable = true
+				}
+			},
+			getHeight() {
+				const windowHeight = uni.getSystemInfoSync().windowHeight
+				const query = uni.createSelectorQuery().in(this);
+				query
+					.select(".topdata")
+					.boundingClientRect((data) => {
+						this.contentH = `calc(${windowHeight}px - ${data.height}px - 0px)`
+					})
+					.exec()
+			},
+			resetDate() {
+				if (this.queryParam.type == 0) {
+					this.startTime = this.todayday
+					this.endTime = this.todayday
+				} else if (this.queryParam.type == 1) {
+					let yesterday = new Date();
+					yesterday.setDate(yesterday.getDate() - 1);
+
+					this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+					this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+				} else if (this.queryParam.type == 2) {
+					let today = new Date();
+					let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
+
+					this.startTime = uni.$u.timeFormat(this.todayday, 'yyyy-mm') + '-01'
+					this.endTime = uni.$u.timeFormat(lastDayOfMonth, 'yyyy-mm-dd')
+				} else if (this.queryParam.type == 3) {
+					this.startTime = this.todayday
+					this.endTime = this.todayday
+				}
+				this.getCount()
+			},
+			handleType(type) {
+				if (this.queryParam.type == type) {
+					return
+				}
+				this.queryParam.type = type
+				if (this.queryParam.type == 3) {
+					this.getHeight()
+				}
+				this.resetDate()
+				this.getrateList()
+				this.getrankCourse()
+				this.getrankgroup()
+			},
+			changeCollapse(e) {
+				this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
+			},
+			closeCalendar() {
+				this.showCalendar = false
+			},
+			confirmCalendar(e) {
+				this.startTime = e[0]
+				this.endTime = e[e.length - 1]
+				this.showCalendar = false
+				this.getCount()
+			},
+			getUserCount() {
+				getCompanyUserAndUserCount().then(res => {
+					if (res.code == 200) {
+						this.companyUserCount = res.data.todayNewUser || 0
+						this.companyUserUserCount = res.data.userTotal || 0
+						this.lablelistnum = res.data.tagList
+						this.$nextTick(() => {
+							this.$refs.pydameinvRef.init()
+						})
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			},
+			getCount() {
+				const param = {
+					endTime: this.endTime + ' 23:59:59',
+					startTime: this.startTime + ' 00:00:00',
+				}
+				this.getCourseCount(param)
+			},
+			getCourseCount(param) {
+				getCourseCount(param).then(res => {
+					if (res.code == 200) {
+						console.log(res)
+						this.courseCount = res.data
+						this.yesterdayVO = res.data.yesterdayVO
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			},
 		}
 	}
 </script>
 
-<style>
+<style scoped lang="scss">
+	.boxlable {
+		width: 47%;
+	}
+
+	.morelable {
+		width: 100%;
+		overflow-x: auto;
+		/* 添加横向滚动条 */
+		white-space: nowrap;
+	}
+
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+	}
+
+	.calendar-day {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 12px;
+		color: #999;
+		flex: 1;
+		margin: 10px 10px 0 10px;
+		background-color: #f5f5f5;
+		border-radius: 4px;
+	}
+
+	.topdata {
+		padding-top: 25px;
+		background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
+
+		&-box {
+			padding: 12px;
+			margin: 0 12px 0 12px;
+			background-color: rgba(255, 255, 255, 0.5);
+			border-radius: 8px 8px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #222222;
+		}
+
+		&-item {
+			width: 50%;
+			text-align: center;
+			padding: 8px;
+			box-sizing: border-box;
+
+			&-num {
+				color: #1677ff;
+
+				text {
+					font-family: DIN, DIN;
+					font-weight: bold;
+					font-size: 25px;
+				}
+			}
+		}
 
-</style>
+		.searchbox {
+			background-color: #fff;
+			border-radius: 8rpx 8rpx 0 0;
+			padding: 15px;
+
+			&-item {
+				height: 23px;
+				line-height: 23px;
+				width: 65px;
+				background: #f5f5f5;
+				text-align: center;
+				border-radius: 5px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 12px;
+				color: #888;
+			}
+
+			&-active {
+				color: #fff !important;
+				background-color: #1677ff !important;
+			}
+		}
+	}
+
+	.statistics {
+		background-color: #fff;
+		overflow-y: auto;
+		box-sizing: border-box;
+
+		&-title {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: bold;
+			font-size: 16px;
+			color: #222222;
+		}
+
+		&-slot-title {
+			font-size: 12px;
+			color: #1677ff;
+		}
+
+		.collapse-content {
+			margin: 0 -8px -8rpx 0;
+
+			&-item {
+				flex: 1;
+				padding: 12px;
+				box-sizing: border-box;
+				border-radius: 10px;
+				background: #f5f5f5;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 10px;
+				color: #222222;
+				margin: 0 8px 8rpx 0;
+			}
+
+			&-title {
+				font-size: 14px;
+				margin-bottom: 10px;
+			}
+
+			&-num {
+				color: #1677ff;
+				font-size: 10px;
+
+				text {
+					font-family: DIN, DIN;
+					font-weight: bold;
+					font-size: 25px;
+				}
+			}
+		}
+	}
+</style>

+ 41 - 0
pages/urgeCourse/urgeCourse.vue

@@ -0,0 +1,41 @@
+<template>
+	<view class="column hidden" style="height: 100%;">
+		<view class="p20 bgf" style="z-index: 999;">
+			<u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff"
+				:fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
+		</view>
+		<qiweiUrgeCourse v-if="current==0"></qiweiUrgeCourse>
+		<userUrgeCourse v-else></userUrgeCourse>
+	</view>
+</template>
+
+<script>
+	import qiweiUrgeCourse from "@/components/qiweiUrgeCourse.vue"
+	import userUrgeCourse from "@/components/userUrgeCourse.vue"
+	export default {
+		components: {
+			qiweiUrgeCourse,
+			userUrgeCourse
+		},
+		data() {
+			return {
+				list: [{
+					name: '企微',
+				}, {
+					name: '注册会员'
+				}],
+				current:0
+			}
+		},
+		onShow() {
+		},
+		methods: {
+			sectionChange(index){
+				this.current=index
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 0 - 43
pages/user/ai/index.vue

@@ -1,43 +0,0 @@
-<template>
-	<view class="content">
-		<web-view  v-if="webUrl!=null" :src="webUrl"></web-view>
-	</view>
-</template>
-<script>
-import {getConfigByKey} from '@/api/common'
-export default {
-	components: {
	},
- 	data() {
- 		return {
-			webUrl:null,
- 		}
- 	},
-	onLoad(options) {
-		var companyUserId=uni.getStorageSync('companyUserId');
-		var that=this;
-		setTimeout(function(){
-			that.webUrl="https://ai.cdwjyyh.com/#/pages/ai/conversation?userType=3&userId="+companyUserId+"&companyUserId="+companyUserId
-			console.log(that.webUrl);
-		},500)
-		
-	},
-	methods:{
-		 
-	}
- 	 
- }
- 
- 
-</script>
-
-
-<style scoped lang="scss">
-page{
-	height: 100%;
-}
-.content{
-	height: 100%;
-	padding: 30rpx;
-}
- 
-</style>

+ 0 - 168
pages/user/courseSop/sop.vue

@@ -1,168 +0,0 @@
-<template>
-	<view class="content">
-		<mescroll-body top="0rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="sop-list">
-			<view class="sop-item"  v-for="(item) in dataList" @click.stop="navTo('/pages/user/courseSop/sopLosList?sopId='+item.id)"   >
-				<view class="name-box">
-					<view class="name">{{item.name}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">创建时间:</view>
-					<view class="value">{{item.createTime}}</view>
-				</view>
-			</view>
-		</view>
-		</mescroll-body>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	
-	import {getCourseSopList} from '@/api/course.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onShow() {
-		},
-		methods: {
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getCourseSopList(data).then(res => {
-					uni.hideLoading()
-					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();
-					}
-				});
-			},
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		.tabs{
-			z-index: 10000;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			height: 88rpx;
-			background-color: #fff;
-			width: 100%;
-		}
-		.sop-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.sop-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 32rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 40rpx;
-							height:40rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-	}
-</style>

+ 0 - 89
pages/user/courseSop/sopLogsDetails.vue

@@ -1,89 +0,0 @@
-<template>
-	<view class="content">
-		<view class="info-detail" v-if="item!=null">
-			<view class="item">
-				<text class="label">接收者:</text>
-				<text class="text">{{item.externalUserName}}</text>
-			</view>
-			<view class="item">
-				<text class="label">发送时间:</text>
-				<text class="text">{{item.sendTime}}</text>
-			</view>
-			<view class="item">
-				<text class="label">实际发送时间:</text>
-				<text class="text">{{item.realSendTime}}</text>
-			</view>
-			<view class="item" v-for="(cont,index ) in contents">
-				<text class="label">发送内容({{index+1}}):</text>
-				<text class="text" v-html="cont.value"> </text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {getCourseSopLogsDetail} from '@/api/course.js'
-	export default {
-		data() {
-			return {
-				id:null,
-				item:null,
-				contents:[],
-			}
-		},
-		onLoad(option) {
-			// this.id = option.id;
-			this.item=JSON.parse(uni.getStorageSync("sop"));
-			console.log(this.item)
-			this.contents=JSON.parse(this.item.contentJson);
-		},
-		onShow() {
-			 
-		},
-		methods: {
-			getUserInfoByUserId(userId){
-				var data = {userId:userId};
-				var that=this;
-				getUserInfoByUserId(data).then(
-					res => {
-						that.bindUser(res);
-						
-					},
-					rej => {}
-				);
-			},
-			 
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		// 详细信息
-		.info-detail{
-			padding: 0 24upx;
-			background-color: #fff;
-			.item{
-				padding: 20upx 0;
-				border-bottom: 1px solid #f7f7f7;
-				.label{
-					font-size: 30upx;
-					color: #999;
-					margin-right: 20upx;
-				}
-				.text{
-					font-size: 30upx;
-					color: #333;
-				}
-				 
-			}
-		}
-	}
-</style>

+ 0 - 302
pages/user/courseSop/sopLosList.vue

@@ -1,302 +0,0 @@
-<template>
-	<view class="content">
-		<view class="top-box">
-			<view class="tabs">
-			 	<u-tabs
-			 	 :scrollable="false"
-			 	 :list="tabs"  
-			 	  lineColor="#115296"
-			 	@change="tagChange">
-			 	</u-tabs>
-			</view>
-			
-		</view>
-		
-		<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="sop-list">
-			<view class="sop-item"  v-for="(item) in dataList" @click.stop="openDetails(item)"   >
-				<view class="name-box">
-					<view class="name">{{item.externalUserName}}</view>
-					
-				</view>
-				<view class="desc-box">
-					<view class="label">发送时间:</view>
-					<view class="value">{{item.sendTime}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">所属销售:</view>
-					<view class="value">{{item.userName}}</view>
-				</view>
-			</view>
-		</view>
-		</mescroll-body>
-		<view class="footer-btns">
-			<u-button :disabled="!sendFlag" type="success" wid @click="sendMsg()" text="启动群发"></u-button>
-		</view>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	import { getCourseSopLogsList} from '@/api/course.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				sendFlag:true,
-				hasNextPage:false,
-				totalCount:0,
-				sopId:null,
-				status:3,
-				tabs:[
-					{
-						id:3,
-						name:'待发送'
-					},
-					{
-						id:1,
-						name:'发送成功'
-					},
-					{
-						id:0,
-						name:'发送失败'
-					}
-				],
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onLoad(option) {
-			this.sopId=option.sopId;
-			var that=this;
-			uni.$on('sendSop', (item) => {
-				console.log(JSON.parse(item.data))
-				var data=JSON.parse(item.data);
-				var param={
-					sendStatus:1,
-					id: data.id,
-					receivingStatus: data.receivingStatus,
-					remark:item.remark
-				};
-				updateCourseSopLogs(param).then(res => {
-					
-				});
-				that.sendMsgOp();
-			})
-		},
-		onShow() {
-		},
-		methods: {
-			sendMsgOp(){
-				if(this.sendFlag){
-					return;
-				}
-				//循环发送 先获取一条,更新一条这样发送
-				this.mescroll.resetUpScroll()
-				var userId=uni.getStorageSync('companyUserId') ;
-				var that=this;
-				setTimeout(function(){
-					if(that.dataList.length>0){
-						var data={cmd:"sendSop", data:that.dataList[0],userId:"p-"+userId};
-						uni.$emit('sendMsg',data);  
-					}
-					else{
-						that.sendFlag=true;
-						uni.showToast({
-							icon:'none',
-							title: "已完成",
-						});
-					}
-				},5000);
-				
-			},
-			sendMsg(){
-				if(!this.sendFlag){
-					uni.showToast({
-						icon:'none',
-						title: "运行中...",
-					});
-					return;
-				}
-				var that=this;
-				uni.showModal({
-					title:"提示",
-					content:"确认启动自动发送吗?",
-					showCancel:true,
-					cancelText:'取消',
-					confirmText:'确定',
-					success:res=>{
-						if(res.confirm){
-							this.sendFlag=false;
-							that.sendMsgOp()
-							 
-						}else{
-							// 否则点击了取消  
-						}
-					}
-				})
-				
-			},
-			openDetails(item){
-				uni.setStorageSync("sop",JSON.stringify(item))
-				uni.navigateTo({
-					url:"sopLogsDetails"
-				})
-			},
-			tagChange(item){
-				this.status=item.id
-				this.mescroll.resetUpScroll()
-			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					sopId:this.sopId,
-					sendStatus:this.status,
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getCourseSopLogsList(data).then(res => {
-					uni.hideLoading()
-					if(res.code==200){
-						//设置列表数据
-						if (page.num == 1) {
-							that.dataList = res.data.list; 
-							
-						} else {
-							that.dataList = that.dataList.concat(res.data.list);
-							 
-						}
-						that.hasNextPage=res.data.hasNextPage
-						that.mescroll.endBySize(res.data.list.length, res.data.total);
-						
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: "请求失败",
-						});
-						that.dataList = null;
-						that.mescroll.endErr();
-					}
-				});
-			},
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		.top-box{
-			width: 100%;
-			z-index: 10000;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			
-			.tabs{
-				height: 88rpx;
-				background-color: #fff;
-				width: 100%;
-			}
-			
-		}
-		
-		.footer-btns{
-			padding:15rpx;
-			width: 100%;
-			z-index: 10000;
-			position: absolute;
-			bottom:30rpx;
-			left:0rpx;
-		}
-		
-		.sop-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.sop-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 38rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 40rpx;
-							height:40rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-	}
-</style>

+ 0 - 131
pages/user/crm/components/customerInfo.vue

@@ -1,131 +0,0 @@
-<template>
-	<view class="content">
-		<view class="info-detail" v-if="item!=null" >
-			<view class="item">
-				<text class="label">客户姓名</text>
-				<text class="text">{{item.customerName}}</text>
-			</view>
-			<view class="item">
-				<text class="label">创建时间</text>
-				<text class="text">{{item.createTime}}</text>
-			</view>
-		 <view class="item">
-		 	<text class="label">客户微信</text>
-		 	<view class="right">
-				<view class="text ellipsis" >{{item.weixin}}</view>
-				<view class="btn" @click="sendMsg()">	
-					自动获取
-				</view>
-			</view>
-		 </view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {getCustomerDetails} from '@/api/crm.js'
-	export default {
-		data() {
-			return {
-				id:null,
-				item:null,
-			}
-		},
-		onLoad(option) {
-			
-		},
-		onShow() {
-			 
-		},
-		methods: {
-			sendMsg(){
-				var that=this;
-				var userId=uni.getStorageSync('companyUserId') ;
-				var data={cmd:"getWeixinId", data:{},userId:"p-"+userId};
-				uni.$emit('sendMsg',data); 
-				
-			},
-			getCustomerDetails(customerId) {
-				//联网加载数据
-				var that = this;
-				var data = {
-					customerId: customerId
-				};
-				getCustomerDetails(data).then(res => {
-					if(res.code==200){
-						this.item=res.customer;
-						 
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: "请求失败",
-						});
-					}
-				});
-			},
-			 
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		// 详细信息
-		.info-detail{
-			background-color: #fff;
-			.item{
-				height: 88rpx;
-				border-bottom: 1rpx solid #f3f3f3;
-				width: 100%;
-				display: flex;
-				align-items: center;
-				justify-content: flex-start;
-				padding: 20upx 0;
-				.label{
-					min-width: 150rpx;
-					flex: 1;
-					font-size: 28upx;
-					color: #999;
-					margin-right: 20upx;
-				}
-				.right{
-					
-					flex: 1;
-					display: flex;
-					align-items: center;
-					justify-content: flex-end;
-					.text{
-						max-width: 200rpx;
-						font-size: 28upx;
-						color: #333;
-					}
-					.btn{
-						min-width: 150rpx;
-						height: 66rpx;
-						border-radius: 8rpx;
-						padding: 5rpx 15rpx;
-						display: flex;
-						align-items: center;
-						justify-content: center;
-						border: 1rpx solid #e9e9e9;
-						font-size: 28rpx;
-						color: #909399;
-						
-					}
-				}
-				.text{
-					font-size: 28upx;
-					color: #333;
-				}
-				 
-			}
-		}
-	}
-</style>

+ 0 - 225
pages/user/crm/customerDetails.vue

@@ -1,225 +0,0 @@
-<template>
-	<view class="content">
-		<view class="top-box" v-if="item!=null">
-			<view class="customer-box">
-				<view class="left">
-					<view class="name">{{item.customerName}}</view>
-					<view class="desc-box">
-						<view class="label">创建时间:</view>
-						<view class="value"> {{item.createTime}}</view>
-					</view>
-					<view class="desc-box">
-						<view class="label">地址:</view>
-						<view class="value">{{item.address}} </view>
-					</view>
-				</view>
-				<view class="btns">
-					<image class="btn" src="../../../static/images/sms.png"></image>
-					<image class="btn" src="../../../static/images/phone.png"></image>
-				</view>
-			</view>
-			<view class="tabs">
-				<u-tabs
-				 :scrollable="true"
-				 :list="tabs"  
-				  lineColor="#115296"
-				@change="tagChange">
-				</u-tabs>
-			</view>
-			<view class="cont-box">
-				<customer-info ref="customerInfo"  v-if="tabId==1"></customer-info>
-			</view>
-		</view>
-		<u-modal :show="show"   ref="uModal" :asyncClose="true" :showCancelButton="true" title="提示" @cancel="close" @confirm="confirm" :content='content'></u-modal>
-	</view>
-</template>
-<script>
-	import customerInfo from './components/customerInfo.vue'
-	import {getCustomerDetails,editCrmCustomer} from '@/api/crm.js'
-	export default {
-		components:{
-			customerInfo, // 基本信息
-		},
-		data() {
-			return {
-				wxNickName:null,
-				show:false,
-				content:"",
-				customerId:null,
-				tabId:1,
-				item:null,
-				tabs:[
-					{
-						id:1,
-						name:'用户资料'
-					},
-					{
-						id:2,
-						name:'联系人'
-					},
-					{
-						id:3,
-						name:'跟进记录'
-					},
-					{
-						id:4,
-						name:'通话记录'
-					},
-					{
-						id:5,
-						name:'短信记录'
-					}
-				],
-			}
-		},
-		onLoad(option) {
-			var that=this;
-			uni.$on('getWeixinId', (item) => {
-				console.log(item)
-				
-				that.content="用户昵称:"+item.data+",是否更新";
-				that.wxNickName=item.data;
-				that.show=true;
-			})
-			this.customerId=option.customerId
-			console.log(this.customerId)
-			this.getCustomerDetails()
-		},
-		onShow() {
-			
-		},
-		methods: {
-			close(){
-				this.show=false;
-			},
-			confirm(){
-				this.show=false;
-				var data = {
-					customerId:this.customerId,
-					weixin:this.wxNickName
-					
-				};
-				//更新用户昵称
-				var that=this;
-				editCrmCustomer(data).then(res => {
-					if(res.code==200){
-						uni.showToast({
-							icon:'none',
-							title: "操作成功",
-						});
-						if(this.tabId==1){
-							setTimeout(function(){
-								that.$refs.customerInfo.getCustomerDetails(that.customerId)
-							},200);
-						}
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: res.msg,
-						});
-					}
-				});
-				
-			},
-			tagChange(item){
-				this.tabId=item.id
-				var that = this;
-				if(this.tabId==1){
-					setTimeout(function(){
-						that.$refs.customerInfo.getCustomerDetails(that.customerId)
-					},200);
-				}
-			},
-			getCustomerDetails() {
-				//联网加载数据
-				var that = this;
-				var data = {
-					customerId:this.customerId
-				};
-				getCustomerDetails(data).then(res => {
-					if(res.code==200){
-						this.item=res.customer;
-						setTimeout(function(){
-							that.$refs.customerInfo.getCustomerDetails(that.customerId)
-						},200);
-						
-						 
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: res.msg,
-						});
-						setTimeout(function(){
-							uni.navigateBack()
-						},2000);
-						
-					}
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 20rpx;
-		.top-box{
-			padding: 15rpx;
-			background-color: #fff;
-			margin-bottom: 15rpx;
-			border-radius: 15rpx;
-			width: 100%;
-			.customer-box{
-				
-				width: 100%;
-				display: flex;
-				align-items: flex-start;
-				justify-content: flex-start;
-				.left{
-					flex: 1;
-					font-size: 38rpx;
-					color:#111;
-					.name{
-						flex: 1;
-						font-size: 42rpx;
-						color:#111;
-					}
-					.desc-box{
-						margin-top: 15rpx;
-						width: 100%;
-						display: flex;
-						align-items: center;
-						justify-content: flex-start;
-						.label{
-							font-size: 28rpx;
-							color: #a8a8a8;
-						}
-						.value{
-							font-size: 28rpx;
-							color: #a8a8a8;
-						}
-						
-						
-					}
-				}
-				.btns{
-					.btn{
-						margin-left: 10rpx;
-						width: 45rpx;
-						height:45rpx;
-					}
-				}
-			}
-		}
-		
-	}
-	 
-</style>

+ 0 - 235
pages/user/crm/importWxUser.vue

@@ -1,235 +0,0 @@
-<template>
-	<view class="content">
-		<view class="customer-list">
-			<view class="customer-item"  v-for="(item,index) in dataList"  >
-				<view class="name-box">
-					<view class="name">昵称:{{item.nickName}}</view>
-					<view class="btns">
-						<view class="btn"  @click="delItem(index)" >删除</view>
-					</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">微信号:</view>
-					<view class="value">{{item.id}}</view>
-				</view>
-				 
-			</view>
-		</view>
-		<view class="bottom-btns">
-			<view class="btn1" @click="getWxUsers()">获取客户</view>
-			<view class="btn2" @click="addWxUsers()">导入客户</view>
-		</view>
-		 
-	</view>
-</template>
-
-<script>
-	
-	import {addCompanyWxUser} from '@/api/companyWxUser.js'
-	export default {
-		data() {
-			return {
-				flag:true,
-				dataList: []
-			}
-		},
-		onLoad() {
-			var that=this;
-			uni.$on('getWeixinList', (items) => {
-				console.log(JSON.parse(items.data))
-				that.dataList=JSON.parse(items.data);
-				that.flag=true;
-				uni.showToast({
-					icon:'none',
-					title: "获取微信任务已完成,共获取"+that.dataList.length+"个",
-				});	
-				 
-			})
-		},
-		onShow() {
-		},
-		methods: {
-			delItem(index){
-				this.dataList.splice(index,1);
-			},
-			importUsers(){
-				var that=this;
-				var index=0;
-				that.dataList.forEach(item => {
-					//更新用户昵称
-					index++;
-					var data={nickName:item.nickName,weixinId:item.id};
-					addCompanyWxUser(data).then(res => {
-						if(index>=that.dataList.length){
-							that.dataList=[];
-							uni.showToast({
-								icon:'none',
-								title: "导入成功",
-							});	
-						}
-						else{
-							uni.showToast({
-								icon:'none',
-								title: "导入"+item.nickName,
-							});	
-						}
-					});
-					
-				});
-				
-			},
-			addWxUsers(){
-				if(!this.flag){
-					uni.showToast({
-						icon:'none',
-						title: "正在同步获取微信用户...",
-					});
-					return;
-				}
-				if(this.dataList.length==0){
-					uni.showToast({
-						icon:'none',
-						title: "没有可导入的数据",
-					});
-					return;
-				}
-				var that=this;
-				uni.showModal({
-					title:"提示",
-					content:"确认导入用户列表吗?",
-					showCancel:true,
-					cancelText:'取消',
-					confirmText:'确定',
-					success:res=>{
-						if(res.confirm){
-							that.importUsers();
-													
-						}else{
-						}
-					}
-				})
-			},
-			getWxUsers(){
-				if(!this.flag){
-					return;
-				}
-				var that=this;
-				uni.showModal({
-					title:"提示",
-					content:"确认开始获取微信用户?",
-					showCancel:true,
-					cancelText:'取消',
-					confirmText:'确定',
-					success:res=>{
-						if(res.confirm){
-							that.flag=false;
-							var userId=uni.getStorageSync('companyUserId') ;
-							var data={cmd:"getWeixinList", data:{},userId:"p-"+userId};
-							uni.$emit('sendMsg',data); 
-							uni.showToast({
-							 	icon:'none',
-							 	title: "开始获取微信用户...",
-							});
-						}else{
-						}
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		position: relative;
-		.bottom-btns{
-			position: fixed;
-			bottom: 0;
-			left: 0;
-			width: 100%;
-			height: 50px;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			.btn1{
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				height: 50px;
-				flex:1;
-				background-color: red;
-				color: #fff;
-				font-size: 28rpx;
-			}
-			.btn2{
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				height: 50px;
-				flex:1;
-				background-color: green;
-				color: #fff;
-				font-size: 28rpx;
-			}
-		}
-		.customer-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx 15rpx 100rpx;
-			.customer-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 38rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							color: #a8a8a8;
-							font-size: 28rpx;
-							 
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-		
-	}
-	 
-</style>

+ 0 - 193
pages/user/crm/lineCustomer.vue

@@ -1,193 +0,0 @@
-<template>
-	<view class="content">
-		<view class="top">
-			<u-search placeholder="输入名称搜索" v-model="searchKey" @custom="search()" @search="search()"></u-search>
-		</view>
-		<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="customer-list">
-			<view class="customer-item"  v-for="(item) in dataList"  @click="navTo('/pages/user/crm/customerDetails?customerId='+item.customerId)" >
-				<view class="name-box">
-					<view class="name">{{item.customerName}}</view>
-					<view class="btns">
-						<image class="btn" src="../../../static/images/sms.png"></image>
-						<image class="btn" src="../../../static/images/phone.png"></image>
-					</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">创建时间:</view>
-					<view class="value">{{item.createTime}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">所在地区:</view>
-					<view class="value">{{item.address}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:</view>
-					<view class="value">{{item.remark}}</view>
-				</view>
-				 
-			</view>
-		</view>
-		</mescroll-body>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	
-	import {getLineCustomerList} from '@/api/crm.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				searchKey:"",
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onShow() {
-		},
-		methods: {
-			search(){
-				this.mescroll.resetUpScroll()
-			}, 
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					customerName:this.searchKey,
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getLineCustomerList(data).then(res => {
-					uni.hideLoading()
-					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();
-					}
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		position: relative;
-		.top{
-			z-index: 10000;
-			width: 100%;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			height: 88rpx;
-			background-color: #fff;
-			padding: 0rpx 15rpx;
-		}
-		.customer-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.customer-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 38rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 45rpx;
-							height:45rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-		
-	}
-	 
-</style>

+ 0 - 193
pages/user/crm/myCustomer.vue

@@ -1,193 +0,0 @@
-<template>
-	<view class="content">
-		<view class="top">
-			<u-search placeholder="输入名称搜索" v-model="searchKey" @custom="search()" @search="search()"></u-search>
-		</view>
-		<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="customer-list">
-			<view class="customer-item"  v-for="(item) in dataList"  @click="navTo('/pages/user/crm/customerDetails?customerId='+item.customerId)" >
-				<view class="name-box">
-					<view class="name">{{item.customerName}}</view>
-					<view class="btns">
-						<image class="btn" src="../../../static/images/sms.png"></image>
-						<image class="btn" src="../../../static/images/phone.png"></image>
-					</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">最后跟进:</view>
-					<view class="value">{{item.startTime}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">所在地区:</view>
-					<view class="value">{{item.address}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:</view>
-					<view class="value">{{item.remark}}</view>
-				</view>
-				 
-			</view>
-		</view>
-		</mescroll-body>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	
-	import {getMyCustomerList} from '@/api/crm.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				searchKey:"",
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onShow() {
-		},
-		methods: {
-			search(){
-				this.mescroll.resetUpScroll()
-			}, 
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					customerName:this.searchKey,
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getMyCustomerList(data).then(res => {
-					uni.hideLoading()
-					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();
-					}
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		position: relative;
-		.top{
-			z-index: 10000;
-			width: 100%;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			height: 88rpx;
-			background-color: #fff;
-			padding: 0rpx 15rpx;
-		}
-		.customer-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.customer-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 38rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 45rpx;
-							height:45rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-		
-	}
-	 
-</style>

+ 3 - 2
pages/user/editUser.vue

@@ -4,7 +4,8 @@
 			<view class="info-item">
 				<view class="label">头像</view>
 				<view class="right">
-					<image  class="head" @tap="chooseImage()" :src="headImg" mode=""></image>
+					<u-avatar :src="headImg" size="40" @tap="chooseImage()" ></u-avatar>
+					<!-- <image  class="head" @tap="chooseImage()" :src="headImg" mode=""></image> -->
 				</view>
 			</view>
 			<view class="info-item">
@@ -94,7 +95,7 @@
 				var that=this;
 				getCompanyUser(data).then(
 					res => {
-						that.bindUser(res.data);
+						that.bindUser(res.user);
 						
 					},
 					rej => {}

+ 102 - 144
pages/user/index.vue

@@ -1,158 +1,73 @@
 <template>
-	<view class="content">
+	<view class="content container">
+		<!-- #ifdef MP-WEIXIN -->
+		<view class="h110"></view>
+		<!-- #endif -->
 		<view class="bg"></view>
 		<view class="cont-box">
 			<view class="user-cont" @click="navTo('/pages/user/userInfo')">
 				<view class="user-box" v-if="user!=null">
 					<view class="left">
-						<image src="../../static/images/default.png"></image>
+						<u-avatar :src="user.avatar" size="50"></u-avatar>
+						<!-- <image class="img" :src="user.avatar" mode="aspectFill"></image> -->
 						<view class="user" >
 							<view class="username">{{user.nickName}}</view>
-							<view class="account">{{user.deptName}}</view>
+							<view class="account">{{user.email}}</view>
 						</view>
 					</view>
 					<view class="right" >
-						<image src="../../static/images/right_arrow.png"></image>
+						<image src="/static/images/right_arrow.png"></image>
 					</view>
 				</view>
 				<view class="company" v-if="user!=null">
-					<image src="../../static/images/icon_comp.png"></image>
-					<view class="name">{{user.deptName}}</view>
+					<image src="/static/images/icon_comp.png"></image>
+					<view class="name">{{user.createBy||'暂无数据'}}</view>
 				</view>
 			</view>
 			
-			<view class="menu-box">
+			<view class="menu-box" style="margin-top: -20rpx;">
 				<view class="title-box">
-					<image class="icon" src="../../static/manergevip/chang.png"></image>
+					<image class="icon" src="/static/manergevip/chang.png"></image>
 					<view class="title">常用功能</view>
 				</view>
 				<view class="line"></view>
 				<view class="menus">
-					<!-- <view class="menu-item" @click="navTo('/pages/user/ai/index')">
-						<image src="../../static/manergevip/serve.png"></image>
-						<view class="m-name">AI客服</view>
-					</view> -->
-					<view class="menu-item" @click="navTo('/pages/user/qwSop/sop')">
-						<image src="../../static/manergevip/sop.png"></image>
-						<view class="m-name">群发SOP</view>
-					</view>
-					<!-- <view class="menu-item" @click="navTo('/pages/user/courseSop/sop')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">课程群发SOP</view>
-					</view> -->
-					<view class="menu-item" @click="navTo('/pages/courseManage/index')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">看课管理</view>
+					<view class="menu-item" @click="navTo('/pages/courseManage/manage/manageIndex')">
+						<image src="/static/images/menu_info.png"></image>
+						<view class="m-name">销售管理</view>
 					</view>
 					<view class="menu-item" @click="navTo('/pages/user/users/users')">
-						<image src="../../static/manergevip/qudao.png"></image>
-						<view class="m-name">渠道管理</view>
+						<image src="/static/manergevip/qudao.png"></image>
+						<view class="m-name">审核销售</view>
 					</view>
 					<view class="menu-item" @click="handleShare">
-						<image src="../../static/manergevip/share-manage.png"></image>
-						<view class="m-name">渠道邀请</view>
-					</view>
-				</view>
-				
-			</view>
-			<!-- <view class="menu-box">
-				<view class="title-box">
-					<image class="icon" src="../../static/images/office.png"></image>
-					<view class="title">客户管理</view>
-				</view>
-				<view class="line"></view>
-				<view class="menus">
-					<view class="menu-item" @click="navTo('/pages/user/crm/lineCustomer')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">线索客户</view>
-					</view>
-					<view class="menu-item" @click="navTo('/pages/user/crm/myCustomer')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">我的客户</view>
-					</view>
-					<view class="menu-item" @click="navTo('/pages/user/crm/importWxUser')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">导入微信用户</view>
-					</view>
-				</view>
-			</view> -->
-			<!-- <view class="menu-box">
-				<view class="title-box">
-					<image class="icon" src="../../static/images/office.png"></image>
-					<view class="title">常用工具</view>
-				</view>
-				<view class="line"></view>
-				<view class="menus">
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">制单</view>
-					</view>
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">微信收款</view>
-					</view>
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">支付宝收款</view>
-					</view>
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">订单管理</view>
-					</view>
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">商品套餐包</view>
+						<image src="/static/manergevip/share-manage.png"></image>
+						<view class="m-name">邀请销售</view>
 					</view>
-					<view class="menu-item"  >
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">优惠券</view>
+					<view class="menu-item" @click="navTo('/pages/courseManage/manage/lableSetup')">
+						<image src="/static/images/changeLable.png"></image>
+						<view class="m-name">标签设置</view>
 					</view>
-				</view>
-			</view> -->
+			 	</view>
+			</view>
 			<view class="menu-box">
 				<view class="title-box">
-					<image class="icon" src="../../static/manergevip/qita.png"></image>
+					<image class="icon" src="/static/manergevip/qita.png"></image>
 					<view class="title">其它工具</view>
 				</view>
 				<view class="line"></view>
-				<!-- <view class="menus">
-					<view class="menu-item" @click="navTo('/pages/user/users/users')">
-						<image src="../../static/images/menu_info.png"></image>
-						<view class="m-name">通讯录</view>
-					</view>
-				</view> -->
 				<view class="menus">
 					<view class="menu-item" @click="navTo('/pages/user/about')">
-						<image src="../../static/manergevip/about.png"></image>
+						<image src="/static/manergevip/about.png"></image>
 						<view class="m-name">关于我们</view>
 					</view>
 					<view class="menu-item" @click="navTo('/pages/user/editUser')">
-						<image src="../../static/manergevip/setup.png"></image>
+						<image src="/static/manergevip/setup.png"></image>
 						<view class="m-name">设置</view>
 					</view>
 				</view>
 				
 			</view>
-			<!-- <view class="menu-box1">
-				<view class="menu-item" @click="navTo('/pages/user/about')">
-					<view class="left">
-						<image src="../../static/images/icon_about_us.png"></image>
-						<view class="label">关于我们</view>
-					</view>
-					<view class="right">
-						<image src="../../static/images/right_arrow.png"></image>
-					</view>
-				</view>
-				<view class="menu-item" @click="navTo('/pages/user/editUser')">
-					<view class="left">
-						<image src="../../static/images/icon_set.png"></image>
-						<view class="label">设置</view>
-					</view>
-					<view class="right">
-						<image src="../../static/images/right_arrow.png"></image>
-					</view>
-				</view>
-			</view> -->
 			<view class="btn-box" >
 				<view class="sub-btn" @click="showLogout()">退出登录</view>
 			</view>
@@ -160,7 +75,7 @@
 		<!-- 分享弹窗 -->
 		<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare" @open="openShare">
 			<view class="sharePop x-ac">
-				<view class="sharePop-item y-f" @click="shareimg">
+				<!-- <view class="sharePop-item y-f" @click="shareimg">
 					<image src="@/static/images/card_icon.png" mode="aspectFill"
 						style="width: 80rpx; height: 80rpx;margin-top: 20rpx;"></image>
 					<view style="font-weight: bold;margin-bottom: 4px;">生成卡片</view>
@@ -170,8 +85,8 @@
 					<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
 					<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
 					<view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
-				</view>
-				<view class="sharePop-item y-f" @click="setTimeShow=true">
+				</view> -->
+				<view class="sharePop-item y-f" @click="shareSale">
 					<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
 					<view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
 					<view style="font-size: 12px;color: #888;">生成链接一键复制</view>
@@ -191,7 +106,7 @@
 			</view>
 		</u-popup>
 		<!-- 设置链接有效时长弹窗 -->
-		<u-modal :show="setTimeShow" content='content' class="model" @confirm="confirmTime">
+		<!-- <u-modal :show="setTimeShow" content='content' class="model" @confirm="confirmTime">
 			<view class="setTimebox">
 				<view class="timetip">不传默认以系统参数为准</view>
 				<view class="x-f">
@@ -199,7 +114,7 @@
 					<u-input fontSize="14px" placeholder="链接有效时长" border="none" v-model="time" maxlength="5"></u-input>
 				</view>
 			</view>
-		</u-modal>
+		</u-modal> -->
 		<!-- 卡片分享引导 -->
 		<u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
 			<view class="point-box">
@@ -244,14 +159,40 @@
 				setImg:false,
 				codeLink:'',
 				showzhidao:false,
-				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
+				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png',
 			}
 		},
 		onShow() {
-			this.getCompanyUser()
-		
+			this.getCompanyUsers()
+		},
+		mounted() {
 		},
 		methods: {
+			shareSale(){
+				 const fullUrl = location.href;
+				 const Path = fullUrl.split('/#')[0] || '';
+				setTimeout(() => {
+					uni.setClipboardData({
+						data: Path+'/#/pages/courseManage/course/becomeSale?id='+this.user.companyId,
+						success: () => {
+							uni.showToast({
+								title: '邀请链接已复制',
+								icon: 'none',
+								duration: 2000
+							});
+							// this.setTimeShow = !this.setTimeShow
+							this.showShare = false
+							// console.log(res)
+						},
+						fail: () => {
+							uni.showToast({
+								title: '复制失败',
+								icon: 'none'
+							});
+						}
+					});
+				}, 100)
+			},
 			// 获取jssdk
 			getjssdklist() {
 				const param = {
@@ -271,7 +212,7 @@
 			shareimg(){
 				//分享好友
 				let self = this
-				// 配置--你到时候把配置全局 --就是这些东西  调接口拿
+				// 配置--配置全局 
 				wx.ready(function() { //需在用户可能点击分享按钮前就先调用
 					wx.updateAppMessageShareData({
 						title: self.user.userName+"邀请您成为群管", // 分享标题
@@ -290,7 +231,7 @@
 							}); 
 						},
 						fail: function(err) {
-							console.log(err);
+							// console.log(err);
 							uni.showToast({
 								title: '卡片生成失败,请重试',
 								icon: 'none',
@@ -302,8 +243,8 @@
 			},
 			handleShare() {
 				this.showShare = true
-				this.getjssdklist()
-				this.getlink('preload'); // 提前加载链接
+				// this.getjssdklist()
+				// this.getlink('preload'); // 提前加载链接
 			},
 			//设置链接时长
 			confirmTime() {
@@ -335,7 +276,7 @@
 					if(res.code==200){
 						this.codeLink=res.data
 						this.getlink()
-						console.log(res)
+						// console.log(res)
 					}else{
 						uni.showToast({
 							title: res.msg,
@@ -359,12 +300,13 @@
 						if (this.copyLinks.startsWith('http://')) {
 							this.copyLinks = this.copyLinks.replace('http://', 'https://');
 						  }
-						console.log(this.copyLinks,'分享链接')
+						// console.log(this.copyLinks,'分享链接')
 					}else{
 					}
 				})
 			},
 			copyLink(){
+				console.log(this.showShare)
 				setTimeout(() => {
 					uni.setClipboardData({
 						data: this.copyLinks,
@@ -388,11 +330,9 @@
 			},
 			closeShare() {
 				this.showShare = false
-				// console.log('open');
 			},
 			openShare() {
 				// this.showShare = false
-				// console.log('close');
 			},
 			showLogout(){
 				this.show=true;
@@ -402,26 +342,37 @@
 			},
 			logout(){
 				this.utils.logout();
-				uni.$emit('closeWebSocket');
+				// 条件编译判断平台,设置不同登录页路径
+				 let loginPage = '';
+				 // #ifdef H5
+				 loginPage = '/pages/auth/login';
+				 // #endif
+				 // #ifdef MP-WEIXIN
+				 loginPage = '/pages/auth/wxlogin';
+				 // #endif
 				uni.reLaunch({
-					url: '/pages/auth/login',
+					url: loginPage,
 					animationType: 'pop-in',
 					animationDuration: 100
 				})
 			},
 			navTo(url){
-				console.log(url)
 				uni.navigateTo({
 					url
 				})
 			},
-			getCompanyUser(){
+			getCompanyUsers(){
 				var data = {
 				};
 				getCompanyUser(data).then(res => {
 					if(res.code==200){
-						this.user=res.data;
-						console.log(this.user)
+						console.log(res)
+						this.user=res.user;
+						if(this.user.avatar){
+							this.user.avatar=uni.getStorageSync('requestPath')+res.user.avatar
+						}else{
+							this.user.avatar=='';
+						}
 					}else{
 						
 					}
@@ -438,6 +389,14 @@
 	}
 </style>
 <style scoped lang="scss">
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+		height: 100%;
+		overflow: hidden;
+	}
 	.imgshe{
 		display: flex;
 		flex-direction: row-reverse
@@ -477,22 +436,23 @@
 		width: 100%;
 		.bg{
 			width: 100%;
-			height: 200upx;
+			height: 360upx;
 			position: absolute;
 			top: 0;
 			left: 0;
 			z-index: 1;
-			background: linear-gradient(to bottom,#115296, #b4d8ff);
-			// border-radius: 0rpx 0rpx 60rpx 60rpx;
+			background: linear-gradient(to bottom, #dae9ff, #e1e1fd);
+			// background: linear-gradient(to bottom, #8bbfff, #1773ff);
+			border-radius: 0rpx 0rpx 60rpx 60rpx;
 		}
 		.cont-box{
 			position: relative;
 			z-index: 2;
 			padding: 30rpx 30rpx 200rpx;
 			.user-cont{
-				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				// box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
 				padding: 30rpx;
-				background-color: #fff;
+				// background-color: #fff;
 				border-radius: 15rpx;
 				.user-box{
 					width: 100%;
@@ -523,13 +483,12 @@
 								font-weight: bold;
 							}
 							.account{
-								padding: 5rpx 20rpx;
+								padding: 5rpx 0rpx;
 								border-radius: 30rpx;
-								background-color: #115296;
 								margin-top: 20rpx;
 								font-size: 24rpx;
 								font-family: PingFang SC;
-								color: #fff;
+								color: #515151;
 							}
 						}
 					}
@@ -670,8 +629,7 @@
 	}
 	.sharePop {
 		background-color: #fff;
-		padding: 50px 0;
-		padding-bottom: 100px;
+		padding: 20px 0;
 		border-radius: 20px 20px 0 0;
 	
 		&-item {

+ 0 - 168
pages/user/qwSop/sop.vue

@@ -1,168 +0,0 @@
-<template>
-	<view class="content">
-		<mescroll-body top="0rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="sop-list">
-			<view class="sop-item"  v-for="(item) in dataList" @click.stop="navTo('/pages/user/qwSop/sopLosList?sopId='+item.id)"   >
-				<view class="name-box">
-					<view class="name">{{item.name}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">创建时间:</view>
-					<view class="value">{{item.createTime}}</view>
-				</view>
-			</view>
-		</view>
-		</mescroll-body>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	
-	import {getQwSopList} from '@/api/qw.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onShow() {
-		},
-		methods: {
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getQwSopList(data).then(res => {
-					uni.hideLoading()
-					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();
-					}
-				});
-			},
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		.tabs{
-			z-index: 10000;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			height: 88rpx;
-			background-color: #fff;
-			width: 100%;
-		}
-		.sop-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.sop-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 32rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 40rpx;
-							height:40rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-	}
-</style>

+ 0 - 90
pages/user/qwSop/sopLogsDetails.vue

@@ -1,90 +0,0 @@
-<template>
-	<view class="content">
-		<view class="info-detail" v-if="item!=null">
-			<view class="item">
-				<text class="label">接收者:</text>
-				<text class="text">{{item.externalUserName}}</text>
-			</view>
-			<view class="item">
-				<text class="label">发送时间:</text>
-				<text class="text">{{item.sendTime}}</text>
-			</view>
-			<view class="item">
-				<text class="label">实际发送时间:</text>
-				<text class="text">{{item.realSendTime}}</text>
-			</view>
-			<view class="item" v-for="(cont,index ) in contents">
-				<text class="label">发送内容({{index+1}}):</text>
-				<text class="text" v-html="cont.value"> </text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {getQwSopSendCustomerList} from '@/api/qw.js'
-	export default {
-		data() {
-			return {
-				id:null,
-				item:null,
-				contents:[],
-			}
-		},
-		onLoad(option) {
-			// this.id = option.id;
-			this.item=JSON.parse(uni.getStorageSync("sop"));
-			console.log(this.item)
-			this.contents=JSON.parse(this.item.contentJson);
-		},
-		onShow() {
-			 
-		},
-		methods: {
-			 
-			getUserInfoByUserId(userId){
-				var data = {userId:userId};
-				var that=this;
-				getUserInfoByUserId(data).then(
-					res => {
-						that.bindUser(res);
-						
-					},
-					rej => {}
-				);
-			},
-			 
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		// 详细信息
-		.info-detail{
-			padding: 0 24upx;
-			background-color: #fff;
-			.item{
-				padding: 20upx 0;
-				border-bottom: 1px solid #f7f7f7;
-				.label{
-					font-size: 30upx;
-					color: #999;
-					margin-right: 20upx;
-				}
-				.text{
-					font-size: 30upx;
-					color: #333;
-				}
-				 
-			}
-		}
-	}
-</style>

+ 0 - 302
pages/user/qwSop/sopLosList.vue

@@ -1,302 +0,0 @@
-<template>
-	<view class="content">
-		<view class="top-box">
-			<view class="tabs">
-			 	<u-tabs
-			 	 :scrollable="false"
-			 	 :list="tabs"  
-			 	  lineColor="#115296"
-			 	@change="tagChange">
-			 	</u-tabs>
-			</view>
-			
-		</view>
-		
-		<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
-		<view class="sop-list">
-			<view class="sop-item"  v-for="(item) in dataList" @click.stop="openDetails(item)"   >
-				<view class="name-box">
-					<view class="name">{{item.externalUserName}}</view>
-					
-				</view>
-				<view class="desc-box">
-					<view class="label">发送时间:</view>
-					<view class="value">{{item.sendTime}}</view>
-				</view>
-				<view class="desc-box">
-					<view class="label">所属销售:</view>
-					<view class="value">{{item.userName}}</view>
-				</view>
-			</view>
-		</view>
-		</mescroll-body>
-		<view class="footer-btns">
-			<u-button :disabled="!sendFlag" type="success" wid @click="sendMsg()" text="启动群发"></u-button>
-		</view>
-	</view>
-</template>
-
-<script>
-	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	import {updateQwSopLogs,getQwSopLogsList} from '@/api/qw.js'
-	export default {
-		mixins: [MescrollMixin], // 使用mixin
-		data() {
-			return {
-				sendFlag:true,
-				hasNextPage:false,
-				totalCount:0,
-				sopId:null,
-				status:3,
-				tabs:[
-					{
-						id:3,
-						name:'待发送'
-					},
-					{
-						id:1,
-						name:'发送成功'
-					},
-					{
-						id:0,
-						name:'发送失败'
-					}
-				],
-				mescroll:null,
-				downOption: {
-					auto:false//不要自动加载
-				},
-				upOption: {
-					onScroll:false,
-					use: true, // 是否启用上拉加载; 默认true
-					page: {
-						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
-						size: 10 // 每页数据的数量,默认10
-					},
-					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
-					textNoMore:"已经到底了",
-					empty: {
-						icon:'/static/images/empty.png',
-						tip: '暂无数据'
-					}
-				},
-				dataList: []
-			}
-		},
-		onLoad(option) {
-			this.sopId=option.sopId;
-			var that=this;
-			uni.$on('sendSop', (item) => {
-				console.log(JSON.parse(item.data))
-				var data=JSON.parse(item.data);
-				var param={
-					sendStatus:1,
-					id: data.id,
-					receivingStatus: data.receivingStatus,
-					remark:item.remark
-				};
-				updateQwSopLogs(param).then(res => {
-					
-				});
-				that.sendMsgOp();
-			})
-		},
-		onShow() {
-		},
-		methods: {
-			sendMsgOp(){
-				if(this.sendFlag){
-					return;
-				}
-				//循环发送 先获取一条,更新一条这样发送
-				this.mescroll.resetUpScroll()
-				var userId=uni.getStorageSync('companyUserId') ;
-				var that=this;
-				setTimeout(function(){
-					if(that.dataList.length>0){
-						var data={cmd:"sendSop", data:that.dataList[0],userId:"p-"+userId};
-						uni.$emit('sendMsg',data);  
-					}
-					else{
-						that.sendFlag=true;
-						uni.showToast({
-							icon:'none',
-							title: "已完成",
-						});
-					}
-				},5000);
-				
-			},
-			sendMsg(){
-				if(!this.sendFlag){
-					uni.showToast({
-						icon:'none',
-						title: "运行中...",
-					});
-					return;
-				}
-				var that=this;
-				uni.showModal({
-					title:"提示",
-					content:"确认启动自动发送吗?",
-					showCancel:true,
-					cancelText:'取消',
-					confirmText:'确定',
-					success:res=>{
-						if(res.confirm){
-							this.sendFlag=false;
-							that.sendMsgOp()
-							 
-						}else{
-							// 否则点击了取消  
-						}
-					}
-				})
-				
-			},
-			openDetails(item){
-				uni.setStorageSync("sop",JSON.stringify(item))
-				uni.navigateTo({
-					url:"sopLogsDetails"
-				})
-			},
-			tagChange(item){
-				this.status=item.id
-				this.mescroll.resetUpScroll()
-			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
-			/*下拉刷新的回调 */
-			downCallback(mescroll) {
-				mescroll.resetUpScroll()
-			},
-			upCallback(page) {
-				//联网加载数据
-				var that = this;
-				var data={
-					sopId:this.sopId,
-					sendStatus:this.status,
-					pageNum: page.num,
-					pageSize: page.size
-				};
-				uni.showLoading({
-					title:"加载中..."
-				})
-				getQwSopLogsList(data).then(res => {
-					uni.hideLoading()
-					if(res.code==200){
-						//设置列表数据
-						if (page.num == 1) {
-							that.dataList = res.data.list; 
-							
-						} else {
-							that.dataList = that.dataList.concat(res.data.list);
-							 
-						}
-						that.hasNextPage=res.data.hasNextPage
-						that.mescroll.endBySize(res.data.list.length, res.data.total);
-						
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: "请求失败",
-						});
-						that.dataList = null;
-						that.mescroll.endErr();
-					}
-				});
-			},
-			navTo(url){
-				uni.navigateTo({
-					url: url
-				})
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		
-		height: 100%;
-		background: #f6f6f6;
-	}
-</style>
-<style scoped lang="scss">
-	.content{
-		height: 100%;
-		padding: 0rpx;
-		.top-box{
-			width: 100%;
-			z-index: 10000;
-			position: absolute;
-			top:0rpx;
-			left:0rpx;
-			
-			.tabs{
-				height: 88rpx;
-				background-color: #fff;
-				width: 100%;
-			}
-			
-		}
-		
-		.footer-btns{
-			padding:15rpx;
-			width: 100%;
-			z-index: 10000;
-			position: absolute;
-			bottom:30rpx;
-			left:0rpx;
-		}
-		
-		.sop-list{
-			display: flex;
-			flex-direction: column;
-			padding: 15rpx;
-			.sop-item{
-				padding: 15rpx;
-				border-radius: 15rpx;
-				background-color: #fff;
-				margin-bottom: 15rpx;
-				width: 100%;
-				.name-box{
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.name{
-						flex: 1;
-						font-size: 38rpx;
-						color:#111;
-					}
-					.btns{
-						.btn{
-							margin-left: 10rpx;
-							width: 40rpx;
-							height:40rpx;
-						}
-					}
-				}
-				.desc-box{
-					margin-top: 15rpx;
-					width: 100%;
-					display: flex;
-					align-items: center;
-					justify-content: flex-start;
-					.label{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					.value{
-						font-size: 28rpx;
-						color: #a8a8a8;
-					}
-					
-					
-				}
-			}
-		}
-	}
-</style>

+ 13 - 11
pages/user/userInfo.vue

@@ -3,9 +3,9 @@
 		<!-- 个人信息 -->
 		<view class="user-info">
 			<view class="info-box">
-				<view class="left">
-					<view class="head-box">
-						<image class="img" :src="avatar" mode="aspectFill"></image>
+				<view class="left justify-center align-center">
+					<view class="head-box center">
+						<u-avatar :src="avatar" size="50"></u-avatar>
 					</view>
 					<view class="info">
 						<text class="name">{{nickName}}</text>
@@ -35,7 +35,6 @@
 					<text class="label">手机</text>
 					<text class="text">{{phonenumber}}</text>
 				</view>
-				<image class="img" src="/static/images/icon_phone.png" mode="aspectFill"  ></image>
 			</view>
 			<view class="item">
 				<text class="label">邮箱</text>
@@ -109,8 +108,7 @@
 				var that=this;
 				getCompanyUser(data).then(
 					res => {
-						that.bindUser(res.data);
-						
+						that.bindUser(res.user);
 					},
 					rej => {}
 				);
@@ -140,7 +138,8 @@
 	.content{
 		// 个人信息
 		.user-info{
-			background: #115296;
+			// background: #115296;
+			background: linear-gradient(to right, #dae9ff, #e1e1fd);
 			padding: 0 30upx;
 			.info-box{
 				display: flex;
@@ -172,11 +171,11 @@
 						justify-content: space-between;
 						.name{
 							font-size: 30upx;
-							color: #fff;
+							color: #878787;
 						}
 						.title{
 							font-size: 28upx;
-							color: #fff;
+							color: #878787;
 						}
 					}
 				}
@@ -196,7 +195,7 @@
 				}
 				.text{
 					font-size: 30upx;
-					color: #fff;
+					color: #878787;
 				}
 			}
 		}
@@ -218,10 +217,13 @@
 				&.column{
 					display: flex;
 					align-items: center;
-					justify-content: space-between;
+					justify-content: flex-start;
+					align-items: flex-start;
+					flex-direction: row;
 					.img{
 						width: 50upx;
 						height: 50upx;
+						margin-right: 20rpx;
 					}
 				}
 			}

+ 201 - 0
pages/user/users/becomeVIP.vue

@@ -0,0 +1,201 @@
+<template>
+	<view class="content hb column justify-center align-center bgf">
+		<image src="/static/image/becomevip.png" mode="widthFix"></image>
+		<view class="bold">成为会员,享受更多权益</view>
+		<view class="sure" @click="registerCourse">{{isVip==1?'您已成为会员':'申请成为会员'}}</view>
+	</view>
+</template>
+
+<script>
+	import { loginByMp,registerCourses } from '@/api/user'
+	export default {
+		data() {
+			return {
+				isVip: 0,
+				isWechat: false,
+				isLogin: false,
+				companyid:'',
+				companyUserId:'',
+				userInfo:{},
+				tagIds:[]
+			}
+		},
+		onLoad(option) {
+			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.userInfo = {}
+			}
+			// this.userInfo=JSON.parse(uni.getStorageSync('userInfo')) || {};
+			let obj=uni.getStorageSync('AppToken');
+			this.isLogin = !!obj;
+			this.companyid = option.companyId || ''
+			this.companyUserId=option.companyUserId || 0
+			if(option.tagids=="null"){
+				this.tagIds=[]
+			}else{
+				this.tagIds=option.tagids 
+				const arr =this.tagIds.split(",")
+				  .map(item => parseInt(item.trim(), 10))
+				  .filter(num => !isNaN(num)); // 过滤无效转换
+				  this.tagIds =arr
+				console.log(this.tagIds); // [66, 78]
+			}
+			this.isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
+			this.code = option.code
+			if(this.code&&!this.isLogin) {
+				this.loginByMp()
+			}
+		},
+		onShow() {
+			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.userInfo = {}
+			}
+			let obj=uni.getStorageSync('AppToken');
+			this.isLogin = !!obj;
+			if(this.isLogin&&this.isVip!=1) {
+				this.registerCourse()
+			}
+			
+		},
+		methods: {
+			getWechatCode() {
+				if (this.isWechat) {
+					let appid = "wx961fadab9bcb792b"; //微信APPid
+					let code = this.getUrlCode().code; //是否存在code
+					let local = window.location.href;
+					if (code == null || code === "") {
+
+						let urlPaths = local.split("/registerCourse");
+						uni.setStorageSync('beforLoginPage', urlPaths[1]);
+
+						//不存在就打开上面的地址进行授权
+						window.location.href =
+							"https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
+							appid +
+							"&redirect_uri=" +
+							encodeURIComponent(local) +
+							"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
+					} else {
+						this.code = code;
+						this.loginByMp()
+					}
+				}else{
+					uni.showToast({
+						title: '请在微信浏览器中打开',
+						icon:'error'
+					})
+				}
+			},
+			getUrlCode() {
+				// 截取url中的code方法
+				var url = location.search;
+				var theRequest = new Object();
+				if (url.indexOf("?") != -1) {
+					var str = url.substr(1);
+					var strs = str.split("&");
+					for (var i = 0; i < strs.length; i++) {
+						theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
+					}
+				}
+				return theRequest;
+			},
+			loginByMp() {
+				if (this.code == null) {
+					return;
+				}
+				uni.showLoading({
+					title: "处理中..."
+				});
+				loginByMp({code:this.code}).then(res => {
+						uni.hideLoading();
+						if (res.code == 200) {
+							uni.setStorageSync('AppToken', res.token);
+							uni.setStorageSync('userInfo', JSON.stringify(res.user));
+							this.userInfo= res.user
+							let beforLoginUrl = uni.getStorageSync('beforLoginPage');
+							this.isLogin = true
+							this.registerCourse()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			// 成为会员
+			registerCourse() {
+				this.isVip = 0
+				// 确保从本地存储重新获取最新数据
+				  // if(uni.getStorageSync('userInfo')){
+				  // 	this.userInfo=JSON.parse(uni.getStorageSync('userInfo'));
+				  // }
+				  // if (!this.userInfo.userId) {
+				  // 	// 空值检查
+				  //   uni.showToast({ title: '用户未登录或信息不完整', icon: 'none' });
+				  //   return;
+				  // }
+				  if(this.tagIds==null){
+					  this.tagIds=""
+				  }
+				  console.log(this.tagIds)
+				const data={
+					userId:this.userInfo.userId,
+					companyUserId:this.companyUserId,
+					companyId:this.companyid,
+					tagIds:this.tagIds
+					}
+				if(this.isLogin) {
+					registerCourses(data).then(res=>{
+						if(res.code == 200) {
+							this.isVip = 1
+							uni.showToast({
+								title: '恭喜你!成为会员',
+								icon:'none'
+							})
+						} else {
+							uni.showToast({
+								icon:'none',
+								title: res.msg
+							})
+						}
+					})
+				} else {
+					this.getWechatCode()
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.content {
+		image {
+			width: 300rpx;
+			height: 300rpx;
+		}
+	}
+	.bold {
+		color: #999;
+		font-size: 16px;
+		height: auto;
+		line-height: inherit;
+		margin-bottom: 0;
+		width: 304px;
+		word-break: break-all;
+		text-align: center;
+		margin: 50rpx 0 100rpx 0;
+	}
+	.sure {
+		width: 500rpx;
+		background-color: #1777ff;
+		line-height: 88rpx;
+		text-align: center;
+		border-radius: 8rpx;
+		color: #fff;
+	}
+</style>

+ 72 - 11
pages/user/users/userInfo.vue

@@ -23,7 +23,7 @@
 			<view class="justify-between">
 				<view class="comp-info">
 					<image class="img" src="/static/images/icon_comp.png" mode="aspectFill"></image>
-					<text class="fs24 base-color-6">{{deptName}}</text>
+					<text class="fs24 base-color-6">{{userinfo.deptName}}</text>
 				</view>
 				<view class="comp-info">
 					<image class="img" src="/static/images/phone.png" mode="aspectFill"></image>
@@ -37,41 +37,42 @@
 			<view class="base-bg-sure radius12 pl20 ptb12 item">
 				<view class="bold">会员总数</view>
 				<view class="mt12 base-color">
-					<text class="fs40 bold">98</text>
+					<text class="fs40 bold">{{userinfo.vipCount}}</text>
 					<text class="fs28">人</text>
 				</view>
 			</view>
 			<view class="base-bg-sure radius12 pl20 ptb12 item">
 				<view class="bold">今日新增会员</view>
 				<view class="mt12 base-color">
-					<text class="fs40 bold">98</text>
+					<text class="fs40 bold">{{userinfo.newVipCount}}</text>
 					<text class="fs28">人</text>
 				</view>
 			</view>
 			<view class="base-bg-sure radius12 pl20 ptb12 item">
 				<view class="bold">会员红包数</view>
 				<view class="mt12 base-color">
-					<text class="fs40 bold">98</text>
+					<text class="fs40 bold">{{userinfo.redPacketCount}}</text>
 					<text class="fs28">个</text>
 				</view>
 			</view>
 			<view class="base-bg-sure radius12 pl20 ptb12 item">
 				<view class="bold">新会员红包金额</view>
 				<view class="mt12 base-color">
-					<text class="fs40 bold">98</text>
+					<text class="fs40 bold">{{userinfo.newVipRedPackAmount}}</text>
 					<text class="fs28">元</text>
 				</view>
 			</view>
 		</view>
 		<view class="footer-btn ">
-			<view :class="shenhe?'shenhed':'notshenhe'" @click="submitshen">{{shenhe?'已审核':'待审核'}}</view>
-			<view class="base-bg-false base-color-red bor-red" @click="submitjin">{{jinyong?'禁用':'未禁用'}}</view>
+			<view :class="userinfo.isAudit==1?'shenhed':'notshenhe'" @click="submitshen">{{userinfo.isAudit==1?'已审核':'待审核'}}</view>
+			<view :class="userinfo.status==1?'notshenhe':'shenhed'" @click="submitjin">{{userinfo.status==1?'禁用':'未禁用'}}</view>
 		</view>
 	</view>
 </template>
 
 <script>
 	import {getUserInfoByUserId,getUserInfo} from '@/api/user.js';
+	import {subsalesaudit,changesalesState} from '@/api/courseManage.js';
 	export default {
 		data() {
 			return {
@@ -83,10 +84,10 @@
 				email:"",
 				sex:"",
 				isShow:false,
-				userId:undefined,
+				userId:'',
 				userinfo:[],
 				shenhe:false,
-				jinyong:false
+				jinyong:false,
 			}
 		},
 		onLoad(option) {
@@ -101,6 +102,7 @@
 			// })
 			if(!this.utils.isEmpty(option.userId)){
 				this.userId = option.userId;
+				
 				this.isShow=true;
 			}
 			
@@ -115,10 +117,68 @@
 		},
 		methods: {
 			submitshen(){
-				
+				if(this.userinfo.isAudit==1){
+					uni.showToast({
+						title: "用户已经通过审核,无需多次审核",
+						icon: 'none',
+					});
+					return
+				}
+				this.subsalesaudits()
 			},
 			submitjin(){
-				
+				if(this.userinfo.status==0){
+					uni.showToast({
+						title: "用户已经解除禁用,无需多次解除",
+						icon: 'none',
+					});
+					return
+				}
+				this.changesalesStates()
+			},
+			subsalesaudits(){
+				const data={
+					 userIds:this.userId
+				}
+				subsalesaudit(this.userId).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						uni.showToast({
+							title: "用户通过审核,成为销售!",
+							icon: 'none',
+						});
+						uni.navigateBack({
+							delta: 1 
+						})
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+				})
+			},
+			changesalesStates(){
+				const data={
+					 userIds:this.userId
+				}
+				changesalesState(this.userId).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						uni.showToast({
+							title: "用户解除禁用!",
+							icon: 'none',
+						});
+						uni.navigateBack({
+							delta: 1 
+						})
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+				})
 			},
 			bindUser(data){
 				var that=this;
@@ -154,6 +214,7 @@
 				var that=this;
 				getUserInfoByUserId(data).then(
 					res => {
+						// console.log(res)
 						that.bindUser(res);
 					},
 					rej => {}

+ 58 - 15
pages/user/users/users.vue

@@ -10,15 +10,15 @@
 				class="flex-1 center ptb20">批量</view>
 			 </view>
 		</view>
-		
+		<view v-if='list.length<1' class="center mt60" style="color: #666;">暂无用户</view>
 		<scroll-view scroll-y class="indexes flex-1 pb60" :scroll-into-view="'indexes-'+ listCurID" :style="[{height:'calc(100vh - 300rpx)'}]"
 		 :scroll-with-animation="true" :enable-back-to-top="true" >
 			<view v-for="(item,index) in list" :key="index">
-				<view :class="'indexItem-' + item.firstLetter" :id="'indexes-' + item.firstLetter" :data-index="item.firstLetter">
+				<view :class="'indexItem-' + item.firstLetter" :id="'indexes-' + item.firstLetter" :data-index="item.firstLetter" @click.passive.stop>
 					<view class="zm">{{item.firstLetter}}</view>
 					<view class="user-list">
-						<view class="user-item justify-start" v-for="(subitem,index) in item.list" 
-						@click="navTo(subitem)" :key="index">
+						<view class="user-item justify-start" v-for="(subitem,indexs) in item.list" 
+						@click="navTo(subitem)" :key="indexs">
 							<u-checkbox-group @change="changeitem(subitem.userId)" v-if="selectact">
 								<u-checkbox :checked="subitem.checked" shape="circle" activeColor="#1773ff" :name="subitem.userId"
 									labelColor="#1773ff" />
@@ -34,22 +34,24 @@
 												{{subitem.nickName}}
 											</view>
 											<view class="dept justify-start align-center">
-												<u-icon name="phone"></u-icon><view>1576984582</view> </view>
-											<view class="dept">注册时间:2025-01-24</view>
+												<u-icon name="phone"></u-icon><view>{{subitem.phoneNumber}}</view> </view>
+											<view class="dept">注册时间:{{subitem.registerTime}}</view>
 										</view>
 									</view>
-									<view class="base-color fs24">未禁用</view>
+									<view class="base-color fs24" v-if="subitem.status==0">未禁用</view>
+									<view class="base-color-red fs24" v-else>禁用</view>
 								</view>
-								<view class="justify-between mt10">
+								<view class="justify-between mt10" @click.passive.stop>
 									<view class="fs24 mt20 ml10" style="color: #115296;">
 										{{subitem.deptName}}
 									</view>
 									<!-- <view class="fs24 base-color-red mr10 bor-red
 									base-bg-false plr20 radius40 ptb4">已禁用</view> -->
 									<view class="fs24 base-color mr10 bor-blue h52 lh50
-									base-bg-sure plr20 radius40 " style="width: fit-content;" v-if="act==0">已审核</view>
+									base-bg-sure plr20 radius40 " style="width: fit-content;" v-if="subitem.isAudit==1">已审核</view>
 									<view class="fs24 base-color-red mr10 bor-red h52 lh50
-									base-bg-false plr20 radius40 " style="width: fit-content;" v-if="!selectact&&act==1">待审核</view>
+									base-bg-false plr20 radius40  " style="width: fit-content;z-index: 999;" @click="getidshen(subitem.userId)"
+									 v-else-if="subitem.isAudit==0&&!selectact">待审核</view>
 								</view>
 							</view>
 						</view>
@@ -81,12 +83,13 @@
 		<!--选择显示-->
 		<view v-show="!hidden" class="indexToast">
 			{{listCur}}
-		</view>
+		</view>
 	</view>
 </template>
 
 <script>
-	import {getAllUsers} from '@/api/user.js';
+	import {getAllUsers} from '@/api/user.js';
+	import {subsalesaudit} from '@/api/courseManage.js';
 	export default {
 		data() {
 			return {
@@ -102,7 +105,9 @@
 				act:0,
 				selectact:false,
 				isSelectAll:false,
-				selectedUsers:[]
+				selectedUsers:[],
+				isAudits:1,
+				ids:''
 			}
 		},
 		onLoad() {
@@ -118,6 +123,11 @@
 			}).exec()
 		},
 		methods: {
+			getidshen(id){
+				console.log(id)
+				this.ids=id
+				this.subsalesaudits()
+			},
 			batchApprove(){
 				 if (this.selectedUsers.length === 0) {
 					  uni.showToast({
@@ -126,6 +136,29 @@
 					  });
 					  return;
 				}
+				
+				this.ids=this.selectedUsers.join(',')
+				this.subsalesaudits()
+			},
+			subsalesaudits(){
+				const data={
+					 userIds:this.ids
+				}
+				subsalesaudit(this.ids).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						uni.showToast({
+							title: "用户通过审核,成为销售!",
+							icon: 'none',
+						});
+						this.getUser()
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+				})
 			},
 			// 全选
 			selectAll() {
@@ -165,13 +198,23 @@
 			    return this.list.reduce((total, group) => total + group.list.length, 0);
 			  },
 			tabact(index){
+				this.list=[]
 				this.act=index
-				if(index==0){
+				if(this.act==0){
 					this.selectact=false
+					this.isAudits=1
+					this.getUser();
+				}else if(this.act==1){
+					this.isAudits=0
+					this.getUser();
 				}
 			},
 			getUser(){
-				var data = {searchKey:this.searchContent};
+				
+				var data = {
+					searchKey:this.searchContent,
+					isAudit:this.isAudits
+					};
 				var that=this;
 				getAllUsers(data).then(
 					res => {

+ 223 - 0
pages/user/wxuser.vue

@@ -0,0 +1,223 @@
+<template>
+	<view>
+		<view class="top-content ">
+			<view class="status_bar" :style="{height: statusBarHeight+'px'}"></view>
+			<!-- 这里是状态栏 -->
+			<view class="top-title">我的</view>
+		</view>
+		<view class="user-cont" :style="{marginTop: `calc(${statusBarHeight}px + 88rpx)`}">
+			<view class="user-box" v-if="user!=null">
+				<view class="left">
+					<u-avatar :src="user.avatar" size="50"></u-avatar>
+					<view class="user" >
+						<view class="username">{{user.nickName}}</view>
+						<view class="account">{{user.email}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="company" v-if="user!=null">
+				<image src="/static/images/icon_comp.png"></image>
+				<view class="name">{{user.createBy||'暂无数据'}}</view>
+			</view>
+		</view>
+		<view class="p20">
+			<view class="menu-box" style="margin-top: -40rpx;">
+				<view class="title-box">
+					<image class="icon" src="/static/manergevip/chang.png"></image>
+					<view class="title">常用功能</view>
+				</view>
+				<view class="line"></view>
+				<view class="menus">
+					<view class="menu-item" @click="navTo()">
+						<image src="/static/images/menu_info.png"></image>
+						<view class="m-name">销售管理</view>
+					</view>
+			 	</view>
+			</view>
+		</view>
+		
+		<tabbar :actindex="1"></tabbar>
+	</view>
+</template>
+
+<script>
+	import tabbar from '@/components/tabbar/tabbar.vue'
+	import { getCompanyUser } from '@/api/user.js'
+	export default {
+		components: {
+			tabbar
+		},
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				user:[]
+			}
+		},
+		onShow() {
+			this.getCompanyUsers()
+		},
+		methods: {
+			navTo(url){
+				if(uni.getStorageSync('companyUserInfo')){
+					uni.switchTab({
+						url:'/pages/index/index'
+					})
+				}else{
+					uni.navigateTo({
+						url:'/pages/auth/login'
+					})
+				}
+				
+			},
+			getCompanyUsers(){
+				var data = {
+				};
+				getCompanyUser(data).then(res => {
+					if(res.code==200){
+						this.user=res.user;
+					}else{
+						
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.top-content {
+	width: 100%;
+	z-index: 10;
+	position: fixed;
+	top: 0;
+	left: 0;
+	background-color: #FFFFFF;
+	.top-title {
+		height: 88rpx;
+		line-height: 88rpx;
+		font-size: 42rpx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41rpx;
+		background-color: #FFFFFF;
+	}
+}
+.menu-box{
+	box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+	width: 100%;
+	margin-top: 30rpx;
+	padding: 30rpx;
+	background-color: #fff;
+	border-radius: 15rpx;
+	.title-box{
+		display: flex;
+		align-items: center;
+		justify-content: flex-start;
+		.icon{
+			width: 40rpx;
+			height:40rpx;
+		}
+		.title{
+			margin-left: 10rpx;
+			font-size: 28rpx;
+			font-family: PingFang SC;
+			color: #111;
+		}
+	}
+	.line{
+		margin-top: 15rpx;
+		height: 0.5rpx;
+		width: 100%;
+		background-color: #efefef;
+	}
+	.menus{
+		margin-top: 30rpx;
+		display: flex;
+		align-items: center;
+		justify-content: flex-start;
+		flex-wrap: wrap;
+	}
+	.menu-item{
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		width: 25%;
+		margin-bottom: 20rpx;
+		image{
+			width:60rpx;
+			height:60rpx;
+		}
+		.m-name{
+			margin-top: 10rpx;
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			color: #111;
+		}
+	}
+	
+}
+.user-cont{
+	// box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+	background: linear-gradient(to bottom, #dae9ff, #e1e1fd);
+	    border-radius: 0px 0px 30px 30px;
+	padding: 30rpx;
+	// background-color: #fff;
+	border-radius: 15rpx;
+	.user-box{
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: flex-start;
+		.left{
+			flex:1;
+			display: flex;
+			align-items: center;
+			justify-content: flex-start;
+			image{
+				border-radius: 50%;
+				width:120rpx;
+				height:120rpx;
+			}
+			.user{
+				margin-left: 20rpx;
+				width: calc(100% - 140rpx);
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.username{
+					font-size: 38rpx;
+					font-family: PingFang SC;
+					color: #111;
+					font-weight: bold;
+				}
+				.account{
+					padding: 5rpx 0rpx;
+					border-radius: 30rpx;
+					margin-top: 20rpx;
+					font-size: 24rpx;
+					font-family: PingFang SC;
+					color: #515151;
+				}
+			}
+		}
+	}
+	.company{
+		margin-top: 30rpx;
+		display: flex;
+		align-items: center;
+		justify-content: flex-start;
+		image{
+			width:40rpx;
+			height:40rpx;
+		}
+		.name{
+			margin-left: 15rpx;
+			font-size: 28rpx;
+			color: #111;
+		}
+	}
+}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 301 - 566
pages_course/video.vue


+ 3 - 2
project.config.json

@@ -1,5 +1,5 @@
 {
-  "appid": "wx93ce67750e3cfba3",
+  "appid": "wxa5b19147cb4d515e",
   "compileType": "miniprogram",
   "libVersion": "3.7.3",
   "packOptions": {
@@ -24,5 +24,6 @@
   "editorSetting": {
     "tabIndent": "insertSpaces",
     "tabSize": 2
-  }
+  },
+  "simulatorPluginLibVersion": {}
 }

+ 10 - 1
router/router.js

@@ -15,6 +15,7 @@ router.beforeEach((to, from, next) => {
 	console.log("路由进入")
 	console.log(to)
 	let index = filters.indexOf(to.path);
+	
 	//过滤
 	console.log(index)
 	if (index > -1) {
@@ -28,7 +29,15 @@ router.beforeEach((to, from, next) => {
 		next();
 	}
 	else{
-		next({path: "/pages/auth/login"});
+		// 条件编译判断平台,设置不同登录页路径
+		 let loginPage = '';
+		 // #ifdef H5
+		 loginPage = '/pages/auth/login';
+		 // #endif
+		 // #ifdef MP-WEIXIN
+		 loginPage = '/pages/auth/wxlogin';
+		 // #endif
+		next({path: loginPage});
 	}
   //判断是否校验路由
   // if (to.meta.isAure) {

BIN
static/image/course_expiration_img.png


BIN
static/images/changeLable.png


BIN
static/images/home.png


BIN
static/images/home_select.png


BIN
static/images/icon_ai.png


BIN
static/images/icon_cust.png


BIN
static/images/icon_phone.png


BIN
static/images/jiantou.png


BIN
static/images/menu_info.png


BIN
static/images/my.png


BIN
static/images/my_select.png


BIN
static/images/order.png


BIN
static/images/order_select.png


BIN
static/images/report.png


BIN
static/images/report_select.png


BIN
static/images/send.png


BIN
static/images/sms.png


BIN
static/images/vipmage.png


BIN
static/logo.png


BIN
static/manergevip/Refresh.png


BIN
static/manergevip/about.png


BIN
static/manergevip/companyphone.png


BIN
static/manergevip/icon-down.png


BIN
static/manergevip/icon-pullup.png


BIN
static/manergevip/no-vip.png


BIN
static/manergevip/serve.png


BIN
static/manergevip/setup.png


BIN
static/manergevip/sop.png


BIN
static/manergevip/vip.png


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