Bladeren bron

Merge branch 'master' of https://gitee.com/he2802/saas_applet

# Conflicts:
#	pages2/class/detail.vue
chenxiong 3 jaren geleden
bovenliggende
commit
f8477984b0

+ 9 - 0
common/httpList/goods.js

@@ -37,6 +37,15 @@ export default {
 			method: 'POST'
 		})
 	},
+	bankRecord(data) {
+		return myRequest({
+			url: '/bank/record',
+			data:data,
+			method: 'POST'
+		})
+	},
+	
+	
 	
 	deleteCollectQuestion(data) {
 		return myRequest({

+ 1 - 1
components/course/courseChapter.vue

@@ -71,7 +71,7 @@ export default {
 		async toDo(id,goodsId =0,moduleId = 0, chapterId = 0) {
 			
 			uni.navigateTo({
-				url:'/pages2/bank/questionBank?id='+id+'&goodsid='+goodsId+'&moduleId='+moduleId+'&chapterId='+chapterId+''
+				url:'/pages2/class/questionBank?gradeId='+this.gradeId+'&isFromVideo=1&id='+id+'&goodsid='+goodsId+'&moduleId='+moduleId+'&chapterId='+chapterId+''
 			})
 		},
 		openChapter(item){

+ 21 - 0
pages.json

@@ -342,6 +342,17 @@
 					}
 				}
 			},
+			{
+				"path": "class/questionBank",
+				"style": {
+					"navigationBarTitleText": "试卷题目",
+					"navigationStyle": "custom", // 隐藏系统导航栏
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
 			{
 				"path": "bank/questionBankExplain",
 				"style": {
@@ -523,6 +534,16 @@
 					}
 				}
 			},
+			{
+				"path": "class/question_report",
+				"style": {
+					"navigationBarTitleText": "试卷报告",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
 			{
 				"path": "subject/wrong",
 				"style": {

+ 79 - 37
pages2/bank/questionBank.vue

@@ -321,7 +321,7 @@
 					</template>
 
 					<view class="footer_btn">
-						<view class="collect" :class="{ show: goodsId ? true : false }" @click="collect(collectList[bankIndex], bankIndex)">
+						<view class="collect" :class="{ show: goodsId && !isFromVideo ? true : false }" @click="collect(collectList[bankIndex], bankIndex)">
 							<view v-if="collectList[bankIndex]">
 								<image src="/static/icon/collected.png" mode=""></image>
 								<view>取消收藏</view>
@@ -466,6 +466,8 @@ export default {
 			lastCount: 0, //剩余没有回答的题目数
 			chapterId: 0,
 			moduleId: 0,
+			isFromVideo:'',
+			gradeId:'',
 			cgType: 0 //对应设计稿弹窗编码
 		};
 	},
@@ -474,6 +476,8 @@ export default {
 		this.goodsId = option.goodsid;
 		this.chapterId = option.chapterId;
 		this.moduleId = option.moduleId;
+		this.isFromVideo = option.isFromVideo||'';
+		this.gradeId = option.gradeId || '';
 		let isBack = option.isback;
 
 		if (isBack) {
@@ -569,8 +573,9 @@ export default {
 		},
 		/**
 		 * 获取已经回答的题目数
+		 * hasSpecail (是否包含简答和案例)
 		 */
-		questionOverNum() {
+		questionOverNum(hasSpecail) {
 			let count = 0;
 			this.questionList.forEach(item => {
 				if (item.type == 1 || item.type == 2 || item.type == 3) {
@@ -579,31 +584,37 @@ export default {
 					}
 				} else if (item.type == 4) {
 					//案例题
-					let isOver = item.jsonStr.every((jsonItem, indexs) => {
-						if (jsonItem.type == 1 || jsonItem.type == 2 || jsonItem.type == 3) {
-							if (item.ques[indexs]) {
-								return true;
-							} else {
-								return false;
-							}
-						} else if (jsonItem.type == 5) {
-							console.log(jsonItem, 111);
-							if (jsonItem.ansText.text.length || jsonItem.ansText.imageList.length) {
-								return true;
-							} else {
-								return false;
+					if(hasSpecail) {
+						
+						let isOver = item.jsonStr.every((jsonItem, indexs) => {
+							if (jsonItem.type == 1 || jsonItem.type == 2 || jsonItem.type == 3) {
+								if (item.ques[indexs]) {
+									return true;
+								} else {
+									return false;
+								}
+							} else if (jsonItem.type == 5) {
+								console.log(jsonItem, 111);
+								if (jsonItem.ansText.text.length || jsonItem.ansText.imageList.length) {
+									return true;
+								} else {
+									return false;
+								}
 							}
+						});
+						
+						if (isOver) {
+							count++;
+							console.log(item, 444);
 						}
-					});
-
-					if (isOver) {
-						count++;
-						console.log(item, 444);
 					}
 				} else if (item.type == 5) {
 					//简答题
-					if (item.ansText.text.length || item.ansText.imageList.length) {
-						count++;
+					if(hasSpecail) {
+						
+						if (item.ansText.text.length || item.ansText.imageList.length) {
+							count++;
+						}
 					}
 				}
 			});
@@ -637,16 +648,18 @@ export default {
 			let score = 0; //计算总分
 			let reportStatus = 0;
 			let number = 0;
-			let allScore = 0;
 			let passScore = 0;
 			this.questionList.forEach((item, index) => {
 				passScore = item.passScore
 				if (item.type == 1) {
 					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
 						score += item.score;
 						number++;
+					} else {
+						
+							item.scoreResult = 0;
 					}
-					allScore += item.score;
 				} else if (item.type == 2) {
 					let isRight =
 						item.ques &&
@@ -655,16 +668,22 @@ export default {
 						});
 
 					if (isRight) {
+						item.scoreResult = item.score;
 						score += item.score;
 						number++;
+					} else {
+						
+							item.scoreResult = 0;
 					}
-					allScore += item.score;
 				} else if (item.type == 3) {
 					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
 						score += item.score;
 						number++;
+					} else {
+						
+						item.scoreResult = 0;
 					}
-					allScore += item.score;
 				}
 			});
 
@@ -780,17 +799,34 @@ export default {
 			} else {
 				questionList = this.questionList.length;
 			}
-			this.$api
-				.examRecord({
-					chapterExamId: this.chapterId || 0,
-					moduleExamId: this.moduleId || 0,
-					examId: this.id,
-					goodsId: this.goodsId,
-					totalQuestionNum: questionList
-				})
-				.then(res => {
-					this.recordId = res.data.data;
-				});
+			
+			if(this.isFromVideo) {  //视频课程
+				this.$api
+					.bankRecord({
+						chapterExamId: this.chapterId || 0,
+						moduleExamId: this.moduleId || 0,
+						examId: this.id,
+						goodsId: this.goodsId,
+						gradeId:this.gradeId,
+						totalQuestionNum: questionList
+					})
+					.then(res => {
+						this.recordId = res.data.data;
+					});
+			} else { //题库
+				this.$api
+					.examRecord({
+						chapterExamId: this.chapterId || 0,
+						moduleExamId: this.moduleId || 0,
+						examId: this.id,
+						goodsId: this.goodsId,
+						totalQuestionNum: questionList
+					})
+					.then(res => {
+						this.recordId = res.data.data;
+					});
+			}
+			
 		},
 		/**
 		 * @param {Object} second倒计时过滤器
@@ -1135,10 +1171,12 @@ export default {
 				if (item.type == 1) {
 					//正确
 					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
 						score += item.score;
 						number++;
 						rightQuestionIds.push(item.questionId)
 					} else { //错误
+						item.scoreResult = 0;
 						doWrongQuestionIds.push(item.questionId)
 					}
 					allScore += item.score;
@@ -1156,8 +1194,10 @@ export default {
 					if (isRight) {
 						score += item.score;
 						number++;
+						item.scoreResult = item.score;
 						rightQuestionIds.push(item.questionId)
 					} else {
+						item.scoreResult = 0;
 						doWrongQuestionIds.push(item.questionId)
 					}
 					allScore += item.score;
@@ -1167,10 +1207,12 @@ export default {
 					}
 				} else if (item.type == 3) {
 					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
 						score += item.score;
 						number++;
 						rightQuestionIds.push(item.questionId)
 					} else {
+						item.scoreResult = 0;
 						doWrongQuestionIds.push(item.questionId)
 					}
 					allScore += item.score;

+ 4 - 1
pages2/bank/question_detail.vue

@@ -133,7 +133,10 @@ export default {
 		// this.getWrongNum()
 		this.goodsBankQuestionNum();
 	},
-	onShow() {},
+	onShow() {
+		
+		this.goodsBankQuestionNum();
+	},
 	methods: {
 		getDetail() {
 			this.$api.commonGoodsDetail(this.id).then(res => {

+ 1 - 1
pages2/class/detail.vue

@@ -600,6 +600,7 @@ export default {
 			var polyvPlayerContext = this.selectComponent('#playerVideo');
 			if (polyvPlayerContext != null) {
 				let PlayCurrentTime = polyvPlayerContext.getVideoPlayDuration();
+				console.log(PlayCurrentTime,996)
 				this.studyDuration = PlayCurrentTime;
 				if (this.currentTime < PlayCurrentTime) {
 					this.playTime += PlayCurrentTime - this.currentTime;
@@ -622,7 +623,6 @@ export default {
 			}
 		},
 		onStateChange(newstate, oldstate) {
-			console.log(newstate, 6989);
 			if (newstate.detail.newstate == 'playing') {
 				if (this.needSeek) {   
 					var polyvPlayerContext = this.selectComponent('#playerVideo');

+ 1949 - 0
pages2/class/questionBank.vue

@@ -0,0 +1,1949 @@
+<template>
+	<view id="questionBank">
+		<uni-nav-bar @clickLeft="clickLeft" left-icon="back" :statusBar="true" title="试卷"></uni-nav-bar>
+		<swiper class="swiper" :current="current" @change="swiperChange" :interval="interval">
+			<swiper-item v-for="(bank, bankIndex) in questionList" :key="bankIndex">
+				<view class="pageContent">
+					<view class="pad_8 titBox">
+						<view class="firstLetter">
+							<view class="leftLetters">
+								<view class="btnType">
+									<text v-if="bank.type == 1">单选</text>
+									<text v-if="bank.type == 2">多选</text>
+									<text v-if="bank.type == 3">判断</text>
+									<text v-if="bank.type == 4">案例</text>
+									<text v-if="bank.type == 5">简答</text>
+								</view>
+								<text>{{ bankIndex + 1 }}/{{ questionList.length }}</text>
+							</view>
+							<view style="color: #666;font-size: 28rpx;">{{ countdown(lastTime) }}</view>
+							<view class="leftLetters"></view>
+						</view>
+						<view class="titles"><rich-text :nodes="bank.content"></rich-text></view>
+					</view>
+					
+					<template v-if="bank.type == 1">
+						<view class="pad_8 titBox no-margin">
+							<view v-if="!bank.ques">
+								<view v-for="(item, index) in bank.jsonStr" :key="index" class="lisSty" @click="radioSelect(item.optionsId, bankIndex)">
+									<view class="activeTI">{{ ast[index] }}</view>
+									<view class="flex_auto">{{ item.content }}</view>
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view v-for="(item, index) in bank.jsonStr" :key="index" class="lisSty">
+									<text
+										:class="{ right: item.optionsId == bank.ques || item.optionsId == bank.ans, wrong: item.optionsId == bank.ques && bank.ques != bank.ans }"
+										class="activeTI"
+									>
+										{{ ast[index] }}
+									</text>
+									<view class="flex_auto">{{ item.content }}</view>
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view class="pad_8 answer">
+									<view>正确答案:{{ ast[bank.ans - 1] }}</view>
+									<view>我的答案:{{ ast[bank.ques - 1] }}</view>
+								</view>
+								<view class="pad_8 answerInfos">
+									<view class="answerTitle">答案解析</view>
+									<view class="answerContent"><rich-text :nodes="bank.analysisContent"></rich-text></view>
+								</view>
+							</view>
+						</view>
+					</template>
+
+					<template v-if="bank.type == 2">
+						<view class="pad_8 titBox no-margin">
+							<view v-if="!bank.ques">
+								<view v-for="(item, index) in bank.jsonStr" :key="index" class="lisSty" @click="checkboxSelect(item.optionsId, bankIndex, index)">
+									<view :class="{ checked: item.checked }" class="activeTI">{{ ast[index] }}</view>
+									<view class="flex_auto">{{ item.content }}</view>
+								</view>
+							</view>
+							<view v-if="!bank.ques" class="submit_checkbox" @click="checkboxSubmit(bankIndex)">确认答案</view>
+							<view v-if="bank.ques">
+								<view v-for="(item, index) in bank.jsonStr" :key="index" class="lisSty">
+									<text
+										:class="{
+											right: bank.ques.indexOf(item.optionsId) != -1 || bank.ans.indexOf(item.optionsId) != -1,
+											wrong: bank.ques.indexOf(item.optionsId) != -1 && bank.ans.indexOf(item.optionsId) == -1
+										}"
+										class="activeTI"
+									>
+										{{ ast[index] }}
+									</text>
+									<view class="flex_auto">{{ item.content }}</view>
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view class="pad_8 answer">
+									<view>
+										正确答案:
+										<text v-for="ansItem in bank.ans">{{ ast[ansItem - 1] }}</text>
+									</view>
+									<view>
+										我的答案:
+										<text v-for="quesItem in bank.ques">{{ ast[quesItem - 1] }}</text>
+									</view>
+								</view>
+								<view class="pad_8 answerInfos">
+									<view class="answerTitle">答案解析</view>
+									<view class="answerContent"><rich-text :nodes="bank.analysisContent"></rich-text></view>
+								</view>
+							</view>
+						</view>
+					</template>
+
+					<template v-if="bank.type == 3">
+						<view class="pad_8 titBox no-margin">
+							<view v-if="!bank.ques">
+								<view v-for="(item, index) in judge" :key="index" class="lisSty" @click="judgeSelect(index, bankIndex)">
+									<view class="activeTI">{{ ast[index] }}</view>
+									{{ item }}
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view v-for="(item, index) in judge" :key="index" class="lisSty">
+									<text :class="{ right: index == bank.ques || index == bank.ans, wrong: index == bank.ques && bank.ques != bank.ans }" class="activeTI">
+										{{ ast[index] }}
+									</text>
+									{{ item }}
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view class="pad_8 answer">
+									<view>正确答案:{{ ast[bank.ans] }}</view>
+									<view>我的答案:{{ ast[bank.ques] }}</view>
+								</view>
+								<view class="pad_8 answerInfos">
+									<view class="answerTitle">答案解析</view>
+									<view class="answerContent"><rich-text :nodes="bank.analysisContent"></rich-text></view>
+								</view>
+							</view>
+						</view>
+					</template>
+
+					<!-- 简答题 -->
+					<template v-if="bank.type == 5">
+						<view class="pad_8 titBox">
+							<view class="ans">
+								<view class="ans_input" v-if="!bank.ques">
+									<view class="top flex">
+										<image :data-index="bankIndex" class="icon" @click="chooseImg(bankIndex)" src="/static/camera.png" mode=""></image>
+										<view class="progress">{{bank.ansText.imageList.length}}/4</view>
+										<view class="submit" :class="{disabled:!bank.ansText.text && hasImgs(bank)}" @click="submitAns(bankIndex)">确认答案</view>
+									</view>
+									<view class="textarea"><textarea v-model="bank.ansText.text" placeholder="在此输入答案"></textarea></view>
+									<view class="imgs">
+										<view class="img" v-for="(img, imgIndex) in bank.ansText.imageList">
+											<text @click="deleteImg(imgIndex, bankIndex)">x</text>
+											<image :src="$method.splitImgHost(img, true)"></image>
+										</view>
+									</view>
+								</view>
+								<view class="ans_submit answerInfos" v-if="bank.ques">
+									<view class="answerTitle">我的答案:</view>
+									{{ bank.ques.text }}
+									<view class="imgs"><image class="img" v-for="ques in bank.ques.imageList" :src="$method.splitImgHost(ques, true)"></image></view>
+								</view>
+							</view>
+							<view v-if="bank.ques">
+								<view class="pad_8 answerInfos">
+									<view class="answerTitle">答案解析:</view>
+									<view class="answerContent"><rich-text :nodes="bank.analysisContent"></rich-text></view>
+								</view>
+							</view>
+						</view>
+					</template>
+
+					<!-- 案例题 -->
+					<template v-if="bank.type == 4">
+						<view class="pad_8 titBox">
+							<view class="tabs">
+								<view
+									class="tab"
+									:class="{ current: tabIndex == bank.current }"
+									:key="tabIndex"
+									v-for="(tab, tabIndex) in bank.jsonStr"
+									@click="tabSelect(tabIndex, bankIndex)"
+								>
+									问题{{ tabIndex }}
+								</view>
+							</view>
+							<view v-for="(ansItem, ansIndex) in bank.jsonStr" v-if="bank.current == ansIndex" :key="ansIndex">
+								<view class="titles"><rich-text :nodes="ansItem.content"></rich-text></view>
+								<template v-if="ansItem.type == 1">
+									<view v-if="!bank.ques[ansIndex]">
+										<view
+											v-for="(option, childIndex) in ansItem.optionsList"
+											:key="childIndex"
+											class="lisSty"
+											@click="radioSelectChild(option.optionsId, ansIndex, bankIndex)"
+										>
+											<view class="activeTI">{{ ast[childIndex] }}</view>
+											<rich-text class="textChild" :nodes="option.content"></rich-text>
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view v-for="(option, childIndex) in ansItem.optionsList" :key="index" class="lisSty">
+											<text
+												:class="{
+													right: option.optionsId == bank.ques[ansIndex] || option.optionsId == bank.ans[ansIndex],
+													wrong: option.optionsId == bank.ques[ansIndex] && bank.ques[ansIndex] != bank.ans[ansIndex]
+												}"
+												class="activeTI"
+											>
+												{{ ast[childIndex] }}
+											</text>
+											<rich-text :nodes="option.content"></rich-text>
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view class="pad_8 answer">
+											<view>正确答案:{{ ast[bank.ans[ansIndex] - 1] }}</view>
+											<view>我的答案:{{ ast[bank.ques[ansIndex] - 1] }}</view>
+										</view>
+										<view class="pad_8 answerInfos">
+											<view class="answerTitle">答案解析</view>
+											<view class="answerContent"><rich-text :nodes="option.analysisContent"></rich-text></view>
+										</view>
+									</view>
+								</template>
+
+								<template v-if="ansItem.type == 2">
+									<view v-if="!bank.ques[ansIndex]">
+										<view
+											v-for="(option, childindex) in ansItem.optionsList"
+											:key="childindex"
+											class="lisSty"
+											@click="checkboxSelectChild(bankIndex, ansIndex, childindex)"
+										>
+											<view :class="{ checked: option.checked }" class="activeTI">{{ ast[childindex] }}</view>
+											<rich-text :nodes="option.content"></rich-text>
+										</view>
+									</view>
+									<view v-if="!bank.ques[ansIndex]" class="submit_checkbox" @click="checkboxSubmitChild(bankIndex, ansIndex)">确认答案</view>
+									<view v-if="bank.ques && bank.ques[ansIndex]">
+										<view v-for="(option, childindex) in ansItem.optionsList" :key="childindex" class="lisSty">
+											<text :class="{ right: right(bankIndex, ansIndex, option), wrong: wrong(bankIndex, ansIndex, option) }" class="activeTI">
+												{{ ast[childindex] }}
+											</text>
+											<rich-text :nodes="option.content"></rich-text>
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view class="pad_8 answer">
+											<view>
+												正确答案:
+												<text v-for="ansItem1 in bank.ans[ansIndex]">{{ ast[ansItem1 - 1] }}</text>
+											</view>
+											<view>
+												我的答案:
+												<text v-for="quesItem in bank.ques[ansIndex]">{{ ast[quesItem - 1] }}</text>
+											</view>
+										</view>
+										<view class="pad_8 answerInfos">
+											<view class="answerTitle">答案解析</view>
+											<view class="answerContent"><rich-text :nodes="ansItem.analysisContent"></rich-text></view>
+										</view>
+									</view>
+								</template>
+
+								<template v-if="ansItem.type == 3">
+									<view v-if="!bank.ques[ansIndex]">
+										<view v-for="(option, childindex) in judge" :key="childindex" class="lisSty" @click="judgeSelectChild(ansIndex, childindex, bankIndex)">
+											<view class="activeTI">{{ ast[childindex] }}</view>
+											{{ option }}
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view v-for="(option, childindex) in judge" :key="childindex" class="lisSty">
+											<text
+												:class="{
+													right: childindex == bank.ques[ansIndex] || childindex == bank.ans[ansIndex],
+													wrong: childindex == bank.ques[ansIndex] && bank.ques[ansIndex] != bank.ans[ansIndex]
+												}"
+												class="activeTI"
+											>
+												{{ ast[childindex] }}
+											</text>
+											{{ option }}
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view class="pad_8 answer">
+											<view>正确答案:{{ ast[bank.ans[ansIndex]] }}</view>
+											<view>我的答案:{{ ast[bank.ques[ansIndex]] }}</view>
+										</view>
+										<view class="pad_8 answerInfos">
+											<view class="answerTitle">答案解析</view>
+											<view class="answerContent"><rich-text :nodes="ansItem.analysisContent"></rich-text></view>
+										</view>
+									</view>
+								</template>
+
+								<!-- 简答题 -->
+								<template v-if="ansItem.type == 5">
+									<view class="ans">
+										<view class="ans_input" v-if="!bank.ques[ansIndex]">
+											<view class="top flex">
+												<image class="icon" @click="chooseImgChild(bankIndex, ansIndex)" src="/static/08-10_032.jpg" mode=""></image>
+												<view class="progress">0/4</view>
+												<view class="submit" @click="submitAnsChild(bankIndex, ansIndex)">确认答案</view>
+											</view>
+											<view class="textarea"><textarea v-model="ansItem.ansText.text" placeholder="在此输入答案"></textarea></view>
+											<view class="imgs">
+												<view class="img" v-for="(img, imgIndex) in ansItem.ansText.imageList">
+													<text @click="deleteImgChild(imgIndex, bankIndex, ansIndex)">x</text>
+													<image :src="$method.splitImgHost(img, true)"></image>
+												</view>
+											</view>
+										</view>
+										<view class="ans_submit answerInfos" v-if="bank.ques[ansIndex]">
+											<view class="answerTitle">答案我的</view>
+											{{ bank.ques[ansIndex].text }}
+											<view class="imgs">
+												<image class="img" v-for="ques in bank.ques[ansIndex].imageList" :src="$method.splitImgHost(ques, true)"></image>
+											</view>
+										</view>
+									</view>
+									<view v-if="bank.ques[ansIndex]">
+										<view class="pad_8 answerInfos">
+											<view class="answerTitle">答案解析</view>
+											<view class="answerContent"><rich-text :nodes="ansItem.analysisContent"></rich-text></view>
+										</view>
+									</view>
+								</template>
+							</view>
+						</view>
+					</template>
+
+					<view class="footer_btn">
+						<view class="collect">
+							<view v-if="collectList[bankIndex]">
+								<image src="/static/icon/collected.png" mode=""></image>
+								<view>取消收藏</view>
+							</view>
+						</view>
+						<view class="flex_center" @click="openFooterTab">
+							<view class="up-icon">
+								<image src="/static/up.png"></image>
+							</view>
+							答题卡
+						</view>
+						<view class="collect show" @click="pdsubmit">
+							<view>
+								<image src="/static/jj.png" mode=""></image>
+								<view>交卷</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+
+		<u-popup v-model="show" mode="bottom" border-radius="14" height="680rpx">
+			<view class="popupView">
+				<view class="popupTops">
+					<view class="topIcon"></view>
+					点击编号即可跳转至对应题目
+				</view>
+				<view class="popupContent">
+					<scroll-view scroll-y="true" style="height: 506rpx;">
+						<view class="boxSty">
+							<view
+								v-for="(item, index) in questionList"
+								:key="index"
+								@click="changeIndex(index)"
+								:class="{ isRight: isRight(item, index), isWrong: isWrong(item, index) }"
+								class="liListSty"
+							>
+								{{ index + 1 }}
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</u-popup>
+
+		<view class="dialog" v-if="showDialog">
+			<view class="text">左右滑动切换上下题</view>
+			<view class="btn" @click="hideDialog">我知道了</view>
+		</view>
+
+		<view class="dialog_wrap" v-if="testOver">
+			<view class="bg"></view>
+			<view class="dialog">
+				<view class="title">温馨提示</view>
+				<view class="content">
+					<view>您已完成所有题目,</view>
+					<view>快去交卷吧!</view>
+				</view>
+				<view class="btns">
+					<view class="btn" @click="noSubmit()">暂不交卷</view>
+					<view class="btn active" @click="submitNow()">立即交卷</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="dialog_wrap" v-if="isLastCount">
+			<view class="bg"></view>
+			<view class="dialog">
+				<view class="title">温馨提示</view>
+				<view class="content">
+					<view>您当前正在测试,还剩{{ lastCount }}道题未完成,离开视为交卷</view>
+				</view>
+				<view class="btns">
+					<view class="btn" @click="noLeave()">暂不离开</view>
+					<view class="btn active" @click="leaveNow()">继续离开</view>
+				</view>
+			</view>
+		</view>
+		<u-popup v-model="showpopups" mode="center" border-radius="24" height="439rpx" width="640rpx" :mask-close-able="false">
+			<view class="popboxs">
+				<view class="classTops">温馨提示</view>
+				<view class="textStys">
+					{{
+						cgType === 7
+							? '您还未交卷,确定结束做题吗?'
+							: cgType === 8
+							? `您还有${lastCount}道题未作答, 现在继续作答,还是下次继续?`
+							: cgType === 6
+							? `您还有${lastCount}道题未作答, 您确定要交卷吗?`
+							: ''
+					}}
+				</view>
+				<view class="classFootsty" v-if="cgType === 6">
+					<view class="btnsty btns1" @click="submit">立即交卷</view>
+					<view class="btnsty btns2" @click="showpopups = false">继续做题</view>
+				</view>
+				<view class="classFootsty" v-if="cgType === 7">
+					<view class="btnsty btns1" @click="showpopups = false">下次继续</view>
+					<view class="btnsty btns2" @click="backPages">结束做题</view>
+				</view>
+				<view class="classFootsty" v-if="cgType === 8">
+					<view class="btnsty btns1" @click="leaveNow()">下次继续</view>
+					<view class="btnsty btns2" @click="showpopups = false">继续作答</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			showpopups: false,
+			id: '',
+			current: 0,
+			questionList: [],
+			ast: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
+			judge: ['错误', '正确'],
+			ans: [],
+			ques: [],
+			show: false,
+			showDialog: true,
+			bankList: [],
+			collectList: [],
+			goodsId: '',
+			recordId: '',
+			isSubmit: false,
+			lastTime: 0, //剩余考试时长
+			allTimes: 0, //总考试时长
+			timer: null,
+			wrongList: [],
+			bankType: 0, //试卷类型
+			needBack: false, //是否是考试
+			testOver: false,
+			isLastCount: false, //是否有未答题目
+			lastCount: 0, //剩余没有回答的题目数
+			chapterId: 0,
+			moduleId: 0,
+			isFromVideo:'',
+			gradeId:'',
+			cgType: 0 //对应设计稿弹窗编码
+		};
+	},
+	onLoad(option) {
+		this.id = option.id;
+		this.goodsId = option.goodsid;
+		this.chapterId = option.chapterId;
+		this.moduleId = option.moduleId;
+		this.isFromVideo = option.isFromVideo||'';
+		this.gradeId = option.gradeId || '';
+		let isBack = option.isback;
+
+		if (isBack) {
+			console.log(getApp());
+			let app = getApp();
+			let globalData = app.globalData;
+
+			for (var k in globalData.bankData) {
+				this[k] = globalData.bankData[k];
+			}
+		} else {
+			this.goodsQuestionList();
+			this.bankExam();
+		}
+	},
+	onUnload() {
+		if (this.isSubmit) {
+			clearInterval(this.timer)
+			return;
+		}
+		//考试试卷 阻止ios手势返回,自动跳回答题页
+		if (this.needBack) {
+			let app = getApp();
+			app.globalData.bankData = this.$data;
+			uni.navigateTo({
+				url: '/pages2/bank/questionBank?id=' + this.id + '&goodsid=' + this.goodsId + '&isback=true'
+			});
+		} else {
+			//点击返回按钮确认允许退出,交卷
+			clearInterval(this.timer)
+			this.examRecordEdit();
+		}
+	},
+	methods: {
+		/**
+		 * 是否有上传图片
+		 */
+		hasImgs(bank) {
+			
+			return bank.ansText.imageList.length == 0;
+		},
+		/**
+		 * 获取试卷类型2考试,1练习
+		 */
+		bankExam() {
+			this.$api.bankExam(this.id).then(res => {
+				this.bankType = res.data.data.doType;
+				if (this.bankType == 2) {
+					this.needBack = true;
+				}
+			});
+		},
+		/**
+		 * 点击后退按钮
+		 */
+		clickLeft() {
+			if (this.bankType == 1) {
+				let ansCount = this.questionOverNum(); //已答题数
+				this.lastCount = this.questionList.length - ansCount; //统计未答完的题数
+
+				//所有题目答完
+				if (this.lastCount == 0) {
+					// this.testOver = true;
+					this.cgType = 7;
+					//未答完
+				} else {
+					this.cgType = 8;
+					// this.isLastCount = true;
+				}
+				this.showpopups = true;
+			} else if (this.bankType == 2) {
+				let ansCount = this.questionOverNum(); //已答题数
+				this.lastCount = this.questionList.length - ansCount; //统计未答完的题数
+
+				//所有题目答完
+				if (this.lastCount == 0) {
+					this.testOver = true;
+					//未答完
+				} else {
+					this.isLastCount = true;
+				}
+			}
+		},
+		/**
+		 * 返回上一页
+		 */
+		backPages() {
+			this.needBack = false;
+			uni.navigateBack({
+				delta: 1
+			});
+		},
+		/**
+		 * 获取已经回答的题目数
+		 * hasSpecail (是否包含简答和案例)
+		 */
+		questionOverNum(hasSpecail) {
+			let count = 0;
+			this.questionList.forEach(item => {
+				if (item.type == 1 || item.type == 2 || item.type == 3) {
+					if (item.ques) {
+						count++;
+					}
+				} else if (item.type == 4) {
+					//案例题
+					if(hasSpecail) {
+						
+						let isOver = item.jsonStr.every((jsonItem, indexs) => {
+							if (jsonItem.type == 1 || jsonItem.type == 2 || jsonItem.type == 3) {
+								if (item.ques[indexs]) {
+									return true;
+								} else {
+									return false;
+								}
+							} else if (jsonItem.type == 5) {
+								console.log(jsonItem, 111);
+								if (jsonItem.ansText.text.length || jsonItem.ansText.imageList.length) {
+									return true;
+								} else {
+									return false;
+								}
+							}
+						});
+						
+						if (isOver) {
+							count++;
+							console.log(item, 444);
+						}
+					}
+				} else if (item.type == 5) {
+					//简答题
+					if(hasSpecail) {
+						
+						if (item.ansText.text.length || item.ansText.imageList.length) {
+							count++;
+						}
+					}
+				}
+			});
+
+			return count;
+		},
+		/**
+		 * 暂不交卷
+		 */
+		noSubmit() {
+			//设为允许退出页面
+			this.needBack = false;
+			uni.navigateBack({
+				delta: 1
+			});
+		},
+		/**
+		 * 不离开
+		 */
+		noLeave() {
+			this.isLastCount = false;
+		},
+		/**
+		 * 立即离开并交卷
+		 */
+		leaveNow() {
+			this.needBack = false;
+			uni.navigateBack({
+				delta: 1
+			});
+			let score = 0; //计算总分
+			let reportStatus = 0;
+			let number = 0;
+			let passScore = 0;
+			this.questionList.forEach((item, index) => {
+				passScore = item.passScore
+				if (item.type == 1) {
+					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
+						score += item.score;
+						number++;
+					} else {
+						
+							item.scoreResult = 0;
+					}
+				} else if (item.type == 2) {
+					let isRight =
+						item.ques &&
+						item.ques.every((quesItem, quesIndex) => {
+							return item.ques[quesIndex] == item.ans[quesIndex];
+						});
+
+					if (isRight) {
+						item.scoreResult = item.score;
+						score += item.score;
+						number++;
+					} else {
+						
+							item.scoreResult = 0;
+					}
+				} else if (item.type == 3) {
+					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
+						score += item.score;
+						number++;
+					} else {
+						
+						item.scoreResult = 0;
+					}
+				}
+			});
+
+			if(score >= passScore) {
+				reportStatus = 1
+			} else {
+				reportStatus = 0
+			}
+
+			this.$api
+				.bankRecord({
+					chapterId:this.chapterId,
+					moduleId:this.moduleId,
+					examId: this.id,
+					goodsId: this.goodsId,
+					reportStatus:reportStatus,
+					rightQuestionNum: number,
+					status: 1,
+					gradeId:this.gradeId,
+					performance: score,
+					totalScore: allScore,
+					examTime: parseInt(this.allTimes),
+					doTime: parseInt(this.allTimes) - parseInt(this.lastTime),
+					historyExamJson: JSON.stringify(this.questionList)
+				})
+				.then(res => {});
+		},
+		/**
+		 * 立即交卷
+		 */
+		submitNow() {
+			this.showpopups = false;
+			this.needBack = false;
+			this.submit();
+		},
+		/**
+		 * 离开页面统计回答正确题数
+		 */
+		examRecordEdit() {
+			if (!this.isSubmit) {
+				let number = 0;
+				let score = 0;
+				let doQuestionNum = 0;
+				let reportStatus = 0;
+				this.questionList.forEach((item, index) => {
+					if (item.type == 1) {
+						if (item.ques == item.ans) {
+							score += item.score;
+							number++;
+						}
+
+						if (item.ques) {
+							doQuestionNum++;
+						}
+					} else if (item.type == 2) {
+						let isRight =
+							item.ques &&
+							item.ques.every((quesItem, quesIndex) => {
+								return item.ques[quesIndex] == item.ans[quesIndex];
+							});
+
+						if (isRight) {
+							score += item.score;
+							number++;
+						}
+
+						if (item.ques && item.ques.length) {
+							doQuestionNum++;
+						}
+					} else if (item.type == 3) {
+						if (item.ques == item.ans) {
+							score += item.score;
+							number++;
+						}
+
+						if (item.ques) {
+							doQuestionNum++;
+						}
+					} else if (item == 4) {
+						if (item.ques.length) {
+							doQuestionNum++;
+						}
+					} else if (item.type == 5) {
+						if (item.ques) {
+							doQuestionNum++;
+						}
+					}
+				});
+				
+				if(score >= 60) {
+					reportStatus = 1
+				}
+
+				this.$api
+					.bankRecord({
+						chapterId:this.chapterId,
+						moduleId:this.moduleId,
+						gradeId:this.gradeId,
+						examId: this.id,
+						goodsId: this.goodsId,
+						performance:score,
+						reportStatus:reportStatus,
+						status: 1,
+						historyExamJson: JSON.stringify(this.questionList)
+					})
+					.then(res => {});
+			}
+		},
+		
+		/**
+		 * @param {Object} second倒计时过滤器
+		 */
+		countdown(second) {
+			if (second) {
+				let h = parseInt((second / 60 / 60) % 24); //   计算小时
+				let m = parseInt((second / 60) % 60); //   计算分数
+				let s = parseInt(second % 60); //   计算当前秒数
+
+				if (h < 10) h = '0' + h;
+				if (m < 10) m = '0' + m;
+				if (s < 10) s = '0' + s;
+
+				return h + ':' + m + ':' + s;
+			} else {
+				return '';
+			}
+		},
+		/**
+		 * 请求题目列表
+		 */
+		goodsQuestionList() {
+			this.$api
+				.goodsQuestionList({
+					examId: this.id
+				})
+				.then(res => {
+					if (!res.data.data.length) {
+						this.hideDialog();
+						uni.showModal({
+							showCancel: false,
+							content: '该试卷暂无题目',
+							success: function(k) {
+								if (k.confirm) {
+									uni.navigateBack();
+								}
+							}
+						});
+						return;
+					}
+					this.allTimes = res.data.data[0].answerTime * 60;
+					this.lastTime = res.data.data[0].answerTime && res.data.data[0].answerTime * 60;
+					//考试时间到了自动交卷
+					if (this.lastTime) {
+						this.timer = setInterval(() => {
+							if (this.lastTime <= 0) {
+								clearInterval(this.timer);
+								uni.showModal({
+									title: '提示',
+									content: '考试时间到,自动交卷',
+									confirmText: '确定',
+									showCancel: false,
+									success: res => {
+										this.submit();
+									}
+								});
+								return;
+							}
+							this.lastTime--;
+						}, 1000);
+					} else {
+					}
+					res.data.data.forEach((item, index) => {
+						if (typeof item.jsonStr == 'string') {
+							item.jsonStr = JSON.parse(item.jsonStr);
+
+							if (item.type == 2) {
+								//多选
+								item.jsonStr.forEach(str => {
+									str.optionsId = '' + str.optionsId;
+								});
+								let arr = item.answerQuestion.split(',');
+								arr.forEach((a, i) => {
+									arr[i] = '' + a;
+								});
+								item.ans = arr;
+								return;
+							} else if (item.type == 5) {
+								//简答题
+								item.ansText = {
+									text: '',
+									imageList: []
+								};
+							} else if (item.type == 4) {
+								//案例题
+								console.log(item.jsonStr);
+								item.ques = [];
+								item.current = 0;
+								let ansArr = [];
+								item.jsonStr.forEach((json, index) => {
+									if (json.type == 1) {
+										ansArr[index] = json.answerQuestion;
+									} else if (json.type == 2) {
+										json.optionsList.forEach(str => {
+											str.optionsId = '' + str.optionsId;
+										});
+										let arr = json.answerQuestion.split(',');
+										arr.forEach((a, i) => {
+											arr[i] = '' + a;
+										});
+										ansArr[index] = arr;
+									} else if (json.type == 3) {
+										ansArr[index] = json.answerQuestion;
+									} else if (json.type == 5) {
+										ansArr[index] = {
+											text: '',
+											imageList: []
+										};
+										json.ansText = {
+											text: '',
+											imageList: []
+										};
+									}
+								});
+
+								item.ans = ansArr;
+								return;
+							}
+
+							item.ans = item.answerQuestion;
+						}
+					});
+
+					this.questionList = res.data.data;
+					this.lastCount = this.questionList.length;
+				});
+		},
+		/**
+		 * @param {Object} e单选点击
+		 */
+		radioSelect(optionsId, bindex) {
+			if (this.questionList[bindex].ques) return;
+			this.$set(this.questionList[bindex], 'ques', optionsId);
+		},
+
+		/**
+		 * @param {Object} e案例单选点击
+		 */
+		radioSelectChild(optionsId, ansIndex, bindex) {
+			if (this.questionList[bindex].ques[ansIndex]) return;
+			this.$set(this.questionList[bindex].ques, ansIndex, optionsId);
+		},
+
+		/**
+		 * @param {Object} 多选点击
+		 */
+		checkboxSelect(optionsId, bindex, index) {
+			this.$set(this.questionList[bindex].jsonStr[index], 'checked', !this.questionList[bindex].jsonStr[index].checked);
+		},
+
+		/**
+		 * @param {Object} 案例多选点击
+		 */
+		checkboxSelectChild(bindex, ansIndex, childIndex) {
+			this.$set(this.questionList[bindex].jsonStr[ansIndex].optionsList[childIndex], 'checked', !this.questionList[bindex].jsonStr[ansIndex].optionsList[childIndex].checked);
+		},
+
+		/**
+		 * @param {Object} 多选确认
+		 */
+		checkboxSubmit(bindex) {
+			if (this.questionList[bindex].ques) return;
+			let arr = [];
+			this.questionList[bindex].jsonStr.forEach(item => {
+				if (item.checked) {
+					arr.push(item.optionsId);
+				}
+			});
+
+			this.$set(this.questionList[bindex], 'ques', arr);
+
+			let isWrong = this.questionList[bindex].ques.some((quesItem, quesIndex) => {
+				return this.questionList[bindex].ques[quesIndex] != this.questionList[bindex].ans[quesIndex];
+			});
+		},
+
+		/**
+		 * @param {Object} 案例多选确认
+		 */
+		checkboxSubmitChild(bindex, ansIndex) {
+			if (this.questionList[bindex].ques[ansIndex]) return;
+			let arr = [];
+			this.questionList[bindex].jsonStr[ansIndex].optionsList.forEach(item => {
+				if (item.checked) {
+					arr.push(item.optionsId);
+				}
+			});
+
+			this.$set(this.questionList[bindex].ques, ansIndex, arr);
+		},
+
+		/**
+		 * @param {Object} index
+		 * @param {Object} bindex
+		 * 判断题
+		 */
+		judgeSelect(index, bindex) {
+			if (this.questionList[bindex].ques) return;
+			this.$set(this.questionList[bindex], 'ques', index + '');
+		},
+
+		/**
+		 * @param {Object} ansindex
+		 * @param {Object} childindex
+		 * @param {Object} bindex
+		 * 案例判断题
+		 */
+		judgeSelectChild(ansindex, childindex, bindex) {
+			if (this.questionList[bindex].ques[ansindex]) return;
+			this.$set(this.questionList[bindex].ques, ansindex, childindex + '');
+		},
+
+		openFooterTab() {
+			this.show = true;
+		},
+		hideDialog() {
+			this.showDialog = false;
+		},
+		changeIndex(index) {
+			this.current = index;
+		},
+
+		swiperChange(e) {
+			this.current = e.detail.current;
+		},
+
+		
+		pdsubmit() {
+			if (this.bankType == 1) {
+				let ansCount = this.questionOverNum(); //已答题数
+				this.lastCount = this.questionList.length - ansCount; //统计未答完的题数
+				//没有答完
+				if (this.lastCount !== 0) {
+					this.cgType = 6;
+					this.showpopups = true;
+					return;
+				}
+			}
+			this.submit();
+		},
+		/**
+		 * 交卷
+		 */
+		submit() {
+			let score = 0; //计算总分
+			let reportStatus = 0;
+			let number = 0;  //做对的题目数量
+			let doQuestionNum = 0;  //做过的题目数量
+			let allScore = 0;  //总分
+			let passScore = 0;
+			let doWrongQuestionIds = []; //错题和未做题id(客观题)
+			let doQuestionIds = []; //做过的题目id
+			let rightQuestionIds = []; //做对的题目id
+			this.questionList.forEach((item, index) => {
+				// passScore = item.passScore
+				if (item.type == 1) {
+					//正确
+					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
+						score += item.score;
+						number++;
+						rightQuestionIds.push(item.questionId)
+					} else { //错误
+						item.scoreResult = 0;
+						doWrongQuestionIds.push(item.questionId)
+					}
+					allScore += item.score;
+					if (item.ques) {
+						doQuestionNum++;
+						doQuestionIds.push(item.questionId)
+					}
+				} else if (item.type == 2) {
+					let isRight =
+						item.ques &&
+						item.ques.every((quesItem, quesIndex) => {
+							return item.ques[quesIndex] == item.ans[quesIndex];
+						});
+
+					if (isRight) {
+						score += item.score;
+						number++;
+						item.scoreResult = item.score;
+						rightQuestionIds.push(item.questionId)
+					} else {
+						item.scoreResult = 0;
+						doWrongQuestionIds.push(item.questionId)
+					}
+					allScore += item.score;
+					if (item.ques && item.ques.length) {
+						doQuestionNum++;
+						doQuestionIds.push(item.questionId)
+					}
+				} else if (item.type == 3) {
+					if (item.ques == item.ans) {
+						item.scoreResult = item.score;
+						score += item.score;
+						number++;
+						rightQuestionIds.push(item.questionId)
+					} else {
+						item.scoreResult = 0;
+						doWrongQuestionIds.push(item.questionId)
+					}
+					allScore += item.score;
+					if (item.ques) {
+						doQuestionNum++;
+						doQuestionIds.push(item.questionId)
+					}
+				} else if (item.type == 4) {
+					if (item.ques && item.ques.length) {
+						doQuestionNum++;
+					}
+				} else if (item.type == 5) {
+					if (item.ques) {
+						doQuestionNum++;
+					}
+				}
+			});
+			
+			//大于60分及格
+			if(score >= 60) {
+				reportStatus = 1
+			} else {
+				reportStatus = 0
+			}
+			
+			//交卷
+			this.$api
+				.bankRecord({
+					moduleId:this.moduleId,
+					chapterId:this.chapterId,
+					gradeId:this.gradeId,
+					examId: this.id,
+					goodsId: this.goodsId,
+					reportStatus:reportStatus,
+					// recordId: this.recordId,
+					// rightQuestionNum: number,
+					status: 1,
+					// doQuestionIds:doQuestionIds.join(','),
+					// rightQuestionIds:rightQuestionIds.join(','),
+					// doQuestionNum: doQuestionNum,
+					performance: score,
+					totalScore: allScore,
+					examTime: parseInt(this.allTimes),
+					doTime: parseInt(this.allTimes) - parseInt(this.lastTime),
+					historyExamJson: JSON.stringify(this.questionList)
+				})
+				.then(res => {
+					this.isSubmit = true;
+					if (res.data.code == 200) {
+						uni.showToast({
+							title: '交卷成功',
+							duration: 1000,
+							icon: 'none'
+						});
+
+						setTimeout(() => {
+							uni.redirectTo({
+								url: '/pages2/class/question_report?rightQuestionNum='+number+'&doWrongQuestionNum='+doWrongQuestionIds.length+'&score='+score+'&totalScore='+allScore+'&reportStatus='+reportStatus
+							});
+						}, 1000);
+					}
+				});
+				
+		},
+
+
+		/**
+		 * @param {Object} imgIndex
+		 * @param {Object} bankIndex
+		 * 删除简答图片
+		 */
+		deleteImg(imgIndex, bankIndex) {
+			this.questionList[bankIndex].ansText.imageList.splice(imgIndex, 1);
+		},
+
+		/**
+		 * @param {Object} imgIndex
+		 * @param {Object} bankIndex
+		 * @param {Object} ansIndex
+		 * 删除案例题简答图片
+		 */
+		deleteImgChild(imgIndex, bankIndex, ansIndex) {
+			this.questionList[bankIndex].jsonStr[ansIndex].ansText.imageList.splice(imgIndex, 1);
+		},
+
+		/**
+		 * @param {Object} bankindex
+		 * 选择上传图片
+		 */
+		chooseImg(bankindex) {
+			if(this.questionList[bankindex] && this.questionList[bankindex].ansText && this.questionList[bankindex].ansText.imageList.length >= 4) {
+				uni.showToast({
+					icon:'none',
+					title:'最多选择4张'
+				})
+				return;
+			}
+			uni.chooseImage({
+				count: 1, //默认9
+				sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['album', 'camera'], //从相册选择
+				success: res => {
+					let self = this;
+					// console.log(JSON.stringify(res.tempFilePaths));
+					let img = res.tempFilePaths[0];
+					uni.getImageInfo({
+						src: img,
+						success: async res => {
+							let canvasWidth = res.width; //图片原始长宽
+							let canvasHeight = res.height;
+							if (canvasWidth > 1000 || canvasHeight > 1000) {
+								uni.compressImage({
+									src: img,
+									quality: 75,
+									width: '50%',
+									height: '50%',
+									success: async rest => {
+										const dir = await self.uploadFile(rest.tempFilePath, 0);
+										this.questionList[bankindex].ansText.imageList.push(dir);
+									}
+								});
+							} else {
+								const dir = await self.uploadFile(img, 0);
+								this.questionList[bankindex].ansText.imageList.push(dir);
+							}
+						}
+					});
+				}
+			});
+		},
+
+		/**
+		 * @param {Object} bankindex
+		 * @param {Object} ansindex
+		 * 案例题选择上传图片
+		 */
+		chooseImgChild(bankindex, ansindex) {
+			uni.chooseImage({
+				count: 1, //默认9
+				sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['album', 'camera'], //从相册选择
+				success: res => {
+					let self = this;
+					// console.log(JSON.stringify(res.tempFilePaths));
+					let img = res.tempFilePaths[0];
+					uni.getImageInfo({
+						src: img,
+						success: async res => {
+							let canvasWidth = res.width; //图片原始长宽
+							let canvasHeight = res.height;
+							if (canvasWidth > 1000 || canvasHeight > 1000) {
+								uni.compressImage({
+									src: img,
+									quality: 75,
+									width: '50%',
+									height: '50%',
+									success: async rest => {
+										const dir = await self.uploadFile(rest.tempFilePath, 0);
+										this.questionList[bankindex].jsonStr[ansindex].ansText.imageList.push(dir);
+									}
+								});
+							} else {
+								const dir = await self.uploadFile(img, 0);
+								this.questionList[bankindex].jsonStr[ansindex].ansText.imageList.push(dir);
+							}
+						}
+					});
+				}
+			});
+		},
+
+		uploadFile(options, int) {
+			var self = this;
+			return new Promise((resolve, reject) => {
+				var data = {
+					imageStatus: int
+				};
+				self.$api.aliyunpolicy(data).then(res => {
+					console.log(res.data, 6);
+					if (res.data.code != 200) {
+						self.$method.showToast('签名错误' + JSON.stringify(res.data));
+						return;
+					}
+					var ossToken = res.data.data.resultContent;
+					if (ossToken.host == null || ossToken.host == undefined) {
+						self.$method.showToast('上传路径报错' + JSON.stringify(res.data));
+						return;
+					}
+					uni.uploadFile({
+						url: ossToken.host,
+						name: 'file',
+						filePath: options,
+						fileType: 'image',
+						header: {
+							AuthorizationToken: 'WX ' + uni.getStorageSync('token')
+						},
+						formData: {
+							key: ossToken.dir,
+							OSSAccessKeyId: ossToken.accessid,
+							policy: ossToken.policy,
+							Signature: ossToken.signature,
+							callback: ossToken.callback,
+							success_action_status: 200
+						},
+						success: result => {
+							if (result.statusCode === 200) {
+								resolve(ossToken.dir);
+							} else {
+								uni.showToast({
+									title: '上传失败',
+									icon: 'none'
+								});
+								return;
+							}
+						},
+						fail: error => {
+							uni.showToast({
+								title: '上传接口报错' + error,
+								icon: 'none'
+							});
+							return;
+						}
+					});
+				});
+			});
+		},
+		/**
+		 * @param {Object} type
+		 * @param {Object} bankindex
+		 * 简答题答案确认
+		 */
+		submitAns(bankindex) {
+			console.log(this.questionList[bankindex]);
+			if (!this.questionList[bankindex].ansText.text && !this.questionList[bankindex].ansText.imageList.length) {
+				uni.showToast({
+					title: '请输入内容或上传图片',
+					duration: 2000,
+					icon: 'none'
+				});
+				return;
+			}
+
+			this.$set(this.questionList[bankindex], 'ques', {
+				imageList: this.questionList[bankindex].ansText.imageList,
+				text: this.questionList[bankindex].ansText.text
+			});
+		},
+
+		/**
+		 * @param {Object} bankindex
+		 * @param {Object} ansindex
+		 * 案例题简答答案确认
+		 */
+		submitAnsChild(bankindex, ansindex) {
+			if (!this.questionList[bankindex].jsonStr[ansindex].ansText.text && !this.questionList[bankindex].jsonStr[ansindex].ansText.imageList.length) {
+				uni.showToast({
+					title: '请输入内容或上传图片',
+					duration: 2000,
+					icon: 'none'
+				});
+				return;
+			}
+
+			this.$set(this.questionList[bankindex].ques, ansindex, {
+				imageList: this.questionList[bankindex].jsonStr[ansindex].ansText.imageList,
+				text: this.questionList[bankindex].jsonStr[ansindex].ansText.text
+			});
+		},
+
+		isRight(item, index) {
+			//单选
+			if (this.questionList[index].ques) {
+				if (item.type == 1) {
+					return this.questionList[index].ques == this.questionList[index].ans;
+					//多选
+				} else if (item.type == 2) {
+					//每一项都相等
+					return this.questionList[index].ques.every((item, i) => {
+						return item == this.questionList[index].ans[i];
+					});
+					//判断
+				} else if (item.type == 3) {
+					return this.questionList[index].ques == this.questionList[index].ans;
+					// } else if (item.type == 5) {
+					// 	if(this.questionList[index].ques.text){
+					// 		return true
+					// 	}else{
+					// 		return false
+					// 	}
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		},
+
+		right(bankIndex, ansIndex, option) {
+			if (this.questionList[bankIndex].ques[ansIndex] && this.questionList[bankIndex].ans[ansIndex]) {
+				if (this.questionList[bankIndex].ques[ansIndex].indexOf(option.optionsId) != -1 || this.questionList[bankIndex].ans[ansIndex].indexOf(option.optionsId) != -1) {
+					return true;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		},
+
+		wrong(bankIndex, ansIndex, option) {
+			if (this.questionList[bankIndex].ques[ansIndex] && this.questionList[bankIndex].ans[ansIndex]) {
+				if (this.questionList[bankIndex].ques[ansIndex].indexOf(option.optionsId) != -1 && this.questionList[bankIndex].ans[ansIndex].indexOf(option.optionsId) == -1) {
+					return true;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		},
+
+		isWrong(item, index) {
+			if (this.questionList[index].ques) {
+				//单选
+				if (item.type == 1) {
+					return this.questionList[index].ques != this.questionList[index].ans;
+					//多选
+				} else if (item.type == 2) {
+					//每一项都相等
+					return this.questionList[index].ques.some((item, index) => {
+						return item != this.questionList[index].ans;
+					});
+					//判断
+				} else if (item.type == 3) {
+					return this.questionList[index].ques != this.questionList[index].ans;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+		},
+
+		tabSelect(index, bankindex) {
+			this.$set(this.questionList[bankindex], 'current', index);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.swiper {
+	width: 100%;
+	height: calc(100vh - 65px);
+}
+.lisSty {
+	margin-bottom: 16rpx;
+	display: flex;
+
+	.flex_auto {
+		flex: 1;
+	}
+}
+.activeTI {
+	vertical-align: middle;
+	display: inline-block;
+	border: 1rpx solid #eee;
+	border-radius: 50rpx;
+	height: 48rpx;
+	line-height: 46rpx;
+	text-align: center;
+	width: 48rpx;
+	margin-right: 15rpx;
+	color: #666;
+	font-size: 30rpx;
+
+	&.right {
+		color: #fff;
+		background: green;
+	}
+
+	&.wrong {
+		color: #fff;
+		background: red;
+	}
+
+	&.checked {
+		color: #fff;
+		background: blue;
+	}
+}
+
+.submit_checkbox {
+	margin: 20rpx auto;
+	width: 526rpx;
+	height: 80rpx;
+	background: rgba(0, 122, 255, 1);
+	color: #fff;
+	text-align: center;
+	line-height: 80rpx;
+	font-size: 30rpx;
+	border-radius: 40rpx;
+}
+.titles {
+	overflow: hidden;
+	margin-bottom: 24rpx;
+}
+.titBox {
+	padding: 41rpx 25rpx 24rpx 25rpx;
+}
+
+.tabs {
+	margin: 10rpx;
+	display: flex;
+	.tab {
+		margin: 0 10rpx;
+		width: 96rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		color: #007aff;
+		font-size: 28rpx;
+		border-radius: 16rpx;
+
+		&.current {
+			color: #fff;
+			background: #007aff;
+		}
+	}
+}
+
+.ans {
+	margin: 8rpx 8rpx 8rpx;
+
+	.ans_input {
+		border-radius: 16rpx;
+		background: #fff;
+		.top {
+			border-bottom: 1rpx solid #eeeeee;
+			padding: 16rpx;
+			display: flex;
+			align-items: center;
+
+			.icon {
+				margin-right: 20rpx;
+				width: 40rpx;
+				height: 38rpx;
+			}
+
+			.progress {
+				flex: 1;
+			}
+
+			.submit {
+				width: 168rpx;
+				height: 48rpx;
+				line-height: 48rpx;
+				text-align: center;
+				color: #fff;
+				font-size: 30rpx;
+				background: #007aff;
+				border-radius: 24rpx;
+				
+				&.disabled {
+					opacity: 0.6;
+				}
+			}
+		}
+
+		.textarea {
+			textarea {
+				width: 100%;
+				height: 287rpx;
+				padding: 10rpx;
+			}
+		}
+
+		.imgs {
+			overflow: hidden;
+			display: flex;
+			width: 100%;
+			.img {
+				width: 104rpx;
+				height: 104rpx;
+				border-radius: 8rpx;
+				position: relative;
+				margin: 20rpx;
+
+				text {
+					position: absolute;
+					right: -15rpx;
+					top: -15rpx;
+					width: 30rpx;
+					height: 30rpx;
+					text-align: center;
+					line-height: 30rpx;
+					color: #fff;
+					background: red;
+					border-radius: 50%;
+				}
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+			}
+		}
+	}
+
+	.ans_submit {
+		padding: 16rpx;
+		border-radius: 16rpx;
+		background: #fff;
+
+		.imgs {
+			overflow: hidden;
+			display: flex;
+			width: 100%;
+			.img {
+				width: 104rpx;
+				height: 104rpx;
+				border-radius: 8rpx;
+				position: relative;
+				margin: 20rpx;
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+			}
+		}
+	}
+}
+.firstLetter {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+	.leftLetters {
+		display: flex;
+		align-items: center;
+		width: 220rpx;
+		.btnType {
+			padding: 5rpx 10rpx;
+			border: 1rpx solid #007aff;
+			border-radius: 10rpx;
+			background-color: rgba(0, 122, 255, 0.1);
+			font-size: 28rpx;
+			color: #007aff;
+			margin-right: 15rpx;
+		}
+	}
+}
+.popupView {
+	height: 100%;
+	padding-bottom: 100rpx;
+	.popupTops {
+		height: 77rpx;
+		border-bottom: 1rpx solid #eee;
+		text-align: center;
+		line-height: 77rpx;
+		font-size: 24rpx;
+		color: #999;
+		position: relative;
+		.topIcon {
+			position: absolute;
+			top: 10rpx;
+			left: 50%;
+			transform: translateX(-50%);
+			width: 80rpx;
+			height: 8rpx;
+			background-color: #999;
+			border-radius: 4rpx;
+		}
+	}
+	.popupContent {
+	}
+}
+.pageContent {
+	position: relative;
+	background-color: #eaeef1;
+	height: 100%;
+	padding-top: 8rpx;
+	padding-bottom: 100rpx;
+	overflow-y: scroll;
+}
+.pad_8 {
+	background-color: #fff;
+	margin: 0rpx 8rpx 8rpx;
+	border-radius: 16rpx;
+	
+	&.no-margin {
+		margin-top:-16rpx;
+		border-radius: 0 0 16rpx 16rpx;
+	}
+}
+.answer {
+	height: 80rpx;
+	line-height: 80rpx;
+	padding: 0rpx 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	color: #666;
+	font-size: 30rpx;
+}
+.footer_btn {
+	background-color: #fff;
+	z-index: 10078;
+	position: fixed;
+	bottom: 0rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	width: 100%;
+	height: 98rpx;
+	padding: 0rpx 38rpx;
+	border-top: 1rpx solid #eee;
+
+	.flex_center {
+		flex:1;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		flex-direction: column;
+		margin:0 200rpx;
+		font-size: 24rpx;
+		color: #999999;
+		
+		
+		.up-icon {
+			margin-bottom:18rpx;
+			width:100%;
+			display: flex;
+			justify-content: center;
+			image {
+				width:58rpx;
+				height:21rpx;
+			}
+		}
+	}
+	.collect {
+		visibility: hidden;
+		width:100rpx;
+
+		&.show {
+			visibility: visible;
+		}
+		
+		>view {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			
+			image {
+				width:32rpx;
+				height:32rpx;
+				margin-bottom:6rpx;
+			}
+			
+			view {
+				font-size: 24rpx;
+				color: #999999;
+			}
+		}
+	}
+}
+.boxSty {
+	padding: 44rpx 41rpx 0rpx;
+}
+.liListSty {
+	border: 1rpx solid #eeeeee;
+	width: 88rpx;
+	height: 88rpx;
+	border-radius: 32rpx;
+	text-align: center;
+	line-height: 88rpx;
+	color: #333;
+	font-size: 32rpx;
+	float: left;
+	margin: 20rpx 23rpx;
+
+	&.isRight {
+		border: 1rpx solid #eeeeee;
+		color: #fff;
+		background: green;
+	}
+
+	&.isWrong {
+		border: 1rpx solid #eeeeee;
+		color: #fff;
+		background: red;
+	}
+}
+.answerInfos {
+	padding: 25rpx 25rpx 25rpx 23rpx;
+}
+.answerTitle {
+	margin-bottom: 28rpx;
+	color: #666;
+	font-size: 30rpx;
+}
+.answerContent {
+	font-size: 30rpx;
+	color: #666;
+}
+
+.textChild {
+	display: inline-block;
+	vertical-align: middle;
+}
+
+.dialog {
+	position: fixed;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	background-color: rgba(0, 0, 0, 0.8);
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	z-index: 20000;
+
+	.text {
+		font-size: 32rpx;
+		color: #ffffff;
+		text-align: center;
+	}
+
+	.btn {
+		width: 242rpx;
+		height: 82rpx;
+		border: 2rpx solid #ffffff;
+		border-radius: 16rpx;
+		text-align: center;
+		line-height: 82rpx;
+		margin: 41rpx auto;
+		color: #fff;
+		font-size: 32rpx;
+	}
+}
+
+.dialog_wrap {
+	position: fixed;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	z-index: 9999999999;
+
+	.bg {
+		background: rgba(0, 0, 0, 0.3);
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100%;
+	}
+
+	.dialog {
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate3D(-50%, -50%, 0);
+		width: 640rpx;
+		height: 439rpx;
+		background: #ffffff;
+		border-radius: 24rpx;
+
+		.title {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: #333333;
+			line-height: 48rpx;
+			text-align: center;
+			margin-top: 40rpx;
+		}
+
+		.content {
+			margin: 35rpx 35rpx 0;
+			font-size: 30rpx;
+			color: #666666;
+			line-height: 48rpx;
+		}
+
+		.btns {
+			margin-top: 35rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+			.btn {
+				width: 200rpx;
+				height: 80rpx;
+				line-height: 80rpx;
+				text-align: center;
+				background: #f5f5f5;
+				border-radius: 40rpx;
+				font-size: 30rpx;
+				color: rgba(0, 122, 255, 1);
+				background: #f5f5f5;
+				margin: 0 20rpx;
+
+				&.active {
+					color: #f5f5f5;
+					background: rgba(0, 122, 255, 1);
+				}
+			}
+		}
+	}
+}
+.popboxs {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+}
+.classTops {
+	flex-shrink: 0;
+	padding: 39rpx 0rpx 4rpx;
+	font-weight: bold;
+	color: #333;
+	font-size: 30rpx;
+}
+.textStys {
+	width: 100%;
+	flex: 1;
+	padding: 36rpx;
+}
+.classFootsty {
+	flex-shrink: 0;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	padding: 10rpx 0rpx 40rpx;
+	.btnsty {
+		width: 200rpx;
+		height: 80rpx;
+		border-radius: 40rpx;
+		font-weight: bold;
+		font-size: 30rpx;
+		text-align: center;
+		line-height: 80rpx;
+	}
+	.btns1 {
+		background-color: #f5f5f5;
+		color: #007aff;
+	}
+	.btns2 {
+		margin-left: 40rpx;
+		background-color: #007aff;
+		color: #ffffff;
+	}
+}
+</style>

+ 338 - 0
pages2/class/question_report.vue

@@ -0,0 +1,338 @@
+<template>
+	<view>
+		<view :class="reportStatus == 0 ? 'redBtn' : reportStatus == 1 ? 'greenBtn' : 'disNone'">
+			{{ reportStatus == 0 ? '测试未通过' : reportStatus == 1 ? '测试通过' : '' }}
+		</view>
+		<view class="top">
+
+			<view class="box">
+				<view class="left">
+					<view>{{ ((rightQuestionNum / (rightQuestionNum + doWrongQuestionNum)) * 100).toFixed(0) }}%</view>
+					<view>正确率</view>
+					<view>不含简答/案例题</view>
+				</view>
+				<view class="right">
+					<view class="flex up">
+						<u-icon name="checkmark" color="#16D48B" size="48" style="margin-right: 14rpx;"></u-icon>
+						<!-- <image src="/static/5-4_03.png" mode=""></image> -->
+						<view class="text">正确题数</view>
+						<text class="green">{{ rightQuestionNum }}</text>
+					</view>
+					<view class="flex down">
+						<u-icon name="close" color="#FF3B30" size="38" style="margin-right: 26rpx;"></u-icon>
+						<!-- <image src="/static/5-4_03.png" mode=""></image> -->
+						<view class="text">错误题数</view>
+						<text class="red">{{ doWrongQuestionNum }}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="bottom">
+			<view class="circle-wrap">
+				<view class="circle-list">
+					<view class="item" v-show="totalScore">
+						<view class="title">
+							试卷得分
+							<text>(不含简答和案例题)</text>
+						</view>
+						<canvas class="canvas" canvas-id="Canvas1"></canvas>
+					</view>
+					<view class="item" v-show="examTime">
+						<view class="title">答题时长</view>
+						<canvas canvas-id="Canvas2"></canvas>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	data() {
+		return {
+			id: '',
+			hideBtns:false,
+			examData:{},
+			examId:'',
+			context1: null,
+			context2: null,
+			rightQuestionNum:'',
+			doWrongQuestionNum:'',
+			score:'',
+			totalScore:'',
+			doTime:'',
+			examTime:''
+		};
+	},
+	onUnload() {},
+	computed: { ...mapGetters(['userInfo']) },
+	async onShow() {
+		
+		uni.getSystemInfo({
+			success: res => {
+				var winW = res.screenWidth;
+				var winH = res.screenHeight;
+				uni.createSelectorQuery()
+					.in(this)
+					.select('.canvas')
+					.boundingClientRect()
+					.exec(async newRes => {
+						var width = newRes[0].width;
+						var height = newRes[0].height;
+						var caculateX = winW / 750;
+						var caculateY = winH / 1334;
+						console.log(caculateX);
+						
+						if(this.totalScore) {
+							var context1 = uni.createCanvasContext('Canvas1');
+							this.context1 = context1;
+							context1.setStrokeStyle('#EEEEEE');
+							context1.setLineWidth(caculateX * 20);
+							context1.arc(caculateX * 90, caculateX * 90, caculateX * 80, 0, 2 * Math.PI, true);
+							context1.stroke();
+							context1.beginPath();
+							context1.setStrokeStyle('#32D74B');
+							context1.setFillStyle('#32D74B');
+							context1.setTextAlign('center');
+							context1.setTextBaseline('middle');
+							context1.setLineCap('round');
+							context1.setFontSize(caculateX * 64);
+							context1.fillText(this.score, caculateX * 90, caculateX * 90, caculateX * 180);
+							context1.setFillStyle('#999999');
+							context1.setFontSize(caculateX * 20);
+							context1.fillText(`满分${this.totalScore}`, caculateX * 90, caculateX * 130, caculateX * 180);
+							context1.arc(caculateX * 90, caculateX * 90, caculateX * 80, -Math.PI/2, -Math.PI/2 + (this.score / this.totalScore) * 2 * Math.PI, false);
+							context1.stroke();
+							context1.draw();
+						}
+						
+						if(this.examTime) {
+							var context2 = uni.createCanvasContext('Canvas2');
+							this.context2 = context2;
+							context2.setStrokeStyle('#EEEEEE');
+							context2.setLineWidth(caculateX * 20);
+							context2.arc(caculateX * 90, caculateX * 90, caculateX * 80, 0, 2 * Math.PI, true);
+							context2.stroke();
+							context2.beginPath();
+							context2.setStrokeStyle('#007AFF');
+							context2.setFillStyle('#007AFF');
+							context2.setTextAlign('center');
+							context2.setTextBaseline('middle');
+							context2.setLineCap('round');
+							context2.setFontSize(caculateX * 64);
+							context2.fillText(`${this.doTime}'`, caculateX * 90, caculateX * 90, caculateX * 180);
+							context2.setFillStyle('#999999');
+							context2.setFontSize(caculateX * 20);
+							context2.fillText(`限时${this.examTime}'`, caculateX * 90, caculateX * 130, caculateX * 180);
+							context2.arc(caculateX * 90, caculateX * 90, caculateX * 80, -Math.PI/2, -Math.PI/2 + (this.doTime / this.examTime) * 2 * Math.PI, false);
+							context2.stroke();
+							context2.draw();
+						}
+						
+						
+					});
+			}
+		});
+	},
+	async onLoad(option) {
+		this.examTime = option.examTime;
+		this.doTime = option.doTime;
+		this.reportStatus = option.reportStatus;
+		this.rightQuestionNum = +option.rightQuestionNum;
+		this.doWrongQuestionNum = +option.rightQuestionNum;
+		this.score = +option.score;
+		this.totalScore = +option.totalScore;
+		// this.hideBtns = Boolean(option.hideBtns);
+		
+	},
+	methods: {
+		
+	}
+};
+</script>
+<style>
+page {
+	background-color: #eaeef1;
+}
+</style>
+<style lang="scss" scope>
+.disNone {
+	display: none;
+}
+.greenBtn {
+	margin: 16rpx 16rpx 0;
+	height: 80rpx;
+	line-height: 80rpx;
+	text-align: center;
+	background-color: #f7fff8;
+	border-radius: 16rpx;
+	color: #34c759;
+	font-weight: bold;
+	font-size: 30rpx;
+}
+.redBtn {
+	margin: 16rpx 16rpx 0;
+	height: 80rpx;
+	line-height: 80rpx;
+	text-align: center;
+	background-color: #FFF3F2;
+	border-radius: 16rpx;
+	color: #FF3B30;
+	font-weight: bold;
+	font-size: 30rpx;
+
+}
+.dis_fst {
+	margin-top: 40rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-around;
+}
+.btnACs {
+	height: 48rpx;
+	width: 160rpx;
+	text-align: center;
+	line-height: 48rpx;
+	border: 1rpx solid #007aff;
+	border-radius: 16rpx;
+	color: #007aff;
+	font-size: 24rpx;
+}
+.top {
+	margin: 16rpx 16rpx 0;
+	border-radius: 16rpx;
+	padding: 40rpx 24rpx 16rpx;
+	background: #fff;
+	.title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333333;
+	}
+
+	.desc {
+		margin-top: 20rpx;
+		font-size: 24rpx;
+		color: #999999;
+	}
+
+	.box {
+		margin-top: 30rpx;
+		display: flex;
+
+		.left {
+			width: 250rpx;
+			height: 176rpx;
+			background: #f5f5f5;
+			border-radius: 16rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			margin-right: 16rpx;
+
+			view {
+				text-align: center;
+
+				&:nth-of-type(1) {
+					font-size: 60rpx;
+					font-weight: bold;
+					color: #007aff;
+				}
+				&:nth-of-type(2) {
+					font-size: 32rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+				&:nth-of-type(3) {
+					font-size: 24rpx;
+					color: #999999;
+				}
+			}
+		}
+
+		.right {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+
+			.flex {
+				background: #f5f5f5;
+				display: flex;
+				height: 80rpx;
+				align-items: center;
+				padding: 0 40rpx;
+				border-radius: 16rpx;
+
+				image {
+					width: 30rpx;
+					height: 30rpx;
+					margin-right: 28rpx;
+				}
+
+				.text {
+					flex: 1;
+					font-size: 30rpx;
+					color: #666666;
+				}
+
+				text {
+					font-size: 48rpx;
+					color: #e12626;
+
+					&.red {
+						color: red;
+					}
+
+					&.green {
+						color: green;
+					}
+				}
+			}
+		}
+	}
+}
+
+.bottom {
+	.circle-wrap {
+		.circle-list {
+			display: flex;
+
+			.item {
+				padding: 20rpx;
+				border-radius: 16rpx;
+				background: #fff;
+				margin: 16rpx;
+				flex: 1;
+
+				.title {
+					font-weight: bold;
+					font-size: 30rpx;
+					line-height: 24rpx;
+					color: #333333;
+
+					text {
+						font-size: 20rpx;
+						color: #999999;
+					}
+				}
+
+				canvas {
+					margin: 36rpx auto 0;
+					width: 180rpx;
+					height: 180rpx;
+				}
+
+				.text {
+					text-align: center;
+					margin-top: 16rpx;
+					font-size: 24rpx;
+					color: #333333;
+				}
+			}
+		}
+	}
+}
+</style>

+ 1 - 1
pages2/wd/class.vue

@@ -39,7 +39,7 @@
 					<view style="width: 60%;">
 						<text style="color: #2979ff;white-space: nowrap;text-overflow: ellipsis;">{{ item.beforeName }}</text>
 					</view>
-					<view><u-button type="primary" size="mini">进入刷题</u-button></view>
+					<view><u-button type="primary" size="mini" v-if="false">进入刷题</u-button></view>
 				</view>
 			</view>
 		</navigator>