فهرست منبع

Merge branch 'xqy_act' into dev

xuqiaoying 3 سال پیش
والد
کامیت
4cfb6b1ee0
88فایلهای تغییر یافته به همراه3564 افزوده شده و 857 حذف شده
  1. 2 1
      common/httpList/apply.js
  2. 2 1
      common/httpList/login.js
  3. 7 1
      common/methodTool.js
  4. 2 1
      common/request.js
  5. 2 0
      common/signature.js
  6. 11 8
      components/bank-exam/bankExam.vue
  7. 38 1
      components/course/courseChapter.vue
  8. 35 17
      components/course/courseSection.vue
  9. 0 56
      components/mask1/mask1.vue
  10. 37 1
      pages.json
  11. 41 8
      pages/course/index.vue
  12. 16 6
      pages/index/index.vue
  13. 133 21
      pages/learn/index.scss
  14. 231 169
      pages/learn/index.vue
  15. 5 4
      pages/wd/index.vue
  16. 195 4
      pages/webview/index.vue
  17. 33 2
      pages2/appointment/index.vue
  18. 253 42
      pages2/appointment/order.vue
  19. 13 0
      pages2/bank/detail.vue
  20. 11 8
      pages2/bank/questionBank.vue
  21. 26 0
      pages2/bank/question_detail.vue
  22. 11 8
      pages2/class/questionBank.vue
  23. 77 9
      pages2/exam/exam_appointment.vue
  24. 17 5
      pages2/exam/exam_result.vue
  25. 250 0
      pages2/exam/signCommit.vue
  26. 17 10
      pages2/learn/details.vue
  27. 18 5
      pages2/msg/detail.vue
  28. 8 5
      pages2/plan/index.vue
  29. 2 2
      pages2/register/bind.vue
  30. 10 11
      pages2/register/register.vue
  31. 35 16
      pages2/verify/input.vue
  32. 8 2
      pages2/verify/input2.vue
  33. 4 1
      pages2/wd/course.vue
  34. 22 3
      pages3/course/detail.vue
  35. 278 106
      pages3/live/detail.vue
  36. 132 0
      pages3/polyv/css/detail.scss
  37. 504 244
      pages3/polyv/detail.vue
  38. BIN
      pages3/static/imgs/toggle.png
  39. 12 18
      pages4/login/login.vue
  40. 10 10
      pages4/login/pcLogin.vue
  41. 8 3
      pages5/exam/index.vue
  42. 5 0
      pages5/examBank/index.vue
  43. 2 1
      pages5/examCount/index.vue
  44. 59 10
      pages5/examList/index.vue
  45. 5 1
      pages5/examReport/index.vue
  46. 18 2
      pages5/liveDetail/index.vue
  47. 9 2
      pages5/liveDetail/list.vue
  48. 4 1
      pages5/liveList/index.vue
  49. 302 0
      pages5/mockExam/examApply.vue
  50. 627 0
      pages5/mockExam/registrationSuccess.vue
  51. BIN
      pages5/static/act_icon.png
  52. BIN
      pages5/static/erCode.png
  53. BIN
      pages5/static/mock_bg.png
  54. BIN
      pages5/static/ping_bg.png
  55. 17 31
      project.config.json
  56. BIN
      static/icon/collect.png
  57. BIN
      static/icon/collected.png
  58. BIN
      static/icon/computeIcon.png
  59. BIN
      static/icon/down.png
  60. BIN
      static/icon/down1.png
  61. BIN
      static/icon/jy_icon.png
  62. BIN
      static/icon/msg_icon1.png
  63. BIN
      static/icon/msg_icon2.png
  64. BIN
      static/icon/my_icon1.png
  65. BIN
      static/icon/my_icon10.png
  66. BIN
      static/icon/my_icon11.png
  67. BIN
      static/icon/my_icon12.png
  68. BIN
      static/icon/my_icon2.png
  69. BIN
      static/icon/my_icon3.png
  70. BIN
      static/icon/my_icon4.png
  71. BIN
      static/icon/my_icon5.png
  72. BIN
      static/icon/my_icon6.png
  73. BIN
      static/icon/my_icon7.png
  74. BIN
      static/icon/my_icon8.png
  75. BIN
      static/icon/my_icon9.png
  76. BIN
      static/icon/note1.png
  77. BIN
      static/icon/note2.png
  78. BIN
      static/icon/note3.png
  79. BIN
      static/icon/openSwith.png
  80. BIN
      static/icon/up.png
  81. BIN
      static/icon/up1.png
  82. BIN
      static/icon/wk_icon1.png
  83. BIN
      static/icon/wk_icon2.png
  84. BIN
      static/icon/wk_icon3.png
  85. BIN
      static/learn/learn_range.png
  86. BIN
      static/learn/living.png
  87. BIN
      static/learn/living_bg.png
  88. BIN
      static/learn/wlive_bg.png

+ 2 - 1
common/httpList/apply.js

@@ -5,7 +5,8 @@ export default {
 	//新增用户预约考试
 	addApply(data) {
 		return myRequest({
-			url: '/apply',
+			// url: '/apply',
+			url: '/apply/save',
 			method: 'post',
 			data: data
 		})

+ 2 - 1
common/httpList/login.js

@@ -23,10 +23,11 @@ export default {
 		})
 	},
 	//登录用户信息
