chenxiong пре 3 година
родитељ
комит
81e5842e12

+ 1 - 1
common/httpList/oss.js

@@ -15,7 +15,7 @@ export default {
 		return myRequest({
 			url: '/aliyun/oss/policy',
 			method: 'get',
-			data: data
+			data: data,
 			// noToken: true
 		})
 	},

+ 11 - 3
components/course/courseChapter.vue

@@ -37,7 +37,7 @@
 </template>
 
 <script>
-import { mapGetters } from 'vuex';
+import { mapGetters,mapMutations } from 'vuex';
 import courseSection from '@/components/course/courseSection.vue';
 export default {
 	name: 'courseChapter',
@@ -46,6 +46,10 @@ export default {
 			type:Number,
 			default:1
 		},
+		needOpen:{ //是否默认展开
+			type:Boolean,
+			default:false,
+		},
 		menuItem: {
 			type: Object,
 			default: {}
@@ -90,7 +94,10 @@ export default {
 	created() {
 	},
 	mounted() {
-		
+		if(this.needOpen && this.chapterOpen) {
+			this.updateChapterOpen(false)
+			this.openChapter(this.menuItem)
+		}
 	},
 	onPageShow() {
 		if(this.isBuy) {
@@ -99,6 +106,7 @@ export default {
 		
 	},
 	methods: {
+		 ...mapMutations(['updateChapterOpen']),
 		refreshList(isRebuild) {
 			console.log(9999)
 			let moduleId = this.menuItem.moduleId?this.menuItem.moduleId:0
@@ -310,7 +318,7 @@ export default {
 				}
 			});
 		},
-	},computed: { ...mapGetters(['goodsAuditionConfigIdList']) },
+	},computed: { ...mapGetters(['goodsAuditionConfigIdList','chapterOpen']) },
 };
 </script>
 

+ 10 - 3
components/course/courseModule.vue

@@ -7,7 +7,7 @@
 		</view>
 		<view v-if="!down">
 			<view v-for="(itemM,indexM) in list" :key="indexM">
-				<courseChapter @toDo="toDo($event)" :courseId="courseId" :learningOrder="learningOrder" :goodsId="goodsId" :isBuy="isBuy" :gradeId="gradeId" :isRebuild="isRebuild"  :menuItem="itemM" :levelId="levelId+'-'+itemM.chapterId"></courseChapter>
+				<courseChapter :needOpen="needOpen" @toDo="toDo($event)" :courseId="courseId" :learningOrder="learningOrder" :goodsId="goodsId" :isBuy="isBuy" :gradeId="gradeId" :isRebuild="isRebuild"  :menuItem="itemM" :levelId="levelId+'-'+itemM.chapterId"></courseChapter>
 				<u-line v-if="indexM<list.length-1"></u-line>
 			</view>
 		</view>
@@ -15,6 +15,7 @@
 </template>
 
 <script>
+import { mapGetters } from 'vuex';
 import courseChapter from '@/components/course/courseChapter.vue';
 export default {
 	name: 'courseModule',
@@ -23,6 +24,10 @@ export default {
 			type:Number,
 			defaule:1
 		},
+		needOpen:{ //是否默认展开
+			type:Boolean,
+			default:false,
+		},
 		menuItem: {
 			type: Object,
 			default: {}
@@ -66,7 +71,9 @@ export default {
 		
 	},
 	mounted() {
-		
+		if(this.needOpen && this.chapterOpen) {
+			this.openModule(this.menuItem)
+		}
 	},
 	methods: {
 		toDo(item) {
@@ -126,7 +133,7 @@ export default {
 				}
 			});
 		},
-	}
+	},computed: { ...mapGetters(['chapterOpen']) },
 };
 </script>
 

+ 11 - 2
pages/index/index.vue

@@ -37,7 +37,7 @@
 						<u-row gutter="16">
 							<u-col span="10" >
 								<view  style="height:60rpx;">
-									<text class="t1" v-if="nearByDay > 0">距离最近一次考试还剩{{nearByDay}}天</text> 
+									<text class="t1" v-if="nearByDay !== '' && nearByDay !== null">距离最近一次考试还剩{{nearByDay}}天</text> 
 								</view>
 							</u-col>
 							<u-col offset="1" span="1">
