浏览代码

提交更新

puyao 15 小时之前
父节点
当前提交
607fd8b3a6
共有 66 个文件被更改,包括 8054 次插入1208 次删除
  1. 3 2
      App.vue
  2. 94 0
      api/courseAuto.js
  3. 21 1
      api/courseManage.js
  4. 32 0
      api/user.js
  5. 60 14
      common/request.js
  6. 2 1
      components/chart.vue
  7. 705 0
      components/commentBox.vue
  8. 101 18
      components/courseItem.vue
  9. 163 0
      components/descInfo.vue
  10. 207 0
      components/descInfoNav.vue
  11. 17 1
      components/dropdownPanel.vue
  12. 1 1
      components/enterpriseimg.vue
  13. 100 26
      components/liveCourse.vue
  14. 12 11
      components/newuser.vue
  15. 135 0
      components/ques.vue
  16. 151 0
      components/tki-tree/style.css
  17. 90 0
      components/tki-tree/tki-tree.vue
  18. 22 2
      components/userUrgeCourse.vue
  19. 12 9
      components/vipUserItem.vue
  20. 2 0
      main.js
  21. 4 3
      manifest.json
  22. 32 0
      note.txt
  23. 139 81
      pages.json
  24. 171 0
      pages/auth/callback.vue
  25. 5 5
      pages/auth/login.vue
  26. 116 210
      pages/auth/wxlogin.vue
  27. 64 2
      pages/course/course.vue
  28. 0 221
      pages/courseManage/course/becomeVip.vue
  29. 5 0
      pages/courseManage/manage/lableSetup.vue
  30. 7 2
      pages/courseManage/manage/userDataDetail.vue
  31. 26 12
      pages/courseManage/operation/index.vue
  32. 24 19
      pages/courseManage/statistics.vue
  33. 33 7
      pages/courseManage/vip/ManageDetail.vue
  34. 39 19
      pages/customer/index.vue
  35. 3 3
      pages/enterprise/enterprise.vue
  36. 18 12
      pages/index/index.vue
  37. 6 4
      pages/urgeCourse/urgeCourse.vue
  38. 5 2
      pages/user/about.vue
  39. 62 5
      pages/user/editUser.vue
  40. 76 32
      pages/user/index.vue
  41. 32 7
      pages/user/userInfo.vue
  42. 527 73
      pages/user/users/becomeVIP.vue
  43. 9 4
      pages/user/users/userInfo.vue
  44. 273 11
      pages/user/users/users.vue
  45. 3 3
      pages_course/course/becomeSale.vue
  46. 108 5
      pages_course/course/courseVideo.vue
  47. 33 0
      pages_course/exportlist/exportlist.vue
  48. 3 13
      pages_course/reward.vue
  49. 460 194
      pages_course/video.vue
  50. 2036 0
      pages_course/videoNew.vue
  51. 565 152
      pages_course/videovip.vue
  52. 197 0
      pages_course/webview.vue
  53. 176 0
      pages_manage/actDetail.vue
  54. 18 5
      pages_manage/manageDetail.vue
  55. 6 1
      pages_manage/manageIndex.vue
  56. 9 8
      project.config.json
  57. 36 6
      router/router.js
  58. 24 0
      uni_modules/uni-transition/changelog.md
  59. 131 0
      uni_modules/uni-transition/components/uni-transition/createAnimation.js
  60. 286 0
      uni_modules/uni-transition/components/uni-transition/uni-transition.vue
  61. 85 0
      uni_modules/uni-transition/package.json
  62. 11 0
      uni_modules/uni-transition/readme.md
  63. 1 1
      utils/common.js
  64. 27 0
      utils/courseTool.js
  65. 233 0
      utils/uni.webview.1.5.4.js
  66. 二进制
      xiaohongqun_uni_app.zip

+ 3 - 2
App.vue

@@ -3,15 +3,16 @@
 	var pingpangTimes=null;
 	var isSocketOpen=false;
 	var socket=null;
-	let nowapp='福本源'
 	export default {
+		globalData: {
+			wsDanmuUrl: 'wss://userapp.gjh2024.com/apis', // 小程序wss,h5用ws
+		},
 		data() {
 			return {
 			};
 		},
 		onLaunch: function() {
 			// uni.hideTabBar();
-			console.log(nowapp)
 		},
 		onLoad() {
 			 // #ifndef MP-WEIXIN 

+ 94 - 0
api/courseAuto.js

@@ -0,0 +1,94 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function loginByMp(data) {
+ 	 return request('/course_auto/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8');
+ }
+
+// 获取真实链接
+export function getRealLink(data) {
+	return request('/course_auto/app/course/getRealLink', data, 'GET','');
+}
+
+// h5课程简介
+export function getH5CourseByVideoId(data) {
+	return request('/course_auto/app/course/getH5CourseByVideoId', data, 'GET','');
+}
+
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+	return request('/course_auto/app/course/getH5CourseVideoDetails', data, 'GET','');
+}
+
+// 答题发红包
+export function courseAnswer(data) {
+	return request('/course_auto/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// // 记录看课时间(旧)
+// export function getFinishCourseVideo(data) {
+// 	return request('/course_auto/app/course/getFinishCourseVideo', data, 'POST', 'application/json;charset=UTF-8');
+// }
+
+// 记录看课时间(新)
+export function getFinishCourseVideo(data) {
+	return request('/course_auto/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 关注客服
+export function getIsAddKf(data) {
+	return request('/course_auto/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+	return request('/course_auto/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 每十分钟获得积分
+export function getIntegralByH5Video(data) {
+	return request('/course_auto/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 发送奖励
+export function sendReward(data) {
+	return request('/course_auto/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 播放错误上报
+export function getErrMsg(data) {
+	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded');
+}
+
+
+// 获取getWxConfig
+export function getWxConfig(data) {
+	return request('/course_auto/app/wx/mp/getWxConfig', data, 'GET','');
+}
+
+// 保存评论数据
+export function saveMsg(data) {
+	return request('/course_auto/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 撤销评论
+export function revokeMsg(data) {
+	return request('/course_auto/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8');
+}
+
+// 获取历史评论数据
+export function getComments(data) {
+	return request('/course_auto/app/course/getComments', data, 'GET');
+}
+
+// 企业理念
+export function getConcept() {
+	return request('/course_auto/app/index/getConcept', null, 'GET');
+}
+
+ export function getTypeTree(data) {
+ 	return request('/course_auto/app/user/complaint/getTypeTree', null, 'GET');
+ }
+ export function complaintRecord(data) {
+ 	return request('/course_auto/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8');
+ }

+ 21 - 1
api/courseManage.js

@@ -266,7 +266,7 @@ export function geturgeCourse(data){
 
 //获取企微账号
 export function geturgeqiwei(data){
-	return request('/companyapp/app/qwWorkTask/getMyQwUserList', data, 'GET', 'application/json;charset=UTF-8');
+	return request('/companyapp/app/qwWorkTask/getQwUserList', data, 'GET', 'application/json;charset=UTF-8');
 }
 
 //获取课程视频详情
@@ -328,4 +328,24 @@ export function getWorkTask(data){
 //获取企业理念
 export function getenterprise(data){
 	return request('/app/index/getConcept',data,  'GET', 'application/json;charset=UTF-8');
+}
+
+//获取今日课程
+export function getTodayCourse(data){
+	return request('/companyapp/app/fs/course/todayCourseList',data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//更改课程时间
+export function updataTime(data){
+	return request('/companyapp/app/fs/course/setWatchTime',data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//查看用户轨迹
+export function getuserTrajectory(data){
+	return request('/companyapp/app/operationLog/page',data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//查看用户轨迹
+export function copyuniLink(data){
+	return request('/companyapp/app/fs/course/getGotoWxAppLink',data, 'GET', 'application/json;charset=UTF-8');
 }

+ 32 - 0
api/user.js

@@ -41,4 +41,36 @@ let request = new Request().http
  //微信小程序查询用户信息
  export function getwxuser(data) {
  	 return request('/app/wx/miniapp/getMaUser',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ //查询销售部门列表
+ export function querydepartment(data) {
+ 	 return request('/companyapp/app/companyUser/deptList',data,'GET','application/json;charset=UTF-8');
+ }
+ //查询销售岗位列表
+ export function querypost(data) {
+ 	 return request('/companyapp/app/companyUser/postList',data,'GET','application/json;charset=UTF-8');
+ }
+ //查询销售角色列表
+ export function queryrole(data) {
+ 	 return request('/companyapp/app/companyUser/roleList',data,'GET','application/json;charset=UTF-8');
+ }
+ //修改销售部门和岗位
+ export function modifysaleNews(data) {
+ 	 return request('/companyapp/app/companyUser/changeUserDeptAndPost',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ //获取头像以及昵称信息
+ export function getusername(data) {
+ 	 return request('/companyapp/app/wx/h5/mp/userInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ //检查是否有头像以及昵称
+ export function checkUserInfo(data) {
+ 	 return request('/course_uniapp/app/user/checkUserInfo',data,'GET','application/json;charset=UTF-8');
+ }
+
+ //更改用户头像以及昵称
+ export function editUser(data) {
+ 	 return request('/course_uniapp/app/user/editUser',data,'POST','application/json;charset=UTF-8');
  }

+ 60 - 14
common/request.js

@@ -1,38 +1,83 @@
 // uni-app请求封装
-import {TOKEN_KEY} from '@/utils/common.js'
-export default class Request {
+import {TOKEN_WEXIN} from '@/utils/common.js'
+import {TOKEN_KEYAuto} from '@/utils/courseTool.js'
+console.log("TOKEN_KEYAuto====",TOKEN_KEYAuto)
+export default class Request {
 	http(router, data = {}, method,contentType) {
 		let that = this;
 		//曹丽芹
 		// let path = 'http://192.168.10.131:7015'
+		//涂小龙
+		// let path = 'http://192.168.10.125:7015'
+		//刘明欣
+		// let path = 'http://192.168.10.150:8080'
+		//张玉朋
+		// let path = 'http://192.168.10.158:7014'//
+		//刘明欣
+		// let path = 'http://x8489c8e.natappfree.cc'//
+		 
 		// let path = 'https://userapp.fbylive.com'//福本源
 		// let path = 'https://userapp.zkhj6.com'//中康
-		let path = 'http://company.h5.test.ylrztop.com'//云融融智
+		// let path = 'https://company.h5.test.ylrztop.com/api'//云融融智
+		// let path = 'https://userapp.ashyisheng.com'//蜂巢快药
+		// let path = 'https://userapp.whhm.ylrzcloud.com/prod-api'//惠名大药房
+		// let path = 'https://userapp.xdtongshuntang.top'//同顺堂
+		// let path = 'https://userapp.liangmiaoedu.com'//良苗
+		// let path = 'https://usercourse.beliyostore.com'//倍力优
+		// let path = 'https://userapp.bainian1000y.cn/prod-api'//百年康城
+		let path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
+		// let path = 'https://companyapp.gjh2024.com/apis'//金康键
+		
+		// let path = 'https://userapp.cqsft.vip'//四福堂
 		uni.setStorageSync('requestPath',path)
 		// uni.showLoading({
 		// 	title: '加载中'
 		// });
 		let token = uni.getStorageSync('AppToken');
+		// if(router.indexOf("/companyapp")!=-1){
+		// 	router =router.replace('/companyapp','')
+		// 	 path = 'http://192.168.10.158:7015'//
+		// 	 token = uni.getStorageSync('AppToken');
+		// }
 		if(router.indexOf("/course_uniapp")!=-1){
 			router =router.replace('/course_uniapp','')
-			// path = 'https://userapp.fbylive.com'
+			// path = 'https://userapp.fbylive.com'//福本源
+			// // path = 'https://scrm.gjh2024.com'//金康键
+			//张玉朋
+			// let path = 'http://192.168.10.158:7014'//
 			// path = 'https://userapp.zkhj6.com'//中康
-			let path = 'http://company.h5.test.ylrztop.com'//云融融智
+			// path = 'https://company.h5.test.ylrztop.com/api'//云融融智
+			// path = 'https://userapp.ashyisheng.com'//蜂巢快药(爱上嘉园)
+			// path = 'https://userapp.liangmiaoedu.com'//良苗
+			// path = 'https://usercourse.beliyostore.com'//倍力优
+			// path = 'https://userapp.bainian1000y.cn/prod-api'//百年康城
+			// path = 'https://userapp.whhm.ylrzcloud.com/prod-api'//惠名大药房
+			// path = 'https://userapp.cqsft.vip'//四福堂
+			path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
+			// path = 'https://userapp.gjh2024.com/apis'//金康键
 			// path = 'http://192.168.10.131:7014'
 			//#ifdef MP-WEIXIN
-			token =uni.getStorageSync('AppToken_MYfby')
+			token =uni.getStorageSync('TOKEN_WEXIN')
 			//#endif
 			// #ifdef H5
 			token =uni.getStorageSync('TOKEN_KEY')
 			// #endif
 		}
+		// 自动发课
+		if(router.indexOf("/course_auto")!=-1){
+			router =router.replace('/course_auto','')
+			// path = 'https://userapp.gjh2024.com/apis'//金康键
+			path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
+			token =uni.getStorageSync(TOKEN_KEYAuto)
+			console.log("TOKEN_KEYAuto===",TOKEN_KEYAuto,token)
+		}
 		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("UserToken")
+			let usertoken = uni.getStorageSync("TOKEN_WEXIN")
 			var httpContentType='application/x-www-form-urlencoded';
 			if(contentType!=undefined){
 				//application/json;charset=UTF-8
@@ -45,7 +90,7 @@ export default class Request {
 					// 'Content-Type': 'application/x-www-form-urlencoded',
 					'Content-Type': httpContentType,
 					'AppToken': token,
-					'UserToken':usertoken
+					// 'UserToken':usertoken
 				},
 				url: `${path}${router}`,
 				data: data,
@@ -62,7 +107,7 @@ export default class Request {
 						  loginPage = '/pages/auth/login';
 						  // #endif
 						  // #ifdef MP-WEIXIN
-						  loginPage = '/pages/auth/wxlogin';
+						  loginPage = '/pages/enterprise/enterprise';
 						  // #endif
 						  
 						//如果登录界面已打开,自动关闭
@@ -81,9 +126,9 @@ export default class Request {
 						})
 						return;
 					}
-					if (res.token) {
-						uni.setStorageSync(TOKEN_KEY,res.data.token)
-					}
+					// if (res.token) {
+					// 	uni.setStorageSync(TOKEN_KEY,res.data.token)
+					// }
 					resolve(res.data)
 				},
 				fail:(res) =>{
@@ -91,7 +136,8 @@ export default class Request {
 				},
 				complete:(res) =>{
 					//接口调用结束的回调函数(调用成功、失败都会执行)
-					if (res.data.code == 401) {
+					console.log('1111'+router+'1111',res)
+					if (res.data&& res.data.code == 401) {
 						return false
 					}
 					uni.hideLoading();
@@ -100,6 +146,6 @@ export default class Request {
 			})
 		})
 		 
-	}
+	}
 	
 }

+ 2 - 1
components/chart.vue

@@ -45,6 +45,7 @@
 			};
 		},
 		mounted() {
+			console.log("上课的接口数据端口",this.getratelist)
 			this.getServerData();
 		},
 		methods: {
@@ -85,7 +86,7 @@
 							// }]
 						}]
 					};
-					console.log(this.chartData)
+					console.log("上课的接口数据端口",this.chartData)
 					// this.chartData = JSON.parse(JSON.stringify(this.getratelist));
 				}, 500);
 			},

+ 705 - 0
components/commentBox.vue

@@ -0,0 +1,705 @@
+<template>
+	<view>
+		<template v-if="openCommentStatus==2">
+			<!-- <text v-for="(item, index) in activeDanmus" :key="item.commentId" class="danmu-item danmuMove"
+				:style="{
+				  top: item.top + 'px',
+				  ...item.style,
+				  'animation-duration': '8s'
+				 }" @animationend="animationend(item,index)">
+				{{ item.content }}
+			</text> -->
+		</template>
+		<view class="container-body" id="msglist" v-if="openCommentStatus==1">
+			<view class="listbox" v-for="(item, index) in msgs" :key="index" :id="'view' + index">
+				<text :class="userId&&item.userId == userId?'list-name my':'list-name'">
+					{{userId&&item.userId == userId ? '我' : item.nickName||'--'}}:
+				</text>
+				<text class="list-con">{{item.content||''}}</text>
+			</view>
+			<view class="empty" v-if="msgs&&msgs.length==0">暂无评论~</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { saveMsg,revokeMsg,getComments} from "@/api/courseAuto.js"
+	export default {
+		props: {
+			height:{
+				type: String,
+				default:'0px'
+			},
+			urlOption:{
+				type: Object,
+				default:{}
+			},
+			time:{
+				type: [String,Number],
+				default: 0
+			},
+			viewCommentNum:{
+				type: [String,Number],
+				default: 200
+			},
+			openCommentStatus:{
+				type: [String,Number],
+				default: 3
+			},
+			//  用户自己开启关闭弹幕展示 1,展示弹幕,0 关闭的弹幕
+			showDanmu:{
+				type: [String,Number],
+				default: 1
+			},
+		},
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				scrollTop: 0,
+				inputText:"",
+				isSocketOpen:false,
+				socket:null,
+				isSend:true,
+				commentList:[],
+				msgs: [],
+				pageNum: 1,
+				pageSize: 10,
+				userInfo: {},
+				userId: '',
+				pingpangTimes:null,
+				// 弹幕
+				danmuList: [],
+				tracks:[],
+				activeDanmus:[],
+				flagTime: 0,
+				danmuItemStyle:{
+					color: '#ffffff',
+					fontSize: '16px',
+					border: 'solid 1px #ffffff',
+					borderRadius: '5px',
+					padding: '2px 2px',
+					backgroundColor: 'rgba(255, 255, 255, 0.1)'
+				},
+				ctx: null,
+				danmuIndex:{}
+			}
+		},
+		mounted() {
+			this.getCommentsFun()
+			this.getUser();
+			this.initTracks()
+			if(!this.socket || !this.isSocketOpen) {
+				this.initSocket()
+			}
+		},
+		methods: {
+			back() {
+				uni.navigateBack()
+			},
+			getUser() {
+				const userInfo = uni.getStorageSync('userInfo');
+				if(userInfo&&JSON.stringify(userInfo)!='{}') {
+					this.userInfo = JSON.parse(userInfo)
+					this.userId = this.userInfo.userId || ''
+				}else {
+					this.userInfo = {}
+					this.userId = ''
+				}
+			},
+			getCommentsFun() {
+				let that = this
+				getComments({
+					pageNum: this.openCommentStatus==2 ? 1 : this.pageNum,
+					pageSize: this.openCommentStatus==2 ? this.viewCommentNum : this.pageSize,
+					courseId: this.urlOption.courseId,
+					videoId: this.urlOption.videoId,
+					openCommentStatus: this.openCommentStatus
+				}).then(res=>{
+					if(res.code==200){
+						if(this.openCommentStatus==2) {
+							this.danmuList = res.data.list.map(item=>({
+								commentId: item.commentId,
+								content: item.content,
+								time: item.time || this.time,
+								color: "#FFFFFF",
+								mode: item.mode || "scroll",
+								top: null,
+								style: {
+									color: item.isColor==1 ? item.color || this.danmuItemStyle.color : this.danmuItemStyle.color,//是否彩色1是0否
+									fontSize: item.fontSize || this.danmuItemStyle.fontSize, 
+									padding: this.danmuItemStyle.padding,
+									border:this.userInfo.userId ==item.userId ? item.color ? `solid 1px ${item.color}`: this.danmuItemStyle.border : 'none',
+									borderRadius: this.userInfo.userId==item.userId ? this.danmuItemStyle.borderRadius : 0,
+									backgroundColor: this.userInfo.userId==item.userId ? this.danmuItemStyle.backgroundColor : 'transparent'
+								},
+							}))
+							this.initDanmuIndex()
+							that.$emit('getMore',0)
+						} else if(this.openCommentStatus==1) {
+							this.danmuList = []
+							this.activeDanmus = []
+							this.danmuIndex = {};
+							let list = res.data.list.reverse()
+							if (that.pageNum == 1) {
+								that.commentList = list; 
+								that.handleScrollBottom();
+							} else {
+								that.commentList = that.commentList.concat(list);
+							}
+							that.msgs = [...list,...that.msgs]
+							if(that.commentList.length >= res.data.total || that.commentList.length >= Number(this.viewCommentNum||200)) {
+								that.$emit('getMore',1)
+							} else {
+								this.pageNum++
+								that.$emit('getMore',0)
+							}
+						} else {
+							that.danmuList = []
+							that.activeDanmus = []
+							that.danmuIndex = {};
+							that.commentList = [];
+							that.msgs = that.msgs;
+							that.$emit('getMore',0);
+						}
+					}
+					else{
+						that.danmuList = []
+						that.danmuIndex = {};
+						that.commentList = [];
+						that.msgs = that.msgs;
+						that.$emit('getMore',0);
+					}
+				})
+			},
+			saveMsg() {
+				if (this.inputText == "" || this.inputText.trim() == "") {
+					uni.showToast({
+						title: '请输入评论',
+						icon: "none"
+					})
+					return;
+				}
+				if (!this.isSend) {
+					return;
+				}
+				const param = {
+					userId: this.userId || '',
+					userType: 2, // 1-管理员,2-用户
+					courseId: this.urlOption.courseId,
+					videoId: this.urlOption.videoId,
+					type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+					content: this.inputText,
+					time: this.time,
+					fontSize: '16px',
+					mode: "scroll",
+					color: "#ffffff",
+				}
+				saveMsg(param).then(res=>{
+					if(res.code == 200) {
+						const status = res.status ? 0 : 1
+						this.sendMsg(param,status);
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: "none"
+						})
+					}
+				})
+			},
+			handleInput(val) {
+				this.inputText = val
+				if(!this.isSocketOpen) {
+					// 重新发起会话
+					this.initSocket('reStart')
+				} else {
+					this.saveMsg();
+				}
+			},
+			handleScrollBottom() {
+				setTimeout(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query.select('#msglist')
+						.boundingClientRect((res) => {
+							if(res) {
+								const scrollH = res.height;
+								this.scrollTop = res.height;
+								this.$emit('getScrollTop',this.scrollTop)
+							}
+						}).exec();
+				},500);
+			},
+			initSocket(type) { 
+				//创建一个socket连接
+				var userId = this.userInfo.userId;
+				var that = this;
+				if (this.socket) {
+					this.socket.close()
+					this.socket = null;
+				}
+				this.socket = uni.connectSocket({
+					url: getApp().globalData.wsDanmuUrl + "/app/webSocket/" + userId,
+					multiple: true,
+					success: res => {
+						console.log('WebSocket连接已打开1!');
+						that.isSocketOpen = true
+						// 保持心跳
+						if(that.pingpangTimes) {
+							clearInterval(that.pingpangTimes)
+							that.pingpangTimes= null
+						}
+						that.pingpangTimes=setInterval(()=>{
+							let data={
+								userId: that.userId || '',
+								userType: 2, // 1-管理员,2-用户
+								courseId: that.urlOption.courseId,
+								videoId: that.urlOption.videoId,
+								type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+								// msg: that.inputText,
+								cmd:'heartbeat'
+							};
+							that.socket.send({
+								data: JSON.stringify(data),
+								success: () => {
+									// console.log('WebSocket发送心条数据!');
+								},
+								fail: () => {
+									that.isSocketOpen=false
+								}
+							});
+						},15000)
+					},
+					error: res => {
+						console.log(res)
+					},
+				})
+				this.socket.onMessage((res) => {
+					console.log("收到消息parse",JSON.parse(res.data))
+					const redata = JSON.parse(res.data);
+					if(redata.cmd=="heartbeat"){
+						  //心跳
+						  // console.log("heartbeat")
+					}else if(redata.cmd=="sendMsg"){
+						that.isSend=true;
+						that.addMsg(redata);
+					}
+				})
+				//监听socket打开
+				this.socket.onOpen(() => {
+					console.log('WebSocket连接已打开2!');
+					that.isSocketOpen = true
+					that.isSend = true;
+					if(type=='reStart') {
+						// 重连的时候重新发消息
+						this.saveMsg()
+					}
+				})
+				//监听socket关闭
+				this.socket.onClose(() => {
+					that.isSocketOpen = false
+					that.socket = null
+					console.log('WebSocket连接已关闭!');
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+				//监听socket错误
+				this.socket.onError((err) => {
+					console.log("socket err:",err)
+					that.isSocketOpen = false
+					that.socket = null
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+			},
+			sendMsg(param,status) {
+				if(status == 1) {
+					this.isSend = true;
+					this.addMsg({msg: param.content,time: param.time},2)
+					return
+				}
+				if (this.isSocketOpen) {
+					var userId = this.userInfo.userId;
+					var data = {
+						userId: this.userId || '',
+						userType: 2, // 1-管理员,2-用户
+						courseId: this.urlOption.courseId,
+						videoId: this.urlOption.videoId,
+						type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+						msg: param.content,
+						cmd: 'sendMsg',
+						time: param.time,
+						fontSize: '16px',
+						mode: "scroll",
+						color: "#ffffff",
+					};
+					this.socket.send({
+						data: JSON.stringify(data),
+						success: () => {
+							console.log("发送成功")
+							this.isSend = false;
+						},
+						fail: () => {
+							console.log("发送失败")
+						}
+					});
+			
+				}
+			
+			},
+			addMsg(data,type) {
+				let obj  = {}
+				if (type==2) {
+					obj = {
+						content: data.msg,
+						courseId: this.urlOption.courseId,
+						type: 1,
+						userId: this.userId,
+						userType: 2,
+						videoId: this.urlOption.videoId,
+						nickName: '',
+						time: data.time,
+						fontSize: data.fontSize,
+						mode: data.mode,
+						color: data.color,
+					}
+				} else {
+					obj = {
+						content: data.msg,
+						courseId: this.urlOption.courseId,
+						type: data.type,
+						userId: data.userId,
+						userType: data.userType,
+						videoId: this.urlOption.videoId,
+						nickName: data.nickName,
+						time: data.time,
+						fontSize: data.fontSize,
+						mode: data.mode,
+						color: data.color,
+					}
+				}
+				if(this.openCommentStatus == 1){
+					this.msgs.push(obj)
+					this.handleScrollBottom();
+				} else if(this.openCommentStatus == 2) {
+					this.addDanmuMsg(obj)
+				}
+				this.inputText = ""
+				this.$emit("setInputText")
+			},
+			addDanmuMsg(content) {
+				const id = content.userId +'_' + new Date().getTime()
+				const mystyle = {
+					color: content.color || this.danmuItemStyle.color,
+					fontSize: content.fontSize || this.danmuItemStyle.fontSize,
+					border: content.color ? `solid 1px ${content.color}`: this.danmuItemStyle.border,
+					borderRadius: this.danmuItemStyle.borderRadius,
+					padding: this.danmuItemStyle.padding,
+					backgroundColor: this.danmuItemStyle.backgroundColor
+				}
+				const otherstyle = {
+					color: content.color || this.danmuItemStyle.color,
+					fontSize: content.fontSize || this.danmuItemStyle.fontSize,
+					padding: this.danmuItemStyle.padding,
+				}
+				const mode = content.mode || "scroll"
+				const obj = {
+					commentId: content.commentId || id,
+					userId: content.userId,
+					content: content.content,
+					time: this.flagTime + 1,
+					color: content.color || this.danmuItemStyle.color,
+					style: this.userInfo.userId == content.userId ? mystyle : otherstyle,
+					top: null
+				}
+				if(this.showDanmu == 0) return
+
+				// 如果danmuList超过最大大小,移除旧的弹幕
+				const maxDanmuListSize = 10000; // 设置最大大小
+				if (this.danmuList.length >= maxDanmuListSize) {
+					this.danmuList.shift(); // 移除最旧的弹幕
+				}
+				this.danmuList.push(obj);
+			
+				// 更新索引
+				if (!this.danmuIndex[obj.time]) {
+					this.danmuIndex[obj.time] = [];
+				}
+				this.danmuIndex[obj.time].push(obj);
+			},
+			closeWSocket() {
+				if(this.socket!=null){
+					this.socket.close()
+				}
+				if(this.pingpangTimes) {
+					clearInterval(this.pingpangTimes)
+					this.pingpangTimes= null
+				}
+			},
+			initTracks() {
+				this.tracks = [];
+				const trackHeight = 22; // 每行高度
+				const trackCount = 3;
+				for (let i = 0; i < trackCount; i++) {
+					this.tracks.push({
+						top: i * trackHeight + 10,
+						isFree: true,
+						releaseTime: 0 // 轨道释放时间
+					});
+				}
+			},
+			// 获取字体高度
+			getTextWidth(content) {
+				if (!this.ctx) {
+					this.ctx = uni.createCanvasContext('myCanvas')
+				}
+				const metrics = this.ctx.measureText(content)
+				return Math.ceil(metrics.width)
+			},
+			// 分配轨道
+			getFreeTrack(item) {
+				const screenWidth = uni.getSystemInfoSync().screenWidth;
+				const width = this.getTextWidth(item.content);
+				const passWidth = width + screenWidth;
+				const duration = 8; // 持续时间(秒)
+				const currentTime = Date.now();
+			
+				for (let i = 0; i < this.tracks.length; i++) {
+					if (this.tracks[i].isFree || this.tracks[i].releaseTime <= currentTime) {
+						this.tracks[i].isFree = false;
+						this.tracks[i].releaseTime = currentTime + Math.ceil(duration * 1000 / passWidth * width) + 1000;
+						return this.tracks[i].top;
+					}
+				}
+			
+				// 无可用轨道
+				if (this.userInfo.userId && item.userId == this.userInfo.userId) {
+					// console.log("自己发的弹幕");
+					let trackHeight = this.tracks[this.tracks.length - 1].top;
+					return Math.random() * trackHeight + 16; // 自己发的弹幕随机高度
+				} else {
+					// console.log("无可用轨道");
+					return 'abandon';
+				}
+			},
+			// 初始化时建立索引
+			initDanmuIndex() {
+			    this.danmuIndex = {};
+			    this.danmuList.forEach((item) => {
+			        if (!this.danmuIndex[item.time]) {
+			            this.danmuIndex[item.time] = [];
+			        }
+			        this.danmuIndex[item.time].push(item);
+			    });
+			},
+			// 检测并激活弹幕
+			checkDanmu(flagTime) {
+				this.flagTime = flagTime;
+				if(this.showDanmu == 0) return;
+				const newDanmus = this.danmuList.filter((item) => Math.abs(item.time - this.flagTime) < 1);
+				// 分配轨道高度
+				const aliveNewDanmus = newDanmus.map((item) => {
+					if (!item.top) {
+						item.top = this.getFreeTrack(item);
+					}
+					return item;
+				}).filter((item) => item.top !== 'abandon');
+				// 添加到活跃列表
+				this.activeDanmus = [...this.activeDanmus, ...aliveNewDanmus];
+				this.$emit("getActiveDanmus",this.activeDanmus)
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				this.activeDanmus = this.activeDanmus.filter((item) => item.commentId !== moveItem.commentId)
+				this.$emit("getActiveDanmus",this.activeDanmus)
+			},
+		},
+		beforeDestroy() {
+			if(this.socket!=null){
+				this.socket.close()
+			}
+			if(this.pingpangTimes) {
+				clearInterval(this.pingpangTimes)
+				this.pingpangTimes= null
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.empty {
+		@include u-flex(row, center, center);
+		padding: 24rpx 50rpx;
+		color: #999999;
+	}
+	.listbox {
+		white-space: pre-wrap;
+		letter-spacing: 1px;
+		margin-bottom: 16rpx;
+	}
+	.list-name {
+		flex-shrink: 0;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 600;
+		font-size: 28rpx;
+		color: #222222;
+		margin-right: 16rpx;
+	}
+	.my {
+		color: #FF5C03;
+	}
+	.list-con {
+		font-family: PingFang SC, PingFang SC;
+		font-size: 28rpx;
+		color: #222222;
+	}
+	.nav-bar {
+		position: fixed;
+		z-index: 9999;
+		top: 0;
+		left: 0;
+		width: 100%;
+		overflow: hidden;
+
+		.nav-bg {
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			left: 0;
+			top: 0;
+			z-index: 1;
+			background-color: #fff;
+		}
+
+		&-box {
+			position: relative;
+			padding: 0 24rpx;
+			@include u-flex(row, center, flex-start);
+			height: 88rpx;
+			box-sizing: border-box;
+			z-index: 3;
+		}
+
+		&-left {
+			width: 100%;
+			@include u-flex(row, center, flex-start);
+			overflow: hidden;
+
+			image {
+				flex-shrink: 0;
+				width: 64rpx;
+				height: 64rpx;
+				border-radius: 12rpx 12rpx 12rpx 12rpx;
+			}
+		}
+
+		&-name {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 28rpx;
+			color: #222222;
+		}
+
+		&-head {
+			flex: 1;
+			overflow: hidden;
+			margin-left: 22rpx;
+			margin-right: 22rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 23rpx;
+			color: #999999;
+		}
+	}
+
+	.page-bg {
+		position: absolute;
+		top: 0;
+		left: 0;
+	}
+
+	.container-body {
+		padding: 32rpx 30rpx;
+		box-sizing: border-box;
+	}
+
+	.TUI-message-list {
+		width: 100%;
+		box-sizing: border-box;
+	}
+	.chatinput {
+		position: fixed;
+		left: 32rpx;
+		right: 32rpx;
+		z-index: 999;
+		bottom: calc(var(--window-bottom) + 24rpx);
+		height: 96rpx;
+		background-color: green;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		@include u-flex(row, center, center);
+		padding: 0 24rpx;
+		box-sizing: border-box;
+		.uni-input {
+			flex: 1;
+			margin-right: 32rpx;
+			font-size: 30rpx;
+		}
+	
+		.send {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF !important;
+			flex-shrink: 0;
+			padding: 0 20rpx;
+			height: 72rpx;
+			background: #FF5C03 !important;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	// .danmu-item {
+	// 	position: absolute;
+	// 	top: 0;
+	// 	white-space: nowrap;
+	// 	font-size: 16px;
+	// 	height: 20px;
+	// 	display: inline-flex;
+	// 	box-sizing: border-box;
+	// 	align-items: center;
+	// }
+	// .danmuMove {
+	// 	// animation: mymove 8s linear forwards;
+	// 	// animation-duration: 8s;
+	// 	animation-timing-function: linear;
+	// 	animation-delay: 0s;
+	// 	animation-iteration-count: 1;
+	// 	animation-direction: normal;
+	// 	animation-fill-mode: forwards;
+	// 	animation-play-state: running;
+	// 	animation-name: mymove;
+	// 	will-change: transform;
+	// }
+	
+	// @keyframes mymove {
+	// 	from {
+	// 		transform: translateX(100vw);
+	// 	}
+	
+	// 	to {
+	// 		transform: translateX(-100%);
+	// 	}
+	// }
+</style>

+ 101 - 18
components/courseItem.vue

@@ -13,11 +13,34 @@
 					</view>
 				</view>
 				<view class="courselist-desc one-t" v-show="from != 'course'">{{info.courseName}}</view>
-				<view :class="from == 'course' ? 'courselist-con-timebox ':'courselist-con-timebox x-f'">
-					<view class="x-f acea-row"><u-icon class="icon" name="file-text" color="#999"
-							size="20"></u-icon>{{info.createTime}}</view>
-					<view class="x-f acea-row"><u-icon class="icon" name="clock" color="#999"
-							size="16"></u-icon>{{$formatSeconds(info.duration,1)}}</view>
+				<view :class="from == 'course' ? 'courselist-con-timebox ':'courselist-con-timebox x-f'" @click.passive.stop>
+					<view class="x-f acea-row"><u-icon class="icon" name="hourglass" color="#999"
+							size="20"></u-icon>开始时间:{{info.startDateTime?info.startDateTime:''}}</view>
+					<view class="x-f acea-row"><u-icon class="icon" name="hourglass-half-fill" color="#999"
+							size="20"></u-icon>结束时间:{{info.endDateTime?info.endDateTime:''}}</view>
+					<view class="justify-between align-center">
+						<view class="x-f acea-row"><u-icon class="icon" name="clock" color="#999"
+								size="16"></u-icon>{{$formatSeconds(info.duration,1)}}</view>
+						<view class="u-border radius50 ptb8 plr18 base-color-6" style="width: fit-content;"
+						@click="showtime=!showtime">调整看课时间</view>
+					</view>
+					<u-modal :show="showtime"  :title="titletime" @confirm="confirmtime" @close="showtime=!showtime" 
+					@cancel="showtime=!showtime" :closeOnClickOverlay="true" :showCancelButton="true">
+						<view class="slot-content">
+							<view class="justify-start align-center">
+								<view class="mr20">开始时间:</view>
+								<u-input v-model="startTimevalue"  placeholder="请选择开始时间" @focus="startTime=!startTime"></u-input>
+							</view>
+							<view class="justify-start align-center mt20">
+								<view class="mr20">结束时间:</view>
+								<u-input v-model="endTimevalue"  placeholder="请选择结束时间" @focus="endtime=!endtime"></u-input>
+							</view>
+						</view>
+					</u-modal>
+					<u-datetime-picker :show="startTime" v-model="value1" mode="time" @cancel="startTime=!startTime"
+					@confirm="confirmstart"></u-datetime-picker>
+					<u-datetime-picker :show="endtime" v-model="value2" mode="time" @cancel="endtime=!endtime"
+					@confirm="confirmend"></u-datetime-picker>
 				</view>
 			</view>
 		</view>
@@ -110,7 +133,8 @@
 	import {
 		sharecourselink,
 		buildCode,
-		getSDK
+		getSDK,
+		updataTime
 	} from '@/api/courseManage'
 	import html2canvas from 'html2canvas'
 	import wx from 'weixin-js-sdk'
@@ -151,22 +175,80 @@
 				isLongPress: false,
 				painterSrc: '',
 				showzhidao: false,
-				imgPath:this.$store.state.imgpath,
-				imgs:this.$store.state.imgpath+'/app/image/logo.png',
+				// imgPath:this.$store.state.imgpath,
+				imgs:this.$store.state.imgpath+'/app/image/logoshare.png',
+				showtime:false,
+				titletime:'调整看课时间',
+				endTimevalue:'',
+				startTimevalue:'',
+				startTime:false,
+				endtime:false,
+				value1:'00:00',
+				value2:"23:59"
 			}
 		},
-		// computed: {
-		//     imgPath() {
-		//       return this.$store.state.imgpath
-		//     }
-		//   },
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		  },
 		onLoad() {},
 		mounted() {
-			
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-
 		},
 		methods: {
+			confirmstart(e){
+				this.startTimevalue=e.value
+				this.startTime=!this.startTime
+				console.log(e)
+			},
+			confirmend(e){
+				this.endTimevalue=e.value
+				this.endtime=!this.endtime
+				console.log(e)
+			},
+			confirmtime(){
+				if(this.startTimevalue==''){
+					uni.showToast({
+						title: '请选择开始时间',
+						icon: 'none',
+						duration: 1000
+					});
+					return
+				}
+				if(this.endTimevalue==''){
+					uni.showToast({
+						title: '请选择结束时间',
+						icon: 'none',
+						duration: 1000
+					});
+					return
+				}
+				this.showtime=!this.showtime
+				const data={
+					periodId:this.info.periodId,
+					courseId:this.info.courseId,
+					videoId:this.info.videoId,
+					startDateTime:this.info.startDateTime.substring(0, 10)+' '+this.startTimevalue+":00",
+					endDateTime:this.info.endDateTime.substring(0, 10)+' '+this.endTimevalue+":59"
+				}
+				updataTime([data]).then(res=>{
+					if(res.code==200){
+						uni.showToast({
+							title: '完成看课时间调整!',
+							icon: 'none',
+							duration: 1000
+						});
+						this.$emit('retime',1)
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+							duration: 1000
+						});
+					}
+				})
+			},
 			handleClick(){
 				this.parentMethod();
 				 this.$emit('trigger-share', {
@@ -329,7 +411,7 @@
 				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/courseVideo?videoId='+info.videoId
+					url:'/pages_course/course/courseVideo?videoId='+info.videoId+'&id='+info.id+'&periodId='+info.periodId
 				})
 
 			},
@@ -359,7 +441,7 @@
 					companyId: this.user.companyId,
 					companyUserId: this.user.userId,
 					courseId: this.info.courseId,
-					time: this.time,
+					effectiveDuration: this.time,
 					videoId: this.info.videoId,
 					periodId:this.info.periodId,
 					id:this.info.id
@@ -435,8 +517,9 @@
 					fileId: this.info.fileId,
 					courseName: this.info.courseName,
 					videoId:this.info.videoId,
-					
+					periodId:this.info.periodId
 				}
+				console.log()
 				uni.navigateTo({
 					url: '/pages/courseManage/statistics?info=' + JSON.stringify(info)
 				})

+ 163 - 0
components/descInfo.vue

@@ -0,0 +1,163 @@
+<template>
+	<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="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+					<image :src="imgPath+'/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 || ''}}</text>
+			<view :class="isExpand ? 'expand': 'expand expand-ab'" v-if="isLogin&&isAddKf==1&&textHeight > 21">
+				<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+				<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+				<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isLogin: {
+				type: Boolean,
+				default: false,
+			},
+			isAddKf: {
+				type: [String,Number],
+				default: 0,
+			},
+			courseInfo: {
+				type: Object,
+				default: {},
+			},
+		},
+		computed:{
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+		},
+		data() {
+			return {
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+			}
+		},
+		methods: {
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							if(data) {
+								this.textHeight = data.height
+							}
+						})
+						.exec();
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.descbox {
+		padding: 0 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 {
+			padding: 24rpx 0;
+			font-weight: 500;
+			font-size: 32rpx;
+		}
+	
+		&-info {
+			padding-top: 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;
+			margin-top: 20rpx;
+		}
+	}
+	.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;
+	}
+	
+</style>

+ 207 - 0
components/descInfoNav.vue

@@ -0,0 +1,207 @@
+<template>
+	<view style="background-color: #fff;padding-bottom: 116rpx;">
+		<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>
+		<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="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+						<image :src="imgPath+'/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 || ''}}</text>
+				<view :class="isExpand ? 'expand': 'expand expand-ab'" v-if="isLogin&&isAddKf==1&&textHeight > 21">
+					<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+					<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+					<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isLogin: {
+				type: Boolean,
+				default: false,
+			},
+			isAddKf: {
+				type: [String,Number],
+				default: 0,
+			},
+			courseInfo: {
+				type: Object,
+				default: {},
+			},
+		},
+		computed:{
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+		},
+		data() {
+			return {
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+			}
+		},
+		methods: {
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							if(data){
+								this.textHeight = data.height
+							}
+						})
+						.exec();
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.miantitlebox {
+		padding: 30rpx 32rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #222222;
+	}
+	.subtitlebox {
+		padding: 30rpx 0;
+		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: 14rpx 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;
+			margin-top: 20rpx;
+		}
+	}
+	.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;
+	}
+	
+</style>

+ 17 - 1
components/dropdownPanel.vue

@@ -4,7 +4,7 @@
 			<view class="mask" :class="showMask ? 'show' : 'hide'" :style="{top: top}" @tap="tapMask"></view>
 			<view class="navs">
 				<view class="c-flex-center" :class="{ 'c-flex-center': index > 0, actNav: index === actNav }"
-					v-for="(item, index) in navData" :key="index" @click="navClick(item,index)">
+					v-for="(item, index) in filterData" :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 ? '取消':'批量'}}
@@ -88,6 +88,14 @@
 			// 		this.showMask=false
 			// 	}
 			// }
+			navData(newVal,oldVal){
+				console.log(newVal,oldVal)
+				// if(newVal==2){
+				// 	console.log(newVal,oldVal)
+				// 	this.popupShow=false
+				// 	this.showMask=false
+				// }
+			}
 		},
 		computed: {
 		    imgPath() {
@@ -139,6 +147,14 @@
 					this.actNav = null
 					return
 				}
+				if(item.type=='click'){
+					this.popupShow = false
+					this.showMask = false
+					this.$emit('onChange', this.actNav);
+					this.$emit('onClick', item);
+					this.actNav = index;
+					return
+				}
 
 				this.titname = index
 				this.$emit('onClick', item);

+ 1 - 1
components/enterpriseimg.vue

@@ -3,7 +3,7 @@
 		<view class="top-content ">
 			<view class="status_bar" :style="{height: statusBarHeight+'px'}"></view>
 			<!-- 这里是状态栏 -->
-			<view class="top-title">企业理念</view>
+			<view class="top-title">关于</view>
 		</view>
 		<view :style="{marginTop: `calc(${statusBarHeight}px + 88rpx)`}">
 			<image :src="enterpriseimg"

+ 100 - 26
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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/idle.png" mode="aspectFill"></image>
+					<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/streaming.png" mode="aspectFill"></image>
+					<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/finished.png" mode="aspectFill"></image>
+					<image :src="imgPath+'/app/images/finished.png'" mode="aspectFill"></image>
 				</view>
 			</view> -->
 			<!-- <view class="x-bc">
@@ -23,17 +23,22 @@
 					<text>{{item.name}}</text><u-icon class="arrow-down" name="arrow-down" :color="searchbarNav == index ?'#1677ff':'#999'" size="12"></u-icon>
 				</view>
 			</view> -->
-			<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"
+			<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset"
+			@onClick="selindex">
+			<!-- <view class="justify-center align-center">
+				<view class="u-border ptb4 plr20 radius50 fs24 base-color-6">上一页</view>
+				<view class="mlr20">1</view>
+				<view class="u-border ptb4 plr20 radius50 fs24 base-color-6">下一页</view>
+			</view> -->
+				<scroll-view scroll-y="true" class="hb"  :refresher-enabled="isEnableds" @refresherrefresh="pullDownRefreshs"
+					:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)" @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"
+						<u-search placeholder="搜索课程" v-model="keyword" :showAction="false" height="30px"
 							@search='searchKeyword'></u-search>
 					</view>
-					<view v-if="searchbarNav == 0">
+					<view v-if="searchbarNav == 1">
 						<view class="boxnav x-bc">
 							<view class="boxnav-item" v-for="(item,index) in courseList" :key="index">
 								<view class="boxnav-item-info one-t"
@@ -44,6 +49,7 @@
 					</view>
 					<u-loadmore :status="status" />
 				</scroll-view>
+				
 			</dropdownPanel>
 		</view>
 		<view  class="justify-between align-center mb20 mlr20 mt20 ">
@@ -51,24 +57,27 @@
 				@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"
+			<scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="isEnableds" :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"  @trigger-share="handleShare" :parent-method="parentMethod"/>
+						:info="item"  @trigger-share="handleShare" :parent-method="parentMethod" @retime='reflashtime'/>
 					<u-loadmore :status="loadStatus" />
 				</view>
 			</scroll-view>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
+		:loading-text="loadingtext"></u-loading-page>
 	</view>
 </template>
 
 <script>
 	import {
 		getFsCourseList,
-		getCourseVdieoList
+		getCourseVdieoList,
+		getTodayCourse,
 	} from "@/api/courseManage.js"
 	import dropdownPanel from "@/components/dropdownPanel.vue"
 	import courseItem from "@/components/courseItem.vue"
@@ -81,10 +90,16 @@
 		props: ['parentMethod'],
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				user: {},
 				filterData: [{
-						name: '训练营-营期',
+						name: '今日课程',
 						value: 0,
+						type: 'click',
+					},{
+						name: ' 我的课程',
+						value: 1,
 					},
 				],
 				contentH: 0,
@@ -92,9 +107,9 @@
 				courseList: [],
 				courseId: '',
 				searchbarNav: 0,
-				courserIndex: '',
+				courserIndex: null,
 				searchbar: [{
-						name: '训练营-营期'
+						name: '我的课程'
 					},
 					{
 						name: '课程状态'
@@ -141,16 +156,65 @@
 					scrollTop: 0
 				},
 				shareConfig:'',
-				titleName:''
+				titleName:'',
+				seltoday:0
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		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()
+			this.gettodaylist()
+			console.log(this.courserIndex)
 		},
 		methods: {
+			reflashtime(){
+				this.keywordlist=''
+				this.params.pageNum=1
+				this.dataList=[]
+				this.gettodaylist()
+				this.getFsCourseList('refresh')
+			},
+			gettodaylist(){
+				const data={
+					pageNum:this.params.pageNum,
+					pageSize:this.params.pageSize,
+				}
+				getTodayCourse(data).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						this.viewload=false
+						this.dataList=res.data.list
+						if ( res.data.isLastPage) {
+							this.loadStatus = 'nomore'
+						} else {
+							this.loadStatus = 'loadmore'
+						}
+					}else{
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			},
+			selindex(e){
+				this.seltoday=e.value
+				if(e.value==0){
+					this.params.pageNum = 1
+					this.gettodaylist()
+				}else{
+					this.params.pageNum = 1
+					this.keywordlist=''
+					this.getFsCourseList('refresh')
+				}
+				console.log(e)
+			},
 			handleShare(config) {
 			      // 保存分享配置到父页面数据
 			      this.shareConfig = config;
@@ -173,15 +237,24 @@
 				this.getFsCourseList()
 			},
 			handleCourse(item,index) {
+				console.log(index)
 				this.courserIndex = index
 				this.titleName=item.periodName
 				this.actid=item.periodId
 			},
 			confirm() {
+				if(this.actid==''){
+					uni.showToast({
+						icon: 'none',
+						title: '请选择课程',
+					});
+					return
+				}
 				this.courseId = this.actid
-				this.filterData[0].name=this.titleName
-				console.log(this.filterData[0].name)
+				this.filterData[1].name=this.titleName
+				console.log(this.filterData[1].name)
 				this.params.pageNum=1
+				// this.getListInit()
 				this.getListData('refresh')
 			},
 			searchKeyword(value){
@@ -240,9 +313,9 @@
 						} else {
 							this.status = 'loadmore'
 						}
-						this.courseId=this.courseList[0].periodId
-						this.filterData[0].name=this.courseList[0].periodName
-						this.getListInit()
+						// this.courseId=this.courseList[0].periodId
+						// this.filterData[1].name=this.courseList[0].periodName
+						// this.getListInit()
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -257,9 +330,6 @@
 			clickSearchbar(type) {
 				this.searchbarNav = type == this.searchbarNav ? 'colse' : type
 			},
-			mescrollInit(mescroll) {
-				this.mescroll = mescroll;
-			},
 			getListInit() {
 				this.params.pageNum = 1
 				this.getListData('refresh')
@@ -331,7 +401,11 @@
 					this.triggered = false;
 					uni.stopPullDownRefresh()
 					this.params.pageNum = 1;
-					this.getListData('refresh')
+					if(this.seltoday==0){
+						this.gettodaylist()
+					}else{
+						this.getListData('refresh')
+					}
 				}, 500)
 			}
 		}

+ 12 - 11
components/newuser.vue

@@ -5,17 +5,17 @@
 			<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="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 class="username">{{user.nickname}}</view>
 					</view>
 				</view>
-			</view>
+			</view> -->
 			
 			<view class="company" v-if="user!=null">
 				<image :src="imgPath+'/app/images/icon_comp.png'"></image>
@@ -37,11 +37,11 @@
 			 	</view>
 			</view>
 		</view>
-		<view class="p20">
+		<!-- <view class="p20">
 			<view class="btn-box" v-if="usertoken">
 				<view class="sub-btn" @click="this.show=!this.show">退出登录</view>
 			</view>
-		</view>
+		</view> -->
 		<u-modal :show="show" @confirm="showLogout" :title="title" :content='content' :showCancelButton="true"
 		@cancel='this.show=!this.show'></u-modal>
 	</view>
@@ -61,8 +61,9 @@
 			}
 		},
 		mounted() {
-			this.usertoken=uni.getStorageSync('AppToken_MYfby')
-			this.user=uni.getStorageSync('phoneNumber')
+			this.usertoken=uni.getStorageSync('TOKEN_WEXIN')
+			this.user=JSON.parse(uni.getStorageSync('userInfo')) 
+			console.log(this.user)
 		},
 		computed: {
 		    imgPath() {
@@ -72,14 +73,14 @@
 		methods: {
 			loginto(){
 				uni.navigateTo({
-					url:'/pages/auth/wxlogin'
+					url:'/pages/enterprise/enterprise'
 				})
 			},
 			showLogout(){
-				uni.removeStorageSync('AppToken_MYfby')
-				// uni.removeStorageSync('AppToken_MYfby')
+				uni.removeStorageSync('TOKEN_WEXIN')
+				uni.removeStorageSync('userInfo')
 				uni.navigateTo({
-					url:'/pages/auth/wxlogin'
+					url:'/pages/enterprise/enterprise'
 				})
 			},
 			navTo(url){

+ 135 - 0
components/ques.vue

@@ -0,0 +1,135 @@
+<template>
+	<view class="ques-content">
+		<view class="ques-content-tit" v-show="openCommentStatus!=1">问答题</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,index)">
+				<view>
+					{{numberToLetter(idx)}}.
+				</view>
+				<view>{{option.name}}</view>
+			</view>
+		</view>
+		<view class="empty" v-if="quesList&&quesList.length==0">暂未设置题目~</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: ['quesList','openCommentStatus'],
+		data() {
+			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
+					}
+				}
+			}
+		},
+		methods: {
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			handleAnswer(item, option,index) {
+				const param = {
+					item,
+					option,
+					index
+				}
+				this.$emit("handleAnswer", param)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.empty {
+		@include u-flex(row, center, center);
+		padding: 24rpx 50rpx;
+		color: #999999;
+	}
+	.ques-content {
+		background-color: #fff;
+		padding: 24rpx 32rpx 24rpx 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;
+		}
+	}
+</style>

+ 151 - 0
components/tki-tree/style.css

@@ -0,0 +1,151 @@
+.tki-tree-mask {
+  position: fixed;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  z-index: 9998;
+  background-color: rgba(0, 0, 0, 0.6);
+  opacity: 0;
+  transition: all 0.3s ease;
+  visibility: hidden;
+}
+.tki-tree-mask.show {
+  visibility: visible;
+  opacity: 1;
+}
+.tki-tree-cnt {
+  position: fixed;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  z-index: 9999;
+  top: 900rpx;
+  transition: all 0.3s ease;
+  transform: translateY(100%);
+}
+.tki-tree-cnt.show {
+  transform: translateY(0);
+}
+.tki-tree-bar {
+  background-color: #fff;
+  height: 72rpx;
+  padding-left: 20rpx;
+  padding-right: 20rpx;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  box-sizing: border-box;
+  border-bottom-width: 1rpx !important;
+  border-bottom-style: solid;
+  border-bottom-color: #f5f5f5;
+  font-size: 32rpx;
+  color: #757575;
+  line-height: 1;
+}
+.tki-tree-bar-confirm {
+  color: #07bb07;
+}
+.tki-tree-view {
+  position: absolute;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  top: 72rpx;
+  background-color: #fff;
+  padding-top: 20rpx;
+  padding-right: 20rpx;
+  padding-bottom: 20rpx;
+  padding-left: 20rpx;
+}
+.tki-tree-view-sc {
+  height: 100%;
+  overflow: hidden;
+}
+.tki-tree-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 26rpx;
+  color: #757575;
+  line-height: 1;
+  height: 0;
+  opacity: 0;
+  transition: 0.2s;
+  position: relative;
+  overflow: hidden;
+}
+.tki-tree-item.show {
+  height: 80rpx;
+  opacity: 1;
+}
+.tki-tree-item.showchild:before {
+  transform: rotate(90deg);
+}
+.tki-tree-item.last:before {
+  opacity: 0;
+}
+.tki-tree-icon {
+  width: 26rpx;
+  height: 26rpx;
+  margin-right: 8rpx;
+}
+.tki-tree-label {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  height: 100%;
+  line-height: 1.2;
+}
+.tki-tree-check {
+  width: 40px;
+  height: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.tki-tree-check-yes,
+.tki-tree-check-no {
+  width: 20px;
+  height: 20px;
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  border-top-width: 1rpx;
+  border-left-width: 1rpx;
+  border-bottom-width: 1rpx;
+  border-right-width: 1rpx;
+  border-style: solid;
+  border-color: #07bb07;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  box-sizing: border-box;
+}
+.tki-tree-check-yes-b {
+  width: 12px;
+  height: 12px;
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  background-color: #07bb07;
+}
+.tki-tree-check .radio {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+.tki-tree-check .radio .tki-tree-check-yes-b {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+.hover-c {
+  opacity: 0.6;
+}

文件差异内容过多而无法显示
+ 90 - 0
components/tki-tree/tki-tree.vue


+ 22 - 2
components/userUrgeCourse.vue

@@ -1,5 +1,5 @@
 <template>
-	<view>
+	<view class="container">
 		<!-- <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">
@@ -29,7 +29,9 @@
 				</scroll-view>
 			</view>
 		</dropdownPanel> -->
-		<view>
+		<view style="flex: 1;
+		height: calc(100% - 80rpx);
+		overflow-y: scroll;">
 			<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"
@@ -46,6 +48,10 @@
 				<u-loadmore :status="status" />
 			</scroll-view>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
+		:loading-text="loadingtext"></u-loading-page>
+		<view class="h120"></view>
+		
 	</view>
 </template>
 
@@ -63,6 +69,8 @@
 		},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				filterData: [{
 					name: '营期',
 					value: 0,
@@ -132,6 +140,7 @@
 				}
 				getWorkTask(data).then(res=>{
 					if (res.code == 200) {
+						this.viewload=false
 						if (type == 'refresh') {
 							this.userlist = res.data.list
 						} else {
@@ -291,6 +300,17 @@
 </script>
 
 <style scoped lang="scss">
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222;
+		display: flex;
+		flex-direction: column;
+		/* #ifdef MP-WEIXIN */
+		height: 100vh;
+		/* #endif */
+	}
 	.select {
 		color: #1773ff;
 		background-color: #e6ecff;

+ 12 - 9
components/vipUserItem.vue

@@ -10,7 +10,7 @@
 						labelColor="#FF6C47" />
 				</u-checkbox-group>
 				<view class="list-item w100" @click="morepage(item)" >
-					<view class="list-item-head x-bc">
+					<view class="list-item-head x-bc" >
 						<view class="x-f" style="flex: 1;overflow: hidden;">
 							<u-avatar :src='item.avatar'></u-avatar>
 							<view class="list-item-head-l">
@@ -26,16 +26,20 @@
 								</view>
 							</view>
 						</view>
-						<image class="phone" :src="imgPath+'/app/manergevip/phone.png'" mode="aspectFill"
-							v-if="!isShowSelectAll" @click="tophone(item.phone)" @click.passive.stop></image>
+						<view @click.passive.stop>
+							<image class="phone" :src="imgPath+'/app/manergevip/phone.png'" mode="aspectFill"
+								v-if="!isShowSelectAll" @click="tophone(item.phone)" ></image>
+						</view>
 					</view>
 					<view class="list-item-desc">
 						<view class="taglist  ">
+							<view class="base-color-9 fs24">归属</view>
 							<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 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-9">#{{item.userId}}</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>
@@ -59,7 +63,6 @@
 							<!-- <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>
 				</view>
 			</view>
@@ -324,8 +327,8 @@
 		&-head {
 			.phone {
 				flex-shrink: 0;
-				width: 25px;
-				height: 25px;
+				width: 80rpx;
+				height: 80rpx;
 			}
 
 			&-l {

+ 2 - 0
main.js

@@ -14,8 +14,10 @@ Vue.prototype.setData = setData;
 import {formatSeconds}from './utils/tools.js'
 Vue.prototype.$formatSeconds = formatSeconds;
 import {isLoginCourse,isLoginCourseqw} from './utils/common.js'
+import {isLoginCourseAuto} from './utils/courseTool.js'
 Vue.prototype.$isLoginCourse = isLoginCourse
 Vue.prototype.$isLoginCourseqw = isLoginCourseqw
+Vue.prototype.$isLoginCourseAuto= isLoginCourseAuto
 import store from './router/router.js' // 确保路径正确
 Vue.prototype.$store = store;
 //import router from '@/router/router.js'  

+ 4 - 3
manifest.json

@@ -109,9 +109,10 @@
     "quickapp" : {},
     /* 小程序特有相关 */
     "mp-weixin" : {
-        "appid" : "wxb9b453d37c5fad45",
+        "appid" : "wx29d26f63f836be7f",
         "setting" : {
-            "urlCheck" : true
+            "urlCheck" : true,
+            "postcss" : true
         },
         "usingComponents" : true,
         "permission" : {
@@ -142,7 +143,7 @@
         },
         "router" : {
             "mode" : "hash",
-            "base" : "./"
+            "base" : "/"
         }
     }
 }

+ 32 - 0
note.txt

@@ -0,0 +1,32 @@
+
+1.全局搜索manifest.json中的小程序配置中的appid(小程序发布)
+
+小程序appid
+福本源:wxb9b453d37c5fad45
+云联融智:wxd70f99287830cb51
+蜂巢快药(爱上嘉园):wx903d9aee9cffb320
+好宜生佳园(蜂巢):wxa843c1c3e52efbf8
+中康未来智慧:wxedde588767b358b1
+同顺堂:wx6fbd7f185732fd95
+良苗:wx80dc06697b583cd9
+倍力优看课:wx301ab2fad04c658a
+德瑞康:wx29d26f63f836be7f
+金慷建:wxa73f0d48f1f2f66c
+
+2.router.js中文件内 state的图片地址以及小程序名称配置更换
+3./common/request.js 中的 接口地址
+					let path = 'https://userapp.fbylive.com'//福本源  更换
+4.pages_course/webview.vue 页面中的webviewUrl替换,这个webview的页面为后台提供地址,页面里面需要使用服务号的appid
+
+5.h5打包需要个更换appid
+/pages/user/users/becomVIP.vue页面 h5 appid
+// let appid = "wx961fadab9bcb792b"; //微信APPid(福本源)
+// let appid = "wx93ce67750e3cfba3"; //微信APPid(云联融智)
+//let appid = "wxea1da2b708ab3c2f"; //微信APPid(蜂巢快药)
+// let appid = "wx3de90a39feb8107a"; //微信APPid(中康未来智慧)
+// let appid = "wxec49f9d783abf233"; //微信APPid(惠名大药房)
+// let appid = "wx5a0f7e1932e2689e"; //微信APPid(同顺堂)
+// let appid = "wx568ea6b70350c585"; //微信APPid(倍力优)
+// let appid = "wx0d021524695f1943"; //微信APPid(百年康城)
+// let appid = "wx090c5f399d65456e"; //微信APPid(青岛市北德瑞康)
+// let appid = "wx52298c1781d5cc99"; //微信APPid(金慷建)

+ 139 - 81
pages.json

@@ -183,7 +183,12 @@
 				"navigationBarTextStyle": "black",
 		        "navigationBarTitleText": "员工详情",
 		        "enablePullDownRefresh": false,
-		        "navigationStyle": "custom",
+		        // #ifdef H5
+		        "navigationStyle": "custom", 
+		        // #endif
+		        // #ifndef H5
+		        "navigationStyle": "default",
+		        // #endif
 		        "app-plus": {
 		        	"bounce": "none"
 		        }
@@ -298,26 +303,6 @@
 				}
 			}
 		},
-		{
-			"path" : "pages/courseManage/manage/manageDetail",
-			"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/manage/changeVip",
 			"style" : 
@@ -337,20 +322,6 @@
 				}
 			}
 		},
-		{
-			"path" : "pages/courseManage/course/becomeVip",
-			"style" : 
-			{
-				"navigationBarTitleText" : "注册",
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		},
 		{
 			"path" : "pages/courseManage/manage/setup",
 			"style" : 
@@ -364,58 +335,14 @@
 				}
 			}
 		},
-		{
-			"path" : "pages/courseManage/manage/manageIndex",
-			"style" : 
-			{
-				"navigationBarTitleText" : "管理",
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"enablePullDownRefresh": false,
-				// #ifdef H5
-				"navigationStyle": "custom",
-				// #endif
-				// #ifndef H5
-				"navigationStyle": "default",
-				// #endif
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		},
-		{
-			"path" : "pages/courseManage/course/courseVideo",
-			"style" : 
-			{
-				"navigationBarTitleText" : "课程详情",
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"enablePullDownRefresh": false,
-				// #ifdef H5
-				"navigationStyle": "custom", 
-				// #endif
-				// #ifndef H5
-				"navigationStyle": "default",
-				// #endif
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		},
-		{
-			"path" : "pages/courseManage/course/becomeSale",
-			"style" : 
-			{
-				"navigationBarTitleText" : "注册"
-			}
-		},
+		
 		{
 			"path" : "pages/course/course",
 			"style" : 
 			{
 				"navigationBarTitleText" : "课程库",
 				"navigationBarTextStyle": "black",
-				"enablePullDownRefresh": true,
+				"enablePullDownRefresh": false,
 				// "navigationStyle": "custom",
 				"app-plus": {
 					"bounce": "none"
@@ -465,6 +392,69 @@
 		}
     ],
 	"subPackages": [
+		{
+			"root": "pages_manage",
+			"pages": [
+				{
+					"path" : "manageDetail",
+					"style" : 
+					{
+						"navigationBarTitleText" : "群管详情页",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": false,
+						// #ifdef H5
+						"navigationStyle": "custom",
+						// #endif
+						// 小程序保留默认
+						// #ifndef H5
+						"navigationStyle":"default",
+						// #endif
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path" : "manageIndex",
+					"style" : 
+					{
+						"navigationBarTitleText" : "管理",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": false,
+						// #ifdef H5
+						"navigationStyle": "custom",
+						// #endif
+						// #ifndef H5
+						"navigationStyle": "default",
+						// #endif
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path" : "actDetail",
+					"style" : 
+					{
+						"navigationBarTitleText" : "用户行动轨迹",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": false,
+						// #ifdef H5
+						"navigationStyle": "custom",
+						// #endif
+						// #ifndef H5
+						"navigationStyle": "default",
+						// #endif
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}
+			]
+		},
 		{
 			"root": "pages_course",
 			"pages": [
@@ -478,6 +468,32 @@
 						}
 					}
 				},
+				{
+					"path" : "course/becomeSale",
+					"style" : 
+					{
+						"navigationBarTitleText" : "注册"
+					}
+				},
+				{
+					"path" : "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": "video",//企微看课
 					"style": {
@@ -488,6 +504,16 @@
 						}
 					}
 				},
+				{
+					"path": "videoNew",//企微自动发课看课
+					"style": {
+						"navigationBarTitleText": "看课",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
 				{
 					"path": "reward",
 					"style": {
@@ -497,6 +523,38 @@
 							"titleNView": false
 						}
 					}
+				},
+				{
+					"path" : "webview",
+					"style" : 
+					{
+						"navigationBarTitleText" : "授权登录",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path" : "exportlist/exportlist",
+					"style" : 
+					{
+						"navigationBarTitleText" : "导出列表",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": false,
+						// #ifdef H5
+						"navigationStyle": "custom", 
+						// #endif
+						// #ifndef H5
+						"navigationStyle":"default",
+						// #endif
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
 				}
 			]
 		}

+ 171 - 0
pages/auth/callback.vue

@@ -0,0 +1,171 @@
+<template>
+  <view class="container">
+    <view class="loading">
+      <text>正在获取用户信息...</text>
+	  <view>{{userInfo}}000</view>
+	  <view>{{token}}{{res}}</view>
+	  <view @click="copy">复制res</view>
+    </view>
+  </view>
+</template>
+
+<script>
+	import uni from "@/utils/uni.webview.1.5.4.js";
+	import { loginByMp} from '@/api/user'
+export default {
+  data() {
+    return {
+      code: '',
+      userInfo: null,
+	  token:null,
+	  res:{}
+    }
+  },
+  onLoad(options) {
+    // 获取URL中的code参数(微信授权返回的)
+    this.code = this.getUrlParam('code')
+    
+    if (!this.code) {
+      uni.showToast({
+        title: '授权失败,未获取到code',
+        icon: 'none'
+      })
+      return
+    }
+    
+    // 通过code获取用户信息
+    this.getUserInfoByCode(this.code)
+  },
+  methods: {
+	  copy(){
+		  uni.setClipboardData({
+		  	data: this.res,   //data是需要复制的数据
+		    showToast: true,  //配置是否弹出提示,默认弹出提示
+		  	success: function () {
+		  		console.log('success');  //复制成功的回调函数
+		  	},
+		      fail: function () {
+		  		console.log('fail');    //复制失败的回调函数
+		  	},
+		      complete: function () {
+		  		console.log('complete'); //接口调用结束的回调函数(调用成功、失败都会执行)
+		  	},
+		  });
+	  },
+    // 获取URL参数
+    getUrlParam(name) {
+      const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
+      const r = window.location.search.substr(1).match(reg)
+      if (r != null) return decodeURIComponent(r[2])
+      return null
+    },
+    
+    // 通过code获取用户信息
+    getUserInfoByCode(code) {
+      // 调用后端API,通过code换取用户信息
+	  uni.showLoading({
+	  	title: "处理中..."
+	  });
+	  var data = {
+	  	code: this.code,
+	  	videoId: this.videoId,
+	  	companyId: this.companyId,
+	  	companyUserId: this.companyUserId
+	  }
+	  loginByMp(data).then(res => {
+		  this.res=res
+	  		uni.hideLoading();
+	  		if (res.code == 200) {
+	  			uni.setStorageSync('TOKEN_WEXIN', res.token);
+	  			this.userInfo = res.user
+				this.token= res.token
+	  			// 将用户信息传递给小程序
+				setTimeout(() => {
+				  this.postMessageToMiniProgram()
+				}, 200)
+	  		} else {
+	  			console.error('获取用户信息失败:', res.msg)
+	  			uni.showToast({
+	  			  title: res.msg || '获取用户信息失败',
+	  			  icon: 'none'
+	  			})
+	  		}
+	  	},
+	  	err => {}
+	  ).catch(err=>{
+	  	uni.hideLoading();
+	  });
+    },
+    // 向小程序发送消息
+    postMessageToMiniProgram() {
+      // 判断是否在小程序环境中
+	  uni.showToast({
+	    title:'获取用户信息失败22',
+	    icon: 'none'
+	  })
+	 //   if (wx && wx.miniProgram) {
+	 //      wx.miniProgram.postMessage({ data: ['这是从H5页面发送的消息', 'wdwdsdsf'] });
+	 //      console.log(uni.postMessage);
+	 //      console.log(111111);
+	 //    } else {
+	 //      console.error('当前环境不支持微信小程序API');
+	 //    }
+		// uni.showToast({
+		//         title:'获取用户信息失败123',
+		//         icon: 'none'
+		//       })
+		// setTimeout(() => {
+		// 	uni.navigateBack()
+		//   }, 500)
+      if (window.__wxjs_environment === 'miniprogram') {
+        // 向小程序发送用户信息
+        uni.postMessage({
+          data: {
+            type: 'user_info',
+            data: this.userInfo,
+			token: this.token, 
+          }
+        })
+        uni.showToast({
+          title:'获取用户信息失败123',
+          icon: 'none'
+        })
+        // 延迟关闭当前页面,确保消息发送成功
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 500)
+      } else {
+		  uni.showToast({
+		    title:'获取用户信息失败456',
+		    icon: 'none'
+		  })
+        // 在浏览器环境中,可以做H5版本的处理
+        console.log('非小程序环境,H5版本处理用户信息:', this.userInfo)
+        uni.setStorageSync('userInfo', this.userInfo)
+		uni.setStorageSync('TOKEN_WEXIN', this.token)
+		console.error('TOKEN_WEXIN:', this.token)
+        uni.navigateTo({
+          url: '/pages/index/index'
+        })
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.container {
+  width: 100%;
+  height: 100vh;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #fff;
+}
+
+.loading {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+</style>    

+ 5 - 5
pages/auth/login.vue

@@ -44,12 +44,11 @@ export default {
 	},
 	computed: {
 	    imgPath() {
-	      // 处理空值,返回默认路径或空字符串
-	      // if (!this.$store.state.imgpath) {
-	      //   return '' // 本地默认图
-	      // }
 	      return this.$store.state.imgpath
-	    }
+	    },
+		appid() {
+			return this.$store.state.appid
+		},
 	  },
 	onLoad(option) {
 	},
@@ -92,6 +91,7 @@ export default {
 			var data = {
 				account:this.account,
 				password: this.password,
+				appId:this.appid
 			};
 			var that=this;
 			uni.showLoading({

+ 116 - 210
pages/auth/wxlogin.vue

@@ -8,23 +8,16 @@
         		<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 class="title">{{name}}</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"
+					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">
@@ -43,19 +36,23 @@
 </template>
 
 <script>
-import { loginByMiniApp,getUserInfo } from '@/api/user'
+	import { loginByMp} from '@/api/user'
+import {loginByMiniApp , getUserInfo } from '@/api/user'
 export default {
 	data() {
 		return {
 			code:null,
 			isAgreement:false,
-			companyId:null
+			companyId:null,
 		}
 	},
 	computed: {
 	    imgPath() {
 	      return this.$store.state.imgpath
-	    }
+	    },
+		name() {
+			  return this.$store.state.logoname
+			},
 	},
 	onLoad(option) {
 		this.companyId=option.companyId
@@ -89,8 +86,6 @@ export default {
 	},
 	methods: {
 		handleAgree(){
-			console.log(123)
-			
 			if(!this.isAgreement){
 			  	uni.showToast({
 			  		icon:'none',
@@ -117,14 +112,20 @@ export default {
 		getWxCode() {
 			//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
 			//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
-			var appId="wxb9b453d37c5fad45";
-			var url="https://api.zxfh.cdwjyyh.com";
+			var appId="wx29d26f63f836be7f";
+			var url="https://company.h5.test.ylrztop.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;
+			// if(!uni.getStorageSync('userInfos')){
+			// 	uni.navigateTo({
+			// 		url:'/pages_course/webview'
+			// 	})
+			// 	return
+			// }
 		},
 		openH5(url){
 			var requestPath = uni.getStorageSync('requestPath');
@@ -153,89 +154,9 @@ export default {
 				
 			})
 		},
-		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;
+			console.log(e)
 			if(!this.isAgreement){
 				uni.showToast({
 					icon:'none',
@@ -243,93 +164,76 @@ export default {
 				});
 				return false;
 			}
+			// console.log(uni.getStorageSync('userInfos'))
+			
 			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: "登录接口调用失败",
-								});
-							 })
-							 
+				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)
+								console.log(e)
+								let code = loginRes.code // 获取开发code
+								// const userinfos=JSON.parse(uni.getStorageSync('userInfos')) 
+								loginByMiniApp({
+								   encryptedData: e.mp.detail.encryptedData,
+								   iv: e.mp.detail.iv,
+								   code: code,
+								   // nickname:userinfos.nickname,
+								   // avatar:userinfos.avatar
+								})
+								.then( res => {
+									if(res.code==200){
+										console.log(res)
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录成功",
+										});
+										uni.setStorageSync('TOKEN_WEXIN', res.token);
+										uni.setStorageSync('userInfo', JSON.stringify(res.user));
+										this.userInfo=res.user;
+										uni.hideLoading()
+										setTimeout(()=>{
+											uni.navigateTo({
+												url:'/pages/enterprise/enterprise'
+											})
+										},200)
+									}
+									else{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "授权登录失败,请重新登录",
+										});
+									}
+								   
+								 })
+							}
+						})
 					})
-				})
-				.catch(err => {
+					.catch(err => {
+						uni.showToast({
+							icon:'none',
+							title: err,
+						});
+					})
+					 
+				} else {
 					uni.showToast({
-						icon:'none',
-						title: err,
-					});
-				})
-				 
-			} else {
-				uni.showToast({
-					title: '已拒绝授权',
-					icon: 'none',
-					duration: 2000,
-				})
-			}
+						title: '已拒绝授权',
+						icon: 'none',
+						duration: 2000,
+					})
+				}
 		},
 		back() {
 			uni.navigateBack()
@@ -446,32 +350,34 @@ export default {
 			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);
-    }
+	// .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;
+	// 	text-align: center;
+	// 	line-height: 80rpx;
+	// 	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;

+ 64 - 2
pages/course/course.vue

@@ -15,6 +15,8 @@
 					<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  @click="copy" v-if="imgname!='乐氏本源'"
+					class="base-color-6 u-border ptb10 plr30 radius50 mt20">复制页面地址</view>
 				</view>
 				<!--#endif-->
 			</view>
@@ -25,6 +27,7 @@
 <script>
 	import liveCourse from "@/components/liveCourse.vue"
 	import living from "@/components/living.vue"
+	import {copyuniLink} from "@/api/courseManage.js"
 	export default {
 		components: {
 			living,
@@ -52,7 +55,13 @@
 		computed: {
 			    imgPath() {
 			      return this.$store.state.imgpath
-			    }
+			    },
+				imgname() {
+				  return this.$store.state.logoname
+				},
+				appid() {
+					return this.$store.state.appid
+				},
 			  },
 		mounted() {},
 		onShareAppMessage() {
@@ -70,6 +79,59 @@
 			}
 		},
 		methods: {
+			copyuniLinks(){
+				const data={
+					
+					linkStr:this.childdata.path + "?course=" + JSON.stringify(this.childdata.params),
+				}
+				copyuniLink(data).then(res=>{
+					console.log(res)
+				})
+			},
+			copy(){
+				uni.showLoading({
+					title: "处理中..."
+				});
+				const data={
+					appid:this.appid,
+					linkStr:this.childdata.path + "?course=" + JSON.stringify(this.childdata.params)
+				}
+				copyuniLink(data).then(res=>{
+					if(res.code==200){
+						uni.hideLoading();
+						setTimeout(() => {
+							uni.setClipboardData({
+								data:res.data,
+								// data:  this.childdata.path + "?course=" + JSON.stringify(this.childdata.params),
+								success: () => {
+									uni.showToast({
+										title: '链接已复制',
+										icon: 'none',
+										duration: 2000
+									});
+								},
+								fail: () => {
+									uni.showToast({
+										title: '复制失败',
+										icon: 'none'
+									});
+								}
+							});
+						}, 200)
+					}else{
+						uni.hideLoading();
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				})
+
+				// copyuniLinks(){
+					
+				// },
+				
+			},
 			closeShare() {
 				this.showShare = false
 				// console.log('open');
@@ -115,7 +177,7 @@
 			top: 0;
 			left: 0;
 			width: 100%;
-			height: 100%;
+			height: 80%;
 			opacity: 0;
 		}
 	.sharePop {

+ 0 - 221
pages/courseManage/course/becomeVip.vue

@@ -1,221 +0,0 @@
-<template>
-	<view class="centerV hb base-bg-f">
-		<view class="w100 centerV" v-if="isH5vip!=true">
-			<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>
-				<view class="sure" @click="becomeVipfun">确定</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 mt80">{{tips}}!</view>
-			</view>
-		</u-popup>
-	</view>
-</template>
-
-<script>
-	import {
-		becomeVip
-	} from "@/api/courseManage.js"
-	import {
-		loginByMp
-	} from '@/api/user'
-	const isWechat = () => {
-		return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
-	}
-	export default {
-		data() {
-			return {
-				userId: '',
-				companyId: '',
-				companyUserId: '',
-				code: '',
-				showvip: false,
-				user:'',
-				tips:'',
-				isH5vip:false,
-				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
-			} else {
-				this.companyId = option.companyId
-				this.userId = option.userId
-				this.companyUserId = option.companyUserId
-				this.code = option.code
-			}
-		},
-		onShow() {
-			this.isH5vip = uni.getStorageSync("isH5vip")
-			console.log(this.isH5vip)
-			if (this.becomeuser&&JSON.stringify(this.becomeuser)!='{}'){
-				if(uni.getStorageSync("isH5vip")==true){
-					this.becomeVipfun()
-				}else{
-					setTimeout(() => {
-						this.getWechatCode()
-						this.userId=this.user.userId
-						console.log(this.userId)
-					}, 200)
-				}
-			}
-		},
-		methods: {
-			close() {},
-			open() {},
-			becomeVipfun() {
-				uni.showLoading({
-					title: '正在加载中...'
-				})
-				if (this.becomeuser!=''){
-					this.user = uni.getStorageSync("userInfo") ? JSON.parse(uni.getStorageSync("userInfo")) : {}
-					this.userId=this.user.userId
-				} 
-				const param = {
-					companyId: this.companyId,
-					userId: this.userId,
-					companyUserId: this.companyUserId,
-				}
-				console.log(param)
-				becomeVip(param).then(res => {
-					if (res.code == 200) {
-						console.log(res)
-						// if(this.becomeuser==''){
-						// 	setTimeout(()=>{
-								this.showvip = true
-								this.tips=res.msg
-						// 	},1000)
-						// }
-					} else {
-						uni.showToast({
-							title: res.msg,
-							icon: 'none'
-						});
-					}
-				})
-			},
-			// 获取code
-			getWechatCode() {
-				if (isWechat) {
-					let appid = "wx93ce67750e3cfba3"; //微信APPid
-					let code = this.getUrlCode().code; //是否存在code
-					let local = window.location.href;
-					if (code == null || code === "") {
-						let urlPaths = local.split("/courseh5");
-						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()
-					}
-				}
-			},
-			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: "处理中..."
-				});
-				// let that = this;
-				var data = {
-					code: this.code,
-					companyUserId:this.companyUserId
-				}
-				loginByMp(data).then(res => {
-						uni.hideLoading();
-						if (res.code == 200) {
-							// 登录后存token和用户信息
-							uni.setStorageSync('UserAppToken', res.token);
-							this.isH5vip = uni.setStorageSync("isH5vip",res.isH5Vip);
-							uni.setStorageSync('userInfo', JSON.stringify(res.user));
-							let beforLoginUrl = uni.getStorageSync('beforLoginPage');
-							// console.log("beforLoginUrl:"+beforLoginUrl);
-							console.log(`登录成功后跳转${beforLoginUrl}`);
-							uni.reLaunch({
-								url: beforLoginUrl
-							});
-						} else {
-							uni.showToast({
-								title: res.msg,
-								icon: 'none'
-							});
-						}
-					},
-					err => {}
-				);
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.VIPvie {
-		width: 580rpx;
-		background: linear-gradient(to bottom, #c3dbfe 2%, #f6fbfe 50%);
-		border-radius: 20rpx;
-		height: 600rpx;
-		position: relative;
-
-		image {
-			position: absolute;
-			top: -120rpx;
-			left: 16%;
-		}
-	}
-
-	.quxiao {
-		width: 30%;
-		height: 72rpx;
-		line-height: 72rpx;
-		text-align: center;
-		border: 2rpx solid #ccc;
-		border-radius: 8rpx;
-		color: #666;
-		margin-right: 10rpx;
-	}
-
-	.sure {
-		width: 30%;
-		background-color: #1777ff;
-		height: 72rpx;
-		line-height: 72rpx;
-		text-align: center;
-		border-radius: 8rpx;
-		color: #fff;
-		margin-left: 10rpx;
-	}
-</style>

+ 5 - 0
pages/courseManage/manage/lableSetup.vue

@@ -59,6 +59,8 @@
 				</view>
 			</u-modal>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
@@ -71,6 +73,8 @@
 	export default {
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				isShowSelectAll:false,
 				showlist:false,
 				addlable:'',
@@ -171,6 +175,7 @@
 				}
 				getallTags(data).then(res=>{
 					if(res.code==200){
+						this.viewload=false
 						const dataList = res.data.list.map(item => {
 							return {
 								...item,

+ 7 - 2
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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/book.png" class="w80 h80"></image>
+							<image :src="imgPath+'/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/copy_icon.png" mode="aspectFill">
+								<image class="w40 h40" :src="imgPath+'/app/images/copy_icon.png'" mode="aspectFill">
 							</view>
 							<view class="fs24 base-color-6">
 								<text>--</text>
@@ -184,6 +184,11 @@
 				redprice:''
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.getuserList()

+ 26 - 12
pages/courseManage/operation/index.vue

@@ -4,17 +4,17 @@
 			<view :class="activeTab == 0 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(0)">
 				<view>直播计划</view>
 				<view class="headnav-num">3</view>
-				<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/idle.png" mode="aspectFill"></image>
+				<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/streaming.png" mode="aspectFill"></image>
+				<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/finished.png" mode="aspectFill"></image>
+				<image :src="imgPath+'/app/images/finished.png'" mode="aspectFill"></image>
 			</view>
 		</view> -->
 		<view>
@@ -27,10 +27,9 @@
 							: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 v-for="(items,index) in courseOne" :key="items" :class="courseid==items.periodId?'actNav':''" 
+									 class="m10 p10 center" style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(items.periodId)">
+										{{items.periodName}}
 								</view>
 							</view>
 							<u-loadmore :status="statusA" />
@@ -42,7 +41,7 @@
 							@refresherrefresh="pullDownRefresh" @refresherrestore="triggered = false"
 							:upper-threshold="100" :lower-threshold="100" @refresherabort="triggered = false"
 							@scrolltolower="reachBottom">
-							<view v-for="(item,index) in courseTwo" :key="item.index"
+							<view v-for="(item,index) in courseTwo" :key="index"
 								:class="courseids==item.videoId?'actNav':''" class="m10 p10 center"
 								style="border-bottom: 2rpx solid #eee;" @click="getCourseTwo(item.videoId)">
 								{{item.title}}
@@ -161,7 +160,7 @@
 										{{courselist.redPacketNum}}</text>个</view>
 							</view>
 							<view class="base-bg-f8 radius16 p20  mlr20 justify-start align-center">
-								<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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">
@@ -199,7 +198,7 @@
 							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
 						</view>
 						<view class="flex-1">
-							<view class="mt40">
+							<!-- <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'">
@@ -228,7 +227,7 @@
 									</view>
 								</view>
 								<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
-							</view>
+							</view> -->
 							<view class="mt60 column flex-1">
 								<view class="justify-between align-center">
 									<view class="base-color-3 bold fs32">课程排行榜</view>
@@ -262,6 +261,8 @@
 				</u-collapse>
 			</view>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext"></u-loading-page>
 	</view>
 </template>
 
@@ -284,6 +285,8 @@
 		},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				activeTab: 0,
 				showCalendar: false,
 				user: {},
@@ -329,6 +332,11 @@
 				ratelistState:false
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		async mounted() {
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 			this.getCoursestatistics()
@@ -338,6 +346,9 @@
 			this.$nextTick(() => {
 				setTimeout(()=>{
 					this.$refs?.collapseRef?.init()
+					if(this.courselist!=[]||this.courselist){
+						this.viewload=false
+					}
 				},1000)
 			})
 		},
@@ -494,6 +505,7 @@
 			},
 			getCourseOne(id) {
 				this.courseid = id
+				
 			},
 			getCourseTwo(id) {
 				this.courseids = id
@@ -517,6 +529,8 @@
 						} else {
 							this.statusA = 'loadmore'
 						}
+						console.log(this.courseOne);
+						// this.courseOne
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -527,7 +541,7 @@
 			},
 			getCourseListsmall(type) {
 				const param = {
-					courseId: this.courseid,
+					periodId: this.courseid,
 					pageNum: this.pageNum,
 					pageSize: this.pageSize, //
 				}

+ 24 - 19
pages/courseManage/statistics.vue

@@ -7,7 +7,7 @@
 					<view class="coursebox-name">
 						<text class="more-t">{{info.title}}-{{info.courseName}}</text>
 						<view class="btn_icon" @click="copyId">ID
-							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/copy_icon.png" mode="aspectFill"></image>
+							<image :src="imgPath+'/app/images/copy_icon.png'" mode="aspectFill"></image>
 						</view>
 					</view>
 					<view style="margin-top: 5px;">{{info.courseName}}</view>
@@ -87,7 +87,7 @@
 							</view>
 							<view class="redenvelope x-bc">
 								<view class="x-f">
-									<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/redenvelope.png" mode="aspectFill"></image>
+									<image :src="imgPath+'/app/images/redenvelope.png'" mode="aspectFill"></image>
 									<text>答题红包金额</text>
 								</view>
 								<view class="collapse-content-num"><text>{{courseCount.redPacketAmount || '0.00'}}</text>元
@@ -132,9 +132,9 @@
 						<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon2.png" mode="aspectFill" v-if="searchTypeIndex == 3">
+							<image :src="imgPath+'/app/images/order_icon2.png'" mode="aspectFill" v-if="searchTypeIndex == 3">
 							</image>
-							<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon.png" mode="aspectFill" v-else></image>
+							<image :src="imgPath+'/app/images/order_icon.png'" mode="aspectFill" v-else></image>
 							<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
 								{{typeoption[searchTypeIndex]}}
 							</picker>
@@ -151,18 +151,18 @@
 									<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/copy_icon.png"
+											<image class="list-item-copy" :src="imgPath+'/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/phone.png" mode="aspectFill"></image>
+								<!-- <image class="phone" :src="imgPath+'/app/images/phone.png'" mode="aspectFill"></image> -->
 							</view>
 							<view class="list-item-desc">
 								<view class="taglist">
-									<view v-for="(e,i) in item.tags">
+									<view v-for="(e,i) in item.tags" :key="i">
 										<u-tag :text="e.tag" size="mini" color="#999" bgColor="#f5f5f5"
 											borderColor="#f5f5f5"></u-tag>
 									</view>
@@ -237,7 +237,9 @@
 		getcourseRates
 	} from "@/api/courseManage.js"
 	import funnelChart from '@/components/chart.vue'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
+		mixins: [MescrollMixin],
 		components: {
 			funnelChart,
 		},
@@ -256,21 +258,17 @@
 				}],
 				current: 0,
 				list2: [{
-					name: '答题正确',
-					label: '答题正确',
+					name: '答题领奖记录',
+					label: '答题领奖记录',
 					value: 0
 				}, {
-					name: '仅播完',
-					label: '仅播完',
-					value: 2
+					name: '完播',
+					label: '完播',
+					value: 1
 				}, {
 					name: '未完播',
 					label: '未完播',
-					value: 1
-				}, {
-					name: '未播放',
-					label: '未播放',
-					value: 3
+					value: 2
 				}],
 				currentType: 0,
 				activeStyle: {
@@ -302,7 +300,7 @@
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					textNoMore: "已经到底了",
 					empty: {
-						icon: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/empty.png',
+						icon: this.$store.state.imgpath+'/app/images/empty.png',
 						tip: '暂无数据'
 					}
 				},
@@ -319,6 +317,11 @@
 				videoId:''
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		onLoad(option) {
 			this.info = option.info ? JSON.parse(option.info) : {},
 			this.videoId=this.info.videoId
@@ -500,7 +503,9 @@
 			},
 			getCount() {
 				const param = {
-					videoId: this.courseId,
+					videoId: this.videoId,
+					periodId:this.info.periodId
+					
 					// endTime: this.todayday + ' 23:59:59',
 					// startTime: this.todayday + ' 00:00:00',
 				}

+ 33 - 7
pages/courseManage/vip/ManageDetail.vue

@@ -1,12 +1,16 @@
 <template>
 	<view>
 		<view class="topBgline plr20">
-			<view class="justify-start p30 bgcolf radius12">
-				<u-avatar :src='detailUser.avatar'></u-avatar>
-				<view class="ml16">
-					<view class="bold fs28">{{detailUser.nickname}}</view>
-					<view class="fs24 base-color-3">注册时间:{{detailUser.createTime}}</view>
+			<view class="justify-between p30 bgcolf radius12 align-center">
+				<view class="justify-start align-center">
+					<u-avatar :src='detailUser.avatar'></u-avatar>
+					<view class="ml16">
+						<view class="bold fs28">{{detailUser.nickname}}</view>
+						<view class="fs24 base-color-3">注册时间:{{detailUser.createTime}}</view>
+					</view>
 				</view>
+				<view class="fs24  ptb8 plr12 base-bg-orange colorf radius12"
+				@click="toactdetail" v-if="imgname=='蜂巢快药'">查看行动轨迹</view>
 			</view>
 		</view>
 		<view class="plr20 ptb32 justify-around bgf">
@@ -71,7 +75,7 @@
 				</u-collapse-item>
 			</u-collapse>
 			<view class="justify-start align-center base-bg-f8 mlr30 radius12 plr20 ptb20">
-				<u-image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/book.png" width="30" height="30"></u-image>
+				<u-image :src="imgPath+'/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">
@@ -94,6 +98,8 @@
 				<view class="colorf">新会员奖励</view>
 			</view> -->
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
@@ -106,6 +112,8 @@
 	export default {
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				typeOption: [{
 					label: '全部',
 					value: 0
@@ -133,6 +141,14 @@
 				dateTag:''
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    },
+			imgname() {
+			  return this.$store.state.logoname
+			}
+		},
 		onShow() {
 			this.getAnswerlists()
 			this.detailUser =uni.getStorageSync('detailUser')
@@ -147,9 +163,18 @@
 			this.id=option.id
 		},
 		methods: {
+			toactdetail(){
+				uni.navigateTo({
+					url:"/pages_manage/actDetail?id="+this.id
+				})
+			},
 			tabActive(item) {
 				this.tabindex = item.value
-				this.dateTag=item.label
+				if(item.value==0){
+					this.dateTag=''
+				}else{
+					this.dateTag=item.label
+				}
 				console.log(item.label)
 				this.getAnswerlists()
 			},
@@ -163,6 +188,7 @@
 				}
 				getanswerlist(params).then(res => {
 					if (res.code == 200) {
+						this.viewload=false
 						this.answerlist=res.data
 						console.log(this.answerlist)
 					} else {

+ 39 - 19
pages/customer/index.vue

@@ -20,9 +20,9 @@
 					<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon2.png"
+						<image :src="imgPath+'/app/images/order_icon2.png'"
 							mode="aspectFill" v-if="searchTypeIndex == 0 || searchTypeIndex == 2"></image>
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/order_icon.png"
+						<image :src="imgPath+'/app/images/order_icon.png'"
 							mode="aspectFill" v-else></image>
 						<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
 							{{typeoption[searchTypeIndex]}}
@@ -185,7 +185,7 @@
 			@confirm='singleChangeLable' ></u-picker> -->
 		<u-popup :show="showTagSelect" @close='closetagselect' :closeOnClickOverlay='true' mode="bottom"
 			style="z-index: 999;">
-			<view class=" w100 bgf">
+			<view class=" w100 bgf pb120">
 				<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>
@@ -216,9 +216,9 @@
 			</view>
 		</u-popup>
 		<view class="invite-member" :style="{right:vipInviteshow?'-72rpx':'20rpx'}">
-			<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/invite-member-icon.png"
+			<image :src="imgPath+'/app/images/invite-member-icon.png'"
 				mode="aspectFill" @click="vipInvite" style="position: relative;" class="intimg"> </image>
-			<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/tc_close_icon.png'
+			<image :src="imgPath+'/app/image/tc_close_icon.png'"
 				class="falseimg" @click="showinimg"></image>
 		</view>
 		<!-- 邀请弹窗 -->
@@ -257,7 +257,7 @@
 									style="text-align: center;">
 									<!--#endif-->
 									<image
-										src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/card_icon.png"
+										: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>
@@ -269,14 +269,14 @@
 								<!--#ifdef H5-->
 								<view class="sharePop-item y-f " @click="buildimg" style="text-align: center;">
 									<image
-										src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/poster_icon.png"
+										: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" style="text-align: center;">
 									<image
-										src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/link_icon.png"
+										: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>
@@ -303,7 +303,7 @@
 			</view>
 			<view class="justify-around mb40">
 				<view class="column justify-center align-center" @click="downimg">
-					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/downicon.png'
+					<image :src="imgPath+'/app/image/downicon.png'"
 						class="w80 h80"></image>
 					<view class="mt10">长按图片保存</view>
 				</view>
@@ -313,13 +313,13 @@
 		<u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
 			<view class="point-box">
 				<view class="imgshe">
-					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/point.png'
+					<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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/wxmore.png"
+						<image :src="imgPath+'/app/image/wxmore.png'"
 							class="w50 h50 mlr10"></image>
 					</view>
 					<view class="mt20">选择 “转发给朋友”</view>
@@ -330,6 +330,8 @@
 		<!-- 更改归属 -->
 		<u-picker :show="showcol" :columns="columns" @cancel='showcol=!showcol' @confirm='receiveA'
 			keyName="nickName"></u-picker>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext"></u-loading-page>
 	</view>
 </template>
 
@@ -359,6 +361,8 @@
 		},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				showcol: false,
 				setImg: false,
 				columns: [],
@@ -368,7 +372,11 @@
 
 				}, {
 					name: '小黑屋(0)'
-				}],
+				},
+				// {
+				// 	name: '黑名单(0)'
+				// }
+				],
 				userList: [],
 				current: 0,
 				keyword: "",
@@ -529,7 +537,7 @@
 				zhanshitag: '',
 				copyLinks: '',
 				showzhidao: false,
-				imgs: this.$store.state.imgpath+'/app/image/logo.png',
+				imgs: this.$store.state.imgpath+'/app/image/logoshare.png',
 				currentIsBlack: false,
 				tagpageNum: 1,
 				tagpageSize: 16,
@@ -558,15 +566,14 @@
 				menus: ['shareAppMessage']
 			});
 			// #endif
+			this.getsalelist()
 		},
 		onShow() {
 			// #ifdef H5
 			this.getjssdklist()
 			// #endif
-			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
-			this.getcompanyTag()
+			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {},
 			this.getvipListnum()
-			this.getsalelist()
 			this.userList = []
 			this.getfsuserListdata()
 		},
@@ -590,6 +597,9 @@
 			selectedCount() {
 				return this.userList.filter(item => item.checked).length;
 			},
+			imgPath() {
+			  return this.$store.state.imgpath
+			}
 		},
 		methods: {
 			changetagall() {
@@ -688,6 +698,12 @@
 								label: item.nickName
 							};
 						}));
+						// this.filterData[0].option=list.map(item => {
+						// 	return {
+						// 		id: item.userId,
+						// 		label: item.nickName
+						// 	};
+						// })
 					} else {
 						uni.showToast({
 							title: res.msg,
@@ -1033,6 +1049,7 @@
 
 				getfsuserList(param).then(res => {
 					if (res.code == 200) {
+						this.viewload=false
 						let dataList = res.data.list.map(item => {
 							return {
 								...item,
@@ -1065,6 +1082,8 @@
 			},
 			searchKeyword(value) {
 				this.keyword = value
+				this.userList = []
+				this.pageOptions.pageNum=1
 				this.getfsuserListdata()
 			},
 			singleChange(data) {
@@ -1268,7 +1287,9 @@
 				this.popTitle = type == 'search' ? '搜索选择' : type == 'tag' ? '标签筛选' : ''
 				this.typeIndex = this.queryParam.typeIndex
 				this.showPop = true
-				if (type == 'tag') {}
+				if (type == 'tag') {
+					this.getcompanyTag()
+				}
 			},
 			closePop() {
 				this.showPop = false
@@ -1360,7 +1381,6 @@
 					realLink: url + '#/pages/user/users/becomeVIP' + '?companyId=' +
 						this.user.companyId + '&companyUserId=' + this.user.userId + '&tagids=' + this.sharetaglist,
 					tagIds: this.sharetaglist,
-
 				}
 				becomeVipuserImg(param).then(res => {
 					if (res.code == 200) {
@@ -1597,7 +1617,7 @@
 		font-weight: 400;
 		font-size: 14px;
 		color: #333;
-
+		padding-bottom: 120rpx;
 		&-head {
 			padding: 15px;
 			font-weight: bold;

+ 3 - 3
pages/enterprise/enterprise.vue

@@ -30,7 +30,7 @@
 				tabbarList : [{
 						iconPath: '/static/manageTabIcon/training.png',
 						selectedIconPath: '/static/manageTabIcon/training_on.png',
-						Text: '企业理念',
+						Text: '关于',
 						val:0
 					},
 					{
@@ -47,7 +47,7 @@
 			return {
 				title: this.$store.state.logoname,
 				path: '/pages/enterprise/enterprise',
-				imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				imageUrl: this.$store.state.imgpath+'/app/image/logoshare.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 			
 		},
@@ -55,7 +55,7 @@
 		onShareTimeline(res) {
 			return {
 				title: this.$store.state.logoname,
-				imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				imageUrl: this.$store.state.imgpath+'/app/image/logoshare.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 			
 		},

+ 18 - 12
pages/index/index.vue

@@ -93,11 +93,11 @@
 						<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 class="collapse-content-num"><text>{{courseCount.courseWatchNum?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>
+									较昨天持平{{compare(courseCount.courseWatchNum,yesterdayVO.courseWatchNum?yesterdayVO.courseWatchNum:'0')}}</view>
+								<view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseWatchNum?yesterdayVO.courseWatchNum:'0'}}</view>
 							</view>
 							<view class="collapse-content-item">
 								<view class="collapse-content-title">完播人数</view>
@@ -250,7 +250,7 @@
 											<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
 										</view>
 										<view class="flex-1">
-											<view class="mt40">
+											<!-- <view class="mt40">
 												<view class="justify-between align-center">
 													<view class="base-color-3 bold fs32">群管排行榜</view>
 													<view class="justify-start" @click="ordergroup(1)"
@@ -285,7 +285,7 @@
 													</view>
 												</view>
 												<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
-											</view>
+											</view> -->
 											<view class="mt60 column flex-1">
 												<view class="justify-between align-center">
 													<view class="base-color-3 bold fs32">课程排行榜</view>
@@ -325,6 +325,8 @@
 									</u-collapse-item>
 			</u-collapse>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext"></u-loading-page>
 	</view>
 </template>
 
@@ -344,6 +346,8 @@
 		},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:'数据加载中...',
 				list1: [{
 					name: '按完播率',
 				}, {
@@ -386,8 +390,8 @@
 				getrateimg: {},
 				rankListA: [],
 				rankListB: [],
-				activeA: 0,
-				activeB: 0,
+				activeA: 1,
+				activeB: 1,
 				yesterdayVO: [],
 				ratelistState: false
 			}
@@ -448,9 +452,10 @@
 			},
 			getrankCourse() {
 				//获取课程排行
-				this.startTime = this.todayday
-				this.endTime = this.todayday
+				// this.startTime = this.todayday
+				// this.endTime = this.todayday
 				// this.resetDate()
+				
 				const params = {
 					endTime: this.endTime + ' 23:59:59',
 					startTime: this.startTime + ' 00:00:00',
@@ -585,6 +590,7 @@
 						this.companyUserUserCount = res.data.userTotal || 0
 						this.lablelistnum = res.data.tagList
 						this.$nextTick(() => {
+							this.viewload=false
 							this.$refs.pydameinvRef.init()
 						})
 					} else {
@@ -600,12 +606,12 @@
 					endTime: this.endTime + ' 23:59:59',
 					startTime: this.startTime + ' 00:00:00',
 				}
-				this.getCourseCount(param)
+				this.getCourseCounts(param)
 			},
-			getCourseCount(param) {
+			getCourseCounts(param) {
 				getCourseCount(param).then(res => {
 					if (res.code == 200) {
-						console.log(res)
+						console.log('课程统计',res)
 						this.courseCount = res.data
 						this.yesterdayVO = res.data.yesterdayVO
 					} else {

+ 6 - 4
pages/urgeCourse/urgeCourse.vue

@@ -5,7 +5,7 @@
 				:fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
 		</view>
 		<userUrgeCourse  v-if="current==0"></userUrgeCourse>
-		<qiweiUrgeCourse v-else></qiweiUrgeCourse>
+		<!-- <qiweiUrgeCourse v-else></qiweiUrgeCourse> -->
 	</view>
 </template>
 
@@ -21,9 +21,11 @@
 			return {
 				list: [{
 					name: '注册会员',
-				}, {
-					name: '企微'
-				}],
+				}, 
+				// {
+				// 	name: '企微'
+				// },
+				],
 				current:0
 			}
 		},

+ 5 - 2
pages/user/about.vue

@@ -2,7 +2,7 @@
 	<view class="content">
 		<view class="logo">
 			<image :src="imgPath+'/app/image/logo.png'"></image>
-			<p>企微聊天工具</p>
+			<p>{{imgname}}</p>
 		</view>
 		<view class="set-box">
 			<!-- <view class="item" @click="callPhone()">
@@ -41,7 +41,10 @@
 	computed: {
 		    imgPath() {
 		      return this.$store.state.imgpath
-		    }
+		    },
+			imgname() {
+			  return this.$store.state.logoname
+			},
 		  },
  	methods: {
 		callPhone(){

+ 62 - 5
pages/user/editUser.vue

@@ -11,7 +11,8 @@
 			<view class="info-item">
 				<view class="label">姓名</view>
 				<view class="right">
-					<text class="text">{{nickName}}</text>
+					<!-- <text class="text">{{nickName}}</text> -->
+					<input type="text" v-model="nickName" placeholder="请输入姓名" class="input"></text>
 				</view>
 			</view>
 			<view class="info-item">
@@ -26,6 +27,12 @@
 					<text class="text">{{postNames}}</text>
 				</view>
 			</view>
+			<view class="info-item">
+				<view class="label">角色</view>
+				<view class="right">
+					<text class="text">{{roleNames}}</text>
+				</view>
+			</view>
 			<view class="info-item">
 				<view class="label">性别</view>
 				<view class="right">
@@ -48,6 +55,13 @@
 					<input type="text" v-model="phonenumber" placeholder="请输入手机号" class="input"></text>
 				</view>
 			</view>
+			<view class="info-item">
+				<view class="label">客服二维码</view>
+				<view class="right">
+					<!-- <u-avatar :src="codeimg" size="40" @tap="chooseImages()" :default-url="defaultUrl"></u-avatar> -->
+					<image  class="w90 h90" @tap="chooseImages()" :src="codeimg?codeimg:defaultUrl" mode="aspectFill"></image>
+				</view>
+			</view>
 		</view>
 		<view class="btn-box">
 			<view class="sub-btn" @click="submit()">保存修改</view>
@@ -69,8 +83,12 @@
 				email:"",
 				sexPicker: ['男', '女','未知'],
 				sex: 0, // 性别
-				headImg: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/detault_head.jpg', // 头像,
+				headImg: this.$store.state.imgpath+'/app/images/detault_head.jpg', // 头像,
 				headImgUrl:'',
+				defaultUrl:'https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250606/1749180611713.png',
+				codeimg:'',
+				codeurlimg:'',
+				roleNames:''
 			}
 		},
 		onLoad() {
@@ -80,11 +98,21 @@
 			bindUser(data){
 				var that=this;
 				that.nickName=data.nickName;
-				that.deptName=data.deptName;
+				that.deptName=data.dept.deptName;
+				if(data.posts){
+					that.postNames=data.posts.map(item=>item.postName).join(",")
+				}
+				if(data.roles){
+					this.roleNames=data.roles.map(item=>item.roleName).join(",")
+				}
 				// that.posts=data.post;
 				that.phonenumber=data.phonenumber;
 				that.email=data.email;
 				that.sex=data.sex;
+				if(!that.utils.isEmpty(data.qrCodeWeixin)){
+					that.codeimg=uni.getStorageSync('requestPath')+data.qrCodeWeixin;
+					this.codeurlimg=data.qrCodeWeixin;
+				}
 				if(!that.utils.isEmpty(data.avatar)){
 					that.headImg=uni.getStorageSync('requestPath')+data.avatar;
 					this.headImgUrl=data.avatar;
@@ -105,7 +133,7 @@
 			pickerSex(e) {
 				this.sex = e.detail.value
 			},
-			// 选择照片
+			// 选择头像照片
 			chooseImage() {
 				uni.chooseImage({
 					count: 1, //默认9
@@ -132,6 +160,33 @@
 					}
 				});
 			},
+			// 选择头像照片
+			chooseImages() {
+				uni.chooseImage({
+					count: 1, //默认9
+					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+					sourceType: ['album', 'camera'], //从相册选择
+					success: (res) => {
+						//this.headImg = res.tempFilePaths[0]
+						uni.uploadFile({
+							url: uni.getStorageSync('requestPath')+'/companyapp/app/common/upload', //仅为示例,非真实的接口地址
+							filePath: res.tempFilePaths[0],
+							name: 'file',
+							formData: {
+								'user': 'test'  // 上传附带参数
+							},
+							success: (uploadFileRes) => {
+								console.log(uploadFileRes)
+								// 根据接口具体返回格式   赋值具体对应url
+								var data=JSON.parse(uploadFileRes.data)
+								this.codeimg=uni.getStorageSync('requestPath')+data.fileName;
+								this.codeurlimg=data.fileName
+							}
+						});
+						
+					}
+				});
+			},
 			// 预览头像
 			viewImage() {
 				uni.previewImage({
@@ -154,7 +209,9 @@
 					});
 					return
 				}
-				var data = {mobile:this.phonenumber,email:this.email,sex:this.sex.toString(),headImg:this.headImgUrl};
+				var data = {mobile:this.phonenumber,email:this.email,
+				name:this.nickName,
+				sex:this.sex.toString(),headImg:this.headImgUrl,qrCodeWeixin:this.codeurlimg};
 				console.log(data);
 				setUserInfo(data).then(
 					res => {

+ 76 - 32
pages/user/index.vue

@@ -3,8 +3,8 @@
 		<!-- #ifdef MP-WEIXIN -->
 		<view class="h110"></view>
 		<!-- #endif -->
-		<view class="bg"></view>
-		<view class="cont-box">
+		<view class="bg" v-if="!viewload"></view>
+		<view class="cont-box" v-if="!viewload">
 			<view class="user-cont" @click="navTo('/pages/user/userInfo')">
 				<view class="user-box" v-if="user!=null">
 					<view class="left">
@@ -16,55 +16,79 @@
 						</view>
 					</view>
 					<view class="right" >
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/right_arrow.png"></image>
+						<image :src="imgPath+'/app/images/right_arrow.png'"></image>
 					</view>
 				</view>
-				<view class="company" v-if="user!=null">
-					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_comp.png"></image>
-					<view class="name">{{user.createBy||'暂无数据'}}</view>
+				<view class="justify-between align-center">
+					<view class="company" v-if="user!=null">
+						<!-- <image :src="imgPath+'/app/images/icon_comp.png'"></image> -->
+						<view class="base-color-6">公司:</view>
+						<view class="name">{{user.companyName||'暂无数据'}}</view>
+					</view>
+					<view class="company" v-if="user!=null">
+						<view class="base-color-6">部门:</view>
+						<view class="name">{{user.dept.deptName||'无'}}</view>
+					</view>
+				</view>
+				<view class="justify-between align-center">
+					<view class="company" v-if="user!=null">
+						<view class="base-color-6">岗位:</view>
+						<view class="name">{{user.postname||'无'}}</view>
+					</view>
+					<view class="company" v-if="user!=null">
+						<view class="base-color-6">角色:</view>
+						<view class="name">{{user.rolesname||'无'}}</view>
+					</view>
 				</view>
 			</view>
-			
-			<view class="menu-box" style="margin-top: -20rpx;">
+			<view class="bgf radius15 p30 justify-between align-center mb40" v-if="balance" >
+				<view class="fs24">红包剩余金额</view>
+				<view class="fs40 bold">{{balance.toFixed(2)}}</view>
+			</view>
+			<view class="menu-box" style="margin-top: -20rpx;" >
 				<view class="title-box">
-					<image class="icon" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/chang.png"></image>
+					<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('/pages/courseManage/manage/manageIndex')">
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/menu_info.png"></image>
+				<view class="menus" v-if="user!=null">
+					<view class="menu-item" @click="navTo('/pages_manage/manageIndex')">
+						<image :src="imgPath+'/app/images/menu_info.png'"></image>
 						<view class="m-name">销售管理</view>
 					</view>
-					<view class="menu-item" @click="navTo('/pages/user/users/users')">
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/qudao.png"></image>
+					<view class="menu-item" @click="navTo('/pages/user/users/users')" v-if="user.userType=='00'">
+						<image :src="imgPath+'/app/manergevip/qudao.png'"></image>
 						<view class="m-name">审核销售</view>
 					</view>
-					<view class="menu-item" @click="handleShare">
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/share-manage.png"></image>
+					<view class="menu-item" @click="handleShare" v-if="user.userType=='00'">
+						<image :src="imgPath+'/app/manergevip/share-manage.png'" ></image>
 						<view class="m-name">邀请销售</view>
 					</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>
+						<image :src="imgPath+'/app/images/changeLable.png'"></image>
 						<view class="m-name">标签设置</view>
 					</view>
 			 	</view>
 			</view>
 			<view class="menu-box">
 				<view class="title-box">
-					<image class="icon" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/qita.png"></image>
+					<image class="icon" :src="imgPath+'/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/about')">
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/about.png"></image>
+						<image :src="imgPath+'/app/manergevip/about.png'"></image>
 						<view class="m-name">关于我们</view>
 					</view>
 					<view class="menu-item" @click="navTo('/pages/user/editUser')">
-						<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/setup.png"></image>
+						<image :src="imgPath+'/app/manergevip/setup.png'"></image>
 						<view class="m-name">设置</view>
 					</view>
+				<!-- 	<view class="menu-item" @click="navTo('/pages_course/exportlist/exportlist')">
+						<u-icon name="attach" color="#2979ff" size="28"></u-icon>
+						<view class="m-name">导出列表</view>
+					</view> -->
 				</view>
 				
 			</view>
@@ -77,7 +101,7 @@
 			<view class="sharePop x-ac">
 				<!--#ifdef MP-WEIXIN-->
 				<view class="sharePop-item y-f" @click="shareimg">
-					<image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/card_icon.png" mode="aspectFill"
+					<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>
@@ -85,13 +109,13 @@
 				</view>
 				<!--#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>
+					<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> -->
 				<!--#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>
+					<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>
@@ -105,7 +129,7 @@
 			</view>
 			<view class="justify-around mtb40">
 				<view class="column justify-center align-center" @click="downimg">
-					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/downicon.png' class="w80 h80"></image>
+					<image :src="imgPath+'/app/image/downicon.png'" class="w80 h80"></image>
 					<view class="mt10">长按图片保存</view>
 				</view>
 			</view>
@@ -124,12 +148,12 @@
 		<u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
 			<view class="point-box">
 				<view class="imgshe" >
-					<image src='https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/image/wxmore.png"
+					<image :src="imgPath+'/app/image/wxmore.png'"
 					class="w50 h50 mlr10"></image>
 					</view>
 					<view class="mt20">选择 “转发给朋友”</view>
@@ -138,6 +162,8 @@
 			</view>
 		</u-overlay>
 		<u-modal :show="show" title="提示" :showCancelButton="true"  @cancel="hideLogout()" @confirm="logout()" content='确认退出吗?'></u-modal>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
@@ -155,6 +181,8 @@
 	export default {
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				show:false,
 				user:null,
 				showShare:false,
@@ -164,16 +192,18 @@
 				setImg:false,
 				codeLink:'',
 				showzhidao:false,
-				imgs:this.$store.state.imgpath+'/app/image/logo.png'
+				imgs:this.$store.state.imgpath+'/app/image/logo.png',
+				balance:0
 			}
 		},
 		onShow() {
+			console.log(this.imgs)
 			this.getCompanyUsers()
 		},
 		onShareAppMessage() {
 			return {
 				title: this.$store.state.logoname+'小程序的'+this.user.nickName+'邀请您成为销售', // 分享卡片标题
-				path: '/pages/courseManage/course/becomeSale?id='+this.user.companyId, // 目标页面路径
+				path: '/pages_course/course/becomeSale?id='+this.user.companyId, // 目标页面路径
 				// 携带参数:将当前页面的数据拼接到路径中
 				imageUrl: this.user.avatar || this.imgs, // 分享卡片封面图(可选)
 				success: (res) => {
@@ -184,6 +214,11 @@
 				},
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		mounted() {
 		},
 		methods: {
@@ -192,7 +227,7 @@
 				 const Path = fullUrl.split('/#')[0] || '';
 				setTimeout(() => {
 					uni.setClipboardData({
-						data: Path+'/#/pages/courseManage/course/becomeSale?id='+this.user.companyId,
+						data: Path+'/#/pages_course/course/becomeSale?id='+this.user.companyId,
 						success: () => {
 							uni.showToast({
 								title: '邀请链接已复制',
@@ -234,7 +269,7 @@
 				// 配置--配置全局 
 				wx.ready(function() { //需在用户可能点击分享按钮前就先调用
 					wx.updateAppMessageShareData({
-						title: self.user.userName+"邀请您成为群管", // 分享标题
+						title: self.user.userName+"邀请您成为销售", // 分享标题
 						desc: self.user.deptName, // 分享描述
 						link:self.copyLinks, 
 						imgUrl: self.codeLink.url ||self.imgs, // 分享图标
@@ -383,13 +418,22 @@
 				};
 				getCompanyUser(data).then(res => {
 					if(res.code==200){
+						this.viewload=false
 						console.log(res)
 						this.user=res.user;
+						this.balance=res.balance
+						if(res.user.posts){
+							this.user.postname=res.user.posts.map(item=>item.postName).join(",")
+						}
+						if(res.user.roles){
+							this.user.rolesname=res.user.roles.map(item=>item.roleName).join(",")
+						}
 						if(this.user.avatar){
 							this.user.avatar=uni.getStorageSync('requestPath')+res.user.avatar
 						}else{
 							this.user.avatar=='';
 						}
+						console.log('头像',this.user.avatar)
 					}else{
 						
 					}
@@ -462,7 +506,7 @@
 		width: 100%;
 		.bg{
 			width: 100%;
-			height: 360upx;
+			height: 550upx;
 			position: absolute;
 			top: 0;
 			left: 0;
@@ -528,7 +572,7 @@
 					
 				}
 				.company{
-					margin-top: 30rpx;
+					margin-top: 20rpx;
 					display: flex;
 					align-items: center;
 					justify-content: flex-start;

+ 32 - 7
pages/user/userInfo.vue

@@ -12,11 +12,11 @@
 						<text class="title">{{phonenumber}}</text>
 					</view>
 				</view>
-				<image   class="right"  src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
+				<image class="right" :src="imgPath+'/app/images/icon_edit.png'" mode="aspectFill'" @click="editInfo"></image>
 			</view>
 			<!-- 公司 -->
 			<view class="comp-info">
-				<image class="img" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_comp_white.png" mode="aspectFill"></image>
+				<image class="img" :src="imgPath+'/app/images/icon_comp_white.png'" mode="aspectFill"></image>
 				<text class="text">{{deptName}}</text>
 			</view>
 		</view>
@@ -48,6 +48,15 @@
 				<text class="label">岗位</text>
 				<text class="text">{{postNames}}</text>
 			</view>
+			<view class="item">
+				<text class="label">角色</text>
+				<text class="text">{{roleNames}}</text>
+			</view>
+			<view class="item justify-start align-center">
+				<text class="label">二维码</text>
+				<!-- <text class="text">{{postNames}}</text> -->
+				<image :src="qrCodeWeixin" class="w120 h120" mode="aspectFill"></image>
+			</view>
 		</view>
 	</view>
 </template>
@@ -57,15 +66,17 @@
 	export default {
 		data() {
 			return {
-				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/detault_head.jpg", 
+				avatar:this.$store.state.imgpath+"/app/images/detault_head.jpg", 
 				nickName:"",
 				deptName:"",
 				postNames:"",
 				phonenumber:"",
 				email:"",
 				sex:"",
+				qrCodeWeixin:"",
 				isShow:false,
 				userId:undefined,
+				roleNames:''
 			}
 		},
 		onLoad(option) {
@@ -80,6 +91,11 @@
 			// })
 			
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		onShow() {
 			this.getCompanyUser();
 		},
@@ -87,9 +103,17 @@
 			bindUser(data){
 				var that=this;
 				that.nickName=data.nickName;
-				that.deptName=data.dept.deptName;
-				that.phonenumber=data.phonenumber;
-				that.email=data.email;
+				that.deptName=data.companyName?data.companyName:'暂无';
+				that.phonenumber=data.phonenumber?data.phonenumber:'暂无';
+				if(data.posts){
+					that.postNames=data.posts.map(item=>item.postName).join(",")
+				}
+				if(data.roles){
+					this.roleNames=data.roles.map(item=>item.roleName).join(",")
+				}
+				// this.postNames=data.posts.map(item=>item.postName).join(",")||'暂无'
+				// this.roleNames=data.roles.map(item=>item.roleName).join(",")||'暂无'
+				that.email=data.email?data.email:'暂无';
 				if(data.sex==0){
 					that.sex="男";
 				}
@@ -99,7 +123,8 @@
 				else if(data.sex==2){
 					that.sex="未知";
 				}
-				if(!that.utils.isEmpty(data.avatar)){
+				that.qrCodeWeixin=uni.getStorageSync('requestPath')+data.qrCodeWeixin
+				if(data.avatar){
 					that.avatar=uni.getStorageSync('requestPath')+data.avatar;
 				}
 			},

+ 527 - 73
pages/user/users/becomeVIP.vue

@@ -1,25 +1,92 @@
 <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>
+		<image :src="imgPath+'/app/image/becomevip.png'" mode="widthFix"></image>
+		<view class="justify-start align-center fs24 base-color-9" v-if="userInfo.nickname">
+			<view>{{userInfo.nickname}}#</view>
+			<view>{{userInfo.userId}}</view>
+		</view>
+		<view class="bolds">成为会员,享受更多权益</view>
 		<!--#ifdef H5-->
 		<view class="sure" @click="registerCourse">{{isVip==1?'您已成为会员':viptext}}</view>
 		<!--#endif-->
 		<!--#ifdef MP-WEIXIN-->
-		<view class="btns">
+		
+		<view class="base-bg-orange colorf ptb20 plr40 radius60" 
+		v-if="(userInfos==null||userInfos=='')&&imgname=='乐氏本源'" @click="nato()">授权用户信息</view>
+		<view class="btns" v-else>
+			<button
+				class="author-btn"
+				open-type="getUserInfo"
+				:disabled="userdisabled"
+				@getuserinfo="userInfologin"  v-if="authType==0">{{isVip==1?'您已成为会员':'申请成为会员'}}</button>
 			<button
+				v-else
 				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-->
+		<!--#ifdef MP-WEIXIN-->
+		<u-popup :show="userlogo" mode="bottom" round='12'>
+			<view class="userlogo column">
+				<view class="mtb30 justify-start align-center ml20">
+					<u-avatar :src="imgPath+'/app/image/logo.png'" size="50"></u-avatar>
+					<view class="bold mlr20">{{imgname}}</view>
+					<view>申请</view>
+				</view>
+				<view class="bold fs36 ml20">授权你的昵称头像信息</view>
+				<view class="mtb20 justify-between align-center  plr20">
+					<view class="justify-start align-center">
+						<view class="boxweixin" :class="userinfos.nickname==''?'boxnosel':'boxsel'">
+							<view v-if="userinfos.nickname">√</view>
+						</view>
+						<view class="ml20">
+							<view class="base-color-3 bold">第一步</view>
+							<view class="fs24 base-color-9">请点击授权微信昵称</view>
+						</view>
+					</view>
+					<view class="button-container">
+					   <input 
+					     type="nickname"
+					     class="hidden-input"
+						@blur="onNickNameInput"
+						 @input="onNickNameInput"
+					   />
+					   <button class="custom-button" :class="nameuser==''?'subname':'subavt'">{{nameuser?"已授权":'允许授权'}}</button>
+					 </view>
+				</view>
+				<view class="mtb20 justify-between align-center  plr20 mt40">
+					<view class="justify-start align-center">
+						<view class="boxweixin" :class="userinfos.nickname==''?'boxnosel':'boxsel'">
+							<view v-if="userinfos.avatar">√</view>
+						</view>
+						<view class="ml20">
+							<view class="base-color-3 bold">第二步</view>
+							<view class="fs24 base-color-9">请点击授权微信头像</view>
+						</view>
+					</view>
+					<view class="button-container">
+					  <button open-type="chooseAvatar" @chooseavatar="onChooseAvatar" class="hidden-input" 
+					  v-if="nameuser">
+					    允许授权
+					  </button>
+					  <button class="custom-button sub" @click="shouquan" v-if="nameuser==''">允许授权</button>
+					   <button class="custom-button "  :class="avataruser==''?'subname':'subavt'"
+					   v-else>{{avataruser?"已授权":'允许授权'}}</button>
+					 </view>
+				</view>
+				<view class="submitname" @click="confimrname" :class="nameuser&&avataruser?'subact':'sub'">确定</view>
+			</view>
+		</u-popup>
 		<!--#endif-->
 		<view class="footer-tips">重庆云联融智提供技术支持</view>
 	</view>
 </template>
 
 <script>
-	import { loginByMp,registerCourses,loginByMiniApp} from '@/api/user'
+	import { loginByMp,registerCourses,loginByMiniApp,checkUserInfo,editUser} from '@/api/user'
 	export default {
 		data() {
 			return {
@@ -31,10 +98,50 @@
 				userInfo:{},
 				tagIds:[],
 				isbecomevip:0,
-				viptext:'申请成为会员'
+				viptext:'申请成为会员',
+				userInfos:null,
+				userlogo:false,
+				userinfos:{
+					nickname:'',
+					avatar:""
+				},
+				headImg:'',
+				authType:0,//0微信登录 1手机号登录
+				userdisabled:false,
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    },
+			imgname() {
+			  return this.$store.state.logoname
+			},
+			appid() {
+				return this.$store.state.appid
+			},
+			nameuser() {
+				return this.userinfos.nickname
+			},
+			avataruser() {
+				return this.userinfos.avatar
+			},
+		},
 		onLoad(option) {
+			console.log(option)
+			console.log(123)
+			// let path = 'https://userapp.fbylive.com'//福本源
+			let path = 'https://userapp.zkhj6.com'//中康
+			// let path = 'https://company.h5.test.ylrztop.com/api'//云融融智
+			// let path = 'https://userapp.ashyisheng.com'//蜂巢快药
+			// let path = 'https://userapp.whhm.ylrzcloud.com/prod-api'//惠名大药房
+			// let path = 'https://userapp.xdtongshuntang.top'//同顺堂
+			// let path = 'https://userapp.liangmiaoedu.com'//良苗
+			// let path = 'https://usercourse.beliyostore.com'//倍力优
+			// let path = 'https://userapp.bainian1000y.cn/prod-api'//百年康城
+			// let path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
+			// let path = 'https://companyapp.gjh2024.com/apis'//金康键
+			uni.setStorageSync('requestPath',path)
 			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
 				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
 			} else {
@@ -42,7 +149,7 @@
 			}
 			// this.userInfo=JSON.parse(uni.getStorageSync('userInfo')) || {};
 			//#ifdef MP-WEIXIN
-			let obj=uni.getStorageSync('AppToken_MYfby');
+			let obj=uni.getStorageSync('TOKEN_WEXIN');
 			//#endif
 			// #ifdef H5
 			let obj=uni.getStorageSync('TOKEN_KEY');
@@ -51,6 +158,25 @@
 			this.isLogin = !!obj;
 			this.companyid = option.companyId || ''
 			this.companyUserId=option.companyUserId || 0
+			//#ifdef MP-WEIXIN
+			// if(this.$store.state.logoname!=='乐氏本源'&&!uni.getStorageSync('userInfos')){
+			// 	this.userlogo=true
+			// }
+			if(!uni.getStorageSync('userInfos')&&this.$store.state.logoname=='乐氏本源'){
+				uni.navigateTo({
+					url:'/pages_course/webview'
+				})
+				return
+			}
+			// if(this.$store.state.logoname=='乐氏本源'){
+			// 	this.userInfos=uni.getStorageSync('userInfos')
+			// 	if(!uni.getStorageSync('userInfos')){
+			// 		uni.navigateTo({
+			// 			url:'/pages_course/webview'
+			// 		})
+			// 	}
+			// }
+			//#endif
 			if(option.tagids=="null"){
 				this.tagIds=[]
 			}else{
@@ -59,7 +185,7 @@
 				  .map(item => parseInt(item.trim(), 10))
 				  .filter(num => !isNaN(num)); // 过滤无效转换
 				  this.tagIds =arr
-				console.log(this.tagIds); // [66, 78]
+				// console.log(this.tagIds); 
 			}
 			this.isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
 			this.code = option.code
@@ -68,6 +194,7 @@
 					this.loginByMp()
 				}
 				// #endif
+				
 		},
 		onShow() {
 			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
@@ -76,19 +203,130 @@
 				this.userInfo = {}
 			}
 			//#ifdef MP-WEIXIN
-			let obj=uni.getStorageSync('AppToken_MYfby');
+			this.userInfos=uni.getStorageSync('userInfos')
+			let obj=uni.getStorageSync('TOKEN_WEXIN');
 			//#endif
 			// #ifdef H5
 			let obj=uni.getStorageSync('TOKEN_KEY');
 			// #endif
 			this.isLogin = !!obj;
 			if(this.isLogin&&this.isVip!=1) {
-				this.registerCourse()
+				this.checkUserInfoA()
 			}
 			
 		},
 		methods: {
+			//检查用户昵称以及头像
+			checkUserInfoA(){
+				checkUserInfo().then(res=>{
+					if(res.code==200){
+						this.isLogin = true
+						this.userInfo= res.user
+						uni.setStorageSync('userInfo', JSON.stringify(res.user));
+						this.registerCourse()
+					}else if(res.code==500){
+						if(res.authType==2){
+							uni.setStorageSync('authUrl',res.domain)
+							if(!uni.getStorageSync('userInfos')||uni.getStorageSync('userInfos')=={}){
+								uni.navigateTo({
+									url:'/pages_course/webview'
+								})
+								return
+							}
+							this.editUserA()
+						}else{
+							this.userlogo=true
+						}
+					}else{
+						uni.showToast({
+							icon:'none',
+							title:res.msg,
+						});
+					}
+				})
+			},
+			//修改用户昵称以及头像
+			editUserA(){
+				this.userinfos=uni.getStorageSync('userInfos')?uni.getStorageSync('userInfos'):this.userinfos
+				const data={
+					nickname:this.userinfos.nickname,
+					avatar:this.userinfos.avatar,
+				}
+				editUser(data).then(res=>{
+					if(res.code==200){
+						uni.showToast({
+							icon:'none',
+							title:'修改成功!',
+						});
+						setTimeout(()=>{
+							this.registerCourse()
+						},100)
+					}else{
+						uni.removeStorageSync('userInfos')
+						uni.showToast({
+							icon:'none',
+							title:res.msg+'请重新申请',
+						});
+					}
+				})
+			},
+			shouquan(){
+				if(this.userinfos.nickname==''){
+					uni.showToast({
+						icon:'none',
+						title: "请先授权微信昵称",
+					});
+				}
+			},
+			confimrname(){
+				if(this.userinfos.nickname==''){
+					uni.showToast({
+						icon:'none',
+						title: "请授权微信昵称",
+					});
+					return
+				}
+				if(this.userinfos.avatar==''){
+					uni.showToast({
+						icon:'none',
+						title: "请授权微信头像",
+					});
+					return
+				}
+				uni.setStorageSync('userInfos',this.userinfos)
+				this.editUserA()
+				this.userlogo=false
+			},
+			onChooseAvatar(e){
+				this.userinfos.avatar=e.detail.avatarUrl
+				console.log(e.detail.avatarUrl)
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: e.detail.avatarUrl,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						console.log(uploadFileRes)
+						// 根据接口具体返回格式   赋值具体对应url
+						var data=JSON.parse(uploadFileRes.data)
+						this.headImg=uni.getStorageSync('requestPath')+data.fileName
+						this.userinfos.avatar=data.url
+					}
+				});
+			},
+			onNickNameInput(e){
+				console.log(e)
+				this.userinfos.nickname=e.detail.value
+			},
+			nato(){
+				uni.navigateTo({
+					url:'/pages_course/webview'
+				})
+			},
 			handleAgree(){
+				console.log(144443)
 				if(this.isVip==1){
 					uni.showToast({
 						title: '您已成为会员!',
@@ -104,76 +342,193 @@
 				}
 				
 			},
+			userInfologin(e) {
+				console.log(123333)
+				this.userdisabled=true
+				var that=this;
+				uni.showLoading({
+					title: "加载中..."
+				});
+				if (e.mp.detail.errMsg == 'getUserInfo:ok') {
+					this.utils.getProvider()
+					.then(provider => {
+						if (!provider) {
+							this.userdisabled=false
+						  reject()
+						}
+						// uni登录
+						uni.login({
+							provider: provider,
+							success: async loginRes => {
+								let code = loginRes.code // 获取开发code
+								this.userinfos=uni.getStorageSync('userInfos')?uni.getStorageSync('userInfos'):this.userinfos
+								loginByMiniApp({
+								   encryptedData: e.mp.detail.encryptedData,
+								   iv: e.mp.detail.iv,
+								   code: code,
+								   nickname:this.userinfos.nickname?this.userinfos.nickname:'',
+								   avatar:this.userinfos.avatar?this.userinfos.avatar:'',
+								   companyId : this.companyid || '',
+								   companyUserId:this.companyUserId || 0,
+								   authType:this.authType,
+								   appId:this.appid
+								})
+								.then( res => {
+									if(res.code==200){
+										// console.log(res)
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录成功",
+										});
+										uni.setStorageSync('TOKEN_WEXIN', res.token);
+										uni.setStorageSync('userInfo', JSON.stringify(res.user));
+										this.userInfo=res.user;
+										uni.hideLoading()
+										this.userdisabled=false
+										// this.isLogin = true
+										setTimeout(()=>{
+											this.checkUserInfoA()
+											// this.registerCourse()
+										},200)
+									}else if(res.code==406){
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: '该用户已成为其他销售会员',
+										});
+									}
+									else{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: res.msg,
+										});
+									}
+								   
+								 })
+								 .catch(res=>{
+								 	 this.userdisabled=false
+								 })
+							},
+							fail() {
+								this.userdisabled=false
+							}
+						})
+					})
+					.catch(err => {
+						this.userdisabled=false
+						uni.showToast({
+							icon:'none',
+							title: err,
+						});
+					})
+					 
+				} else {
+					this.userdisabled=false
+					uni.showToast({
+						title: '已拒绝授权',
+						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()
+					title: "加载中..."
+				});
+				if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+					this.utils.getProvider()
+					.then(provider => {
+						if (!provider) {
+						  reject()
+						}
+						// uni登录
+						uni.login({
+							provider: provider,
+							success: async loginRes => {
+								let code = loginRes.code // 获取开发code
+								this.userinfos=uni.getStorageSync('userInfos')?uni.getStorageSync('userInfos'):this.userinfos
+								loginByMiniApp({
+								   encryptedData: e.mp.detail.encryptedData,
+								   iv: e.mp.detail.iv,
+								   code: code,
+								   nickname:this.userinfos.nickname?this.userinfos.nickname:'',
+								   avatar:this.userinfos.avatar?this.userinfos.avatar:'',
+								   companyId : this.companyid || '',
+								   companyUserId:this.companyUserId || 0,
+								    authType:this.authType,
+									appId:this.appid
+								})
+								.then( res => {
+									if(res.code==200){
+										// console.log(res)
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录成功",
+										});
+										uni.setStorageSync('TOKEN_WEXIN', res.token);
+										uni.setStorageSync('userInfo', JSON.stringify(res.user));
+										this.userInfo=res.user;
+										uni.hideLoading()
+										// this.isLogin = true
+										// setTimeout(()=>{
+										// 	this.registerCourse()
+										// },200)
+										setTimeout(()=>{
+											this.checkUserInfoA()
+											// this.registerCourse()
+										},200)
+									}else if(res.code==406){
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: '该用户已成为其他销售会员',
+										});
+									}
+									else{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: res.msg,
+										});
+									}
+								   
+								 })
 							}
-							// 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 {
+					})
+					.catch(err => {
 						uni.showToast({
-							title: '已拒绝授权',
-							icon: 'none',
-							duration: 2000,
-						})
-					}
+							icon:'none',
+							title: err,
+						});
+					})
+					 
+				} else {
+					uni.showToast({
+						title: '已拒绝授权',
+						icon: 'none',
+						duration: 2000,
+					})
+				}
 			},
 			getWechatCode() {
 				if (this.isWechat) {
-					let appid = "wx961fadab9bcb792b"; //微信APPid
+					// let appid = "wx961fadab9bcb792b"; //微信APPid(福本源)
+					// let appid = "wx93ce67750e3cfba3"; //微信APPid(云联融智)
+					// let appid = "wxea1da2b708ab3c2f"; //微信APPid(蜂巢快药)
+					// let appid = "wx3de90a39feb8107a"; //微信APPid(中康看课)
+					// let appid = "wxec49f9d783abf233"; //微信APPid(惠名大药房)
+					// let appid = "wx5a0f7e1932e2689e"; //微信APPid(同顺堂)
+					// let appid = "wxe0b82a0018449a62"; //微信APPid(良苗)
+					// let appid = "wx568ea6b70350c585"; //微信APPid(倍力优)
+					let appid = "wx0d021524695f1943"; //微信APPid(百年康城)
+					// let appid = "wx090c5f399d65456e"; //微信APPid(青岛市德瑞康)
+					// let appid = "wx52298c1781d5cc99"; //微信APPid(金慷建)
 					let code = this.getUrlCode().code; //是否存在code
 					let local = window.location.href;
 					if (code == null || code === "") {
@@ -240,6 +595,7 @@
 			},
 			// 成为会员
 			registerCourse() {
+				console.log(123333)
 				this.isVip = 0
 				// 确保从本地存储重新获取最新数据
 				  // if(uni.getStorageSync('userInfo')){
@@ -253,7 +609,7 @@
 				  if(this.tagIds==null){
 					  this.tagIds=""
 				  }
-				  console.log(this.tagIds)
+				  // console.log(this.tagIds)
 				const data={
 					userId:this.userInfo.userId,
 					companyUserId:this.companyUserId,
@@ -267,12 +623,12 @@
 							this.isbecomevip=1
 							this.viptext='您已成为会员'
 							uni.showToast({
-								title: '您已成为会员,',
+								title: '注册成功',
 								icon:'none'
 							})
 						} else {
 							this.isbecomevip=1
-							console.log(this.isbecomevip)
+							// console.log(this.isbecomevip)
 							this.viptext=res.msg
 							uni.showToast({
 								icon:'none',
@@ -291,6 +647,102 @@
 	}
 </script>
 <style lang="scss" scoped>
+	.subname{
+		background-color: #00aa00;
+		color: #fff;
+	}
+	.subavt{
+		background-color: #fff;
+		border: 2rpx #0a0 solid;
+		color: #00aa00;
+	}
+	.boxweixin{
+		width: 44rpx;
+		height: 44rpx;
+		border-radius: 50%;
+		text-align: center;
+		line-height: 34rpx;
+		color: #0a0;
+	}
+	.boxnosel{
+		border: #757575 4rpx solid;
+	}
+	.boxsel{
+		border: #0a0 4rpx solid;
+	}
+	.button-container {
+	  position: relative;
+	  width: 240rpx;
+	}
+	.hidden-input {
+	  position: absolute;
+	  top: 0;
+	  left: 0;
+	  width: 100%;
+	  height: 100%;
+	  opacity: 0;
+	  z-index: 2;
+	}
+	.custom-button {
+	  position: relative;
+	  z-index: 1;
+	  /* 其他样式 */
+	  width:100%;
+	  margin: 0 auto;
+	  height: 80rpx;
+	  line-height: 60rpx;
+	  font-size: 28rpx;
+	  padding: 10rpx 20rpx;
+	}
+	.submitname{
+		width: 90%;
+		margin: 0 auto;
+		text-align: center;
+		padding: 30rpx;
+		margin-top: 40rpx;
+	}
+	.sub{
+		background-color: #f0f0f0;
+		color: #0a0;
+	}
+	.subact{
+		background-color: #0a0;
+		color: #fff;
+	}
+	.userlogo{
+		height: 760rpx;
+	}
+	.getlogo{
+		width:240rpx;
+		background-color: #fff;
+		// padding: 10rpx 20rpx;
+	}
+	::v-deep .u-popup {
+	 flex: 0 !important;
+	}
+	// .submitname{
+	// 	width: 60%;
+	// 	background-color: #05a8ee;
+	// 	color: #fff;
+	// 	margin: 0 auto;
+	// 	border-radius: 80rpx;
+	// 	text-align: center;
+	// 	padding: 20rpx;
+	// 	margin-top: 40rpx;
+	// }
+	.userlogo{
+		height: 760rpx;
+	}
+	.getlogo{
+		width:calc(60% - 40rpx);
+		margin: 0 auto;
+		background-color: #fff;
+		padding: 10rpx 20rpx;
+		image{
+			width: 80rpx !important;
+			height: 80rpx !important;
+		}
+	}
 	.footer-tips {
 			// margin-top: 14rpx;
 			position: fixed;
@@ -309,7 +761,7 @@
 			height: 300rpx;
 		}
 	}
-	.bold {
+	.bolds {
 		color: #999;
 		font-size: 16px;
 		height: auto;
@@ -337,6 +789,8 @@
 			position: absolute;
 			width: 630rpx;
 			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
 			background: #1777ff;
 			border-radius: 40rpx;
 			font-size: 30rpx;

+ 9 - 4
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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_edit.png" mode="aspectFill" @click="editInfo"></image>
+				<image v-if="!isShow" class="right" :src="imgPath+'/app/images/icon_edit.png'" mode="aspectFill" @click="editInfo"></image>
 			</view>
 			<!-- 公司 -->
 			<view class="justify-between">
 				<view class="comp-info">
-					<image class="img" src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/icon_comp.png" mode="aspectFill"></image>
+					<image class="img" :src="imgPath+'/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="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/phone.png" mode="aspectFill"></image>
+					<image class="img" :src="imgPath+'/app/images/phone.png'" mode="aspectFill"></image>
 					<text class="fs24 base-color-6">{{userinfo.phonenumber}}</text>
 				</view>
 			</view>
@@ -76,7 +76,7 @@
 	export default {
 		data() {
 			return {
-				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/default.png", 
+				avatar:this.$store.state.imgpath+"/app/images/default.png", 
 				nickName:"",
 				deptName:"",
 				postNames:"",
@@ -115,6 +115,11 @@
 				this.getUserInfo();
 			}
 		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    }
+		},
 		methods: {
 			submitshen(){
 				if(this.userinfo.isAudit==1){

+ 273 - 11
pages/user/users/users.vue

@@ -41,10 +41,15 @@
 									<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" @click.passive.stop>
-									<view class="fs24 mt20 ml10" style="color: #115296;">
-										{{subitem.deptName}}
+								<view class="justify-between align-center mt10" @click.passive.stop>
+									<view>
+										<text class="base-color-9 ml10 fs24">部门:{{subitem.deptName?subitem.deptName:''}}</text>
+										<view class="fs24 mt10 justify-start align-center" style="color: #115296;">
+											<text class="base-color-9 ml10">岗位:{{subitem.postname?subitem.postname:''}}</text>
+											<text class="base-color-9 ml20">角色:{{subitem.rolesname?subitem.rolesname:''}}</text>
+										</view>
 									</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
@@ -84,17 +89,84 @@
 		<view v-show="!hidden" class="indexToast">
 			{{listCur}}
 		</view>
+		<u-popup :show="showcommpany" mode="center" round="16">
+			<view class="bgf w600 h600 p40 radius16" style="max-height: 600rpx;">
+				<view class="center bold fs32">设置销售员信息</view>
+				<view class="justify-center align-center mtb30">
+					<view class="mr40 fs32 base-color-6">部门:</view>
+					<u-input
+					   placeholder="选择部门"
+					   border="surround"
+					   v-model="valueb"
+					   @focus="showbumen()"
+					 ></u-input>
+				</view>
+				<view class="justify-center align-center mtb30">
+					<view class="mr40 fs32 base-color-6">岗位:</view>
+					 <view class="flex-1 u-border p16 radius8" @click="showgang=!showgang">
+						 <view class="fs28" style="color: #000;">{{valuea}}</view>
+						 <view class="fs28" style="color: #c0c4cc;" v-if="valueid.length==0">选择岗位</view>
+					 </view>
+				</view>
+				<view class="justify-center align-center mtb30">
+					<view class="mr40 fs32 base-color-6">角色:</view>
+					 <view class="flex-1 u-border p16 radius8" @click="showjuese=!showjuese">
+						 <view class="fs28" style="color: #000;">{{valuej}}</view>
+						 <view class="fs28" style="color: #c0c4cc;" v-if="valuej.length==0">选择角色</view>
+					 </view>
+				</view>
+				<view class="justify-around align-center mt50 ">
+					<view class="quxiao" @click="showcommpany=!showcommpany">取消</view>
+					<view class="queren" @click="confirmbchange">通过审核</view>
+				</view>
+				<tki-tree ref="tkitree" :range="columnb"  confirmColor="#4e8af7" :selectParent="true" @confirm="confirmb"/>
+				<u-popup :show="showgang" @close="showgang=!showgang" :closeOnClickOverlay='true'>
+					<view class="center bold fs36 pt40">请选择岗位</view>
+					<view class="justify-start align-center warpbox mt40 p20">
+						<view v-for="(item,index) in postlist" :key="item.postId" class="mlr10 mt10">
+							<u-tag :text="item.postName" :plain="!item.checked" :name="index"
+								@click="choosechangeTag"></u-tag>
+						</view>
+					</view>
+					<view class="justify-around align-center mt50 ">
+						<view class="quxiao" @click="showgang=!showgang">取消</view>
+						<view class="queren" @click="postconfirm">确定</view>
+					</view>
+				</u-popup>
+				<u-popup :show="showjuese" @close="showjuese=!showjuese" :closeOnClickOverlay='true'>
+					<view class="center bold fs36 pt40">请选择角色</view>
+					<view class="justify-start align-center warpbox mt40 p20">
+						<view v-for="(item,index) in rolelist" :key="item.roleId" class="mlr10 mt10">
+							<u-tag :text="item.roleName" :plain="!item.checked" :name="index"
+								@click="choosechangerole"></u-tag>
+						</view>
+					</view>
+					<view class="justify-around align-center mt50 ">
+						<view class="quxiao" @click="showjuese=!showjuese">取消</view>
+						<view class="queren" @click="roleconfirm">确定</view>
+					</view>
+				</u-popup>
+			</view>
+		</u-popup>
+		<u-modal :show="showuser" title="提示" content='是否通过销售审核' :showCancelButton='true'
+		@confirm='subsalesaudits' @cancel="showuser=!showuser"></u-modal>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
 <script>
-	import {getAllUsers} from '@/api/user.js';
+	import {getAllUsers,querydepartment,querypost,modifysaleNews,queryrole} from '@/api/user.js';
 	import {subsalesaudit} from '@/api/courseManage.js';
+	import tkiTree from "@/components/tki-tree/tki-tree.vue"
 	export default {
+		components: {tkiTree},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				baseUrl:uni.getStorageSync('requestPath'),
-				avatar:"https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/images/default.png",
+				avatar:this.$store.state.imgpath+"/app/images/default.png",
 				CustomBar: 0,
 				hidden: true,
 				listCurID: '',
@@ -107,11 +179,32 @@
 				isSelectAll:false,
 				selectedUsers:[],
 				isAudits:1,
-				ids:''
+				ids:'',
+				showcommpany:false,
+				columnb: [
+				    ['11', '22', '33']
+				],
+				postlist:{},
+				showgang:false,
+				showjuese:false,
+				valuea:'',
+				valueb:'',
+				actpost:[],
+				valueid:'',
+				valueidbu:'',
+				xuanid:[],
+				valuej:'',
+				rolelist:[],
+				roleid:[],
+				seluserids:[],
+				showuser:false
 			}
 		},
 		onLoad() {
 			this.getUser();
+			this.getdepartment()
+			this.getpostlist()
+			this.getrolelist()
 		},
 		onReady() {
 			let that = this;
@@ -123,10 +216,133 @@
 			}).exec()
 		},
 		methods: {
+			roleconfirm(){
+				this.roleid = this.rolelist.filter(item => item.checked).map(v => v.roleId).join(",")
+				this.valuej = this.rolelist.filter(item => item.checked).map(v => v.roleName).join(',')
+				this.showjuese=!this.showjuese
+			},
+			choosechangerole(i){
+				this.rolelist[i].checked = !this.rolelist[i].checked
+			},
+			showbumen(){
+				this.$refs.tkitree._show();
+			},
+			confirmbchange(){
+				console.log(this.valueb.length,this.xuanid)
+				if(this.valueb.length==0){
+					uni.showToast({
+						icon: 'none',
+						title: '请选择部门'
+					})
+					return
+				}
+				if(this.xuanid.length==0){
+					uni.showToast({
+						icon: 'none',
+						title: '请选择部门'
+					})
+					return
+				}
+				if(this.valuej.length==0){
+					uni.showToast({
+						icon: 'none',
+						title: '请选择角色'
+					})
+					return
+				}
+				const data={
+					companyUserIds:this.ids,
+					deptId:this.valueidbu,
+					postIds:this.valueid,
+					roleIds:this.roleid
+				}
+				modifysaleNews(data).then(res=>{
+					console.log('设置信息',res)
+					if(res.code==200){
+						// uni.showToast({
+						// 	icon: 'none',
+						// 	title: '成功'
+						// })
+						this.xuanid=[]
+						setTimeout(()=>{
+							this.subsalesaudits()
+						},100)
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+						});
+					}
+				})
+			},
+			getallList(){
+				this.valueidbu=[]
+				this.valueid=[]
+				this.valueb=''
+				this.valuea=''
+				this.ids=''
+			},
+			postconfirm(){
+				this.xuanid=this.postlist.filter(item => item.checked).map(v => v.postId)
+				this.valueid = this.postlist.filter(item => item.checked).map(v => v.postId).join(",")
+				this.valuea = this.postlist.filter(item => item.checked).map(v => v.postName).join(',')
+				this.showgang=!this.showgang
+			},
+			choosechangeTag(i) {
+				console.log(this.postlist[i].checked )
+				this.postlist[i].checked = !this.postlist[i].checked
+			},
+			getdepartment(){
+				querydepartment().then(res=>{
+					if(res.code==200){
+						this.columnb=res.data
+						// console.log('部门',res)
+					}
+				})
+			},
+			getpostlist(){
+				querypost().then(res=>{
+					if(res.code==200){
+						this.postlist = res.data.map(item => {
+							return {
+								...item,
+								checked: false,
+							}
+						})
+						console.log('岗位',res)
+					}
+				})
+			},
+			getrolelist(){
+				queryrole().then(res=>{
+					if(res.code==200){
+						this.rolelist = res.data.map(item => {
+							return {
+								...item,
+								checked: false,
+							}
+						})
+						// console.log('岗位',res)
+					}
+				})
+			},
+			confirma(e){
+				this.showgang = !this.showgang
+				this.valuea=e.value[0]
+				console.log(e)
+			},
+			confirmb(e){
+				this.valueb=e[0].label
+				this.valueidbu=e[0].id
+				console.log(e[0])
+			},
 			getidshen(id){
 				console.log(id)
+				this.getallList()
 				this.ids=id
-				this.subsalesaudits()
+				this.seluserids[0]=id
+				this.showuser=!this.showuser
+				// this.showcommpany=!this.showcommpany
 			},
 			batchApprove(){
 				 if (this.selectedUsers.length === 0) {
@@ -138,19 +354,34 @@
 				}
 				
 				this.ids=this.selectedUsers.join(',')
-				this.subsalesaudits()
+				this.seluserids=this.selectedUsers
+				// this.showcommpany=!this.showcommpany
+				this.showuser=!this.showuser
+				// this.subsalesaudits()
+				// this.confirmbchange()
 			},
 			subsalesaudits(){
 				const data={
-					 userIds:this.ids
+					 userIds:this.seluserids
 				}
-				subsalesaudit(this.ids).then(res=>{
-					console.log(res)
+				subsalesaudit(this.seluserids).then(res=>{
+					console.log("subsalesaudits=====",res)
 					if(res.code==200){
 						uni.showToast({
 							title: "用户通过审核,成为销售!",
 							icon: 'none',
 						});
+						
+						this.valueidbu=[]
+						this.valueid=[]
+						this.valueb=[]
+						this.valuea=''
+						this.valuej=''
+						this.roleid=[]
+						this.ids=''
+						this.showuser=!this.showuser
+						this.seluserids=[]
+						// this.showcommpany=!this.showcommpany
 						this.getUser()
 					}else{
 						uni.showToast({
@@ -219,7 +450,19 @@
 				getAllUsers(data).then(
 					res => {
 						if(res.code==200){
+							this.viewload=false
 							 that.list=res.users;
+							this.list=this.list.map(group=>{
+								group.list = group.list.map(user => {
+								   return {
+									 ...user,
+									 checked: this.isSelectAll,
+									 postname:user.post.map(item=>item.postName).join(","),
+									 rolesname:user.roles.map(item=>item.roleName).join(",")
+								   };
+								})
+								return group;
+							})
 						}
 					},
 					rej => {}
@@ -285,6 +528,25 @@
 	}
 </script>
 <style  lang="scss">
+	.quxiao{
+		width: 40%;
+		height: 70rpx;
+		line-height: 70rpx;
+		text-align: center;
+		background-color: #F8F8FC;
+		border: 2rpx solid #cacaca;
+		color: #999;
+		border-radius: 50rpx;
+	}
+	.queren{
+		width: 40%;
+		height: 70rpx;
+		line-height: 70rpx;
+		text-align: center;
+		background-color: #1773ff;
+		color: #fff;
+		border-radius: 50rpx;
+	}
 	::v-deep {
 		.foot-select {
 			 position: fixed;

+ 3 - 3
pages/courseManage/course/becomeSale.vue → pages_course/course/becomeSale.vue

@@ -109,7 +109,7 @@
 				 loginPage = '/pages/auth/login';
 				 // #endif
 				 // #ifdef MP-WEIXIN
-				 loginPage = '/pages/auth/wxlogin';
+				 loginPage = '/pages/enterprise/enterprise';
 				 // #endif
 				uni.navigateTo({
 					url:loginPage
@@ -173,7 +173,7 @@ padding: 30rpx 50rpx;
 		}
 	}
 	.input-phone{
-		background:url('https://fbylive.obs.cn-southwest-2.myhuaweicloud.com:443/app/manergevip/companyphone.png') no-repeat 0 center;
+		background:url('https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/app/manergevip/companyphone.png') no-repeat 0 center;
 		background-size: 40rpx 40rpx;
 		background-position: 24rpx;
 	}
@@ -191,7 +191,7 @@ padding: 30rpx 50rpx;
 		box-shadow: 0px 7rpx 6rpx 0px rgba(0, 0, 0, 0.2);
 		border-radius: 40rpx;
 		font-size: 30rpx;
-		font-family: PingFang SC;
+		// font-family: PingFang SC;
 		font-weight: 500;
 		color: rgba(255, 255, 255, 1.0);
 	}

+ 108 - 5
pages/courseManage/course/courseVideo.vue → pages_course/course/courseVideo.vue

@@ -4,7 +4,12 @@
 			<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> 
+			class="videotop" :playback-rate="playbackRate"></video> 
+			
+		</view>
+		<view class="speed-controls">
+			<view @click="changeSpeed(item.value,index)" v-for="(item,index) in speadvideo" 
+			:key="index" :class="actTime==index?'actstyle':''">{{item.name}}</view>
 		</view>
 		<view class="title-content" id="title-content">
 			<!-- 课程标题 -->
@@ -12,7 +17,7 @@
 				{{listdetail.title}} 
 			</view>
 			<view class="fs24" style="color: #666;font-weight: normal;">
-				{{listdetail.description}}
+				{{listdetail.description?listdetail.description:""}}
 			</view>
 			<view class="fs24" style="color: #999;font-weight: normal;">课程视频时长:{{formatSeconds(listdetail.duration)}}</view>
 		</view>
@@ -37,12 +42,19 @@
 				</view>
 			</view>
 		</view>
-		<view class="footer">
+		<view class="footer" v-if="!viewload">
 			<view class="justify-between" >
-				<!-- <view class="copybtn flex-1 mr40" @click="buildimg">生成海报</view> -->
+				<!--#ifdef MP-WEIXIN-->
+				<button open-type="share" class="copybtn flex-1">分享课程</button>
+				<!-- <view class="copybtn flex-1" @click="showShare=!showShare">分享卡片</view> -->
+				<!--#endif-->
+				<!--#ifdef H5-->
 				<view class="copybtn flex-1" @click="copyshareLink()">复制分享链接</view>
+				<!--#endif-->
 			</view>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
@@ -57,20 +69,89 @@
 	export default {
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				videoId:'',
 				listdetail:[],
 				user:{},
-				copylink:''
+				copylink:'',
+				id:'',
+				periodId:'',
+				imgs:this.$store.state.imgpath+'/app/image/logo.png',
+				playbackRate: 1.0, // 默认1倍速
+				videoContext: null,
+				actTime:0,
+				speadvideo:[
+					{
+					name:'1.0倍速',
+					value:1
+					},
+					{
+					name:'1.5倍速',
+					value:1.5
+					},
+					{
+					name:'2.0倍速',
+					value:2
+					}
+				]
 			}
 		},
+		mounted() {
+			// 创建视频上下文
+			    this.videoContext = uni.createVideoContext('myVideo', this);
+		},
 		onLoad(option) {
 			this.videoId=option.videoId
+			this.id=option.id
+			this.periodId=option.periodId
 		},
 		onShow() {
 			this.getdetail()
 			this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
 		},
+		computed: {
+		    imgPath() {
+		      // 处理空值,返回默认路径或空字符串
+		      // if (!this.$store.state.imgpath) {
+		      //   return '' // 本地默认图
+		      // }
+		      return this.$store.state.imgpath
+		    }
+		  },
+		onShareAppMessage() {
+			const course={
+				companyId:this.user.companyId,
+				companyUserId:this.user.userId,
+				id:this.id,
+				courseId:this.listdetail.courseId,
+				videoId:this.videoId,
+				periodId:this.periodId
+			}
+			console.log(course)
+			return {
+				title: this.listdetail.title, // 分享卡片标题
+				path: 'pages_course/videovip' + "?course=" +JSON.stringify(course) , // 目标页面路径
+				// 携带参数:将当前页面的数据拼接到路径中
+				imageUrl: this.listdetail.thumbnail||this.imgs, // 分享卡片封面图(可选)
+				success: (res) => {
+					console.log("分享成功", res);
+				},
+				fail: (err) => {
+					console.log("分享失败", err);
+				},
+			}
+		},
 		methods: {
+			changeSpeed(rate,index) {
+				console.log(rate,index)
+				this.actTime=index
+			      this.playbackRate = rate;
+			      // 更新播放速率
+			      if (this.videoContext) {
+			        this.videoContext.playbackRate(rate);
+			      }
+			},
 			numberToLetter(num) {
 				// 将数字转换为字母的 ASCII 码
 				let letterCode = num + 65;
@@ -96,6 +177,7 @@
 				}
 				getcourseDetail(param).then(res => {
 					if(res.code==200){
+						this.viewload=false
 						this.listdetail=res.data
 						this.listdetail.questionBankList= this.listdetail.questionBankList.map(item => ({
 							...item,
@@ -117,6 +199,7 @@
 					courseId: this.listdetail.courseId,
 					time: this.time,
 					videoId: this.listdetail.videoId,
+					id: Number(this.id),
 				}
 				sharecourselink(params).then(res => {
 					if (res.code == 200) {
@@ -159,6 +242,26 @@
 </script>
 
 <style scoped lang="scss">
+	.actstyle{
+		background-color: #FF5C03;
+		color: #fff;
+		border: 2rpx solid #FF5C03 !important;
+	}
+	.speed-controls {
+	  margin-top: 20rpx;
+	  display: flex;
+	  justify-content: space-around;
+	  margin-bottom: 16rpx;
+	  view{
+		  height: 50rpx;
+		  line-height: 46rpx; 
+		  width: 120rpx;
+		  font-size: 24rpx;
+		  border-radius: 30rpx;
+		  text-align: center;
+		  border: 2rpx solid #a5a5a5;
+	  }
+	}
 .video-box {
 	width: 100%;
 	height: 420rpx;

+ 33 - 0
pages_course/exportlist/exportlist.vue

@@ -0,0 +1,33 @@
+<template>
+	<view class="content column ">
+		<view class="bold fs32">昨日</view>
+		<view>
+			
+		</view>
+		<view class="bold fs32">以往</view>
+		<view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				todaylist:{},
+				beforelist:{}
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.content{
+	padding: 20rpx;
+	height: 100%;
+}
+</style>

+ 3 - 13
pages_course/reward.vue

@@ -31,27 +31,17 @@
 			},
 			handleTest() {
 				const that = this
-				console.log(that.mchId)
-				console.log('wxb9b453d37c5fad45',wx.getAccountInfoSync().miniProgram.appId)
-				console.log(that.packageInfo)
+				// console.log(that.mchId)
+				// console.log('wx3de90a39feb8107a',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 {

文件差异内容过多而无法显示
+ 460 - 194
pages_course/video.vue


+ 2036 - 0
pages_course/videoNew.vue

@@ -0,0 +1,2036 @@
+<template>
+	<view class="content">
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<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" 
+			@fullscreenchange="fullscreenchange"
+			@controlstoggle="controlstoggle"
+			@waiting="getWaiting"
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:show-fullscreen-btn="true"
+			: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"
+			>
+			<!-- :danmu-list="danmuList"
+			enable-danmu
+			danmu-btn -->
+			<!-- 弹幕展示 -->
+			<template v-if="showDanmu==1&&openCommentStatus==2">
+				<text v-for="(item, index) in activeDanmus" :key="item.commentId" class="danmu-item danmuMove"
+					:style="item.danmustyle" @animationend="animationend(item,index)">
+					{{ item.content }}
+				</text>
+			</template>
+				<cover-view class="video-danmu-btnbox" :style="{display: openCommentStatus==2&&isfull&&crtShow&&isLogin&&isAddKf==1 ? 'block':'none'}">
+					<cover-image class="video-danmu-image" src="/static/images/danmu_set.png" @click="openDanmu(1)"></cover-image>
+				</cover-view>
+			</video>
+		</view>
+		<!-- 弹幕方法 -->
+		<commentBox
+			v-if="openCommentStatus==2"
+			ref="danmuBox" 
+			:height="height" 
+			:urlOption="urlOption" 
+			:time="playTime"
+			:showDanmu="showDanmu"
+			:viewCommentNum="viewCommentNum"
+			:openCommentStatus="openCommentStatus"
+			@setInputText="setInputText" 
+			@getScrollTop="getScrollTop"
+			@getMore="getMore"
+			@getActiveDanmus="getActiveDanmus"></commentBox>
+		<view id="title-contentnav">
+			<view class="title-content" v-if="openCommentStatus!=1">
+				<!-- 答题时展示小节课程名,其他展示课程名 -->
+				<!-- 小节课程名 -->
+				<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+					{{courseInfo.title}}
+				</view>
+				<!-- 课程名字 -->
+				<view class="miantitlebox" v-else>
+					{{courseInfo.courseName}}
+				</view>
+				<!-- 投诉 -->
+				<!-- <view class="warning" @click="feedback">
+					<image src="/static/images/warning.png"></image>
+					<text>投诉</text>
+				</view> -->
+			</view>
+			<view class="tabbox-bar" v-if="openCommentStatus==1">
+				<view class="tabbox">
+					<view :class="currentTab == nav.id ? 'tabbox-active':''" v-for="nav in navList" :key="nav.id" @click="handleTab(nav.id)">{{nav.name}}</view>
+				</view>
+				<!-- 投诉 -->
+				<!-- <view class="warning" @click="feedback">
+					<image src="/static/images/warning.png"></image>
+					<text>投诉</text>
+				</view> -->
+			</view>
+		</view>
+		<scroll-view
+		class="scroll-view" 
+		:style="{height: height}" 
+		:scroll-top="scrollTop" 
+		:scroll-y="true" 
+		:refresher-enabled="currentTab == 2"
+		:refresher-triggered="triggered"
+		@refresherrefresh="handleRefresher">
+			<template v-if="openCommentStatus==1">
+				<view v-show="currentTab==0">
+					<descInfoNav ref="descInfoNav" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfoNav>
+				</view>
+				<view v-show="currentTab==2">
+					<commentBox 
+					ref="commentBox" 
+					:height="height" 
+					:urlOption="urlOption" 
+					:time="playTime"
+					:flagTime="flagTime"
+					:showDanmu="showDanmu"
+					:viewCommentNum="viewCommentNum"
+					:openCommentStatus="openCommentStatus"
+					@setInputText="setInputText" 
+					@getScrollTop="getScrollTop"
+					@getMore="getMore"></commentBox>
+				</view>
+			</template>
+			<view v-show="currentTab==1">
+				<template v-if="openCommentStatus!=1">
+					<!-- 介绍 -->
+					<descInfo ref="descInfo" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfo>
+				</template>
+				<!-- 问题 -->
+				<template v-if="isLogin&&isAddKf==1">
+					<ques ref="ques" :quesList="quesList" :openCommentStatus="openCommentStatus" @handleAnswer="handleAnswer"></ques>
+				</template>
+			</view>
+		</scroll-view>
+		<!-- 线路 -->
+		<view class="video-line" v-if="isLogin&&isAddKf==1" @click="openPop">
+			<image :src="baseUrl+'/images/changePlayer-icon.png'"></image>
+			<text>线路{{numberToChinese(lineIndex + 1)}}</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="baseUrl+'/images/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)">
+						线路{{numberToChinese(lineIndex + 1)}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 发送弹幕 -->
+		<view class="video-line danmu-line" v-if="isLogin&&isAddKf==1&&openCommentStatus==2" @click="openDanmu(0)" >
+			<image class="set_image" src="/static/images/danmu_set_black.png" mode="aspectFill"></image>
+			<text>发弹幕</text>
+		</view>
+		<!-- 发送弹幕弹窗 -->
+		<uni-popup ref="danmuPopup" type="bottom" style="z-index: 999;" @change="changeShowPopup">
+			<view class="danmuPopup" :style="{marginLeft:isfull ? statusBarHeight+'px': 0,marginBottom: danmuboxHeight+'px'}">
+				<view class="danmuPopup-head border-line">
+					<image class="danmu-icon" :src="showDanmu==0?'/static/images/danmu-off.png':'/static/images/danmu-on.png'" mode="heightFix" @click="switchDanmu()"></image>
+					<view class="u-border">
+						<input 
+						class="danmuPopup-input" 
+						placeholder="发个弹幕吧~" 
+						border="border"
+						:focus="focus"
+						:adjustPosition="false" 
+						:autoBlur="true" 
+						maxlength="50"
+						v-model.trim="inputText">
+						</input>
+						<text style="font-size: 24rpx;color: #bbb;margin-left: 10rpx;">{{inputText?inputText.trim().length:0}}/50</text>
+					</view>
+					<button class="danmuPopup-send" @click="handleChatInput">发送</button>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 答题弹窗 -->
+		<uni-popup ref="answerPopup" type="center" :show="answerPopup">
+			<view :class="errTitle == '恭喜你,回答正确' ? 'answerPopup-box bg':'answerPopup-box'">
+				<!-- 正确 -->
+				<image class="tipimg" v-if="errTitle == '恭喜你,回答正确'" :src="baseUrl+'/images/course_answer_img.png'"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else :src="baseUrl+'/images/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>
+		</uni-popup>
+		<!-- 客服二维码弹窗 -->
+		<uni-popup ref="kfPopup" type="center" :mask-click="false">
+			<view class="kfqrcode-box">
+				<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="baseUrl+'/images/course_close_white_icon.png'" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</uni-popup>
+		<!-- 可以答题提示 -->
+		<view class="answerTip" v-if="currentTab!=1&&openCommentStatus==1&&showAnswerTip" @click="handleTab(1)">
+			可以答题啦
+		</view>
+		<!-- footer -->
+		<view class="footer" v-show="currentTab!=2&&videoId">
+			<view class="footer-btn" v-if="!isLogin || isAddKf !=1" @click="submit">
+				<text>立即学习</text>
+			</view>
+			<view v-if="isLogin&&isAddKf==1&&currentTab==1&&quesList&&quesList.length>0" class="footer-btn footer-btn-border" @click="submit">
+				<image class="footer-btn-img" :src="baseUrl+'/images/red_envelope_btnimg.png'" mode="aspectFill"></image>
+				<text>提交答案领取奖励</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 class="footer-tips">重庆云联融智提供技术支持</view>
+		</view>
+		<view v-show="currentTab==2">
+			<view class="chatinput" :style="{bottom:danmuboxHeight>0?danmuboxHeight+'px':'calc(var(--window-bottom) + 24rpx)'}">
+				<input class="uni-input" v-model.trim="inputText" :adjustPosition="false" :autoBlur="false" maxlength="140" placeholder="发消息···" confirm-type="send" @confirm="handleChatInput" />
+				<button class="send" @click="handleChatInput">发送</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {TOKEN_KEY} from '@/utils/common.js'
+	// import ques from "@/components/ques.vue"
+	// import descInfo from "@/components/descInfo.vue"
+	// import descInfoNav from "@/components/descInfoNav.vue"
+	// import commentBox from "@/components/commentBox.vue"
+	import { generateRandomString } from "@/utils/common.js"
+	import dayjs from 'dayjs';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		getInternetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		loginByMp,
+		getRealLink,
+		errorLogUpload,
+	} from "@/api/course.js"
+	export default {
+		// components: {
+		// 	descInfoNav,
+		// 	descInfo,
+		// 	commentBox,
+		// 	ques,
+		// },
+		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: "",
+				isfull: false,
+				isAddKf: 0,
+				lineIndex: 0,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				linkType: 0,
+				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
+						}
+					},
+				},
+				poster: "",
+				// 错误请求次数
+				errorCount: 0,
+				answerPopup: false,
+				sortLink:"",
+				// 课程是否过期
+				isExpire: false,
+				menuButtonLeft: 281,
+				menuButtonH: 45,
+				timer: null,
+				flag: false,
+				focus: false,
+				openDanmuType: 0,
+				danmuboxHeight: 0,
+				user: {},
+				crtShow: true,
+				courseLogo: '',
+				isfull: false,
+				navList:[{
+					id: 0,
+					name: '介绍'
+				},{
+					id: 1,
+					name: '答题'
+				},{
+					id: 2,
+					name: '评论'
+				}],
+				currentTab: 1,
+				triggered: false,
+				// 没有更多
+				isMore: false,
+				inputText:"",
+				// 获取最多历史评论条数
+				viewCommentNum: 200,
+				// 1-开启评论;2-开启弹幕;3-关闭
+				openCommentStatus: 3,
+				showAnswerTip: false,
+				showDanmu: 1,
+				activeDanmus:[],
+				flagTime: 0
+			}
+		},
+		onLoad(option) {
+			this.code = option.code
+			this.urlOption = option.course ? JSON.parse(option.course) : {}
+			this.videoId = this.urlOption.videoId || ''
+			this.qwUserId = this.urlOption.qwUserId || ''
+			this.corpId = this.urlOption.corpId || ''
+			this.linkType = this.urlOption.linkType || 0
+			// if (this.code) {
+			// 	this.loginByMp()
+			// }
+			var that=this;
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+			}
+			this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+			// #ifndef H5
+			uni.onKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		onShow() {
+			this.tipsOpen = false
+			// this.isLogin = this.$isLoginCourse()
+			this.uuId = generateRandomString(16)
+			if(uni.getStorageSync('userInfo') && JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.user = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.user = {}
+			}
+			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()
+			}
+			this.getFinishCourseVideo()
+			this.getInternetTraffic()
+			// if (this.interval != null) {
+			// 	clearInterval(this.interval)
+			// 	this.interval = null
+			// }
+		},
+		onUnload() {
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.getFinishCourseVideo()
+			this.getInternetTraffic()
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		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()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		methods: {
+			numberToChinese(number) {
+				if (number) {
+					const chineseNumber = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
+					return chineseNumber[number - 1];
+				} else {
+					return ''
+				}
+			},
+			keyboardHeightChange(res) {
+				// #ifndef H5
+				console.log("this.danmuboxHeight",this.danmuboxHeight)
+				 this.danmuboxHeight = res.height
+				// #endif
+			},
+			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 {
+					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
+				}
+				if(this.isEnded||this.playTime >= this.duration - 60) {
+					this.showAnswerTip = true
+				} else {
+					this.showAnswerTip = false
+				}
+				if (Math.floor(e.detail.currentTime) != this.flagTime &&this.openCommentStatus == 2) {
+					this.flagTime = Math.floor(e.detail.currentTime)
+					this.$refs.danmuBox&&this.$refs.danmuBox.checkDanmu(this.flagTime)
+				}
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.errorCount++
+				if (this.errorCount > 3) return
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.clearIntegral()
+				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.showAnswerTip = true
+				this.getFinishCourseVideo()
+			},
+			getWaiting() {
+				this.getErrMsg('','waiting')
+			},
+			fullscreenchange(event) {
+				this.isfull = event.detail.fullScreen
+				if(this.isfull) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.initTracks()
+				}
+			},
+			controlstoggle(event) {
+				this.crtShow =  event.detail.show
+			},
+			getIP() {
+				uni.request({
+					url: 'https://ipinfo.io/json', //仅为示例,并非真实接口地址。
+					method: 'GET',
+					success: (res) => {
+						this.ip = res.data.ip
+					}
+				});
+			},
+			getHeight() {
+				setTimeout(()=>{
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#title-contentnav")
+						.boundingClientRect((data) => {
+							if(data) {
+								this.height =
+									`calc(100vh - ${data.height}px - 420rpx - ${this.statusBarHeight}px - 100px - 88rpx)`
+							}
+						})
+						.exec();
+				},200)
+			},
+			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
+				}
+			},
+			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.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {
+						this.loading = false
+					}
+				).catch(() => {
+					this.loading = false
+				})
+			},
+			getH5CourseVideoDetails(type) {
+				getH5CourseVideoDetails(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.config = res.config || {}
+							this.isFinish = res.isFinish || 0
+							this.duration = res.course && res.course.duration ? res.course.duration : 0
+							this.playDuration = res.playDuration || 0
+							this.playDurationSeek = res.playDuration || 0
+							this.tipsTime = res.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
+							this.courseLogo = res.config&&res.config.courseLogo
+							this.viewCommentNum = res.config&&res.config.viewCommentNum || 200
+							if(this.openCommentStatus == 3) {
+								this.$refs.commentBox&&this.$refs.commentBox.closeWSocket()
+								this.$refs.danmuBox&&this.$refs.danmuBox.closeWSocket()
+							}
+							const status = res.config&&res.config.openCommentStatus || 3
+							if(status != this.openCommentStatus) {
+								this.openCommentStatus = status
+							}
+							this.currentTab = 1
+							if(this.openCommentStatus!=2 || this.showDanmu!=1) {
+								this.activeDanmus = []
+							}
+							if (!this.player || type == 'error') {
+								this.lineIndex = this.config.defaultLine
+								this.videoUrl = lineList[this.lineIndex]
+								this.poster= res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// 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
+								setTimeout(()=>{
+									this.player = uni.createVideoContext('video-content-box');
+									this.player.seek(this.playTime)
+									this.player.play();
+								},500);
+							} 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();
+							this.quesList = res.questions && res.questions.length > 0 ? res.questions : [],
+								this.quesList = this.quesList.map(item => ({
+									...item,
+									questionOption: JSON.parse(item.question),
+									answer: ''
+								}))
+						}
+						this.getHeight()
+						this.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {}
+				)
+			},
+			handleAnswer(val) {
+				let {item, option} = val
+				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 => {
+						if(res){
+							if (this.isAddKf == 1) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								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,
+					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.errTitle = "很遗憾答错了"
+									this.errDesc = `<span style="color:#FF5C03">还有${res.remain}次机会,继续加油</span>`
+									this.$refs.answerPopup.open("center")
+								}
+							} else {
+								// 答题成功
+								this.errTitle = "恭喜你,回答正确"
+								this.errDesc = `请选择奖励`
+								// this.$refs.answerPopup.open("center")
+								this.closeAnswerPopup(1)
+							}
+						} else {
+							if (res.msg == "该课题到达答错次数限制") {
+								this.errTitle = "答题次数超过限制"
+								this.errDesc = "以后的课程要认真学习哦"
+								this.$refs.answerPopup.open("center")
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: "none"
+								})
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 选择
+			rewardChange(e) {
+				this.currentReward = e.detail.value
+			},
+			closeAnswerPopup(type) {
+				this.$refs.answerPopup.close()
+				if (this.errTitle == '恭喜你,回答正确') {
+					let param = {
+						...this.urlOption,
+						rewardType: Number(this.currentReward),
+						source: 2,
+						appId: getApp().globalData.appId
+					}
+					if(type == 1) {
+						param = {
+							...this.urlOption,
+							source: 2,
+							appId: getApp().globalData.appId
+						}
+					}
+					sendReward(param).then(res => {
+						if(res.isNew&&res.isNew==1) {
+							const packageInfo = res.data.packageInfo || ''
+							if(packageInfo) {
+								uni.setStorageSync('receive_package',packageInfo);
+								if(res.mchId) uni.setStorageSync('mchId',res.mchId);
+								uni.navigateTo({
+									url: '/pages_course/reward'
+								})
+							}
+						} 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()
+				}
+
+			},
+			// 客服
+			getIsAddKf() {
+				this.qrcode = ''
+				this.qrcodeMsg = ''
+				this.isAddKf = 0
+				// {videoId: this.videoId,qwUserId: this.qwUserId,corpId: this.corpId}
+				getIsAddKf(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 400) {
+							this.isAddKf = 0
+							this.qrcode = res.qrcode
+							this.qrcodeMsg = res.msg
+							this.$refs.kfPopup.open()
+						} else if (res.code == 504) {
+							// 登录
+							this.goLogin()
+						} else if (res.code == 566) {
+							// 官方群发通用链接
+							const url = res.courseLink.realLink.split('?course=')[1]
+							this.urlOption = JSON.parse(url)
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						}  else if (res.code == 567) {
+							// 群聊通用链接
+							this.urlOption = {
+								...this.urlOption,
+								qwExternalId: res.qwExternalId
+							}
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						}else {
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.isLogin||!this.playTime || this.isAddKf!=1) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getFinishCourseVideo(param)
+			},
+			// 每十分钟获得积分
+			getIntegralByH5Video() {
+				if(!this.isLogin||this.isAddKf!=1) return
+				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)
+			},
+			// 缓冲
+			getInternetTraffic() {
+				if(!this.isLogin||this.isAddKf!=1) return
+				const playVideoTime = Math.ceil(this.playTime / this.duration * 100) // 播放百分比
+				if(this.bufferRate == 0 || this.bufferRate < playVideoTime) {
+					this.bufferRate = playVideoTime
+				}
+				if(this.bufferRate == 0 || Number(this.bufferRate.toFixed(2)) == 0) return
+				const param = {
+					...this.urlOption,
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					duration: this.playTime,
+					bufferRate: Number(this.bufferRate.toFixed(2)),
+				}
+				if(!param.bufferRate) return
+				getInternetTraffic(param)
+			},
+			getErrMsg(err,type) {
+				let msgerr = {
+					errType: type || 'error',
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					ip: this.ip,
+					errMsg: err || ''
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin() {
+				let provider = 'weixin'
+				uni.login({
+					provider: provider,
+					success: async loginRes => {
+						console.log(loginRes)
+						uni.getUserInfo({
+						   provider: provider,
+						   success: (infoRes)=> {
+							    uni.showToast({
+									title: '处理中...',
+									icon: 'loading'
+							    });
+								loginByMp({code: loginRes.code,encryptedData:infoRes.encryptedData,iv:infoRes.iv}).then(res=>{
+									 uni.hideLoading();
+									 if (res.code == 200) {
+										uni.setStorageSync(TOKEN_KEY, res.token);
+										uni.setStorageSync('userInfo', JSON.stringify(res.user));
+										this.user = res.user
+										this.isLogin = true
+										this.getIsAddKf() 
+									 } else {
+										uni.showToast({
+											title: res.msg,
+											icon: 'none'
+										});
+									 }
+								 }).catch(err=>{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录失败,请重新登录",
+									});
+								});
+						   }
+						});
+					}
+				})
+			},
+			getLink() {
+				let that = this;
+				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
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					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)
+			    }
+			},
+			// 弹幕
+			openDanmu(type) {
+				this.openDanmuType = type
+				this.inputText = ''
+				if(type == 1) {
+					this.player.exitFullScreen()
+				}
+				this.$refs.danmuPopup.open()
+			},
+			changeShowPopup(val) {
+				this.focus = val.show
+			},
+			switchDanmu() {
+				this.showDanmu = this.showDanmu == 1 ? 0:1
+				if(this.showDanmu == 0&&this.$refs.danmuBox) {
+					this.$refs.danmuPopup.close()
+					this.activeDanmus = []
+					this.$refs.danmuBox.activeDanmus = []
+					this.$refs.danmuBox.initTracks()
+				}
+			},
+			getScrollTop(res) {
+				console.log(res)
+				if(this.currentTab == 2) {
+					this.scrollTop = res
+				} else {
+					this.scrollTop = 0
+				}
+			},
+			handleTab(index) {
+				this.currentTab = index
+				if(this.currentTab==2) {
+					if(this.$refs.commentBox) {
+						this.$refs.commentBox.msgs = []
+						this.$refs.commentBox.pageNum = 1
+						this.$refs.commentBox.getComments()
+					}
+				} else {
+					setTimeout(()=>{
+						this.scrollTop = 0
+					},100)
+				}
+			},
+			handleRefresher() {
+				this.triggered = true;
+				if (!this.isMore&&this.currentTab==2&&this.openCommentStatus==1) {
+					this.$nextTick(()=>{
+						this.$refs.commentBox&&this.$refs.commentBox.getComments()
+					})
+				}
+				setTimeout(() => {
+					this.triggered = false;
+				}, 500);
+			},
+			getMore(val) {
+				this.triggered = false;
+				this.isMore = val == 1
+			},
+			handleChatInput() {
+				this.inputText = this.inputText.trim()
+				if (this.inputText == "" || this.inputText.trim() == "") {
+					uni.showToast({
+						title: '请输入评论',
+						icon: "none"
+					})
+					return;
+				}
+				if(this.openCommentStatus==1) {
+					this.$refs.commentBox&&this.$refs.commentBox.handleInput(this.inputText)
+				} else if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.handleInput(this.inputText)
+				}
+			},
+			setInputText() {
+				this.inputText = ""
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuPopup.close()
+				}
+			},
+			getActiveDanmus(val) {
+				this.activeDanmus = val.map(item=>({
+					...item,
+					danmustyle: {
+						top: item.top + 'px',
+						...item.style, 
+						'animation-duration': '8s'
+					}
+				}))
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.animationend(moveItem, i)
+				}
+			},
+			feedback() {
+				const userId = this.user.userId || ''
+				const courseId = this.urlOption.courseId || ''
+				const videoId = this.urlOption.videoId || ''
+				uni.navigateTo({
+					url: './feedback?userId='+userId+'&courseId='+courseId+'&videoId='+videoId
+				})
+			}
+		}
+	}
+</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 {
+		margin-top: 14rpx;
+		text-align: center;
+		font-family: PingFang SC,PingFang SC;
+		font-weight: 500;
+		font-size: 12px;
+		color: #bbb;
+	}
+	.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;
+	}
+
+	.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));
+		.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;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+			.title {
+				font-size: 36rpx;
+				font-weight: 500;
+				color: #414858;
+			}
+
+			.time-or-subtitle {
+				margin-top: 12rpx;
+				color: #666666;
+			}
+		}
+		.warning {
+			flex-shrink: 0;
+			color: #888;
+			font-size: 24rpx;
+			@include u-flex(column, center, center);
+			image {
+				flex-shrink: 0;
+				height: 36rpx;
+				width: 36rpx;
+			}
+		}
+		.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: 34rpx;
+				width: 34rpx;
+				margin-right: 6rpx;
+			}
+		}
+		.danmu-line {
+			bottom: calc(var(--window-bottom) + 370rpx);
+			word-break: keep-all;
+			.set_image {
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+		.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;
+	}
+	.video-danmu-btnbox {
+		width: 50px;
+		height: 50px;
+		border-radius: 50%;
+		overflow: hidden;
+		position: absolute;
+		right: 10px;
+		bottom: calc(50% - 50px);
+		transform: translateY(-50%);
+		padding: 8px;
+		box-sizing: border-box;
+	}
+	.video-danmu-image {
+		width: 100%;
+		height: 100%;
+	}
+	.danmuPopup {
+		background-color: #fff;
+		padding-bottom: calc(var(--window-bottom) + 10px);
+		.u-border {
+			flex: 1;
+			@include u-flex(row,center,flex-start);
+			padding: 0 10rpx;
+			border-radius: 6px;
+			border: 1rpx solid #eee;
+		}
+		&-head {
+			width: 100%;
+			padding: 10px;
+			box-sizing: border-box;
+			overflow: hidden;
+			@include u-flex(row,center,flex-start);
+			.danmu-icon {
+				height: 24px;
+				width: 24px;
+				margin-right: 10px;
+			}
+		}
+		&-input {
+			flex: 1;
+			height: 35px;
+		}
+		&-send {
+			flex-shrink: 0;
+			height: 35px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 5px 15px;
+			box-sizing: border-box;
+			background: #FF5C03 !important;
+			border-radius: 6px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #fff !important;
+			margin-left: 12px;
+			&::after {
+				border: none;
+			}
+		}
+		&-con {
+			background-color: #F5F7FA;
+			padding: 24px 12px 48px 12px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #757575;
+		}
+	}
+	.danmu-icon{
+		height: 24px;
+		width: 24px;
+		margin-right: 12px;
+	}
+	.logo {
+		display: inline-block;
+		width: 30px;
+		height: auto;
+		margin: 20px 0 0 10px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.logo-full {
+		display: inline-block;
+		width: 40px;
+		height: auto;
+		margin: 50px 0 0 30px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.tabbox-bar {
+		@include u-flex(row, center, flex-start);
+		background-color: #fff;
+		.warning {
+			flex-shrink: 0;
+			padding-right: 20rpx;
+		}
+	}
+	.tabbox {
+		flex: 1;
+		@include u-flex(row, center, center);
+		border-bottom: 2rpx solid #F5F7FA;
+		height: 44px;
+		background-color: #fff;
+		view {
+			flex: 1;
+			padding: 20rpx 0;
+			margin-right: 40rpx;
+			text-align: center;
+		}
+		&-active {
+			position: relative;
+			&::after {
+				position: absolute;
+				bottom: 0;
+				left: 50%;
+				transform: translateX(-50%);
+				content: "";
+				width: 3rem;
+				border-bottom: 4px solid #FF5C03;
+			}
+		}
+	}
+	.chatinput {
+		position: fixed;
+		left: 32rpx;
+		right: 32rpx;
+		z-index: 999;
+		height: 96rpx;
+		background-color: green;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		@include u-flex(row, center, center);
+		padding: 0 24rpx;
+		box-sizing: border-box;
+		.uni-input {
+			flex: 1;
+			margin-right: 32rpx;
+			font-size: 30rpx;
+		}
+	
+		.send {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF !important;
+			flex-shrink: 0;
+			padding: 0 20rpx;
+			height: 72rpx;
+			background: #FF5C03 !important;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	.answerTip {
+		position: fixed;
+		right: 0;
+		z-index: 9;
+		bottom: calc(var(--window-bottom) + 380rpx);
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		background-color: #ff5c03;
+		color: #fff;
+		border-radius: 50%;
+		height: 100rpx;
+		width: 100rpx;
+		font-size: 25rpx;
+		text-align: center;
+		padding: 10rpx;
+		@include u-flex(row, center, center);
+	}
+	.danmu-item {
+		position: absolute;
+		top: 0;
+		white-space: nowrap;
+		font-size: 16px;
+		height: 20px;
+		display: inline-flex;
+		box-sizing: border-box;
+		align-items: center;
+	}
+	.danmuMove {
+		// animation: mymove 8s linear forwards;
+		// animation-duration: 8s;
+		animation-timing-function: linear;
+		animation-delay: 0s;
+		animation-iteration-count: 1;
+		animation-direction: normal;
+		animation-fill-mode: forwards;
+		animation-play-state: running;
+		animation-name: mymove;
+		will-change: transform;
+	}
+	
+	@keyframes mymove {
+		from {
+			transform: translateX(100vw);
+		}
+	
+		to {
+			transform: translateX(-100%);
+		}
+	}
+</style>

文件差异内容过多而无法显示
+ 565 - 152
pages_course/videovip.vue


+ 197 - 0
pages_course/webview.vue

@@ -0,0 +1,197 @@
+<template>
+  <view class="container">
+    <!-- 加载提示 -->
+    <view class="loading" v-if="loading">
+      <text>加载中...</text>
+    </view>
+    
+    <!-- web-view组件 -->
+    <web-view 
+      :src="webviewUrl" 
+      @message="handleMessage"
+      @load="onLoads"
+      @error="onError"
+    ></web-view>
+  </view>
+</template>
+
+<script>
+	import { getusername,editUser} from '@/api/user'
+export default {
+  data() {
+    return {
+      loading: true,
+      // webviewUrl: '',//福本源
+	  // webviewUrl: 'https://vip.aishanghys.com/weixinOauth',//蜂巢快药
+	  webviewUrl: uni.getStorageSync('authUrl'),//中康
+	  // webviewUrl: 'https://vip.liangmiaoedu.com/weixinOauth',//良苗
+	  // webviewUrl: 'https://vips.beliyostore.com/weixinOauth',//倍力优
+	  // webviewUrl: 'https://userapp.drkzyy.cn/weixinOauth',//德瑞康
+	  // webviewUrl: 'https://companyapp.gjh2024.com/weixinOauth.html',//金慷建
+	 
+      userInfo: {},
+	  userinfos:{
+	  	nickname:"",
+	  	avatar:""
+	  },
+    }
+  },
+  onLoad(options) {
+	  console.log(options)
+	  // if(options.url&&!options.code){
+	  // 		this.webviewUrl=options.url
+	  // }
+	  if(options.code){
+		  // uni.$emit('us ercode', {  code: options.code });
+		  this.loginweixin(options.code)
+	  }
+	 
+    // 生成带参的H5授权页面URL
+    // this.webviewUrl = this.generateAuthUrl()
+  },
+  methods: {
+	  editUserA(){
+	  	const data={
+	  		nickname:this.userinfos.nickname,
+	  		avatar:this.userinfos.avatar,
+	  	}
+	  	editUser(data).then(res=>{
+	  		if(res.code==200){
+	  			setTimeout(()=>{
+	  				uni.navigateBack({
+	  					delta: 1
+	  				});
+	  			},200)
+	  		}else{
+	  			uni.showToast({
+	  				icon:'none',
+	  				title:res.msg,
+	  			});
+	  		}
+	  	})
+	  },
+	  loginweixin(datas){
+		  var data = {
+		  	code: datas,
+		  }
+		  getusername(data).then(res => {
+		  		  this.res=res
+		  		uni.hideLoading();
+		  		if (res.code == 200) {
+		  			console.log(res)
+		  			uni.hideLoading();
+		  			uni.showToast({
+		  				icon:'none',
+		  				title: "成功获取用户信息",
+		  			});
+					this.userinfos.nickname=res.nickname;
+					this.userinfos.avatar=res.headImgUrl;
+		  			uni.setStorageSync('userInfos', this.userinfos);
+					uni.navigateBack({
+						delta: 1
+					});
+		  		} else {
+					uni.hideLoading();
+		  			uni.showToast({
+		  			  title: res.msg || '获取用户信息失败',
+		  			  icon: 'none'
+		  			})
+		  		}
+		  	},
+		  	err => {}
+		  ).catch(err=>{
+		  	uni.hideLoading();
+		  		uni.showToast({
+		  			icon:'none',
+		  			title: "获取用户信息失败",
+		  		});
+		  });
+	  },
+    // 生成授权页面URL,附带小程序传递的参数
+    generateAuthUrl() {
+      // 获取当前小程序的场景值,用于后续业务处理
+      const scene = uni.getLaunchOptionsSync().scene
+      
+      // 这里替换为你的uniapp H5项目域名
+      
+      // 拼接参数,可包含小程序特有的信息
+      const params = {
+        scene,
+        appid: 'wx961fadab9bcb792b', // 公众号AppID
+        redirect_uri: encodeURIComponent('https://h5.fbylive.com/weixinOauth'),
+        scope: 'snsapi_userinfo',
+        state: 'wechat_redirect'
+      }
+      
+      // 微信公众号授权URL
+      return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${params.appid}&redirect_uri=${params.redirect_uri}&response_type=code&scope=${params.scope}&state=${params.state}#wechat_redirect`
+    },
+    
+    // 处理web-view向小程序发送的消息
+    handleMessage(e) {
+      console.log('收到web-view消息:', e.detail)
+      console.log('收到web-view消息:', e)
+      // 获取H5页面传递过来的用户信息
+      if (e.detail && e.detail.type === 'user_info') {
+        this.userInfo = e.detail.data
+         this.token= e.detail.token
+        // 存储用户信息到本地
+        uni.setStorageSync('userInfo', this.userInfo)
+		uni.setStorageSync('TOKEN_WEXIN', this.userInfo)
+        
+        // 返回上一页或跳转到首页
+        uni.showToast({
+          title: '登录成功',
+          icon: 'success'
+        })
+        
+        setTimeout(() => {
+          uni.navigateBack()
+        }, 1500)
+      }
+    },
+    
+    // web-view加载完成
+    onLoads() {
+      this.loading = false
+      console.log('web-view加载完成')
+    },
+    
+    // web-view加载失败
+    onError(e) {
+      this.loading = false
+      console.error('web-view加载失败:', e)
+      uni.showToast({
+        title: '页面加载失败',
+        icon: 'none'
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.container {
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+
+.loading {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #fff;
+  z-index: 100;
+}
+
+web-view {
+  width: 100%;
+  height: 100%;
+}
+</style>    

+ 176 - 0
pages_manage/actDetail.vue

@@ -0,0 +1,176 @@
+<template>
+	<view class="hb column">
+		<view class="topBgline plr20">
+			<view class="justify-between p30 bgcolf radius12 align-center">
+				<view class="ml16">
+					<view class="bold fs28 justify-start align-center">
+						<text>{{detailUser.nickname}}</text>
+						<image class="list-item-copy ml8" :src="imgPath+'/app/images/copy_icon.png'" mode="aspectFill"
+							@click="copyId(detailUser.nickname)">
+					</image>
+					</view>
+					<view class="fs24 base-color-6 mt8" >跟进人:林新新</view>
+					<view class="fs24 base-color-6">注册时间:{{detailUser.createTime}}</view>
+				</view>
+				<u-avatar :src='detailUser.avatar' shape="square" size='50'></u-avatar>
+			</view>
+		</view>
+		<view class="p20">
+			<view class="justify-between bgf p40 radius12">
+				<view>
+					<view>客户标签</view>
+					<view class="base-color-6 fs24">{{detailUser.tag?detailUser.tag:'暂无'}}</view>
+				</view>
+				<view class="justify-start align-center base-color-6 fs24">
+					<!-- <view>共{{detailUser.tag.length?detailUser.tag.length:'0'}}个</view> -->
+					<view>{{detailUser.tag.length?detailUser.tag.split(",").length:'0'}}</view>
+					<image :src="imgPath+'/app/images/right_arrow.png'" class="w12 h20 ml12"></image>
+				</view>
+			</view>
+		</view>
+		<view class="w100 bgf align-center justify-center">
+			 <u-tabs :list="list1" @click="clicktab" lineWidth='30' activeStyle="{color:'#333';font}"></u-tabs>
+		</view>
+		<view class="bgf flex-1 hidden h100">
+			<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 userlist" :key="index" class="p20">
+					<view class="justify-between align-center">
+						<view>{{item.operationType}}</view>
+						<view class="base-color-6 fs24">{{item.createTime}}</view>
+					</view>
+					<view v-html="item.text"></view>
+				</view>
+				<u-loadmore :status="status" />
+				
+				<view class="h80 w100"></view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getuserTrajectory
+	} from "@/api/courseManage.js";
+	export default {
+		data() {
+			return {
+				detailUser:{},
+				list1: [{
+					name: '行为轨迹',
+					value:1
+				}],
+				pageNum:1,
+				pageSize:6,
+				id:'',
+				userlist:[],
+				isEnabled:true,
+				triggered: false,
+				status:'loadmore'
+			}
+		},
+		computed: {
+		    imgPath() {
+		      return this.$store.state.imgpath
+		    },
+			imgname() {
+			  return this.$store.state.logoname
+			}
+		},
+		onShow() {
+			this.detailUser =uni.getStorageSync('detailUser')
+			this.getuserlist()
+		},
+		onLoad(option) {
+			this.id=option.id
+		},
+		methods: {
+			pullDownRefresh() {
+				// 下拉
+				this.triggered = true; //下拉了状态为true
+				setTimeout(() => {
+					this.triggered = false;
+					uni.stopPullDownRefresh()
+					this.pageNum = 1;
+					this.getuserlist('refresh') //触底  不穿执行else
+				}, 1000)
+			},
+			reachBottom() {
+				//上拉
+				// status这个是加载状态
+				if (this.status === 'loadmore') {
+					this.status = 'loading'
+					uni.showNavigationBarLoading()
+					setTimeout(() => {
+						this.pageNum++
+						this.getuserlist() //触底  不穿执行else
+						uni.hideNavigationBarLoading()
+					}, 1000);
+				}
+			},
+			getuserlist(type){
+				const data={
+					userId:this.id,
+					pageNum:this.pageNum,
+					pageSize:this.pageSize
+				}
+				getuserTrajectory(data).then(res=>{
+					if(res.code==200){
+						if (type == 'refresh') {
+							this.userlist = res.data.list
+						} else {
+							// 加载更多 当前页和下一页合并
+							this.userlist = [...this.userlist, ...res.data.list]
+						}
+						if (this.pageNum >= res.data.pages) {
+							this.status = 'nomore'
+						} else {
+							this.status = 'loadmore'
+						}
+						console.log(res)
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+							duration: 2000
+						});
+					}
+				})
+			},
+			clicktab(item) {
+				console.log('item', item);
+			},
+			copyId(id) {
+				setTimeout(()=>{
+					uni.setClipboardData({
+						data: String(id),
+						success: () => {
+							uni.showToast({
+								title: '复制成功',
+								icon: 'none',
+								duration: 2000
+							});
+						},
+					})
+				},200)
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.topBgline {
+	background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
+	padding-top: 40rpx;
+}
+.bgcolf {
+	background: rgba(255, 255, 255, 0.4);
+}
+.list-item-copy {
+	width: 20px;
+	height: 20px;
+}
+</style>

+ 18 - 5
pages/courseManage/manage/manageDetail.vue → pages_manage/manageDetail.vue

@@ -52,7 +52,7 @@
 							@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"
+							<view v-for="(item,index) in courseOne" :key="item.periodId"
 								:class="courseid==item.periodId?'actNav':''" class="m10 p10 center"
 								style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.periodId)">
 								{{item.periodName}}
@@ -71,7 +71,7 @@
 						@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
 						:upper-threshold="100" :lower-threshold="100" @refresherabort="triggereds = false"
 						@scrolltolower="reachBottoms">
-						<view v-for="(item,index) in courseTwo" :key="item.index"
+						<view v-for="(item,index) in courseTwo" :key="item.videoId"
 							:class="courseids==item.videoId?'actNav':''" class="m10 p10 center"
 							style="border-bottom: 2rpx solid #eee;" @click="getCourseTwo(item.videoId)">
 							{{item.title}}
@@ -269,6 +269,8 @@
 				</view>
 			</u-popup>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext"></u-loading-page>
 	</view>
 </template>
 
@@ -290,6 +292,8 @@
 		},
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				changeremark: '',
 				changephone: '',
 				list1: [{
@@ -499,7 +503,7 @@
 			getcoursegroup(type) {
 				const param = {
 					companyUserId: this.groupid,
-					courseId: this.courseid,
+					periodId: this.courseid,
 					videoId: this.courseids,
 					pageNum: this.pageNum,
 					pageSize: this.pageSize,
@@ -508,6 +512,7 @@
 					console.log(res)
 					if (res.code == 200) {
 						// refresh 下拉
+						this.viewload=false
 						if (type == 'refresh') {
 							this.courselist = res.data.list
 						} else {
@@ -530,7 +535,7 @@
 			getcout() {
 				const param = {
 					companyUserId: this.groupid,
-					courseId: this.courseid,
+					periodId: this.courseid,
 					videoId: this.courseids,
 				}
 				this.getCourselist(param)
@@ -627,7 +632,7 @@
 			getCourseListsmall(type) {
 				//获取小节目录
 				const param = {
-					courseId: this.courseid,
+					periodId: this.courseid,
 					pageNum: this.pageNums,
 					pageSize: this.pageSizes, 
 					keyword:this.keyword
@@ -670,6 +675,14 @@
 				if (index == 0) {
 					this.getCourseList()
 				} else {
+					if(this.courseid==''){
+						uni.showToast({
+							icon: 'none',
+							title: '请选择训练营'
+						})
+						return
+					}
+					this.courseTwo=[]
 					this.getCourseListsmall()
 				}
 			},

+ 6 - 1
pages/courseManage/manage/manageIndex.vue → pages_manage/manageIndex.vue

@@ -120,6 +120,8 @@
 			<u-picker :show="showday" :columns="columns" keyName="label" style="flex:0;" @cancel="cancel"
 				@confirm='confirm'></u-picker>
 		</view>
+		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="20"
+		:loading-text="loadingtext" ></u-loading-page>
 	</view>
 </template>
 
@@ -132,6 +134,8 @@
 	export default {
 		data() {
 			return {
+				viewload:true,
+				loadingtext:"数据加载中...",
 				list1: [{
 						name: '销售员(0)',
 					},
@@ -349,6 +353,7 @@
 				 getusergroup(params).then(res => {
 					if (res.code == 200) {
 						console.log(res)
+						this.viewload=false
 						this.list1[0].name = '销售员(' + res.data.total + ')'
 						// refresh 下拉
 						if (type == 'refresh') {
@@ -427,7 +432,7 @@
 			managedetail(id,item) {
 				uni.setStorageSync('grouplist', item)
 				uni.navigateTo({
-					url: "/pages/courseManage/manage/manageDetail?id="+id
+					url: "/pages_manage/manageDetail?id="+id
 				})
 			},
 			changevipDetail(id) {

+ 9 - 8
project.config.json

@@ -1,11 +1,5 @@
 {
-  "appid": "wxa5b19147cb4d515e",
   "compileType": "miniprogram",
-  "libVersion": "3.7.3",
-  "packOptions": {
-    "ignore": [],
-    "include": []
-  },
   "setting": {
     "coverView": true,
     "es6": true,
@@ -18,12 +12,19 @@
       "ignore": [],
       "disablePlugins": [],
       "outputPath": ""
-    }
+    },
+    "ignoreUploadUnusedFiles": true
   },
   "condition": {},
   "editorSetting": {
     "tabIndent": "insertSpaces",
     "tabSize": 2
   },
-  "simulatorPluginLibVersion": {}
+  "simulatorPluginLibVersion": {},
+  "libVersion": "3.8.9",
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "appid": "wx29d26f63f836be7f"
 }

+ 36 - 6
router/router.js

@@ -5,12 +5,42 @@ import Vuex from 'vuex';
 Vue.use(Vuex);
 
 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'//中康接口请求地址
+  state: {
+	// imgpath: 'https://hylj-1323137866.cos.ap-chongqing.myqcloud.com',//云联融智图片请求地址
+	// logoname:'云联融智优选',
+	// appid:'wxd70f99287830cb51',
+	// imgpath: 'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com',//福本源图片请求地址
+	// logoname:'乐氏本源',
+	// appid:'wxb9b453d37c5fad45',
+	// imgpath: 'https://sft-1361917636.cos.ap-chongqing.myqcloud.com',//四福堂图片请求地址
+	// logoname:'四福堂',
+	// imgpath: 'https://zkzh-2025.oss-cn-beijing.aliyuncs.com',//中康图片请求地址
+	// logoname:'中康未来智慧',
+	// appid:'wxedde588767b358b1',
+	// imgpath: 'https://fc-1361520560.cos.ap-beijing.myqcloud.com',//蜂巢快药图片请求地址
+	// logoname:'蜂巢快药',
+	// appid:'wx903d9aee9cffb320',////蜂巢快药
+	// imgpath: 'https://fc-1361520560.cos.ap-beijing.myqcloud.com/haoyisheng',//好宜生图片请求地址
+	// logoname:'好宜生佳园',
+	// appid:'wxa843c1c3e52efbf8',//好宜生佳园
+	// imgpath: 'https://userapp.whhm.ylrzcloud.com',//惠名大药房图片请求地址
+	// logoname:'惠名大药房',
+	// appid:'wxec49f9d783abf233'//h5,
+	// imgpath: 'https://liangmiao.obs.cn-southwest-2.myhuaweicloud.com',//良苗图片请求地址
+	// logoname:'良苗',
+	// appid:'wx80dc06697b583cd9',
+	// imgpath: 'https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com',//倍力优图片请求地址
+	// logoname:'倍力优',
+	// appid:'wx301ab2fad04c658a',
+	// imgpath: 'https://bnkc-1323137866.cos.ap-chongqing.myqcloud.com',//百年康城图片请求地址
+	// logoname:'百年康成',
+	// appid:'wx0d021524695f1943'//h5,
+	imgpath: 'https://drk-1363981074.cos.ap-chongqing.myqcloud.com',//德瑞康图片请求地址
+	logoname:'青岛市德瑞康',
+	appid:'wx76cb55db092a41ae',
+	// imgpath: 'https://jkjobs.ylrztop.com',//金慷建图片请求地址
+	// logoname:'金慷建',
+	// appid:'wxa73f0d48f1f2f66c',
   },
   mutations: {
     setCount(state, value) {

+ 24 - 0
uni_modules/uni-transition/changelog.md

@@ -0,0 +1,24 @@
+## 1.3.3(2024-04-23)
+- 修复 当元素会受变量影响自动隐藏的bug
+## 1.3.2(2023-05-04)
+- 修复 NVUE 平台报错的问题
+## 1.3.1(2021-11-23)
+- 修复 init 方法初始化问题
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
+## 1.2.1(2021-09-27)
+- 修复 init 方法不生效的 Bug
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.1(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的 Bug
+## 1.1.0(2021-04-22)
+- 新增 通过方法自定义动画
+- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
+- 优化 动画触发逻辑,使动画更流畅
+- 优化 支持单独的动画类型
+- 优化 文档示例
+## 1.0.2(2021-02-05)
+- 调整为 uni_modules 目录规范

+ 131 - 0
uni_modules/uni-transition/components/uni-transition/createAnimation.js

@@ -0,0 +1,131 @@
+// const defaultOption = {
+// 	duration: 300,
+// 	timingFunction: 'linear',
+// 	delay: 0,
+// 	transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+	constructor(options, _this) {
+		this.options = options
+		// 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+		this.animation = uni.createAnimation({
+			...options
+		})
+		this.currentStepAnimates = {}
+		this.next = 0
+		this.$ = _this
+
+	}
+
+	_nvuePushAnimates(type, args) {
+		let aniObj = this.currentStepAnimates[this.next]
+		let styles = {}
+		if (!aniObj) {
+			styles = {
+				styles: {},
+				config: {}
+			}
+		} else {
+			styles = aniObj
+		}
+		if (animateTypes1.includes(type)) {
+			if (!styles.styles.transform) {
+				styles.styles.transform = ''
+			}
+			let unit = ''
+			if(type === 'rotate'){
+				unit = 'deg'
+			}
+			styles.styles.transform += `${type}(${args+unit}) `
+		} else {
+			styles.styles[type] = `${args}`
+		}
+		this.currentStepAnimates[this.next] = styles
+	}
+	_animateRun(styles = {}, config = {}) {
+		let ref = this.$.$refs['ani'].ref
+		if (!ref) return
+		return new Promise((resolve, reject) => {
+			nvueAnimation.transition(ref, {
+				styles,
+				...config
+			}, res => {
+				resolve()
+			})
+		})
+	}
+
+	_nvueNextAnimate(animates, step = 0, fn) {
+		let obj = animates[step]
+		if (obj) {
+			let {
+				styles,
+				config
+			} = obj
+			this._animateRun(styles, config).then(() => {
+				step += 1
+				this._nvueNextAnimate(animates, step, fn)
+			})
+		} else {
+			this.currentStepAnimates = {}
+			typeof fn === 'function' && fn()
+			this.isEnd = true
+		}
+	}
+
+	step(config = {}) {
+		// #ifndef APP-NVUE
+		this.animation.step(config)
+		// #endif
+		// #ifdef APP-NVUE
+		this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+		this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+		this.next++
+		// #endif
+		return this
+	}
+
+	run(fn) {
+		// #ifndef APP-NVUE
+		this.$.animationData = this.animation.export()
+		this.$.timer = setTimeout(() => {
+			typeof fn === 'function' && fn()
+		}, this.$.durationTime)
+		// #endif
+		// #ifdef APP-NVUE
+		this.isEnd = false
+		let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+		if(!ref) return
+		this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+		this.next = 0
+		// #endif
+	}
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+	'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+	'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+	MPAnimation.prototype[type] = function(...args) {
+		// #ifndef APP-NVUE
+		this.animation[type](...args)
+		// #endif
+		// #ifdef APP-NVUE
+		this._nvuePushAnimates(type, args)
+		// #endif
+		return this
+	}
+})
+
+export function createAnimation(option, _this) {
+	if(!_this) return
+	clearTimeout(_this.timer)
+	return new MPAnimation(option, _this)
+}

+ 286 - 0
uni_modules/uni-transition/components/uni-transition/uni-transition.vue

@@ -0,0 +1,286 @@
+<template>
+  <!-- #ifndef APP-NVUE -->
+  <view v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+  <!-- #endif -->
+  <!-- #ifdef APP-NVUE -->
+  <view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+  <!-- #endif -->
+</template>
+
+<script>
+import { createAnimation } from './createAnimation'
+
+/**
+ * Transition 过渡动画
+ * @description 简单过渡动画组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+ * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+ * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+ *  @value fade 渐隐渐出过渡
+ *  @value slide-top 由上至下过渡
+ *  @value slide-right 由右至左过渡
+ *  @value slide-bottom 由下至上过渡
+ *  @value slide-left 由左至右过渡
+ *  @value zoom-in 由小到大过渡
+ *  @value zoom-out 由大到小过渡
+ * @property {Number} duration 过渡动画持续时间
+ * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+ */
+export default {
+	name: 'uniTransition',
+	emits:['click','change'],
+	props: {
+		show: {
+			type: Boolean,
+			default: false
+		},
+		modeClass: {
+			type: [Array, String],
+			default() {
+				return 'fade'
+			}
+		},
+		duration: {
+			type: Number,
+			default: 300
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		customClass:{
+			type: String,
+			default: ''
+		},
+		onceRender:{
+			type:Boolean,
+			default:false
+		},
+	},
+	data() {
+		return {
+			isShow: false,
+			transform: '',
+			opacity: 1,
+			animationData: {},
+			durationTime: 300,
+			config: {}
+		}
+	},
+	watch: {
+		show: {
+			handler(newVal) {
+				if (newVal) {
+					this.open()
+				} else {
+					// 避免上来就执行 close,导致动画错乱
+					if (this.isShow) {
+						this.close()
+					}
+				}
+			},
+			immediate: true
+		}
+	},
+	computed: {
+		// 生成样式数据
+		stylesObject() {
+			let styles = {
+				...this.styles,
+				'transition-duration': this.duration / 1000 + 's'
+			}
+			let transform = ''
+			for (let i in styles) {
+				let line = this.toLine(i)
+				transform += line + ':' + styles[i] + ';'
+			}
+			return transform
+		},
+		// 初始化动画条件
+		transformStyles() {
+			return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
+		}
+	},
+	created() {
+		// 动画默认配置
+		this.config = {
+			duration: this.duration,
+			timingFunction: 'ease',
+			transformOrigin: '50% 50%',
+			delay: 0
+		}
+		this.durationTime = this.duration
+	},
+	methods: {
+		/**
+		 *  ref 触发 初始化动画
+		 */
+		init(obj = {}) {
+			if (obj.duration) {
+				this.durationTime = obj.duration
+			}
+			this.animation = createAnimation(Object.assign(this.config, obj),this)
+		},
+		/**
+		 * 点击组件触发回调
+		 */
+		onClick() {
+			this.$emit('click', {
+				detail: this.isShow
+			})
+		},
+		/**
+		 * ref 触发 动画分组
+		 * @param {Object} obj
+		 */
+		step(obj, config = {}) {
+			if (!this.animation) return
+			for (let i in obj) {
+				try {
+					if(typeof obj[i] === 'object'){
+						this.animation[i](...obj[i])
+					}else{
+						this.animation[i](obj[i])
+					}
+				} catch (e) {
+					console.error(`方法 ${i} 不存在`)
+				}
+			}
+			this.animation.step(config)
+			return this
+		},
+		/**
+		 *  ref 触发 执行动画
+		 */
+		run(fn) {
+			if (!this.animation) return
+			this.animation.run(fn)
+		},
+		// 开始过度动画
+		open() {
+			clearTimeout(this.timer)
+			this.transform = ''
+			this.isShow = true
+			let { opacity, transform } = this.styleInit(false)
+			if (typeof opacity !== 'undefined') {
+				this.opacity = opacity
+			}
+			this.transform = transform
+			// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
+			this.$nextTick(() => {
+				// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
+				this.timer = setTimeout(() => {
+					this.animation = createAnimation(this.config, this)
+					this.tranfromInit(false).step()
+					this.animation.run()
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				}, 20)
+			})
+		},
+		// 关闭过度动画
+		close(type) {
+			if (!this.animation) return
+			this.tranfromInit(true)
+				.step()
+				.run(() => {
+					this.isShow = false
+					this.animationData = null
+					this.animation = null
+					let { opacity, transform } = this.styleInit(false)
+					this.opacity = opacity || 1
+					this.transform = transform
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+		},
+		// 处理动画开始前的默认样式
+		styleInit(type) {
+			let styles = {
+				transform: ''
+			}
+			let buildStyle = (type, mode) => {
+				if (mode === 'fade') {
+					styles.opacity = this.animationType(type)[mode]
+				} else {
+					styles.transform += this.animationType(type)[mode] + ' '
+				}
+			}
+			if (typeof this.modeClass === 'string') {
+				buildStyle(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildStyle(type, mode)
+				})
+			}
+			return styles
+		},
+		// 处理内置组合动画
+		tranfromInit(type) {
+			let buildTranfrom = (type, mode) => {
+				let aniNum = null
+				if (mode === 'fade') {
+					aniNum = type ? 0 : 1
+				} else {
+					aniNum = type ? '-100%' : '0'
+					if (mode === 'zoom-in') {
+						aniNum = type ? 0.8 : 1
+					}
+					if (mode === 'zoom-out') {
+						aniNum = type ? 1.2 : 1
+					}
+					if (mode === 'slide-right') {
+						aniNum = type ? '100%' : '0'
+					}
+					if (mode === 'slide-bottom') {
+						aniNum = type ? '100%' : '0'
+					}
+				}
+				this.animation[this.animationMode()[mode]](aniNum)
+			}
+			if (typeof this.modeClass === 'string') {
+				buildTranfrom(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildTranfrom(type, mode)
+				})
+			}
+
+			return this.animation
+		},
+		animationType(type) {
+			return {
+				fade: type ? 0 : 1,
+				'slide-top': `translateY(${type ? '0' : '-100%'})`,
+				'slide-right': `translateX(${type ? '0' : '100%'})`,
+				'slide-bottom': `translateY(${type ? '0' : '100%'})`,
+				'slide-left': `translateX(${type ? '0' : '-100%'})`,
+				'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
+				'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
+			}
+		},
+		// 内置动画类型与实际动画对应字典
+		animationMode() {
+			return {
+				fade: 'opacity',
+				'slide-top': 'translateY',
+				'slide-right': 'translateX',
+				'slide-bottom': 'translateY',
+				'slide-left': 'translateX',
+				'zoom-in': 'scale',
+				'zoom-out': 'scale'
+			}
+		},
+		// 驼峰转中横线
+		toLine(name) {
+			return name.replace(/([A-Z])/g, '-$1').toLowerCase()
+		}
+	}
+}
+</script>
+
+<style></style>

+ 85 - 0
uni_modules/uni-transition/package.json

@@ -0,0 +1,85 @@
+{
+  "id": "uni-transition",
+  "displayName": "uni-transition 过渡动画",
+  "version": "1.3.3",
+  "description": "元素的简单过渡动画",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "动画",
+    "过渡",
+    "过渡动画"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
uni_modules/uni-transition/readme.md

@@ -0,0 +1,11 @@
+
+
+## Transition 过渡动画
+> **组件名:uni-transition**
+> 代码块: `uTransition`
+
+
+元素过渡动画
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 1 - 1
utils/common.js

@@ -172,7 +172,7 @@ export function generateRandomString(length) {
 
 export function isLoginCourse() {
 	return new Promise((resolve, reject) => {
-		let token = uni.getStorageSync('AppToken_MYfby');
+		let token = uni.getStorageSync('TOKEN_WEXIN');
 		if (token==null||token==undefined||token=="" ) {
 			resolve(false);
 		} else {

+ 27 - 0
utils/courseTool.js

@@ -0,0 +1,27 @@
+export const  TOKEN_KEYAuto = 'AppTokenmini_AutoCourse'; // 金康健自动发课token 信息
+
+/**
+ * 随机字符串
+ * 
+ */
+export function generateRandomString(length) {
+	let result = '';
+	const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+	const charactersLength = characters.length;
+
+	for (let i = 0; i < length; i++) {
+		result += characters.charAt(Math.floor(Math.random() * charactersLength));
+	}
+	return result;
+}
+
+export function isLoginCourseAuto() {
+	return new Promise((resolve, reject) => {
+		let token = uni.getStorageSync(TOKEN_KEYAuto);
+		if (token==null||token==undefined||token=="" ) {
+			resolve(false);
+		} else {
+			resolve(true);
+		}
+	}); 
+}

+ 233 - 0
utils/uni.webview.1.5.4.js

@@ -0,0 +1,233 @@
+! function(e, n) {
+	"object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define &&
+		define.amd ? define(n) : (e = e || self).uni = n()
+}(this, (function() {
+	"use strict";
+	try {
+		var e = {};
+		Object.defineProperty(e, "passive", {
+			get: function() {
+				!0
+			}
+		}), window.addEventListener("test-passive", null, e)
+	} catch (e) {}
+	var n = Object.prototype.hasOwnProperty;
+
+	function i(e, i) {
+		return n.call(e, i)
+	}
+	var t = [];
+
+	function o() {
+		return window.__dcloud_weex_postMessage || window.__dcloud_weex_
+	}
+
+	function a() {
+		return window.__uniapp_x_postMessage || window.__uniapp_x_
+	}
+	var r = function(e, n) {
+			var i = {
+				options: {
+					timestamp: +new Date
+				},
+				name: e,
+				arg: n
+			};
+			if (a()) {
+				if ("postMessage" === e) {
+					var r = {
+						data: n
+					};
+					return window.__uniapp_x_postMessage ? window.__uniapp_x_postMessage(r) : window.__uniapp_x_
+						.postMessage(JSON.stringify(r))
+				}
+				var d = {
+					type: "WEB_INVOKE_APPSERVICE",
+					args: {
+						data: i,
+						webviewIds: t
+					}
+				};
+				window.__uniapp_x_postMessage ? window.__uniapp_x_postMessageToService(d) : window.__uniapp_x_
+					.postMessageToService(JSON.stringify(d))
+			} else if (o()) {
+				if ("postMessage" === e) {
+					var s = {
+						data: [n]
+					};
+					return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(s) : window
+						.__dcloud_weex_.postMessage(JSON.stringify(s))
+				}
+				var w = {
+					type: "WEB_INVOKE_APPSERVICE",
+					args: {
+						data: i,
+						webviewIds: t
+					}
+				};
+				window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(w) : window
+					.__dcloud_weex_.postMessageToService(JSON.stringify(w))
+			} else {
+				if (!window.plus) return window.parent.postMessage({
+					type: "WEB_INVOKE_APPSERVICE",
+					data: i,
+					pageId: ""
+				}, "*");
+				if (0 === t.length) {
+					var u = plus.webview.currentWebview();
+					if (!u) throw new Error("plus.webview.currentWebview() is undefined");
+					var g = u.parent(),
+						v = "";
+					v = g ? g.id : u.id, t.push(v)
+				}
+				if (plus.webview.getWebviewById("__uniapp__service")) plus.webview.postMessageToUniNView({
+					type: "WEB_INVOKE_APPSERVICE",
+					args: {
+						data: i,
+						webviewIds: t
+					}
+				}, "__uniapp__service");
+				else {
+					var c = JSON.stringify(i);
+					plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat(
+						"WEB_INVOKE_APPSERVICE", '",').concat(c, ",").concat(JSON.stringify(t), ");"))
+				}
+			}
+		},
+		d = {
+			navigateTo: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+					n = e.url;
+				r("navigateTo", {
+					url: encodeURI(n)
+				})
+			},
+			navigateBack: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+					n = e.delta;
+				r("navigateBack", {
+					delta: parseInt(n) || 1
+				})
+			},
+			switchTab: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+					n = e.url;
+				r("switchTab", {
+					url: encodeURI(n)
+				})
+			},
+			reLaunch: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+					n = e.url;
+				r("reLaunch", {
+					url: encodeURI(n)
+				})
+			},
+			redirectTo: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+					n = e.url;
+				r("redirectTo", {
+					url: encodeURI(n)
+				})
+			},
+			getEnv: function(e) {
+				a() ? e({
+					uvue: !0
+				}) : o() ? e({
+					nvue: !0
+				}) : window.plus ? e({
+					plus: !0
+				}) : e({
+					h5: !0
+				})
+			},
+			postMessage: function() {
+				var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+				r("postMessage", e.data || {})
+			}
+		},
+		s = /uni-app/i.test(navigator.userAgent),
+		w = /Html5Plus/i.test(navigator.userAgent),
+		u = /complete|loaded|interactive/;
+	var g = window.my && navigator.userAgent.indexOf(["t", "n", "e", "i", "l", "C", "y", "a", "p", "i", "l",
+		"A"].reverse().join("")) > -1;
+	var v = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
+	var c = window.qq && window.qq.miniProgram && /QQ/i.test(navigator.userAgent) && /miniProgram/i.test(
+		navigator.userAgent);
+	var p = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent);
+	var _ = window.wx && window.wx.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i
+		.test(navigator.userAgent);
+	var m = window.qa && /quickapp/i.test(navigator.userAgent);
+	var f = window.ks && window.ks.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i
+		.test(navigator.userAgent);
+	var l = window.tt && window.tt.miniProgram && /Lark|Feishu/i.test(navigator.userAgent);
+	var E = window.jd && window.jd.miniProgram && /jdmp/i.test(navigator.userAgent);
+	var x = window.xhs && window.xhs.miniProgram && /xhsminiapp/i.test(navigator.userAgent);
+	for (var S, h = function() {
+			window.UniAppJSBridge = !0, document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady", {
+				bubbles: !0,
+				cancelable: !0
+			}))
+		}, y = [function(e) {
+			if (s || w) return window.__uniapp_x_postMessage || window.__uniapp_x_ || window
+				.__dcloud_weex_postMessage || window.__dcloud_weex_ ? document.addEventListener(
+					"DOMContentLoaded", e) : window.plus && u.test(document.readyState) ?
+				setTimeout(e, 0) : document.addEventListener("plusready", e), d
+		}, function(e) {
+			if (_) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) :
+				document.addEventListener("WeixinJSBridgeReady", e), window.wx.miniProgram
+		}, function(e) {
+			if (c) return window.QQJSBridge && window.QQJSBridge.invoke ? setTimeout(e, 0) : document
+				.addEventListener("QQJSBridgeReady", e), window.qq.miniProgram
+		}, function(e) {
+			if (g) {
+				document.addEventListener("DOMContentLoaded", e);
+				var n = window.my;
+				return {
+					navigateTo: n.navigateTo,
+					navigateBack: n.navigateBack,
+					switchTab: n.switchTab,
+					reLaunch: n.reLaunch,
+					redirectTo: n.redirectTo,
+					postMessage: n.postMessage,
+					getEnv: n.getEnv
+				}
+			}
+		}, function(e) {
+			if (v) return document.addEventListener("DOMContentLoaded", e), window.swan.webView
+		}, function(e) {
+			if (p) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
+		}, function(e) {
+			if (m) {
+				window.QaJSBridge && window.QaJSBridge.invoke ? setTimeout(e, 0) : document
+					.addEventListener("QaJSBridgeReady", e);
+				var n = window.qa;
+				return {
+					navigateTo: n.navigateTo,
+					navigateBack: n.navigateBack,
+					switchTab: n.switchTab,
+					reLaunch: n.reLaunch,
+					redirectTo: n.redirectTo,
+					postMessage: n.postMessage,
+					getEnv: n.getEnv
+				}
+			}
+		}, function(e) {
+			if (f) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) :
+				document.addEventListener("WeixinJSBridgeReady", e), window.ks.miniProgram
+		}, function(e) {
+			if (l) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
+		}, function(e) {
+			if (E) return window.JDJSBridgeReady && window.JDJSBridgeReady.invoke ? setTimeout(e, 0) :
+				document.addEventListener("JDJSBridgeReady", e), window.jd.miniProgram
+		}, function(e) {
+			if (x) return window.xhs.miniProgram
+		}, function(e) {
+			return document.addEventListener("DOMContentLoaded", e), d
+		}], M = 0; M < y.length && !(S = y[M](h)); M++);
+	S || (S = {});
+	var P = "undefined" != typeof uni ? uni : {};
+	if (!P.navigateTo)
+		for (var b in S) i(S, b) && (P[b] = S[b]);
+	return P.webView = S, P
+}));

二进制
xiaohongqun_uni_app.zip


部分文件因为文件数量过多而无法显示