-	getInfo() {
+	getInfo(data) {
 		return myRequest({
 			url: '/app/user/getInfo',
 			method: 'get',
+			data: data,
 		})
 	},
 	/**

+ 7 - 1
common/methodTool.js

@@ -70,7 +70,10 @@ export default {
 	 * @param timestamp
 	 * @returns {*}
 	 */
-	timestampToTime(timestamp, isDay = true,hasChinese) {
+	timestampToTime(timestamp, isDay = true,hasChinese, line ) {
+		if (!timestamp) {
+			return ''
+		}
 		var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
 		var Y = date.getFullYear() + (hasChinese ? '' : '-');
 		var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + (hasChinese ? '' : '-');
@@ -87,6 +90,9 @@ export default {
 			}
 			
 		}
+		if (line) {
+			return h + m + s
+		}
 		
 		if(hasChinese) {
 			return Y +'年'+ M +'月'+ D + '日' + h + m + s;

+ 2 - 1
common/request.js

@@ -19,7 +19,7 @@ export const BASE_IMG_URL = 'https://file-dev.xyyxt.net/'  //test
 // web_view的
 // export const WEBVIEW_URL = 'https://m.xyyxt.net/'  //release
 export const WEBVIEW_URL = 'https://testm.xyyxt.net/'  //预发布
-// export const WEBVIEW_URL = 'http://192.168.1.38:8082/'  //test
+// export const WEBVIEW_URL = 'http://120.79.166.78:18001/' // 测试环境
 // export const WEBVIEW_URL = 'http://api.xyyxt.net:6066/'  //预发布(弃用了)
 
 // export const socket_url = 'ws://42.192.164.187:19005/webSocket/'  //test
@@ -122,6 +122,7 @@ export const myRequest = (options) => {
 			var userInfo = {
 				url: '/app/user/getInfo',
 				method: 'get',
+				data: { fromPlat: 1 }, // 来源平台 1小程序 2PC网站
 			}
 			const resUser = await myRequest(userInfo)
 			if (resUser.data.code === 200) {

+ 2 - 0
common/signature.js

@@ -27,6 +27,7 @@ class Handwriting {
 	startValue = 0;
 	constructor(opts) {
 		console.log(opts);
+		console.log('canvas', opts)
 		this.lineColor = opts.lineColor || '#1A1A1A' // 颜色
 		this.slideValue = opts.slideValue || 50
 		this.canvasName = opts.canvasName || 'handWriting'
@@ -386,6 +387,7 @@ class Handwriting {
 	}
 
 	saveCanvas() {
+		console.log('canvasName',this.canvasName)
 		return new Promise((resolve, rej) => {
 			uni.canvasToTempFilePath({
 				canvasId: this.canvasName,

+ 11 - 8
components/bank-exam/bankExam.vue

@@ -1231,14 +1231,17 @@ export default {
 		  this.$set(this.questionList[bindex], "ques", arr);
 		  this.isDoOver();
 		
-		  let isWrong = this.questionList[bindex].ques.some(
-		    (quesItem, quesIndex) => {
-		      return (
-		        this.questionList[bindex].ques[quesIndex] !=
-		        this.questionList[bindex].ans[quesIndex]
-		      );
-		    }
-		  );
+		//   let isWrong = this.questionList[bindex].ques.some(
+		//     (quesItem, quesIndex) => {
+		//       return (
+		//         this.questionList[bindex].ques[quesIndex] !=
+		//         this.questionList[bindex].ans[quesIndex]
+		//       );
+		//     }
+		//   );
+		  	let isWrong = this.questionList[bindex].ques.some((item, i) => {
+			return this.questionList[bindex].ans.indexOf(item) == -1;
+			})
 		  // 回答错误
 		  if (isWrong) {
 		    this.$api

+ 38 - 1
components/course/courseChapter.vue

@@ -126,6 +126,11 @@ export default {
     sectionMaxNum: {
       default: undefined,
     },
+    // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播	
+    goodsType: {
+      type: [Number, String],
+      default: 0,
+    }, 
   },
   components: {
     courseSection,
@@ -229,6 +234,25 @@ export default {
           });
       });
     },
+    // 新增用户视频学习日志
+    studyLog() {
+      this.$http({
+        url: '/user/study/log',
+        method: 'post',
+        data: {
+          goodsId: this.goodsId,
+          courseId: this.courseId,
+					moduleId: this.menuItem.moduleId || 0,
+					chapterId: this.menuItem.chapterId || 0,
+          sectionId: this.menuItem.sectionId || this.menuItem.menuId,
+          fromPlat: 1, //来源平台 1小程序 2PC网站
+          goodsType: this.goodsType, // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播
+          orderGoodsId: this.orderGoodsId,
+        }
+      }).then((res) => {
+        console.log('考试的用户学习日志:', res)
+      })
+    },
     /**
      * 去做题
      */
@@ -270,6 +294,7 @@ export default {
                 "&orderGoodsId=" +
                 this.orderGoodsId,
             });
+            this.studyLog()
             //没有答题次数限制
           } else if (item.answerNum == 0) {
             uni.navigateTo({
@@ -289,6 +314,7 @@ export default {
                 "&orderGoodsId=" +
                 this.orderGoodsId,
             });
+            this.studyLog()
           } else {
             uni.showToast({
               icon: "none",
@@ -360,6 +386,7 @@ export default {
                 "&orderGoodsId=" +
                 this.orderGoodsId,
             });
+            this.studyLog()
             //没有答题次数限制
           } else if (item.answerNum == 0) {
             uni.navigateTo({
@@ -379,6 +406,7 @@ export default {
                 "&orderGoodsId=" +
                 this.orderGoodsId,
             });
+            this.studyLog()
           } else {
             uni.showToast({
               icon: "none",
@@ -416,6 +444,7 @@ export default {
               "&orderGoodsId=" +
               this.orderGoodsId,
           });
+          this.studyLog()
           //没有答题次数限制
         } else if (item.answerNum == 0) {
           uni.navigateTo({
@@ -435,6 +464,7 @@ export default {
               "&orderGoodsId=" +
               this.orderGoodsId,
           });
+          this.studyLog()
         } else {
           uni.showToast({
             icon: "none",
@@ -462,7 +492,7 @@ export default {
       });
     },
     openChapter(item) {
-      console.log(this.menuItem);
+      console.log('---zhang',this.menuItem, this.down,this.list, item.id, item.courseId, item.moduleId);
       this.down = !this.down;
       if (!this.down && this.list.length == 0) {
         console.log(item.id, 69);
@@ -494,6 +524,7 @@ export default {
         });
     },
     getSectionList(chapterId) {
+      console.log('=============2', 'chapterId:', chapterId)
       let self = this;
     //   url: '/app/common/course/sectionList/'+data,
       this.$api.sectionList(chapterId).then((res) => {
@@ -522,10 +553,12 @@ export default {
             }
           });
           self.list = res.data.data;
+          console.log('=============2', self.list)
         }
       });
     },
     getReSectionList(chapterId, courseId, moduleId) {
+      console.log('=============3', 'chapterId:', chapterId, 'courseId:', courseId, 'moduleId:', moduleId)
       let self = this;
       this.$api
         .reSectionList({
@@ -560,10 +593,12 @@ export default {
               }
             });
             self.list = res.data.data;
+            console.log('=============3', self.list)
           }
         });
     },
     getBuySectionList(chapterId, courseId, moduleId) {
+      console.log('=============1', 'chapterId:', chapterId, 'courseId:', courseId, 'moduleId:', moduleId)
       let self = this;
       this.$api
         .reSectionList({
@@ -596,6 +631,8 @@ export default {
               }
             });
             self.list = res.data.data;
+            console.log('=============1', self.list)
+            this.$emit('sectionList', self.list)
           }
         });
     },

+ 35 - 17
components/course/courseSection.vue

@@ -146,16 +146,17 @@ export default {
 	mounted() {
 		this.nowTime = Number(new  Date().getTime()/1000).toFixed(0)
 		this.newId= this.menuItem.sectionId>0?this.menuItem.sectionId:this.menuItem.menuId
-		console.log(this.newId,'this.newId')
-		console.log(this.playSectionId,'this.playSectionId')
-		console.log(this.isRebuild)
-		console.log(this.nextMenuItem,'nextMenuItem')
-		console.log(this.menuItem,'this.menuItem',this.menuItem.liveStartTime, this.nowTime)
+		// console.log(this.newId,'this.newId', this.playNextId)
+		// console.log(this.playSectionId,'this.playSectionId')
+		// console.log(this.isRebuild)
+		// console.log(this.nextMenuItem,'nextMenuItem')
+		// console.log(this.menuItem,'this.menuItem=======>',this.menuItem.recordingUrl, this.nowTime)
 		let moduleId = this.menuItem.moduleId || 0;
 		let chapterId = this.menuItem.chapterId || 0;
 		let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
 		let playNextId = `moduleId${moduleId}chapterId${chapterId}sectionId${sectionId}${this.isRebuild?'isRebuild':''}`;
 		this.playId = playNextId;
+		console.log('this.playId:', this.playId)
 		uni.$off('playNext'+playNextId) //绑定前先移除之前的事件
 		uni.$once('playNext'+playNextId, (data) => {
 			//到时会触发每个节的监听事件,只允许当前节的接收
@@ -168,7 +169,6 @@ export default {
 				    content: '是否播放下一节',
 				    success: function (res) {
 				        if (res.confirm) {
-				            console.log('用户点击确定');
 							let nextId= self.nextMenuItem.sectionId>0?self.nextMenuItem.sectionId:self.nextMenuItem.menuId
 							//设置播放的节ID
 							self.$store.commit('setPlaySectionId', {playSectionId  :nextId});
@@ -202,7 +202,7 @@ export default {
 	},
 	methods: {
 		isLast() {
-			console.log(this.liveLast,'this.liveLast')
+			// console.log(this.liveLast,'this.liveLast')
 			if(this.liveLast) {
 				let sectionASame = this.liveLast.sectionId == (this.menuItem.sectionId || this.menuItem.menuId)
 				let chapterSame = this.liveLast.chapterId == (this.menuItem.chapterId || 0)
@@ -277,7 +277,6 @@ export default {
 							
 						}
 					}
-					console.log(newRows)
 					let isAllLearn = newRows.every(item => {
 						return item.studyStatus == 1;
 					})
@@ -360,8 +359,9 @@ export default {
 			});
 		},
 		async playVideo() {
-			if(this.menuItem.sectionType==1||this.menuItem.sectionType==3){
-				//录播
+			// console.log('直播的课程:',this.menuItem,this.menuItem.recordingUrl)
+			if(this.menuItem.sectionType==1 || this.menuItem.sectionType == 3){
+				//1录播 3回放
 				if(!this.isBuy){
 					//非购买
 					if(!this.menuItem.tryListen){
@@ -381,8 +381,8 @@ export default {
 				let learnNum = await this.goodsTodayStudySectionNum()
 				let hasLearn = await this.gradeCheckGoodsStudy();
 				
-				console.log(this.sectionMaxNum,'this.sectionMaxNum')
-				console.log(learnNum,'learnNum')
+				// console.log(this.sectionMaxNum,'this.sectionMaxNum')
+				// console.log(learnNum,'learnNum')
 				if(this.sectionMaxNum > 0) {
 					if(learnNum >= this.sectionMaxNum && !hasLearn) {
 						uni.showToast({
@@ -405,7 +405,22 @@ export default {
 					//切换为同一节
 					return
 				} */
-				
+				// 回放
+				if (this.menuItem.sectionType == 3) {
+					// return
+					let moduleId = this.menuItem.moduleId || 0;
+					let chapterId = this.menuItem.chapterId || 0;
+					let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
+					let uuid = new Date().valueOf() + ""
+					// buyCourse 是否购买课程:1是 0否,type=vod是回放
+					let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+
+					'&channelId='+this.menuItem.liveUrl+'&gradeId='+this.gradeId+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+
+					'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId+'&buyCourse=1'+'&ident='+uuid+'&sectionType=3'+'&vid='+this.menuItem.recordingUrl)
+					uni.navigateTo({
+						url:`../../pages/webview/index?url=`+encode
+					})
+					return
+				}
 				if(this.playSectionId>0){
 					//切换视频
 					let oldSectionId = this.playSectionId
@@ -418,13 +433,12 @@ export default {
 				uni.$emit('levelId', this.levelId)
 				uni.$emit('getSection', this.menuItem)
 				uni.$emit('isRebuild',this.isRebuild)
-				console.log(this.menuItem,'menuItem')
+				// console.log(this.menuItem,'menuItem')
 				// uni.$off('playend')
 				// uni.$on('playend',res => {
 				// 	console.log('playend2')
 				// 	this.$emit('playEnd',{isRebuild:this.isRebuild})
 				// })
-				console.log(999)
 			}
 			if(this.menuItem.sectionType==2){
 				//直播
@@ -524,7 +538,11 @@ export default {
 				let moduleId = this.menuItem.moduleId || 0;
 				let chapterId = this.menuItem.chapterId || 0;
 				let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
-				let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+this.menuItem.liveUrl+'&gradeId='+this.gradeId+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId)
+				let uuid = new Date().valueOf() + ""
+         		 // buyCourse 是否购买课程:1是 0否
+				let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+
+				'&channelId='+this.menuItem.liveUrl+'&gradeId='+this.gradeId+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+
+				'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId+'&buyCourse=1'+'&ident='+uuid+'&sectionType=2')
 				uni.navigateTo({
 					url:`../../pages/webview/index?url=`+encode
 				})
@@ -543,9 +561,9 @@ export default {
 				// 	console.log('playend1')
 				// 	this.$emit('playEnd',{isRebuild:this.isRebuild})
 				// })
-				console.log(888)
 			
 			}
+			
 		}
 	},
 	computed: { ...mapGetters(['playSectionId','playChannelId','playVID','playNextId','userInfo','liveLast']) }

+ 0 - 56
components/mask1/mask1.vue

@@ -1,56 +0,0 @@
-<template>
-	<view class="dialog">
-		<view class="view-body">
-			<view class="title"> 六年免检业务须知 </view>
-			<view class="content" style="line-height: 20px;">
-				<view>(一) 公安部、质检总局印发《关于加强和改进机动车检验工作的意见》(公交管〔2014〕138 号)的要求,自2014年9月1日起,试行非营运轿车等车辆6年内免检。对于符合6年内免检的车辆,无需到检验机构进行安全技术检验,机动车所有人提供交通事故强制责任保险凭证、车船税纳税或者免征证明后,可以直接向公安机关交通管理部门申请领取检验标志。</view>
-				<view>(二) 注册登记起6年以内的非营运轿车(含大型轿车)、非营运小型和微型载客汽车,但其中面包车[平头或短头车身结构,单层地板,发动机中置(指发动机缸体整体位于汽车前后轴之间的布置形式),宽高比(指整车车宽与车高的比值)小于等于0.90,乘坐人数小于等于9人,安装座椅的载客汽车]、7座及7座以上车辆不属于免检车型。</view>
-				<view>(三) 对于存在以下几种情况的,不属于6年以内免检政策范围,仍按原规定上线检验:一是注册登记日期在2010年8月31日之前的;二是自车辆出厂之日起,超过4年未办理注册登记手续的;三是车辆发生过造成人员伤亡的交通事故的。</view>
-			</view>
-		</view>
-		<view class="bottom">
-			<navigator  hover-class="none" :url="'../chejianyy/middle'">马上预约</navigator>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				
-			};
-		}
-	}
-</script>
-
-<style>
-	.dialog {
-	  background: #fff;
-	  position: absolute;
-	  left: 50%;
-	  top: 50%;
-	  width: 90%;
-	  transform: translate(-50%, -50%);
-	  text-align: center;
-	  border-radius: 10rpx;
-	  box-sizing: border-box;
-	}
-	.dialog .view-body{
-		padding: 10px;
-	}
-	.dialog .bottom{
-		line-height: 40px;
-		color: #439dff;
-		font-size: 15px;
-		border-top: 1px solid #d4d4d4;
-	}
-	.dialog .view-body .title{
-		padding: 10px;
-		font-size: 16px;
-		color: #439dff;
-	}
-	.dialog .view-body .content{
-		text-align: left;
-	}
-</style>

+ 37 - 1
pages.json

@@ -235,6 +235,17 @@
 					}
 				}
 			},
+			{
+				"path": "exam/signCommit",
+				"style": {
+					"navigationBarTitleText": "签署承诺书",
+					"navigationStyle": "custom", // 隐藏系统导航栏
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
 			{
 				"path": "exam/exam_result",
 				"style": {
@@ -1007,7 +1018,32 @@
 					"bounce": "none"
 				}
 			}
-		}]
+		},{
+			"path": "mockExam/examApply",
+			"style": {
+				"navigationBarTitleText": "模考报名",
+				"navigationBarBackgroundColor": "#0386FD",
+				"navigationBarTextStyle": "white",
+				"navigationStyle": "custom", // 隐藏系统导航栏
+				"app-plus": {
+					"titleNView": false, //禁用原生导航栏 
+					"bounce": "none"
+				}
+			}
+		},{
+			"path": "mockExam/registrationSuccess",
+			"style": {
+				"navigationBarTitleText": "模考报名成功",
+				"navigationBarBackgroundColor": "#0386FD",
+				"navigationBarTextStyle": "white",
+				"navigationStyle": "custom", // 隐藏系统导航栏
+				"app-plus": {
+					"titleNView": false, //禁用原生导航栏 
+					"bounce": "none"
+				}
+			}
+		}
+	]
 			
 	}],
 	"preloadRule": {

+ 41 - 8
pages/course/index.vue

@@ -66,7 +66,12 @@
 								共 <text class="blackFont">{{item.courseNum}}</text> 
 								<text class="margin30">课程</text>
 								<text class="blackFont">{{item.classHours || '-'}}</text> 学时</view>
-								<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+								<view>
+									<text class="priceTag">¥ {{item.standPrice.toFixed(2)}}</text>
+									<text v-if="item.linePrice" class="sale">¥ </text>
+									<text v-if="item.linePrice" class="price_line"> {{ item.linePrice }}</text>
+								</view>
+								
 							</view>
 						</view>
 					</navigator>
@@ -83,15 +88,24 @@
 								<view class="titleTag" style="display: flex;justify-content: space-between;flex:1;">
 									<view style="flex:1;">{{item.goodsName}}</view>
 									
-									<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+									<view>
+										<text class="priceTag">¥ {{item.standPrice.toFixed(2)}}</text>
+										<text v-if="item.linePrice" class="sale">¥ </text>
+										<text v-if="item.linePrice" class="price_line"> {{ item.linePrice }}</text>
+									</view>
 								</view>
 							</view>
 							<view style="display: flex;justify-content: space-between;margin-top: 15rpx;" v-if="false">
 								<view class="noteTag"><image src="/static/icon/wk_icon1.png" class="wk_icon"></image>
 								共 <text class="blackFont">6</text> 
 								<view class="margin30">张卷</view>
-								<text class="blackFont">120</text>道题  </view>
-								<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+								<text class="blackFont">120</text>道题  
+								</view>
+								<view>
+									<text class="priceTag">¥ {{item.standPrice.toFixed(2)}}</text>
+									<text v-if="item.linePrice" class="sale">¥ </text>
+									<text v-if="item.linePrice" class="price_line"> {{ item.linePrice }}</text>
+								</view>
 							</view>
 						</view>
 					</navigator>
@@ -109,15 +123,23 @@
 								<view class="titleTag" style="display: flex;justify-content: space-between;flex:1;">
 									<view style="flex:1;">{{item.goodsName}}</view>
 									
-									<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+									<view>
+										<text class="priceTag">¥ {{item.standPrice.toFixed(2)}}</text>
+										<text v-if="item.linePrice" class="sale">¥ </text>
+										<text v-if="item.linePrice" class="price_line"> {{ item.linePrice }}</text>
+									</view>
 								</view>
 							</view>
-							<view style="display: flex;justify-content: space-between;margin-top: 15rpx;" v-if="false">
+							<!-- <view style="display: flex;justify-content: space-between;margin-top: 15rpx;" v-if="false">
 								<view class="noteTag">
 									<image src="/static/icon/wk_icon1.png" class="wk_icon"></image>
-									<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+									<view>
+										<view class="priceTag">¥ {{item.standPrice.toFixed(2)}}</view>
+										<text class="sale"> ¥ </text>
+										<text class="price_line"> {{ item.linePrice }}</text>
+									</view>
 								</view>
-							</view>
+							</view> -->
 						</view>
 					</navigator>
 					<view class="emptyTip" v-if="list3.length==0">暂未上架相关直播~</view>
@@ -559,6 +581,17 @@ page {
 		font-weight: bold;
 		color: #FC3F3F;
 	}
+	.sale {
+		color: #999999;
+		font-size: 28rpx;
+		margin-left: 8rpx;
+	}
+	.price_line {
+		color: #999999;
+		font-size: 28rpx;
+		text-decoration:line-through;
+		font-weight: 400;
+	}
 	.titleTag{
 		font-size: 32rpx;
 		font-weight: bold;

+ 16 - 6
pages/index/index.vue

@@ -113,7 +113,9 @@
 									<view class="desc">
 										<view class="left">
 											<text class="mon_t">¥ {{toFixed(item.standPrice)}}</text>
-											<text class="sale">/限时优惠</text>
+											<!-- <text class="sale">/限时优惠</text> -->
+											<text v-if="item.linePrice" class="sale"> ¥ </text>
+											<text v-if="item.linePrice" class="price_line">&nbsp;{{ item.linePrice }}</text>
 										</view>
 										<view class="right">
 											<view class="regiser_row">立即购买</view>
@@ -147,7 +149,9 @@
 									<view class="desc">
 										<view class="left">
 											<text class="mon_t">¥ {{toFixed(item.standPrice)}}</text>
-											<text class="sale">/限时优惠</text>
+											<!-- <text class="sale">/限时优惠</text> -->
+											<text v-if="item.linePrice" class="sale"> ¥ </text>
+											<text v-if="item.linePrice" class="price_line">&nbsp;{{ item.linePrice }}</text>
 										</view>
 										<view class="right">
 											<view class="regiser_row">立即购买</view>
@@ -343,8 +347,8 @@ export default {
 	methods: {
 		...mapActions(['getUserInfo','appCommonConfig']),
 		getInfo() {
-			// /app/user/getInfo 登录用户信息
-			this.$api.getInfo().then(res => {
+			// /app/user/getInfo 登录用户信息 // fromPlat来源平台 1小程序 2PC网站
+			this.$api.getInfo({ fromPlat: 1 }).then(res => {
 				if(res.data.code == 200){
 					this.$store.state.userInfo = res.data.data
 					this.isFollow = res.data.data.userFollowWx // 不是1就是没关注
@@ -1029,8 +1033,14 @@ page {
                             }
 							.sale {
 								color: #999999;
-								font-size: 20rpx;
-								margin-left: 4rpx;
+								font-size: 24rpx;
+								margin-left: 8rpx;
+							}
+							.price_line {
+								color: #999999;
+								font-size: 24rpx;
+								text-decoration:line-through;
+								font-weight: 400;
 							}
 						}
 						

+ 133 - 21
pages/learn/index.scss

@@ -118,6 +118,9 @@
 		border-radius: 24rpx;
 		padding: 29rpx 29rpx 20rpx 24rpx;
 		margin-bottom: 20rpx;
+		.titlews {
+			padding-bottom: 24rpx;
+		}
 		.cou_titles {
 			margin-bottom: 12rpx;
 			color: #333333;
@@ -141,12 +144,18 @@
 		.c_downs {
 			display: flex;
 			align-items: center;
+			// justify-content: flex-start;
 			justify-content: space-between;
-			margin-top: 24rpx;
+			padding-top: 24rpx;
+		}
+		// 状态
+		.all_status {
+			width: 654rpx;
+			background: #F8F8F8;
+			border-radius: 16rpx;
 		}
-
 		.class-warm {
-			padding: 10rpx 20rpx;
+			padding: 20rpx 24rpx;
 			display: flex;
 			align-items: flex-start;
 
@@ -157,16 +166,11 @@
 			&__text {
 
 				.date {
-					font-size: 24rpx;
-					font-weight: bold;
-					color: #FF3B30;
-				}
-
-				.state {
-					margin-top: 15rpx;
-					font-size: 24rpx;
-					font-weight: bold;
 					color: #FF3B30;
+					font-size: 22rpx;
+					font-weight: 400;
+					// color: #969696;
+					margin-bottom: 8rpx;
 				}
 			}
 		}
@@ -179,12 +183,55 @@
 			// 	opacity: 0.6;
 			// }
 		}
+		.study_btns {
+			width: 100%;
+			margin-top: 40rpx;
+			display: flex;
+			align-items: center;
+			justify-content: flex-end;
+			.exam_btns {
+				// width: 64%;
+				display: flex;
+				justify-content: flex-end;
+				align-items: center;
+			}
+		}
+		.box_appoint {
+			// width: 35%;
+			display: flex;
+			align-items: center;
+			justify-content: flex-end;
+			.img {
+				width: 32rpx;
+				height: 32rpx;
+				margin-right: 10rpx;
+			}
+			.exam_word {
+				font-size: 24rpx;
+				font-weight: 500;
+				width: 144rpx;
+				height: 56rpx;
+				line-height: 56rpx;
+				text-align: center;
+				background: #FFFFFF;
+				border-radius: 66rpx;
+				margin-left: 32rpx;
+			}
+			.ones {
+				color: #484848;
+				border: 2rpx solid #B9B9B9;
+			}
+			.intos {
+				color: #498AFE;
+				border: 2rpx solid #498AFE;
+			}
+		}
 	}
 	.lefts {
 		width: 204rpx;
 		height: 120rpx;
 		border-radius: 12rpx;
-		margin-right: 24rpx;
+		margin-right: 48rpx;
 		position: relative;
 		top: 0;
 		left: 0;
@@ -209,7 +256,7 @@
 		}
 	}
 	.rights {
-		width: 400rpx;
+		width: 380rpx;
 		height: 120rpx;
 		display: flex;
 		flex-direction: column;
@@ -225,12 +272,7 @@
 		.progress_up {
 			font-size: 24rpx;
 			color: #999999;
-			width: 50%;
-			// .wk_icon {
-			// 	width: 24rpx;
-			// 	height: 24rpx;
-			// 	margin-right: 8rpx;
-			// }
+			width: 100%;
 			.progress_bar {
 				margin-top: 16rpx;
 			}
@@ -420,4 +462,74 @@
 			}
 		}
 	}
-}
+}
+
+// 预约考试弹窗
+.popuptest_box {
+    width: 100%;
+    height: 938rpx;
+    padding: 56rpx 56rpx 0rpx;
+    .check_head {
+      height: 140rpx;
+      border-bottom: 2rpx solid #F0F0F0;
+    }
+    .headers {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .grade {
+        font-size: 40rpx;
+        font-weight: bold;
+        color: #222222;
+      }
+    }
+    .course_items {
+      width: 100%;
+      padding: 24rpx 0rpx 20rpx;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border-bottom: 2rpx solid #F0F0F0;
+      .course_lefts {
+        width: 510rpx;
+      }
+      .course_title {
+        font-size: 28rpx;
+        font-weight: 500;
+        color: #303030;
+      }
+    //   .course_pros {
+    //     font-size: 22rpx;
+    //     color: #969696;
+    //     margin-top: 16rpx;
+    //     >text {
+    //       color: #4B4B4B;
+    //     }
+    //   }
+      .course_rights {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        // .cicles {
+        //   width: 32rpx;
+        //   height: 32rpx;
+        //   line-height: 26rpx;
+        //   text-align: center;
+        //   border-radius: 50%;
+        //   background-color: #D5E4FF;
+        // }
+        .intoStudy {
+			width: 108rpx;
+			height: 56rpx;
+			line-height: 56rpx;
+			text-align: center;
+			background: #D5E4FF;
+			border-radius: 66rpx;
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #498AFE;
+        }
+      }
+    }
+  }

+ 231 - 169
pages/learn/index.vue

@@ -70,7 +70,7 @@
 					<text class="titles">我的课程</text>
 
 					<view v-for="(item, index) in courseLists" :key="index" class="course_item">
-						<view>
+						<view class="titlews" @click="studyIn(item.goodsId,item.gradeId,item,index)">
 							<view class="cou_titles">{{ item.goodsName }}</view>
 							<view v-if="item.serviceStartTime && item.serviceEndTime" class="learn_ranges">
 								<image class="l_range" src="/static/learn/learn_range.png"></image>
@@ -78,199 +78,206 @@
 								<text class="l_time">{{ item.serviceStartTime | formate('yyyy.mm.dd') }} - {{ item.serviceEndTime | formate('yyyy.mm.dd') }}</text>
 							</view>
 						</view>
-						<view class="c_downs">
-							<view class="lefts">
-								<image class="lefet_img" :src="$method.splitImgHost(item.coverUrl, true)" mode=""></image>
-								<view v-if="item.goodsType == 6" class="live_icon">直播</view>
-							</view>
-							<view class="rights">
-								<template
-									v-if="item.gradeStatus == 1 && item.status == 1 && (item.serviceEndTime > sysTime) && (item.serviceStartTime < sysTime) &&  (item.classEndTime && (item.classEndTime < sysTime)) && (item.periodStatus == 0 || item.periodStatus == -1) && item.studyCount > 0">
-									<view class="enter_into" @click.stop="selectClass(item,index)">
-										选班重学
-									</view>
-								</template>
-								<view v-else class="learn_progress">
-									<view class="progress_up">
-										<!-- <image src="/static/icon/wk_icon3.png" class="wk_icon"></image> -->
-										<!-- 学习进度 (已做试卷+已做节)/(试卷数+节数) -->
-										<view>
-											学习进度:{{ item.stuAllNum+item.recordNum }}/{{ item.secAllNum+item.examNum }}
-										</view>
-										<view class="progress_bar" style="width: 100%;">
-											<u-line-progress :showText="false" height="22" active-color="#ff9900" :show-percent="false"
-												:percent="((item.stuAllNum+item.recordNum) / (item.secAllNum+item.examNum)) * 100"></u-line-progress>
-										</view>
-									</view>
-									<view class="progress_down">
-										
-										<view class="enter_into" @click.stop="studyIn(item.goodsId,item.gradeId,item,index)">进入学习</view>
-									</view>
-
-								</view>
-							</view>
-						</view>
 
-						<!-- 不在学习服务期 -->
-						<template v-if="item.serviceStartTime && (sysTime < item.serviceStartTime || sysTime > item.serviceEndTime)">
-							<view class="class-warm" v-if="item.gradeId != 0 && item.gradeStatus == 1">
-								<view class="class-warm__text">
-									<view class="date">
-										不在学习服务期,不可以学习了哦
-									</view>
-								</view>
-							</view>
-						</template>
-
-						<template v-else>
-							<!-- 班级有效期过了 -->
-							<template v-if="item.classEndTime && (item.classEndTime < sysTime) ">
-								<view class="class-warm">
-									<u-icon class="class-warm__icon" size="30" color="#FF3B30" name="error-circle-fill">
-									</u-icon>
-									<view class="class-warm__text">
-										<view class="date">班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}} - {{$method.timestampToTime(item.classEndTime,true,true)}}</view>
-										<view class="state">班级状态:已过期,有疑问请联系 <text @click="call()">020-87085982</text></view>
-									</view>
-								</view>
-							</template>
-
-							<!-- 班级有效期之前 -->
-							<template v-else-if="item.classStartTime && (item.classStartTime > sysTime) ">
-								<view class="class-warm">
-									<u-icon class="class-warm__icon" size="30" color="#FF3B30" name="error-circle-fill">
-									</u-icon>
+						<!-- 状态 -->
+						<view v-if="item.goodsType == 1" class="all_status"  @click="studyIn(item.goodsId,item.gradeId,item,index)">
+							<!-- 不在学习服务期 -->
+							<template v-if="item.serviceStartTime && (sysTime < item.serviceStartTime || sysTime > item.serviceEndTime)">
+								<view class="class-warm" v-if="item.gradeId != 0 && item.gradeStatus == 1">
 									<view class="class-warm__text">
-										<view class="date">班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}} -
-											{{$method.timestampToTime(item.classEndTime,true,true)}}</view>
-										<view class="state">班级状态:未到学习时间,有疑问请联系 <text @click="call()">020-87085982</text></view>
+										<view class="date">
+											不在学习服务期,不可以学习了哦
+										</view>
 									</view>
 								</view>
 							</template>
 
-							<!-- 在班级有效期之间或者没有班级有效期 -->
 							<template v-else>
-								<view class="class-warm"
-									v-if="item.gradeId != 0 && item.gradeStatus == 1 && item.classStatus != null">
-									<view class="class-warm__text">
-										<view class="date">
-											班级状态:
-											<text v-if="item.classStatus == 1">已开班</text>
-											<text v-if="item.classStatus == 0">未开班</text>
-										</view>
-										<view class="state" v-if="item.classStatus == 0">教务处正在为您开通班级,请耐心等待</view>
-										<view class="state"
-											v-if="item.classStatus == 1 && item.classStartTime && item.classEndTime">
-											班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}}-{{$method.timestampToTime(item.classEndTime,true,true)}}
-										</view>
-									</view>
-								</view>
-								<!-- 学时审核状态不可审核 -->
-								<template v-if="item.periodStatus == -1 || item.periodStatus == 2">
-									<view class="class-warm" v-if="item.classStatus == 1 || item.classStatus === null">
+								<!-- 班级有效期过了 -->
+								<template v-if="item.classEndTime && (item.classEndTime < sysTime) ">
+									<view class="class-warm">
+										<u-icon class="class-warm__icon" size="30" color="#FF3B30" name="error-circle-fill">
+										</u-icon>
 										<view class="class-warm__text">
-											<view class="date">
-												<template
-													v-if="sysTime >= item.serviceStartTime && sysTime <= item.serviceEndTime">
-													学习状态:
-													<text v-if="item.stuAllNum+item.recordNum == 0">未学习</text>
-													<text
-														v-else-if="item.stuAllNum+item.recordNum > 0 && item.stuAllNum+item.recordNum < item.secAllNum+item.examNum">学习中</text>
-													<text v-else-if="item.stuAllNum+item.recordNum >= item.secAllNum+item.examNum">已学完</text>
-												</template>
-												<template v-else>
-													<template v-if="item.serviceStartTime">已过学习服务期,不可以学习了哦!</template>
-												</template>
-											</view>
+											<view class="date">班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}} - {{$method.timestampToTime(item.classEndTime,true,true)}}</view>
+											<view class="date">班级状态:已过期,有疑问请联系 <text @click="call()">020-87085982</text></view>
 										</view>
 									</view>
-
 								</template>
 
-								<!-- 学时审核状态可以审核 -->
-								<template v-if="item.periodStatus != -1">
+								<!-- 班级有效期之前 -->
+								<template v-else-if="item.classStartTime && (item.classStartTime > sysTime) ">
 									<view class="class-warm">
+										<u-icon class="class-warm__icon" size="30" color="#FF3B30" name="error-circle-fill">
+										</u-icon>
 										<view class="class-warm__text">
-											<view class="date">
-												<text v-if="item.periodStatus == 0">机构审核:学时审核不通过</text>
-												<!-- <text v-else-if="item.periodStatus == 2">学时待审核</text> -->
-												<text v-else-if="item.periodStatus == 3">学时审核中</text>
-												<text v-else-if="item.periodStatus == 1">
-													<text v-if="item.periodPlush > 0">学时已上报注册中心</text>
-													<text v-else>机构审核:学时审核通过</text>
-												</text>
-											</view>
+											<view class="date">班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}} -
+												{{$method.timestampToTime(item.classEndTime,true,true)}}</view>
+											<view class="date">班级状态:未到学习时间,有疑问请联系 <text @click="call()">020-87085982</text></view>
 										</view>
 									</view>
+								</template>
 
-									<view class="class-warm" v-if="item.subscribeId != null && item.periodStatus == 1">
+								<!-- 在班级有效期之间或者没有班级有效期 -->
+								<template v-else>
+									<view class="class-warm"
+										v-if="item.gradeId != 0 && item.gradeStatus == 1 && item.classStatus != null">
 										<view class="class-warm__text">
 											<view class="date">
-												<view v-if="item.subExamStatus === null">待预约考试</view>
-												<view
-													v-else-if="item.subExamStatus === 0 &&  sysTime < $method.TimeTotimestamp(
-														$method.timestampToTime(item.subApplySiteExamTime, true) +
-															' ' +
-															item.subApplySiteStartTime
-													)">
-													待考试,考试时间:
-													{{
-														$method.timestampToTime(item.subApplySiteExamTime, true) +
-														" " +
-														item.subApplySiteStartTime
-													}}
-													-
-													{{
-														$method.timestampToTime(item.subApplySiteExamTime, true) +
-														" " +
-														item.subApplySiteEndTime
-													}}
+												班级状态:
+												<text v-if="item.classStatus == 1">已开班</text>
+												<text v-if="item.classStatus == 0">未开班</text>
+											</view>
+											<view class="date" v-if="item.classStatus == 0">教务处正在为您开通班级,请耐心等待</view>
+											<view class="date"
+												v-if="item.classStatus == 1 && item.classStartTime && item.classEndTime">
+												班级有效期:{{$method.timestampToTime(item.classStartTime,true,true)}}-{{$method.timestampToTime(item.classEndTime,true,true)}}
+											</view>
+										</view>
+									</view>
+									<!-- 学时审核状态不可审核 -->
+									<template v-if="item.periodStatus == -1 || item.periodStatus == 2">
+										<view class="class-warm" v-if="item.classStatus == 1 || item.classStatus === null">
+											<view class="class-warm__text">
+												<view class="date">
+													<template
+														v-if="sysTime >= item.serviceStartTime && sysTime <= item.serviceEndTime">
+														学习状态:
+														<text v-if="item.stuAllNum+item.recordNum == 0">未学习</text>
+														<text
+															v-else-if="item.stuAllNum+item.recordNum > 0 && item.stuAllNum+item.recordNum < item.secAllNum+item.examNum">学习中</text>
+														<text v-else-if="item.stuAllNum+item.recordNum >= item.secAllNum+item.examNum">已学完</text>
+													</template>
+													<template v-else>
+														<template v-if="item.serviceStartTime">已过学习服务期,不可以学习了哦!</template>
+													</template>
 												</view>
-												<view v-else-if="item.subExamStatus === 0">待出考试结果</view>
-												<view v-else-if="item.subExamStatus === 1">
-													<text v-if="item.subResult === null">待出考试结果</text>
-													<text v-if="item.subResult === 0">考试结果:不通过,需补考</text>
-													<text
-														v-else-if="item.subResult === 1">考试结果:通过,考试成绩为{{item.subPerformance}}</text>
+											</view>
+										</view>
+
+									</template>
+
+									<!-- 学时审核状态可以审核 -->
+									<template v-if="item.periodStatus != -1">
+										<view class="class-warm">
+											<view class="class-warm__text">
+												<view class="date">
+													<text v-if="item.periodStatus == 0">机构审核:学时审核不通过</text>
+													<!-- <text v-else-if="item.periodStatus == 2">学时待审核</text> -->
+													<text v-else-if="item.periodStatus == 3">学时审核中</text>
+													<text v-else-if="item.periodStatus == 1">
+														<text v-if="item.periodPlush > 0">学时已上报注册中心</text>
+														<text v-else>机构审核:学时审核通过</text>
+													</text>
 												</view>
-												<view v-else-if="item.subExamStatus === 2">缺考,无成绩,需补考</view>
-												<view v-else-if="item.subExamStatus === 3">作弊,无成绩,需补考</view>
-												<view v-else-if="item.subExamStatus === 4">替考,无成绩,需补考</view>
+											</view>
+										</view>
+
+										<view class="class-warm" v-if="item.subscribeId != null && item.periodStatus == 1">
+											<view class="class-warm__text">
+												<view class="date">
+													<view v-if="item.subExamStatus === null">待预约考试</view>
+													<view
+														v-else-if="item.subExamStatus === 0 &&  sysTime < $method.TimeTotimestamp(
+															$method.timestampToTime(item.subApplySiteExamTime, true) +
+																' ' +
+																item.subApplySiteStartTime
+														)">
+														待考试,考试时间:
+														{{
+															$method.timestampToTime(item.subApplySiteExamTime, true) +
+															" " +
+															item.subApplySiteStartTime
+														}}
+														-
+														{{
+															$method.timestampToTime(item.subApplySiteExamTime, true) +
+															" " +
+															item.subApplySiteEndTime
+														}}
+													</view>
+													<view v-else-if="item.subExamStatus === 0">待出考试结果</view>
+													<view v-else-if="item.subExamStatus === 1">
+														<text v-if="item.subResult === null">待出考试结果</text>
+														<text v-if="item.subResult === 0">考试结果:不通过,需补考</text>
+														<text
+															v-else-if="item.subResult === 1">考试结果:通过,考试成绩为{{item.subPerformance}}</text>
+													</view>
+													<view v-else-if="item.subExamStatus === 2">缺考,无成绩,需补考</view>
+													<view v-else-if="item.subExamStatus === 3">作弊,无成绩,需补考</view>
+													<view v-else-if="item.subExamStatus === 4">替考,无成绩,需补考</view>
 
+												</view>
 											</view>
 										</view>
-									</view>
+									</template>
+
 								</template>
 
 							</template>
+						</view>
 
-
-						</template>
-						<!-- 预约考试 进入刷题-->
-						<template
-							v-if="item.gradeStatus == 1 && item.status == 1 && (item.serviceEndTime > sysTime) && (item.serviceStartTime < sysTime) &&  (item.classEndTime && (item.classEndTime < sysTime)) && (item.periodStatus == 0 || item.periodStatus == -1) && item.studyCount > 0">
-						</template>
-						<template v-else>
-							<template v-for="(appoint,appointIndex) in item.examApplyGoodsList">
-								<view class="box_progress" :key="appointIndex" v-if="item.applyStatus === 1 && !( sysTime <= item.serviceStartTime || sysTime >= item.serviceEndTime || (item.classStartTime && sysTime <= item.classStartTime) || (item.classEndTime && sysTime >= item.classEndTime) || item.learningStatus == 2 || item.classStatus == 0 || (item.learningStatus == 3 && sysTime < item.learningTimeStart))">
-									<view style="flex:1;margin-right:10rpx;">
-										<text style="color: #333333;">{{ appoint.applyName }}</text>
+						<view class="c_downs"  @click="studyIn(item.goodsId,item.gradeId,item,index)">
+							<view class="lefts">
+								<image class="lefet_img" :src="$method.splitImgHost(item.coverUrl, true)" mode=""></image>
+								<view v-if="item.goodsType == 6" class="live_icon">直播</view>
+							</view>
+							<view class="rights">
+								<template
+									v-if="item.gradeStatus == 1 && item.status == 1 && (item.serviceEndTime > sysTime) && (item.serviceStartTime < sysTime) &&  (item.classEndTime && (item.classEndTime < sysTime)) && (item.periodStatus == 0 || item.periodStatus == -1) && item.studyCount > 0">
+									<view class="enter_into" @click.stop="selectClass(item,index)">
+										选班重学
 									</view>
-									<view>
-										<u-button :plain="true" type="primary" size="mini" @click.stop="appointment(item,appoint)">预约考试
-										</u-button>
+								</template>
+								<view v-else class="learn_progress">
+									<view class="progress_up">
+										<!-- <image src="/static/icon/wk_icon3.png" class="wk_icon"></image> -->
+										<!-- 学习进度 (已做试卷+已做节)/(试卷数+节数) -->
+										<view>
+											学习进度:{{ item.stuAllNum+item.recordNum }}/{{ item.secAllNum+item.examNum }}
+										</view>
+										<view class="progress_bar" style="width: 100%;">
+											<u-line-progress :showText="false" height="22" active-color="#ff9900" :show-percent="false"
+												:percent="((item.stuAllNum+item.recordNum) / (item.secAllNum+item.examNum)) * 100"></u-line-progress>
+										</view>
 									</view>
+									<!-- <view class="progress_down">
+										
+										<view class="enter_into" @click.stop="studyIn(item.goodsId,item.gradeId,item,index)">进入学习</view>
+									</view> -->
+
 								</view>
+							</view>
+						</view>
+						
+						<!-- 按钮 -->
+						<view class="study_btns">
+							<template
+								v-if="item.gradeStatus == 1 && item.status == 1 && (item.serviceEndTime > sysTime) && (item.serviceStartTime < sysTime) &&  (item.classEndTime && (item.classEndTime < sysTime)) && (item.periodStatus == 0 || item.periodStatus == -1) && item.studyCount > 0">
 							</template>
-							<view class="box_progress" v-if="item.beforeStatus === 1 && !( sysTime <= item.serviceStartTime || sysTime >= item.serviceEndTime || (item.classStartTime && sysTime <= item.classStartTime) || (item.classEndTime && sysTime >= item.classEndTime) || item.learningStatus == 2 || item.classStatus == 0 || (item.learningStatus == 3 && sysTime < item.learningTimeStart))">
-								<view style="flex:1;margin-right:10rpx;">
-									<text style="color: #2979ff;">{{ item.beforeName }}</text>
+							<view v-else class="exam_btns">
+								<!-- examApplyGoodsList.length -是判断是否关联指定学员 -->
+								<view class="box_appoint" v-if="item.applyStatus === 1 && !( sysTime <= item.serviceStartTime || sysTime >= item.serviceEndTime
+									 || (item.classStartTime && sysTime <= item.classStartTime) || (item.classEndTime && sysTime >= item.classEndTime) || 
+									 item.learningStatus == 2 || item.classStatus == 0 || (item.learningStatus == 3 && sysTime < item.learningTimeStart) || 
+									 !item.examApplyGoodsList.length)"
+									 @click="appointment(item,appoint)">
+									<view class="exam_word ones">预约考试</view>
 								</view>
-								<view>
-									<u-button type="primary" size="mini" @click="appBeforeAddress(item.goodsId,item)">进入刷题</u-button>
+								<view class="box_appoint" v-if="item.beforeStatus === 1 && !( sysTime <= item.serviceStartTime || sysTime >= item.serviceEndTime
+									 || (item.classStartTime && sysTime <= item.classStartTime) || (item.classEndTime && sysTime >= item.classEndTime) || 
+									 item.learningStatus == 2 || item.classStatus == 0 || (item.learningStatus == 3 && sysTime < item.learningTimeStart))"
+									 @click="appBeforeAddress(item.goodsId,item)">
+									<view class="exam_word ones">进入刷题</view>
 								</view>
+								
 							</view>
-						</template>
+							<view class="box_appoint" @click="studyIn(item.goodsId,item.gradeId,item,index)">
+								<view class="exam_word  intos">进入学习</view>
+							</view> 
+						</view>
+
+						
 						
 					</view>
 				</view>
@@ -331,7 +338,7 @@
 												学习进度:{{item.doNum}}/{{item.totalNum}}
 											</view>
 											<view class="progress_bar" style="width: 100%;">
-												<u-line-progress :show-percent="false" height="22" active-color="#007AFF" :percent="(item.doNum/item.totalNum)*100"></u-line-progress>
+												<u-line-progress :show-percent="false" height="22" active-color="#ff9900" :percent="(item.doNum/item.totalNum)*100"></u-line-progress>
 											</view>
 										</view>
 										<view class="progress_down">
@@ -429,6 +436,29 @@
 			</view>
 		</u-modal>
 
+		<!-- 多个预约考试时的弹窗 -->
+    	<u-popup v-model="appointTestShow" mode="bottom" border-radius="40">
+			<view class="popuptest_box">
+				<view class="check_head">
+            	<view class="headers">
+					<view class="grade">切换课程</view>
+						<u-icon name="close" color="#9C9C9C" size="40" @click="closePop()"></u-icon>
+					</view>
+				</view>
+				<view class="check_con">
+					<scroll-view scroll-y="true" style="height: 700rpx;">
+						<view class="course_items"  v-for="(appoint, index) in appointTestList" :key="index">
+							<view class="course_lefts">
+								<view class="course_title">{{ appoint.applyName }}</view>
+							</view>
+							<view class="course_rights" @click="jumpTest(appointItemIndex, appoint)">
+								<view class="intoStudy">预约</view>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</u-popup>
 		<!-- <tab-bar v-model="current" :list="tabbarlist" :mid-button="true" :mid-button-size="50" class="tab_items"></tab-bar> -->
     </view>
 </template>
@@ -468,7 +498,9 @@ export default {
 			livingLists: [], // 直播列表
 			allLoading: false, // 加载样式
 			current: 2,
-            tabbarlist: this.$store.state.tabLists
+			appointTestShow: false, //预约考试弹窗
+			appointTestList: [],
+			appointItemIndex: {}, // 点击了哪项课程
         }
     },
 	filters: {
@@ -588,7 +620,11 @@ export default {
 			let moduleId = item.moduleId || 0
 			let chapterId = item.chapterId || 0
 			let sectionId = item.sectionId || item.menuId
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+item.liveUrl+'&gradeId='+0+'&courseId='+item.courseId+'&goodsId='+item.goodsId+'&orderGoodsId='+item.orderGoodsId+'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId)
+			let uuid = new Date().valueOf() + ""
+          	// buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+			+item.liveUrl+'&gradeId='+0+'&courseId='+item.courseId+'&goodsId='+item.goodsId+'&orderGoodsId='+item.orderGoodsId+'&sectionId='+sectionId+'&chapterId='
+			+chapterId+'&moduleId='+moduleId+'&buyCourse=1'+'&ident='+uuid+'&sectionType=2')
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})
@@ -603,8 +639,11 @@ export default {
 			}).then(res => {
 				if (res.data.code == 200) {
 					if(res.data.total > 1) {
+						// uni.navigateTo({
+						// 	url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+						// })
 						uni.navigateTo({
-							url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+							url:'/pages3/live/detail?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0&courseId=""'
 						})
 					} else if(res.data.total == 1) {
 						uni.navigateTo({
@@ -738,7 +777,7 @@ export default {
 								method: 'get',
 								data: {
 									pageNum: 1,
-									pageSize: 1,
+									pageSize: 100,
 									goodsId: item.goodsId,
 									gradeId: item.gradeId,
 									orderGoodsId: item.orderGoodsId,
@@ -749,10 +788,13 @@ export default {
 								if (res.data.code == 200) {
 
 									if(res.data.total > 1) {
-										this.$navTo.togo(`/pages2/wd/course?id=${v}&gid=${i}&orderGoodsId=${item.orderGoodsId}`);
+										// this.$navTo.togo(`/pages2/wd/course?id=${v}&gid=${i}&orderGoodsId=${item.orderGoodsId}`);
+										uni.navigateTo({
+											url: `/pages3/polyv/detail?id=''&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}&gradeId=${item.gradeId}`
+										})
 									} else if(res.data.total == 1) {
 										uni.navigateTo({
-											url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}`
+											url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}&gradeId=${item.gradeId}`
 										})
 									} else {
 										uni.showToast({
@@ -863,7 +905,7 @@ export default {
 				}
 			});
 		},
-		// 进入刷题
+		// 进入练习
 		studyques(item,index){
 			this.queitemIndex = index;
 			let sysTime = this.$method.timest()
@@ -970,7 +1012,26 @@ export default {
 				phoneNumber: '020-87085982' //仅为示例
 			})
 		},
-		appointment(item,appoint) {
+		closePop() {
+			this.appointTestShow = false
+		},
+		jumpTest(item, appoint) {
+			this.appoint_an(item, appoint)
+			this.appointTestShow = false
+		},
+		appointment(item, appoint) {
+			console.log('====', item.examApplyGoodsList, this.userInfo)
+			this.appointItemIndex = item
+			if (item.examApplyGoodsList.length > 1) { // 多个考试预约				 
+				this.appointTestList = item.examApplyGoodsList
+				this.appointTestShow = true
+				return
+			}
+			let appoint_item = item.examApplyGoodsList[0]
+			this.appoint_an(item, appoint_item)
+		},
+		appoint_an(item, appoint) {
+			// console.log('==appoint=', appoint)
 			var data = {
 				goodsId: item.goodsId,
 				gradeId: item.gradeId,
@@ -994,6 +1055,7 @@ export default {
 				}
 			});
 		},
+		// 进入刷题,调整小程序
 		appBeforeAddress(goodsId,item) {
 			this.$api.appBeforeAddress({
 				orderGoodsId:item.orderGoodsId
@@ -1003,7 +1065,7 @@ export default {
 						appId: res.data.data.url,
 						success(res) {
 							// 打开成功
-					}
+						}
 					})
 				} else {
 					uni.showModal({

+ 5 - 4
pages/wd/index.vue

@@ -52,8 +52,8 @@
 						<image src="/static/icon/my_icon4.png" class="my_icon"></image>
 						<view>我的题库通</view>
 					</view>
-				</view>
-				<navigator  hover-class="none" url="/pages5/liveDetail/list" class="menu_box" >
+				</view> -->
+				<!-- <navigator  hover-class="none" url="/pages5/liveDetail/list" class="menu_box" >
 					<view class="box_left">
 						<image src="/static/icon/my_icon12.png" class="my_icon"></image>
 						<view>我的直播课</view>
@@ -85,7 +85,8 @@
 						个模考预约
 					</view>
 				</navigator>
-				<!-- <navigator  hover-class="none" url="/pages2/exam/index" class="menu_box" >
+				<!--    /pages2/exam/index-->
+				<navigator  hover-class="none" url="/pages2/exam/exam_appointment" class="menu_box" >
 					<view class="box_left">
 						<image src="/static/icon/my_icon10.png" class="my_icon"></image>
 						<view>我的考试</view>
@@ -94,7 +95,7 @@
 						<text>{{ userNums.subscribeSum }}</text>
 						考试预约
 					</view>
-				</navigator> -->
+				</navigator>
 				<navigator  hover-class="none" v-if="!hideBuyState" url="/pages2/order/index" class="menu_box">
 					<view class="box_left">
 						<image src="/static/icon/my_icon7.png" class="my_icon"></image>

+ 195 - 4
pages/webview/index.vue

@@ -1,10 +1,21 @@
 <template>
   <view class="webview">
-    <web-view :webview-styles="webviewStyles" :src="url"></web-view>
+    <template v-if="url">
+      <web-view :webview-styles="webviewStyles" :src="url"></web-view>
+    </template>
+    
+    <u-popup v-model="showAuth" mode="center" border-radius="30">
+      <view class="popCentent">
+        <view class="tips">您还没有开通直播课程,无法观看</view>
+        <view class="btns" @click="toAuth()">立即开通</view>
+      </view>
+    </u-popup>
   </view>
 </template>
 
 <script>
+import { WEBVIEW_URL } from '@/common/request.js'
+import { mapGetters } from 'vuex'
 export default {
   components: {},
   data() {
@@ -15,15 +26,195 @@ export default {
           color: "#007AFF",
         },
       },
+      options: {},
+      optObj: {},
+      goodsId: 0,
+      chapterId: 0,
+      moduleId: 0,
+      courseId: 0,
+      sectionId: 0,
+      orderGoodsId: 0,
+      paramObj: {},
+      showAuth: false,
+      checkStatus: 0, // 0没有权限,1有权限
+      goodsStatus: 0, // 0未上架,1上架
+      sectionType: 2, // 2直播
+      vid: '', // 回放id
     };
   },
+  // onShareAppMessage() {
+  //   let item = this.paramObj
+  //   let moduleId = item.moduleId || 0
+  //   let chapterId = item.chapterId || 0
+  //   let sectionId = item.sectionId
+  //   let uuid = new Date().valueOf() + ""
+  //   // buyCourse 是否购买课程:1是 0否
+  //   let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+  //   +item.channelId+'&gradeId='+0+'&courseId='+item.courseId+'&goodsId='+item.goodsId+'&orderGoodsId='+item.orderGoodsId+'&sectionId='+sectionId+'&chapterId='
+  //   +chapterId+'&moduleId='+moduleId+'&buyCourse='+item.buyCourse+'&ident='+uuid+'&sectionType='+this.sectionType+'&vid='+this.vid)
+	// 	return {
+	// 		title: '直播',
+	// 		path: `/pages/webview/index?url=` + encode
+	// 	};
+	// },
   onLoad(option) {
-    this.url = decodeURIComponent(option.url);
-    console.log(this.url);
+    console.log('--option-', option)
+    this.options = option
+    console.log('userInfo:', this.userInfo)
+  },
+  onShow() {
+    console.log('22222222222222')
+    if (this.$method.isGoLogin()) { // 扫二维码进来的没登录需要跳到登录页,登录后返回
+      return;
+    }
+    console.log('33333333333333')
+    if (this.options.scene) {
+      this.optObj = {}
+      let arrs = decodeURIComponent(this.options.scene).split('&')
+      for (let i = 0; i < arrs.length; i++) {
+          this.optObj[arrs[i].split('=')[0]] = arrs[i].split('=')[1]
+      }
+      console.log('this.optObj', this.optObj)
+    }
+    // 有a字段是标识是扫二维码进来的
+    if (this.optObj.a == 1) {
+      if (!this.userInfo) {
+        console.log('没有userInfo')
+        this.getInfo()
+      } else {
+        console.log('有userInfo')
+        this.getParam()
+      }
+      
+    } else {
+      this.url = decodeURIComponent(decodeURIComponent(this.options.url))
+      console.log('小程序进来的url:', this.url)
+      let index = this.url.indexOf('?')
+      let paramArr = this.url.slice(index + 1).split('&')
+      let paramObj = {}
+      for (let i = 0; i < paramArr.length; i++) {
+          paramObj[paramArr[i].split('=')[0]] = paramArr[i].split('=')[1]
+      }
+      this.paramObj = paramObj
+      this.sectionType = this.paramObj.sectionType || 2 // 默认直播,回放的加了sectionType=3
+      this.vid = this.paramObj.vid || ''
+      console.log('paramObj', paramObj)
+      this.studyLog(paramObj)
+    }
+  },
+  computed: {
+		...mapGetters(['userInfo']),
+	},
+  methods: {
+    getInfo() {
+			// /app/user/getInfo 登录用户信息 // fromPlat来源平台 1小程序 2PC网站
+			this.$api.getInfo({ fromPlat: 1 }).then(res => {
+				if(res.data.code == 200){
+					this.$store.state.userInfo = res.data.data
+          console.log('this.userInfo', this.userInfo)
+          this.getParam()
+				}
+			})
+		},
+    // 获取直播间跳转参数的接口
+    getParam() {
+      const { cid, gid, sid} = this.optObj
+      this.$http({
+        url: '/course/check/watch/per',
+        method: 'get',
+        data: {
+          courseId: cid, //课程ID	
+          goodsId: gid, // 商品id
+          sectionId: sid, // 节id
+        },
+      }).then((res) => {
+        if (res.data.code == 200) {
+          let item = res.data.data
+          this.paramObj = item
+          this.goodsId = item.goodsId
+          this.goodsStatus = item.goodsStatus
+          this.sectionType = item.sectionType
+          this.vid = item.recordingUrl || ''
+          if (item.checkStatus == 1) { // 有权限
+            let moduleId = item.moduleId || 0
+            let chapterId = item.chapterId || 0
+            let sectionId = item.sectionId
+            
+            let uuid = new Date().valueOf() + ""
+            // buyCourse 是否购买课程:1是 0否
+            this.url = WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+            +item.channelId+'&gradeId='+0+'&courseId='+item.courseId+'&goodsId='+item.goodsId+'&orderGoodsId='+item.orderGoodsId+'&sectionId='+sectionId
+            +'&chapterId='+chapterId+'&moduleId='+moduleId+'&buyCourse='+item.buyCourse+'&ident='+uuid+'&sectionType='+ this.sectionType+'&vid='+this.vid
+            console.log('url:', this.url)
+            this.studyLog(item)
+          } else {
+            // 没有权限
+            this.url = ''
+            this.showAuth = true
+          }
+          
+        } else {
+          this.$u.toast(res.data.msg)
+          uni.switchTab({
+            url:'/pages/index/index'
+          })
+        }
+      })
+
+    },
+    // 新增用户视频学习日志
+    studyLog(item) {
+      this.$http({
+        url: '/user/study/log',
+        method: 'post',
+        data: {
+          goodsId: item.goodsId,
+          courseId: item.courseId,
+					moduleId: item.moduleId || 0,
+					chapterId: item.chapterId || 0,
+          sectionId: item.sectionId || 0,
+          fromPlat: 1, //来源平台 1小程序 2PC网站
+          goodsType: 6, // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播
+          orderGoodsId: item.orderGoodsId,
+        }
+      }).then((res) => {
+        console.log('直播的用户学习日志:', res)
+      })
+    },
+    toAuth() {
+      if (this.goodsStatus == 1) { //已上架
+        uni.navigateTo({
+          url:'/pages3/course/detail?id='+this.goodsId
+        })
+      } else {
+        uni.switchTab({
+          url:'/pages/index/index'
+        })
+      }
+    },
   },
-  methods: {},
 };
 </script>
 
 <style lang="scss" scoped>
+.popCentent {
+  width: 600rpx;
+  height: 300rpx;
+  padding: 24rpx;
+  text-align: center;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  .btns {
+    width: 500rpx;
+    height: 80rpx;
+    line-height: 80rpx;
+    text-align: center;
+    background-color: #3577E8;
+    color: #fff;
+    font-size: 24rpx;
+    border-radius: 20rpx;
+  }
+}
 </style>

+ 33 - 2
pages2/appointment/index.vue

@@ -104,16 +104,43 @@ export default {
       }, //页面数据
       radioInfo: "",
       goodsIdBK: null, //补考商品ID
+      reportStatus: 0, // 是否线上签署疫情防控承诺书, 1是,0否
     };
   },
   onLoad(option) {
-    this.applyId = option.applyId;
+    this.applyId = option.applyId || '';
     this.goodsId = Number(option.goodsId);
     this.gradeId = Number(option.gradeId);
     this.orderGoodsId = Number(option.orderGoodsId) || "";
-    this.getInfo();
+    
+  },
+  onShow() {
+    if (this.$method.isGoLogin()) { // 从公众号消息进来的没登录需要跳到登录页,登录后返回
+			return;
+		}
+    if (this.applyId) {
+      this.getInfo();
+    } else {
+      this.getAppoint()
+    }
   },
   methods: {
+    getAppoint() {
+      this.$http({
+        url: '/user/subscribe/listSubscribe',
+        methods: 'get',
+        data: {
+          orderGoodsId: this.orderGoodsId,
+          goodsId: this.goodsId,
+        }
+      }).then((res) => {
+        console.log('----listSubscribe-', res)
+        if (res.data.code == 200) {
+          this.applyId = res.data.data.applyId
+          this.getInfo()
+        }
+      })
+    },
     getInfo() {
       var data = {
         goodsId: this.goodsId,
@@ -121,11 +148,14 @@ export default {
         orderGoodsId: this.orderGoodsId,
         applyId: this.applyId,
       };
+      // /apply/subscribe
       this.$api.getApplysubscribe(data).then((res) => {
         if (res.data.data.applyStatus) {
           res.data.data.applyStatus = res.data.data.applyStatus.split(",");
         }
         this.listData = res.data.data;
+        this.reportStatus = res.data.data.reportStatus
+        console.log('reportStatus', this.reportStatus)
       });
     },
     next() {
@@ -159,6 +189,7 @@ export default {
               dataId: res.data.data,
               applyId: this.applyId,
               orderGoodsId: this.orderGoodsId,
+              reportStatus: this.reportStatus,
             });
           }
           if (res.data.data === 3) {

+ 253 - 42
pages2/appointment/order.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="safeArea">
+  <view class="safeAreas">
     <nav-bar title="预约考试"></nav-bar>
     <view class="appointment">
       <view class="appointmentItem">
@@ -61,6 +61,53 @@
 					</text> -->
         </view>
       </view>
+      <!-- 考试疫情承诺书 -->
+      <view v-if="reportStatus == 1" class="appointmentItem">
+        <view class="title"><text class="star_red">*</text>考试疫情防控承诺书</view>
+        <view class="commitment">
+          本人参加“住房和城乡建设领域施工现场专业人员岗位”考试,愿意遵守疫情防控各项管理的相关要求,秉承对自己、对他人负责的原则,承担疫情防控社会责任,郑重作出以下承诺:<br/>
+          一、充分理解并遵守考试期间考点各项防疫安全的要求。<br/>
+          二、在考试前14天内,没有到过国内疫情中风险、高风险地区,未出境,不存在自境外回国情形。<br/>
+          三、在考试前14天内,每日自觉监测体温,体温均未出现高于37.3度的情形,无发热和呼吸道门诊就诊史。<br/>
+          四、在考试前14天内,未和新冠肺炎病例或疑似病例密切接触或间接接触,没有发烧、干咳、乏力、咳痰、气短、肌肉痛或关节痛、咽喉痛、头痛、寒颤、恶心或呕吐、鼻塞、腹泻、咳血、结膜充血等疑似新冠肺炎症状。<br/>
+          五、如出现与前述第二、三、四项任何一项不符的情形之一的,本人将及时在考前向相关管理机构报告,自觉配合采取隔离或其他防疫措施,并根据情况,自愿放弃参加考试。<br/>
+          六、考试当日自行做好防护工作,佩戴防护口罩。提前抵达考点,配合查验健康码、测量体温等。<br/>
+          七、考试期间,将严格遵守应考人员考场守则及疫情防控相关管理要求,完成考试后立即离场,不扎堆,不聚集。<br/>
+          八、本人承诺遵守《应考人员安全承诺书》中所有承诺内容,若因有瞒报、谎报造成新冠肺炎疫情传播的,一经查实,由本人承担相应的法律和经济责任。
+        </view>
+      </view>
+      <view v-if="reportStatus == 1" class="appointmentItem ">
+        <view class="title"><text class="star_red">*</text>签名板</view>
+        <view class="dis_stys">
+          <text style="color: #999999">请在下方签名区进行签名</text>
+          <text @click="retDraw" mode="">清空</text>
+        </view>
+        <view class="handCenter">
+          <view v-show="!address_show" class="can_vas">
+            <canvas
+              class="handWriting"
+              disable-scroll="true"
+              :catchtouchmove="true"
+              @touchstart="uploadScaleStart"
+              @touchmove="uploadScaleMove"
+              @touchend="uploadScaleEnd"
+              canvas-id="handWriting"
+            ></canvas>
+          </view>
+          <view v-show="address_show" class="no_true"></view>
+          <!-- <view
+            v-else
+            style="width: 100%; height: 100%; position: relative"
+          >
+            <view class="ctoples">图片</view>
+            <image
+              style="width: 100%; height: 100%"
+              :src="$method.splitImgHost(form[item.fieldKey])"
+              mode=""
+            ></image>
+          </view> -->
+        </view>
+      </view>
       <view class="btnMain">
         <view class="return" @click="backPage">上一步</view>
         <view class="sure" @click="sureOppoint">{{
@@ -79,7 +126,7 @@
             class="item"
             v-for="(item, index) in listData"
             :key="index"
-            @click="choAddress(index)"
+            @click="choAddress(item, index)"
           >
             <u-checkbox
               class="checkbox"
@@ -100,6 +147,7 @@
 
 <script>
 import { mapGetters } from "vuex";
+import Handwriting from "@/common/signature.js";
 export default {
   data() {
     return {
@@ -114,6 +162,15 @@ export default {
       applyStatus: null, //学员状态ID
       sysTime: 0,
       dataId: null, //跳转拷贝
+      handwriting: '',
+      lineColor: "black",
+      slideValue: 30,
+      openVerify: false, // 控制是否手动验证
+      commitment_electr_signature: '',
+      isUploading: false,
+      siteId: '', // 考场id
+      reportStatus: 0, // 是否线上签署疫情防控承诺书, 1是,0否
+      baseAddress: '', // 签名转成base64
     };
   },
   async onLoad(option) {
@@ -122,9 +179,18 @@ export default {
     this.applyStatus = Number(option.applyStatus);
     this.dataId = Number(option.dataId);
     this.orderGoodsId = Number(option.orderGoodsId);
+    this.reportStatus = option.reportStatus
     await this.commonSystemTime();
     this.getInfo();
   },
+  onReady(res) {
+    this.handwriting = new Handwriting({
+      lineColor: this.lineColor,
+      slideValue: this.slideValue, // 0, 25, 50, 75, 100
+      canvasName: "handWriting",
+    });
+    // this.$refs.uForm.setRules(this.rules);
+  },
   methods: {
     commonSystemTime() {
       return new Promise((resolve) => {
@@ -137,6 +203,7 @@ export default {
     },
     //获取考试地点
     getInfo() {
+      // apply/subscribeApplySite
       this.$api
         .getApplysubscribeApplySite({ applyId: this.applyId })
         .then((res) => {
@@ -145,13 +212,15 @@ export default {
               item.checked = false;
             });
             this.listData = res.data.data;
+            console.log('this.listData:', this.listData)
           }
         });
     },
     showAddress() {
       this.address_show = true;
     },
-    choAddress(index) {
+    choAddress(item, index) {
+      this.siteId = item.siteId
       this.listData.forEach((item, idx) => {
         this.$set(item, "checked", false);
         if (idx === index) {
@@ -169,11 +238,14 @@ export default {
         });
         return;
       }
+      this.siteId = this.listData[index].siteId
+      console.log('siteId: ', this.siteId, index)
       if (this.addressId === this.listData[index].id) {
         this.address_show = false;
         return;
       }
       this.addressName = this.listData[index].siteAddress;
+      console.log('addressName', this.addressName, this.listData)
       this.addressId = this.listData[index].id;
       var arrays = [];
       this.listData[index].examUserApplySiteTime.forEach((item) => {
@@ -199,12 +271,13 @@ export default {
           });
         });
       });
+      console.log('arrays', arrays)
       this.activeList = arrays.filter((item, index) => {
         console.log(item);
         // const newTime = parseInt(new Date().getTime() / 1000)
-        console.log(
-          item.dataTime.replace(/-/g, "/") + "" + item.startTime + ":00"
-        );
+        // console.log(
+        //   item.dataTime.replace(/-/g, "/") + "" + item.startTime + ":00"
+        // );
         const liTime = parseInt(
           new Date(
             item.dataTime.replace(/-/g, "/") + "" + item.startTime + ":00"
@@ -217,7 +290,7 @@ export default {
         }
       });
 
-      console.log(this.activeList);
+      console.log('----',this.activeList);
       this.address_show = false;
     },
     choItem(index) {
@@ -232,66 +305,176 @@ export default {
         }
       });
     },
-    sureOppoint() {
+    async sureOppoint() {
+      if (this.isUploading) {
+        return;
+      }
+      this.isUploading = true
+
       var self = this;
       if (self.addressId) {
         var ast = self.activeList.some((item) => {
           return item.checked === true;
         });
+        console.log('ast',this.activeList, ast)
         if (ast) {
-          var copyData = JSON.parse(JSON.stringify(self.activeList));
-          const index = copyData.findIndex((item) => item.checked);
-          var data = {
-            applyId: self.applyId,
-            goodsId: self.goodsId,
-            studentType: self.applyStatus,
-            applySiteAddress: self.addressName,
-            applySiteExamTime: copyData[index].examTime,
-            applySiteStartTime: copyData[index].startTimeC,
-            applySiteEndTime: copyData[index].endTimeC,
-            orderGoodsId: self.orderGoodsId,
-          };
-          if (self.dataId === 1) {
-            self.$store.commit("updateApplyData", data);
-            self.$navTo.togo("/pages2/appointment/kporder", {
-              applyId: self.applyId,
-              applyStatus: self.applyStatus,
-              goodsId: self.goodsId,
-              orderGoodsId: self.orderGoodsId,
-            });
-          }
-          if (self.dataId === 2) {
-            self.$api.addApply(data).then((res) => {
-              if (res.data.code === 200) {
-                uni.reLaunch({
-                  url: `/pages2/appointment/appointment_success?subscribeId=${res.data.data}`,
-                });
-              } else {
-                uni.showToast({
-                  icon: "none",
-                  title: res.data.msg,
-                });
-              }
-            });
+          if (this.reportStatus == 1) {
+            await this.subCanvas()
+            if (!this.commitment_electr_signature) {
+              uni.showToast({
+                title: "请签名",
+                icon: "none",
+              })
+              this.isUploading = false
+              return
+            } else {
+              // await this.submitApi()
+                uni.getFileSystemManager().readFile({
+                  filePath: this.commitment_electr_signature, //临时路径
+                  encoding: 'base64', //编码格式
+                  success: res => {
+                    console.log('返回结果', res)
+                    const base64 = "data:image/png;base64," + res.data
+                    console.log('sfs签名转成base64', base64)
+                    this.baseAddress = base64
+                    // return
+                    this.submits()
+                  },
+                  fail: err => {
+                    console.log('转base64错误', err)
+                    this.isUploading = false
+                  }
+                })
+                // uni.request({
+                //   url: this.commitment_electr_signature, //临时路径
+                //   responseType: 'arraybuffer', //设置返回的数据格式为arraybuffer
+                //   success: res => {
+                //     const base64 = "data:image/png;base64," + uni.arrayBufferToBase64(res.data)
+                //     console.log('sfs签名转成base64', base64)
+                //     this.baseAddress = base64
+                //     this.submits()
+                //   },
+                //   fail: err => {
+                //     console.log('转base64错误', err)
+                //     this.isUploading = false
+                //   }
+                // })
+            }
+          } else {
+            this.submits()
           }
+          
+          
         } else {
           uni.showToast({
             title: "请选择考试时间",
             icon: "none",
           });
+          this.isUploading = false
         }
       } else {
         uni.showToast({
           title: "请选择考试地点",
           icon: "none",
         });
+        this.isUploading = false
       }
     },
+    submits() {
+      uni.showLoading({
+        title: '拼命加载中...',
+        mask:true,
+      })
+      var copyData = JSON.parse(JSON.stringify(this.activeList));
+      const index = copyData.findIndex((item) => item.checked);
+      var data = {
+        applyId: this.applyId,
+        goodsId: this.goodsId,
+        studentType: this.applyStatus,
+        applySiteAddress: this.addressName,
+        applySiteExamTime: copyData[index].examTime,
+        applySiteStartTime: copyData[index].startTimeC,
+        applySiteEndTime: copyData[index].endTimeC,
+        orderGoodsId: this.orderGoodsId,
+        siteId: this.siteId, // 考场id
+        
+      };
+      if (this.reportStatus == 1) {
+        data.signImageStr = this.baseAddress
+      }
+      console.log('-----data', data, this.dataId)
+      // return
+      if (this.dataId === 1) {
+        this.$store.commit("updateApplyData", data);
+        this.$navTo.togo("/pages2/appointment/kporder", {
+          applyId: this.applyId,
+          applyStatus: this.applyStatus,
+          goodsId: this.goodsId,
+          orderGoodsId: this.orderGoodsId,
+        });
+        uni.hideLoading()
+      }
+      if (this.dataId === 2) {
+        this.$api.addApply(data).then((res) => {
+          if (res.data.code === 200) {
+            uni.reLaunch({
+              url: `/pages2/appointment/appointment_success?subscribeId=${res.data.data}`,
+            });
+          } else {
+            uni.showToast({
+              icon: "none",
+              title: res.data.msg || '预约失败,请重新预约',
+            });
+          }
+          uni.hideLoading()
+        });
+      }
+      this.isUploading = false
+    },
     backPage() {
       uni.navigateBack({
         delta: 1,
       });
     },
+    retDraw() {
+      this.handwriting.retDraw()
+      this.commitment_electr_signature = ''
+      // this.$set(this.form, "commitment_electr_signature", "");
+      this.openVerify = false;
+    },
+    uploadScaleStart(event) {
+      this.handwriting.uploadScaleStart(event);
+    },
+    uploadScaleMove(event) {
+      this.handwriting.uploadScaleMove(event);
+    },
+    uploadScaleEnd(event) {
+      this.handwriting.uploadScaleEnd(event);
+    },
+    async subCanvas() {
+      console.log("签名-------");
+      return new Promise((resolve, reject) => {
+        if (this.commitment_electr_signature) {
+          resolve();
+          return;
+        }
+        this.handwriting.saveCanvas().then((res) => {
+            if (this.handwriting.linePrack.length) {
+              console.log('签名-----res', res)
+              this.commitment_electr_signature = res
+            }
+            resolve(res)
+          })
+          .catch((err) => {
+            uni.showToast({
+              title: "签名上传失败",
+              icon: "error",
+            });
+            this.isUploading = false
+          });
+          
+      });
+    },
   },
 };
 </script>
@@ -305,6 +488,9 @@ page {
 }
 </style>
 <style scoped lang="scss">
+  .safeAreas {
+    padding-bottom: 30rpx;
+  }
 .appointment {
   padding: 0 8rpx;
   .appointmentItem {
@@ -317,6 +503,9 @@ page {
       line-height: 1;
       margin-bottom: 16rpx;
       padding-left: 24rpx;
+      .star_red {
+        color: red;
+      }
     }
     .place {
       height: 80rpx;
@@ -327,6 +516,28 @@ page {
       align-items: center;
       padding: 0 24rpx;
     }
+    .commitment {
+      padding: 12rpx;
+      height: 300rpx;
+      background: #ffffff;
+      overflow-y: auto;
+    }
+    .handCenter, .dis_stys, .commitment {
+      margin: 0rpx 24rpx;
+    }
+    .dis_stys {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 16rpx;
+    }
+    .handCenter {
+      .handWriting, .no_true {
+        width: 100%;
+        height: 400rpx;
+        background: #fff;
+      }
+    }
   }
   .main {
     background: #ffffff;

+ 13 - 0
pages2/bank/detail.vue

@@ -12,6 +12,8 @@
 					<view class="prices">
 						<!-- <text class="price_sym"></text> -->
 						<text class="price_word">¥ {{ goodsData.standPrice }}</text>
+						<text v-if="goodsData.linePrice" class="sale"> ¥ </text>
+						<text v-if="goodsData.linePrice" class="price_line"> {{ goodsData.linePrice }}</text>
 					</view>
 					<view class="noteTag">
 						<!-- 共 <text class="blackFont">{{ goodsData.chapterNum }} 张卷 {{goodsData || '-'}}</text> 道题 -->
@@ -448,6 +450,17 @@ page {
 		font-weight: 800;
 		color: #FC3F3F;
 	}
+	.sale {
+		color: #999999;
+		font-size: 28rpx;
+		margin-left: 8rpx;
+	}
+	.price_line {
+		color: #999999;
+		font-size: 28rpx;
+		text-decoration:line-through;
+		font-weight: 400;
+	}
 }
 .courseName {
 	white-space: nowrap;

+ 11 - 8
pages2/bank/questionBank.vue

@@ -1766,14 +1766,17 @@ export default {
       this.$set(this.questionList[bindex], "ques", arr);
       this.isDoOver();
 
-      let isWrong = this.questionList[bindex].ques.some(
-        (quesItem, quesIndex) => {
-          return (
-            this.questionList[bindex].ques[quesIndex] !=
-            this.questionList[bindex].ans[quesIndex]
-          );
-        }
-      );
+      // let isWrong = this.questionList[bindex].ques.some(
+      //   (quesItem, quesIndex) => {
+      //     return (
+      //       this.questionList[bindex].ques[quesIndex] !=
+      //       this.questionList[bindex].ans[quesIndex]
+      //     );
+      //   }
+      // );
+      let isWrong = this.questionList[bindex].ques.some((item, i) => {
+        return this.questionList[bindex].ans.indexOf(item) == -1;
+      })
       // 回答错误
       if (isWrong) {
         this.$api

+ 26 - 0
pages2/bank/question_detail.vue

@@ -167,13 +167,34 @@ export default {
 				
 			})
 		},
+		// 新增用户视频学习日志
+		studyLog(goodsId, courseId, moduleId, chapterId, examId) {
+			this.$http({
+				url: '/user/study/log',
+				method: 'post',
+				data: {
+					goodsId: goodsId,
+					courseId: courseId,
+					moduleId: moduleId || 0,
+					chapterId: chapterId || 0,
+					sectionId: examId || 0,
+					fromPlat: 1, //来源平台 1小程序 2PC网站
+					goodsType: 2, // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播
+					orderGoodsId: this.orderGoodsId,
+				}
+			}).then((res) => {
+				console.log('题库的用户学习日志:', res)
+			})
+		},
 		/**
 		 * 继续做题
 		 */
 		continueDo(recordId,examId,goodsId,chapterId = 0,moduleId = 0) {
+			// examId-试卷id,chapterId =>chapterExamId-章卷ID, moduleId =>majorId-主ID/模块id
 			uni.navigateTo({
 				url:'/pages2/bank/questionBankContinue?orderGoodsId='+this.orderGoodsId+'&recordId=' +recordId +'&id=' +examId +'&goodsid=' +goodsId +'&chapterId='+chapterId+'&moduleId='+moduleId
 			})
+			this.studyLog(goodsId, 0, moduleId, chapterId, examId)
 		},
 		/**
 		 * 重做
@@ -203,6 +224,7 @@ export default {
 						uni.navigateTo({
 							url:'/pages2/bank/questionBank?orderGoodsId='+this.orderGoodsId+'&id=' +examId +'&goodsid=' +goodsId +'&moduleId='+moduleId+'&chapterId=' +chapterExamId
 						})
+
 			        } else if (res.cancel) {
 						uni.navigateTo({
 							url:'/pages2/bank/questionBankAllExplain?id=' + examId +
@@ -217,6 +239,7 @@ export default {
 			        }
 			    }
 			});
+			this.studyLog(goodsId, 0, moduleId, chapterExamId, examId)
 		},
 		/**
 		 * 获取课程目录
@@ -227,6 +250,8 @@ export default {
 				goodsId: this.id
 			}).then(res => {
 				this.bankList = res.data.data;
+				console.log('---banklist:', this.bankList)
+				console.log('')
 				if(this.firstEnter) {
 					this.showAllCharpter();
 					this.firstEnter = false;
@@ -283,6 +308,7 @@ export default {
 			uni.navigateTo({
 				url: '/pages2/bank/questionBank?orderGoodsId='+this.orderGoodsId+'&id=' + id + '&goodsid=' + goodsId + '&moduleId=' + moduleId + '&chapterId=' + chapterId + ''
 			});
+			this.studyLog(goodsId, 0, moduleId, chapterId, id)
 		},
 
 		/**

+ 11 - 8
pages2/class/questionBank.vue

@@ -1884,14 +1884,17 @@ export default {
       this.$set(this.questionList[bindex], "ques", arr);
       this.isDoOver();
 
-      let isWrong = this.questionList[bindex].ques.some(
-        (quesItem, quesIndex) => {
-          return (
-            this.questionList[bindex].ques[quesIndex] !=
-            this.questionList[bindex].ans[quesIndex]
-          );
-        }
-      );
+      // let isWrong = this.questionList[bindex].ques.some(
+      //   (quesItem, quesIndex) => {
+      //     return (
+      //       this.questionList[bindex].ques[quesIndex] !=
+      //       this.questionList[bindex].ans[quesIndex]
+      //     );
+      //   }
+      // );
+      let isWrong = this.questionList[bindex].ques.some((item, i) => {
+        return this.questionList[bindex].ans.indexOf(item) == -1;
+      })
     },
 
     /**

+ 77 - 9
pages2/exam/exam_appointment.vue

@@ -20,7 +20,7 @@
 						</view>
 						<view class="item">
 							<view class="left">考试地点</view>
-							<view class="right">{{ item.applySiteAddress }}</view>
+							<view class="right">{{ item.applySiteAddress || '' }}</view>
 						</view>
 						<view class="item">
 							<view class="left">考试时间</view>
@@ -40,6 +40,26 @@
 								{{ item.applySiteEndTrainTime }}
 							</view>
 						</view>
+						<view class="item">
+							<view class="left">准考证号</view>
+							<view class="right">
+								{{ item.examineeCode || '' }}
+							</view>
+						</view>
+						<!-- fromPlat:1云学堂 2智慧考场 -->
+						<view v-if="item.fromPlat == 2" class="item">
+							<view class="left">座位号</view>
+							<view class="right">
+								{{ item.seatNumber || '' }}
+							</view>
+						</view>
+						<!-- applyReportStatus是否显示签署承诺书 1是,0否 v-if="item.applyReportStatus == 0"-->
+						<view v-if="item.applyReportStatus == 1" class="item" @click="toSign(item)">
+							<view class="left">疫情防控承诺书</view>
+							<view class="right unSign" >
+								{{ item.reportStatus == 1 ? '已签署' : item.reportStatus == 0 ? '未签署' : '' }}
+							</view>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -63,7 +83,7 @@
 						<text class="val">{{ activeList.studentType == 1 ? '非补考学员' : activeList.studentType == 2 ? '补考学员' : '' }}</text>
 					</view>
 				</view>
-				<view class="boxItem">
+				<view class="boxItem border">
 					<view class="title">考试预约信息</view>
 					<view class="item">
 						考试标题:
@@ -79,7 +99,8 @@
 					</view>
 					<view class="item">
 						考试地点:
-						<text class="val">{{ activeList.applySiteAddress }}</text>
+						<!-- activeList.seatNumber 有座位号就显示roomAddress,否则显示applySiteAddress -->
+						<text class="val">{{ activeList.seatNumber ? (activeList.roomAddress || '') : (activeList.applySiteAddress || '') }}</text>
 					</view>
 					<view class="item">
 						考试时间:
@@ -93,6 +114,18 @@
 							}}
 						</text>
 					</view>
+					<view class="item">
+						准考证号:
+						<text class="val">
+							{{ activeList.examineeCode || '' }}
+						</text>
+					</view>
+					<view v-if="activeList.fromPlat == 2" class="item">
+						座位号:
+						<text class="val">
+							{{ activeList.seatNumber || '' }}
+						</text>
+					</view>
 					<view class="item" v-if="activeList.applySiteAddressTrain">
 						考前培训地点:
 						<text class="val">{{ activeList.applySiteAddressTrain }}</text>
@@ -110,6 +143,17 @@
 						</text>
 					</view>
 				</view>
+				<view class="boxItem border">
+					<view class="title">考试成绩和证书信息</view>
+					<view class="item">
+						考试成绩:
+						<text class="val">{{ activeList.performance || '-' }}分</text>
+					</view>
+					<view class="item">
+						考试结果:
+						<text class="val">{{ activeList.syncExamResult || '' }}</text>
+					</view>
+				</view>
 				<u-line color="#EEEEEE" />
 				<view class="foot" v-if="activeList.subscribeStatus === 1">
 					<view class="btn" @click="hideModel">知道了</view>
@@ -162,19 +206,31 @@ export default {
 				applySiteEndTime: '',
 				applySiteStartTrainTime: '',
 				applySiteEndTrainTime: ''
-			}
+			},
+			paramCount: '',
 		};
 	},
 	onPullDownRefresh() {},
 	onLoad(option) {
+		option.current && (this.paramCount = option.current)
+	},
+	onShow() {
+		if (this.$method.isGoLogin()) { // 从公众号消息进来的没登录需要跳到登录页,登录后返回
+			return;
+		}
 		this.setSystemTime()
+		if (String(this.paramCount)) {
+			console.log('公众号', this.paramCount)
+			this.current = +this.paramCount
+			this.change(+this.paramCount)
+			return
+		}
+		
 		this.$api.getApplylist({ subscribeStatus: 1, exceedExamExpend: 2 }).then(res => {
 			if (res.data.code === 200) {
 				this.listData = res.data.rows;
 			}
 		});
-	},
-	onShow() {
 		/* if(this.current === 2 && this.$method.isLogin()){
 			this.$refs.refMy.init();
 		} */
@@ -188,6 +244,13 @@ export default {
 	},
 	methods: {
 		...mapActions(['setSystemTime']),
+		toSign(item) {
+			console.log('item', item)
+			uni.navigateTo({
+				url: '/pages2/exam/signCommit?reportStatus=' + item.reportStatus + '&reportFile=' + item.reportFile + '&subscribeId=' + item.subscribeId +
+				'&phone=' + item.telphone
+			})
+		},
 		isShowFun(times) {
 			// var timestamp = parseInt(new Date().getTime() / 1000);
 			var newDataAge = parseInt(new Date(new Date(this.sysTime*1000).toLocaleDateString()).getTime() / 1000);
@@ -265,9 +328,9 @@ export default {
 				});
 		},
 		change(index) {
-			if (this.current === index) {
-				return;
-			}
+			// if (this.current === index) {
+			// 	return;
+			// }
 			this.current = index;
 			var data = {};
 			if (index === 0) {
@@ -287,6 +350,7 @@ export default {
 					exceedExamExpend: 1
 				};
 			}
+			// apply/list
 			this.$api.getApplylist(data).then(res => {
 				if (res.data.code === 200) {
 					this.listData = res.data.rows;
@@ -364,10 +428,14 @@ page {
 			font-family: PingFang SC;
 			font-weight: bold;
 		}
+		.unSign {
+			text-decoration: underline;
+		}
 	}
 }
 .detailsBox {
 	width: 640rpx;
+	height: 1000rpx;
 	background: #ffffff;
 	border-radius: 24rpx;
 	.time {

+ 17 - 5
pages2/exam/exam_result.vue

@@ -154,10 +154,24 @@ export default {
 				applySiteStartTrainTime: '',
 				applySiteEndTrainTime: ''
 			},
+			paramCount: '',
 		};
 	},
 	onPullDownRefresh() {},
 	onLoad(option) {
+		option.current && (this.paramCount = option.current)
+	},
+	onShow() {
+		console.log('111111',this.paramCount)
+		if (this.$method.isGoLogin()) { // 从公众号消息进来的没登录需要跳到登录页,登录后返回
+			return;
+		}
+		if (String(this.paramCount)) {
+			console.log('公众号', this.paramCount)
+			this.current = +this.paramCount
+			this.change(+this.paramCount)
+			return
+		}
 		this.$api.getApplylist().then(res => {
 			if (res.data.code === 200) {
 				var a = [];
@@ -181,8 +195,6 @@ export default {
 				this.listData = a
 			}
 		});
-	},
-	onShow() {
 		/* if(this.current === 2 && this.$method.isLogin()){
 			this.$refs.refMy.init();
 		} */
@@ -203,9 +215,9 @@ export default {
 			this.details_show = false;
 		},
 		change(index) {
-			if (this.current === index) {
-				return;
-			}
+			// if (this.current === index) {
+			// 	return;
+			// }
 			this.current = index;
 			var data = {};
 			if (index === 0) {

+ 250 - 0
pages2/exam/signCommit.vue

@@ -0,0 +1,250 @@
+<template>
+    <view class="sign_commit">
+        <nav-bar title="签署承诺书"></nav-bar>
+        <!-- 考试疫情承诺书 -->
+      <view v-if="reportStatus == 0" class="appointmentItem">
+        <view class="title"><text class="star_red">*</text> 考试疫情承诺书</view>
+        <view class="commitment">
+          本人参加“住房和城乡建设领域施工现场专业人员岗位”考试,愿意遵守疫情防控各项管理的相关要求,秉承对自己、对他人负责的原则,承担疫情防控社会责任,郑重作出以下承诺:<br/>
+          一、充分理解并遵守考试期间考点各项防疫安全的要求。<br/>
+          二、在考试前14天内,没有到过国内疫情中风险、高风险地区,未出境,不存在自境外回国情形。<br/>
+          三、在考试前14天内,每日自觉监测体温,体温均未出现高于37.3度的情形,无发热和呼吸道门诊就诊史。<br/>
+          四、在考试前14天内,未和新冠肺炎病例或疑似病例密切接触或间接接触,没有发烧、干咳、乏力、咳痰、气短、肌肉痛或关节痛、咽喉痛、头痛、寒颤、恶心或呕吐、鼻塞、腹泻、咳血、结膜充血等疑似新冠肺炎症状。<br/>
+          五、如出现与前述第二、三、四项任何一项不符的情形之一的,本人将及时在考前向相关管理机构报告,自觉配合采取隔离或其他防疫措施,并根据情况,自愿放弃参加考试。<br/>
+          六、考试当日自行做好防护工作,佩戴防护口罩。提前抵达考点,配合查验健康码、测量体温等。<br/>
+          七、考试期间,将严格遵守应考人员考场守则及疫情防控相关管理要求,完成考试后立即离场,不扎堆,不聚集。<br/>
+          八、本人承诺遵守《应考人员安全承诺书》中所有承诺内容,若因有瞒报、谎报造成新冠肺炎疫情传播的,一经查实,由本人承担相应的法律和经济责任。
+        </view>
+      </view>
+      <view v-if="reportStatus == 0" class="appointmentItem">
+        <view class="title"><text class="star_red">*</text>签名板</view>
+        <view class="dis_stys">
+          <text style="color: #999999">请在下方签名区进行签名</text>
+          <text @click="retDraw()" mode="">清空</text>
+        </view>
+        <view class="handCenter">
+          <canvas
+            class="handWriting"
+            disable-scroll="true"
+            :catchtouchmove="true"
+            @touchstart="uploadScaleStart"
+            @touchmove="uploadScaleMove"
+            @touchend="uploadScaleEnd"
+            canvas-id="handWriting"
+          ></canvas>
+          
+        </view>
+      </view>
+      <view v-if="reportStatus == 0" class="finish_btn" @click="submits()">
+        完成签署
+      </view>
+      <view
+        v-if="reportStatus == 1"
+        style="width: 100%; height: 100vh;"
+        >
+        <image
+            style="width: 100%; height: 100%; display: block;"
+            :src="$method.splitImgHost(reportFile)"
+            mode=""
+        ></image>
+        </view>
+    </view>
+</template>
+
+<script>
+  import Handwriting from "@/common/signature.js";
+export default {
+    name: 'sign_commit',
+    data() {
+        return {
+            handwriting: '',
+            lineColor: "black",
+            slideValue: 30,
+            commitment_electr_signature: '',
+            isUploading: false,
+            reportStatus: 0, // 是否线上签署疫情防控承诺书, 1是,0否
+            baseAddress: '', // 签名转成base64
+            reportFile: '', // 文件路径
+            subscribeId: '',
+            phone: '',
+        }
+    },
+    onLoad(option) {
+        console.log('option', option)
+        const { reportStatus, reportFile, subscribeId, phone } = option
+        this.reportStatus = reportStatus
+        this.reportFile = reportFile
+        this.subscribeId = subscribeId
+        this.phone = phone
+    },
+    onReady(res) {
+      this.handwriting = new Handwriting({
+        lineColor: this.lineColor,
+        slideValue: this.slideValue, // 0, 25, 50, 75, 100
+        canvasName: "handWriting",
+      });
+    },
+    methods: {
+      retDraw() {
+        this.handwriting.retDraw()
+        this.commitment_electr_signature = ''
+      },
+      uploadScaleStart(event) {
+        this.handwriting.uploadScaleStart(event);
+      },
+      uploadScaleMove(event) {
+        this.handwriting.uploadScaleMove(event);
+      },
+      uploadScaleEnd(event) {
+        this.handwriting.uploadScaleEnd(event);
+      },
+      subCanvas() {
+        return new Promise((resolve, reject) => {
+          if (this.commitment_electr_signature) {
+            resolve();
+            return;
+          }
+          this.handwriting.saveCanvas().then((res) => {
+              if (this.handwriting.linePrack.length) {
+                console.log('签名-----res', res)
+                this.commitment_electr_signature = res
+              }
+              resolve(res)
+            })
+            .catch((err) => {
+                uni.showToast({
+                    title: "签名上传失败",
+                    icon: "error",
+                });
+                this.isUploading = false
+            });
+            
+        });
+      },
+      async submits() {
+        if (this.isUploading) {
+          return;
+        }
+        this.isUploading = true
+
+        await this.subCanvas()
+        if (!this.commitment_electr_signature) {
+            uni.showToast({
+            title: "请签名",
+            icon: "none",
+            })
+            this.isUploading = false
+            return
+        } else {
+
+            uni.getFileSystemManager().readFile({
+                filePath: this.commitment_electr_signature, //临时路径
+                encoding: 'base64', //编码格式
+                success: res => {
+                    console.log('返回结果', res)
+                    const base64 = "data:image/png;base64," + res.data
+                    console.log('sfs签名转成base64', base64)
+                    this.baseAddress = base64
+                    // return
+                    this.$http({
+                        url: '/apply/signReport',
+                        method: 'post',
+                        data: {
+                            signImageStr: this.baseAddress,
+                            subscribeId: this.subscribeId,
+                        }
+                    }).then((res) => {
+                        console.log('res', res)
+                        if (res.data.code == 200) {
+                            this.$u.toast('签署成功')
+                            uni.navigateBack()
+                        } else {
+                            this.$u.toast(res.data.msg)
+                        }
+                        this.isUploading = false
+                    }).catch((err) => {
+                        this.$u.toast('签署失败,请重新签署')
+                        this.isUploading = false
+                    })
+                },
+                fail: err => {
+                    console.log('转base64错误', err)
+                    this.isUploading = false
+                }
+            })
+                
+        }
+      },
+    },
+}
+</script>
+
+<style>
+  page {
+    background-color: #eaeef1;
+  }
+</style>
+<style lang="scss" scoped>
+.sign_commit {
+  padding-bottom: 50rpx;
+  .appointmentItem {
+    margin: 24rpx 0 40rpx;
+    .title {
+      font-size: 30rpx;
+      font-family: PingFang SC;
+      font-weight: 500;
+      color: #333333;
+      line-height: 1;
+      margin-bottom: 16rpx;
+      padding-left: 24rpx;
+      .star_red {
+        color: red;
+      }
+    }
+    .place {
+      height: 80rpx;
+      background: #ffffff;
+      border-radius: 16rpx;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 0 24rpx;
+    }
+    .commitment {
+      padding: 12rpx;
+      height: 900rpx;
+      background: #ffffff;
+      overflow-y: auto;
+    }
+    .handCenter, .dis_stys, .commitment {
+      margin: 0rpx 24rpx;
+    }
+    .dis_stys {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 16rpx;
+    }
+    .handCenter {
+        // width: 100%;
+        height: 400rpx;
+        .handWriting {
+            width: 100%;
+            height: 100%;
+            background: #fff;
+        }
+    }
+  }
+  .finish_btn {
+    // width: 100%;
+    height: 90rpx;
+    line-height: 90rpx;
+    text-align: center;
+    background-color:#1890ff;
+    font-size: 32rpx;
+    color: #fff;
+    border-radius: 10rpx;
+    margin: 20rpx 24rpx;
+  }
+}
+</style>

+ 17 - 10
pages2/learn/details.vue

@@ -54,10 +54,14 @@ export default {
     this.orderGoodsId = option.orderGoodsId || "";
     this.goodsId = Number(option.goodsId);
     this.gradeId = Number(option.gradeId);
+  },
+  onShow() {
+    if (this.$method.isGoLogin()) { // 从公众号消息进来的没登录需要跳到登录页,登录后返回
+      return;
+    }
     this.getInfo();
     this.orderInfo();
   },
-  onShow() {},
   methods: {
     orderInfo() {
       this.$api
@@ -133,15 +137,18 @@ export default {
         })
         .then((res) => {
           if (res.data.code === 200) {
-            uni.redirectTo({
-              url:
-                "/pages2/wd/course?gid=" +
-                self.gradeId +
-                "&id=" +
-                self.goodsId +
-                "&orderGoodsId=" +
-                self.orderGoodsId,
-            });
+            // uni.redirectTo({
+            //   url:
+            //     "/pages2/wd/course?gid=" +
+            //     self.gradeId +
+            //     "&id=" +
+            //     self.goodsId +
+            //     "&orderGoodsId=" +
+            //     self.orderGoodsId,
+            // });
+            uni.navigateTo({
+              url: `/pages3/polyv/detail?id=''&goodsId=${this.goodsId}&orderGoodsId=${this.orderGoodsId}&gradeId=${this.gradeId}`
+            })
           }
         });
       // uni.showModal({

+ 18 - 5
pages2/msg/detail.vue

@@ -88,6 +88,7 @@ export default {
 		},
 		//跳转页面
 		async jumpFuns(item,remindId) {
+			console.log('======items', item)
 			switch (remindId) {
 				case 1:
 				case 3:
@@ -207,10 +208,13 @@ export default {
 								if (res.data.code == 200) {
 
 									if(res.data.total > 1) {
-										this.$navTo.togo(`/pages2/wd/course?id=${item.goodsId}&gid=${item.gradeId}&orderGoodsId=${this.orderGoodsId}`);
+										// this.$navTo.togo(`/pages2/wd/course?id=${item.goodsId}&gid=${item.gradeId}&orderGoodsId=${this.orderGoodsId}`);
+										uni.navigateTo({
+											url: `/pages3/polyv/detail?id=''&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}&gradeId=${item.gradeId}`
+										})
 									} else if(res.data.total == 1) {
 										uni.navigateTo({
-											url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${this.orderGoodsId}`
+											url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${this.orderGoodsId}&gradeId=${item.gradeId}`
 										})
 									} else {
 										uni.showToast({
@@ -285,9 +289,11 @@ export default {
 							});
 						}
 						if (res.data.code === 200) {
+							// 725,645,2232
 							this.$navTo.togo('/pages2/appointment/index', {
 								goodsId: item.goodsId,
-								gradeId: item.gradeId
+								gradeId: item.gradeId,
+								orderGoodsId: this.orderGoodsId,
 							});
 						}
 					});
@@ -311,8 +317,11 @@ export default {
 			}).then(res => {
 				if (res.data.code == 200) {
 					if(res.data.total > 1) {
+						// uni.navigateTo({
+						// 	url:'/pages5/liveDetail/course?orderGoodsId='+this.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+						// })
 						uni.navigateTo({
-							url:'/pages5/liveDetail/course?orderGoodsId='+this.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+							url:'/pages3/live/detail?orderGoodsId='+this.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0&courseId=""'
 						})
 					} else if(res.data.total == 1) {
 						uni.navigateTo({
@@ -353,7 +362,9 @@ export default {
 				sectionId: item.sectionId,
 				recordingUrl: item.recordingUrl,
 				moduleId:item.moduleId || 0,
-				chapterId:item.chapterId || 0
+				chapterId:item.chapterId || 0,
+				orderGoodsId: this.orderGoodsId,
+				gradeId: item.gradeId,
 			});
 		},
 		//跳转题库题目
@@ -388,6 +399,7 @@ export default {
 			});
 		},
 		getInfo() {
+			// /app/informUser/' + data,
 			this.$api.getappinformUserId(this.id).then(res => {
 				if (res.data.code === 200) {
 					if (res.data.data.receiptStatus === 1 && (res.data.data.remindId === 2 || res.data.data.remindId === 4 || res.data.data.remindId === 24)) {
@@ -411,6 +423,7 @@ export default {
 					console.log('listDatalistData:', this.listData)
 					if(res.data.data.goodsId) {
 						if(res.data.data.gradeId) {
+							// /goods/'+ data,
 							this.$api.goodsDetail(res.data.data.goodsId).then(rs => {
 								this.goodsData = rs.data.data
 								if (

+ 8 - 5
pages2/plan/index.vue

@@ -699,17 +699,20 @@ export default {
 				}).then(res => {
 					if(res.data.code == 200) {
 						uni.navigateTo({
-							url:`/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}`
+							url:`/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&gradeId=${item.gradeId}`
 						})
 					}
 				});
 				return;
 			}
 			
-			this.$navTo.togo('/pages2/wd/course', {
-				id: item.goodsId,
-				gid:item.gradeId
-			});
+			// this.$navTo.togo('/pages2/wd/course', {
+			// 	id: item.goodsId,
+			// 	gid:item.gradeId
+			// });
+			uni.navigateTo({
+				url: `/pages3/polyv/detail?id=''&goodsId=${item.goodsId}&gradeId=${item.gradeId}`
+			})
 			return;
 		},
 		/**

+ 2 - 2
pages2/register/bind.vue

@@ -6,7 +6,7 @@
 			<view class="login_box">
 				<u-form :model="form" ref="uForm" >
 					<u-form-item ><u-input  v-model="form.realname" placeholder="学员姓名"/></u-form-item>
-					<u-form-item ><u-input v-model="form.idCard" type="idcard"  placeholder="学员身份证号"/></u-form-item>
+					<u-form-item ><u-input v-model="form.idCard" maxlength="18" type="idcard"  placeholder="学员身份证号"/></u-form-item>
 				</u-form>
 			</view>	
 			<button :disabled="isUse" class="loginBtn" @click="jumpBind">
@@ -85,7 +85,7 @@ export default {
 						}
 						
 						this.$method.setUuid(new Date().valueOf() + "")
-						that.$api.getInfo().then(resdata => {
+						that.$api.getInfo({ fromPlat: 1 }).then(resdata => {
 							if(resdata.data.code == 200){
 								that.$store.state.userInfo = resdata.data.data;
 							}

+ 10 - 11
pages2/register/register.vue

@@ -407,11 +407,11 @@ export default {
 											pwd:that.form.pwd
 										}).then(res => {
 											if (res.data.code == 200) {
-												if(res.data.data.full_info){
+												// if(res.data.data.full_info){
 													//信息完善,直接进入页面
 													uni.setStorageSync('user_account', res.data.data.user_account);
 													uni.setStorageSync('token', res.data.data.token);
-													that.$api.getInfo().then(resdata => {
+													that.$api.getInfo({ fromPlat: 1 }).then(resdata => {
 														if(resdata.data.code == 200){
 															that.$store.state.userInfo = resdata.data.data;
 															// if (this.scanCode) { // pc扫码进来登录成功
@@ -428,15 +428,14 @@ export default {
 														}
 														
 													});
-												}else{
-													//未完善信息,存为临时信息
-													uni.setStorageSync('user_account_temp', res.data.data.user_account);
-													uni.setStorageSync('token_temp', res.data.data.token);
-													// let url = this.scanCode ? '/pages2/register/bind?scanCode=' + this.scanCode : '/pages2/register/bind'
-													uni.redirectTo({
-														url: '/pages2/register/bind'
-													})
-												}	
+												// }else{
+												// 	//未完善信息,存为临时信息
+												// 	uni.setStorageSync('user_account_temp', res.data.data.user_account);
+												// 	uni.setStorageSync('token_temp', res.data.data.token);
+												// 	uni.redirectTo({
+												// 		url: '/pages2/register/bind'
+												// 	})
+												// }	
 											} else {
 												that.$u.toast(res.data.msg);
 											}

+ 35 - 16
pages2/verify/input.vue

@@ -9,7 +9,7 @@
             >学习前请提交完整审核资料</text
           >
         </view>
-        <view style="color: #007aff" @click="backPage">稍后再填</view>
+        <view style="color: #007aff" @click="refuseAgreement">稍后再填</view>
       </view>
       <u-collapse
         v-show="remarkStatus"
@@ -32,12 +32,11 @@
               :label="item.fieldName"
               :required="item.required"
               :label-width="auto"
-              :disabled="true"
               :prop="item.required ? item.fieldKey : ''"
             >
               <u-input
-                disabled
                 v-model="form.name"
+                :disabled="disName"
                 :placeholder="`请输入${item.fieldName}`"
               />
             </u-form-item>
@@ -47,11 +46,10 @@
               :label="item.fieldName"
               :required="item.required"
               :label-width="auto"
-              :disabled="true"
               :prop="item.required ? item.fieldKey : ''"
             >
               <u-input
-                disabled
+                :disabled="disCard"
                 v-model="form.idcard"
                 :placeholder="`请输入${item.fieldName}`"
               />
@@ -230,7 +228,7 @@
                   top: 20rpx;
                   left: 130rpx;
                 "
-                >竖向证件照 文件大小≤2M</text
+                >竖向白底证件照 文件大小≤2M</text
               >
               <text
                 v-if="
@@ -716,6 +714,8 @@ export default {
       orderGoodsId: 0,
       veryIdCard: "",
       veryIdName: "",
+      disName: false, // 姓名是否禁止输入
+      disCard: false, // 身份证是否禁止输入
     };
   },
   created() {
@@ -725,6 +725,7 @@ export default {
     this.orderGoodsId = Number(option.orderGoodsId);
     this.goodsId = Number(option.id);
     this.gradeId = Number(option.gradeId);
+    
     await this.getInfo();
     await this.getGoodsDetail();
   },
@@ -745,6 +746,7 @@ export default {
         this.listData.forEach((item) => {
           if (item.fieldKey == "idcard") {
             this.form.idcard = this.userInfo.idCard;
+            console.log('监听监听111')
           }
           if (item.fieldKey == "telphone") {
             this.form.telphone = this.userInfo.telphone;
@@ -752,6 +754,7 @@ export default {
 
           if (item.fieldKey == "name") {
             this.form.name = this.userInfo.realname;
+            console.log('监听监听')
           }
         });
       }
@@ -759,6 +762,9 @@ export default {
   },
   methods: {
     ...mapActions(["getUserInfo"]),
+    inputName(event) {
+      console.log('enevt', event, this.form.name)
+    },
     clickIndex(inds) {
       if (inds === 0) {
         this.uploadImgs();
@@ -969,7 +975,7 @@ export default {
     },
     refuseAgreement() {
       uni.navigateBack({
-        delta: 1,
+        delta: 2,
       });
     },
     clearFun(key) {
@@ -989,6 +995,7 @@ export default {
     },
 
     async uploadDatas(data) {
+      console.log('sfsfg---data', data)
       if (this.form.recent_photos && this.form.idcard_face_photo) {
         uni.downloadFile({
           url: this.$method.splitImgHost(this.form.idcard_face_photo),
@@ -1110,7 +1117,11 @@ export default {
                                     if (res.data.code === 200) {
                                       this.$method.showToast("提交成功");
                                       this.getUserInfo();
-                                      uni.navigateBack();
+                                      setTimeout(() => {
+                                        console.log('延迟')
+                                        uni.navigateBack();
+                                      }, 1500)
+                                      
                                     } else {
                                       this.$method.showToast(res.data.msg);
                                       this.isUploading = false;
@@ -1153,7 +1164,10 @@ export default {
                                     if (res.data.code === 200) {
                                       this.$method.showToast("提交成功");
                                       this.getUserInfo();
-                                      uni.navigateBack();
+                                      setTimeout(() => {
+                                        console.log('延迟')
+                                        uni.navigateBack();
+                                      }, 1500)
                                     } else {
                                       this.$method.showToast(res.data.msg);
                                       this.isUploading = false;
@@ -1246,7 +1260,10 @@ export default {
           if (res.data.code === 200) {
             this.$method.showToast("提交成功");
             this.getUserInfo();
-            uni.navigateBack();
+            setTimeout(() => {
+              console.log('延迟')
+              uni.navigateBack();
+            }, 1500)
           } else {
             this.$method.showToast(res.data.msg);
             this.isUploading = false;
@@ -1285,7 +1302,10 @@ export default {
             if (res.data.code === 200) {
               this.$method.showToast("提交成功");
               this.getUserInfo();
-              uni.navigateBack();
+              setTimeout(() => {
+                console.log('延迟')
+                uni.navigateBack();
+              }, 1500)
             } else {
               this.$method.showToast(res.data.msg);
               this.isUploading = false;
@@ -1298,9 +1318,6 @@ export default {
       this.$set(this.form, "commitment_seal", "");
       this.titleName = "";
     },
-    backPage() {
-      uni.navigateBack();
-    },
     //提交表单
     async submitApi() {
       var data = JSON.parse(JSON.stringify(this.form));
@@ -1589,7 +1606,7 @@ export default {
      *  getbaseprofiletpgetInfo接口返回值result.data.data不存在的话说明是第一次填写资料
      */
     getInfo() {
-      console.log("getInfo");
+      console.log("getInfo", this.userInfo);
       return new Promise((resolve) => {
         var self = this;
         this.$api.getbaseprofiletpId(this.goodsId).then((res) => {
@@ -1601,6 +1618,7 @@ export default {
             if (item.fieldKey == "idcard") {
               console.log(this.userInfo.idCard, "this.userInfo.idCard");
               this.form.idcard = this.userInfo.idCard;
+              this.disCard = this.form.idcard ? true : false
               console.log(this.form.idcard);
             }
             if (item.fieldKey == "telphone") {
@@ -1612,7 +1630,8 @@ export default {
             if (item.fieldKey == "name") {
               console.log(this.userInfo.realname, "this.userInfo.realname");
               this.form.name = this.userInfo.realname;
-              console.log(this.form.name);
+              this.disName = this.form.name ? true : false
+              console.log('this.disName', this.form.name, this.disName);
             }
           });
           self.isRequired = self.listData.every((ims) => {

+ 8 - 2
pages2/verify/input2.vue

@@ -240,7 +240,10 @@ export default {
 					this.isUploading = false;
 					if (res.data.code === 200) {
 						self.$method.showToast('提交成功');
-						uni.navigateBack();
+						setTimeout(() => {
+							console.log('延迟')
+							uni.navigateBack();
+						}, 1500)
 					}
 				});
 			} else {
@@ -248,7 +251,10 @@ export default {
 					this.isUploading = false;
 					if (res.data.code === 200) {
 						self.$method.showToast('提交成功');
-						uni.navigateBack();
+						setTimeout(() => {
+							console.log('延迟')
+							uni.navigateBack();
+						}, 1500)
 					}
 				});
 			}

+ 4 - 1
pages2/wd/course.vue

@@ -70,9 +70,12 @@ export default {
       businessData: {},
       itemIndex: "",
       informId: '', //消息id,从公众号消息模板进来的才有
+      options: {},
     };
   },
   onLoad(option) {
+    console.log('onload的', option)
+    this.options = option
     this.goodsId = Number(option.id);
     this.gradeId = Number(option.gid);
     this.orderGoodsId = Number(option.orderGoodsId);
@@ -87,7 +90,7 @@ export default {
     this.courseCourseList();
     this.$store.getters.dictObj;
   },
-  onShow() {
+  onShow(option) {
     if (this.itemIndex !== "") {
       this.refreshByIndex();
     }

+ 22 - 3
pages3/course/detail.vue

@@ -32,6 +32,8 @@
 						<view class="prices">
 							<!-- <text class="price_sym">¥</text> -->
 							<text class="price_word">¥ {{ detail.standPrice }}</text>
+							<text v-if="detail.linePrice" class="sale"> ¥ </text>
+							<text v-if="detail.linePrice" class="price_line"> {{detail.linePrice }}</text>
 						</view>
 						<view class="noteTag">
 							<!-- <image src="/static/icon/wk_icon1.png" class="wk_icon"></image> -->
@@ -518,10 +520,13 @@ export default {
 						.then(res => {
 							if (res.data.code == 200) {
 								if(res.data.total > 1) {
-									this.$navTo.togo(`/pages2/wd/course?id=${item.goodsId}&gid=${item.gradeId}&orderGoodsId=${item.orderGoodsId}`);
+									// this.$navTo.togo(`/pages2/wd/course?id=${item.goodsId}&gid=${item.gradeId}&orderGoodsId=${item.orderGoodsId}`);
+									uni.navigateTo({
+										url: `/pages3/polyv/detail?id=''&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}&gradeId=${item.gradeId}`
+									})
 								} else if(res.data.total == 1) {
 									uni.navigateTo({
-										url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}`
+										url: `/pages3/polyv/detail?id=${res.data.rows[0].courseId}&goodsId=${item.goodsId}&orderGoodsId=${item.orderGoodsId}&gradeId=${item.gradeId}`
 									})
 								} else {
 									uni.showToast({
@@ -545,8 +550,11 @@ export default {
 			}).then(res => {
 				if (res.data.code == 200) {
 					if(res.data.total > 1) {
+						// uni.navigateTo({
+						// 	url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+						// })
 						uni.navigateTo({
-							url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+							url:'/pages3/live/detail?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0&courseId=""'
 						})
 					} else if(res.data.total == 1) {
 						uni.navigateTo({
@@ -652,6 +660,17 @@ export default {
 			font-weight: 800;
 			color: #FC3F3F;
 		}
+		.sale {
+			color: #999999;
+			font-size: 28rpx;
+			margin-left: 8rpx;
+		}
+		.price_line {
+			color: #999999;
+			font-size: 28rpx;
+			text-decoration:line-through;
+			font-weight: 400;
+		}
 	}
 	// tab
 	.tabs {

+ 278 - 106
pages3/live/detail.vue

@@ -84,7 +84,18 @@
         </view>
       </view>
       <view class="course_name">
-        <u-row>
+        <view class="course_titles">
+            <view class="video_t1" :class="{'one': !goodsData.buyNote}">{{ detail.courseName }}</view>
+            <view class="notice_wrap" v-if="goodsData.buyNote">
+              <view class="video_t1_t" @click="studyNotice"> 学员须知 </view>
+            </view>
+            <view v-if="courseTotal > 1" class="toggle_course" @click="changeCourses()">
+              <image class="img" src="/pages3/static/imgs/toggle.png"></image>
+              <view class="toggle_name">切换课程</view>
+            </view>
+            <view v-if="courseTotal > 1" class="numbers">共{{ courseTotal }}门</view>
+        </view>
+        <!-- <u-row>
           <u-col span="10">
             <view class="video_t1">{{ detail.courseName }}</view>
           </u-col>
@@ -93,7 +104,7 @@
               <view class="video_t1_t" @click="studyNotice"> 学员须知 </view>
             </div>
           </u-col>
-        </u-row>
+        </u-row> -->
       </view>
       <u-line color="#D6D6DB" />
       <view>
@@ -125,6 +136,7 @@
             <!--模块 -->
             <view v-if="item.type == 1"
               ><courseModule
+                v-if="reStart"
 								:isLive="true"
 								:orderGoodsId="orderGoodsId"
                 :sectionMaxNum="goodsData.sectionMaxNum"
@@ -142,6 +154,7 @@
             <!--章 -->
             <view v-if="item.type == 2"
               ><courseChapter
+                v-if="reStart"
 								:isLive="true"
 								:orderGoodsId="orderGoodsId"
                 :sectionMaxNum="goodsData.sectionMaxNum"
@@ -155,11 +168,13 @@
                 :isBuy="true"
                 :menuItem="item"
                 :levelId="'0-' + item.menuId"
+                :goodsType='6'
               ></courseChapter
             ></view>
             <!--节 -->
             <view v-if="item.type == 3"
               ><courseSection
+                v-if="reStart"
 								:isLive="true"
 								:orderGoodsId="orderGoodsId"
                 :sectionMaxNum="goodsData.sectionMaxNum"
@@ -539,7 +554,37 @@
       </div>
     </u-popup>
 		
-		
+		<!-- 切换课程弹窗 -->
+    <u-popup v-model="toggleCourseShow" mode="bottom" border-radius="40" :mask-close-able='false'>
+			<view class="popup_box">
+				<view class="check_head">
+            <view class="headers">
+              <view class="grade">切换课程</view>
+					    <u-icon name="close" color="#9C9C9C" size="40" @click="closePop()"></u-icon>
+            </view>
+            <view class="coruse_num">共{{ courseTotal }}门</view>
+				</view>
+				<view class="check_con">
+					<scroll-view scroll-y="true" style="height: 700rpx;">
+						<view class="course_items"  v-for="(item, index) in courseList" :key="index">
+                <view class="course_lefts">
+                  <view class="course_title">{{ item.courseName }}</view>
+                  <!-- <view class="course_pros">
+                    学习进度
+                    <text> {{ item.stuAllNum + item.recordNum }}/{{ item.secAllNum + item.examNum}}</text>
+                  </view> -->
+                </view>
+                <view class="course_rights" @click="jump(item, index)">
+                  <view class="cicles">
+                    <u-icon name="arrow-right" color="#498AFE" size="20"></u-icon>
+                  </view>
+                  <view class="intoStudy">进入学习</view>
+                </view>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</u-popup>
   </view>
 </template>
 
@@ -672,61 +717,45 @@ export default {
 			historyChatMsgList:[],
 			livingItem:'',
       bottomHeight: 0,
+      toggleCourseShow: false, // 切换课程弹窗
+      informId: '', //消息id,从公众号消息模板进来的才有
+      courseList: [], // 课程列表
+      courseTotal: 0,
+      options: {},
+      reStart: false, // 是否显示模块/章/节
     };
   },
   computed: {
     ...mapGetters(["userInfo", "playSectionId", "playChannelId", "playVID"]),
   },
   onLoad(option) {
-    console.log('option====', option)
-    this.courseId = Number(option.courseId);
+    console.log('====option', option, this.playChannelId)
+    this.options = option
+    this.courseId = option.courseId || ''
     this.goodsId = Number(option.goodsId);
 		// this.gradeId = option.gradeId || 0
     this.orderGoodsId = Number(option.orderGoodsId) || '';
-		this.updateLiveLast(null)
-    this.courseDetail();
-    this.getGoodsDetail();
-    this.getAnswerList();
-		this.studyRecordMenuAllList();
-    this.answerTimer = setInterval(() => {
-      this.getAnswerList();
-    }, 5000);
-    let noteSecond = Number(option.noteSecond);
-    if (noteSecond > 0) {
-      //我的消息跳过来,播放节
-      let item = {
-        sectionId: Number(option.sectionId),
-        recordingUrl: option.recordingUrl,
-        noteSecond: noteSecond,
-        studyDuration: noteSecond,
-      };
-      let playNextId = `moduleId${option.moduleId}chapterId${
-        option.chapterId
-      }sectionId${option.sectionId}${option.isRebuild ? "isRebuild" : ""}`;
-      this.$store.commit("setPlaySectionId", { playSectionId: item.sectionId });
-      this.$store.commit("setPlayVID", { playVID: item.recordingUrl });
-      this.$store.commit("updatePlayNextId", playNextId);
-      console.log("this.playNoteVideo");
-			
-			this.playNoteVideo(item)
-    } else {
-			this.studyRecordQueryLiveLast();
-		}
+
+    // 公众号模板消息的数据埋点
+    if (option.informId) { // 从公众号消息点击进来上报一次,其他地方进来和没登录需要跳到登录页,登录后返回的不需要上报
+      this.informId = option.informId
+      this.clickOfficial()
+    }
+    
+    this.$store.getters.dictObj;
+
   },
   onShow() {
-    var self = this;
+    if (this.$method.isGoLogin()) { // 从公众号消息进来的没登录需要跳到登录页,登录后返回
+      return;
+    }
+    this.courseCourseList();
     //相机授权
 		// this.userConfirmInfoDetail().then(res => {
 			
 		// })
-		
-		// this.getbaseprofiletplists();
-    
-    console.log(this.gradeId, 7512);
+		// this.getbaseprofiletplists();    
   },
-	onHide() {
-		
-	},
   onUnload() {
     if (this.playSectionId > 0 && this.hasStart) {
       //退出提交记录
@@ -757,56 +786,161 @@ export default {
     // websocket.sendMsg("delAction");
   },
   mounted() {
-    uni.$on("changeSection", (oldSectionId) => {
-      console.log(this.playVID);
-				this.hasStart = false;
-      this.photoConfig = false;
-      this.photoIndex = 0;
-      var polyvPlayerContext = this.selectComponent("#playerVideo");
-      if (polyvPlayerContext) {
-        //解决同个节视频切换问题
-        polyvPlayerContext.seek(0);
-        polyvPlayerContext.pause();
-      }
-      //清除直播
-      this.$store.commit("setPlayChannelId", { playChannelId: 0 });
-      this.postStudyRecord(0, oldSectionId);
-    });
-    uni.$on("getSection", (item) => {
-      //清除直播
-				this.hasStart = false;
-      this.isPlayRebuild = item.rebuild;
-      this.photoConfig = false;
-      this.photoIndex = 0;
-      this.sectionItem = item;
-      this.$store.commit("setPlayChannelId", { playChannelId: 0 });
-      //获取拍照历史
-      this.getPhotoLastRecord();
-			this.polyvLiveHistoryChatMsgList();
-      this.playVideo(item);
-    });
-    uni.$on("levelId", (item) => {
-      let arr = item.split("-");
-      //点击节获取的各层级ID
-      this.moduleId = arr[0];
-      this.chapterId = arr[1];
-    });
-    uni.$on("getChannel", (item) => {
-      //清除录播
-				this.hasStart = false;
-      this.$store.commit("setPlayVID", { playVID: null });
-      this.getPhotoLastRecord();
-      this.playChannel(item);
-			this.channelItem = item;
-    });
-    uni.$on("isRebuild", (item) => {
-      console.log(item);
-      this.isRebuild = item;
-    });
-    this.updateChapterOpen(true);
   },
   methods: {
     ...mapMutations(["updateChapterOpen","updateLiveLast"]),
+    // 新增微信公众号模板消息点击数据
+    clickOfficial() {
+      this.$http({
+        url: '/data/click',
+        method: 'post',
+        data: { informId: this.informId }
+      }).then((res) => {
+        if (res.data.code == 200) {
+          console.log('埋点')
+        }
+      })
+    },
+    courseCourseList() {
+      console.log('ahhhhhhh直播hhhhhh')
+      this.courseList = []
+      this.$api.courseCourseList({
+        pageNum: 1,
+        pageSize: 100,
+        goodsId: this.goodsId,
+        gradeId: this.gradeId,
+        orderGoodsId: this.orderGoodsId,
+      }).then((res) => {
+        if (res.data.code == 200) {
+          this.courseList.push.apply(this.courseList, res.data.rows)
+          this.courseTotal = res.data.total || 0
+          if(res.data.total > 1) {
+            this.getUserWatchLast()
+          } else if(res.data.total == 1) {
+            console.log('111->this.courseId', this.courseId)
+            this.originOnShow()
+            this.originOnMount()
+          }
+        }
+      });
+    },
+    // 查询用户最后一次看的录播的信息
+    getUserWatchLast() {
+      this.$http({
+        url: '/study/record/getUserWatchLast',
+        method: 'get',
+        data: {
+          goodsId: this.goodsId
+        }
+      }).then((res) => {
+        if (res.data.code == 200) {
+          if (res.data.data && Object.keys(res.data.data).length) { //有最后一次看的录播的信息
+            this.courseId = res.data.data.courseId
+            this.originOnShow()
+            this.originOnMount()
+          } else {
+            this.toggleCourseShow = true
+          }
+          
+        }
+      })
+    },
+    originOnShow() {
+      this.updateLiveLast(null)
+      this.courseDetail();
+      this.getGoodsDetail();
+      this.getAnswerList();
+      this.studyRecordMenuAllList();
+      this.answerTimer = setInterval(() => {
+        this.getAnswerList();
+      }, 5000);
+      let option = this.options
+      let noteSecond = Number(option.noteSecond);
+      if (noteSecond > 0) {
+        //我的消息跳过来,播放节
+        let item = {
+          sectionId: Number(option.sectionId),
+          recordingUrl: option.recordingUrl,
+          noteSecond: noteSecond,
+          studyDuration: noteSecond,
+        };
+        let playNextId = `moduleId${option.moduleId}chapterId${
+          option.chapterId
+        }sectionId${option.sectionId}${option.isRebuild ? "isRebuild" : ""}`;
+        this.$store.commit("setPlaySectionId", { playSectionId: item.sectionId });
+        this.$store.commit("setPlayVID", { playVID: item.recordingUrl });
+        this.$store.commit("updatePlayNextId", playNextId);
+        // console.log("this.playNoteVideo");
+        
+        this.playNoteVideo(item)
+      } else {
+        this.studyRecordQueryLiveLast();
+      }
+    },
+    originOnMount() {
+      uni.$on("changeSection", (oldSectionId) => {
+        // console.log(this.playVID);
+				this.hasStart = false;
+        this.photoConfig = false;
+        this.photoIndex = 0;
+        var polyvPlayerContext = this.selectComponent("#playerVideo");
+        if (polyvPlayerContext) {
+          //解决同个节视频切换问题
+          polyvPlayerContext.seek(0);
+          polyvPlayerContext.pause();
+        }
+        //清除直播
+        this.$store.commit("setPlayChannelId", { playChannelId: 0 });
+        this.postStudyRecord(0, oldSectionId);
+      });
+      uni.$on("getSection", (item) => {
+        // console.log('触发事件-=====')
+        //清除直播
+          this.hasStart = false;
+        this.isPlayRebuild = item.rebuild;
+        this.photoConfig = false;
+        this.photoIndex = 0;
+        this.sectionItem = item;
+        this.$store.commit("setPlayChannelId", { playChannelId: 0 });
+        //获取拍照历史
+        this.getPhotoLastRecord();
+        this.polyvLiveHistoryChatMsgList();
+        this.playVideo(item);
+      });
+      uni.$on("levelId", (item) => {
+        let arr = item.split("-");
+        //点击节获取的各层级ID
+        this.moduleId = arr[0];
+        this.chapterId = arr[1];
+      });
+      uni.$on("getChannel", (item) => {
+        //清除录播
+          this.hasStart = false;
+        this.$store.commit("setPlayVID", { playVID: null });
+        this.getPhotoLastRecord();
+        this.playChannel(item);
+        this.channelItem = item;
+      });
+      uni.$on("isRebuild", (item) => {
+        // console.log(item);
+        this.isRebuild = item;
+      });
+      this.updateChapterOpen(true);
+    },
+    changeCourses() {
+      this.toggleCourseShow = true
+    },
+    closePop() {
+      this.toggleCourseShow = false
+    },
+    // 进入学习
+    jump(item, index) {
+      this.courseId = item.courseId
+      this.reStart = false
+      this.toggleCourseShow = false
+      this.originOnShow()
+      this.originOnMount()
+    },
     clickLeft() {
       uni.navigateBack()
     },
@@ -818,7 +952,7 @@ export default {
 				orderGoodsId:this.orderGoodsId,
 				courseId:this.courseId
 			}).then(res => {
-				console.log(res,'liveres')
+				// console.log(res,'liveres')
 				this.updateLiveLast(res.data.data)
 			})
 		},
@@ -888,7 +1022,11 @@ export default {
 			let moduleId = item.moduleId || 0;
 			let chapterId = item.chapterId || 0;
 			let sectionId = item.sectionId || item.menuId;
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+item.liveUrl+'&gradeId='+this.gradeId+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId)
+      let uuid = new Date().valueOf() + ""
+      // buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+
+      item.liveUrl+'&gradeId='+this.gradeId+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+'&sectionId='+sectionId+
+      '&chapterId='+chapterId+'&moduleId='+moduleId+'&buyCourse=1'+'&ident='+uuid)
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})
@@ -1018,11 +1156,11 @@ export default {
           timeInterval: postTime ? self.photoList.join(",") : "",
 					orderGoodsId: this.orderGoodsId,
         };
-        console.log("提交接口", data);
+        // console.log("提交接口", data);
         this.$api
           .coursePhotoRecord(data)
           .then((res) => {
-						console.log(res,'postCoursePhotoRecord')
+						// console.log(res,'postCoursePhotoRecord')
             if (res.data.code == 200) {
               resolve();
             } else {
@@ -1117,10 +1255,10 @@ export default {
           // 	this.photoList.push(s)
           // 	initSpace+=spaceTime
           // }
-          console.log(this.photoList, "随机拍照时间数组11", photoNum);
+          // console.log(this.photoList, "随机拍照时间数组11", photoNum);
           this.postCoursePhotoRecord(true); //提交随机拍照时间数组
         }
-        console.log(this.photoList, "随机拍照时间数组");
+        // console.log(this.photoList, "随机拍照时间数组");
         //兼容已有观看历史
         for (let i = 0; i < this.photoList.length - 1; i++) {
           if (
@@ -1128,12 +1266,10 @@ export default {
             this.photoList[i + 1] > duration
           ) {
             this.photoIndex = i + 1;
-            //				console.log("我的修改了photoIndex")
             break;
           }
           if (duration > this.photoList[this.photoList.length - 1]) {
             this.photoIndex = this.photoList.length - 1; //取最后一个下标
-            //				console.log("我的修改了photoIndex")
             break;
           }
         }
@@ -1174,9 +1310,9 @@ export default {
     },
     playerLiveStatusChange(e) {
       const status = e.detail.status;
-      console.log("直播状态", status);
+      // console.log("直播状态", status);
       if (status === "live") {
-        console.log("开始直播");
+        // console.log("开始直播");
         //开始播放
         if (this.timer) {
           clearInterval(this.timer);
@@ -1190,7 +1326,7 @@ export default {
           //只有播放过的结束才提交,避免未开播触发结束
           this.postStudyRecord(1);
         }
-        console.log("结束直播");
+        // console.log("结束直播");
         this.livePlay = false;
         // 未开始
       }
@@ -1205,6 +1341,7 @@ export default {
         clearInterval(this.timer);
       }
       this.startStatus = true;
+      console.log('11111111111')
       this.initLive();
     },
     setLiveOption(status) {
@@ -1236,7 +1373,6 @@ export default {
 			// }
     },
     async initLive() {
-      console.log(this.playChannelId, 7111);
       this.liveObj = await this.getLiveUid(this.playChannelId);
       this.initLiveOk = true;
       let optionsData = {};
@@ -1262,7 +1398,7 @@ export default {
       });
     },
     openSetting(res) {
-      console.log(res, 98);
+      // console.log(res, 98);
     },
     getCameraSetting() {
       const self = this;
@@ -1315,12 +1451,17 @@ export default {
         this.needSeek = true; //需要跳转到播放记录
       }
       this.startStatus = true;
+      console.log('222222222222')
       //获取节笔记
       this.getNoteList();
     },
     //正常播放视频
     async playVideo(item) {
       console.log(item);
+      if (item.sectionType == 3) { // 回放的不播放
+        console.log('回放的不播放')
+        return
+      }
       if (this.timer) {
         clearInterval(this.timer);
       }
@@ -1337,6 +1478,7 @@ export default {
       this.recordObj = await this.getRecordLast();
       this.needSeek = true; //跳转到播放记录
       this.startStatus = true;
+      console.log('3333333333333')
 
       //获取节笔记
       this.getNoteList();
@@ -1529,6 +1671,7 @@ export default {
       }
       let self = this;
       let data = {
+        fromPlat: 1, //来源平台 1小程序 2网站	
         photo: self.ossAvatarUrl,
         sectionId: parseInt(sectionId),
         goodsId: parseInt(self.goodsId),
@@ -1727,7 +1870,27 @@ export default {
       clearTimeout(this.toastTimer);
       this.videoToastShow = false;
     },
+    // 新增用户视频学习日志
+    studyLog() {
+      this.$http({
+        url: '/user/study/log',
+        method: 'post',
+        data: {
+          goodsId: this.goodsId,
+          courseId: this.courseId,
+					moduleId: this.moduleId || 0,
+					chapterId: this.chapterId || 0,
+          sectionId: this.playSectionId || 0,
+          fromPlat: 1, //来源平台 1小程序 2PC网站
+          goodsType: 6, // 商品类型 1视频2题库 3补考 4前培 5虚拟赠送题库 6直播
+          orderGoodsId: this.orderGoodsId,
+        }
+      }).then((res) => {
+        console.log('直播的用户学习日志:', res)
+      })
+    },
     onStateChange(newstate, oldstate) {
+      console.log('直播视频的开始播放事件', newstate.detail.newstate,this.needSeek)
       if (newstate.detail.newstate == "playing") {
         if (this.needSeek) {
           var polyvPlayerContext = this.selectComponent("#playerVideo");
@@ -1748,12 +1911,15 @@ export default {
 
           polyvPlayerContext.play();
           this.needSeek = false;
+          // 新增用户视频学习日志
+          this.studyLog()
         }
         //开始播放
         if (this.timer) {
           clearInterval(this.timer);
         }
         this.timer = setInterval(this.timeEvent, 1000); //定时器
+        
       }
       if (newstate.detail.newstate == "pause") {
         clearInterval(this.timer);
@@ -1922,8 +2088,9 @@ export default {
       }
     },
     getGoodsDetail() {
+      console.log('goodsDetail(------')
       let self = this;
-      // app/common/goods/'+ data
+      // goods/'+ data
       this.$api.goodsDetail(this.goodsId).then((res) => {
         self.goodsData = res.data.data;
         console.log(self.gradeId, "班级ID");
@@ -1958,6 +2125,7 @@ export default {
     },
     startVideo() {
       this.startStatus = true;
+      console.log('444444444')
     },
     getAnswerList() {
       let self = this;
@@ -1970,7 +2138,8 @@ export default {
         });
     },
     getMenuList() {
-      let self = this;
+      // let self = this;
+      // /course/menuList
       this.$api
         .reMenuList({ courseId: this.courseId, gradeId: this.gradeId,orderGoodsId: this.orderGoodsId, })
         .then((res) => {
@@ -1982,8 +2151,8 @@ export default {
               item.name = item.menuName;
               item.menuType = item.type;
             }
-            self.menuList = res.data.rows;
-
+            this.menuList = res.data.rows;
+            this.reStart = true
             for (let i = 0; i < res.data.rows.length; i++) {
               if (res.data.rows[i].type == 1) {
                 this.menuIndex = [i];
@@ -1993,6 +2162,8 @@ export default {
                 break;
               }
             }
+
+            console.log('--this.menuList:-', this.menuList)
           }
         });
     },
@@ -2066,6 +2237,7 @@ export default {
 </script>
 
 <style lang="scss" scope>
+@import '../polyv/css/detail.scss';
 .top {
 	&__header {
 		position:relative;

+ 132 - 0
pages3/polyv/css/detail.scss

@@ -0,0 +1,132 @@
+// 课程标题,课程切换按钮
+.course_name {
+    width: 100%;
+    height: 80rpx;
+    background-color: #fff;
+  }
+  .course_titles {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    padding: 0rpx 20rpx;
+  }
+  .video_t1 {
+    width: 405rpx;
+    height: 80rpx;
+    color: #333333;
+    line-height: 80rpx;
+    font-size: 30rpx;
+    font-family: PingFang SC;
+    font-weight: bold;
+    color: #333333;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .one {
+    width: 450rpx;
+  }
+  
+  .notice_wrap {
+    height: 80rpx;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    margin-right: 10rpx;
+    .video_t1_t {
+      width: 124rpx;
+      height: 40rpx;
+      line-height: 40rpx;
+      text-align: center;
+      background: rgba(245, 154, 35, 1);
+      color: #333;
+      border-radius: 10rpx;
+      font-size: 24rpx;
+    }
+  }
+  .toggle_course {
+    width: 230rpx;
+    height: 56rpx;
+    background: #F1F5F8;
+    border-radius: 28rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .img {
+      width: 32rpx;
+      height: 32rpx;
+      margin-right: 4rpx;
+    }
+    .toggle_name, .numbers {
+      color: #4B4B4B;
+      font-size: 24rpx;
+    }
+  }
+// 切换课程弹窗
+.popup_box {
+    width: 100%;
+    height: 938rpx;
+    padding: 56rpx 56rpx 0rpx;
+    .check_head {
+      height: 140rpx;
+      border-bottom: 2rpx solid #F0F0F0;
+    }
+    .headers {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .grade {
+        font-size: 40rpx;
+        font-weight: bold;
+        color: #222222;
+      }
+    }
+    .coruse_num {
+      margin-top: 12rpx;
+      font-size: 28rpx;
+      color: #222222;
+    }
+    .course_items {
+      width: 100%;
+      padding: 24rpx 0rpx 20rpx;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border-bottom: 2rpx solid #F0F0F0;
+      .course_lefts {
+        width: 510rpx;
+      }
+      .course_title {
+        font-size: 28rpx;
+        font-weight: 500;
+        color: #303030;
+      }
+      .course_pros {
+        font-size: 22rpx;
+        color: #969696;
+        margin-top: 16rpx;
+        >text {
+          color: #4B4B4B;
+        }
+      }
+      .course_rights {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        .cicles {
+          width: 32rpx;
+          height: 32rpx;
+          line-height: 26rpx;
+          text-align: center;
+          border-radius: 50%;
+          background-color: #D5E4FF;
+        }
+        .intoStudy {
+          font-size: 22rpx;
+          color: #498AFE;
+          margin-top: 16rpx;
+        }
+      }
+    }
+  }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 504 - 244
pages3/polyv/detail.vue


BIN
pages3/static/imgs/toggle.png


+ 12 - 18
pages4/login/login.vue

@@ -112,7 +112,7 @@ export default {
 					}
 				],
 			},
-			current: 0,
+			current: 1,
 			codeTips: '',
 			isUse:false,
 			scanCode: '', // pc端扫码登录获取的标志码
@@ -326,7 +326,7 @@ export default {
 						if (res.data.code == 200) {
 							uni.setStorageSync('union_id', res.data.data.union_id);
 							uni.setStorageSync('token', res.data.data.token);
-							that.$api.getInfo().then(resdata => {
+							that.$api.getInfo({ fromPlat: 1 }).then(resdata => {
 								if(resdata.data.code == 200){
 									uni.navigateBack();
 									that.$store.state.userInfo = resdata.data.data;
@@ -349,18 +349,16 @@ export default {
 		},
 		// 微信、密码、验证码 登录成功的回调
 		loginCallback(res, types) {
-			if(res.data.data && res.data.data.full_info){
+			console.log('登录页面:', this.isBack)
+			// if(res.data.data && res.data.data.full_info){
 				//信息完善,直接进入页面
 				uni.setStorageSync('user_account', res.data.data.user_account);
 				uni.setStorageSync('token', res.data.data.token);
-				// /app/user/getInfo 登录用户信息
-				this.$api.getInfo().then(resdata => {
+				// /app/user/getInfo 登录用户信息// fromPlat来源平台 1小程序 2PC网站
+				this.$api.getInfo({ fromPlat: 1 }).then(resdata => {
 					if(resdata.data.code == 200){
 						this.$store.state.userInfo = resdata.data.data;
 						
-						// if (this.scanCode) { // pc扫码进来登录成功
-						// 	this.submitCode()
-						// } else 
 						if(!this.isBack){
 							let goPath = ''
 							if (types == 'wxlogin' || types == 'smslogin') { //密码登录不用判断电脑goPath, 直接到首页
@@ -389,17 +387,13 @@ export default {
 					}
 					
 				});
-			} else {
-				//未完善信息,存为临时信息
-				uni.setStorageSync('user_account_temp', res.data.data.user_account);
-				uni.setStorageSync('token_temp', res.data.data.token);
-				// if (this.scanCode) {
-				// 	this.$navTo.togo('/pages2/register/bind', {scanCode: this.scanCode})
-				// } else {
-					this.$navTo.togo('/pages2/register/bind');
-				// }
+			// } else {
+			// 	//未完善信息,存为临时信息
+			// 	uni.setStorageSync('user_account_temp', res.data.data.user_account);
+			// 	uni.setStorageSync('token_temp', res.data.data.token);
+			// 	this.$navTo.togo('/pages2/register/bind');
 				
-			}	
+			// }	
 		},
 		// scanLoginCheck小程序校验PC登录二维码,执行登录获取到令牌,然后把扫码的路径最后面的6位标识码提交给后台就行
 		// submitCode() {

+ 10 - 10
pages4/login/pcLogin.vue

@@ -67,13 +67,13 @@ export default {
 		},
         // 微信登录成功的回调
 		loginCallback(res) {
-			console.log('登录后的回调',res)
-			if(res.data.data && res.data.data.full_info){
+			// console.log('登录后的回调',res)
+			// if(res.data.data && res.data.data.full_info){
 				//信息完善,直接进入页面
 				uni.setStorageSync('user_account', res.data.data.user_account);
 				uni.setStorageSync('token', res.data.data.token);
-				// /app/user/getInfo 登录用户信息
-				this.$api.getInfo().then(resdata => {
+				// /app/user/getInfo 登录用户信息// fromPlat来源平台 1小程序 2PC网站
+				this.$api.getInfo({ fromPlat: 1 }).then(resdata => {
 					if(resdata.data.code == 200){
 						this.$store.state.userInfo = resdata.data.data;
 						
@@ -81,12 +81,12 @@ export default {
 					}
 					
 				});
-			} else {
-				//未完善信息,存为临时信息
-				uni.setStorageSync('user_account_temp', res.data.data.user_account);
-				uni.setStorageSync('token_temp', res.data.data.token);
-                this.$navTo.togo('/pages2/register/bind', {scanCode: this.scanCode})
-			}	
+			// } else {
+			// 	//未完善信息,存为临时信息
+			// 	uni.setStorageSync('user_account_temp', res.data.data.user_account);
+			// 	uni.setStorageSync('token_temp', res.data.data.token);
+            //     this.$navTo.togo('/pages2/register/bind', {scanCode: this.scanCode})
+			// }	
 		},
 		// scanLoginCheck小程序校验PC登录二维码,执行登录获取到令牌,然后把扫码的路径最后面的6位标识码提交给后台就行
 		submitCode() {

+ 8 - 3
pages5/exam/index.vue

@@ -44,15 +44,20 @@ export default {
 		};
 	},
 	onLoad(){
-		this.getCount()
-		this.mockApplyMockLiving();
+		// this.getCount()
+		// this.mockApplyMockLiving();
 	},
 	onShow() {
 		// this.getInfo()
+		this.getCount()
+		this.mockApplyMockLiving();
 	},
 	methods: {
 		goLive() {
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+this.livingInfo.liveUrl)
+			let uuid = new Date().valueOf() + ""
+      		// buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+			+this.livingInfo.liveUrl+'&buyCourse=1'+'&ident='+uuid)
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})

+ 5 - 0
pages5/examBank/index.vue

@@ -1330,6 +1330,7 @@ export default {
      * 立即交卷
      */
     submitNow() {
+      console.log('sds')
       this.showpopups = false;
       this.needBack = false;
       this.submit();
@@ -1687,6 +1688,7 @@ export default {
      * @param {Object} e单选点击
      */
     radioSelect(optionsId, bindex) {
+      console.log('222', this.questionList)
       if (this.questionList[bindex].ques) return;
       this.$set(this.questionList[bindex], "ques", optionsId);
       this.isDoOver();
@@ -1696,6 +1698,7 @@ export default {
      * @param {Object} e案例单选点击
      */
     radioSelectChild(optionsId, ansIndex, bindex) {
+      console.log('3333', this.questionList)
       if (this.questionList[bindex].ques[ansIndex]) return;
       this.$set(this.questionList[bindex].ques, ansIndex, optionsId);
       this.isDoOver();
@@ -1864,6 +1867,7 @@ export default {
      * 交卷
      */
     submit() {
+      console.log('itme--', this.questionList)
       let score = 0; //计算总分
       let reportStatus = 0;
       let number = 0; //做对的题目数量
@@ -1879,6 +1883,7 @@ export default {
         if (item.type == 1) {
           //正确
           if (item.ques == item.ans) {
+            console.log('sfsofhusdho')
             item.scoreResult = item.score;
             score += item.score;
             number++;

+ 2 - 1
pages5/examCount/index.vue

@@ -36,6 +36,7 @@ export default {
 		};
 	},
 	onLoad(option){
+		console.log('option', option)
 		this.examEndTime = option.examEndTime;
 		this.mockName = option.mockName || ''
 		this.subscribeId = option.subscribeId
@@ -61,11 +62,11 @@ export default {
 		getDuring() {
 			this.nowTime = +this.$method.timest();
 			let during = this.start - this.nowTime;
+			console.log('during', during)
 			this.percent = during <= 0 ? 100 : during >= 600 ? 0 :  (600 - during) / 600 * 100;
 			if(during <= 0) {
 				return '00:00'
 			}
-			
 			let minutes = parseInt(during/60) >= 10 ? '0'+ parseInt(during/60) : parseInt(during/60);
 			let seconds = during % 60 >= 10 ? during % 60 :'0'+ during % 60;
 			

+ 59 - 10
pages5/examList/index.vue

@@ -35,16 +35,22 @@
 						</view>
 						<view class="item">
 							<view class="left">考试时间</view>
-							<view class="right">
+							<view v-if="item.mockActivity == 0" class="right">
 								{{ $method.timestampToTime(item.applySiteExamTime) }}
 								{{ item.applySiteStartTime }} - {{ item.applySiteEndTime }}
 							</view>
 						</view>
 						<view class="btn-wrap">
 							<view class="btn-line">
+								<!-- mockActivity 1是活动模考,0否 && (!item.handStatus || item.handStatus == 0)-->
+								<view v-if="item.mockActivity == 1 && (!item.handStatus || item.handStatus == 0) " class="btn"
+									:class="{'test-disabled': !(item.activityStartTime < nowTime) }"
+								 	@click="goExamCount(item,index)">去考试</view>
+								<view v-else>
 								<view class="btn test-disabled" v-if="goTest(item)" @click="goExamCount(item,index)">去考试</view>
 								<view class="btn test-disabled"  v-else-if="item.handStatus">已考试</view>
 								<view class="btn" v-else @click="goExamCount(item,index)">去考试</view>
+								</view>
 							</view>
 						</view>
 					</view>
@@ -161,6 +167,7 @@ export default {
 				applyName:''
 			},
 			nowTime:0,
+			sysTime: Date.now(),
 			dateFrom:'',
 			dateTo:'',
 			isRepeat:false,
@@ -178,11 +185,12 @@ export default {
 		...mapGetters(['userInfo'])
 	},
 	onLoad(option) {
+		console.log('查看返回的onloaddddd')
 		this.param.mockStatus = option.state || 0
 		
 		this.endDate = this.$method.timestampToTime(new Date().getTime() / 1000).replace(/-/g,'/');
 			
-		this.mockSubscribeListSubscribe();
+		// this.mockSubscribeListSubscribe();
 		uni.getSystemInfo({
 			success:(e) => {
 				let info = uni.createSelectorQuery().select(".nav");
@@ -215,10 +223,14 @@ export default {
 		}
 	},
 	onShow() {
+		
 		this.nowTime = +this.$method.timest();
-		if(this.itemIndex !== '') {
-			this.refreshByIndex();
-		}
+		console.log('sfhdsofhsoh-----onshow', this.itemIndex, this.nowTime)
+		// if(this.itemIndex !== '') {
+		// 	this.refreshByIndex();
+		// }
+		this.recordList = []
+		this.mockSubscribeListSubscribe();
 		
 	},
 	methods: {
@@ -270,6 +282,9 @@ export default {
 			})
 		},
 		goTest(item) {
+			if (item.mockActivity && item.mockActivity == 1) {
+				return false
+			}
 			let startTime = this.$method.TimeTotimestamp(this.$method.timestampToTime(item.applySiteExamTime) + ' ' + item.applySiteStartTime)
 			let canGo = (startTime-this.nowTime) <= (600) && (startTime-this.nowTime) >= (-(item.timeLimit * 60)  || 0)
 			
@@ -293,8 +308,10 @@ export default {
 			if(param.startTime) {
 				param.startTime = this.$method.TimeTotimestamp(param.startTime)
 			}
-			
+			// mock/subscribe/listSubscribe
 			this.$api.mockSubscribeListSubscribe(param).then(res => {
+				console.log('请求请求')
+				
 				this.recordList.push(...res.data.rows)
 				this.total = res.data.total
 			})
@@ -311,19 +328,51 @@ export default {
 			param.pageNum = this.itemIndex+1;
 			param.pageSize =  1
 			this.$api.mockSubscribeListSubscribe(param).then(res => {
+				console.log('res.data.rows[0]', res.data.rows[0])
 				this.$set(this.recordList,this.itemIndex,res.data.rows[0])
 				this.itemIndex = ''
 			})
 		},
 		
 		goLive(item) {
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+item.liveUrl)
+			let uuid = new Date().valueOf() + ""
+      		// buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+			+item.liveUrl+'&buyCourse=1'+'&ident='+uuid)
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})
 		},
-		
-		goExamCount(item,index) {
+		async goExamCount(item,index) {
+			console.log('item', item)
+			if (item.mockActivity && item.mockActivity == 1) {
+				if (!(item.activityStartTime < this.nowTime)) {
+					return
+				}
+				await this.$http({
+					url: '/mock/apply/addMockTime',
+					method: 'post',
+					data: {
+						applyId: item.applyId,
+						duration: item.duration,
+						majorId: item.majorId,
+						subjectId: item.subjectId
+					},
+				}).then((res) => {
+					const { examTime, startTime, endTime, eachExamId} = res.data.data
+					item.applySiteExamTime = examTime // 当前时间的时间戳
+					item.applySiteStartTime = startTime
+					item.applySiteEndTime = endTime
+					item.eachExamId = eachExamId
+					// item.applySiteExamTime = parseInt(new Date().getTime()/1000) // 当前时间的时间戳
+					// item.applySiteStartTime = this.$method.timestampToTime(new Date().getTime()/1000, false, false, true)
+					// let min = item.duration * 60 *1000 + new Date().getTime()
+					// item.applySiteEndTime = this.$method.timestampToTime(min/1000, false, false, true)
+					console.log('item', item)
+				})
+				
+			}
+			
 			if(this.goTest(item)) {
 				uni.showToast({
 					icon:'none',
@@ -331,7 +380,7 @@ export default {
 				})
 				return;
 			}
-			
+
 			this.itemIndex = index;
 			uni.navigateTo({
 				url:'../examCount/index?start='+this.$method.TimeTotimestamp(this.$method.timestampToTime(item.applySiteExamTime) + ' ' + item.applySiteStartTime)+'&limit='+item.timeLimit+'&examId='+item.examId+'&eachExamId='+item.eachExamId+'&subscribeId='+item.subscribeId+'&mockName='+item.applyName +'&examEndTime='+this.$method.TimeTotimestamp(this.$method.timestampToTime(item.applySiteExamTime) + ' ' + item.applySiteEndTime)

+ 5 - 1
pages5/examReport/index.vue

@@ -285,7 +285,10 @@ export default {
 	methods: {
 		...mapActions(['setSystemTime']),
 		goLive() {
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+this.subscribeInfo.liveUrl)
+			let uuid = new Date().valueOf() + ""
+      		// buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+			+this.subscribeInfo.liveUrl+'&buyCourse=1'+'&ident='+uuid)
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})
@@ -382,6 +385,7 @@ export default {
 		},
 		mockReport() {
 			return new Promise(resolve => {
+				// /mock/record/'+data
 				this.$api.mockReport(this.recordId).then(res => {
 					this.reportdata = res.data.data;
 					resolve()

+ 18 - 2
pages5/liveDetail/index.vue

@@ -83,7 +83,12 @@
 			</view>
 		</view>
 		<view class="bottomBox" v-if="!hideBuyState">
-			<view class="priceTag">¥ {{toFixed(detail.standPrice)}}</view>
+			<view>
+				<text class="priceTag">¥ {{toFixed(detail.standPrice)}}</text>
+				<!-- <view class="priceTag">¥ {{toFixed(detail.linePrice)}}</view> -->
+				<text v-if="detail.linePrice" class="sale"> ¥ </text>
+				<text v-if="detail.linePrice" class="price_line">&nbsp;{{ detail.linePrice }}</text>
+			</view>
 			<view style="display: flex;color: #FFFFFF;align-items: center;">
 				<view class="btn1" @click="addCart">加购物车</view>
 				<view class="btn2" @click="buy">立即购买 </view>
@@ -508,7 +513,7 @@ export default {
 		margin-right: 12rpx;
 	}
 	.noteTag{
-		ont-size: 24rpx;
+		font-size: 24rpx;
 		font-family: PingFang SC;
 		font-weight: 500;
 		color: #999999;
@@ -520,6 +525,17 @@ export default {
 		font-weight: bold;
 		color: #FF2D55;
 	}
+	.sale {
+		color: #999999;
+		font-size: 28rpx;
+		margin-left: 8rpx;
+	}
+	.price_line {
+		color: #999999;
+		font-size: 28rpx;
+		text-decoration:line-through;
+		font-weight: 400;
+	}
 	.titleTag{
 		font-size: 32rpx;
 		font-weight: bold;

+ 9 - 2
pages5/liveDetail/list.vue

@@ -120,7 +120,11 @@ export default {
 			let moduleId = item.moduleId || 0;
 			let chapterId = item.chapterId || 0;
 			let sectionId = item.sectionId || item.menuId;
-			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+item.liveUrl+'&gradeId='+0+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+'&sectionId='+sectionId+'&chapterId='+chapterId+'&moduleId='+moduleId)
+			let uuid = new Date().valueOf() + ""
+      		// buyCourse 是否购买课程:1是 0否
+			let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='
+			+item.liveUrl+'&gradeId='+0+'&courseId='+this.courseId+'&goodsId='+this.goodsId+'&orderGoodsId='+this.orderGoodsId+'&sectionId='+sectionId+'&chapterId='
+			+chapterId+'&moduleId='+moduleId+'&buyCourse=1'+'&ident='+uuid)
 			uni.navigateTo({
 				url:`../../pages/webview/index?url=`+encode
 			})
@@ -135,8 +139,11 @@ export default {
 			}).then(res => {
 				if (res.data.code == 200) {
 					if(res.data.total > 1) {
+						// uni.navigateTo({
+						// 	url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+						// })
 						uni.navigateTo({
-							url:'/pages5/liveDetail/course?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0'
+							url:'/pages3/live/detail?orderGoodsId='+item.orderGoodsId+'&goodsId='+item.goodsId+'&gradeId=0&courseId=""'
 						})
 					} else if(res.data.total == 1) {
 						uni.navigateTo({

+ 4 - 1
pages5/liveList/index.vue

@@ -161,7 +161,10 @@ export default {
 	methods: {
 		goLive(item) {
 			if(item.liveStatus == 0) { //直播中
-				let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+'&channelId='+item.liveUrl)
+				let uuid = new Date().valueOf() + ""
+				// buyCourse 是否购买课程:1是 0否
+				let encode = encodeURIComponent(WEBVIEW_URL+'pages/live/index?token='+uni.getStorageSync('token')+'&userInfo='+JSON.stringify(this.userInfo)+
+				'&channelId='+item.liveUrl+'&buyCourse=1'+'&ident='+uuid)
 				uni.navigateTo({
 					url:`../../pages/webview/index?url=`+encode
 				})

+ 302 - 0
pages5/mockExam/examApply.vue

@@ -0,0 +1,302 @@
+<template>
+<!-- 模考报名页面 -->
+    <view class="exam_apply">
+        <!-- background="{ background: '#498AFE' }" -->
+        <image class="mock_bg" src="../static/mock_bg.png"></image>
+		<!-- <u-navbar :is-back="false" title="模考报名" :border-bottom="false"  title-color="#fff" back-icon-color="#ffffff" background="{ background: '#498AFE' }">
+		</u-navbar> -->
+        <nav-bar title="模考报名" class="navbar"></nav-bar>
+        <u-line color="#D6D6DB" />
+        <view class="mains">
+            <u-form :model="examform" ref="uForm" :rules="rules" label-width='74'>
+                <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">01</text>
+                        <text class="category">姓名</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="userName" :border-bottom='false'>
+                        <view class="inputs">
+                            <input v-model.trim="examform.userName" class="uni-input" placeholder="请输入" />
+                        </view>
+                    </u-form-item>
+                </view>
+
+                <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">02</text>
+                        <text class="category">性别</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="userSex" :border-bottom='false'>
+                        <u-radio-group v-model="examform.userSex" :wrap='true' @change="radioGroupChange">
+                            <u-radio value="1" name='1'>男</u-radio>
+                            <u-radio value="2" name='2'>女</u-radio>
+                        </u-radio-group>
+                    </u-form-item>
+                </view>
+
+                <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">03</text>
+                        <text class="category">企业名称</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="companyName" :border-bottom='false'>
+                        <view class="inputs">
+                            <input v-model.trim="examform.companyName" class="uni-input" placeholder="请输入" />
+                        </view>
+                    </u-form-item>
+                </view>
+
+                <!-- <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">04</text>
+                        <text class="category">身份证号</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="userIdCard" :border-bottom='false'>
+                        <view class="inputs">
+                            <input v-model.trim="examform.userIdCard" class="uni-input" placeholder="请输入" />
+                        </view>
+                    </u-form-item>
+                </view> -->
+
+                <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">04</text>
+                        <text class="category">手机号码</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="userPhone" :border-bottom='false'>
+                        <view class="inputs">
+                            <input v-model.trim="examform.userPhone" class="uni-input" placeholder="请输入" />
+                        </view>
+                    </u-form-item>
+                </view>
+
+                <view class="items">
+                    <view class="item_title">
+                        <text class="star_red">*</text>
+                        <text class="number">05</text>
+                        <text class="category">报考科目</text>
+                    </view>
+                    <u-form-item label=" " label-width="74" prop="userMajors" :border-bottom='false'>
+                        <u-checkbox-group :wrap='true' @change="checkboxGroupChange">
+                            <u-checkbox v-model="item.checked" v-for="(item, index) in checkboxList" :key="index" :name="item.name">
+                                {{ item.name }}
+                            </u-checkbox>
+                        </u-checkbox-group>
+                    </u-form-item>
+                </view>
+            </u-form>
+            <!-- 提交按钮 -->
+            <view class="btns">
+                <view class="submits" @click="submit()">
+                    提交
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+export default {
+    name: 'examApply',
+    
+    data() {
+        var validatorMajor = (rule, value, callback) => {
+            if (value.length) {
+                callback()
+            } else {
+                callback(new Error("请选择报考科目"))
+            }
+        }
+        return {
+            examform: {
+                userName: '',
+                userSex: '',
+                companyName: '',
+                userIdCard: '',
+                userPhone: '',
+                userMajors: [],
+            },
+            rules: {
+                userName: [{ required: true, message: '请输入姓名', trigger: ['blur', 'change']}],
+                userSex: [{ required: true, message: '请选择性别', trigger: ['blur', 'change']}],
+                companyName: [{ required: true, message: '请输入企业名称', trigger: ['blur', 'change']}],
+                // userIdCard: [{ required: true, message: '请输入身份证号', trigger: ['blur', 'change']}],
+                userPhone: [{ required: true, message: '请输入手机号码', trigger: ['blur', 'change']}],
+                userMajors: [{ validator: validatorMajor, trigger: ['blur', 'change']},
+                            ],
+            },
+            checkboxList: [],
+            activityId: '', // 活动id
+            subLoading: true,
+        }
+    },
+    onLoad(option) {
+        console.log('option--: ', option)
+        if (option.scene) {
+            let tid = decodeURIComponent(option.scene)
+            this.activityId = tid.split('=')[1]
+            console.log('activityId: ', this.activityId)
+            this.getActivity()
+        }
+    },
+    onShow() {
+        // console.log('222222222222222')
+        // if (!uni.getStorageSync('user_account')) {
+		// 	uni.navigateTo({
+		// 		url: '/pages4/login/login?isBack=true'
+		// 	})
+		// 	return
+		// }
+        
+    },
+    // 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
+	onReady() {
+		this.$refs.uForm.setRules(this.rules)
+	},
+    methods: {
+        // 获取活动信息
+        getActivity() {
+            this.$http({
+                url: `/app/common/detail/${this.activityId}`,
+                method: 'get',
+                noToken: true,
+            }).then((res) => {
+                if (res.data.code == 200) {
+                    if (res.data.data.majors) {
+                        let majors = res.data.data.majors.split(',')
+                        this.checkboxList = majors.map((item) => {
+                            return {
+                                name: '《' + item + '》',
+                                checked: false
+                            }
+                        })
+                        console.log('checkboxList:', this.checkboxList)
+                    }
+                }
+            })
+        },
+		checkboxGroupChange(e) {
+            this.examform.userMajors = e
+		},
+		radioGroupChange(e) {
+			console.log(e, this.examform.userSex);
+		},
+        submit() {
+            this.$refs.uForm.validate(valid => {
+				if (valid) {
+					console.log('验证通过');
+                    if (!this.subLoading) {
+                        return
+                    }
+                    this.subLoading = false
+                    let params = {
+                        activityId: this.activityId,
+                        ...this.examform,
+                    }
+                    params.userMajors = this.examform.userMajors.join(',')
+                    console.log('eret', params)
+                    this.$http({
+                        url: '/app/common/launch',
+                        method: 'post',
+                        data: params,
+                        noToken: true,
+                    }).then((res) => {
+                        console.log('提交', res)
+                        this.subLoading = true
+                        if (res.data.code == 200) {
+                            let data = res.data.data
+                            uni.navigateTo({
+                                url: '/pages5/mockExam/registrationSuccess?endTime=' + data.endTime + '&startTime=' + data.startTime 
+                                + '&activityId=' + this.activityId
+                            })
+                        }
+                    }).catch((err) => {
+                        this.subLoading = true
+                    })
+				} else {
+					console.log('验证失败');
+				}
+			})
+            
+        }
+    },
+}
+</script>
+
+<style>
+page {
+    background-color: #F7F7F9;
+}
+</style>
+<style lang="scss" scoped>
+.exam_apply {
+    width: 100%;
+    height: 100%;
+    .mock_bg {
+        width: 100%;
+        height: 760rpx;
+        z-index: -999;
+        top: 0;
+    }
+    .navbar {
+        background-color: #498AFE;
+    }
+    .mains {
+        padding: 16rpx;
+        position: relative;
+        top: -450rpx;
+    }
+    .items {
+        padding: 40rpx 0rpx 40rpx 24rpx;
+        background-color: #fff;
+        border-radius: 16rpx;
+        margin-bottom: 16rpx;
+        .star_red {
+            color: #F84B39;
+        }
+        .number {
+            font-size: 32rpx;
+            font-weight: 800;
+            color: #222222;
+            margin: 0rpx 20rpx 0rpx 4rpx;
+        }
+        .category {
+            font-size: 32rpx;
+            font-weight: 400;
+            color: #222222;
+        }
+        .inputs {
+            width: 580rpx;
+            height: 88rpx;
+            background: #FFFFFF;
+            border-radius: 8rpx;
+            border: 2rpx solid #C2C2C2;
+            display: flex;
+            align-items: center;
+            padding-left: 24rpx;
+        }
+    }
+    .btns {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-items: center;
+    }
+    .submits {
+        width: 686rpx;
+        height: 96rpx;
+        line-height: 96rpx;
+        text-align: center;
+        background: #3F8DFD;
+        border-radius: 16rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        color: #FFFFFF;
+    }
+}
+</style>

+ 627 - 0
pages5/mockExam/registrationSuccess.vue

@@ -0,0 +1,627 @@
+<template>
+    <view class="registration_success">
+        <nav-bar title="模考报名成功"></nav-bar>
+        <view class="exam_success">
+            <image class="imgs" src="../static/ping_bg.png"></image>
+            <view class="activity_time">
+                活动时间:{{ startTime | formate('yyyy年mm月dd日')}}-{{ endTime | formate('yyyy年mm月dd日')}}
+            </view>
+        </view>
+        <view class="exam_times">
+            <view class="start_time all_time">
+                <view class="time_left">
+                    <text class="numbers">{{ startTime | getLastDay }}</text>
+                    <text class="days">天</text>
+                </view>
+                <view class="words">距模考开始时间</view>
+            </view>
+            <view class="lines"></view>
+            <view class="end_time all_time">
+                <view class="time_left">
+                    <text class="numbers">{{ endTime | getLastDay }}</text>
+                    <text class="days">天</text>
+                </view>
+                <view class="words">距模考结束时间</view>
+            </view>
+        </view>
+        <view class="mains">
+            <view class="gives">
+                送价值1109元一建《冲刺黄金包》 提分必备神器
+            </view>
+            <view class="middles">
+                <view class="qr_codes">
+                    <image class="code" src="../static/erCode.png" show-menu-by-longpress="true"></image>
+                </view>
+                <view class="discern">长按识别二维码 加活动专属微信号</view>    
+            </view>
+            <view class="middle_line">
+                <view class="half_cir_left"></view>
+                <view class="line"></view>
+                <view class="half_cir_rig"></view>
+            </view>
+            <view class="flows">
+                <view class="f_title">活动流程</view>
+                <view class="f_lines">
+                    <view class="numbers">1</view>
+                    <view class="line line_one"></view>
+                    <view class="numbers">2</view>
+                    <view class="line line_two"></view>
+                    <view class="numbers">3</view>
+                    <view class="line line_three"></view>
+                    <view class="numbers">4</view>
+                </view>
+                <view class="f_words">
+                    <view class="word word_one">预约报名</view>
+                    <view class="word word_two">扫码添加活动 专属微信号</view>
+                    <view class="word word_three">模考</view>
+                    <view class="word word_four">领福利</view>
+                </view>
+            </view>
+        </view>
+        <!-- <view class="distance_time">
+            <view class="time_item">
+                距模考开始时间还有:
+                <u-count-down v-if="sDay > 1" :timestamp="lastStartDay" :show-days="true" separator="zh" 
+					:show-hours="false" :show-minutes="false" :show-seconds="false" font-size="28"
+					bg-color="#DFECFD" separator-color="#222222" color="#222222" separator-size="28">
+				</u-count-down>
+                <text v-else>0天</text>
+            </view>
+            <view class="time_item">
+                距模考结束时间还有:
+                <u-count-down v-if="eDay > 1" :timestamp="lastEndDay" :show-days="true" separator="zh" 
+					:show-hours="false" :show-minutes="false" :show-seconds="false" font-size="28"
+					bg-color="#DFECFD" separator-color="#222222" color="#222222" separator-size="28">
+				</u-count-down>
+                <text v-else>0天</text>
+            </view>
+            <view class="time_item">活动详情请咨询业务人员或致电020-87085982/87085983</view>
+        </view> -->
+        <view class="activity_phone">
+            <view class="titles">活动咨询电话</view>
+            <view class="phone_num">020-87085982 / 18565459156</view>
+        </view>
+        <view class="exam_entry">
+            参加本次活动,请添加此次活动专属微信号
+            <!-- <text class="entrys">考试入口:</text>请进入祥粤云学堂小程序或者网站, 在个人中心找到模考功能进行考试。 -->
+        </view>
+
+        <view v-if="courseList.length" class="course_list">
+            <view class="titles">
+                <image class="code" src="../static/act_icon.png" ></image>
+                <text class="title">推荐课程</text>
+            </view>
+            <view class="list_item" v-for="(item,index) in courseList" :key="index" @click="toBuy(item)">
+                <view class="course_content">
+                    <view class="c_title">{{item.goodsName}}</view>
+                    <view class="c_downs">
+                        <view class="img">
+                            <image :src="$method.splitImgHost(item.coverUrl, true)"></image>
+                            <view class="time" v-if="item.year">{{item.year?item.year:''}}</view>
+                        </view>
+                        <view class="text">
+                            <view class="desc">
+                                <view class="left">
+                                    <text class="mon_t">¥ {{item.standPrice}}</text>
+                                    <!-- <text class="sale">/限时优惠</text> -->
+                                    <text v-if="item.linePrice" class="sale"> ¥ </text>
+                                    <text v-if="item.linePrice" class="price_line">&nbsp;{{ item.linePrice }}</text>
+                                </view>
+                                <view class="right">
+                                    <view class="regiser_row">立即购买</view>
+                                </view>
+                            </view>
+                            <view v-if="item.buyUserNum" class="joins">
+                                <!-- <image class="people" src="/static/index/people.png"></image> -->
+                                <!-- 为0时,不显示 -->
+                                <view class="people">{{ item.buyUserNum }}人参与</view>
+                            </view>
+                        </view>
+                    </view>
+                </view>					
+            </view>
+        </view>
+        
+    </view>     
+</template>
+
+<script>
+var curTime = new Date().getTime() // 当前时间的时间戳
+export default {
+    name: 'registrationSuccess',
+    data() {
+        return {
+            startTime: '',
+            endTime: '',
+            lastStartDay: '',
+            lastEndDay: '',
+            sDay: '',
+            eDay: '',
+            activityId: '',
+            courseList: [],
+        }
+    },
+    filters: {
+        getLastDay(time) {
+            console.log('time:', time)
+            var padDate = function (va) {
+                va = va < 10 ? '0' + va : va
+                return va
+            }
+            if (time) {
+                var value = new Date(time * 1000) //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+                var year = value.getFullYear()
+                var month = padDate(value.getMonth() + 1)
+                var day = padDate(value.getDate())
+                let t_value = year + '/' + month + '/' + day
+                console.log('t:', t_value)
+                let curTimeLast = new Date(new Date(t_value).toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1
+                
+                let lastStartDay = parseInt(curTimeLast/1000) - parseInt(curTime/1000)                
+                let days = parseInt(lastStartDay/24/60/60) 
+                return days >= 1 ? days : 0
+                // this.lastEndDay = parseInt(curTimeLast/1000)  - parseInt(curTime/1000)
+                // this.sDay = this.lastStartDay/24/60/60
+                // this.eDay = this.lastEndDay/24/60/60
+                // console.log('lastStartDay', this.lastStartDay, this.lastEndDay, this.sDay, this.eDay)
+            }
+        },
+        
+    },
+    onLoad(option) {
+        console.log('option: ', option)
+        this.startTime = option.startTime
+        this.endTime = option.endTime
+        this.activityId = option.activityId
+        this.getAct()
+        // this.startTime = "1663041599"
+        // this.endTime = "1663127999"
+    },
+    methods: {
+        getAct() {
+            this.$http({
+                url: `/app/common/activity/goodsList/${this.activityId}`,
+                method: 'get',
+                noToken: true,
+            }).then((res) => {
+                if (res.data.code == 200) {
+                    console.log('res', res)
+                    this.courseList = res.data.data || []
+                }
+            })
+        },
+        toBuy(item) {
+            if (item.goodsType == 1) {
+                uni.navigateTo({
+                    url: '/pages3/course/detail?id='+item.goodsId
+                })
+            } else if (item.goodsType == 2) {
+                uni.navigateTo({
+                    url: '/pages2/bank/detail?id='+item.goodsId
+                })
+            } else {
+                uni.navigateTo({
+                    url: '/pages5/liveDetail/index?id='+item.goodsId
+                })
+            }
+        },
+    }
+}
+</script>
+
+<style>
+page {
+    /* background-color: #DFECFD; */
+    background: linear-gradient(90deg, #EDF1FF 0%, #D9F0FF 100%);
+}
+</style>
+
+<style lang="scss" scoped>
+.registration_success {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.exam_success {
+    width: 100%;
+    height: 360rpx;
+    // margin-top: 68rpx;
+    display: flex;
+    align-items: center;
+    position: relative;
+    top: 0;
+    left: 0;
+    .imgs {
+        width: 100%;
+        height: 360rpx;
+        // width: 56rpx;
+        // height: 56rpx;
+    }
+    .activity_time {
+        width: 662rpx;
+        height: 72rpx;
+        line-height: 72rpx;
+        text-align: center;
+        background: rgba(255,255,255,0.7);
+        border-radius: 16rpx;
+        border: 2rpx solid #FFFFFF;
+        font-size: 30rpx;
+        font-weight: 500;
+        color: #2D5692;
+        position: absolute;
+        bottom: 12rpx;
+        left: 40rpx;
+    }
+}
+.exam_times {
+    margin-top: 28rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 670rpx;
+    height: 178rpx;
+    background: #FFFFFF;
+    border-radius: 24rpx;
+    padding: 0rpx 64rpx;
+    .all_time {
+        .time_left {
+            text-align: center;
+        }
+        .numbers {
+            font-size: 52rpx;
+            font-weight: 800;
+            color: #F67205;
+        }
+        .days {
+            font-size: 28rpx;
+            font-weight: 500;
+            color: #F67205;
+        }
+        .words {
+            font-size: 28rpx;
+            color: #6D7D94;
+            margin-top: 10rpx;
+        }
+    }
+    .time_title {
+        font-size: 48rpx;
+        font-weight: bold;
+        color: #3487FF;
+    }
+    .time_range {
+        font-size: 26rpx;
+        font-weight: 500;
+        color: #222222;
+        margin-top: 12rpx;
+    }
+    .lines {
+        width: 2rpx;
+        height: 84rpx;
+        background: #E4E4E4;
+    }
+}
+.mains {
+    width: 670rpx;
+    height: 874rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx;
+    margin-top: 36rpx;
+    .gives {
+        width: 100%;
+        height: 160rpx;
+        padding: 32rpx 60rpx;
+        background-color: #3F8DFD;
+        font-size: 36rpx;
+        font-weight: bold;
+        color: #FFFFFF;
+        line-height: 48rpx;
+        border-radius: 16rpx 16rpx 0rpx 0rpx;
+        text-align: center;
+    }
+    .middles {
+        margin-top: 48rpx;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        .qr_codes {
+            width: 268rpx;
+            height: 268rpx;
+            background: #FFFFFF;
+            border-radius: 24rpx;
+            border: 4rpx solid #91BEFF;
+            position: relative;
+            top: 0;
+            left: 0;
+            .code {
+                width: 248rpx;
+                height: 248rpx;
+                position: absolute;
+                top: 6rpx;
+                left: 6rpx;
+            }
+        }
+        .discern {
+            font-size: 28rpx;
+            font-weight: bold;
+            color: #222222;
+            margin-top: 24rpx;
+        }
+    }
+    .middle_line {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-top: 28rpx;
+        .half_cir_left {
+            width: 20rpx;
+            height: 40rpx;
+            border-radius: 0rpx 20rpx 20rpx 0rpx;
+            background-color: #DFECFD;
+        }
+        .half_cir_rig {
+            width: 20rpx;
+            height: 40rpx;
+            border-radius: 20rpx 0rpx 0rpx 20rpx;
+            background-color: #DFECFD;
+        }
+        .line {
+            width: 588rpx;
+            height: 2rpx;
+            border-bottom: 2rpx dashed #C4DCFF;
+        }
+    }
+    .flows {
+        margin-top: 18rpx;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        .f_title {
+            font-size: 32rpx;
+            font-weight: bold;
+            color: #222222;
+            position: relative;
+            top: 0rpx;
+            left: 0rpx;
+            &::after {
+                content: '';
+                width: 32rpx;
+                height: 8rpx;
+                background: #3F8DFD;
+                position: absolute;
+                bottom: -8rpx;
+                left: 40rpx;
+            }
+        }
+        .f_lines {
+            width: 500rpx;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            margin: 26rpx 0rpx 16rpx 0rpx;
+            .numbers {
+                width: 40rpx;
+                height: 40rpx;
+                line-height: 40rpx;
+                text-align: center;
+                background: #D5E6FF;
+                border-radius: 50%;
+                font-size: 24rpx;
+                font-weight: bold;
+                color: #3F8DFD;
+            }
+            .line {
+                height: 2rpx;
+                border-bottom: 2rpx dashed #C4DCFF;
+            }
+            .line_one {
+                width: 112rpx;
+            }
+            .line_two {
+                width: 86rpx;
+            }
+            .line_three {
+                width: 48rpx;
+            }
+        }
+        .f_words {
+            display: flex;
+            align-items: flex-start;
+            width: 526rpx;
+            justify-content: space-between;
+            .word {
+                font-size: 26rpx;
+                font-weight: 400;
+                color: #3F8DFD;
+            }
+            .word_one {
+
+            }
+            .word_two {
+                width: 156rpx;
+                text-align: center;
+            }
+        }
+    }
+}
+.distance_time {
+    margin-top: 56rpx;
+    .time_item {
+        font-size: 32rpx;
+        color: #222222;
+        margin-bottom: 24rpx;
+    }
+}
+.activity_phone {
+    margin: 40rpx 0rpx 56rpx 0rpx;
+    padding: 32rpx 0rpx 0rpx 44rpx;
+    width: 670rpx;
+    height: 148rpx;
+    background: #FFFFFF;
+    border-radius: 24rpx;
+    .titles {
+        font-size: 28rpx;
+        color: #222222;
+        margin-bottom: 12rpx;
+    }
+    .phone_num {
+        font-size: 28rpx;
+        font-weight: bold;
+        color: #3F8DFD;
+    }
+}
+.exam_entry {
+    font-size: 32rpx;
+    font-weight: 500;
+    color: #222222;
+    margin-bottom: 80rpx;
+    // margin-top: 22rpx;
+    // margin-bottom: 100rpx;
+    // width: 686rpx;
+    // height: 128rpx;
+    // background: #3F8DFD;
+    // border-radius: 16rpx;
+    // padding: 20rpx 50rpx;
+    // color: #fff;
+    // line-height: 44rpx;
+    // .entrys {
+    //     font-size: 28rpx;
+    //     font-weight: bold;
+    //     color: #FFFFFF;
+    // }
+}
+.course_list {
+    // width: 100%;
+    padding: 0rpx 32rpx;
+    box-shadow: 0px 10rpx 9rpx 1rpx rgba(165, 196, 239, 0.1);			
+    .titles {
+        margin-left: 10rpx;
+        margin-bottom: 32rpx;
+        .code {
+            width: 38rpx;
+            height: 24rpx;
+        }
+        .title {
+            font-size: 40rpx;
+            font-family: OPPOSans-Bold, OPPOSans;
+            font-weight: bold;
+            color: #222222;
+            margin-left: 14rpx;
+        }
+    }
+    .list_item {
+        padding: 24rpx;
+        // height: 278rpx;
+        background: #FFFFFF;
+        box-shadow: 0rpx 0rpx 20rpx 1rpx rgba(1,99,235,0.1000);
+        border-radius: 24rpx;
+        background:#fff;
+        margin-bottom: 32rpx;
+        display: flex;
+        align-items: center;
+        .c_title {
+            font-size: 32rpx;
+            font-weight: bold;
+            margin-bottom: 24rpx;
+            font-weight: bold;
+            color: #222222;
+        }
+        .c_downs {
+            display: flex;
+        }
+        .img {
+            position:relative;
+            margin-right: 24rpx;
+            border-radius: 16rpx ;
+            overflow: hidden;
+            width: 204rpx;
+            height: 120rpx;
+            image {
+                width:100%;
+                height:100%;
+            }
+            
+            .time {
+                position:absolute;
+                bottom:0;
+                right:0;
+                width: 80rpx;
+                height: 32rpx;
+                background: rgba(1, 25, 45, 0.4);
+                color:#fff;
+                text-align: center;
+                line-height: 32rpx;
+                font-size: 24rpx;
+                border-radius: 10rpx 0px 10rpx 0px;
+            }
+        }
+        
+        .text {
+            width: 440rpx;
+            position: relative;
+            display: flex;
+            flex-direction: column;
+            justify-content: space-between;
+            height: 120rpx;
+            .joins {
+                .people {
+                    width: 160rpx;
+                    font-size: 20rpx;
+                    color: #999999;
+                    padding: 0rpx 8rpx;
+                    text-align: center;
+                    height: 36rpx;
+                    line-height: 36rpx;
+                    background: #F6F7FB;
+                    border-radius: 4px;
+                }
+                
+            }
+            .desc {
+                margin-top: 10rpx;
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                width: 100%;
+                .left {
+                    flex:1;
+                    color:#333;
+                    font-size: 26rpx;
+                    .mon_t {
+                        font-weight: bold;
+                        color: #FC3F3F;
+                        font-size: 36rpx;
+                    }
+                    .sale {
+                        color: #999999;
+                        font-size: 24rpx;
+                        margin-left: 8rpx;
+                    }
+                    .price_line {
+                        color: #999999;
+                        font-size: 24rpx;
+                        text-decoration:line-through;
+                        font-weight: 400;
+                    }
+                }
+                
+                .right {
+                    font-size: 24rpx;
+                    font-weight: bold;
+                    .regiser_row {
+                        width: 144rpx;
+                        height: 52rpx;
+                        line-height: 52rpx;
+                        text-align: center;
+                        border-radius: 16rpx;
+                        background-color: #FC3F3F;
+                        color: #fff;
+                        font-weight: 500;
+                        font-size: 26rpx;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>

BIN
pages5/static/act_icon.png


BIN
pages5/static/erCode.png


BIN
pages5/static/mock_bg.png


BIN
pages5/static/ping_bg.png


+ 17 - 31
project.config.json

@@ -1,7 +1,8 @@
 {
-  "description": "项目配置文件",
+  "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
   "packOptions": {
-    "ignore": []
+    "ignore": [],
+    "include": []
   },
   "setting": {
     "bundle": false,
@@ -31,39 +32,24 @@
     "packNpmRelationList": [],
     "minifyWXSS": true,
     "showES6CompileOption": false,
-    "minifyWXML": true
+    "minifyWXML": true,
+    "useStaticServer": true,
+    "checkInvalidKey": true,
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "disableUseStrict": false,
+    "useCompilerPlugins": false
   },
   "compileType": "miniprogram",
   "libVersion": "2.17.0",
   "appid": "wxfde43fb55c186822",
   "projectname": "miniprogram-1",
-  "debugOptions": {
-    "hidedInDevtools": []
-  },
-  "scripts": {},
-  "staticServerOptions": {
-    "baseURL": "",
-    "servePath": ""
-  },
-  "isGameTourist": false,
-  "condition": {
-    "search": {
-      "list": []
-    },
-    "conversation": {
-      "list": []
-    },
-    "game": {
-      "list": []
-    },
-    "plugin": {
-      "list": []
-    },
-    "gamePlugin": {
-      "list": []
-    },
-    "miniprogram": {
-      "list": []
-    }
+  "condition": {},
+  "editorSetting": {
+    "tabIndent": "insertSpaces",
+    "tabSize": 2
   }
 }

BIN
static/icon/collect.png


BIN
static/icon/collected.png


BIN
static/icon/computeIcon.png


BIN
static/icon/down.png


BIN
static/icon/down1.png


BIN
static/icon/jy_icon.png


BIN
static/icon/msg_icon1.png


BIN
static/icon/msg_icon2.png


BIN
static/icon/my_icon1.png


BIN
static/icon/my_icon10.png


BIN
static/icon/my_icon11.png


BIN
static/icon/my_icon12.png


BIN
static/icon/my_icon2.png


BIN
static/icon/my_icon3.png


BIN
static/icon/my_icon4.png


BIN
static/icon/my_icon5.png


BIN
static/icon/my_icon6.png


BIN
static/icon/my_icon7.png


BIN
static/icon/my_icon8.png


BIN
static/icon/my_icon9.png


BIN
static/icon/note1.png


BIN
static/icon/note2.png


BIN
static/icon/note3.png


BIN
static/icon/openSwith.png


BIN
static/icon/up.png


BIN
static/icon/up1.png


BIN
static/icon/wk_icon1.png


BIN
static/icon/wk_icon2.png


BIN
static/icon/wk_icon3.png


BIN
static/learn/learn_range.png


BIN
static/learn/living.png


BIN
static/learn/living_bg.png


BIN
static/learn/wlive_bg.png


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