@@ -278,7 +278,16 @@ export default {
 			this.$api.getUserSubscribeRecentExam().then(res => {
 				if(res.data.code == 200) {
 					if(res.data.data) {
-						this.nearByDay = +this.$method.GetRTime(res.data.data.applySiteExamTime);
+						let day = this.$method.timestampToTime(res.data.data.applySiteExamTime,true).replace(/-/g,'/')
+						let dayTime = day + ' ' + res.data.data.applySiteStartTime
+						let NowTime = new Date(); //考试时间
+						let examTime = new Date(dayTime); //考试时间
+						let t = (examTime.getTime() / 1000) - (NowTime.getTime() / 1000).toFixed(0);
+						if(t > 0) {
+							let day = +this.$method.GetRTime(examTime.getTime() / 1000,true)
+							this.nearByDay = day;
+						} 
+	
 						
 					}
 				}

+ 30 - 12
pages2/bank/detail.vue

@@ -29,7 +29,7 @@
 			<view class="content">
 				<view class="list" v-for="(item1, index1) in bankList" :key="index1">
 					<template v-if="item1.type == 1">
-						<view class="moduleItem" @click="clickModule" :data-id="item1.majorId" :data-index="index1">
+						<view class="moduleItem" @click="clickModule(index1,item1.majorId)">
 							<view class="courseName">{{ item1.name }}</view>
 							<view>
 								<image src="/static/icon/up.png" class="icon_up" v-if="!item1.showList"></image>
@@ -39,7 +39,7 @@
 
 						<template v-if="item1.showList">
 							<view v-for="(item2, index2) in item1.list" :key="index2">
-								<view class="section" @click="changeItem" :data-index1="index1" :data-index2="index2" :data-id="item2.chapterExamId" :data-type="item1.type">
+								<view class="section" @click="changeItem(index1,index2,item2.chapterExamId,item1.type)">
 									<image src="/static/icon/down1.png" class="icon_up" v-if="item2.showList"></image>
 									<image src="/static/icon/up1.png" class="icon_up" v-if="!item2.showList"></image>
 									<!-- <u-icon  v-if="!item2.showList" name="arrow-up"></u-icon>
@@ -58,7 +58,7 @@
 					</template>
 
 					<template v-if="item1.type == 2">
-						<view class="section" :data-index1="index1" :data-id="item1.majorId" @click="changeItem" :data-type="item1.type">
+						<view class="section" @click="changeItem(index1,'',item1.majorId,item1.type)" >
 							<image src="/static/icon/down1.png" class="icon_up" v-if="item1.showList"></image>
 							<image src="/static/icon/up1.png" class="icon_up" v-if="!item1.showList"></image>
 							<!-- <u-icon  v-if="!item1.showList" name="arrow-up"></u-icon>
@@ -152,8 +152,31 @@ export default {
 				.then(res => {
 					console.log(res);
 					this.bankList = res.data.data;
+					this.showAllCharpter();
 				});
 		},
+		/**
+		 * 展示第一个章下的节内容
+		 */
+		showAllCharpter() {
+			for(let i = 0; i < this.bankList.length; i++) {
+				if(this.bankList[i].type == 1) { //第一个是模块直接展开,再展开章下面的节
+					this.$api
+						.goodsChapterList({
+							moduleExamId: this.bankList[i].majorId
+						})
+						.then(res => {
+							this.$set(this.bankList[i], 'showList', true);
+							this.$set(this.bankList[i], 'list', res.data.data);
+							this.changeItem(i,0,this.bankList[i].list[0].chapterExamId,this.bankList[i].type)
+						});
+					break;
+				} else if(this.bankList[i].type == 2) { //第一个章展开下面的节
+					this.changeItem(i,'',this.bankList[i].majorId,this.bankList[i].type)
+					break;
+				}
+			}
+		},
 		goodsChapterList(bank, id) {
 			this.$api
 				.goodsChapterList({
@@ -187,9 +210,7 @@ export default {
 		showTest(id) {
 			return this.goodsExamConfig.find(item => item.examId == id);
 		},
-		clickModule(e) {
-			let index = e.currentTarget.dataset.index;
-			let id = e.currentTarget.dataset.id;
+		clickModule(index,id) {
 
 			if (this.bankList[index].list) {
 				this.$set(this.bankList[index], 'showList', !this.bankList[index].showList);
@@ -234,13 +255,9 @@ export default {
 		change(index) {
 			this.current = index;
 		},
-		changeItem(e) {
-			let index1 = e.currentTarget.dataset.index1;
-			let index2 = e.currentTarget.dataset.index2;
-			let id = e.currentTarget.dataset.id;
-			let type = e.currentTarget.dataset.type;
-
+		changeItem(index1,index2,id,type) {
 			if (type == 1) {
+				console.log(1)
 				if (this.bankList[index1].list[index2].list) {
 					this.$set(this.bankList[index1].list[index2], 'showList', !this.bankList[index1].list[index2].showList);
 					return;
@@ -255,6 +272,7 @@ export default {
 						this.$set(this.bankList[index1].list[index2], 'list', res.data.data);
 					});
 			} else if (type == 2) {
+				console.log(2)
 				if (this.bankList[index1].list) {
 					this.$set(this.bankList[index1], 'showList', !this.bankList[index1].showList);
 					return;

+ 29 - 1
pages2/bank/question_detail.vue

@@ -127,7 +127,8 @@ export default {
 			id: '',
 			goodsCount: {
 				totalNum: 0
-			}
+			},
+			firstEnter:true,
 		};
 	},
 	onUnload() {
@@ -205,8 +206,35 @@ export default {
 				goodsId: this.id
 			}).then(res => {
 				this.bankList = res.data.data;
+				if(this.firstEnter) {
+					this.showAllCharpter();
+					this.firstEnter = false;
+				}
+				
 			});
 		},
+		/**
+		 * 展示第一个章下的节内容
+		 */
+		showAllCharpter() {
+			for(let i = 0; i < this.bankList.length; i++) {
+				if(this.bankList[i].type == 1) { //第一个是模块直接展开,再展开章下面的节
+					this.$api
+						.goodsChapterList({
+							moduleExamId: this.bankList[i].majorId
+						})
+						.then(res => {
+							this.$set(this.bankList[i], 'showList', true);
+							this.$set(this.bankList[i], 'list', res.data.data);
+							this.changeItem(i,this.bankList[i].list[0].chapterExamId,this.bankList[i].type,0)
+						});
+					break;
+				} else if(this.bankList[i].type == 2) { //第一个章展开下面的节
+					this.changeItem(i,this.bankList[i].majorId,this.bankList[i].type,'')
+					break;
+				}
+			}
+		},
 		getDetail() {
 			this.$api.commonGoodsDetail(this.id).then(res => {
 				console.log(res);

+ 2 - 1
pages2/class/questionBank.vue

@@ -712,7 +712,8 @@ export default {
 			var self = this;
 			return new Promise((resolve, reject) => {
 				var data = {
-					imageStatus: int
+					imageStatus: int,
+					gradeId:this.gradeId
 				};
 				self.$api.aliyunpolicy(data).then(res => {
 					if (res.data.code != 200) {

+ 3 - 1
pages2/order/confirm_pay.vue

@@ -121,7 +121,6 @@ export default {
 			let data = {goodsList:list}
 			
 			this.$api.placeSmallOrder(data).then(res => {
-				self.btnNo = false
 				if(res.data.code==200){
 					uni.setStorageSync('updateCart',1) //提醒刷新购物车
 					let data = res.data.data
@@ -133,16 +132,19 @@ export default {
 					    paySign: data.sign,
 						timeStamp: String(data.timeStamp),
 					    success: function (res) {
+							self.btnNo = false
 							uni.redirectTo({
 							    url: `/pages2/order/confirm_success?sn=${data.orderSn}&isBk=${self.isBK}`
 							});
 					        console.log('success:' + JSON.stringify(res));
 					    },
 					    fail: function (err) {
+							self.btnNo = false
 					        console.log('fail:' + JSON.stringify(err));
 					    }
 					});
 				}else{
+					self.btnNo = false
 					this.modalMsg = res.data.msg;
 					this.showModal = true;
 				}

+ 15 - 7
pages2/plan/create.vue

@@ -21,11 +21,11 @@
 					<view style="line-height: 40rpx;text-align: right;" v-if="form.category">{{ form.category }}</view>
 					<view v-else style="text-align: right;">请添加网课</view>
 				</u-form-item>
-				<u-form-item label="考试日期" prop="birth" :label-width="auto">
+				<!-- <u-form-item label="考试日期" prop="birth" :label-width="auto">
 					<picker mode="date" :start="stateDate" :value="form.date" @change="bindDateChange">
 						<view class="picker">{{ form.date }}</view>
 					</picker>
-				</u-form-item>
+				</u-form-item> -->
 				<u-form-item label="学习提醒" prop="birth" :label-width="auto">
 					<picker mode="time" :value="form.time" @change="bindTimeChange">
 						<view class="picker">{{ form.time }}</view>
@@ -77,8 +77,8 @@
 					<u-line></u-line>
 				</view>
 				<view class="popup_list" v-if="list2.length !== 0">
-					<scroll-view class="list_in" scroll-y="true">
-						<view class="popup_item" v-for="(item, index) in list2" :key="index" @click="selectToast(item)">
+					<scroll-view @scrolltolower="scrolltolower" class="list_in" scroll-y="true">
+						<view class="popup_item" v-for="(item, index) in list2" :key="index" @click="selectToast(item)" v-if="index < indexRange">
 							
 								<u-checkbox
 									:disabled="item.disabled"
@@ -122,7 +122,7 @@ export default {
 			week_show: false,
 			form: {
 				category: '',
-				date: this.$method.timestampToTime(new Date().valueOf()/1000, true),
+				// date: this.$method.timestampToTime(new Date().valueOf()/1000, true),
 				time: '20:30',
 				startDate: '2021-05-07',
 				endDate: '2021-05-31',
@@ -132,6 +132,11 @@ export default {
 			calendar: 'range',
 			list: [],
 			list2: [],
+			param:{
+				pageSize:10,
+				pageNum:0,
+			},
+			indexRange:10,
 			show: false,
 			stateDate:this.$method.timestampToTime(new Date().valueOf()/1000, true),
 			calendar_show: false,
@@ -196,6 +201,9 @@ export default {
 	},
 	onShow() {},
 	methods: {
+		scrolltolower(e) {
+			this.indexRange += 10;
+		},
 		getGoods() {
 			var self = this;
 			self.$api.courseGoodsList().then(res => {
@@ -207,7 +215,7 @@ export default {
 							res.data.rows[i].coverUrl = self.$method.splitImgHost(res.data.rows[i].coverUrl);
 						}
 					}
-					self.list2 = res.data.rows;
+					this.list2 = res.data.rows;
 				}
 			});
 		},
@@ -260,7 +268,7 @@ export default {
 			let data = {
 				goodsId: goodsId,
 				reminderTime: this.form.time,
-				examDate: this.$method.TimeTotimestamp(this.form.date),
+				// examDate: this.$method.TimeTotimestamp(this.form.date),
 				startTime: this.$method.TimeTotimestamp(this.form.startDate),
 				endTime: this.$method.TimeTotimestamp(this.form.endDate),
 				studyCount: weekArray,

+ 24 - 7
pages2/plan/edit.vue

@@ -21,11 +21,11 @@
 					<view style="line-height: 40rpx;text-align: right;" v-if="form.category">{{ form.category }}</view>
 					<view v-else style="text-align: right;">请添加网课</view>
 				</u-form-item>
-				<u-form-item label="考试日期" prop="birth" :label-width="auto">
+				<!-- <u-form-item label="考试日期" prop="birth" :label-width="auto">
 					<picker mode="date" :value="form.date" @change="bindDateChange">
 						<view class="picker">{{ form.date }}</view>
 					</picker>
-				</u-form-item>
+				</u-form-item> -->
 				<u-form-item label="学习提醒" prop="birth" :label-width="auto">
 					<picker mode="time" :value="form.time" @change="bindTimeChange">
 						<view class="picker">{{ form.time }}</view>
@@ -77,8 +77,8 @@
 					<u-line></u-line>
 				</view>
 				<view class="popup_list" v-if="list2.length !== 0">
-					<scroll-view class="list_in" scroll-y="true">
-						<view class="popup_item" v-for="(item, index) in list2" :key="index">
+					<scroll-view  @scrolltolower="scrolltolower" class="list_in" scroll-y="true">
+						<view class="popup_item" v-for="(item, index) in list2" :key="index" @click="selectToast(item)" v-if="index < indexRange">
 							
 								<u-checkbox
 									:disabled="item.disabled"
@@ -121,7 +121,7 @@ export default {
 			week_show: false,
 			form: {
 				category: '',
-				date: '2021-01-01',
+				// date: '2021-01-01',
 				time: '20:30',
 				startDate: '2021-05-07',
 				endDate: '2021-05-31',
@@ -131,6 +131,11 @@ export default {
 			calendar: 'range',
 			list: [],
 			list2: [],
+			param:{
+				pageSize:10,
+				pageNum:0,
+			},
+			indexRange:10,
 			show: false,
 			calendar_show: false,
 			maxDate: '2023-01-01',
@@ -196,6 +201,9 @@ export default {
 	},
 	onShow() {},
 	methods: {
+		scrolltolower(e) {
+			this.indexRange += 10;
+		},
 		getGoods() {
 			var self = this;
 			self.$api.courseGoodsList().then(res => {
@@ -260,7 +268,7 @@ export default {
 			let data = {
 				goodsId: goodsId,
 				reminderTime: this.form.time,
-				examDate: this.$method.TimeTotimestamp(this.form.date),
+				// examDate: this.$method.TimeTotimestamp(this.form.date),
 				startTime: this.$method.TimeTotimestamp(this.form.startDate),
 				endTime: this.$method.TimeTotimestamp(this.form.endDate),
 				studyCount: weekArray,
@@ -308,6 +316,15 @@ export default {
 			console.log(34);
 			item.checked = !item.checked;
 		},
+		selectToast(item) {
+			if(item.disabled) {
+				uni.showToast({
+					icon:'none',
+					title:'选择网课(只能选同类课程)',
+					duration:3000
+				})
+			}
+		},
 		getInfo(int) {
 			var self = this;
 			this.$api.systemplanInfo({planId:this.planId}).then(res => {
@@ -315,7 +332,7 @@ export default {
 				this.form.time = res.data.data.reminderTime;
 				this.form.startDate = this.$method.timestampToTime(res.data.data.startTime);
 				this.form.endDate = this.$method.timestampToTime(res.data.data.endTime);
-				this.index_review = res.data.data.studyDay - 1;
+				this.index_review = res.data.data.studyDay;
 				this.form.week = res.data.data.studyCount;
 				res.data.data.goodsVos.forEach(item => {
 					item.coverUrl = this.$method.splitImgHost(item.coverUrl)

+ 7 - 1
pages2/plan/index.vue

@@ -401,7 +401,7 @@ export default {
 		},
 		async jumpDetail(item) {
 			
-			let currentTime = this.$method.getZeroTime();
+			let currentTime = this.$method.timest();
 			
 			if(currentTime < item.studyStartTime || currentTime > item.studyEndTime) {
 				uni.showToast({
@@ -533,6 +533,12 @@ export default {
 			this.$api.getsystemplanlist({ status: 1 }).then(result => {
 				result.data.rows.forEach((item, index) => {
 					item.show = 'none';
+					item.studyNum = 0;
+					item.pitchNum = 0;
+					item.goodsVos.forEach(vos => {
+						item.pitchNum += vos.secAllNum
+						item.studyNum += vos.stuAllNum
+					})
 				});
 				self.list = result.data.rows;
 				if (result.data.rows.length > 0) {

+ 2 - 2
pages2/verify/input.vue

@@ -479,14 +479,14 @@ export default {
 				idcard_face_photo: [
 					{
 						required: true,
-						message: '请上传身份证正面照',
+						message: '请上传身份证人像面',
 						trigger: ['change', 'blur']
 					}
 				],
 				idcard_national_photo: [
 					{
 						required: true,
-						message: '请上传身份证国徽',
+						message: '请上传身份证国徽',
 						trigger: ['change', 'blur']
 					}
 				],

+ 39 - 4
pages3/course/detail.vue

@@ -58,8 +58,8 @@
 						</view>
 						<view v-show="!item.down">
 							<view v-for="(itemM,indexM) in item.menuList"  :key="indexM">
-								<courseModule v-if="itemM.type==1" :menuItem="itemM"></courseModule>
-								<courseChapter v-if="itemM.type==2" :isBuy="false" :menuItem="itemM"></courseChapter>
+								<courseModule :needOpen="(isFirstEnter && menuIndex[0] === index && menuIndex[1] === indexM) ? true : false" v-if="itemM.type==1" :menuItem="itemM"></courseModule>
+								<courseChapter :needOpen="(isFirstEnter && menuIndex[0] === index && menuIndex[1] === indexM) ? true : false" v-if="itemM.type==2" :isBuy="false" :menuItem="itemM"></courseChapter>
 								<courseSection v-if="itemM.type==3" :isBuy="false" :menuItem="itemM"></courseSection>
 								<u-line></u-line>
 								
@@ -84,7 +84,7 @@
 import courseModule from '@/components/course/courseModule.vue';
 import courseChapter from '@/components/course/courseChapter.vue';
 import courseSection from '@/components/course/courseSection.vue';
-import { mapGetters } from 'vuex';
+import { mapGetters,mapMutations  } from 'vuex';
 export default {
 	components: {
 		courseModule,
@@ -102,6 +102,7 @@ export default {
 					name: '大纲'
 				}
 			],
+			menuIndex:[],
 			current:0,
 			detail:{},
 			courseList:[],
@@ -113,6 +114,7 @@ export default {
 			autoplay:true,
 			listenConfigList:[],
 			listenSecond:0,
+			isFirstEnter:true, //是否首次进入
 			timer:null,
 			businessData:{},
 			startTime:0
@@ -162,8 +164,10 @@ export default {
 			}
 			
 		})
+		this.updateChapterOpen(true)
 	},
 	methods: {
+		 ...mapMutations(['updateChapterOpen']),
 		courseBusiness(){
 			this.$api.courseBusiness(this.detail.businessId).then(res => {
 				this.businessData = res.data.data;
@@ -241,10 +245,41 @@ export default {
 						item.down = true
 						item.menuList = []
 					}
-					self.courseList = res.data.rows
+					self.courseList = res.data.rows;
+					this.getFirstCourse();
 				}
 			});
 		},
+		/**
+		 * 获取第一个有模块或者章的课程
+		 */
+		async getFirstCourse() {
+			for(let i = 0; i < this.courseList.length; i++) {
+				
+				let menuIndexOrFalse = await this.getCourseMenus(this.courseList[i]);
+				
+				if(menuIndexOrFalse !== false) {
+					this.menuIndex = [i,menuIndexOrFalse]
+					this.openCourse(this.courseList[i])
+					break
+				}
+			}
+		},
+		getCourseMenus(item) {
+			return new Promise(resolve => {
+				this.$api.menuList({courseId:item.courseId}).then(res => {
+					if(res.data.code==200){
+						for(let i=0;i<res.data.rows.length;i++){
+							if(res.data.rows[i].type == 1 || res.data.rows[i].type == 2) {
+								resolve(i)
+								break;
+							}
+						}
+					}
+				});
+			})
+			
+		},
 		getMenuList(item) {
 			let self = this
 			this.$api.menuList({courseId:item.courseId}).then(res => {

+ 113 - 60
pages3/polyv/detail.vue

@@ -3,7 +3,7 @@
 		<nav-bar title="课程详情" v-if="navShow"></nav-bar>
 		<view style="position: fixed;width: 100%;z-index: 999;background: #FFFFFF;" id="top">
 			<view class="video_box" v-if="!startStatus">
-				<image :src="$method.splitImgHost(detail.coverUrl)" style="width: 100%;height: 460rpx;"></image>
+				<image :src="$method.splitImgHost(detail.coverUrl)" mode="widthFix" style="width: 100%;height: 460rpx;"></image>
 				<image v-if="false" class="video_play" src="/static/play.png" @click="startVideo"></image>
 			</view>
 			<view v-else>
@@ -63,9 +63,9 @@
 			<view v-show="current == 0">
 				<view class="menuBox" v-for="(item, index) in menuList" :key="index">
 					<!--模块 -->
-					<view v-if="item.type == 1"><courseModule :courseId="courseId" :learningOrder="businessData.goodsLearningOrder" :goodsId="goodsId" :gradeId="gradeId" :isBuy="true" :menuItem="item" :levelId="item.menuId"></courseModule></view>
+					<view v-if="item.type == 1"><courseModule :needOpen="menuIndex[0] === index ? true : false" :courseId="courseId" :learningOrder="businessData.goodsLearningOrder" :goodsId="goodsId" :gradeId="gradeId" :isBuy="true" :menuItem="item" :levelId="item.menuId"></courseModule></view>
 					<!--章 -->
-					<view v-if="item.type == 2"><courseChapter :courseId="courseId" @playEnd="sectionPlayEnd($event,index)" :learningOrder="businessData.goodsLearningOrder" :goodsId="goodsId" :gradeId="gradeId" :isBuy="true" :menuItem="item" :levelId="'0-' + item.menuId"></courseChapter></view>
+					<view v-if="item.type == 2"><courseChapter :needOpen="menuIndex[0] === index ? true : false" :courseId="courseId" @playEnd="sectionPlayEnd($event,index)" :learningOrder="businessData.goodsLearningOrder" :goodsId="goodsId" :gradeId="gradeId" :isBuy="true" :menuItem="item" :levelId="'0-' + item.menuId"></courseChapter></view>
 					<!--节 -->
 					<view v-if="item.type == 3"><courseSection @playEnd="sectionPlayEnd($event,index)" :courseId="courseId" :goodsId="goodsId" :gradeId="gradeId" :isBuy="true" :menuItem="item" :levelId="'0-0-' + item.menuId"></courseSection></view>
 				</view>
@@ -195,12 +195,17 @@
 					<view class="sqzz"></view>
 				</view>
 				<view class="photoCenter">
-					<view style="width: 100%; height: 979rpx;position: fixed;" v-if="photoPopup">
+					<view style="width: 100%; height: 979rpx;position: fixed;" v-if="photoPopup && isTaking">
 						<camera device-position="front" flash="off" @error="error" style="width: 100%; height: 100%;" ></camera>
 					</view>
-					<view class="custom"><image src="/static/zhezhao.png" mode=""></image></view>
+					<view class="custom" v-if="!isTaking" ><image :src="avatarUrl" mode=""></image></view>
 				</view>
-				<view class="btnResult" @click="takePhoto">拍照</view>
+				<view class="btns">
+					<view class="btnResult" v-if="isTaking" @click="takePhoto">拍照</view>
+					<view class="btnResult" v-if="!isTaking" @click="reTake">重拍</view>
+					<view class="btnResult" v-if="!isTaking" @click="submit">确认</view>
+				</view>
+				
 			</view>
 		</view>
 
@@ -214,7 +219,7 @@ import plv from '../static/polyv-sdk/index';
 import courseModule from '@/components/course/courseModule.vue';
 import courseChapter from '@/components/course/courseChapter.vue';
 import courseSection from '@/components/course/courseSection.vue';
-import { mapGetters } from 'vuex';
+import { mapGetters, mapMutations } from 'vuex';
 export default {
 	components: {
 		courseModule,
@@ -285,6 +290,7 @@ export default {
 			noteId: 0,
 			recordObj: 0,
 			gradeDetail:{},
+			isTaking:true, //是否正在拍照
 			needSeek: false, //第一次播放是否需要跳转
 			needProfileModal:false, //是否需要资料审核弹框
 			liveObj:{},
@@ -294,6 +300,7 @@ export default {
 			photoIndex:0, //当前位于拍照的区间下标 从0开始
 			photoHistoryList:[], //已拍照历史的下标点
 			businessData:{},
+			menuIndex:[],
 			isRebuild:false, //视频是否从重修目录点击
 		};
 	},
@@ -473,8 +480,10 @@ export default {
 			console.log(item)
 			this.isRebuild = item;
 		})
+		this.updateChapterOpen(true)
 	},
 	methods: {
+		 ...mapMutations(['updateChapterOpen']),
 		/**
 		 * 模块大节播放完毕,刷新列表 
 		 */
@@ -712,30 +721,39 @@ export default {
 		},
 		//postTime 只提交随机时间
 		postCoursePhotoRecord(postTime=false) {
-			let currentTime = 0;
-			var polyvPlayerContext = this.selectComponent('#playerVideo');
-			if (polyvPlayerContext) {
-				currentTime = polyvPlayerContext.getCurrentTime();
-			}
-			let self = this;
-			let photoIndex = self.photoIndex
-			let data = {
-				photo: self.ossAvatarUrl,
-				sectionId: parseInt(self.playSectionId),
-				goodsId: parseInt(self.goodsId),
-				courseId: parseInt(self.courseId),
-				photoTime: parseInt(currentTime > 0 ? currentTime : 0),
-				gradeId: parseInt(self.gradeId),
-				photoIndex: postTime?-2:parseInt(photoIndex),//从0算起,-2只提交随机时间
-				photoNum:parseInt(self.photoNum),
-				chapterId: parseInt(self.chapterId),
-				moduleId: parseInt(self.moduleId),
-				timeInterval: postTime?self.photoList.join(','):''
-			};
-			console.log('提交接口', data);
-			this.$api.coursePhotoRecord(data).then(res => {
-				console.log(res);
-			});
+			return new Promise((resolve,reject) => {
+				
+				let currentTime = 0;
+				var polyvPlayerContext = this.selectComponent('#playerVideo');
+				if (polyvPlayerContext) {
+					currentTime = polyvPlayerContext.getCurrentTime();
+				}
+				let self = this;
+				let photoIndex = self.photoIndex
+				let data = {
+					photo: self.ossAvatarUrl,
+					sectionId: parseInt(self.playSectionId),
+					goodsId: parseInt(self.goodsId),
+					courseId: parseInt(self.courseId),
+					photoTime: parseInt(currentTime > 0 ? currentTime : 0),
+					gradeId: parseInt(self.gradeId),
+					photoIndex: postTime?-2:parseInt(photoIndex),//从0算起,-2只提交随机时间
+					photoNum:parseInt(self.photoNum),
+					chapterId: parseInt(self.chapterId),
+					moduleId: parseInt(self.moduleId),
+					timeInterval: postTime?self.photoList.join(','):''
+				};
+				console.log('提交接口', data);
+				this.$api.coursePhotoRecord(data).then(res => {
+					if(res.data.code == 200) {
+						resolve()
+					} else {
+						reject()
+					}
+				}).catch(err => {
+					reject()
+				});
+			})
 		},
 		randomNum(minNum,maxNum){ 
 		    switch(arguments.length){ 
@@ -1210,7 +1228,8 @@ export default {
 			var self = this;
 			return new Promise((resolve, reject) => {
 				var data = {
-					imageStatus: int
+					imageStatus: int,
+					gradeId:this.gradeId
 				};
 				self.$api.aliyunpolicy(data).then(res => {
 					if (res.data.code != 200) {
@@ -1247,14 +1266,16 @@ export default {
 									title: '上传失败',
 									icon: 'none'
 								});
+								this.openPhoto();
 								return;
 							}
 						},
 						fail: error => {
 							uni.showToast({
-								title: '上传接口报错' + error,
+								title: '上传接口报错,请重新拍照上传' + error,
 								icon: 'none'
 							});
+							this.openPhoto();
 							return;
 						}
 					});
@@ -1384,6 +1405,7 @@ export default {
 			polyvPlayerContext.exitFullScreen();
 			this.enableAutoRotation = false;
 			this.photoPopup = true;
+			this.isTaking = true;
 			uni.authorize({
 			     scope: 'scope.camera',
 			     success() {
@@ -1393,15 +1415,29 @@ export default {
 		},
 		async submit() {
 			const waitYS = await this.imageInfos();
-			this.postCoursePhotoRecord()
-			this.postStudyRecord(); //提交记录
-			//恢复播放
-			var polyvPlayerContext = this.selectComponent('#playerVideo');
-			if (polyvPlayerContext != null) {
-				polyvPlayerContext.play();
+			try{
+				await this.postCoursePhotoRecord()
+				this.postStudyRecord(); //提交记录
+				//恢复播放
+				
+				this.photoPopup = false;
+				this.enableAutoRotation = true;
+				var polyvPlayerContext = this.selectComponent('#playerVideo');
+				if (polyvPlayerContext != null) {
+					polyvPlayerContext.play();
+				}
+			} catch(err) {
+				uni.showToast({
+					title: '上传接口报错,请重新拍照上传' + err,
+					icon: 'none'
+				});
+				this.openPhoto();
 			}
 			
 		},
+		reTake() {
+			this.isTaking = true;
+		},
 		//确认拍照
 		takePhoto() {
 			var self = this;
@@ -1411,10 +1447,11 @@ export default {
 				success: res => {
 					console.log(res.tempImagePath);
 					self.avatarUrl = res.tempImagePath;
-					self.submit();
+					this.isTaking = false;
+					// self.submit();
 
-					self.photoPopup = false;
-					self.enableAutoRotation = true;
+					// self.photoPopup = false;
+					// self.enableAutoRotation = true;
 				},
 				fail: err => {
 					console.log(err);
@@ -1553,6 +1590,16 @@ export default {
 						item.name = item.menuName;
 					}
 					self.menuList = res.data.rows;
+					
+					for(let i=0;i<res.data.rows.length;i++){
+						if(res.data.rows[i].type == 1) {
+							this.menuIndex = [i];
+							break;
+						} else if(res.data.rows[i].type == 2) {
+							this.menuIndex = [i];
+							break;
+						}
+					}
 				}
 			});
 		},
@@ -1683,31 +1730,31 @@ export default {
 	background-color: #FFFFFF;
 	border-radius: 32px 32px 0px 0px;
 	.photoTop {
-		height: 74upx;
+		height: 74rpx;
 		display: flex;
 		align-items: center;
 		justify-content: space-between;
-		padding: 0upx 38upx;
+		padding: 0rpx 38rpx;
 		.sqzz {
-			width: 28upx;
-			height: 28upx;
+			width: 28rpx;
+			height: 28rpx;
 			display: flex;
 			align-items: center;
 			justify-content: center;
 		}
 		.centersq {
 			color: #333;
-			font-size: 30upx;
+			font-size: 30rpx;
 			font-weight: 500;
 		}
 	}
 	.photoCenter {
-		width: 750upx;
-		height: 979upx;
+		width: 750rpx;
+		height: 979rpx;
 		position: relative;
 		.custom {
-			width: 750upx;
-			height: 979upx;
+			width: 750rpx;
+			height: 979rpx;
 			position: absolute;
 			z-index: 1000;
 			top: 0;
@@ -1718,15 +1765,21 @@ export default {
 			}
 		}
 	}
-	.btnResult {
-		height: 100rpx;
-		width: 100%;
-		background-color: #07c160;
-		text-align: center;
-		line-height: 100upx;
-		color: #fff;
-		font-size: 32upx;
-		font-weight: bold;
+	
+	.btns {
+		display: flex;
+		
+		
+		.btnResult {
+			height: 100rpx;
+			flex:1;
+			background-color: #07c160;
+			text-align: center;
+			line-height: 100rpx;
+			color: #fff;
+			font-size: 32rpx;
+			font-weight: bold;
+		}
 	}
 }
 .chat_box {

+ 10 - 0
store/index.js

@@ -10,6 +10,7 @@ const store = new Vuex.Store({
 		userName: '',
 		userInfo: null,
 		dictObj: null,
+		chapterOpen:true,
 		allowLoading: true,
 		goodsAuditionConfigIdList: [], //当前访问页面的试听节ID
 		shoppingCartList: [], //购物车支付商品
@@ -52,6 +53,9 @@ const store = new Vuex.Store({
 		allowLoading: state => {
 			return state.allowLoading
 		},
+		chapterOpen: state => {
+			return state.chapterOpen
+		},
 		goodsAuditionConfigIdList: state => {
 			return state.goodsAuditionConfigIdList
 		},
@@ -85,6 +89,12 @@ const store = new Vuex.Store({
 			}
 
 		},
+		updateAllowLoading(state,isShowloading) {
+			state.allowLoading = isShowloading
+		},
+		updateChapterOpen(state,boolean) {
+			state.chapterOpen = boolean
+		},
 		updataCopyData(state, objs) {
 			state.copyData = objs
 		},