8 Achegas f821f824b9 ... 0c27aadc67

Autor SHA1 Mensaxe Data
  puyao 0c27aadc67 第一次提交 hai 3 semanas
  puyao 01bd09e47b Merge remote-tracking branch 'origin/master' hai 1 mes
  puyao e30208bb17 合并 hai 1 mes
  puyao 8d4d8db73a 合并 hai 1 mes
  puyao 77f22eab93 解决冲突 hai 1 mes
  XSLu08042 6e13c733a1 格式 hai 1 mes
  XSLu08042 f1faec5c35 看课 hai 1 mes
  puyao 76a123d461 第一次提交 hai 1 mes
Modificáronse 100 ficheiros con 10546 adicións e 7054 borrados
  1. 6 0
      .idea/vcs.xml
  2. 86 0
      .idea/workspace.xml
  3. 25 113
      App.vue
  4. 67 19
      api/course.js
  5. 125 84
      api/courseManage.js
  6. 0 25
      api/crm.js
  7. 0 28
      api/qw.js
  8. 67 0
      api/qwcourse.js
  9. 23 10
      api/user.js
  10. 44 15
      common/request.js
  11. 2 1
      components/chart.vue
  12. 118 77
      components/courseItem.vue
  13. 21 17
      components/dropdownPanel.vue
  14. 61 0
      components/enterpriseimg.vue
  15. 147 56
      components/liveCourse.vue
  16. 444 0
      components/living.vue
  17. 254 0
      components/newuser.vue
  18. 347 0
      components/qiweiUrgeCourse.vue
  19. 79 0
      components/tabbar/tabbar.vue
  20. 303 0
      components/userUrgeCourse.vue
  21. 133 74
      components/vipUserItem.vue
  22. 6 1
      main.js
  23. 5 2
      manifest.json
  24. 283 190
      pages.json
  25. 45 14
      pages/auth/login.vue
  26. 578 0
      pages/auth/wxlogin.vue
  27. 63 6
      pages/common/launch.vue
  28. 148 0
      pages/course/course.vue
  29. 210 0
      pages/courseManage/course/becomeSale.vue
  30. 7 13
      pages/courseManage/course/becomeVip.vue
  31. 255 0
      pages/courseManage/course/courseVideo.vue
  32. 0 263
      pages/courseManage/course/index.vue
  33. 0 22
      pages/courseManage/course/living.vue
  34. 0 736
      pages/courseManage/dataIndex/index.vue
  35. 0 132
      pages/courseManage/index.vue
  36. 265 57
      pages/courseManage/manage/changeVip.vue
  37. 145 24
      pages/courseManage/manage/exprotList.vue
  38. 125 30
      pages/courseManage/manage/lableSetup.vue
  39. 180 138
      pages/courseManage/manage/manageDetail.vue
  40. 43 27
      pages/courseManage/manage/manageIndex.vue
  41. 3 3
      pages/courseManage/manage/userDataDetail.vue
  42. 150 132
      pages/courseManage/operation/index.vue
  43. 99 103
      pages/courseManage/statistics.vue
  44. 66 84
      pages/courseManage/vip/ManageDetail.vue
  45. 0 22
      pages/courseManage/vip/dropDownList.vue
  46. 0 1420
      pages/courseManage/vip/index.vue
  47. 1393 47
      pages/customer/index.vue
  48. 111 0
      pages/enterprise/enterprise.vue
  49. 40 0
      pages/index/h5.vue
  50. 744 6
      pages/index/index.vue
  51. 41 0
      pages/urgeCourse/urgeCourse.vue
  52. 10 5
      pages/user/about.vue
  53. 0 43
      pages/user/ai/index.vue
  54. 0 168
      pages/user/courseSop/sop.vue
  55. 0 89
      pages/user/courseSop/sopLogsDetails.vue
  56. 0 302
      pages/user/courseSop/sopLosList.vue
  57. 0 131
      pages/user/crm/components/customerInfo.vue
  58. 0 225
      pages/user/crm/customerDetails.vue
  59. 0 235
      pages/user/crm/importWxUser.vue
  60. 0 193
      pages/user/crm/lineCustomer.vue
  61. 0 193
      pages/user/crm/myCustomer.vue
  62. 13 12
      pages/user/editUser.vue
  63. 152 168
      pages/user/index.vue
  64. 0 168
      pages/user/qwSop/sop.vue
  65. 0 90
      pages/user/qwSop/sopLogsDetails.vue
  66. 0 302
      pages/user/qwSop/sopLosList.vue
  67. 16 14
      pages/user/userInfo.vue
  68. 348 0
      pages/user/users/becomeVIP.vue
  69. 76 15
      pages/user/users/userInfo.vue
  70. 141 98
      pages/user/users/users.vue
  71. 171 0
      pages_course/reward.vue
  72. 308 567
      pages_course/video.vue
  73. 1925 0
      pages_course/videovip.vue
  74. 3 2
      project.config.json
  75. 26 43
      router/router.js
  76. BIN=BIN
      static/image/becomevip.png
  77. BIN=BIN
      static/image/changePlayer-icon.png
  78. BIN=BIN
      static/image/course_answer_incorrectly_img.png
  79. BIN=BIN
      static/image/course_arrow_down_icon.png
  80. BIN=BIN
      static/image/course_arrow_up_icon.png
  81. BIN=BIN
      static/image/course_close_white_icon.png
  82. BIN=BIN
      static/image/downicon.png
  83. BIN=BIN
      static/image/point.png
  84. BIN=BIN
      static/image/red_envelope_btnimg.png
  85. BIN=BIN
      static/image/red_envelope_img.png
  86. BIN=BIN
      static/image/safe.png
  87. BIN=BIN
      static/image/tc_close_icon.png
  88. BIN=BIN
      static/image/tips_title_img.png
  89. BIN=BIN
      static/image/video_icon.png
  90. BIN=BIN
      static/image/wechat.png
  91. BIN=BIN
      static/image/wxmore.png
  92. BIN=BIN
      static/images/card_icon.png
  93. BIN=BIN
      static/images/copy_icon.png
  94. 0 0
      static/images/course_answer_img.png
  95. BIN=BIN
      static/images/customer.png
  96. BIN=BIN
      static/images/default.png
  97. BIN=BIN
      static/images/down_icon.png
  98. BIN=BIN
      static/images/empty.png
  99. BIN=BIN
      static/images/finished.png
  100. BIN=BIN
      static/images/home.png

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

+ 86 - 0
.idea/workspace.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="SELECTIVE" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="5af0c1e4-f9e0-4fd3-a3c5-4ca3fc2191f0" name="更改" comment="合并" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="ProjectColorInfo">{
+  &quot;associatedIndex&quot;: 4
+}</component>
+  <component name="ProjectId" id="2uIhpv28Q9roM3c2ycSRLwNcEV7" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "RunOnceActivity.git.unshallow": "true",
+    "git-widget-placeholder": "master",
+    "last_opened_file_path": "C:/project/xiaohongqun_uni_app",
+    "node.js.detected.package.eslint": "true",
+    "node.js.detected.package.tslint": "true",
+    "node.js.selected.package.eslint": "(autodetect)",
+    "node.js.selected.package.tslint": "(autodetect)",
+    "nodejs_package_manager_path": "npm",
+    "vue.rearranger.settings.migration": "true"
+  }
+}]]></component>
+  <component name="SharedIndexes">
+    <attachedChunks>
+      <set>
+        <option value="bundled-js-predefined-d6986cc7102b-1632447f56bf-JavaScript-WS-243.26053.12" />
+      </set>
+    </attachedChunks>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="默认任务">
+      <changelist id="5af0c1e4-f9e0-4fd3-a3c5-4ca3fc2191f0" name="更改" comment="" />
+      <created>1741942181861</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1741942181861</updated>
+      <workItem from="1741942183014" duration="764000" />
+      <workItem from="1745818152075" duration="876000" />
+    </task>
+    <task id="LOCAL-00001" summary="合并">
+      <option name="closed" value="true" />
+      <created>1745825595839</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1745825595839</updated>
+    </task>
+    <option name="localTasksCounter" value="2" />
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="迁移初始文件" />
+    <MESSAGE value="合并" />
+    <option name="LAST_COMMIT_MESSAGE" value="合并" />
+  </component>
+</project>

+ 25 - 113
App.vue

@@ -3,27 +3,23 @@
 	var pingpangTimes=null;
 	var isSocketOpen=false;
 	var socket=null;
+	let nowapp='福本源'
 	export default {
 		data() {
 			return {
 			};
 		},
 		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();
+			console.log(nowapp)
+		},
+		onLoad() {
+			 // #ifndef MP-WEIXIN 
+			    uni.hideNavigationBar(); // H5 隐藏导航栏
+			// #endif
 		},
 		onShow: function() {
+			
 			console.log('App Show')
 		},
 		onHide: function() {
@@ -31,105 +27,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 +47,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 +127,7 @@
 			color: $--base-color-gray;
 		}
 		.base-color-red{
-				color: $--base-color-red;
+				color:#ee0a25;
 		}
 		.base-color-dark {
 			color: $--base-color-dark;
@@ -241,10 +153,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;
@@ -435,4 +347,4 @@
 /*每个页面公共css */
 @import './assets/iconfont/iconfont.css';
 @import './assets/css/common.less';
-</style>
+</style>

+ 67 - 19
api/course.js

@@ -1,24 +1,72 @@
 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('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+
+// 答题发红包
+export function courseAnswer(data) {
+	return request('/course_uniapp/app/course/wx/h5/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('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 关注客服 是否添加客服
+export function getIsAddKf(data) {
+	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+	return request('/course_uniapp/app/course/wx/h5/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('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+
+// 播放错误上报
+export function getErrMsg(data) {
+	return request('/course_uniapp/app/course/wx/h5/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');
+}
+
+ //微信小程序登录
+ export function loginByMiniApp(data) {
+ 	 return request('/course_uniapp/app/wx/miniapp/loginByMa',data,'POST','application/json;charset=UTF-8');
  }

+ 125 - 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('/companyapp/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('/companyapp/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('/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/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('/companyapp/app/fs/user/tagList',data,'GET');
  }
   
   //添加黑名单
   export function Addblacklist(data){
-  	const url = '/black'
+  	const url = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/app/fs/user/enabled'
+  	return request(url, data, 'POST','application/json;charset=UTF-8')
   }
   
-  
+
   //生成小节课程 (链接)
   export function sharecourselink(data){
-  	const url = '/fsCourseWatchLog/createLinkUrl'
+  	const url = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/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 = '/companyapp/app/companyUser/getCompanyUserList'
+	return request(url, data, 'GET','application/json;charset=UTF-8')
 } 
 
 //根据经销商 新增公司标签
 export function addCompanyLabel(data){
-	const url = '/company/companyTag'
+	const url = '/companyapp/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 = '/companyapp/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 = '/companyapp/app/companyUser/companyUserListByCompanyId'
 	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
 //根据经销商 查询群管的课程
 export function getcourseList(data){
-	const url = '/fsCourse/courseList'
+	const url = '/companyapp/app/fs/user/courseAnalysis'
 	return request(url, data, 'GET','application/json;charset=UTF-8')
 }
 
 //根据经销商 修改群管信息
 export function updategroupinfo(data){
-	const url = '/companyUser/updateCompanyUser'
+	const url = '/companyapp/app/companyUser/updateUserInfo'
 	return request(url, data, 'POST','application/json;charset=UTF-8')
 }
 
 //根据经销商 获取群管详情
 export function getGroupDetail(data){
-	const url = '/companyUser/getCompanyUser'
+	const url = '/companyapp/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 = '/companyapp/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 = '/companyapp/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('/companyapp/app/fs/course/courseImage',data, 'POST',  'application/json;charset=UTF-8');
 }
 
 //是否可以看课
@@ -281,10 +246,86 @@ export function becomeVipuser(data) {
 
 //生成分享海报,新建会员
 export function becomeVipuserImg(data) {
-	return request('/companyUser/generatePostAndQrCode', data, 'POST', 'application/json;charset=UTF-8');
+	return request('/companyapp/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('/companyapp/app/wx/mp/getWeiXinConfig', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取公司所有销售
+export function getusersales(data){
+	return request('/companyapp/app/fs/user/allCompanyUser', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取催课面板
+export function geturgeCourse(data){
+	return request('/companyapp/app/qwWorkTask/list', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取企微账号
+export function geturgeqiwei(data){
+	return request('/companyapp/app/qwWorkTask/getMyQwUserList', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//获取课程视频详情
+export function getcourseDetail(data){
+	return request('/companyapp/app/fs/course/videoDetails', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//通过销售审核
+export function subsalesaudit(data){
+	return request('/companyapp/app/user/audit?userIds='+data, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//解除销售黑名单
+export function changesalesState(data){
+	return request('/companyapp/app/user/changeUserState?userIds='+data,data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//注册销售账户
+export function loginsales(data){
+	return request('/companyapp/app/companyUser/resisterCompanyUser',data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//获取课程小节下拉列表
+export function getvideolist(data){
+	return request('/companyapp/app/fs/course/videoList',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取公司所有标签
+export function getallTags(data){
+	return request('/companyapp/app/companyTag/list',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取更换会员归属审核列表
+export function getchangeslist(data){
+	return request('/companyapp/app/companyUser/applyList',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//更改用户姓名,备注
+export function getchangesUserInfo(data){
+	return request('/companyapp/app/fs/user/changeUserInfo',data,  'POST', 'application/json;charset=UTF-8');
+}
+
+//管理 获取会员人数等
+export function getmanagepopnum(data){
+	return request('/companyapp/app/fs/user/companyUser/summaryCount',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+
+//管理 获取管理课程统计
+export function getmanagecourse(data){
+	return request('/companyapp/app/fs/user/companyUser/details',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//催课 获取会员注册
+export function getWorkTask(data){
+	return request('/companyapp/app/qwWorkTask/getUserList',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取企业理念
+export function getenterprise(data){
+	return request('/app/index/getConcept',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');
- }

+ 67 - 0
api/qwcourse.js

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

+ 23 - 10
api/user.js

@@ -3,29 +3,42 @@ let request = new Request().http
 
  
  export function login(data) {
- 	 return request('/app/user/login',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/companyapp/app/user/login',data,'POST','application/json;charset=UTF-8');
  }
  export function checkLogin(data) {
- 	 return request('/app/user/checkLogin',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/companyapp/app/user/checkLogin',data,'POST','application/json;charset=UTF-8');
  }
  
  export function getCompanyUser(data) {
- 	 return request('/app/user/getCompanyUser',data,'GET');
+ 	 return request('/companyapp/app/user/getCompanyUser',data,'GET');
  }
  
  export function getUserInfoByUserId(data) {
- 	 return request('/app/user/getUserInfoByUserId',data,'GET');
+ 	 return request('/companyapp/app/user/getUserInfoByUserId',data,'GET');
  }
  export function getAllUsers(data) {
- 	 return request('/app/user/getAllUsers',data,'GET');
+ 	 return request('/companyapp/app/user/getAllUsers',data,'GET');
  }
  export function getUserInfo(data) {
- 	 return request('/app/user/getUserInfo',data,'GET');
+ 	 return request('/companyapp/app/user/getUserInfo',data,'GET');
  }
- 
+ //h5登录
  export function loginByMp(data) {
- 	 return request('/app/user/loginByMp',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/companyapp/app/wx/h5/mp/loginByMp',data,'POST','application/json;charset=UTF-8');
+ }
+ // 成为会员
+ export function registerCourses(data) {
+ 	 return request('/course_uniapp/companyapp/app/fs/user/beMember',data,'POST','application/json;charset=UTF-8');
+ }
+ export function setUserInfo(data) {
+ 	 return request('/companyapp/app/user/setUserInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ //微信小程序登录
+ export function loginByMiniApp(data) {
+ 	 return request('/app/wx/miniapp/loginByMa',data,'POST','application/json;charset=UTF-8');
  }
  
- 
- 
+ //微信小程序查询用户信息
+ export function getwxuser(data) {
+ 	 return request('/app/wx/miniapp/getMaUser',data,'GET','application/json;charset=UTF-8');
+ }

+ 44 - 15
common/request.js

@@ -1,18 +1,38 @@
 // uni-app请求封装
+import {TOKEN_KEY} from '@/utils/common.js'
 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://192.168.10.131:7015'
+		// let path = 'https://userapp.fbylive.com'//福本源
+		// let path = 'https://userapp.zkhj6.com'//中康
+		let path = 'http://company.h5.test.ylrztop.com'//云融融智
 		uni.setStorageSync('requestPath',path)
 		// uni.showLoading({
 		// 	title: '加载中'
 		// });
+		let token = uni.getStorageSync('AppToken');
+		if(router.indexOf("/course_uniapp")!=-1){
+			router =router.replace('/course_uniapp','')
+			// path = 'https://userapp.fbylive.com'
+			// path = 'https://userapp.zkhj6.com'//中康
+			let path = 'http://company.h5.test.ylrztop.com'//云融融智
+			// path = 'http://192.168.10.131:7014'
+			//#ifdef MP-WEIXIN
+			token =uni.getStorageSync('AppToken_MYfby')
+			//#endif
+			// #ifdef H5
+			token =uni.getStorageSync('TOKEN_KEY')
+			// #endif
+		}
+		if(router.indexOf("/QWcourse")!=-1){
+			router =router.replace('/QWcourse','')
+			token = uni.getStorageSync('TOKEN_KEYQW');
+		}
 		return new Promise((resolve, reject) => {
-			let token = uni.getStorageSync('AppToken');
-			let usertoken = uni.getStorageSync("UserAppToken")
+			// let token = uni.getStorageSync('AppToken');
+			let usertoken = uni.getStorageSync("UserToken")
 			var httpContentType='application/x-www-form-urlencoded';
 			if(contentType!=undefined){
 				//application/json;charset=UTF-8
@@ -25,7 +45,7 @@ export default class Request {
 					// 'Content-Type': 'application/x-www-form-urlencoded',
 					'Content-Type': httpContentType,
 					'AppToken': token,
-					'UserAppToken':usertoken
+					'UserToken':usertoken
 				},
 				url: `${path}${router}`,
 				data: data,
@@ -34,17 +54,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();
@@ -53,7 +82,7 @@ export default class Request {
 						return;
 					}
 					if (res.token) {
-						uni.setStorageSync('UserAppToken',res.token)
+						uni.setStorageSync(TOKEN_KEY,res.data.token)
 					}
 					resolve(res.data)
 				},

+ 2 - 1
pages/courseManage/components/chart.vue → components/chart.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="charts-box">
-		<qiun-data-charts type="funnel" :opts="opts" :chartData="chartData" />
+		<qiun-data-charts type="funnel" :opts="opts" :chartData="chartData" :canvas2d="true" />
 	</view>
 </template>
 
@@ -28,6 +28,7 @@
 					],
 					padding: [15, 15, 0, 15],
 					enableScroll: false,
+					canvas2d:true,
 					extra: {
 						funnel: {
 							activeOpacity: 0.3,

+ 118 - 77
pages/courseManage/components/courseItem.vue → components/courseItem.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="courselist-item">
+	<view class="courselist-item" style="height: 100%;">
 		<view class="courselist-con x-start" @click="toCourseDetail(info)">
 			<view class="courselist-img">
 				<!-- <view class="status">进行中</view> -->
@@ -7,9 +7,9 @@
 			</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>
+						<image :src="imgpath+'/app/images/copy_icon.png'" mode="aspectFill"></image>
 					</view>
 				</view>
 				<view class="courselist-desc one-t" v-show="from != 'course'">{{info.courseName}}</view>
@@ -21,33 +21,43 @@
 				</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 ">
+			<!--#ifdef MP-WEIXIN-->
+			<view class="courselist-footer-item x-c " @click="handleClick()"><u-icon
 					name="share-square" color="#1677ff" size="18"></u-icon>分享课程</view>
+			<!--#endif-->
+			<!--#ifdef H5-->
+			<view class="courselist-footer-item x-c "  @click="handleShare"><u-icon
+					name="share-square" color="#1677ff" size="18"></u-icon>分享课程</view>
+			<!--#endif-->
 			<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">
-					<image src="@/static/images/card_icon.png" mode="aspectFill"
+				<!--#ifdef MP-WEIXIN-->
+				<view class="sharePop-item y-f card-share" >
+					<image :src="imgPath+'/app/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>
+				<!--#endif-->
+				<!--#ifdef H5-->
 				<view class="sharePop-item y-f" @click="buildimg">
-					<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
+					<image :src="imgPath+'/app/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">
-					<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
+					<image :src="imgPath+'/app/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>
+				<!--#endif-->
 			</view>
 		</u-popup>
 		<!-- 设置链接有效时长弹窗 -->
@@ -64,29 +74,29 @@
 		<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>
+					<image :src=:src="imgPath+'/app/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>
+					<image :src="imgPath+'/app/image/downicon.png'" class="w80 h80"></image>
+					<view class=" mb10">长按图片保存</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>
+					<image :src="imgPath+'/app/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>
+						<image :src=:src="imgPath+'/app/image/wxmore.png'" class="w50 h50 mlr10"></image>
 					</view>
 					<view class="mt20">选择 “转发给朋友”</view>
 					<view style="color: #cbcbcb;" class="fs28 mt40">点击任意位置关闭弹窗</view>
@@ -121,6 +131,9 @@
 					return {}
 				}
 			},
+			parentMethod:{
+				type: Function
+			}
 		},
 		data() {
 			return {
@@ -138,15 +151,33 @@
 				isLongPress: false,
 				painterSrc: '',
 				showzhidao: false,
-				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
+				imgPath:this.$store.state.imgpath,
+				imgs:this.$store.state.imgpath+'/app/image/logo.png',
 			}
 		},
+		// computed: {
+		//     imgPath() {
+		//       return this.$store.state.imgpath
+		//     }
+		//   },
 		onLoad() {},
 		mounted() {
+			
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 
 		},
 		methods: {
+			handleClick(){
+				this.parentMethod();
+				 this.$emit('trigger-share', {
+					 title: this.info.courseName+this.info.title,
+					 path: "pages_course/videovip",
+					 onshow:true,
+					 params: { companyId: this.user.companyId, companyUserId: this.user.userId,id:this.info.id,
+					 courseId:this.info.courseId,videoId:this.info.videoId,periodId:this.info.periodId},
+					 img:this.info.thumbnail||this.imgs
+				   });
+			},
 			// 获取jssdk
 			getjssdklist() {
 				const param = {
@@ -163,16 +194,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 +219,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 +304,19 @@
 					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,
+					periodId:this.info.periodId,
+					id:this.info.id
 				}).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 +326,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'); // 提前加载链接
+				this.showShare = true
+				// #endif
+				// this.getlink('preload'); // 提前加载链接
 			},
 			closeShare() {
 				this.showShare = false
@@ -338,16 +360,17 @@
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
 					time: this.time,
-					type: this.type,
 					videoId: this.info.videoId,
+					periodId:this.info.periodId,
+					id:this.info.id
 				}
 				sharecourselink(params).then(res => {
 					if (res.code == 200) {
-						this.copylink = res.data
-						if (this.copylink.startsWith('http://')) {
-							this.copylink = this.copylink.replace('http://', 'https://');
-						  }
-						console.log(this.copylink)
+						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,
@@ -382,16 +405,18 @@
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
 					time: this.time,
-					type: this.type,
+					periodId:this.info.periodId,
+					id:this.info.id,
+					// 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://');
-						  }
+						 //  if (this.copylink.startsWith('http://')) {
+							// this.copylink = this.copylink.replace('http://', 'https://');
+						 //  }
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -409,6 +434,8 @@
 					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 +443,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 +467,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 +494,6 @@
 		}
 	}
 
-	.codeimg {
-		position: absolute;
-		z-index: 99999;
-		left: 40rpx;
-		top: 40rpx;
-	}
-
 	#codeurl {
 		position: relative;
 	}
@@ -470,18 +506,23 @@
 
 	.sharePop {
 		background-color: #fff;
-		padding: 50px 0;
-		padding-bottom: 100px;
+		padding: 30rpx 0;
 		border-radius: 20px 20px 0 0;
-
+		/* #ifdef MP-WEIXIN */
+		 /* #endif */
+		 
+		/* #ifdef H5 */
+		padding-bottom: 100px;
+		 /* #endif */
 		&-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;

+ 21 - 17
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="imgPath+'/app/manergevip/icon-pullup.png'" mode="" class="icon-triangle"
+								v-if="index === actNav"></image>
+						<image :src="imgPath+'/app/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,12 +72,11 @@
 		},
 		data() {
 			return {
-				top: 0,
 				navData: [],
 				popupShow: false,
 				showMask: false,
 				actNav: null,
-				selIndex: [] //选中条件索引
+				selIndex: [] ,//选中条件索引
 			};
 		},
 		watch: {
@@ -90,6 +89,11 @@
 			// 	}
 			// }
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
 		created() {
 			this.navData = this.filterData;
 			this.selIndex = this.defaultIndex;
@@ -97,13 +101,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() {

+ 61 - 0
components/enterpriseimg.vue

@@ -0,0 +1,61 @@
+<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)`}">
+			<image :src="enterpriseimg"
+			 mode="widthFix" class="w100 pb120"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	import{getenterprise} from '@/api/courseManage.js'
+	export default {
+		// name:"enterpriseimg",
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				enterpriseimg:'',
+			};
+		},
+		mounted() {
+			console.log(this.$store.state.imgpath)
+			const imgs = []
+			this.getenterprise()
+		},
+		methods: {
+			getenterprise(){
+				getenterprise().then(res=>{
+					this.enterpriseimg=res.data.images
+					console.log(res)
+				})
+			},
+		}
+		
+	}
+</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;
+	}
+}
+</style>

+ 147 - 56
pages/courseManage/live/index.vue → components/liveCourse.vue

@@ -5,17 +5,17 @@
 				<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>
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/finished.png" mode="aspectFill"></image>
 				</view>
 			</view> -->
 			<!-- <view class="x-bc">
@@ -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: {},
@@ -73,18 +86,13 @@
 						name: '训练营-营期',
 						value: 0,
 					},
-					// {
-					// 	name: '课程状态',
-					// 	value: 1,
-					// },
 				],
-				defaultIndex: [0, 0],
 				contentH: 0,
 				activeTab: 1,
 				courseList: [],
 				courseId: '',
 				searchbarNav: 0,
-				courserIndex: 0,
+				courserIndex: '',
 				searchbar: [{
 						name: '训练营-营期'
 					},
@@ -119,6 +127,21 @@
 				},
 				triggered: false,
 				loadStatus: 'loadmore',
+				//课程选择列表
+				pageNum:1,
+				pageSize: 10,
+				triggereds: false,
+				status: 'loadmore',
+				keyword:'',
+				isEnableds:true,
+				keywordlist:'',
+				actid:'',
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+				shareConfig:'',
+				titleName:''
 			}
 		},
 		mounted() {
@@ -128,37 +151,97 @@
 			this.getFsCourseList()
 		},
 		methods: {
+			handleShare(config) {
+			      // 保存分享配置到父页面数据
+			      this.shareConfig = config;
+				  this.$emit('child-data-update', this.shareConfig);
+			      // 调起分享面板(微信小程序需主动调用)
+			      // #ifdef MP-WEIXIN
+			      uni.showShareMenu();
+			      // #endif
+			  },
+			scroll: function(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.titleName=item.periodName
+				this.actid=item.periodId
 			},
 			confirm() {
-				this.courseId = this.courserIndex
-				console.log(this.courseId)
-				this.getFsCourseList()
+				this.courseId = this.actid
+				this.filterData[0].name=this.titleName
+				console.log(this.filterData[0].name)
+				this.params.pageNum=1
+				this.getListData('refresh')
+			},
+			searchKeyword(value){
+				this.courseList=[]
+				this.keyword = value
+				this.params.pageNum=1
+				this.getFsCourseList('refresh')
+			},
+			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 : '训练营-营期'
-							console.log(this.courseId)
-						// this.mescroll.resetUpScroll()
+						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.courseId=this.courseList[0].periodId
+						this.filterData[0].name=this.courseList[0].periodName
 						this.getListInit()
 					} else {
 						uni.showToast({
@@ -181,14 +264,15 @@
 				this.params.pageNum = 1
 				this.getListData('refresh')
 			},
-			async getListData(type = 'refresh') {
+			async getListData(type) {
+				console.log(type)
 				uni.showLoading({
 					title: "加载中..."
 				})
 				this.loadStatus = 'loading'
 				const result = await getCourseVdieoList({
-					courseId: this.courseId,
-					status: '',
+					periodId: this.courseId,
+					keyword:this.keywordlist,
 					...this.params
 				})
 				if (result) {
@@ -207,6 +291,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 +346,9 @@
 		color: #222;
 		display: flex;
 		flex-direction: column;
+		/* #ifdef MP-WEIXIN */
+		height: 100vh;
+		/* #endif */
 	}
 
 	.boxnav {
@@ -350,24 +445,20 @@
 			}
 		}
 	}
-
-	.coursebox {
-		position: relative;
-		overflow-y: auto;
-		box-sizing: border-box;
-	}
-
-	.courselist {
-		padding: 12px;
-		box-sizing: border-box;
-
-	}
-
+	// .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;
+		// padding-bottom: 80rpx;
 		.list {
 			padding: 10px;
 			box-sizing: border-box;

+ 444 - 0
components/living.vue

@@ -0,0 +1,444 @@
+<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="imgPath+'/app/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="imgPath+'/app/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="imgPath+'/app/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
+		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
+		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>

+ 254 - 0
components/newuser.vue

@@ -0,0 +1,254 @@
+<template>
+	<view  class="column">
+		<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 v-if="!usertoken" class="fs40 bold" @click="loginto" >
+							立即登录
+						</view>
+						<view class="username">{{user}}</view>
+					</view>
+				</view>
+			</view>
+			
+			<view class="company" v-if="user!=null">
+				<image :src="imgPath+'/app/images/icon_comp.png'"></image>
+				<view class="name">{{'暂无数据'}}</view>
+			</view>
+		</view>
+		<view class="p20">
+			<view class="menu-box" style="margin-top: -40rpx;">
+				<view class="title-box">
+					<image class="icon" :src="imgPath+'/app/manergevip/chang.png'"></image>
+					<view class="title">常用功能</view>
+				</view>
+				<view class="line"></view>
+				<view class="menus">
+					<view class="menu-item" @click="navTo()">
+						<image :src="imgPath+'/app/images/menu_info.png'"></image>
+						<view class="m-name">销售管理</view>
+					</view>
+			 	</view>
+			</view>
+		</view>
+		<view class="p20">
+			<view class="btn-box" v-if="usertoken">
+				<view class="sub-btn" @click="this.show=!this.show">退出登录</view>
+			</view>
+		</view>
+		<u-modal :show="show" @confirm="showLogout" :title="title" :content='content' :showCancelButton="true"
+		@cancel='this.show=!this.show'></u-modal>
+	</view>
+</template>
+
+<script>
+	import { getwxuser } from '@/api/user.js'
+	export default {
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				user:[],
+				show:false,
+				title:'提示',
+				content:'确认退出吗?',
+				usertoken:''
+			}
+		},
+		mounted() {
+			this.usertoken=uni.getStorageSync('AppToken_MYfby')
+			this.user=uni.getStorageSync('phoneNumber')
+		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
+		methods: {
+			loginto(){
+				uni.navigateTo({
+					url:'/pages/auth/wxlogin'
+				})
+			},
+			showLogout(){
+				uni.removeStorageSync('AppToken_MYfby')
+				// uni.removeStorageSync('AppToken_MYfby')
+				uni.navigateTo({
+					url:'/pages/auth/wxlogin'
+				})
+			},
+			navTo(url){
+				if(uni.getStorageSync('AppToken')){
+					uni.switchTab({
+						url:'/pages/index/index'
+					})
+				}else{
+					uni.navigateTo({
+						url:'/pages/auth/login'
+					})
+				}
+				
+			},
+		}
+	}
+</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{
+	background: linear-gradient(to bottom, #dae9ff, #e1e1fd);
+	    border-radius: 0px 0px 30px 30px;
+	padding: 30rpx;
+	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;
+		}
+	}
+}
+.btn-box{
+		margin: 30rpx 0rpx 30rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.sub-btn{
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			border: 1rpx solid #f8f8f8;
+			background: #FFFFFF;
+			width: 100%;
+			border-radius: 10rpx;
+			height: 88upx;
+			line-height: 88upx;
+			text-align: center;
+			font-size: 30upx;
+			font-family: PingFang SC;
+			color: #2979ff;
+		}
+	}
+</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.dictValue" 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) {
+				console.log(e)
+				this.qiweiuser = 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>

+ 133 - 74
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: 100%;">
 		<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,53 +15,49 @@
 							<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>
-									<image class="list-item-copy" src="@/static/images/copy_icon.png" mode="aspectFill"
-										@click="copyId(item.userId)">
+									<text class="list-item-name one-t single-line-ellipsis" 
+									style="width: fit-content;">{{item.nickname}}</text>
+									<image class="list-item-copy" :src="imgPath+'/app/images/copy_icon.png'" mode="aspectFill"
+										@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>
 						</view>
-						<image class="phone" src="@/static/manergevip/phone.png" mode="aspectFill"
+						<image class="phone" :src="imgPath+'/app/manergevip/phone.png'" mode="aspectFill"
 							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.repeatCompanyUserName?item.repeatCompanyUserName: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&&item.isRepeatFans!==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&&item.isRepeatFans!==1">改标签</view>
+							<view class="btn-box base-color-red base-bg-false bor-red"
+								@click="openModel('disable',item)" v-if="item.status==1&&item.isRepeatFans!==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&&item.isRepeatFans!==1">取消禁用</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: {
@@ -97,6 +107,11 @@
 			}
 
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
 		data() {
 			return {
 				checkList: [],
@@ -104,12 +119,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 +279,7 @@
 			},
 			morepage(item) {
 				uni.navigateTo({
-					url: '/pages/courseManage/vip/ManageDetail'
+					url: '/pages/courseManage/vip/ManageDetail?id='+item.userId
 				})
 				uni.setStorageSync('detailUser', item)
 			},
@@ -195,6 +288,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)
@@ -204,41 +299,6 @@
 			changeitem(index) {
 				this.$emit('changeItem', index) //传参
 			}
-			// api请求参考
-			/* v3写法  你改一下
-			type=refresh表示刷新
-			 	const getListData = async (type = 'refresh') => {
-			 		loadStatus.value = 'loading'//加载状态变成正在加载中  ‘loading’
-					// 开始请求接口
-			 		const result = await getDataFn({
-			 			...parmas,
-			 			...listParmas.value,
-			 		})
-			 		if (result) {
-			 			returnData.value = result.data
-			 			const {
-			 				last_page,//最后一页是第几页
-			 				data,
-			 			} = result.data
-						// 如果下拉  数据为第一页的
-			 			if (type == 'refresh') {
-			 				listData.value = data
-			 			} else {
-							// 否则是触底  数据等于当前页然后追加下一页的
-			 				listData.value = [...listData.value, ...data]
-			 			}
-						// 如果当前页》=最后一页  nomore  没有更多了
-			 			if (listParmas.value.page >= last_page) {
-			 				loadStatus.value = 'nomore';
-			 			} else {//不然就是还有下一页   loadmore加载更多
-			 				loadStatus.value = 'loadmore';
-			 			}
-			 		}
-			 	}
-			 
-			 
-			 */
-
 		}
 	}
 </script>
@@ -264,8 +324,8 @@
 		&-head {
 			.phone {
 				flex-shrink: 0;
-				width: 30px;
-				height: 30px;
+				width: 25px;
+				height: 25px;
 			}
 
 			&-l {
@@ -283,7 +343,7 @@
 
 		&-re {
 			font-size: 10px;
-			margin-top: 5px;
+			// margin-top: 5px;
 		}
 
 		&-desc {
@@ -308,9 +368,8 @@
 			flex-wrap: wrap;
 			color: #555;
 			padding-top: 5px;
-
 			view {
-				margin: 0 5px 5px 0;
+				margin: 0 5px 0 0;
 			}
 		}
 

+ 6 - 1
main.js

@@ -13,12 +13,17 @@ import {setData} from './utils/common.js'
 Vue.prototype.setData = setData;
 import {formatSeconds}from './utils/tools.js'
 Vue.prototype.$formatSeconds = formatSeconds;
-
+import {isLoginCourse,isLoginCourseqw} from './utils/common.js'
+Vue.prototype.$isLoginCourse = isLoginCourse
+Vue.prototype.$isLoginCourseqw = isLoginCourseqw
+import store from './router/router.js' // 确保路径正确
+Vue.prototype.$store = store;
 //import router from '@/router/router.js'  
 //import {RouterMount} from 'uni-simple-router'
 
 App.mpType = 'app'
 const app = new Vue({
+	store,
     ...App
 })
 //RouterMount(app,router,'#app')

+ 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" : "wxb9b453d37c5fad45",
         "setting" : {
             "urlCheck" : true
         },
@@ -137,6 +137,9 @@
     "locale" : "zh-Hans",
     "fallbackLocale" : "zh-Hans",
     "h5" : {
+        "devServer" : {
+            "disableHostCheck" : true
+        },
         "router" : {
             "mode" : "hash",
             "base" : "./"

+ 283 - 190
pages.json

@@ -26,10 +26,23 @@
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"navigationBarTitleText": "首页",
-                "enablePullDownRefresh": false
+				"navigationBarTextStyle": "white",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path": "pages/index/h5",
+			"style": {
+				"navigationBarTextStyle": "white",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
 			}
 		}
         ,{
@@ -37,8 +50,11 @@
             "style" :                                                                                    
             {
 				"navigationBarTextStyle": "white",
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom",
+                "app-plus": {
+                	"bounce": "none"
+                }
             }
             
         }
@@ -48,8 +64,12 @@
             {
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
-                "navigationBarTitleText": "客户",
-                "enablePullDownRefresh": false
+                "navigationBarTitleText": "会员数据",
+                "enablePullDownRefresh": false,
+				// "navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
             }
             
         }
@@ -63,17 +83,6 @@
 		        "enablePullDownRefresh": false
 		    }
 		    
-		}
-		,{
-		    "path" : "pages/user/ai/index",
-		    "style" :                                                                                    
-		    {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-		        "navigationBarTitleText": "AI智能客服",
-		        "enablePullDownRefresh": false
-		    }
-		    
 		}
 		,{
 		    "path" : "pages/user/about",
@@ -82,7 +91,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 +121,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 +142,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 +159,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 +189,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 +235,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 +273,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 +306,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 +326,12 @@
 				"navigationBarBackgroundColor": "#ffffff",
 				"navigationBarTextStyle": "black",
 				"enablePullDownRefresh": false,
+				// #ifdef H5
 				"navigationStyle": "custom",
+				// #endif
+				// #ifndef H5
+				"navigationStyle": "default",
+				// #endif
 				"app-plus": {
 					"bounce": "none"
 				}
@@ -405,54 +365,187 @@
 			}
 		},
 		{
-			"path" : "pages/courseManage/course/living",
+			"path" : "pages/courseManage/manage/manageIndex",
 			"style" : 
 			{
-				"navigationBarTitleText" : ""
+				"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" : "登录",
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/enterprise/enterprise",
+			"style" : 
+			{
+				"navigationBarTitleText" : "",
+				"navigationStyle": "custom"
 			}
 		}
-		 
     ],
+	"subPackages": [
+		{
+			"root": "pages_course",
+			"pages": [
+				{
+					"path": "videovip",//会员看课
+					"style": {
+						"navigationBarTitleText": "看课",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "video",//企微看课
+					"style": {
+						"navigationBarTitleText": "看课",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "reward",
+					"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": "管理"
 			}
 		]
 	}

+ 45 - 14
pages/auth/login.vue

@@ -3,7 +3,7 @@
 		 <view class="content flex-1" >
 			 <view class="login pt14">
 				<view class="head">
-					 <image src="/static/logo.png" ></image>
+					 <image :src="imgPath+'/app/image/logo.png'" ></image>
 					 <p class="title">销售管理端</p>
 					 <p class="desc">客户沟通更智能</p>
 				</view>
@@ -12,14 +12,14 @@
 						 <!-- <text>帐号</text> -->
 						 <view class="input-account">
 							 <input v-model="account"
-							  placeholder="请输入帐号" type="text" ></input>
+							  placeholder="请输入帐号/手机号" type="text" ></input>
 						 </view>
 					 </view> 
 					 <view class="login-item">
 						 <!-- <text>密码</text> -->
 						 <view class="input-pwd">
 							 <input v-model="password" 
-							  placeholder="请输入密码" type="password" ></input>
+							  placeholder="请输入密码" password type="text"></input>
 						 </view>
 					 </view> 
 					 <view class="btns">
@@ -28,10 +28,7 @@
 				</view>
 			 </view>
 		 </view>
-		 <!-- <view class="footer" >
-			 <p>版权所有 @2024</p>
-		 </view> -->
-		 
+		 <view class="footer-tips">重庆云联融智提供技术支持</view>
 	</view>
 </template>
 
@@ -45,11 +42,36 @@ export default {
 			password:"",
 		}
 	},
-	onLoad(option) 
-	{
+	computed: {
+	    imgPath() {
+	      // 处理空值,返回默认路径或空字符串
+	      // if (!this.$store.state.imgpath) {
+	      //   return '' // 本地默认图
+	      // }
+	      return this.$store.state.imgpath
+	    }
+	  },
+	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();
+		// 	}
+		// })
+		console.log(this.$store.state.imgpath+'/app/images/card_icon.png')
 	},
 	methods: {
 	    login(){
@@ -84,7 +106,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
 						})
@@ -110,6 +133,14 @@ export default {
 page{
  	background-color: #ffffff;
 }
+.footer-tips {
+			margin-top: 14rpx;
+			text-align: center;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 12px;
+			color: #bbb;
+		}
 .content{
 	 background-color: #ffffff;
 	 display: flex;
@@ -191,14 +222,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);
 				}
 			}
 			

+ 578 - 0
pages/auth/wxlogin.vue

@@ -0,0 +1,578 @@
+<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="imgPath+'/app/image/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,
+			companyId:null
+		}
+	},
+	computed: {
+	    imgPath() {
+	      return this.$store.state.imgpath
+	    }
+	},
+	onLoad(option) {
+		this.companyId=option.companyId
+		// #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="wxb9b453d37c5fad45";
+			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:'/pages/index/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_MYfby',res.token);
+								uni.setStorageSync('userInfo',JSON.stringify(res.user));
+								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,
+				});
+			})
+		},
+		// 微信用户手机号登录
+		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_MYfby',res.token);
+									uni.setStorageSync('nickName',res.nickName);
+									uni.setStorageSync('phoneNumber',res.phoneNumber);
+									uni.hideLoading()
+									//that.getUserInfo()
+									uni.$emit('refreshLogin');
+									// if(this.companyId==null){
+									// 	uni.navigateTo({
+									// 		url:'/pages/enterprise/enterprise'
+									// 	})
+									// }else{
+										
+									// }
+									uni.navigateTo({
+											url:'/pages/enterprise/enterprise'
+										})
+									// uni.navigateBack({
+									// 	delta:1
+									// })
+									
+								}
+								else{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "授权登录失败,请重新登录",
+									});
+								}
+							   
+							 })
+							 .catch(error => {
+								console.log(error)
+								uni.hideLoading();
+								uni.showToast({
+									icon:'none',
+									title: "登录接口调用失败",
+								});
+							 })
+							 
+						}
+					})
+				})
+				.catch(err => {
+					uni.showToast({
+						icon:'none',
+						title: err,
+					});
+				})
+				 
+			} else {
+				uni.showToast({
+					title: '已拒绝授权',
+					icon: 'none',
+					duration: 2000,
+				})
+			}
+		},
+		back() {
+			uni.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>

+ 63 - 6
pages/common/launch.vue

@@ -1,11 +1,13 @@
 <template>
 	<view class="content">
-		 
+		 <view class="loadding" v-if="loadding==true">
+		 	<image :src="imgPath+'/app/image/logo.png'"></image>
+		 	<text class="text">{{name}}</text>
+		 </view>
 	</view>
 </template>
 
 <script>
-	import { getConfigSignature } from '@/api/qw.js'
 	export default {
 		data() {
 			return {
@@ -14,24 +16,56 @@
 				qwUserId: null,
 				currentPath: null,
 				baseUrl:uni.getStorageSync('requestPath')
-				
 			};
 		},
+		computed: {
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+			name() {
+			  return this.$store.state.logoname
+			},
+		  },
 		onShow() {
 			// this.getUserId();
 			this.navigatHandler();
 		},
 		methods: {
 			navigatHandler() {
+				// // #ifdef MP-WEIXIN
+				// uni.reLaunch({
+				// 	url: '/pages/auth/wxlogin',
+				// })
+				// // #endif
+				// #ifdef MP-WEIXIN
+				console.log('现在')
+				if(uni.getStorageSync('AppToken')){
+					uni.reLaunch({
+						url: '/pages/index/index',
+					})
+				}else{
+					uni.reLaunch({
+						url: '/pages/enterprise/enterprise',
+					})
+				}
+				
+				// #endif
+				// #ifdef H5
 				if (!this.utils.isLogin()) {
+					// #ifdef H5
 					uni.reLaunch({
-						url: '../auth/login',
+						url: '/pages/auth/login',
 					})
+					// #endif
+					
 				} else {
+					// #ifdef H5
 					uni.reLaunch({
-						url: '../user/index',
+						url: '/pages/index/index',
 					})
+					// #endif
 				}
+				// #endif
 			},
 			getUserId() {
 				const urlParams = new URLSearchParams(window.location.search);
@@ -110,7 +144,7 @@
 	};
  
 </script>
-<style>
+<style lang="scss">
 	page{
 		background-color: #fff;
 	}
@@ -119,5 +153,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>

+ 148 - 0
pages/course/course.vue

@@ -0,0 +1,148 @@
+<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>
+		<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare">
+			<view class="sharePop x-ac">
+				<!--#ifdef MP-WEIXIN-->
+				<view class="sharePop-item y-f card-share">
+					<image :src="imgPath+'/app/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">分享课程</button>
+				</view>
+				<!--#endif-->
+			</view>
+		</u-popup>
+	</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: [],
+				showShare: false
+			}
+		},
+		onLoad() {
+			wx.showShareMenu({
+				withShareTicket: true, // 支持群聊分享带shareTicket
+				menus: ['shareAppMessage'] // 同时启用两种分享
+			})
+			console.log(this.$store.state.imgpath+'/app/images/card_icon.png')
+		},
+		computed: {
+			    imgPath() {
+			      return this.$store.state.imgpath
+			    }
+			  },
+		mounted() {},
+		onShareAppMessage() {
+			return {
+				title: this.childdata.title, // 分享卡片标题
+				path: this.childdata.path + "?course=" + JSON.stringify(this.childdata.params), // 目标页面路径
+				// 携带参数:将当前页面的数据拼接到路径中
+				imageUrl: this.childdata.img, // 分享卡片封面图(可选)
+				success: (res) => {
+					console.log("分享成功", res);
+				},
+				fail: (err) => {
+					console.log("分享失败", err);
+				},
+			}
+		},
+		methods: {
+			closeShare() {
+				this.showShare = false
+				// console.log('open');
+			},
+			handleParentMethod() {
+				// uni.showToast({ title: '父组件方法被调用' });
+				/* if (!this.childdata || Object.keys(this.childdata).length === 0) {
+					uni.showToast({
+						title: '数据未准备好,无法分享',
+						icon: 'none'
+					});
+					return;
+				}
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.showShare = this.childdata.onshow
+					}, 200)
+				}) */
+
+
+			},
+			onChildDataUpdate(data) {
+				this.childdata = data
+				this.showShare = this.childdata.onshow
+				console.log(this.childdata);
+				console.log('父组件', this.childdata.path + "?course=" +JSON.stringify(this.childdata.params) )
+			},
+
+			sectionChange(index) {
+				this.current = index
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.card-share{
+		position: relative;
+	}
+	.share{
+			display: inline-block;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			opacity: 0;
+		}
+	.sharePop {
+		background-color: #fff;
+		padding: 30rpx 0;
+		border-radius: 20px 20px 0 0;
+		/* #ifdef MP-WEIXIN */
+		/* #endif */
+
+		/* #ifdef H5 */
+		padding-bottom: 60px;
+
+		/* #endif */
+		&-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;
+			}
+		}
+	}
+</style>

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

@@ -0,0 +1,210 @@
+<template>
+	<view class="centerV hb base-bg-f">
+		<image :src="imgPath+'/app/image/logo.png'" mode="aspectFit" class="w400"></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="imgPath+'/app/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:''
+			}
+		},
+		computed: {
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+		  },
+		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('https://fbylive.obs.cn-southwest-2.myhuaweicloud.com:443/app/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>

+ 7 - 13
pages/courseManage/course/becomeVip.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="centerV hb base-bg-f">
 		<view class="w100 centerV" v-if="isH5vip!=true">
-			<image src="@/static/image/becomevip.png" class="h193 w193 mb40"></image>
+			<image :src="imgPath+'/app/image/becomevip.png'" class="h193 w193 mb40"></image>
 			<view class="bold">是否申请成为会员</view>
 			<view class="justify-center w100 mt40 mb40">
 				<view class="quxiao">取消</view>
@@ -11,7 +11,7 @@
 		<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>
+				<image :src="imgPath+'/app/manergevip/becomeTrue.png'" class="h400 w400"></image>
 				<view class="bold fs50 center mt80">{{tips}}!</view>
 			</view>
 		</u-popup>
@@ -42,23 +42,17 @@
 				becomeuser:{}
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
 		onLoad(option) {
 			if (option && option.user) {
 				// console.log('分享链接进入',option)
 				this.becomeuser = JSON.parse(option.user)
 				this.companyId = this.becomeuser.companyId
 				this.companyUserId = this.becomeuser.companyUserId
-				// console.log('分享链接进入',this.becomeuser)
-				// if(uni.getStorageSync("isH5vip")==true){
-				// 	this.becomeVipfun()
-				// }else{
-				// 	setTimeout(() => {
-				// 		this.getWechatCode()
-				// 		this.userId=this.user.userId
-				// 		console.log(this.userId)
-				// 	}, 200)
-				// }
-				
 			} else {
 				this.companyId = option.companyId
 				this.userId = option.userId

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

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

@@ -1,47 +1,168 @@
 <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="imgPath+'/app/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()
+		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		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>

+ 180 - 138
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">
+						<image class="w40 h40" :src="imgPath+'/app/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.periodId?'actNav':''" class="m10 p10 center"
+								style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.periodId)">
+								{{item.periodName}}
+							</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,15 +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="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)"
-										src="@/static/images/copy_icon.png" mode="aspectFill">
+									<image class="w40 h40" @click="copyCourseId(item.courseName)"
+										:src="imgPath+'/app/images/copy_icon.png'" mode="aspectFill">
 								</view>
 							</view>
 							<view class="fs24 base-color-6 column">
@@ -95,42 +111,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 +155,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 +170,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 +199,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,15 +230,15 @@
 						<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>
+							<image :src="imgPath+'/app/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}}
+										{{courseCount.redPacketAmount}}
 									</text>元
 								</view>
 							</view>
@@ -218,37 +249,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 +295,7 @@
 				list1: [{
 					name: '课程分析'
 				}, {
-					name: '群管数据'
+					name: '销售数据'
 				}],
 				filterData: [{
 						name: '训练营-营期',
@@ -315,8 +346,7 @@
 				pageNums: 1,
 				pageSizes: 5,
 				redprice: '',
-				companyUserCount: 0,
-				companyUserUserCount: 0,
+				companyUserCount: [],
 				redbaglist: [],
 				courseCount: [],
 				answerlist: [],
@@ -327,40 +357,85 @@
 				pageNum: 1,
 				pageSize: 3,
 				grouplist: [],
-				selnum: 0
+				selnum: 0,
+				keyword:'',
+				triggeredC: false,
+				statusC: 'loadmore',
+				isEnabledC: true,
+				pageNumC: 1,
+				pageSizeC: 10,
+				keywordC:'',
 			}
 		},
 		onLoad(option) {
 			this.groupid = option.id
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		mounted() {
 			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 +444,7 @@
 			},
 			getgroupdetail() {
 				const param = {
-					userId: this.groupid
+					companyUserId : this.groupid
 				}
 				getGroupDetail(param).then(res => {
 					this.grouplist = res.data
@@ -379,7 +454,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 +498,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 +529,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 +547,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 +593,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 +629,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 +656,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 +683,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 +709,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

+ 43 - 27
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'
@@ -42,39 +42,46 @@
 						<view class="ml20" @click.passive.stop>
 							<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">
+								<image class="w40 h40" :src="imgPath+'/app/images/copy_icon.png'" 
+								@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,10 +94,10 @@
 	
 				</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">
+		<!-- <image class="invite-member" :src="imgPath+'/app/images/invite-member-icon.png'" mode="aspectFill" @click="vipInvite">
 		</image> -->
 		<!-- 不要写在v-for里面 点击存到data里面-->
 		<view class="">
@@ -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,12 @@
 		mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.getredlist()
-			this.getuserbalancelist()
+			// this.getuserbalancelist()
+		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
 		},
 		methods: {
 			showmoreA(data){
@@ -219,7 +233,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 +243,7 @@
 							icon: 'none',
 							title: "修改成功"
 						})
+						this.getredlist('refresh')
 					}else{
 						uni.showToast({
 							icon: 'none',
@@ -270,8 +285,6 @@
 				this.showlist=false
 				setTimeout(()=>{
 					this.showmore=false
-					this.getredlist()
-					console.log(this.getredlist())
 				},200)
 			},
 			copyId(id) {
@@ -336,7 +349,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 +441,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 {

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

@@ -67,7 +67,7 @@
 				<view class="bgf m20 p20 radius16" v-for="(item,index) in userlist" :key="index">
 					<view class="justify-between align-center">
 						<view class="justify-start align-center">
-							<image src="../../../static/manergevip/book.png" class="w80 h80"></image>
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/book.png" class="w80 h80"></image>
 							<view class="fs36 bold ml20">课程答题红包</view>
 							<view class="fs28 ml8 base-color-6">归属</view>
 						</view>
@@ -78,7 +78,7 @@
 						<view class="ml20">
 							<view class="justify-start align-center">
 								<text class="fs28 bold">{{item.nickName}}</text>
-								<image class="w40 h40" src="@/static/images/copy_icon.png" mode="aspectFill">
+								<image class="w40 h40" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/copy_icon.png" mode="aspectFill">
 							</view>
 							<view class="fs24 base-color-6">
 								<text>--</text>
@@ -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

+ 150 - 132
pages/courseManage/operation/index.vue

@@ -4,30 +4,37 @@
 			<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>
+				<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+				<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+				<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/finished.png" mode="aspectFill"></image>
 			</view>
 		</view> -->
 		<view>
 			<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.periodId?'actNav':''" class="m10 p10 center"
+									style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.periodId)">
+									{{item.periodName}}
+								</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>
+								<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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

+ 99 - 103
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>
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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,40 +72,45 @@
 							<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>
 							<view class="redenvelope x-bc">
 								<view class="x-f">
-									<image src="@/static/images/redenvelope.png" mode="aspectFill"></image>
+									<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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,18 +118,23 @@
 			<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"
 							: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 == 3">
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon2.png" mode="aspectFill" v-if="searchTypeIndex == 3">
 							</image>
-							<image src="@/static/images/order_icon.png" mode="aspectFill" v-else></image>
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon.png" mode="aspectFill" v-else></image>
 							<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
 								{{typeoption[searchTypeIndex]}}
 							</picker>
@@ -135,19 +151,19 @@
 									<view class="list-item-head-l">
 										<view style="flex: 1;overflow: hidden;display: flex;">
 											<text class="list-item-name one-t">{{item.nickName}}</text>
-											<image class="list-item-copy" src="@/static/images/copy_icon.png"
+											<image class="list-item-copy" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/copy_icon.png"
 												mode="aspectFill"></image>
 										</view>
 										<view class="list-item-re">
 											注册时间:{{item.createTime?item.createTime.substring(0,10):'--'}}</view>
 									</view>
 								</view>
-								<image class="phone" src="@/static/manergevip/phone.png" mode="aspectFill"></image>
+								<image class="phone" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/phone.png" mode="aspectFill"></image>
 							</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,
@@ -288,7 +302,7 @@
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					textNoMore: "已经到底了",
 					empty: {
-						icon: '/static/images/empty.png',
+						icon: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/empty.png',
 						tip: '暂无数据'
 					}
 				},
@@ -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: "";

+ 66 - 84
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,38 +52,38 @@
 						<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>
 				</u-collapse-item>
 			</u-collapse>
 			<view class="justify-start align-center base-bg-f8 mlr30 radius12 plr20 ptb20">
-				<u-image src="@/static/manergevip/book.png" width="30" height="30"></u-image>
+				<u-image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/book.png" width="30" height="30"></u-image>
 				<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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1393 - 47
pages/customer/index.vue


+ 111 - 0
pages/enterprise/enterprise.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="column" style="height: 100%;position: relative;">
+		<enterpriseimgs v-if="actindex==0"></enterpriseimgs>
+		<newuser v-else></newuser>
+		<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>
+	</view>
+</template>
+
+<script>
+	import{getenterprise} from '@/api/courseManage.js'
+	import enterpriseimgs from '@/components/enterpriseimg.vue'
+	import newuser from '@/components/newuser.vue'
+	export default {
+		components: {
+			enterpriseimgs,
+			newuser
+		},
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				enterpriseimg:'',
+				actindex:0,
+				tabbarList : [{
+						iconPath: '/static/manageTabIcon/training.png',
+						selectedIconPath: '/static/manageTabIcon/training_on.png',
+						Text: '企业理念',
+						val:0
+					},
+					{
+						iconPath:  '/static/manageTabIcon/manage.png',
+						selectedIconPath:  '/static/manageTabIcon/manage_on.png',
+						Text: '我的',
+						val:1
+					},
+				]
+			}
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.$store.state.logoname,
+				path: '/pages/enterprise/enterprise',
+				imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.$store.state.logoname,
+				imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		methods: {
+			switchTabs(item) {
+				this.actindex=item.val
+				console.log(item)
+			},
+		}
+	}
+</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;
+	}
+}
+.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>

+ 40 - 0
pages/index/h5.vue

@@ -0,0 +1,40 @@
+<template>
+	<view class="content">
+		 <web-view :src="url"></web-view>
+	</view>
+</template>
+
+<script>
+ 
+ export default {
+ 	data() {
+ 		return {
+			url:"",
+ 		}
+ 	},
+	onLoad(val) {
+		this.url=uni.getStorageSync('url');
+		console.log(this.url)
+	}
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.content{
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	
+}
+ 
+
+</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('漏斗',this.getrateimg)
+					} 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>
+		<userUrgeCourse  v-if="current==0"></userUrgeCourse>
+		<qiweiUrgeCourse v-else></qiweiUrgeCourse>
+	</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>

+ 10 - 5
pages/user/about.vue

@@ -1,16 +1,16 @@
 <template>
 	<view class="content">
 		<view class="logo">
-			<image src="/static/logo.png"></image>
+			<image :src="imgPath+'/app/image/logo.png'"></image>
 			<p>企微聊天工具</p>
 		</view>
 		<view class="set-box">
-			<view class="item" @click="callPhone()">
+			<!-- <view class="item" @click="callPhone()">
 				<view class="left">
 					<text class="text">联系我们</text>
 				</view>
-				<image class="right" src="/static/images/right_arrow.png" mode="aspectFill"></image>
-			</view>
+				<image class="right" :src="imgPath+'/app/images/right_arrow.png'" mode="aspectFill"></image>
+			</view> -->
 			<view style="height: 1px;background-color: #F7F7F7;"></view>
 			<view class="item">
 				<view class="left">
@@ -30,7 +30,7 @@
  	data() {
  		return {
 			tel:undefined,
-			version:"1.0"
+			version:"1.0.0"
  		}
  	},
 	onLoad() {
@@ -38,6 +38,11 @@
 		// that.version = widgetinfo.version
 		
 	},
+	computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
  	methods: {
 		callPhone(){
 			uni.makePhoneCall({

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

+ 13 - 12
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">
@@ -54,8 +55,8 @@
 	</view>
 	
 
-</template>
-
+</template>
+
 <script>
 	import {setPwd,setHeadImg,setUserInfo,getCompanyUser} from '@/api/user.js';
 	export default {
@@ -68,7 +69,7 @@
 				email:"",
 				sexPicker: ['男', '女','未知'],
 				sex: 0, // 性别
-				headImg: '/static/images/detault_head.jpg', // 头像,
+				headImg: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/detault_head.jpg', // 头像,
 				headImgUrl:'',
 			}
 		},
@@ -94,7 +95,7 @@
 				var that=this;
 				getCompanyUser(data).then(
 					res => {
-						that.bindUser(res.data);
+						that.bindUser(res.user);
 						
 					},
 					rej => {}
@@ -113,7 +114,7 @@
 					success: (res) => {
 						//this.headImg = res.tempFilePaths[0]
 						uni.uploadFile({
-							url: uni.getStorageSync('requestPath')+'/app/common/upload', //仅为示例,非真实的接口地址
+							url: uni.getStorageSync('requestPath')+'/companyapp/app/common/upload', //仅为示例,非真实的接口地址
 							filePath: res.tempFilePaths[0],
 							name: 'file',
 							formData: {
@@ -183,10 +184,10 @@
 			}
 			
 		}
-	}
-</script>
-
-
+	}
+</script>
+
+
 <style scoped lang="scss">
 	.content{
 		padding-top: 20rpx;
@@ -289,5 +290,5 @@
 			background: #115296;
 			border-radius: 44upx;
 		}
-	}
-</style>
+	}
+</style>

+ 152 - 168
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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/changeLable.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>
-			</view> -->
+			 	</view>
+			</view>
 			<view class="menu-box">
 				<view class="title-box">
-					<image class="icon" src="../../static/manergevip/qita.png"></image>
+					<image class="icon" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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,22 +75,27 @@
 		<!-- 分享弹窗 -->
 		<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare" @open="openShare">
 			<view class="sharePop x-ac">
+				<!--#ifdef MP-WEIXIN-->
 				<view class="sharePop-item y-f" @click="shareimg">
-					<image src="@/static/images/card_icon.png" mode="aspectFill"
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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">分享课程</button>
 				</view>
-				<view class="sharePop-item y-f" @click="buildimg">
-					<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
+				<!--#endif-->
+				<!-- <view class="sharePop-item y-f" @click="buildimg">
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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">
-					<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
+				</view> -->
+				<!--#ifdef H5-->
+				<view class="sharePop-item y-f" @click="shareSale">
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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>
+				<!--#endif-->
 			</view>
 		</u-popup>
 		<!-- 长按保存海报 -->
@@ -185,13 +105,13 @@
 			</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>
+					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/downicon.png' class="w80 h80"></image>
 					<view class="mt10">长按图片保存</view>
 				</view>
 			</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,17 +119,17 @@
 					<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">
 				<view class="imgshe" >
-					<image src='@/static/image/point.png' class="w300 h300"></image>
+					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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"
+					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/wxmore.png"
 					class="w50 h50 mlr10"></image>
 					</view>
 					<view class="mt20">选择 “转发给朋友”</view>
@@ -218,9 +138,9 @@
 			</view>
 		</u-overlay>
 		<u-modal :show="show" title="提示" :showCancelButton="true"  @cancel="hideLogout()" @confirm="logout()" content='确认退出吗?'></u-modal>
-	</view>
-</template>
-
+	</view>
+</template>
+
 <script>
 	
 	import { getCompanyUser } from '@/api/user.js'
@@ -233,7 +153,7 @@
 	} from '@/api/courseManage'
 	import wx from 'weixin-js-sdk'
 	export default {
-		data() {
+		data() {
 			return {
 				show:false,
 				user:null,
@@ -244,14 +164,54 @@
 				setImg:false,
 				codeLink:'',
 				showzhidao:false,
-				imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
-			}
+				imgs:this.$store.state.imgpath+'/app/image/logo.png'
+			}
 		},
 		onShow() {
-			this.getCompanyUser()
-		
-		},
+			this.getCompanyUsers()
+		},
+		onShareAppMessage() {
+			return {
+				title: this.$store.state.logoname+'小程序的'+this.user.nickName+'邀请您成为销售', // 分享卡片标题
+				path: '/pages/courseManage/course/becomeSale?id='+this.user.companyId, // 目标页面路径
+				// 携带参数:将当前页面的数据拼接到路径中
+				imageUrl: this.user.avatar || this.imgs, // 分享卡片封面图(可选)
+				success: (res) => {
+					console.log("分享成功", res);
+				},
+				fail: (err) => {
+					console.log("分享失败", err);
+				},
+			}
+		},
+		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 +231,7 @@
 			shareimg(){
 				//分享好友
 				let self = this
-				// 配置--你到时候把配置全局 --就是这些东西  调接口拿
+				// 配置--配置全局 
 				wx.ready(function() { //需在用户可能点击分享按钮前就先调用
 					wx.updateAppMessageShareData({
 						title: self.user.userName+"邀请您成为群管", // 分享标题
@@ -290,7 +250,7 @@
 							}); 
 						},
 						fail: function(err) {
-							console.log(err);
+							// console.log(err);
 							uni.showToast({
 								title: '卡片生成失败,请重试',
 								icon: 'none',
@@ -302,8 +262,8 @@
 			},
 			handleShare() {
 				this.showShare = true
-				this.getjssdklist()
-				this.getlink('preload'); // 提前加载链接
+				// this.getjssdklist()
+				// this.getlink('preload'); // 提前加载链接
 			},
 			//设置链接时长
 			confirmTime() {
@@ -335,7 +295,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 +319,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 +349,9 @@
 			},
 			closeShare() {
 				this.showShare = false
-				// console.log('open');
 			},
 			openShare() {
 				// this.showShare = false
-				// console.log('close');
 			},
 			showLogout(){
 				this.show=true;
@@ -401,36 +360,45 @@
 				this.show=false;	
 			},
 			logout(){
-				this.utils.logout();
-				uni.$emit('closeWebSocket');
-				uni.reLaunch({
-					url: '/pages/auth/login',
-					animationType: 'pop-in',
-					animationDuration: 100
+				uni.removeStorageSync('AppToken')
+				// 条件编译判断平台,设置不同登录页路径
+				 let loginPage = '';
+				 // #ifdef H5
+				 loginPage = '/pages/auth/login';
+				 // #endif
+				 // #ifdef MP-WEIXIN
+				 loginPage = '/pages/auth/login';
+				 // #endif
+				uni.navigateTo({
+					url: loginPage,
 				})
 			},
 			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{
 						
 					}
 				});
 			},
-		}
-	}
-</script>
-
+		}
+	}
+</script>
+
 <style lang="scss">
 	page{
 		height: 100%;
@@ -438,6 +406,23 @@
 	}
 </style>
 <style scoped lang="scss">
+	.share{
+			display: inline-block;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			opacity: 0;
+		}
+	.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 +462,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 +509,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;
 							}
 						}
 					}
@@ -649,7 +634,7 @@
 				}
 			}
 		}
-	}
+	}
 	.btn-box{
 		margin: 30rpx 0rpx 30rpx;
 		display: flex;
@@ -665,13 +650,12 @@
 			text-align: center;
 			font-size: 30upx;
 			font-family: PingFang SC;
-			color: #111;
+			color: #2979ff;
 		}
 	}
 	.sharePop {
 		background-color: #fff;
-		padding: 50px 0;
-		padding-bottom: 100px;
+		padding: 20px 0;
 		border-radius: 20px 20px 0 0;
 	
 		&-item {
@@ -688,5 +672,5 @@
 				margin-bottom: 10px;
 			}
 		}
-	}
-</style>
+	}
+</style>

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

+ 16 - 14
pages/user/userInfo.vue

@@ -3,20 +3,20 @@
 		<!-- 个人信息 -->
 		<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>
 						<text class="title">{{phonenumber}}</text>
 					</view>
 				</view>
-				<image   class="right"  src="../../static/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
+				<image   class="right"  src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
 			</view>
 			<!-- 公司 -->
 			<view class="comp-info">
-				<image class="img" src="../../static/images/icon_comp_white.png" mode="aspectFill"></image>
+				<image class="img" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_comp_white.png" mode="aspectFill"></image>
 				<text class="text">{{deptName}}</text>
 			</view>
 		</view>
@@ -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>
@@ -58,7 +57,7 @@
 	export default {
 		data() {
 			return {
-				avatar:"/static/images/detault_head.jpg", 
+				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/detault_head.jpg", 
 				nickName:"",
 				deptName:"",
 				postNames:"",
@@ -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;
 					}
 				}
 			}

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

@@ -0,0 +1,348 @@
+<template>
+	<view class="content hb column justify-center align-center bgf">
+		<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/becomevip.png" mode="widthFix"></image>
+		<view class="bold">成为会员,享受更多权益</view>
+		<!--#ifdef H5-->
+		<view class="sure" @click="registerCourse">{{isVip==1?'您已成为会员':viptext}}</view>
+		<!--#endif-->
+		<!--#ifdef MP-WEIXIN-->
+		<view class="btns">
+			<button
+				class="author-btn"
+				open-type="getPhoneNumber"
+				@getphonenumber="phoneLogin"  >{{isVip==1?'您已成为会员':'申请成为会员'}}</button>
+			<button class="author-btn" v-if="isVip==1 || isbecomevip==1" @click="handleAgree()">{{viptext}}</button>
+		</view>
+		<!--#endif-->
+		<view class="footer-tips">重庆云联融智提供技术支持</view>
+	</view>
+</template>
+
+<script>
+	import { loginByMp,registerCourses,loginByMiniApp} from '@/api/user'
+	export default {
+		data() {
+			return {
+				isVip: 0,
+				isWechat: false,
+				isLogin: false,
+				companyid:'',
+				companyUserId:'',
+				userInfo:{},
+				tagIds:[],
+				isbecomevip:0,
+				viptext:'申请成为会员'
+			}
+		},
+		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')) || {};
+			//#ifdef MP-WEIXIN
+			let obj=uni.getStorageSync('AppToken_MYfby');
+			//#endif
+			// #ifdef H5
+			let obj=uni.getStorageSync('TOKEN_KEY');
+			// #endif
+			// 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
+				// #ifdef H5
+				if(this.code&&!this.isLogin) {
+					this.loginByMp()
+				}
+				// #endif
+		},
+		onShow() {
+			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.userInfo = {}
+			}
+			//#ifdef MP-WEIXIN
+			let obj=uni.getStorageSync('AppToken_MYfby');
+			//#endif
+			// #ifdef H5
+			let obj=uni.getStorageSync('TOKEN_KEY');
+			// #endif
+			this.isLogin = !!obj;
+			if(this.isLogin&&this.isVip!=1) {
+				this.registerCourse()
+			}
+			
+		},
+		methods: {
+			handleAgree(){
+				if(this.isVip==1){
+					uni.showToast({
+						title: '您已成为会员!',
+						icon: 'none',
+						duration: 2000,
+					})
+				}else{
+					uni.showToast({
+						title: this.viptext,
+						icon: 'none',
+						duration: 2000,
+					})
+				}
+				
+			},
+			// 微信用户手机号登录
+			phoneLogin(e) {
+				var that=this;
+				uni.showLoading({
+					title:"处理中..."
+				})
+					if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+						this.utils.getProvider()
+						.then(provider => {
+							if (!provider) {
+							  reject()
+							}
+							// uni登录
+							uni.login({
+								provider: provider,
+								success: async loginRes => {
+									console.log(loginRes)
+									let code = loginRes.code // 获取开发code
+									loginByMiniApp({
+									   encryptedData: e.mp.detail.encryptedData,
+									   iv: e.mp.detail.iv,
+									   code: code,
+									})
+									.then( res => {
+										if(res.code==200){
+											console.log(res)
+											uni.hideLoading();
+											uni.showToast({
+												icon:'none',
+												title: "登录成功",
+											});
+											uni.setStorageSync('AppToken_MYfby', res.token);
+											uni.setStorageSync('userInfo', JSON.stringify(res.user));
+											this.userInfo=res.user;
+											uni.hideLoading()
+											this.isLogin = true
+											setTimeout(()=>{
+												this.registerCourse()
+											},200)
+										}
+										else{
+											uni.hideLoading();
+											uni.showToast({
+												icon:'none',
+												title: "授权登录失败,请重新登录",
+											});
+										}
+									   
+									 })
+								}
+							})
+						})
+						.catch(err => {
+							uni.showToast({
+								icon:'none',
+								title: err,
+							});
+						})
+						 
+					} else {
+						uni.showToast({
+							title: '已拒绝授权',
+							icon: 'none',
+							duration: 2000,
+						})
+					}
+			},
+			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('TOKEN_KEY', 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
+							this.isbecomevip=1
+							this.viptext='您已成为会员'
+							uni.showToast({
+								title: '您已成为会员,',
+								icon:'none'
+							})
+						} else {
+							this.isbecomevip=1
+							console.log(this.isbecomevip)
+							this.viptext=res.msg
+							uni.showToast({
+								icon:'none',
+								title: res.msg
+							})
+						}
+					})
+				} else {
+					// #ifdef H5
+					this.getWechatCode()
+					// #endif
+					
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.footer-tips {
+			// margin-top: 14rpx;
+			position: fixed;
+			width: 100%;
+			bottom: 44rpx;
+			text-align: center;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 12px;
+			color: #bbb;
+			transform: scale(0.8); 
+		}
+	.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;
+	}
+	.btns{
+		position: relative;
+		width: 630rpx;
+		height: 80rpx;
+		.author-btn{				
+			z-index:100;
+			position: absolute;
+			width: 630rpx;
+			height: 80rpx;
+			background: #1777ff;
+			border-radius: 40rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: rgba(255, 255, 255, 1);
+		}
+	}
+</style>

+ 76 - 15
pages/user/users/userInfo.vue

@@ -17,16 +17,16 @@
 						<view class="base-color-9 fs24 mt12">注册时间:{{!userinfo.createTime||userinfo.createTime.slice(0, 10)}}</view>
 					</view>
 				</view>
-				<image v-if="!isShow" class="right" src="/static/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
+				<image v-if="!isShow" class="right" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
 			</view>
 			<!-- 公司 -->
 			<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>
+					<image class="img" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_comp.png" mode="aspectFill"></image>
+					<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>
+					<image class="img" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/phone.png" mode="aspectFill"></image>
 					<text class="fs24 base-color-6">{{userinfo.phonenumber}}</text>
 				</view>
 			</view>
@@ -37,45 +37,46 @@
 			<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 {
-				avatar:"/static/images/default.png", 
+				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/default.png", 
 				nickName:"",
 				deptName:"",
 				postNames:"",
@@ -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 => {}

+ 141 - 98
pages/user/users/users.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
 	<view class="column" style="height: calc(100% - 20rpx) ;">
 		<view class="top " >
 			<u-search placeholder="输入姓名/昵称搜索" bgColor='#F8F8FC'
@@ -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,17 +83,18 @@
 		<!--选择显示-->
 		<view v-show="!hidden" class="indexToast">
 			{{listCur}}
-		</view>
-	</view>
-</template>
-
+		</view>
+	</view>
+</template>
+
 <script>
-	import {getAllUsers} from '@/api/user.js';
-	export default {
-		data() {
+	import {getAllUsers} from '@/api/user.js';
+	import {subsalesaudit} from '@/api/courseManage.js';
+	export default {
+		data() {
 			return {
 				baseUrl:uni.getStorageSync('requestPath'),
-				avatar:"/static/images/default.png",
+				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/default.png",
 				CustomBar: 0,
 				hidden: true,
 				listCurID: '',
@@ -102,8 +105,10 @@
 				act:0,
 				selectact:false,
 				isSelectAll:false,
-				selectedUsers:[]
-			}
+				selectedUsers:[],
+				isAudits:1,
+				ids:''
+			}
 		},
 		onLoad() {
 			this.getUser();
@@ -116,8 +121,13 @@
 			uni.createSelectorQuery().select('.indexes').boundingClientRect(function(res) {
 				that.barTop = res.top
 			}).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 => {
@@ -236,11 +279,11 @@
 			},
 			search(){
 				this.getUser()
-			}
-			
-		}
-	}
-</script>
+			}
+			
+		}
+	}
+</script>
 <style  lang="scss">
 	::v-deep {
 		.foot-select {
@@ -268,73 +311,73 @@
 		background-color: #fff;
 		padding: 0rpx 15rpx;
 		padding-top: 20rpx;
-	}
-	.indexes {
-		position: relative;
-	}
-
-	.indexBar {
-		position: fixed;
-		right: 0px;
-		bottom: 0px;
-		padding: 20upx 20upx 20upx 60upx;
-		display: flex;
-		align-items: center;
-	}
-
-	.indexBar .indexBar-box {
-		width: 40upx;
-		height: auto;
-		background: #fff;
-		display: flex;
-		flex-direction: column;
-		box-shadow: 0 0 20upx rgba(0, 0, 0, 0.1);
-		border-radius: 10upx;
-	}
-
-	.indexBar-item {
-		flex: 1;
-		width: 40upx;
-		height: 40upx;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		font-size: 24upx;
-		color: #888;
-	}
-
-	movable-view.indexBar-item {
-		width: 40upx;
-		height: 40upx;
-		z-index: 9;
-		position: relative;
-	}
-
-	movable-view.indexBar-item::before {
-		content: "";
-		display: block;
-		position: absolute;
-		left: 0;
-		top: 10upx;
-		height: 20upx;
-		width: 4upx;
-		background-color: #f37b1d;
-	}
-
-	.indexToast {
-		position: fixed;
-		top: 0;
-		right: 80upx;
-		bottom: 0;
-		background: rgba(0, 0, 0, 0.5);
-		width: 100upx;
-		height: 100upx;
-		border-radius: 10upx;
-		margin: auto;
-		color: #fff;
-		line-height: 100upx;
-		text-align: center;
-		font-size: 48upx;
+	}
+	.indexes {
+		position: relative;
+	}
+
+	.indexBar {
+		position: fixed;
+		right: 0px;
+		bottom: 0px;
+		padding: 20upx 20upx 20upx 60upx;
+		display: flex;
+		align-items: center;
+	}
+
+	.indexBar .indexBar-box {
+		width: 40upx;
+		height: auto;
+		background: #fff;
+		display: flex;
+		flex-direction: column;
+		box-shadow: 0 0 20upx rgba(0, 0, 0, 0.1);
+		border-radius: 10upx;
+	}
+
+	.indexBar-item {
+		flex: 1;
+		width: 40upx;
+		height: 40upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 24upx;
+		color: #888;
+	}
+
+	movable-view.indexBar-item {
+		width: 40upx;
+		height: 40upx;
+		z-index: 9;
+		position: relative;
+	}
+
+	movable-view.indexBar-item::before {
+		content: "";
+		display: block;
+		position: absolute;
+		left: 0;
+		top: 10upx;
+		height: 20upx;
+		width: 4upx;
+		background-color: #f37b1d;
+	}
+
+	.indexToast {
+		position: fixed;
+		top: 0;
+		right: 80upx;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.5);
+		width: 100upx;
+		height: 100upx;
+		border-radius: 10upx;
+		margin: auto;
+		color: #fff;
+		line-height: 100upx;
+		text-align: center;
+		font-size: 48upx;
 	}
 	.zm{
 		height:30rpx;
@@ -372,5 +415,5 @@
 		color: #888;
 		margin-top: 15rpx;
 		
-	}
-</style>
+	}
+</style>

+ 171 - 0
pages_course/reward.vue

@@ -0,0 +1,171 @@
+<template>
+	<view class="answerPopup-box bg">
+		<!-- 正确 -->
+		<image class="tipimg" src="/static/images/course_answer_img.png"
+			mode="aspectFill"></image>
+		<view class="answerPopup-title">恭喜你,回答正确</view>
+		<view class="answerPopup-desc">您有一份奖励待领取哦</view>
+		<view class="answerPopup-btn" @click="handleReceive">领取</view>
+		<view class="footer-tips">重庆云联融智提供技术支持</view>
+	</view>
+</template>
+
+<script>
+	// import wx from 'jweixin-module';
+	import { initJssdk } from "@/utils/common.js"
+	export default {
+		data() {
+			return {
+				mchId:'',
+				packageInfo: ''
+			}
+		},
+		methods: {
+			handleReceive() {
+				this.packageInfo = uni.getStorageSync('receive_package') || ''
+				this.mchId = uni.getStorageSync('mchId') || ''
+				// this.initWXConfig(this.packageInfo)
+				this.$nextTick(()=>{
+					this.handleTest()
+				})
+			},
+			handleTest() {
+				const that = this
+				console.log(that.mchId)
+				console.log('wxb9b453d37c5fad45',wx.getAccountInfoSync().miniProgram.appId)
+				console.log(that.packageInfo)
+				if (wx.canIUse('requestMerchantTransfer')) {
+				  wx.requestMerchantTransfer({
+				    mchId:that.mchId,
+				    appId:wx.getAccountInfoSync().miniProgram.appId,
+				    package:that.packageInfo,
+				    success: (res) => {
+				      // res.err_msg将在页面展示成功后返回应用时返回ok,并不代表付款成功
+				      console.log('success:', res);
+					  console.log(that.mchId)
+					  console.log('wxb9b453d37c5fad45',wx.getAccountInfoSync().miniProgram.appId)
+					  console.log(that.packageInfo)
+				    },
+				    fail: (res) => {
+				      console.log('fail:', res);
+					  console.log('11111-----')
+					  console.log(that.mchId)
+					  console.log('wxb9b453d37c5fad45',wx.getAccountInfoSync().miniProgram.appId)
+					  console.log(that.packageInfo)
+				    },
+				  });
+				} else {
+				  wx.showModal({
+				    content: '你的微信版本过低,请更新至最新版本。',
+				    showCancel: false,
+				  });
+				}
+				// wx.ready(() => {
+				// 	// config信息验证后会执行ready方法,所有接口调用都必须在config之后
+				// 	wx.checkJsApi({
+				// 		jsApiList: ['requestMerchantTransfer'],
+				// 		success: function(res) {
+				// 			if (res.checkResult['requestMerchantTransfer']) {
+				// 				WeixinJSBridge.invoke('requestMerchantTransfer', {
+				// 						mchId: that.mchId,
+				// 						appId: appId,
+				// 						package: packageVal,
+				// 					},
+				// 					function(res) {
+				// 						if (res.err_msg === 'requestMerchantTransfer:ok') {
+				// 							// res.err_msg将在页面展示成功后返回应用时返回success,并不代表付款成功
+				// 						}
+				// 					}
+				// 				);
+				// 			} else {
+				// 				alert('你的微信版本过低,请更新至最新版本。');
+				// 			}
+				// 		}
+				// 	});
+				// });
+				// wx.error(function(res){
+				//   // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
+				// });
+			},
+			initWXConfig(packageVal) {
+				const isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
+				if(isWechat) {
+					let url = window.location.href.split('#')[0]
+					initJssdk((data)=>{
+						this.handleTest(packageVal,data.appId,data.mchId)
+					},url)
+				} else {
+					uni.showToast({
+						title: '请在微信浏览器中打开'
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.footer-tips {
+		width: 100%;
+		position: absolute;
+		left: 0;
+		bottom: 14rpx;
+		text-align: center;
+		font-family: PingFang SC,PingFang SC;
+		font-weight: 500;
+		font-size: 12px;
+		color: #bbb;
+	}
+	.answerPopup {
+		&-box {
+			width: 100%;
+			height: 100vh;
+			background: linear-gradient(180deg, #FFFAF6 50%, #FEECD8 100%);
+			background-color: #fff;
+			font-weight: 400;
+			box-sizing: border-box;
+			position: relative;
+			@include u-flex(column, center, center);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+	
+			.tipimg {
+				width: 206rpx;
+				height: 206rpx;
+				margin-bottom: 16rpx;
+			}
+		}
+	
+		&-title {
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #222222;
+		}
+	
+		&-desc {
+			margin-top: 30rpx;
+			font-size: 28rpx;
+			color: #757575;
+		}
+	
+		&-btn {
+			width: 464rpx;
+			height: 84rpx;
+			margin-top: 10vh;
+			margin-bottom: 16vh;
+			background: #FF5C03;
+			border-radius: 42rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			text-align: center;
+			line-height: 84rpx;
+		}
+	}
+</style>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 308 - 567
pages_course/video.vue


+ 1925 - 0
pages_course/videovip.vue

@@ -0,0 +1,1925 @@
+<template>
+	<view class="content " >
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<u-icon name="arrow-left" size="28" @click="tosales" v-if="appToken"></u-icon>
+			<view class="header-title" :style="{width:menuButtonLeft + 'px',height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">{{courseInfo.title}}</view>
+		</view>
+		<view class="video-box">
+			<image v-if="!isLogin || isAddKf!=1" class="video-poster" :src="courseInfo.imgUrl" mode="aspectFill">
+			</image>
+			<video 
+			@timeupdate="onTimeUpdate" 
+			@progress="progressChange" 
+			@error="videoErrorCallback" 
+			@play="getPlay"
+			@pause="getPause" 
+			@ended="getEnded" 
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:auto-pause-if-open-native="true"
+			:auto-pause-if-navigate="true"
+			:enable-progress-gesture="false" 
+			:show-progress="true"
+			:picture-in-picture-mode="[]"
+			:show-background-playback-button="false"
+			:src="videoUrl"></video>
+		</view>
+		<view class="title-content" id="title-content">
+			<!-- 答题时展示小节课程名,其他展示课程名 -->
+			<!-- 小节课程名 -->
+			<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+				{{courseInfo.title}}
+			</view>
+			<!-- 课程名字 -->
+			<view class="miantitlebox" v-else>
+				{{courseInfo.courseName}}
+			</view>
+		</view>
+		<scroll-view class="scroll-view" :style="{height: height}" :scroll-top="scrollTop" scroll-y="true">
+			<!-- 介绍 -->
+			<view class="descbox">
+				<template v-if="!isLogin||isAddKf!=1">
+					<view class="descbox-title">{{courseInfo.title}}</view>
+					<view class="descbox-info">
+						<!-- <view class="descbox-info-l">
+							<view>{{courseInfo.views}}次播放</view>
+							<view class="descbox-info-time">总时长:{{courseInfo.totalDuration}}</view>
+						</view> -->
+						<view class="descbox-info-r expand" v-if="textHeight > 21">
+							<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_arrow_down_icon.png" v-show="!isExpand"></image>
+						</view>
+					</view>
+				</template>
+				<view class="descbox-desc" id="descbox-desc" :style="{height: isExpand ? 'auto': '42rpx'}">
+					<text>{{courseInfo.description==null?'暂无简介':courseInfo.description}}</text>
+					<view :class="isExpand ? 'expand': 'expand expand-ab'" v-if="isLogin&&isAddKf==1&&textHeight > 21">
+						<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_arrow_down_icon.png" v-show="!isExpand"></image>
+					</view>
+				</view>
+			</view>
+			<!-- 无效或者已过期 -->
+			<view class="nocourse" v-if="msg">
+				<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_expiration_img.png" mode="widthFix"></image>
+				<view>{{msg}}</view>
+			</view>
+			<!-- 问题 -->
+			<view class="ques-content" v-if="isLogin&&isAddKf==1">
+				<view class="ques-content-tit">问答题</view>
+				<view v-for="(item,index) in quesList" :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="isAnswer(item,option.name) ?'ques-option ques-option-active':'ques-option'" 
+					v-for="(option,idx) in item.questionOption" 
+					:key="idx" 
+					@click="handleAnswer(item,option)">
+						<view>
+							{{numberToLetter(idx)}}.
+						</view>
+						<view>{{option.name}}</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		<!-- 线路 -->
+		<!-- <view class="video-line" @click="openPop" v-if="isLogin&&isAddKf==1">
+			<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/changePlayer-icon.png"></image>
+			<text>线路{{lineIndex + 1 | numberToChinese}}</text>
+		</view> -->
+		<!-- 线路弹窗 -->
+		<uni-popup ref="popup" type="bottom"  class="full-width-popup">
+			<view class="popupbox">
+				<view class="popupbox-head">
+					<text>线路选择</text>
+					<image class="close-icon" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/tc_close_icon.png" mode="aspectFill" @click="close">
+					</image>
+				</view>
+				<view class="popupbox-content">
+					<view :class="lineIndex == index ? 'line-item line-active': 'line-item'"
+						v-for="(it,index) in lineList" :key="index" @click="handleLine(index)">
+						线路{{index + 1 | numberToChinese}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 温馨提示弹窗 -->
+		<uni-popup ref="tipsPopup" type="center" :is-mask-click="false">
+			<view class="tipsPopup-mask">
+				<image class="red_envelope_top" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/red_envelope_img.png" mode="aspectFill"></image>
+				<view class="tipsPopup">
+					<image class="tipsPopup-close" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_close_white_icon.png" mode="aspectFill"
+						@click="closeTipsPop"></image>
+					<view class="tipsPopup-line">
+						<view class="tipsPopup-box">
+							<view class="tipsPopup-head">
+								<image class="tipsPopup-head-title" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/tips_title_img.png"
+									mode="widthFix"></image>
+							</view>
+							<view class="tipsPopup-content">
+								<view class="tipsPopup-content-title">亲爱的用户,</view>
+								<view>您已经观看课程一半的时间了,请注意休息并保持专注。</view>
+							</view>
+							<view class="tipsPopup-btn-box">
+								<view class="tipsPopup-btn" @click="closeTipsPop">继续观看领奖励</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 答题弹窗 -->
+		<u-popup :show="answerPopup" mode="center" @close="closepop()" @open="open" closeOnClickOverlay>
+			<view :class="errTitle == '恭喜你,回答正确' ? 'answerPopup-box bg':'answerPopup-box'">
+				<!-- 正确 -->
+				<image class="tipimg" v-if="errTitle == '恭喜你,回答正确'" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_answer_img.png"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_answer_incorrectly_img.png" mode="aspectFill">
+				</image>
+				<view class="answerPopup-title">{{errTitle}}</view>
+				<view class="answerPopup-desc" v-html="errDesc"></view>
+				<!-- 选择奖励 -->
+				<!-- <view class="reward-list" v-if="errTitle == '恭喜你,回答正确'">
+					<radio-group class="reward-list-group" @change="rewardChange">
+						<label class="reward-list-option" v-for="(item, index) in rewardType" :key="item.value">
+							<radio :value="item.value+ ''" :checked="item.value == currentReward"
+								activeBorderColor="#FF5C03" activeBackgroundColor="#FF5C03"
+								style="transform:scale(0.7)" />
+							<view :style="{color: item.value == currentReward ? '#FF5C03':''}">{{item.name}}</view>
+						</label>
+					</radio-group>
+				</view> -->
+				<!-- 错误题目 -->
+				<view class="errQuesbox" v-if="errQues&&errQues.length>0">
+					<view class="errQuesbox-item textOne" v-for="(it,index) in errQues" :key="index">{{it.title}}</view>
+				</view>
+				<view class="answerPopup-btn" v-if="errTitle == '恭喜你,回答正确'" @click="closeAnswerPopup">确认</view>
+				<view class="tipsPopup-btn-box" v-else
+					:style="{marginTop: errQues&&errQues.length>0 ? '40rpx':'54rpx'}">
+					<view class="tipsPopup-btn" @click="closeAnswerPopup">{{remain > 0 ? '重新答题': '确认'}}</view>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 客服二维码弹窗 -->
+		<u-popup :show="kfPopup" mode="center" :mask-click="false" round='12'>
+			<view class="kfqrcode-box">
+				<view>请添加客服</view>
+				<image class="kfqrcode" :src="qrcode" show-menu-by-longpress="true"></image>
+				<!-- <view v-show="qrcodeMsg" style="margin-top: 30rpx;" v-html="qrcodeMsg"></view> -->
+				<image class="kfqrcode-close" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/course_close_white_icon.png" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</u-popup>
+		<u-popup :show="timepop" mode="center" round='12'>
+			<view class="timepopbox center column">
+				<view class="fs40 bold ">未到看课时间</view>
+				<view class="mtb20">看课时间</view>
+				<view >{{videocont.startDateTime}}</view>
+				<view>至</view>
+				<view >{{videocont.endDateTime}}</view>
+				<view class="base-bg-orange colorf p20 radius50 mt20"
+				@click="getH5CourseVideoDetails">刷新时间</view>
+			</view>
+		</u-popup>
+		<view class="footer-tips">重庆云联融智提供技术支持</view>
+		<!-- footer -->
+		<view class="footer" v-if="videoId">
+			<view class="btns">
+				<button
+					class="author-btn"
+					open-type="getPhoneNumber"
+					@getphonenumber="phoneLogin"  >{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button>
+				<button class="author-btn" v-if="isLogin" @click="submit">{{isLogin&&isAddKf==1 ?'提交答案领取奖励' : '立即学习'}}</button>
+			</view>
+			<!-- <view :class="isLogin&&isAddKf==1 ? 'footer-btn footer-btn-border':'footer-btn'" @click="submit">
+				<image class="footer-btn-img" v-show="isLogin&&isAddKf==1" 
+				src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/red_envelope_btnimg.png"
+					mode="aspectFill"></image>
+				<text>{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</text>
+			</view> -->
+			<!-- <view @click="checked=!checked" class="agreement" v-if="!isLogin">
+				<radio value="r1" :checked="checked" color="#ff5c03" activeBorderColor="#ff5c03"
+					style="transform:scale(0.6);" />
+				<view>阅读并同意<text style="color: #ff5c03;" @click.stop="goWeb(0)">《用户协议》</text>和<text
+						style="color: #ff5c03;" @click.stop="goWeb(1)">《隐私协议》</text></view>
+			</view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import { generateRandomString} from "@/utils/common.js"
+	import { loginByMiniApp } from "@/api/course.js"
+	import dayjs from 'dayjs';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		getInternetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		getRealLink
+	} from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				// 1 红包 2 积分
+				rewardType: [{
+					name: '红包奖励',
+					value: 1
+				}, {
+					name: '积分奖励',
+					value: 2
+				}],
+				currentReward: 1,
+				player: null,
+				loading: true,
+				progress: 0,
+				code: null,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				scrollTop: 0,
+				height: '0px',
+				isLogin: false,
+				videoUrl: "",
+				videoId: "",
+				//现在的时长
+				playTime: 0,
+				//总时长
+				duration: 0,
+				playDuration: 0,
+				// 用于续播
+				playDurationSeek: 0,
+				// 温馨提醒时间节点,
+				tipsTime: 0,
+				tipsOpen: false,
+				config: {},
+				courseInfo: {},
+				quesList: [],
+				lineList: [],
+				// 错题
+				errQues: [],
+				// 答题机会
+				remain: 0,
+				errTitle: "",
+				errDesc: "",
+				showPlay: true,
+				showControls: false,
+				playStatus: "",
+				isFullscreen: false,
+				isAddKf: 0,
+				lineIndex: 0,
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				periodId:"",//营期id
+				companyUserId:"",//销售id
+				companyId:"",//公司id
+				courseId:"",//课程id
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				ip: null,
+				checked: true,
+				isFinish: 0, // 是否完课
+				interval: null,
+				intervalIntegral: null, // 积分定时
+				options: {
+					sources: [{
+						src: ""
+					}],
+					poster: "",
+					live: false /* 是否直播 */ ,
+					controls: true,
+					autoplay: false,
+					licenseUrl: 'https://license.vod2.myqcloud.com/license/v2/1323137866_1/v_cube.license', // license 地址,参考准备工作部分,在视立方控制台申请 license 后可获得 licenseUrl,
+					LicenseKey: 'bcc5bd9a14b798b48c52ff005a21d926',
+					controlBar: {
+						volumePanel: false,
+						playbackRateMenuButton: false,
+						QualitySwitcherMenuButton: false,
+						// progressControl: false
+					},
+					plugins: {
+						// ProgressMarker: false,
+						ContextMenu: {
+							statistic: false
+						}
+					},
+				},
+				// 错误请求次数
+				errorCount: 0,
+				answerPopup: false,
+				sortLink:"",
+				// 课程是否过期
+				isExpire: false,
+				menuButtonLeft: 281,
+				menuButtonH: 45,
+				timer: null,
+				flag: false,
+				msg:'',
+				poster:'',
+				userInfo:{},
+				timeid:'',
+				videocont:{},
+				timepop:false,
+				appToken:''
+			}
+		},
+		filters: {
+			numberToChinese(number) {
+				if (number) {
+					const chineseNumber = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
+					return chineseNumber[number - 1];
+				} else {
+					return ''
+				}
+			},
+		},
+		computed: {
+			isAnswer() {
+				return (item, name) => {
+					if (item.type == 1) {
+						return item.answer == name
+					} else if (item.type == 2) {
+						const array = item.answer.split(',')
+						return array.some(i => i == name)
+					} else {
+						return false
+					}
+				}
+			}
+		},
+		//发送给朋友
+		// onShareAppMessage(res) {
+		// 	return {
+		// 		title: "福本源",
+		// 		// path: '/pages/index/index',
+		// 		imageUrl: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+		// 	}
+			
+		// },
+		// //分享到朋友圈
+		// onShareTimeline(res) {
+		// 	return {
+		// 		title: "福本源",
+		// 		imageUrl: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+		// 	}
+			
+		// },
+		onLoad(option) {
+			console.log(option);
+			this.code = option.code
+			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.userInfo = {}
+			}
+			this.appToken=uni.getStorageSync('AppToken')
+			this.urlOption = option.course ? JSON.parse(option.course) : {}
+			this.videoId = this.urlOption.videoId
+			this.courseId = this.urlOption.courseId
+			this.periodId = this.urlOption.periodId
+			this.companyId = this.urlOption.companyId
+			this.companyUserId = this. urlOption.companyUserId
+			this.timeid=this.urlOption.id
+			// this.qwUserId = this.urlOption.qwUserId || ''
+			// this.corpId = this.urlOption.corpId || ''
+			// this.linkType = this.urlOption.linkType || 0
+			// if (this.code) {
+			// 	this.loginByMp()
+			// }
+			console.log(this.urlOption)
+			// this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+		},
+		onShow() {
+			this.tipsOpen = false
+			this.isExpand = true
+			this.uuId = generateRandomString(16)
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+			}
+			const AppToken=uni.getStorageSync('AppToken_MYfby')
+			console.log(AppToken)
+			if(AppToken){
+				this.isLogin=true
+				if(this.isAddKf == 1){
+					this.getH5CourseVideoDetails()
+				} else{
+					this.getIsAddKf()
+				}
+			}
+			// if(this.sortLink){
+			// 	this.getLink()
+			// } else {
+			// 	uni.showToast({
+			// 		title: 'sortLink is not found',
+			// 		icon: 'none'
+			// 	});
+			// }
+		},
+		mounted() {
+			// this.getIP()
+			this.getHeight()
+		},
+		onHide() {
+			// this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.pause()
+			}
+			// if (this.interval != null) {
+			// 	clearInterval(this.interval)
+			// 	this.interval = null
+			// }
+		},
+		onUnload() {
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+		},
+		beforeDestroy() {
+			this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.stop()
+				this.player = null
+			}
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+		},
+		methods: {
+			tosales(){
+				uni.switchTab({
+					url:"/pages/index/index"
+				})
+			},
+			closepop(){
+				this.answerPopup=false
+			},
+			open(){
+				
+			},
+			phoneLogin(e) {
+				var that=this;
+				uni.showLoading({
+					title:"处理中..."
+				})
+					if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+						this.utils.getProvider()
+						.then(provider => {
+							if (!provider) {
+							  reject()
+							}
+							// uni登录
+							uni.login({
+								provider: provider,
+								success: async loginRes => {
+									console.log(loginRes)
+									let code = loginRes.code // 获取开发code
+									loginByMiniApp({
+									   encryptedData: e.mp.detail.encryptedData,
+									   iv: e.mp.detail.iv,
+									   code: code,
+									})
+									.then( res => {
+										if(res.code==200){
+											console.log(res)
+											uni.hideLoading();
+											uni.showToast({
+												icon:'none',
+												title: "登录成功",
+											});
+											uni.setStorageSync('AppToken_MYfby', res.token);
+											uni.setStorageSync('userInfo', JSON.stringify(res.user));
+											this.userInfo=res.user;
+											uni.hideLoading()
+											this.isLogin = true
+											setTimeout(()=>{
+												this.getIsAddKf()
+											},200)
+										}
+										else{
+											uni.hideLoading();
+											uni.showToast({
+												icon:'none',
+												title: "授权登录失败,请重新登录",
+											});
+										}
+									   
+									 })
+								}
+							})
+						})
+						.catch(err => {
+							uni.showToast({
+								icon:'none',
+								title: err,
+							});
+						})
+						 
+					} else {
+						uni.showToast({
+							title: '已拒绝授权',
+							icon: 'none',
+							duration: 2000,
+						})
+					}
+			},
+			getMenuButton(){
+				const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+				this.menuButtonLeft = menuButtonInfo.left
+				this.menuButtonH = menuButtonInfo.height
+			},
+			//播放时间更新事件方法
+			onTimeUpdate(e){
+				let currentTime = Math.round(e.detail.currentTime)
+				if (this.playDurationSeek > 0) {
+					this.playTime = this.playDurationSeek
+					this.throttle(() => this.changeTime(this), 1000, false)
+				} else {
+					// console.log(this.isFinish)
+					if (this.linkType != 1 && (currentTime - this.playTime > 3 || currentTime - this.playTime < -3)&&this.isFinish!=1) {
+						uni.showToast({
+							title: '不能快进哦',
+							icon: 'none',
+						});
+						currentTime = this.playTime
+						this.player.seek(this.playTime);
+					}
+					this.playTime = currentTime
+				}
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.clearIntegral()
+				this.errorCount++
+				if (this.errorCount > 3) return
+				console.log(e)
+				this.getErrMsg(e.target.errMsg)
+				this.getH5CourseVideoDetails('error')
+			},
+			// 当开始/继续播放时触发play事件
+			getPlay() {
+				this.errorCount = 0
+				// this.judgeDuration()
+			},
+			getPause() {
+				this.clearIntegral()
+			},
+			getEnded() {
+				this.clearIntegral()
+				this.isEnded = true
+				this.getFinishCourseVideo()
+			},
+			getIP() {
+				uni.request({
+					url: 'https://ipinfo.io/json', //仅为示例,并非真实接口地址。
+					method: 'GET',
+					success: (res) => {
+						this.ip = res.data.ip
+					}
+				});
+			},
+			getHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#title-content")
+						.boundingClientRect((data) => {
+							this.height =
+								`calc(100vh - ${data.height}px - 420rpx - ${this.statusBarHeight}px - 164rpx - 88rpx)`
+						})
+						.exec();
+				})
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							this.textHeight = data.height
+						})
+						.exec();
+				})
+			},
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			updateTime() {
+				var that = this;
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.interval = setInterval(function() {
+					that.getFinishCourseVideo()
+					that.getInternetTraffic()
+				}, 60000);
+			},
+			judgeDuration() {
+				var that = this;
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+				// 观看10分钟获得积分
+				this.intervalIntegral = setInterval(function() {
+					that.getIntegralByH5Video()
+				}, 600000);
+			},
+			clearIntegral() {
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+			},
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			getH5CourseByVideo() {
+				this.loading = true
+				getH5CourseByVideoId({
+					videoId: this.videoId
+				}).then(res => {
+						this.loading = false
+						if (res.code == 200) {
+							this.courseInfo = res.data
+							uni.setNavigationBarTitle({
+								title: this.courseInfo && this.courseInfo.title ? this.courseInfo.title : ''
+							});
+						}
+						this.getHeight()
+						this.getDescHeight()
+					},
+					rej => {
+						this.loading = false
+					}
+				).catch(() => {
+					this.loading = false
+				})
+			},
+			getH5CourseVideoDetails(type) {
+				uni.showLoading({
+					title: '加载中'
+				})
+				const data={
+					videoId:this.videoId,
+					fsUserId:this.userInfo.userId,
+					courseId:this.courseId,
+					companyUserId:this.companyUserId,
+					periodId:this.periodId,
+					id:this.timeid
+				}
+				getH5CourseVideoDetails(data).then(res => {
+						if (res.code == 200) {
+							this.config = res.data.courseConfig || {}
+							this.isFinish = res.data.isFinish || 0
+							this.duration = res.data.courseVideoDetails && 
+							res.data.courseVideoDetails.duration ? res.data.courseVideoDetails.duration : 0
+							this.playDuration = res.data.playDuration || 0
+							this.playDurationSeek = res.data.playDuration || 0
+							this.tipsTime = res.data.tipsTime || 0
+							let lineList = []
+							// if (res.course && res.course.lineOne) {
+							// 	lineList.push(res.course.lineOne)
+							// }
+							// if (res.course && res.course.lineTwo) {
+							// 	lineList.push(res.course.lineTwo)
+							// }
+							// if (res.course && res.course.lineThree) {
+							// 	lineList.push(res.course.lineThree)
+							// }
+							this.lineList = lineList
+							if (!this.player || type == 'error') {
+								uni.hideLoading();
+								this.lineIndex = this.config.defaultLine
+								this.videoUrl = res.data.courseVideoDetails.videoUrl
+								this.poster= res.data.courseVideoDetails && 
+								res.data.courseVideoDetails.thumbnail ? res.data.courseVideoDetails.thumbnail : ''
+								this.videocont=res.data
+								// this.options.sources = [{
+								// 	src: this.videoUrl
+								// }]
+								// this.options.poster = res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// this.initVideo()
+								this.playTime = this.playDuration >= this.duration ? 0 : this.playDuration
+								if(this.videocont.rang){
+									setTimeout(()=>{
+										this.player = uni.createVideoContext('video-content-box');
+										this.player.seek(this.playTime)
+										this.player.play();
+									},500);
+									this.timepop=false
+								}else{
+									this.timepop=true
+								}
+								
+							} else {
+								// let div = document.querySelector(".vjs-progress-control");
+								// if(div) {
+								// 	if (this.isFinish == 1 || this.isEnded || this.linkType == 1) {
+								// 		div.style.pointerEvents = "auto";
+								// 	} else {
+								// 		div.style.pointerEvents = "none"; //禁止所有事件
+								// 	}
+								// }
+								this.playTime = this.playTime > this.playDuration ? this.playTime : this.playDuration >= this.duration ? 0 : this.playDuration
+								this.player.seek(this.playTime)
+								this.player.play();
+							}
+							this.updateTime();
+							console.log('题目',res.data.courseVideoDetails.questionBankList)
+							this.quesList = res.data.courseVideoDetails.questionBankList
+							 && res.data.courseVideoDetails.questionBankList.length > 0 ? res.data.courseVideoDetails.questionBankList : [],
+								this.quesList = this.quesList.map(item => ({
+									...item,
+									questionOption: JSON.parse(item.question),
+									answer: ''
+								}))
+						}
+						this.getHeight()
+						this.getDescHeight()
+					},
+					rej => {}
+				)
+			},
+			handleAnswer(item, option, idx) {
+				let time = this.playTime
+				if(this.isEnded) {
+					time = this.duration
+				} else {
+					if(time < this.playDuration&&this.isFinish!=1) {
+						// 没完课且小于续播的时间
+						time = this.playDuration
+					}
+				}
+				if(Number(this.duration || 0) == 0 || time < this.duration - 60) {
+					uni.showToast({
+						title: "请先观看完整课程再答题哦~",
+						icon: "none"
+					})
+					return
+				}
+
+				if (item.type == 1) {
+					// 单选option
+					item.answer = option.name
+				} else if (item.type == 2) {
+					// 多选
+					let answer = item.answer ? item.answer.split(',') : []
+					if (answer.indexOf(option.name) === -1) {
+						answer.push(option.name)
+						item.answer = answer.join(',')
+					} else {
+						answer.splice(answer.indexOf(option.name), 1)
+						item.answer = answer.join(',')
+					}
+				}
+			},
+			submit() {
+				if(this.isExpire){
+					uni.showToast({
+						title: '课程已过期或链接无效',
+						icon: 'none'
+					});
+					return
+				}
+				// 登录
+				this.$isLoginCourse().then(
+					res => {
+						console.log(res)
+						if(res){
+							console.log(res)
+							if (this.isAddKf == 1) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								console.log(1223)
+								this.courseAnswer()
+							} else {
+								// 添加客服
+								if (this.videoId && this.qwUserId) {
+									this.getIsAddKf()
+								} else {
+									uni.showToast({
+										title: '请联系管理员,注册为会员!',
+										icon: 'none'
+									})
+								}
+							} 
+						} else{
+							// this.goLogin()
+						}
+					},
+					rej => {}
+				);
+					
+			},
+			// 答题
+			courseAnswer() {
+				let time = this.playTime
+				if (this.isEnded) {
+					time = this.duration
+				} else {
+					if (time < this.playDuration && this.isFinish != 1) {
+						// 没完课且小于续播的时间
+						time = this.playDuration
+					}
+				}
+				if (Number(this.duration || 0) == 0 || time < this.duration - 60) {
+					uni.showToast({
+						title: "请先观看完整课程再答题哦~",
+						icon: "none"
+					})
+					return
+				}
+				if (this.quesList.some(item => !item.answer)) {
+					uni.showToast({
+						title: "请确认是否答完所有题目",
+						icon: "none"
+					})
+					return
+				}
+				const questions = this.quesList.map(obj => {
+					const {
+						questionOption,
+						...rest
+					} = obj;
+					return rest;
+				});
+				const param = {
+					...this.urlOption,
+					userId:this.userInfo.userId,
+					questions: questions,
+					videoId: this.videoId,
+					duration: this.playTime,
+				}
+				this.errTitle = ""
+				this.errDesc = ""
+				this.errQues = []
+				courseAnswer(param).then(res => {
+						if (res.code == 200) {
+							if (res.incorrectQuestions) {
+								// 答题失败
+								if (res.incorrectQuestions.length > 0) {
+									this.errQues = res.incorrectQuestions
+								}
+								this.remain = res.remain || 0
+								if (res.remain > 0) {
+									this.answerPopup=true
+									this.errTitle = "很遗憾答错了"
+									this.errDesc = `<span style="color:#FF5C03">还有${res.remain}次机会,继续加油</span>`
+									// this.$refs.answerPopup.open("center")
+									this.answerPopup=true
+								}
+							} else {
+								// 答题成功
+								this.errTitle = "恭喜你,回答正确"
+								// this.errDesc = `请选择奖励`
+								// this.$refs.answerPopup.open("center")
+								this.answerPopup=true
+							}
+						} else {
+							if (res.msg == "该课题到达答错次数限制") {
+								this.errTitle = "答题次数超过限制"
+								this.errDesc = "以后的课程要认真学习哦"
+								// this.$refs.answerPopup.open("center")
+								this.answerPopup=true
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: "none"
+								})
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 选择
+			rewardChange(e) {
+				this.currentReward = e.detail.value
+			},
+			closeAnswerPopup() {
+				// this.$refs.answerPopup.close()
+				// this.answerPopup=!this.answerPopup
+				if (this.errTitle == '恭喜你,回答正确') {
+					const param = {
+						...this.urlOption,
+						userId:this.userInfo.userId,
+						// rewardType: Number(this.currentReward),
+						source: 2, // 小程序
+						appId: 'wxb9b453d37c5fad45'
+					}
+					sendReward(param).then(res => {
+						if(res.code == 200) {
+							if(res.isNew&&res.isNew==1) {
+								const packageInfo = res.data.packageInfo || ''
+								if(packageInfo) {
+									uni.setStorageSync('receive_package',packageInfo)
+									uni.setStorageSync('mchId',res.mchId)
+									uni.navigateTo({
+										url: '/pages_course/reward'
+									})
+								}
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: 'none'
+								})
+							}
+						}else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							})
+						}
+						// if(res.code == 200) {
+						// 	//重构 发红包,后台通过OPENID发零钱到 账
+						// 	//this.initWXConfig(res.package)
+						// }else {
+						// 	uni.showToast({
+						// 		title: res.msg,
+						// 		icon: 'none'
+						// 	})
+						// }
+					})
+				}
+			},
+			// 线路
+			openPop() {
+				this.$refs.popup.open('bottom')
+			},
+			close() {
+				this.$refs.popup.close()
+			},
+			handleLine(index) {
+				var that=this;
+				if (this.lineIndex == index && this.videoUrl == this.lineList[index]) {
+					this.close()
+					return
+				} else {
+					// let div = document.querySelector(".vjs-progress-control");
+					// if(div) {
+					// 	if (this.isFinish == 1 || this.isEnded || this.linkType == 1) {
+					// 		div.style.pointerEvents = "auto";
+					// 	} else {
+					// 		div.style.pointerEvents = "none"; //禁止所有事件
+					// 	}
+					// }
+					this.lineIndex = index
+					this.videoUrl = this.lineList[index]
+					this.tipsOpen = false
+					this.playDurationSeek = this.playTime || 0
+					this.player = uni.createVideoContext('video-content-box');
+					setTimeout(function(){
+						that.player.seek(that.playDurationSeek)
+						that.player.play();
+					},500);
+					// this.player.src(this.lineList[index])
+					// this.player.one('loadedmetadata', () => {
+					// 	this.player.currentTime(this.playDurationSeek);
+					// 	this.player.play();
+					// });
+					this.close()
+				}
+
+			},
+			// 温馨提示
+			openTipsPop() {
+				this.$refs.tipsPopup.open()
+				this.tipsOpen = true
+				this.pause()
+			},
+			closeTipsPop() {
+				this.$refs.tipsPopup.close()
+			},
+			// 客服
+			getIsAddKf() {
+				this.qrcode = ''
+				this.qrcodeMsg = ''
+				this.isAddKf = 0
+				const data = {
+					videoId:this.videoId,
+					userId:this.userInfo.userId,
+					companyUserId:this.companyUserId,
+					companyId:this.companyId,
+					courseId:this.courseId,
+					periodId:this.periodId
+				}
+				// {videoId: this.videoId,qwUserId: this.qwUserId,corpId: this.corpId}
+				getIsAddKf(data).then(res => {
+						if (res.code == 200) {
+							if(res.data){
+								this.isAddKf = 1
+								this.getH5CourseVideoDetails()
+							}else{
+								uni.showToast({
+									title: '请联系管理员,注册为会员!',
+									icon: 'none'
+								});
+							}
+						} else {
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.playTime) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					videoId:this.videoId,
+					userId:this.userInfo.userId,
+					companyUserId:this.companyUserId
+				}
+				getFinishCourseVideo(param)
+			},
+			// 每十分钟获得积分
+			getIntegralByH5Video() {
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getIntegralByH5Video(param).then(res => {
+					if (res.code == 200) {
+						uni.showToast({
+							title: "积分+10",
+							icon: "none"
+						})
+					}
+				})
+			},
+			progressChange(e) {
+				this.bufferRate = Math.ceil(e.detail.buffered)
+				// console.log('缓冲结果',this.bufferRate)
+				// console.log('缓冲',this.playTime,this.duration)
+			},
+			// 缓冲
+			getInternetTraffic() {
+				const playVideoTime = Math.ceil(this.playTime / this.duration * 100) // 播放百分比
+				// console.log('播放百分比',playVideoTime)
+				if(this.bufferRate == 0 || this.bufferRate < playVideoTime) {
+					this.bufferRate = playVideoTime
+					console.log(this.bufferRate)
+				}
+				if(this.bufferRate == 0 || Number(this.bufferRate.toFixed(2)) == 0) return
+				const param = {
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					duration: this.playTime,
+					bufferRate: Number(this.bufferRate.toFixed(2)),
+					userId:this.userId,
+					periodId:this.periodId,
+					...this.urlOption
+				}
+				getInternetTraffic(param)
+			},
+			getErrMsg(err) {
+				let msgerr = {
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					// ip: this.ip,
+					errMsg: err
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin() {
+				
+			},
+			getLink() {
+				this.goLogin()
+				return
+				let that = this;
+				this.msg = ''
+				getRealLink({sortLink:this.sortLink}).then(res=>{
+					if(res.code == 200) {
+						this.isExpire = false
+						// 如果响应中包含真实链接,则跳转到真实链接
+						// window.location.href = res.realLink +"&sortLink="+this.sortLink+"&code="+this.code+"&time="+new Date().getTime()
+						if (this.isLogin && this.isAddKf == 1) {
+							this.getH5CourseVideoDetails()
+						}
+						if (this.videoId && this.isAddKf != 1) {
+							this.$isLoginCourse().then(
+								isLogin => {
+									this.isLogin = isLogin
+									if(isLogin){
+										this.getIsAddKf() 
+									} else {
+										this.goLogin()
+									}
+								},
+								rej => {}
+							);
+						}
+					} else {
+						this.isExpire = true
+						this.msg = '课程已过期或链接无效'
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					this.msg = '发生错误,请稍后再试'
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			},
+			/**
+			 * 节流原理:在一定时间内,只能触发一次
+			 *
+			 * @param {Function} func 要执行的回调函数
+			 * @param {Number} wait 延时的时间
+			 * @param {Boolean} immediate 是否立即执行
+			 * @return null
+			 */
+			throttle(func, wait = 500, immediate = true) {
+			    if (immediate) {
+			        if (!this.flag) {
+			            this.flag = true
+			            // 如果是立即执行,则在wait毫秒内开始时执行
+			            typeof func === 'function' && func()
+			            this.timer = setTimeout(() => {
+			                this.flag = false
+			            }, wait)
+			        }
+			    } else if (!this.flag) {
+			        this.flag = true
+			        // 如果是非立即执行,则在wait毫秒内的结束处执行
+			        this.timer = setTimeout(() => {
+			            this.flag = false
+			            typeof func === 'function' && func()
+			        }, wait)
+			    }
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.full-width-popup {
+  width: 100%;
+}
+</style>
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.footer-tips {
+			position: fixed;
+			width: 100%;
+			bottom: 144rpx;
+			text-align: center;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 12px;
+			color: #bbb;
+			transform: scale(0.8); 
+		}
+	.btns{
+		position: relative;
+		width: 100%;
+		height: 80rpx;
+		.author-btn{				
+			z-index:100;
+			position: absolute;
+			width: 100%;
+			height: 80rpx;
+			background: #ff5c03;
+			border-radius: 40rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: rgba(255, 255, 255, 1);
+		}
+	}
+	.textOne {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.textTwo {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+	.header-nav {
+		height: 88rpx;
+		@include u-flex(row, center, flex-start);
+		overflow: hidden;
+		background-color: #fff;
+		box-sizing: border-box;
+		.header-title {
+			text-align: center;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			padding: 0 10rpx 0 100rpx;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #000;
+			box-sizing: border-box;
+		}
+	}
+	.reward-list {
+		width: 100%;
+		margin-top: 20rpx;
+		margin-bottom: -40rpx;
+
+		&-group {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #222222;
+			@include u-flex(row, center, center);
+		}
+
+		&-option {
+			@include u-flex(row, center, flex-start);
+
+			&:first-child {
+				margin-right: 40rpx;
+			}
+		}
+	}
+
+	.err {
+		color: #f56c6c !important;
+	}
+
+	.kfqrcode-box {
+		background-color: #fff;
+		border-radius: 16rpx;
+		max-width: 560rpx;
+		padding: 60rpx 40rpx;
+		margin-top: -100rpx;
+		box-sizing: border-box;
+		@include u-flex(column, center, flex-start);
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 34rpx;
+		color: #222;
+		position: relative;
+		text-align: center;
+
+		.kfqrcode {
+			height: 460rpx;
+			width: 460rpx;
+		}
+	}
+
+	.kfqrcode-close {
+		width: 64rpx;
+		height: 64rpx;
+		position: absolute;
+		bottom: -100rpx;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.tipsPopup-mask {
+		position: relative;
+		width: 560rpx;
+		background-color: transparent;
+
+		.red_envelope_top {
+			width: 480rpx;
+			height: 360rpx;
+			margin: 0 auto;
+			display: inherit;
+		}
+	}
+
+	.tipsPopup-btn-box {
+		width: 456rpx;
+		height: 104rpx;
+		padding: 4rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, rgba(252, 209, 94, 1), rgba(254, 253, 251, 1));
+		border-radius: 52rpx;
+	}
+
+	.tipsPopup-btn {
+		width: 100%;
+		height: 100%;
+		background: linear-gradient(180deg, #FF9F22 0%, #FA1E05 100%);
+		border-radius: 52rpx 52rpx 52rpx 52rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #FFFFFF;
+		line-height: 96rpx;
+		text-align: center;
+	}
+
+	.tipsPopup {
+		width: 560rpx;
+		padding: 12rpx;
+		margin-top: -72rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+		border-radius: 32rpx 32rpx 32rpx 32rpx;
+		position: relative;
+
+		&-close {
+			width: 64rpx;
+			height: 64rpx;
+			position: absolute;
+			right: 0;
+			top: -188rpx;
+		}
+
+		&-line {
+			padding: 3rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, rgba(247, 245, 220, 1), rgba(250, 220, 157, 1));
+			border-radius: 24rpx;
+		}
+
+		&-box {
+			padding: 0 40rpx 40rpx 40rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+			border-radius: 24rpx;
+			@include u-flex(column, center, flex-start);
+		}
+
+		&-head {
+			@include u-flex(row, center, center);
+
+			&-title {
+				width: 364rpx;
+				height: auto;
+				margin-top: -22rpx;
+			}
+		}
+
+		&-content {
+			margin: 48rpx 0;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #222222;
+			text-align: center;
+
+			&-title {
+				margin-bottom: 26rpx;
+				font-weight: 600;
+				font-size: 40rpx;
+				color: #FF5C03;
+			}
+		}
+	}
+
+	.video-controls-box {
+		width: 100%;
+		height: 420rpx;
+		overflow: hidden;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		z-index: 2;
+		background: rgba(0, 0, 0, 0.2);
+
+		.video-play {
+			height: 72rpx;
+			width: 72rpx;
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+		}
+	}
+
+	.video-controls {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 28rpx;
+		box-sizing: border-box;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background: linear-gradient(to top, #222 0%, transparent 80%);
+
+		.video-icon {
+			height: 44rpx;
+			width: 44rpx;
+		}
+	}
+
+	.errQuesbox {
+		width: 100%;
+		max-height: 260rpx;
+		overflow-y: auto;
+		margin-top: 24rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 30rpx;
+		color: #222222;
+
+		&-item {
+			width: 100%;
+			height: 128rpx;
+			line-height: 128rpx;
+			margin-bottom: 24rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+			background: #fff;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			position: relative;
+
+			&::after {
+				content: "题目";
+				min-width: 64rpx;
+				height: 36rpx;
+				padding: 0 12rpx;
+				line-height: 36rpx;
+				background: #FF5C03;
+				box-sizing: border-box;
+				border-radius: 0rpx 0rpx 16rpx 0rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20rpx;
+				color: #fff;
+				position: absolute;
+				left: 0;
+				top: 0;
+			}
+		}
+	}
+
+	.bg {
+		background: #fff !important;
+	}
+	.timepopbox{
+		width: 560rpx;
+		padding: 32rpx;
+		box-sizing: border-box;
+	}
+	.answerPopup {
+		&-box {
+			width: 560rpx;
+			background: linear-gradient(180deg, #FFFAF6 0%, #FEECD8 100%);
+			border-radius: 32rpx 32rpx 32rpx 32rpx;
+			background-color: #fff;
+			font-weight: 400;
+			padding: 32rpx;
+			box-sizing: border-box;
+			position: relative;
+			@include u-flex(column, center, flex-start);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+
+			.tipimg {
+				width: 206rpx;
+				height: 206rpx;
+				margin-bottom: 16rpx;
+			}
+		}
+
+		&-title {
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		&-desc {
+			margin-top: 10rpx;
+			font-size: 28rpx;
+			color: #757575;
+		}
+
+		&-btn {
+			width: 464rpx;
+			height: 84rpx;
+			margin-top: 54rpx;
+			margin-bottom: 16rpx;
+			background: #FF5C03;
+			border-radius: 42rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			text-align: center;
+			line-height: 84rpx;
+		}
+	}
+
+	.popupbox {
+		width: 100%;
+		background-color: #fff;
+		border-radius: 16rpx 16rpx 0 0;
+		padding: 24rpx 32rpx;
+		position: relative;
+
+		&-head {
+			height: 60rpx;
+			margin-bottom: 30rpx;
+			text-align: center;
+			overflow-y: auto;
+			color: #414858;
+			font-size: 32rpx;
+			font-weight: bold;
+			position: relative;
+
+			.close-icon {
+				position: absolute;
+				right: 0;
+				top: 0;
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+
+		&-content {
+			height: 20vh;
+			overflow-y: auto;
+			display: flex;
+			align-items: flex-start;
+			flex-wrap: wrap;
+			gap: 32rpx;
+
+			.line-item {
+				display: inline-block;
+				min-width: 200rpx;
+				min-height: 60rpx;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				border-radius: 50rpx;
+				overflow: hidden;
+				background-color: #f7f7f7;
+				text-align: center;
+				color: #414858;
+				font-size: 28rpx;
+				line-height: 60rpx;
+			}
+
+			.line-active {
+				color: #f56c6c !important;
+				background-color: #fef0f0 !important;
+			}
+		}
+	}
+
+	.content {
+		padding-bottom: calc(var(--window-bottom) + 164rpx);
+		.video-box {
+			width: 100%;
+			height: 420rpx;
+			overflow: hidden;
+			position: relative;
+
+			#myVideo {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.video-poster {
+			width: 100%;
+			height: 420rpx;
+		}
+
+		.miantitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.subtitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.title-content {
+			padding: 0 32rpx;
+			background-color: #fff;
+			font-size: 28rpx;
+			line-height: 1.6;
+
+			.title {
+				font-size: 36rpx;
+				font-weight: 500;
+				color: #414858;
+			}
+
+			.time-or-subtitle {
+				margin-top: 12rpx;
+				color: #666666;
+			}
+		}
+
+		.descbox {
+			padding: 36rpx 32rpx;
+			margin-bottom: 20rpx;
+			background-color: #fff;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #222222;
+			line-height: 42rpx;
+			word-break: break-word;
+
+			&-title {
+				margin-bottom: 24rpx;
+				font-weight: 500;
+				font-size: 32rpx;
+			}
+
+			&-info {
+				margin-bottom: 24rpx;
+				@include u-flex(row, center, space-between);
+				font-size: 26rpx;
+				color: #757575;
+
+				&-l {
+					flex: 1;
+					@include u-flex(row, center, flex-start);
+				}
+
+				&-time {
+					margin-left: 18rpx;
+					padding-left: 18rpx;
+					position: relative;
+
+					&::after {
+						content: "";
+						width: 4rpx;
+						height: 4rpx;
+						background: #999999;
+						border-radius: 50%;
+						position: absolute;
+						left: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+
+				&-r {
+					background: transparent;
+				}
+			}
+
+			&-desc {
+				overflow: hidden;
+				position: relative;
+			}
+		}
+
+		.expand {
+			flex-shrink: 0;
+			@include u-flex(row, center, flex-end);
+			color: #FF5C03;
+			font-weight: 400;
+			font-size: 24rpx;
+
+			image {
+				width: 32rpx;
+				height: 32rpx;
+			}
+		}
+
+		.expand-ab {
+			position: absolute;
+			top: 0;
+			right: 0;
+			box-shadow: -50rpx 0 20rpx 8rpx #FFFFFF;
+			background-color: #fff;
+		}
+
+		.ques-content {
+			background-color: #fff;
+			padding: 40rpx 32rpx;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #222222;
+		}
+
+		.ques-content-tit {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.ques-title {
+			margin: 48rpx 0 34rpx 0;
+			font-weight: 500;
+			font-size: 32rpx;
+			white-space: normal;
+		}
+
+		.ques-type {
+			flex-shrink: 0;
+			min-width: 72rpx;
+			min-height: 40rpx;
+			padding: 0 12rpx;
+			margin: 0 12rpx;
+			box-sizing: border-box;
+			background: #FF5C03;
+			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: #FF5C03 !important;
+				background: #FCF0E7 !important;
+			}
+		}
+
+		.video-line {
+			min-width: 140rpx;
+			max-width: 200rpx;
+			height: 60rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+			border-radius: 50rpx 0 0 50rpx;
+			overflow: hidden;
+			background-color: #fff;
+			text-align: center;
+			color: #888;
+			font-size: 28rpx;
+			line-height: 60rpx;
+			display: inline-flex;
+			align-items: center;
+			justify-content: center;
+			position: fixed;
+			right: 0;
+			z-index: 9;
+			bottom: calc(var(--window-bottom) + 280rpx);
+			box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, .12);
+
+			image {
+				flex-shrink: 0;
+				height: 30rpx;
+				width: 30rpx;
+				margin-right: 6rpx;
+			}
+		}
+
+		.footer {
+			border-top: 1rpx solid #ededef;
+			background: #fff;
+			width: 100%;
+			position: fixed;
+			bottom: 0;
+			padding: 32rpx;
+			// padding-bottom: calc(var(--window-bottom) + 14rpx);
+			box-sizing: border-box;
+			z-index: 9;
+
+			&-btn {
+				width: 100%;
+				height: 98rpx;
+				background: #FF5C03;
+				border-radius: 49rpx 49rpx 49rpx 49rpx;
+				line-height: 98rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #FFFFFF;
+				@include u-flex(row, center, center);
+
+				&-img {
+					flex-shrink: 0;
+					width: 144rpx;
+					height: 144rpx;
+					margin-right: 8rpx;
+					margin-top: -24rpx;
+				}
+			}
+
+			&-btn-border {
+				position: relative;
+
+				&::after {
+					content: "";
+					background: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
+					position: absolute;
+					top: -2rpx;
+					left: 0;
+					height: 103rpx;
+					width: 100%;
+					z-index: -1;
+					border-radius: 49rpx 49rpx 49rpx 49rpx;
+					box-shadow: 0rpx 8rpx 11rpx 0rpx rgba(255, 92, 3, 0.3);
+					overflow: hidden;
+				}
+			}
+		}
+	}
+
+	.agreement {
+		display: inline-flex;
+		margin-top: 16rpx;
+		font-size: 24rpx;
+		color: #525252;
+		align-items: center;
+		justify-content: center;
+	}
+	 
+	.nocourse {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding-bottom: 88rpx;
+		justify-content: center;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 48rpx;
+		text-align: center;
+		
+		image {
+			width: 328rpx;
+			height: auto;
+			margin-bottom: 30rpx;
+		}
+	}
+	 
+</style>

+ 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": {}
 }

+ 26 - 43
router/router.js

@@ -1,46 +1,29 @@
+// store/index.js
 import Vue from 'vue';
-import Router from 'uni-simple-router';
+import Vuex from 'vuex';
 
-Vue.use(Router)
-import utils from '../utils/common.js'
-//初始化
-const router = new Router({
-    routes:ROUTES //路由表
-});
-
-const filters = ['/pages/auth/login','/pages/common/launch']
+Vue.use(Vuex);
 
-//进入的路由   要出去的路由
-router.beforeEach((to, from, next) => {
-	console.log("路由进入")
-	console.log(to)
-	let index = filters.indexOf(to.path);
-	//过滤
-	console.log(index)
-	if (index > -1) {
-		next();
-		return;
-	}
-	var data=utils.isLogin();
-	console.log(data)
-	if(utils.isLogin()){
-		console.log("ok")
-		next();
-	}
-	else{
-		next({path: "/pages/auth/login"});
-	}
-  //判断是否校验路由
-  // if (to.meta.isAure) {
-  //   let name = sessionStorage.getItem('username');
-  //   //有状态,并且存在sessionStorage,则next,否则返回登陆页面
-  //   if (name) {
-  //     next();
-  //   } else {
-  //     next({path: "/login",query:{redirect:to.name}});
-  //   }
-  // } else {
-  //   next();
-  // }
-});
-export default router;
+export default new Vuex.Store({
+  state: {
+    // imgpath: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com',//福本源图片请求地址
+	Requestpath: 'https://userapp.fbylive.com',//福本源接口请求地址
+	logoname:'本源一身轻',
+	imgpath: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com',//中康图片请求地址
+	// Requestpath: 'https://userapp.zkhj6.com'//中康接口请求地址
+  },
+  mutations: {
+    setCount(state, value) {
+      state.count = value;
+    },
+    setUserInfo(state, info) {
+      state.userInfo = info;
+    }
+  },
+  actions: {
+    fetchUser({ commit }) {
+      // const res = await uni.request({ url: '/api/user' });
+      commit('setUserInfo', 'noe');
+    }
+  }
+});

BIN=BIN
static/image/becomevip.png


BIN=BIN
static/image/changePlayer-icon.png


BIN=BIN
static/image/course_answer_incorrectly_img.png


BIN=BIN
static/image/course_arrow_down_icon.png


BIN=BIN
static/image/course_arrow_up_icon.png


BIN=BIN
static/image/course_close_white_icon.png


BIN=BIN
static/image/downicon.png


BIN=BIN
static/image/point.png


BIN=BIN
static/image/red_envelope_btnimg.png


BIN=BIN
static/image/red_envelope_img.png


BIN=BIN
static/image/safe.png


BIN=BIN
static/image/tc_close_icon.png


BIN=BIN
static/image/tips_title_img.png


BIN=BIN
static/image/video_icon.png


BIN=BIN
static/image/wechat.png


BIN=BIN
static/image/wxmore.png


BIN=BIN
static/images/card_icon.png


BIN=BIN
static/images/copy_icon.png


+ 0 - 0
static/image/course_answer_img.png → static/images/course_answer_img.png


BIN=BIN
static/images/customer.png


BIN=BIN
static/images/default.png


BIN=BIN
static/images/down_icon.png


BIN=BIN
static/images/empty.png


BIN=BIN
static/images/finished.png


BIN=BIN
static/images/home.png


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio