From c2e890aa31ba67fd6f1e3cba76b4cf3f3f737544 Mon Sep 17 00:00:00 2001
From: liuyg <liuyg@qq.com>
Date: Fri, 25 Feb 2022 09:45:07 +0800
Subject: [PATCH] 冲突

---
 components/dyw-answer/answer.vue       |  998 +++++++++++
 components/dyw-answer/readme.md        |   61 
 static/workbench/exam.png              |    0 
 components/dyw-answer/answer - 副本.vue  |  997 +++++++++++
 pages.json                             | 1332 +++++++-------
 pages/business/business.vue            |   10 
 store/apiConfig.js                     |    2 
 pages/exam/examTextPage.vue            |  178 ++
 components/dyw-answer/answerSingle.vue |  805 +++++++++
 common/api/examFunc.js                 |   62 
 store/state.js                         |    3 
 components/clock/clock.vue             |   79 
 pages/registerUser/registerUser.vue    |   52 
 common/axios.js                        |   43 
 components/dyw-answer/modal.vue        |   81 
 common/api/exam.js                     |   16 
 pages/exam/examReviewPage.vue          |  199 ++
 pages/exam/startexam.vue               |  150 +
 18 files changed, 4,402 insertions(+), 666 deletions(-)

diff --git a/common/api/exam.js b/common/api/exam.js
new file mode 100644
index 0000000..ce29663
--- /dev/null
+++ b/common/api/exam.js
@@ -0,0 +1,16 @@
+/*
+ * @Author: Morpheus
+ * @Date: 2021-05-09 15:17:44
+ * @Last Modified by: Morpheus
+ * @Last Modified time: 2021-12-24 11:26:04
+ */
+// 校区
+import request from '@/common/axios'
+
+export const enterExam = (params) => {
+    return request({
+        url: '/simulateExamRecord/beginExam',
+        method: 'POST',
+        data: params
+    })
+}
\ No newline at end of file
diff --git a/common/api/examFunc.js b/common/api/examFunc.js
new file mode 100644
index 0000000..c0de7bd
--- /dev/null
+++ b/common/api/examFunc.js
@@ -0,0 +1,62 @@
+import store from '@/store/index.js'; //需要引入store
+
+// Text页面对考题列表questionList数据预处理
+const unique = (arr) => {
+	return Array.from(new Set(arr));
+}
+
+export const ModifyQuesList = function(quesModules) {
+	// store.state.questionList = []
+	let questionList = []
+
+	let queTypeArr = []
+	
+	quesModules.forEach((item, index) => {
+		
+		let quesType = item.choicesType
+		
+		queTypeArr.push(quesType)
+		
+		item.template = item.choicesType
+		
+		item.tempAnswer = ""
+		
+		item.options = item.examSubjectOptions
+		
+		item.options.forEach(it => {
+			it.newOptLetter = it.optionName
+			it.optContent = it.optionContent
+			it.optLetter = it.newOptLetter
+		})
+		
+		questionList.push(item)
+		
+	})
+
+	store.state.queTypeArr = unique(queTypeArr)
+
+	store.state.questionList = questionList
+
+}
+
+export const topicOptions = (options) => {
+
+	var questionList = store.state.questionList
+
+	questionList.forEach((item, index) => {
+
+	})
+
+	store.state.questionList = questionList
+
+	// for (let j = 0; j < quesModules[i].examSubjectOptions.length; j++) {
+	// 	// 解决theoryExamAnswer可能为null的问题,把它赋值为字符串
+	// 	quesModules[i].examSubjectOptions[j].tempAnswer = "" //暂存每题的答案
+	// 	quesModules[i].examSubjectOptions[j].template = quesModules[i].choicesType //防止template初始值是null
+	// 	quesModules[i].examSubjectOptions[j].recordId = store.state.examDetail
+	// 		.id //搬移recordId的位置
+	// 	quesModules[i].examSubjectOptions[j].blankArr = [] //新建blankArr属性,临时保存填空题答案
+	// 	quesModules[i].examSubjectOptions[j].dualChooseArr = [] //新建blankArr属性,临时保存填空题答案
+	// 	questionList.push(quesModules[i].examSubjectOptions[j])
+	// }
+}
diff --git a/common/axios.js b/common/axios.js
new file mode 100644
index 0000000..a12765d
--- /dev/null
+++ b/common/axios.js
@@ -0,0 +1,43 @@
+/**
+ * 全站http配置
+ *
+ * axios参数说明
+ * isSerialize是否开启form表单提交
+ * isToken是否需要token
+ */
+import axios from "axios";
+
+const service = axios.create({
+  baseURL: "http://192.168.0.198:81", //正常接口
+  timeout: 600000, // request timeout
+});
+
+// 返回其他状态码
+service.defaults.validateStatus = function (status) {
+  return status >= 200 && status <= 500;
+};
+
+// 跨域请求,允许保存cookie
+service.defaults.withCredentials = true;
+
+// http request拦截
+service.interceptors.request.use(
+  (config) => {
+    return config;
+  },
+  (error) => {
+    return Promise.reject(error);
+  }
+);
+
+// http response 拦截
+service.interceptors.response.use(
+  (res) => {
+    return res;
+  },
+  (error) => {
+    return Promise.reject(new Error(error));
+  }
+);
+
+export default service;
diff --git a/components/clock/clock.vue b/components/clock/clock.vue
new file mode 100644
index 0000000..0471010
--- /dev/null
+++ b/components/clock/clock.vue
@@ -0,0 +1,79 @@
+<template>
+	<cover-view class="clock">
+		<cover-view>{{hour}}:</cover-view>
+		<cover-view>{{minute}}:</cover-view>
+		<cover-view>{{second}}</cover-view>
+	</cover-view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				count: 0,
+				hour:"00",
+				minute:"00",
+				second:"00",
+				// totalCount:0,
+				timer:null
+			};
+		},
+		computed:{
+			
+		},
+		props:{
+			timeOrigin:{
+				type:Number,
+				default:0
+			}
+		},
+		methods:{
+			end(){
+				this.is_show = false;
+				clearInterval(this.timer);
+				// this.$emit('clockend',this.totalCount);
+			},
+			showNum(num) {
+				if (num < 10) {
+					return '0' + num
+				}
+				return num
+			},
+			start(){
+				let _this = this;
+				// let count = 0;
+				_this.timer = setInterval(function(){
+					_this.count++;
+					_this.second = _this.showNum(_this.count % 60);
+					_this.hour = _this.showNum(parseInt(_this.count / 60 / 60));
+					_this.minute = _this.showNum(parseInt(_this.count / 60) % 60);
+					// _this.totalCount = _this.count;
+				},1000);
+				// this.is_show = true;
+			}
+		},
+		onLoad() {
+			this.count = this.timeOrigin
+			// let _this = this;
+			// // let count = 0;
+			// _this.timer = setInterval(function(){
+			// 	_this.count++;
+			// 	_this.second = _this.showNum(_this.count % 60);
+			// 	_this.hour = _this.showNum(parseInt(_this.count / 60 / 60));
+			// 	_this.minute = _this.showNum(parseInt(_this.count / 60) % 60);
+			// 	// _this.totalCount = _this.count;
+			// },1000);
+			// this.is_show = true;
+		},
+		onReady() {
+			// this.start()
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.clock{
+		display: flex;
+	}
+</style>
diff --git "a/components/dyw-answer/answer - \345\211\257\346\234\254.vue" "b/components/dyw-answer/answer - \345\211\257\346\234\254.vue"
new file mode 100644
index 0000000..bcb8ada
--- /dev/null
+++ "b/components/dyw-answer/answer - \345\211\257\346\234\254.vue"
@@ -0,0 +1,997 @@
+<template>
+	<!-- 此组件用于显示整套试卷· 
+	试卷类型包含
+	exam 理论考试
+	paper 模拟考试 知识点练习 -->
+	<view>
+		<!-- 大标题 -->
+		<view class="header" id="header">
+			<!-- 			<span class="header-button" @click='leave' v-if='!isReviewed && examType=='know' '>暂离</span> -->
+			<span v-if="examType=='exam'"> {{examDetail.exam.name}}</span>
+			<span v-if="(examType=='paper' )|| (examType=='know') || (examType=='course')">
+				{{examDetail.paper.name}}</span>
+			<span class="header-button" @click='handleSubmit(1)' v-if='!isReviewed'>交卷</span>
+			<!-- <span class="scoreText" v-else>得分:{{examDetail.score}}</span> -->
+		</view>
+		<!-- 小标题栏 -->
+		<view id="subHeader">
+			<view class="sub-header" v-if='questionList.length>0'>
+				<u-tag class="typeTag" :text="answerStatusName" mode="dark" shape="circle" />
+				<view v-if="examDetail.exam.examTime<=0">不限时</view>
+				<u-count-down v-if="(!isReviewed)&&(examType=='exam')&& (examDetail.exam.examTime>0)"
+					:timestamp="examDetail.exam.examTime*60" :show-days="false" @end="end" @change="change">
+				</u-count-down>
+				<clock v-if="(!isReviewed)&&(examType=='paper' || (examType=='course'))" ref="myClock"
+					:timeOrigin="parseInt(examDetail.time)">
+				</clock>
+				<span v-if="examType=='exam'">第
+					{{currentIndex+1}}/{{examDetail.exam.totalQuestion}} 题</span>
+				<span v-if="(examType=='paper' )|| (examType=='know')">第
+					{{currentIndex+1}}/{{examDetail.totalQuestion}} 题</span>
+			</view>
+		</view>
+
+		<!-- 答题区域 -->
+		<swiper class="content" :duration='duration' :current=currentIndex @change='handleSwiperChanged'
+			v-if='questionList.length>0' :style="{'height':swiperHeight}">
+			<template v-for='item in questionList'>
+				<swiper-item class="content-item">
+					<scroll-view scroll-y :style="{'height':swiperHeight}">
+						<!-- 显示题目的题干 -->
+						<view class="content-title">
+							<rich-text :nodes="item.subjectName"></rich-text>
+						</view>
+						<!-- 以下显示选项 -->
+						<!-- type == 0 单选题 -->
+						<view class="content-solutions" v-if='item.template == 0'>
+							<template v-for='subItem in item.options'>
+								<view
+									:class="[isReviewed && subItem.optAnswer == 1 ? 'right': '',isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseSolution(item,subItem)'>
+									<view v-if="(!isReviewed) && (examType=='exam') "
+										class="content-solutions-item-single">
+										{{subItem.newOptLetter}}
+									</view>
+									<view v-else class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<!-- 此处注意optLetter与newOptLetter的区别,newOptLetter是ABCD顺序的,而optLetter乱序的,两者无直接关系 -->
+									<view
+										:class="item.tempAnswer == subItem.optLetter? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 1 多选题 -->
+						<view class="content-solutions" v-if='item.template == 1'>
+							<template v-for='subItem in item.options'>
+								<view
+									:class="[isReviewed && subItem.optAnswer == 1 ? 'right': '',isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseMutiSolution(item,subItem)'>
+									<view v-if="(!isReviewed) && (examType=='exam') "
+										class="content-solutions-item-single">
+										{{subItem.newOptLetter}}
+									</view>
+									<view v-else class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<!-- TODO 是否被选中的条件判断不对 -->
+									<view
+										:class="item.tempAnswer.indexOf(subItem.optLetter) >-1 ? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}
+									</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 2 判断题 -->
+						<view class="content-solutions" v-if='item.template == 2'>
+							<template v-for='subItem in item.options'>
+								<view class="content-solutions-judge">
+									<view v-for="(judgeItem,judgeIndex) in judgeArr"
+										:class="[item.tempAnswer == judgeItem.value? 'content-solutions-item-select' : '',isReviewed && (item.rightAnswer==judgeItem.name)  ? 'right': '',isReviewed && (item.wrongArr ==judgeItem.value)  ? 'wrong': '']"
+										class="content-solutions-judge-item"
+										@click='judgeSolution(item,judgeItem.value)'>{{judgeItem.name}}</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 4 填空题 -->
+						<view class="content-solutions" v-if='item.template == 4'>
+							<template v-if="!isReviewed">
+								<view class="content-solutions-item" v-for='(subItem,subIndex) in item.options'
+									:keys="subIndex"
+									:class="[isReviewed && item.answerStatus!=4 &&(item.blankString != item.rightAnswer)? 'wrong':'']">
+									<view class="content-solutions-item-single">{{subIndex+1}}</view>
+									<input :disabled="isReviewed" type="text" class="content-solutions-blank"
+										v-model="item.blankArr[subIndex]" placeholder="请在此处输入答案" />
+								</view>
+							</template>
+							<template v-else>
+								<view class="content-solutions-item">
+									<view class="content-solutions-item-single"></view>
+									<!-- TODOvalue的绑定值不对 :value="item.blankArr[subIndex].replace(/&quot\;/g, '')" -->
+									<input :disabled="isReviewed" :value="(item.blankArr).join(',')" type="text"
+										class="content-solutions-blank" />
+								</view>
+							</template>
+						</view>
+						<!-- type == 5 简答题 -->
+						<view class="content-solutions" v-if='item.template == 5'>
+							<textarea v-if="!isReviewed" @input="textInput" :disabled="isReviewed" placeholder="请输入您的答案"
+								auto-height />
+							<textarea v-else :disabled="isReviewed" :value="item.tempAnswer.replace(/&quot\;/g, '')"
+								auto-height />
+						</view>
+
+						<view class="explain" v-if='isReviewed'>
+							<u-tag v-show="item.answerStatus==1" text="未答" type="error" />
+							<u-tag v-show="item.answerStatus==2" text="正确" type="success" />
+							<u-tag v-show="item.answerStatus==3" text="错误" type="error" />
+							<u-tag v-show="item.answerStatus==4" text="未评分" type="warning" />
+							<u-tag v-show="item.answerStatus==5" text="已评分" type="warning" />
+							<u-tag v-show="item.answerStatus==6" text="已答" type="warning" />
+							<view class="explain-title">正确答案:</view>
+							<!-- <span class="text">{{item.rightAnswer}}</span> -->
+							<u-parse :html="item.rightAnswer"></u-parse>
+							<view class="explain-title">试题解析:</view>
+							<!-- <view class="explain-content">{{item.queAnalysis | analysisFilter }}</view> -->
+							<u-parse :html="item.queAnalysis?item.queAnalysis:'暂无'"></u-parse>
+							<view class="noteArea">
+								<view class="noteAreaTitle">
+									<view class="explain-title">我的笔记:</view>
+									<view v-if="eidtOrFinishValue=='编辑笔记'" class="funcGroup" @click="editBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>编辑笔记</span>
+									</view>
+									<view v-else class="funcGroup" @click="finishBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>完成</span>
+									</view>
+								</view>
+								<!-- 只有回答过的题目才能编辑笔记!!! -->
+								<text-editor :noteId="item.id" :textContent="item.theoryExamAnswer.queNote"
+									:isreadOnly="isreadOnly" @editorInput='updateEditorText'>
+								</text-editor>
+							</view>
+						</view>
+					</scroll-view>
+				</swiper-item>
+			</template>
+		</swiper>
+
+		<!-- 底部栏 -->
+		<view class="footer" id="footer">
+			<view class="footer-back" @click='handleChangeCurrentSwiper(-1)'>上一题</view>
+			<view class="footer-card" @click="showQuestion = !showQuestion">答题卡</view>
+			<view class="footer-right" @click='handleChangeCurrentSwiper(1)'>下一题</view>
+		</view>
+
+		<!-- 答题卡弹出层 -->
+		<modal v-model="showQuestion">
+			<view class='question-modal' :style="{'height': modalHeight}">
+				<view class="question-modal-header" id="questionHeader">
+					答题卡
+				</view>
+				<scroll-view scroll-y class="question-modal-body" :style="{'height': modalContentHeight}">
+					<template v-for="(subItem,subIndex) in queTypeArr">
+						<view class="queTypeName" v-show="queTypeStore[subIndex]>0">{{subItem.name}}</view>
+						<!-- <u-tag :text="subItem.name"  v-show="queTypeStore[subIndex]>0" mode="dark" /> -->
+						<view class="queTypeArea">
+
+							<template v-for="(item, index) in questionList">
+								<view v-show="item.template == subItem.value">
+
+									<!-- 1.复习状态且回答正确 -->
+									<!-- <view v-if='item.tempAnswer && item.answer==item.tempAnswer && isReviewed' -->
+									<view v-if='isReviewed && item.answerStatus == "2"'
+										class="question-modal-body-item question-modal-body-item-right"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 2.复习状态且回答错误 -->
+									<view
+										v-else-if='isReviewed && (item.answerStatus == "1" ||item.answerStatus == "3" )'
+										class="question-modal-body-item question-modal-body-item-failed"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 3.复习状态且简答题未评分或者已评分 -->
+									<view
+										v-else-if='isReviewed && (item.answerStatus == "4" ||item.answerStatus == "5")'
+										class="question-modal-body-item question-modal-body-item-unScored"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 3.非复习状态且已经作答 -->
+									<view v-else-if='!isReviewed && item.tempAnswer && item.tempAnswer.length != 0'
+										class="question-modal-body-item question-modal-body-item-select"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 4.非复习状态且未作答 -->
+									<view v-else class="question-modal-body-item question-modal-body-item-unselect"
+										@click="handleJumpSwiper(index)">
+										{{index + 1 }}
+									</view>
+									<!-- <u-line color="red" border-style="info"></u-line> -->
+								</view>
+							</template>
+						</view>
+					</template>
+				</scroll-view>
+				<view class="question-modal-foot" id="questionHeader">
+					<view v-if="!isReviewed" class="ansBlock">
+						<view class="blockItem">
+							<view class="block-ansed"></view>
+							<view class="">已答</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-unansed"></view>
+							<view class="">未答</view>
+						</view>
+					</view>
+
+					<view v-else class="ansBlock">
+						<view class="blockItem">
+							<view class="block-right"></view>
+							<view class="">答对</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-wrong"></view>
+							<view class="">答错</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-unScored"></view>
+							<view class="">未评分</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</modal>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import Modal from './modal.vue'
+	import clock from '@/components/clock/clock.vue';
+	export default {
+		data() {
+			return {
+				isreadOnly: true,
+				quesModules: [],
+				areaText: ``, //保存简答题答案
+				judgeArr: [{
+						name: '正确',
+						value: '1'
+					},
+					{
+						name: '错误',
+						value: '0'
+					}
+				],
+				queTypeArr: [{
+						name: '单选题',
+						value: '1',
+						be: false,
+					},
+					{
+						name: '多选题',
+						value: '2',
+						be: false,
+					},
+					{
+						name: '判断题',
+						value: '3',
+						be: false,
+					},
+					{
+						name: '填空题',
+						value: '4',
+						be: false,
+					},
+					{
+						name: '简答题',
+						value: '5',
+						be: false,
+					}
+				],
+				currentIndex: 0,
+				swiperHeight: '667px',
+				modalHeight: '500px',
+				modalContentHeight: '400px',
+				showQuestion: false,
+				articleEditorValue: '',
+				eidtOrFinishValue: '编辑笔记',
+				// eidtOrFinish: true,
+				editorText: '',
+				editor: 'editor',
+			}
+		},
+		filters: {
+			// 判断答案状态
+			analysisFilter(item) {
+				if (item == null) {
+					return "暂无解析"
+				} else {
+					return item
+				}
+			}
+		},
+		watch: {
+			// 监听currentIndex的变化,改变则提交答案 相同
+			currentIndex(newVal, oldVal) {
+				let that = this
+				if (!this.isReviewed) {
+					// 对各题型的答案进行处理
+					switch (that.questionList[oldVal].template) {
+						case 1:
+							// 选择题
+							break;
+						case 2:
+							// 多选题
+							// that.questionList[that.currentIndex].tempAnswer = that.questionList[that.currentIndex]
+							// 	.dualChooseArr.join(',')
+							break;
+						case 3:
+							// 判断题
+							break;
+						case 4:
+							// 填空题
+							that.questionList[oldVal].tempAnswer = that.questionList[oldVal].blankArr.join(
+								'||~||') // 数组拼接为字符串
+							break;
+						case 5:
+							that.questionList[oldVal].tempAnswer = JSON.stringify(that.areaText)
+							// console.log('000:',that.questionList[oldVal].tempAnswer);
+							break;
+						default:
+					}
+
+					if (this.examType == 'exam') {
+						// 保存答案
+						var answerObj = {
+							examRecordId: this.questionList[oldVal].recordId,
+							paperQueId: this.questionList[oldVal].id,
+							answer: this.questionList[oldVal].tempAnswer,
+							template: this.questionList[oldVal].template
+						}
+
+						// 进行答题的api请求
+						console.log('answerObj:', oldVal, answerObj);
+						this.$api.answerExam(answerObj)
+							.then(res => {
+								console.log(res);
+							})
+					} else if (this.examType == 'paper' || this.examType == 'know') {
+						var answerObj = {
+							exerciseId: this.examDetail.exerciseId,
+							paperQueId: this.questionList[oldVal].id,
+							answer: this.questionList[oldVal].tempAnswer,
+							template: this.questionList[oldVal].template
+						}
+
+						// 进行答题的api请求
+						console.log('answerObj:', oldVal, answerObj);
+						this.$api.answerPaper(answerObj)
+							.then(res => {
+								console.log(res);
+							})
+					} else {
+						return
+					}
+					// immediate: true,
+				}
+			}
+		},
+		computed: {
+			// swiperHeight(){
+			// 	uni.getSystemInfo({
+			// 		success(res) {
+			// 			console.log(res);
+			// 			return res.windowHeight+'px'
+			// 		}
+			// 	})
+			// },
+			examDetail() {
+				return this.$store.state.examDetail
+			},
+			questionList() {
+				console.log(this.$store.state.questionList, 77777)
+				return
+				this.$store.state.questionList
+			},
+			queTypeStore() {
+				return this.$store.state.queTypeArr
+			},
+			max() {
+				return this.questionList.length - 1
+			},
+			answerStatusName() {
+				switch (this.questionList[this.currentIndex].template) {
+					case 1:
+						return '单选题'
+						break;
+					case 2:
+						return '多选题'
+						break;
+					case 3:
+						return '判断题'
+						break;
+					case 4:
+						return '填空题'
+						break;
+					case 5:
+						return '简答题'
+						break;
+					default:
+						return '考试题'
+				}
+			}
+		},
+		props: {
+			isReviewed: {
+				type: Boolean,
+				default: false
+			},
+			examType: {
+				type: String,
+				default: "exam"
+			},
+			duration: {
+				type: [String, Number],
+				default: 300
+			},
+		},
+		mounted() {
+			var that = this
+			this.setAnswerHeight()
+			if ((!this.isReviewed) && ((this.examType == 'paper') || (this.examType == 'course'))) {
+				this.$refs.myClock.start();
+			}
+		},
+		components: {
+			Modal,
+			clock
+		},
+		methods: {
+			/*设置题目的高度*/
+			setAnswerHeight() {
+				let that = this
+				let tempHeight = 0
+				uni.getSystemInfo({
+					//获取手机屏幕高度信息,让swiper的高度和手机屏幕一样高                
+					success: function(res) {
+						tempHeight = res.windowHeight;
+						that.modalHeight = res.windowHeight - uni.upx2px(200) + 'px';
+						that.modalContentHeight = res.windowHeight - uni.upx2px(380) + 'px';
+						uni.createSelectorQuery().in(that).select("#header").fields({
+							size: true,
+							scrollOffset: true
+						}, (data) => {
+							console.log('data', data);
+							tempHeight -= data.height;
+							uni.createSelectorQuery().in(that).select("#subHeader").fields({
+								size: true,
+								scrollOffset: true
+							}, (data) => {
+								tempHeight -= data.height;
+								uni.createSelectorQuery().in(that).select("#footer").fields({
+									size: true,
+									scrollOffset: true
+								}, (data) => {
+									tempHeight -= data.height;
+									that.swiperHeight = tempHeight + 'px';
+								}).exec();
+							}).exec();
+						}).exec();
+					}
+				});
+			},
+			/* 跳转指定题目 */
+			handleJumpSwiper(index) {
+				this.currentIndex = index
+				this.showQuestion = false
+			},
+			change(timestamp) {
+				// var that = this
+				if (timestamp == 30) {
+					this.$refs.uToast.show({
+						title: '考试只剩余30s,请注意时间',
+						type: 'warning',
+						duration: 2000,
+						position: 'top'
+					})
+				}
+				// this.$forceUpdate()
+			},
+			end() {
+				this.$refs.uToast.show({
+					title: '考试时间结束,已自动交卷',
+					type: 'warning'
+				})
+				setTimeout(() => {
+					this.handleSubmit(0)
+				}, 2000)
+			},
+			textInput(e) {
+				this.areaText = e.detail.value
+				// console.log(e.detail.value)
+			},
+			/* 滑动题目 */
+			handleSwiperChanged(event) {
+				this.currentIndex = event.detail.current
+			},
+			/* 调用上一页,下一页 */
+			handleChangeCurrentSwiper(operation) {
+				let max = this.questionList.length - 1
+				let min = 0
+				// 进行翻页
+				if ((this.currentIndex > min && operation < 0) || (this.currentIndex < max && operation > 0)) {
+					this.currentIndex += operation
+					// console.log(this.currentIndex)
+				}
+			},
+			/* 选择答案(单选)*/
+			chooseSolution(item, subItem) {
+				if (!this.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = subItem.optLetter
+					// 强制刷新更新视图
+					this.$forceUpdate()
+					// this.questionList[this.currentIndex].tempAnswer = subItem.optLetter
+					if (this.currentIndex < this.max) {
+						setTimeout(() => {
+							this.currentIndex += 1
+						}, 300)
+					}
+					// this.onAnswerChange(item)
+				}
+			},
+			/* 选择答案(多选)*/
+			chooseMutiSolution(item, subItem) {
+				if (!this.isReviewed) {
+					let answerIndex = item.dualChooseArr.indexOf(subItem.optLetter)
+					if (answerIndex > -1) {
+						// 该选项已经在数组中了
+						item.dualChooseArr.splice(answerIndex, 1)
+					} else {
+						// 该选项不在数组中
+						item.dualChooseArr.push(subItem.optLetter)
+					}
+					item.tempAnswer = item.dualChooseArr.join(',')
+					// this.onAnswerChange(answerIndex)
+					// 强制刷新更新视图
+					this.$forceUpdate()
+				}
+			},
+			/* 判断题答案 */
+			judgeSolution(item, value) {
+				if (!this.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = value
+					// 强制刷新更新视图
+					this.$forceUpdate()
+					if (this.currentIndex < this.max) {
+						setTimeout(() => {
+							this.currentIndex += 1
+						}, 300)
+					}
+					// this.onAnswerChange(item)
+				}
+			},
+
+			/* 题目答案变化 */
+			onAnswerChange(item) {
+				let result = JSON.parse(JSON.stringify(item))
+				this.$emit('onChange', item)
+			},
+			/* 交卷  相同 */
+			handleSubmit(submitORimeEnd) {
+				/*submitORimeEnd == 1,submit
+				  submitORimeEnd == 0,stimeEnd*/
+				if (this.currentIndex == 0) {
+					this.currentIndex++
+				} else {
+					this.currentIndex = 0
+				}
+				if (submitORimeEnd) {
+					// this.$emit('submit', this.questionList)
+					this.$emit('submit')
+				} else {
+					this.$emit('timeEnd')
+				}
+			},
+
+			// 点击编辑笔记
+			editBtnFunc(item) {
+				if (item.theoryExamAnswer.id == undefined) {
+					this.$refs.uToast.show({
+						title: '未作答的题目不可编辑笔记!',
+						type: 'error',
+						// url: '/pages/user/index'
+					})
+					return
+				}
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '完成'
+			},
+			// 完成编辑
+			finishBtnFunc(item) {
+				var that = this
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '编辑笔记'
+				console.log('保存笔记内容', item, that.editorText);
+				this.$api.examNote(item.theoryExamAnswer.id, that.editorText)
+					.then(res => {
+						console.log('更新笔记成功', res)
+					})
+			},
+			updateEditorText(text) {
+				// 从子组件获取输入框输入内容
+				this.editorText = text
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #FFFFFF;
+	}
+
+	#header,
+	#subHeader {
+		height: 100rpx;
+	}
+
+	.header {
+		width: 750rpx;
+		// position: fixed;
+		margin-top: 30rpx;
+		position: relative;
+		text-align: center;
+		line-height: 100rpx;
+		font-size: 36rpx;
+		font-weight: 600;
+		color: #103289;
+		letter-spacing: 10rpx;
+		background-color: #FFFFFF;
+
+		&-button {
+			width: 80rpx;
+			height: 40rpx;
+			line-height: 40rpx;
+			position: absolute;
+			top: 20rpx;
+			right: 40rpx;
+			padding: 10rpx 20rpx;
+			border-radius: 15rpx;
+			letter-spacing: 2rpx;
+			font-weight: 500;
+			color: #FFFFFF;
+			background-color: #103289;
+		}
+
+		.scoreText {
+			color: #00b060;
+			font-size: 35rpx;
+		}
+	}
+
+	.sub-header {
+		width: 750rpx;
+		// position: fixed;
+		// margin-top: 130rpx;
+		padding: 30rpx 20rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		color: #000;
+		font-size: 33rpx;
+		font-weight: bold;
+		background-color: #FFFFFF;
+	}
+
+	.content {
+		// margin-top: 130rpx;
+		letter-spacing: 3rpx;
+
+		.typeTag {
+			margin-right: 20rpx;
+		}
+
+		&-item-explain {
+			padding-bottom: 20rpx;
+			font-size: 30rpx;
+			color: #8799a3;
+			letter-spacing: 5rpx;
+			border-top: 1px solid rgba(0, 0, 0, 0.1);
+
+			&-result {
+				padding: 20rpx 0;
+
+				span {
+					padding-left: 20rpx;
+					color: #39b54a;
+				}
+			}
+
+			&-content {
+				padding: 20rpx 0;
+			}
+		}
+
+		&-item {
+			padding: 0 20rpx;
+			box-sizing: border-box;
+		}
+
+		&-title {
+			margin-bottom: 30rpx;
+			font-size: 32rpx;
+			line-height: 55rpx;
+			color: #000
+		}
+
+		&-solutions {
+			width: 100%;
+			padding-bottom: 20rpx;
+
+			&-item {
+				margin: 40rpx 0;
+				border: 5rpx solid #103289;
+				border-radius: 20rpx;
+				display: flex;
+				align-items: center;
+				font-size: 30rpx;
+				background-color: #103289;
+
+				&-check-content {
+					padding: 35rpx 20rpx;
+					width: 100%;
+					border-radius: 15rpx;
+					color: #103289;
+					background-color: #FFFFFF;
+				}
+
+				&-single {
+					width: 80rpx;
+					text-align: center;
+					color: #FFFFFF;
+				}
+
+				&-content {
+					padding: 35rpx 20rpx;
+					width: 630rpx;
+					border-top-right-radius: 15rpx;
+					border-bottom-right-radius: 15rpx;
+					color: #000;
+					background-color: #FFFFFF;
+				}
+
+				&-select {
+					color: #FFFFFF;
+					background-color: #103289;
+				}
+			}
+
+			&-judge {
+				display: flex;
+				justify-content: space-around;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+				text-align: center;
+				font-size: 30rpx;
+
+				.content-solutions-judge-item {
+					border: 5rpx solid #103289;
+					border-radius: 60rpx;
+					width: 300rpx;
+					padding: 35rpx 20rpx; // 控制单元格的高度
+				}
+
+				.content-solutions-judge-select {
+					color: #FFFFFF;
+					background-color: #103289;
+				}
+
+			}
+
+			&-blank {
+				// border: 5rpx solid #103289;
+				height: 60rpx;
+				width: 90%;
+				// border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+
+			&-fillItem {
+				border: 5rpx solid #103289;
+				border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+		}
+
+		.explain {
+			border-top: solid #999999 1px;
+			padding-top: 10rpx;
+			font-size: 28rpx;
+			color: #666666;
+
+			.explainResult {
+				color: #103289;
+			}
+
+			.explain-title {
+				font-weight: bold;
+			}
+
+			.noteArea {
+				border-top: 2rpx solid #103289;
+				padding-top: 10rpx;
+
+				// background-color: #0077AA;
+				.noteAreaTitle {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+	}
+
+	.footer {
+		width: 750rpx;
+		height: 100rpx;
+		padding: 30rpx 20rpx;
+		position: fixed;
+		bottom: 0;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		font-size: 30rpx;
+		box-sizing: border-box;
+		color: #4c8af3;
+		box-shadow: 0 0 5px 1px #eee;
+		background-color: #FFFFFF;
+
+		&-card {
+			padding: 10rpx 20rpx;
+			border: 1px solid #103289;
+			border-radius: 15rpx;
+			color: #FFFFFF;
+			background-color: #103289;
+		}
+	}
+
+	.question-modal {
+		width: 700rpx;
+		padding: 40rpx;
+		background-color: #FFFFFF;
+
+		&-header {
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			font-size: 35rpx;
+			color: #333333;
+			border-bottom: 1rpx solid #F0F0F0;
+		}
+
+		&-body {
+
+			// margin-bottom: 100rpx;
+			.queTypeName {
+				font-size: 32rpx;
+				font-weight: bold;
+
+			}
+
+			.queTypeArea {
+				display: flex;
+				flex-direction: row;
+				flex-wrap: wrap;
+				margin-bottom: 20rpx;
+
+				.question-modal-body-item {
+					width: 80rpx;
+					height: 80rpx;
+					margin: 10rpx 22rpx;
+					line-height: 80rpx;
+					font-size: 35rpx;
+					text-align: center;
+					border-radius: 50%;
+					color: #ffffff;
+					// background-color: #0077AA;
+				}
+			}
+
+			&-item-unselect {
+				// color: #FFFFFF;
+				background-color: #bbbbbb;
+			}
+
+			&-item-select {
+				// color: #FFFFFF;
+				background-color: #103289;
+			}
+
+			&-item-failed {
+				color: #FFFFFF;
+				background-color: #982121;
+			}
+
+			&-item-right {
+				color: #FFFFFF;
+				background-color: #39b54a;
+			}
+
+			&-item-unScored {
+				color: #FFFFFF;
+				background-color: #ff9f73;
+			}
+		}
+
+		.question-modal-foot {
+			height: 100rpx;
+			border-top: 1rpx solid #F0F0F0;
+			// position: fixed;
+			// margin-bottom: 0rpx;
+			margin-top: -60rpx;
+
+			.ansBlock {
+				display: flex;
+				justify-content: center;
+
+				// align-items: center;
+				.blockItem {
+					display: flex;
+					align-items: center;
+					margin: 20rpx;
+				}
+
+				.block-ansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #103289;
+					margin: 0 10rpx;
+				}
+
+				.block-unansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					// border: solid #ffffff 1px;
+					background: #bbbbbb;
+					margin: 0 10rpx;
+				}
+
+				.block-right {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #39b54a;
+					margin: 0 10rpx;
+				}
+
+				.block-wrong {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #982121;
+					margin: 0 10rpx;
+				}
+
+				.block-unScored {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #ff9f73;
+					margin: 0 10rpx;
+				}
+			}
+
+		}
+	}
+
+	.right {
+		border: 8rpx solid #39b54a;
+	}
+
+	.wrong {
+		border: 8rpx solid #d81717;
+	}
+</style>
diff --git a/components/dyw-answer/answer.vue b/components/dyw-answer/answer.vue
new file mode 100644
index 0000000..9ea969b
--- /dev/null
+++ b/components/dyw-answer/answer.vue
@@ -0,0 +1,998 @@
+<template>
+	<!-- 此组件用于显示整套试卷· 
+	试卷类型包含
+	exam 理论考试
+	paper 模拟考试 知识点练习 -->
+	<view>
+		<!-- 大标题 -->
+		<view class="header" id="header">
+			<!-- 			<span class="header-button" @click='leave' v-if='!isReviewed && examType=='know' '>暂离</span> -->
+			<span v-if="examType=='exam'"> {{examDetail.exam.name}}</span>
+			<span v-if="(examType=='paper' )|| (examType=='know') || (examType=='course')">
+				{{examDetail.paper.name}}</span>
+			<span class="header-button" @click='handleSubmit(1)' v-if='!isReviewed'>交卷</span>
+			<!-- <span class="scoreText" v-else>得分:{{examDetail.score}}</span> -->
+		</view>
+		<!-- 小标题栏 -->
+		<view id="subHeader">
+			<view class="sub-header" v-if='questionList.length > 0'>
+				<u-tag class="typeTag" :text="answerStatusName" mode="dark" shape="circle" />
+				<view v-if="examDetail.exam.examTime<=0">不限时</view>
+				<u-count-down v-if="(!isReviewed)&&(examType=='exam')&& (examDetail.exam.examTime>0)"
+					:timestamp="examDetail.exam.examTime / 1000" :show-days="false" @end="end" @change="change">
+				</u-count-down>
+				<clock v-if="(!isReviewed)&&(examType=='paper' || (examType=='course'))" ref="myClock"
+					:timeOrigin="parseInt(examDetail.time)">
+				</clock>
+				<span v-if="examType=='exam'">第
+					{{currentIndex+1}}/{{examDetail.exam.totalQuestion}} 题</span>
+				<span v-if="(examType=='paper' )|| (examType=='know')">第
+					{{currentIndex+1}}/{{examDetail.totalQuestion}} 题</span>
+			</view>
+		</view>
+
+		<!-- 答题区域 -->
+		<swiper class="content" :duration='duration' :current=currentIndex @change='handleSwiperChanged'
+			v-if='questionList.length > 0' :style="{'height':swiperHeight}">
+			<template v-for='item in questionList'>
+				<swiper-item class="content-item">
+					<scroll-view scroll-y :style="{'height':swiperHeight}">
+						<!-- 显示题目的题干 -->
+						<view class="content-title">
+							<rich-text :nodes="item.subjectName"></rich-text>
+						</view>
+						<!-- 以下显示选项 -->
+						<!-- type == 0 单选题 -->
+						<view class="content-solutions" v-if='item.template == 0'>
+							<template v-for='subItem in item.options'>
+								<view
+									:class="[isReviewed && subItem.optAnswer == 1 ? 'right': '',isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseSolution(item,subItem)'>
+									<view v-if="(!isReviewed) && (examType=='exam') "
+										class="content-solutions-item-single">
+										{{subItem.newOptLetter}}
+									</view>
+									<view v-else class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<!-- 此处注意optLetter与newOptLetter的区别,newOptLetter是ABCD顺序的,而optLetter乱序的,两者无直接关系 -->
+									<view
+										:class="item.tempAnswer == subItem.optLetter? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 1 多选题 -->
+						<view class="content-solutions" v-if='item.template == 1'>
+							<template v-for='subItem in item.options'>
+								<view
+									:class="[isReviewed && subItem.optAnswer == 1 ? 'right': '',isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseMutiSolution(item,subItem)'>
+									<view v-if="(!isReviewed) && (examType=='exam') "
+										class="content-solutions-item-single">
+										{{subItem.newOptLetter}}
+									</view>
+									<view v-else class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<!-- TODO 是否被选中的条件判断不对 -->
+									<view
+										:class="item.tempAnswer.indexOf(subItem.optLetter) >-1 ? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}
+									</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 2 判断题 -->
+						<view class="content-solutions" v-if='item.template == 2'>
+							<template v-for='subItem in item.options'>
+								<view class="content-solutions-judge">
+									<view v-for="(judgeItem,judgeIndex) in judgeArr"
+										:class="[item.tempAnswer == judgeItem.value? 'content-solutions-item-select' : '',isReviewed && (item.rightAnswer==judgeItem.name)  ? 'right': '',isReviewed && (item.wrongArr ==judgeItem.value)  ? 'wrong': '']"
+										class="content-solutions-judge-item"
+										@click='judgeSolution(item,judgeItem.value)'>{{judgeItem.name}}</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 4 填空题 -->
+						<view class="content-solutions" v-if='item.template == 4'>
+							<template v-if="!isReviewed">
+								<view class="content-solutions-item" v-for='(subItem,subIndex) in item.options'
+									:keys="subIndex"
+									:class="[isReviewed && item.answerStatus!=4 &&(item.blankString != item.rightAnswer)? 'wrong':'']">
+									<view class="content-solutions-item-single">{{subIndex+1}}</view>
+									<input :disabled="isReviewed" type="text" class="content-solutions-blank"
+										v-model="item.blankArr[subIndex]" placeholder="请在此处输入答案" />
+								</view>
+							</template>
+							<template v-else>
+								<view class="content-solutions-item">
+									<view class="content-solutions-item-single"></view>
+									<!-- TODOvalue的绑定值不对 :value="item.blankArr[subIndex].replace(/&quot\;/g, '')" -->
+									<input :disabled="isReviewed" :value="(item.blankArr).join(',')" type="text"
+										class="content-solutions-blank" />
+								</view>
+							</template>
+						</view>
+						<!-- type == 5 简答题 -->
+						<view class="content-solutions" v-if='item.template == 5'>
+							<textarea v-if="!isReviewed" @input="textInput" :disabled="isReviewed" placeholder="请输入您的答案"
+								auto-height />
+							<textarea v-else :disabled="isReviewed" :value="item.tempAnswer.replace(/&quot\;/g, '')"
+								auto-height />
+						</view>
+
+						<view class="explain" v-if='isReviewed'>
+							<u-tag v-show="item.answerStatus==1" text="未答" type="error" />
+							<u-tag v-show="item.answerStatus==2" text="正确" type="success" />
+							<u-tag v-show="item.answerStatus==3" text="错误" type="error" />
+							<u-tag v-show="item.answerStatus==4" text="未评分" type="warning" />
+							<u-tag v-show="item.answerStatus==5" text="已评分" type="warning" />
+							<u-tag v-show="item.answerStatus==6" text="已答" type="warning" />
+							<view class="explain-title">正确答案:</view>
+							<!-- <span class="text">{{item.rightAnswer}}</span> -->
+							<u-parse :html="item.rightAnswer"></u-parse>
+							<view class="explain-title">试题解析:</view>
+							<!-- <view class="explain-content">{{item.queAnalysis | analysisFilter }}</view> -->
+							<u-parse :html="item.queAnalysis?item.queAnalysis:'暂无'"></u-parse>
+							<view class="noteArea">
+								<view class="noteAreaTitle">
+									<view class="explain-title">我的笔记:</view>
+									<view v-if="eidtOrFinishValue=='编辑笔记'" class="funcGroup" @click="editBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>编辑笔记</span>
+									</view>
+									<view v-else class="funcGroup" @click="finishBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>完成</span>
+									</view>
+								</view>
+								<!-- 只有回答过的题目才能编辑笔记!!! -->
+								<text-editor :noteId="item.id" :textContent="item.theoryExamAnswer.queNote"
+									:isreadOnly="isreadOnly" @editorInput='updateEditorText'>
+								</text-editor>
+							</view>
+						</view>
+					</scroll-view>
+				</swiper-item>
+			</template>
+		</swiper>
+
+		<!-- 底部栏 -->
+		<view class="footer" id="footer">
+			<view class="footer-back" @click='handleChangeCurrentSwiper(-1)'>上一题</view>
+			<view class="footer-card" @click="showQuestion = !showQuestion">答题卡</view>
+			<view class="footer-right" @click='handleChangeCurrentSwiper(1)'>下一题</view>
+		</view>
+
+		<!-- 答题卡弹出层 -->
+		<modal v-model="showQuestion">
+			<view class='question-modal' :style="{'height': modalHeight}">
+				<view class="question-modal-header" id="questionHeader">
+					答题卡
+				</view>
+				<scroll-view scroll-y class="question-modal-body" :style="{'height': modalContentHeight}">
+					<template v-for="(subItem,subIndex) in queTypeArr">
+						<view class="queTypeName" v-show="queTypeStore[subIndex]>=0">{{subItem.name}}</view>
+						<!-- <u-tag :text="subItem.name"  v-show="queTypeStore[subIndex]>0" mode="dark" /> -->
+						<view class="queTypeArea">
+
+							<template v-for="(item, index) in questionList">
+								<view v-show="item.template == subItem.value">
+
+									<!-- 1.复习状态且回答正确 -->
+									<!-- <view v-if='item.tempAnswer && item.answer==item.tempAnswer && isReviewed' -->
+									<view v-if='isReviewed && item.answerStatus == "2"'
+										class="question-modal-body-item question-modal-body-item-right"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 2.复习状态且回答错误 -->
+									<view
+										v-else-if='isReviewed && (item.answerStatus == "1" ||item.answerStatus == "3" )'
+										class="question-modal-body-item question-modal-body-item-failed"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 3.复习状态且简答题未评分或者已评分 -->
+									<view
+										v-else-if='isReviewed && (item.answerStatus == "4" ||item.answerStatus == "5")'
+										class="question-modal-body-item question-modal-body-item-unScored"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 3.非复习状态且已经作答 -->
+									<view v-else-if='!isReviewed && item.tempAnswer && item.tempAnswer.length != 0'
+										class="question-modal-body-item question-modal-body-item-select"
+										@click="handleJumpSwiper(index)">{{index + 1 }}</view>
+									<!-- 4.非复习状态且未作答 -->
+									<view v-else class="question-modal-body-item question-modal-body-item-unselect"
+										@click="handleJumpSwiper(index)">
+										{{index + 1 }}
+									</view>
+									<!-- <u-line color="red" border-style="info"></u-line> -->
+								</view>
+							</template>
+						</view>
+					</template>
+				</scroll-view>
+				<view class="question-modal-foot" id="questionHeader">
+					<view v-if="!isReviewed" class="ansBlock">
+						<view class="blockItem">
+							<view class="block-ansed"></view>
+							<view class="">已答</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-unansed"></view>
+							<view class="">未答</view>
+						</view>
+					</view>
+
+					<view v-else class="ansBlock">
+						<view class="blockItem">
+							<view class="block-right"></view>
+							<view class="">答对</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-wrong"></view>
+							<view class="">答错</view>
+						</view>
+						<view class="blockItem">
+							<view class="block-unScored"></view>
+							<view class="">未评分</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</modal>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import Modal from './modal.vue'
+	import clock from '@/components/clock/clock.vue';
+	export default {
+		data() {
+			return {
+				isreadOnly: true,
+				quesModules: [],
+				areaText: ``, //保存简答题答案
+				judgeArr: [{
+						name: '正确',
+						value: '1'
+					},
+					{
+						name: '错误',
+						value: '0'
+					}
+				],
+				queTypeArr: [{
+						name: '单选题',
+						value: '0',
+						be: false,
+					},
+					{
+						name: '多选题',
+						value: '1',
+						be: false,
+					},
+					{
+						name: '判断题',
+						value: '2',
+						be: false,
+					},
+					{
+						name: '填空题',
+						value: '4',
+						be: false,
+					},
+					{
+						name: '简答题',
+						value: '5',
+						be: false,
+					}
+				],
+				currentIndex: 0,
+				swiperHeight: '667px',
+				modalHeight: '500px',
+				modalContentHeight: '400px',
+				showQuestion: false,
+				articleEditorValue: '',
+				eidtOrFinishValue: '编辑笔记',
+				// eidtOrFinish: true,
+				editorText: '',
+				editor: 'editor',
+			}
+		},
+		filters: {
+			// 判断答案状态
+			analysisFilter(item) {
+				if (item == null) {
+					return "暂无解析"
+				} else {
+					return item
+				}
+			}
+		},
+		watch: {
+			// 监听currentIndex的变化,改变则提交答案 相同
+			currentIndex(newVal, oldVal) {
+				let that = this
+				if (!this.isReviewed) {
+					// 对各题型的答案进行处理
+					switch (that.questionList[oldVal].template) {
+						case 0:
+							// 选择题
+							break;
+						case 1:
+							// 多选题
+							// that.questionList[that.currentIndex].tempAnswer = that.questionList[that.currentIndex]
+							// 	.dualChooseArr.join(',')
+							break;
+						case 2:
+							// 判断题
+							break;
+						case 4:
+							// 填空题
+							that.questionList[oldVal].tempAnswer = that.questionList[oldVal].blankArr.join(
+								'||~||') // 数组拼接为字符串
+							break;
+						case 5:
+							that.questionList[oldVal].tempAnswer = JSON.stringify(that.areaText)
+							// console.log('000:',that.questionList[oldVal].tempAnswer);
+							break;
+						default:
+					}
+
+					if (this.examType == 'exam') {
+						// 保存答案
+						var answerObj = {
+							examRecordId: this.questionList[oldVal].recordId,
+							paperQueId: this.questionList[oldVal].id,
+							answer: this.questionList[oldVal].tempAnswer,
+							template: this.questionList[oldVal].template
+						}
+
+						// 进行答题的api请求
+						console.log('answerObj:', oldVal, answerObj);
+						this.$api.answerExam(answerObj)
+							.then(res => {
+								console.log(res);
+							})
+					} else if (this.examType == 'paper' || this.examType == 'know') {
+						var answerObj = {
+							exerciseId: this.examDetail.exerciseId,
+							paperQueId: this.questionList[oldVal].id,
+							answer: this.questionList[oldVal].tempAnswer,
+							template: this.questionList[oldVal].template
+						}
+
+						// 进行答题的api请求
+						console.log('answerObj:', oldVal, answerObj);
+						this.$api.answerPaper(answerObj)
+							.then(res => {
+								console.log(res);
+							})
+					} else {
+						return
+					}
+					// immediate: true,
+				}
+			}
+		},
+		computed: {
+			// swiperHeight(){
+			// 	uni.getSystemInfo({
+			// 		success(res) {
+			// 			console.log(res);
+			// 			return res.windowHeight+'px'
+			// 		}
+			// 	})
+			// },
+			examDetail() {
+				return this.$store.state.examDetail
+			},
+			questionList() {
+				console.log(this.$store.state.questionList, 77777)
+				return this.$store.state.questionList
+			},
+			queTypeStore() {
+				return this.$store.state.queTypeArr
+			},
+			max() {
+				return this.questionList.length - 1
+			},
+			answerStatusName() {
+				console.log(this.questionList[this.currentIndex].template, 63636636366)
+				switch (this.questionList[this.currentIndex].template) {
+					case 0:
+						return '单选题'
+						break;
+					case 1:
+						return '多选题'
+						break;
+					case 2:
+						return '判断题'
+						break;
+					case 4:
+						return '填空题'
+						break;
+					case 5:
+						return '简答题'
+						break;
+					default:
+						return '考试题'
+				}
+			}
+		},
+		props: {
+			isReviewed: {
+				type: Boolean,
+				default: false
+			},
+			examType: {
+				type: String,
+				default: "exam"
+			},
+			duration: {
+				type: [String, Number],
+				default: 300
+			},
+		},
+		mounted() {
+			var that = this
+			this.setAnswerHeight()
+			if ((!this.isReviewed) && ((this.examType == 'paper') || (this.examType == 'course'))) {
+				this.$refs.myClock.start();
+			}
+		},
+		components: {
+			Modal,
+			clock
+		},
+		methods: {
+			/*设置题目的高度*/
+			setAnswerHeight() {
+				let that = this
+				let tempHeight = 0
+				uni.getSystemInfo({
+					//获取手机屏幕高度信息,让swiper的高度和手机屏幕一样高                
+					success: function(res) {
+						console.log(res, '010101010')
+						tempHeight = res.windowHeight;
+						that.modalHeight = res.windowHeight - uni.upx2px(200) + 'px';
+						that.modalContentHeight = res.windowHeight - uni.upx2px(380) + 'px';
+						uni.createSelectorQuery().in(that).select("#header").fields({
+							size: true,
+							scrollOffset: true
+						}, (data) => {
+							console.log('data', data);
+							tempHeight -= data.height;
+							uni.createSelectorQuery().in(that).select("#subHeader").fields({
+								size: true,
+								scrollOffset: true
+							}, (data) => {
+								tempHeight -= data.height;
+								uni.createSelectorQuery().in(that).select("#footer").fields({
+									size: true,
+									scrollOffset: true
+								}, (data) => {
+									tempHeight -= data.height;
+									that.swiperHeight = tempHeight + 'px';
+								}).exec();
+							}).exec();
+						}).exec();
+					}
+				});
+			},
+			/* 跳转指定题目 */
+			handleJumpSwiper(index) {
+				this.currentIndex = index
+				this.showQuestion = false
+			},
+			change(timestamp) {
+				// var that = this
+				if (timestamp == 30) {
+					this.$refs.uToast.show({
+						title: '考试只剩余30s,请注意时间',
+						type: 'warning',
+						duration: 2000,
+						position: 'top'
+					})
+				}
+				// this.$forceUpdate()
+			},
+			end() {
+				this.$refs.uToast.show({
+					title: '考试时间结束,已自动交卷',
+					type: 'warning'
+				})
+				setTimeout(() => {
+					this.handleSubmit(0)
+				}, 2000)
+			},
+			textInput(e) {
+				this.areaText = e.detail.value
+				// console.log(e.detail.value)
+			},
+			/* 滑动题目 */
+			handleSwiperChanged(event) {
+				this.currentIndex = event.detail.current
+			},
+			/* 调用上一页,下一页 */
+			handleChangeCurrentSwiper(operation) {
+				let max = this.questionList.length - 1
+				let min = 0
+				// 进行翻页
+				if ((this.currentIndex > min && operation < 0) || (this.currentIndex < max && operation > 0)) {
+					this.currentIndex += operation
+					// console.log(this.currentIndex)
+				}
+			},
+			/* 选择答案(单选)*/
+			chooseSolution(item, subItem) {
+				if (!this.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = subItem.optLetter
+					// 强制刷新更新视图
+					this.$forceUpdate()
+					// this.questionList[this.currentIndex].tempAnswer = subItem.optLetter
+					if (this.currentIndex < this.max) {
+						setTimeout(() => {
+							this.currentIndex += 1
+						}, 300)
+					}
+					// this.onAnswerChange(item)
+				}
+			},
+			/* 选择答案(多选)*/
+			chooseMutiSolution(item, subItem) {
+				if (!this.isReviewed) {
+					let answerIndex = item.dualChooseArr.indexOf(subItem.optLetter)
+					if (answerIndex > -1) {
+						// 该选项已经在数组中了
+						item.dualChooseArr.splice(answerIndex, 1)
+					} else {
+						// 该选项不在数组中
+						item.dualChooseArr.push(subItem.optLetter)
+					}
+					item.tempAnswer = item.dualChooseArr.join(',')
+					// this.onAnswerChange(answerIndex)
+					// 强制刷新更新视图
+					this.$forceUpdate()
+				}
+			},
+			/* 判断题答案 */
+			judgeSolution(item, value) {
+				if (!this.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = value
+					// 强制刷新更新视图
+					this.$forceUpdate()
+					if (this.currentIndex < this.max) {
+						setTimeout(() => {
+							this.currentIndex += 1
+						}, 300)
+					}
+					// this.onAnswerChange(item)
+				}
+			},
+
+			/* 题目答案变化 */
+			onAnswerChange(item) {
+				let result = JSON.parse(JSON.stringify(item))
+				this.$emit('onChange', item)
+			},
+			/* 交卷  相同 */
+			handleSubmit(submitORimeEnd) {
+				/*submitORimeEnd == 1,submit
+				  submitORimeEnd == 0,stimeEnd*/
+				if (this.currentIndex == 0) {
+					this.currentIndex++
+				} else {
+					this.currentIndex = 0
+				}
+				if (submitORimeEnd) {
+					// this.$emit('submit', this.questionList)
+					this.$emit('submit')
+				} else {
+					this.$emit('timeEnd')
+				}
+			},
+
+			// 点击编辑笔记
+			editBtnFunc(item) {
+				if (item.theoryExamAnswer.id == undefined) {
+					this.$refs.uToast.show({
+						title: '未作答的题目不可编辑笔记!',
+						type: 'error',
+						// url: '/pages/user/index'
+					})
+					return
+				}
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '完成'
+			},
+			// 完成编辑
+			finishBtnFunc(item) {
+				var that = this
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '编辑笔记'
+				console.log('保存笔记内容', item, that.editorText);
+				this.$api.examNote(item.theoryExamAnswer.id, that.editorText)
+					.then(res => {
+						console.log('更新笔记成功', res)
+					})
+			},
+			updateEditorText(text) {
+				// 从子组件获取输入框输入内容
+				this.editorText = text
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #FFFFFF;
+	}
+
+	#header,
+	#subHeader {
+		height: 100rpx;
+	}
+
+	.header {
+		width: 750rpx;
+		// position: fixed;
+		margin-top: 30rpx;
+		position: relative;
+		text-align: center;
+		line-height: 100rpx;
+		font-size: 36rpx;
+		font-weight: 600;
+		color: #103289;
+		letter-spacing: 10rpx;
+		background-color: #FFFFFF;
+
+		&-button {
+			width: 80rpx;
+			height: 40rpx;
+			line-height: 40rpx;
+			position: absolute;
+			top: 20rpx;
+			right: 40rpx;
+			padding: 10rpx 20rpx;
+			border-radius: 15rpx;
+			letter-spacing: 2rpx;
+			font-weight: 500;
+			color: #FFFFFF;
+			background-color: #103289;
+		}
+
+		.scoreText {
+			color: #00b060;
+			font-size: 35rpx;
+		}
+	}
+
+	.sub-header {
+		width: 750rpx;
+		// position: fixed;
+		// margin-top: 130rpx;
+		padding: 30rpx 20rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		color: #000;
+		font-size: 33rpx;
+		font-weight: bold;
+		background-color: #FFFFFF;
+	}
+
+	.content {
+		// margin-top: 130rpx;
+		letter-spacing: 3rpx;
+
+		.typeTag {
+			margin-right: 20rpx;
+		}
+
+		&-item-explain {
+			padding-bottom: 20rpx;
+			font-size: 30rpx;
+			color: #8799a3;
+			letter-spacing: 5rpx;
+			border-top: 1px solid rgba(0, 0, 0, 0.1);
+
+			&-result {
+				padding: 20rpx 0;
+
+				span {
+					padding-left: 20rpx;
+					color: #39b54a;
+				}
+			}
+
+			&-content {
+				padding: 20rpx 0;
+			}
+		}
+
+		&-item {
+			padding: 0 20rpx;
+			box-sizing: border-box;
+		}
+
+		&-title {
+			margin-bottom: 30rpx;
+			font-size: 32rpx;
+			line-height: 55rpx;
+			color: #000
+		}
+
+		&-solutions {
+			width: 100%;
+			padding-bottom: 20rpx;
+
+			&-item {
+				margin: 40rpx 0;
+				border: 5rpx solid #103289;
+				border-radius: 20rpx;
+				display: flex;
+				align-items: center;
+				font-size: 30rpx;
+				background-color: #103289;
+
+				&-check-content {
+					padding: 35rpx 20rpx;
+					width: 100%;
+					border-radius: 15rpx;
+					color: #103289;
+					background-color: #FFFFFF;
+				}
+
+				&-single {
+					width: 80rpx;
+					text-align: center;
+					color: #FFFFFF;
+				}
+
+				&-content {
+					padding: 35rpx 20rpx;
+					width: 630rpx;
+					border-top-right-radius: 15rpx;
+					border-bottom-right-radius: 15rpx;
+					color: #000;
+					background-color: #FFFFFF;
+				}
+
+				&-select {
+					color: #FFFFFF;
+					background-color: #103289;
+				}
+			}
+
+			&-judge {
+				display: flex;
+				justify-content: space-around;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+				text-align: center;
+				font-size: 30rpx;
+
+				.content-solutions-judge-item {
+					border: 5rpx solid #103289;
+					border-radius: 60rpx;
+					width: 300rpx;
+					padding: 35rpx 20rpx; // 控制单元格的高度
+				}
+
+				.content-solutions-judge-select {
+					color: #FFFFFF;
+					background-color: #103289;
+				}
+
+			}
+
+			&-blank {
+				// border: 5rpx solid #103289;
+				height: 60rpx;
+				width: 90%;
+				// border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+
+			&-fillItem {
+				border: 5rpx solid #103289;
+				border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+		}
+
+		.explain {
+			border-top: solid #999999 1px;
+			padding-top: 10rpx;
+			font-size: 28rpx;
+			color: #666666;
+
+			.explainResult {
+				color: #103289;
+			}
+
+			.explain-title {
+				font-weight: bold;
+			}
+
+			.noteArea {
+				border-top: 2rpx solid #103289;
+				padding-top: 10rpx;
+
+				// background-color: #0077AA;
+				.noteAreaTitle {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+	}
+
+	.footer {
+		width: 750rpx;
+		height: 100rpx;
+		padding: 30rpx 20rpx;
+		position: fixed;
+		bottom: 0;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		font-size: 30rpx;
+		box-sizing: border-box;
+		color: #4c8af3;
+		box-shadow: 0 0 5px 1px #eee;
+		background-color: #FFFFFF;
+
+		&-card {
+			padding: 10rpx 20rpx;
+			border: 1px solid #103289;
+			border-radius: 15rpx;
+			color: #FFFFFF;
+			background-color: #103289;
+		}
+	}
+
+	.question-modal {
+		width: 700rpx;
+		padding: 40rpx;
+		background-color: #FFFFFF;
+
+		&-header {
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			font-size: 35rpx;
+			color: #333333;
+			border-bottom: 1rpx solid #F0F0F0;
+		}
+
+		&-body {
+
+			// margin-bottom: 100rpx;
+			.queTypeName {
+				font-size: 32rpx;
+				font-weight: bold;
+
+			}
+
+			.queTypeArea {
+				display: flex;
+				flex-direction: row;
+				flex-wrap: wrap;
+				margin-bottom: 20rpx;
+
+				.question-modal-body-item {
+					width: 80rpx;
+					height: 80rpx;
+					margin: 10rpx 22rpx;
+					line-height: 80rpx;
+					font-size: 35rpx;
+					text-align: center;
+					border-radius: 50%;
+					color: #ffffff;
+					// background-color: #0077AA;
+				}
+			}
+
+			&-item-unselect {
+				// color: #FFFFFF;
+				background-color: #bbbbbb;
+			}
+
+			&-item-select {
+				// color: #FFFFFF;
+				background-color: #103289;
+			}
+
+			&-item-failed {
+				color: #FFFFFF;
+				background-color: #982121;
+			}
+
+			&-item-right {
+				color: #FFFFFF;
+				background-color: #39b54a;
+			}
+
+			&-item-unScored {
+				color: #FFFFFF;
+				background-color: #ff9f73;
+			}
+		}
+
+		.question-modal-foot {
+			height: 100rpx;
+			border-top: 1rpx solid #F0F0F0;
+			// position: fixed;
+			// margin-bottom: 0rpx;
+			margin-top: -60rpx;
+
+			.ansBlock {
+				display: flex;
+				justify-content: center;
+
+				// align-items: center;
+				.blockItem {
+					display: flex;
+					align-items: center;
+					margin: 20rpx;
+				}
+
+				.block-ansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #103289;
+					margin: 0 10rpx;
+				}
+
+				.block-unansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					// border: solid #ffffff 1px;
+					background: #bbbbbb;
+					margin: 0 10rpx;
+				}
+
+				.block-right {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #39b54a;
+					margin: 0 10rpx;
+				}
+
+				.block-wrong {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #982121;
+					margin: 0 10rpx;
+				}
+
+				.block-unScored {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #ff9f73;
+					margin: 0 10rpx;
+				}
+			}
+
+		}
+	}
+
+	.right {
+		border: 8rpx solid #39b54a;
+	}
+
+	.wrong {
+		border: 8rpx solid #d81717;
+	}
+</style>
diff --git a/components/dyw-answer/answerSingle.vue b/components/dyw-answer/answerSingle.vue
new file mode 100644
index 0000000..5048cfa
--- /dev/null
+++ b/components/dyw-answer/answerSingle.vue
@@ -0,0 +1,805 @@
+<template>
+	<!-- 此组件用于题库练习的单题展示 -->
+	<view>
+		<!-- 大标题 -->
+		<view class="header" id="header">
+			<span v-if="type=='store'" > {{storeInfo.storeName}}题库练习</span>
+			<span v-if="type=='error'" > {{storeInfo.storeName}}错题练习</span>
+			<!-- <span class="header-button" @click='handleSubmit(1)' v-if='!isReviewed'>提交</span> -->
+		</view>
+		<!-- 小标题栏 -->
+		<!-- 		<view id="subHeader">
+			<view class="sub-header" v-if='questionList.length>0'>
+		 		<clock v-if="(!isReviewed)&&examType=='paper'" ref="myClock" :timeOrigin="parseInt(examDetail.time)"></clock>
+				<clock @clockend="clockend" ref="myClock"></clock>
+				<u-toast ref="uToast" />
+				<span class='sub-header-number' v-if="(examType=='paper' )|| (examType=='know')">第
+					{{currentIndex+1}}/{{examDetail.totalQuestion}} 题</span>
+			</view>
+		</view> -->
+
+		<!-- 答题区域 -->
+		<swiper class="content" :duration='duration' :current=currentIndex @change='handleSwiperChanged'
+			v-if='questionList.length>0' :style="{'height':swiperHeight}">
+			<template v-for='item in questionList'>
+				<swiper-item class="content-item">
+					<scroll-view scroll-y :style="{'height':swiperHeight}">
+						<!-- 显示题目的题干 -->
+						<view class="content-title">
+							<u-tag v-if="item.template == 1" class="typeTag" text="单选题" mode="dark" shape="circle" />
+							<u-tag v-if="item.template == 2" class="typeTag" text="多选题" mode="dark" shape="circle" />
+							<u-tag v-if="item.template == 3" class="typeTag" text="判断题" mode="dark" shape="circle" />
+							<u-tag v-if="item.template == 4" class="typeTag" text="填空题" mode="dark" shape="circle" />
+							<u-tag v-if="item.template == 5" class="typeTag" text="简答题" mode="dark" shape="circle" />
+							<rich-text :nodes="item.queContent"></rich-text>
+						</view>
+						<!-- 以下显示选项 -->
+						<!-- type == 1 单选题 -->
+						<view class="content-solutions" v-if='item.template == 1'>
+							<template v-for='subItem in item.toptions'>
+								<view
+									:class="[item.isReviewed && subItem.optAnswer == 1 ? 'right': '',item.isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseSolution(item,subItem)'>
+									<view class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<view
+										:class="item.tempAnswer == subItem.optLetter? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}</view>
+								</view>
+							</template>
+						</view>
+						<!-- type == 2 多选题 -->
+						<view class="content-solutions" v-if='item.template == 2'>
+							<template v-for='subItem in item.toptions'>
+								<view
+									:class="[item.isReviewed && subItem.optAnswer == 1 ? 'right': '',item.isReviewed && (item.wrongArr.indexOf(subItem.optLetter) >-1)  ? 'wrong': '']"
+									class="content-solutions-item" @click='chooseMutiSolution(item,subItem)'>
+									<view class="content-solutions-item-single">{{subItem.optLetter}}</view>
+									<view
+										:class="item.tempAnswer.indexOf(subItem.optLetter) >-1 ? 'content-solutions-item-select' : ''"
+										class="content-solutions-item-content">{{subItem.optContent}}
+									</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 3 判断题 -->
+						<view class="content-solutions" v-if='item.template == 3'>
+							<template v-for='(subItem,subIndex) in item.toptions' :keys="subIndex">
+								<view class="content-solutions-judge">
+									<view v-for="(judgeItem,judgeIndex) in judgeArr"
+										:class="[item.tempAnswer == judgeItem.value? 'content-solutions-item-select' : '',item.isReviewed && (item.rightAnswer==judgeItem.name)  ? 'right': '',item.isReviewed && (item.wrongArr ==judgeItem.value)  ? 'wrong': '']"
+										class="content-solutions-judge-item"
+										@click='judgeSolution(item,judgeItem.value)'>{{judgeItem.name}}</view>
+								</view>
+							</template>
+						</view>
+
+						<!-- type == 4 填空题 -->
+						<view class="content-solutions" v-if='item.template == 4'>
+							<template>
+								<view class="content-solutions-item" v-for='(subItem,subIndex) in item.toptions'
+									:keys="subIndex"
+									:class="[item.isReviewed && item.blankString != item.rightAnswer ? 'wrong':'']">
+									<view class="content-solutions-item-single">{{subIndex+1}}</view>
+									<input :disabled="item.isReviewed" type="text" class="content-solutions-blank"
+										v-model="item.blankArr[subIndex]" placeholder="请在此处输入答案" />
+									<!-- TODOvalue的绑定值不对 :value="item.blankArr[subIndex].replace(/&quot\;/g, '')" -->
+									<!-- 	<input v-else :disabled="isReviewed" :value="item.blankArr"
+																type="text" class="content-solutions-blank" /> -->
+								</view>
+							</template>
+						</view>
+						<!-- type == 5 简答题 -->
+						<view class="content-solutions" v-if='item.template == 5'>
+							<textarea v-if="!item.isReviewed" @input="textInput" :disabled="isReviewed"
+								placeholder="请输入您的答案" auto-height />
+							<textarea v-else :disabled="item.isReviewed"
+								:value="item.tempAnswer.replace(/&quot\;/g, '')" auto-height />
+						</view>
+						<view class="explain" v-if='item.isReviewed'>
+
+							<u-tag v-show="item.isRight==1" text="正确" type="success" />
+							<u-tag v-show="item.isRight==2" text="错误" type="error" />
+							<u-tag v-show="item.isRight==3" text="自行核对" type="warning" />
+
+							<view class="explain-title">正确答案:</view>
+							<!-- <span class="text">{{item.rightAnswer}}</span> -->
+							<u-parse :html="item.rightAnswer"></u-parse>
+							<view class="explain-title">试题解析:</view>
+							<view class="explain-content">
+								<u-parse :html="item.queAnalysis?item.queAnalysis:'暂无'"></u-parse>
+							</view>
+							<view class="noteArea">
+								<view class="noteAreaTitle">
+									<view class="explain-title">我的笔记:</view>
+									<view v-if="eidtOrFinishValue=='编辑笔记'" class="funcGroup" @click="editBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>编辑笔记</span>
+									</view>
+									<view v-else class="funcGroup" @click="finishBtnFunc(item)">
+										<u-icon class="funcBtn" name="edit-pen"></u-icon>
+										<span>完成</span>
+									</view>
+								</view>
+								<!-- 只有回答过的题目才能编辑笔记!!! -->
+								<text-editor :noteId="item.id"
+									:textContent="item.notes.length>0? item.notes[0].noteContent:''"
+									:isreadOnly="isreadOnly" @editorInput='updateEditorText'>
+								</text-editor>
+							</view>
+						</view>
+					</scroll-view>
+				</swiper-item>
+			</template>
+		</swiper>
+
+		<!-- 底部栏 -->
+		<view class="footer" id="footer">
+			<u-button type="success" shape="circle" @click="submitAns">提交</u-button>
+			<u-button type="primary" shape="circle" @click="changeQues">换一题</u-button>
+			<!-- <view class="footer-back" @click='handleChangeCurrentSwiper(-1)'>上一题</view>
+			<view class="footer-card" @click="showQuestion = !showQuestion">答题卡</view>
+			<view class="footer-right" @click='handleChangeCurrentSwiper(1)'>下一题</view> -->
+		</view>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import Modal from './modal.vue'
+	import clock from '@/components/clock/clock.vue';
+	export default {
+		data() {
+			return {
+				isreadOnly: true,
+				// isReviewed: false,
+				quesModules: [],
+				areaText: ``, //保存简答题答案
+				judgeArr: [{
+						name: '正确',
+						value: '1'
+					},
+					{
+						name: '错误',
+						value: '0'
+					}
+				],
+				currentIndex: 0,
+				swiperHeight: '800px',
+				modalHeight: '400px',
+				modalContentHeight: '300px',
+				showQuestion: false,
+				articleEditorValue: '',
+				eidtOrFinishValue: '编辑笔记',
+				editor: 'editor',
+				editorText: ''
+			}
+		},
+		filters: {
+			// 判断答案状态
+			answerStatusFilter(item) {
+				switch (item) {
+					case 1:
+						return '未答'
+						break;
+					case 2:
+						return '答题正确'
+						break;
+					case 3:
+						return '答题错误'
+						break;
+					case 4:
+						return '未评分'
+						break;
+					case 5:
+						return '已评分'
+						break;
+					case 6:
+						return '已答'
+						break;
+					default:
+						// ad
+				}
+			},
+
+			analysisFilter(item) {
+				if (item == null) {
+					return "暂无解析"
+				} else {
+					return item
+				}
+			}
+		},
+		watch: {
+
+		},
+		computed: {
+			storeInfo() {
+				return this.$store.state.storeInfo
+			},
+			questionList() {
+				return this.$store.state.questionList
+			},
+			max() {
+				return this.questionList.length - 1
+			},
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'error'
+			},
+			duration: {
+				type: [String, Number],
+				default: 300
+			},
+			// isReviewed: {
+			// 	type: Boolean,
+			// 	default: false
+			// },
+
+		},
+
+		onReady() {
+			this.$refs.myClock.start();
+			// console.log('examDetail',this.examDetail);
+		},
+		components: {
+			Modal,
+			clock
+		},
+		methods: {
+			/* 跳转指定题目 */
+			handleJumpSwiper(index) {
+				this.currentIndex = index
+				this.showQuestion = false
+			},
+			end() {
+				this.$refs.uToast.show({
+					title: '考试时间结束,已自动交卷',
+					type: 'warning'
+				})
+				setTimeout(() => {
+					this.handleSubmit(0)
+				}, 2000)
+			},
+			textInput(e) {
+				this.areaText = e.detail.value
+				// console.log(e.detail.value)
+			},
+			/* 滑动题目 */
+			handleSwiperChanged(event) {
+				this.currentIndex = event.detail.current
+			},
+			/* 调用上一页,下一页 */
+			handleChangeCurrentSwiper(operation) {
+				let max = this.questionList.length - 1
+				let min = 0
+				// 进行翻页
+				if ((this.currentIndex > min && operation < 0) || (this.currentIndex < max && operation > 0)) {
+					this.currentIndex += operation
+					// console.log(this.currentIndex)
+				}
+			},
+			/* 选择答案(单选)*/
+			chooseSolution(item, subItem) {
+				if (!item.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = subItem.optLetter
+					// if (this.currentIndex < this.max) {
+					// 	setTimeout(() => {
+					// 		this.currentIndex += 1
+					// 	}, 300)
+					// }
+				}
+			},
+			/* 选择答案(多选)*/
+			chooseMutiSolution(item, subItem) {
+				if (!item.isReviewed) {
+					let answerIndex = item.dualChooseArr.indexOf(subItem.optLetter)
+					if (answerIndex > -1) {
+						// 该选项已经在数组中了
+						item.dualChooseArr.splice(answerIndex, 1)
+					} else {
+						// 该选项不在数组中
+						item.dualChooseArr.push(subItem.optLetter)
+					}
+					item.tempAnswer = item.dualChooseArr.join(',')
+					// this.onAnswerChange(answerIndex)
+				}
+			},
+			/* 判断题答案 */
+			judgeSolution(item, value) {
+				if (!item.isReviewed) {
+					// tempAnswer为学生答案
+					item.tempAnswer = value
+					// if (this.currentIndex < this.max) {
+					// 	setTimeout(() => {
+					// 		this.currentIndex += 1
+					// 	}, 300)
+					// }
+				}
+			},
+			changeQues() {
+				if (this.currentIndex < this.max) {
+					this.currentIndex += 1
+				} else {
+					this.$refs.uToast.show({
+						title: '已无更多试题',
+						type: 'warning',
+					})
+				}
+			},
+			submitAns() {
+				//--------------
+				// 对各题型的答案进行处理
+				let that = this
+				switch (that.questionList[that.currentIndex].template) {
+					case 1:
+						// 选择题
+						if (that.questionList[that.currentIndex].rightAnswer == that.questionList[that.currentIndex]
+							.tempAnswer) {
+							// 回答正确
+							that.questionList[that.currentIndex].isRight = 1
+						} else {
+							// 回答错误
+							that.questionList[that.currentIndex].isRight = 2
+						}
+						var rightArr = that.questionList[that.currentIndex].rightAnswer.split(',')
+						var userArr = that.questionList[that.currentIndex].tempAnswer.split(',')
+						that.questionList[that.currentIndex].wrongArr = [] // 保存选中的错误的选项
+
+						for (var item of userArr) {
+							// 用户的该答案不在正确答案数组在
+							if (rightArr.indexOf(item) < 0) {
+								that.questionList[that.currentIndex].wrongArr.push(item)
+							}
+						}
+						break;
+					case 2:
+						var rightArr = that.questionList[that.currentIndex].rightAnswer.split(',').sort()
+						var userArr = that.questionList[that.currentIndex].tempAnswer.split(',').sort()
+						// that.questionList[that.currentIndex].wrongArr = [] // 保存选中的错误的选项
+
+						for (var i = 0; i < rightArr.length; i++) {
+							if (rightArr.length != userArr.length) {
+								// 回答错误,漏选了
+								that.questionList[that.currentIndex].isRight = 2
+							} else {
+								if (rightArr[i] != userArr[i]) {
+									// 回答错误
+									that.questionList[that.currentIndex].isRight = 2
+								}
+								// 回答正确
+								that.questionList[that.currentIndex].isRight = 1
+							}
+						}
+						for (var item of userArr) {
+							// 用户的该答案不在正确答案数组在
+							if (rightArr.indexOf(item) < 0) {
+								that.questionList[that.currentIndex].wrongArr.push(item)
+							}
+						}
+						break;
+					case 3:
+						if (that.questionList[that.currentIndex].rightAnswer == that.questionList[that
+								.currentIndex]
+							.tempAnswer) {
+							// 回答正确
+							that.questionList[that.currentIndex].isRight = 1
+						} else {
+							// 回答错误
+							that.questionList[that.currentIndex].isRight = 2
+						}
+						// 判断题
+						if (that.questionList[that.currentIndex].tempAnswer != that.questionList[that.currentIndex]
+							.toptions[0].optAnswer) {
+							that.questionList[that.currentIndex].wrongArr = that.questionList[that.currentIndex]
+								.tempAnswer
+						}
+						break;
+					case 4:
+						// 填空题
+						that.questionList[that.currentIndex].tempAnswer = that.questionList[that.currentIndex]
+							.blankArr.join('||~||') // 数组拼接为字符串
+						that.questionList[that.currentIndex].isRight = 3 // 自行核对
+						break;
+					case 5:
+						that.questionList[that.currentIndex].isRight = 3 // 自行核对
+						that.questionList[that.currentIndex].tempAnswer = JSON.stringify(that.areaText)
+						break;
+					default:
+				}
+				console.log('提交题库的信息', that.questionList[that.currentIndex].id, that.$store.state.storeInfo
+					.storeId);
+					
+				if(that.type == 'store'){
+				that.$api.storeSave(that.questionList[that.currentIndex].id, that.$store.state.storeInfo.storeId)
+					.then(res => {
+						that.questionList[that.currentIndex].isReviewed = !that.questionList[that.currentIndex]
+							.isReviewed
+						if (res.status == 1) {
+							console.log('保存题库练习记录失败', res);
+							uni.showToast({
+								title: '提交失败',
+								duration: 2000,
+								image: '../../static/error.png'
+							});
+						} else {
+							console.log('保存题库练习记录成功', res);
+							// this.isReviewed = !this.isReviewed
+						}
+					})
+					.catch(res => {
+						uni.showToast({
+							title: '提交失败',
+							duration: 2000,
+							image: '../../static/error.png'
+						});
+						console.log("提交失败");
+					})
+					
+				}
+				// ------------------------
+			},
+
+			// 点击编辑笔记
+			editBtnFunc(item) {
+				// if (item.theoryExamAnswer.id == undefined) {
+				// 	this.$refs.uToast.show({
+				// 		title: '未作答的题目不可编辑笔记!',
+				// 		type: 'error',
+				// 		// url: '/pages/user/index'
+				// 	})
+				// 	return
+				// }
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '完成'
+			},
+			// 完成编辑
+			finishBtnFunc(item) {
+				var that = this
+				this.isreadOnly = !this.isreadOnly
+				this.eidtOrFinishValue = '编辑笔记'
+				console.log('保存笔记内容', item, that.editorText);
+				this.$api.addNote(item.id, that.editorText)
+					.then(res => {
+						console.log('更新笔记成功', res)
+					})
+			},
+			updateEditorText(text) {
+				// 从子组件获取输入框输入内容
+				this.editorText = text
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #FFFFFF;
+	}
+
+	#header,
+	#subHeader {
+		height: 100rpx;
+	}
+
+	.header {
+		position: relative;
+		text-align: center;
+		line-height: 100rpx;
+		font-size: 36rpx;
+		font-weight: 600;
+		color: $theme-color;
+		letter-spacing: 10rpx;
+
+		&-button {
+			width: 80rpx;
+			height: 40rpx;
+			line-height: 40rpx;
+			position: absolute;
+			top: 20rpx;
+			right: 40rpx;
+			padding: 10rpx 20rpx;
+			border-radius: 15rpx;
+			letter-spacing: 2rpx;
+			font-weight: 500;
+			color: #FFFFFF;
+			background-color: $theme-color;
+		}
+
+		.scoreText {
+			color: #00b060;
+			font-size: 35rpx;
+		}
+	}
+
+	.sub-header {
+		padding: 30rpx 20rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		color: #000;
+		font-size: 33rpx;
+		font-weight: bold;
+	}
+
+	.content {
+		letter-spacing: 3rpx;
+
+		.typeTag {
+			margin-right: 20rpx;
+		}
+
+		&-item-explain {
+			padding-bottom: 20rpx;
+			font-size: 30rpx;
+			color: #8799a3;
+			letter-spacing: 5rpx;
+			border-top: 1px solid rgba(0, 0, 0, 0.1);
+
+			&-result {
+				padding: 20rpx 0;
+
+				span {
+					padding-left: 20rpx;
+					color: #39b54a;
+				}
+			}
+
+			&-content {
+				padding: 20rpx 0;
+			}
+		}
+
+		&-item {
+			padding: 0 20rpx;
+			box-sizing: border-box;
+		}
+
+		&-title {
+			margin-bottom: 30rpx;
+			font-size: 32rpx;
+			line-height: 55rpx;
+			color: #000
+		}
+
+		&-solutions {
+			width: 100%;
+			padding-bottom: 20rpx;
+
+			&-item {
+				margin: 40rpx 0;
+				border: 5rpx solid $theme-color;
+				border-radius: 20rpx;
+				display: flex;
+				align-items: center;
+				font-size: 30rpx;
+				background-color: $theme-color;
+
+				&-check-content {
+					padding: 35rpx 20rpx;
+					width: 100%;
+					border-radius: 15rpx;
+					color: $theme-color;
+					background-color: #FFFFFF;
+				}
+
+				&-single {
+					width: 80rpx;
+					text-align: center;
+					color: #FFFFFF;
+				}
+
+				&-content {
+					padding: 35rpx 20rpx;
+					width: 630rpx;
+					border-top-right-radius: 15rpx;
+					border-bottom-right-radius: 15rpx;
+					color: #000;
+					background-color: #FFFFFF;
+				}
+
+				&-select {
+					color: #FFFFFF;
+					background-color: $theme-color;
+				}
+			}
+
+			&-judge {
+				display: flex;
+				justify-content: space-around;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+				text-align: center;
+				font-size: 30rpx;
+
+				.content-solutions-judge-item {
+					border: 5rpx solid $theme-color;
+					border-radius: 60rpx;
+					width: 300rpx;
+					padding: 35rpx 20rpx; // 控制单元格的高度
+				}
+
+				.content-solutions-judge-select {
+					color: #FFFFFF;
+					background-color: $theme-color;
+				}
+
+			}
+
+			&-blank {
+				// border: 5rpx solid $theme-color;
+				height: 60rpx;
+				width: 90%;
+				// border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+
+			&-fillItem {
+				border: 5rpx solid $theme-color;
+				border-radius: 20rpx;
+				background-color: #FFFFFF;
+				padding: 20rpx;
+			}
+		}
+
+		.explain {
+			border-top: solid #999999 1px;
+			padding-top: 10rpx;
+			font-size: 28rpx;
+			color: #666666;
+
+			.explainResult {
+				color: $theme-color;
+			}
+
+			.explain-title {
+				font-weight: bold;
+			}
+
+			.noteArea {
+				border-top: 2rpx solid $theme-color;
+				padding-top: 10rpx;
+
+				// background-color: #0077AA;
+				.noteAreaTitle {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+	}
+
+	.footer {
+		width: 750rpx;
+		height: 100rpx;
+		padding: 30rpx 20rpx;
+		position: fixed;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		bottom: 0;
+		font-size: 30rpx;
+		box-sizing: border-box;
+		color: #4c8af3;
+		box-shadow: 0 0 5px 1px #eee;
+		background-color: #FFFFFF;
+
+		&-card {
+			padding: 10rpx 20rpx;
+			border: 1px solid $theme-color;
+			border-radius: 15rpx;
+			color: #FFFFFF;
+			background-color: $theme-color;
+		}
+	}
+
+	.question-modal {
+		width: 700rpx;
+		padding: 40rpx;
+		background-color: #FFFFFF;
+
+		&-header {
+			height: 100rpx;
+			text-align: center;
+			font-size: 35rpx;
+			line-height: 100rpx;
+			color: #333333;
+			border-bottom: 1rpx solid #F0F0F0;
+		}
+
+		&-body {
+
+			&-item {
+				width: 80rpx;
+				margin: 10rpx 22rpx;
+				height: 80rpx;
+				line-height: 80rpx;
+				font-size: 35rpx;
+				display: inline-block;
+				text-align: center;
+				border-radius: 50%;
+				color: #8799a3;
+				// background-color: #0077AA;
+			}
+
+			&-item-failed {
+				color: #FFFFFF;
+				background-color: #982121;
+			}
+
+			&-item-right {
+				color: #FFFFFF;
+				background-color: #39b54a;
+			}
+
+			&-item-select {
+				color: #FFFFFF;
+				background-color: $theme-color;
+			}
+		}
+
+		.question-modal-foot {
+			height: 100rpx;
+			border-top: 1rpx solid #F0F0F0;
+			margin-top: -60rpx;
+
+			.ansBlock {
+				display: flex;
+				justify-content: center;
+
+				// align-items: center;
+				.blockItem {
+					display: flex;
+					align-items: center;
+					margin: 20rpx;
+				}
+
+				.block-ansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: $theme-color;
+					margin: 0 10rpx;
+				}
+
+				.block-unansed {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					border: solid #999999 1px;
+					// background: $font-color-ps ;
+					margin: 0 10rpx;
+				}
+
+				.block-right {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #39b54a;
+					margin: 0 10rpx;
+				}
+
+				.block-wrong {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					background: #982121;
+					margin: 0 10rpx;
+				}
+			}
+
+		}
+	}
+
+	.right {
+		border: 8rpx solid #39b54a;
+	}
+
+	.wrong {
+		border: 8rpx solid #d81717;
+	}
+</style>
diff --git a/components/dyw-answer/modal.vue b/components/dyw-answer/modal.vue
new file mode 100644
index 0000000..8f48bc1
--- /dev/null
+++ b/components/dyw-answer/modal.vue
@@ -0,0 +1,81 @@
+<template>
+	<!-- escloud -->
+	<view>
+		<view :class="[value? 'show': '']" class="yy-modal" id="show" @click="closeModal">
+			<!-- click.stop 阻止<slot>中的点击事件继续向外传播,
+			避免触发最外层closeModal点击事件 -->
+			<div @click.stop class='content'>
+				<slot></slot>
+			</div>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				show: false
+			};
+		},
+		props:{
+			value: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		watch: {
+			value(val) {
+				if (val) {
+					this.show = val
+				} else {
+					this.handleHidden()
+				}
+			}
+		},
+		methods:{
+			closeModal(e){
+				this.$emit('input', false)
+			},
+			handleHidden(){
+				setTimeout(()=> {
+					this.show = false
+				}, 300)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.yy-modal{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	z-index: 1000;
+	opacity: 0;
+	transform: scale(1.185);
+	pointer-events: none;
+	transition: all 0.3s ease-in-out 0s;
+	background: rgba(0,0,0,0.6);
+}
+.show{
+	opacity: 1;
+	transition-duration: 0.3s;
+	transform: scale(1);
+	overflow-x: hidden;
+	overflow-y: auto;
+	pointer-events: auto;
+
+}
+.content{
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%,-50%);
+	border-radius: 15rpx;
+	overflow: hidden;
+}
+
+</style>
diff --git a/components/dyw-answer/readme.md b/components/dyw-answer/readme.md
new file mode 100644
index 0000000..8314f14
--- /dev/null
+++ b/components/dyw-answer/readme.md
@@ -0,0 +1,61 @@
+## 答题组件
+
+#### 调用方法
+```
+	<template>
+		<view>
+			<Answer :questtionList='questtionList' @submit='handleSubmit' @onChange='onChange'></Answer>
+		</view>
+		
+	</template>
+	<script>
+		import Answer from '@/components/dyw-answer/answer.vue'
+		export default {
+			data() {
+				return {
+					questtionList: [],
+				}
+			},
+			components:{
+				Answer
+			},
+			methods: {
+				/* 提交答案
+				 */
+				handleSubmit(answerList){
+					console.log(answerList)
+				},
+				/* 题目答案变化
+				 */
+				onChange(answer){
+					console.log(answer)
+				}
+				
+				
+			}
+		}
+	</script>
+	
+```	
+
+#### 参数
+questtionList: 题目列表,组件中有列表格式    格式: Array
+
+currentSwiperItem: 设置默认题目,默认为第一道题目,从0开始。  格式: Number
+
+duration: swiper滑动事件,默认300    格式: String/Number
+
+|  参数名   | 默认值  | 描述  | 格式 |
+|  ----  | ----  | ----  | ----  |
+| questtionList  | - | 题目列表,组件中有列表格式案例。  | Array |
+| currentSwiperItem  | 0 | 设置默认题目,默认为第一道题目,从0开始。  | Number |
+| duration  | 300 | swiper滑动事件  | Number |
+
+#### 方法
+#### 
+|  方法名   | 返回值  | 描述  | 返回格式 |
+|  ----  | ----  | ----  | ----  |
+| submit  | questtionList | 点击提交时,调用该方法  | Array |
+| onChange  | 当前修改的题目对象 | 当用户选择答案时触发该方法  | Object |
+
+
diff --git a/pages.json b/pages.json
index f7329b5..57b5f77 100644
--- a/pages.json
+++ b/pages.json
@@ -1,669 +1,693 @@
 {
-	"easycom": {
-		"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
-	},
-	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
-		{
-			"path": "pages/loging/loging",
-			"name": "loging",
-			"style": {
-				"navigationBarTitleText": "请登录",
-				"enablePullDownRefresh": false,
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/registerUser/registerUser",
-			"name": "loging",
-			"style": {
-				"navigationBarTitleText": "注册账号",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-				// "app-plus": {
-				// 	"animationType": "fade-in",
-				// 	"animationDuration": 300
-				// }
-			}
-		},
-		{
-			"path": "pages/registerUser/idphoto",
-			"style": {
-				"navigationBarTitleText": "人脸识别",
-				"navigationStyle": "custom",
-				"backgroundColor": "#000000"
-			}
+    "easycom": {
+        "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
+    },
+    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+        {
+            "path": "pages/loging/loging",
+            "name": "loging",
+            "style": {
+                "navigationBarTitleText": "请登录",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom"
+            }
+        },
+        {
+            "path": "pages/registerUser/registerUser",
+            "name": "loging",
+            "style": {
+                "navigationBarTitleText": "注册账号",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+                // "app-plus": {
+                // 	"animationType": "fade-in",
+                // 	"animationDuration": 300
+                // }
+            }
+        },
+        {
+            "path": "pages/registerUser/idphoto",
+            "style": {
+                "navigationBarTitleText": "人脸识别",
+                "navigationStyle": "custom",
+                "backgroundColor": "#000000"
+            }
 
-		},
-		{
-			"path": "pages/home/home",
-			"style": {
+        },
+        {
+            "path": "pages/home/home",
+            "style": {
 
-				"navigationBarTitleText": "首页",
-				"enablePullDownRefresh": false,
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/shengzs/index",
-			"style": {
-				"navigationBarTitleText": "能量树",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/myself/childen/collect",
-			"style": {
-				"navigationBarTitleText": "我的收藏",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/myself/myself",
-			"name": "myself",
-			"style": {
-				"navigationBarTitleText": "",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/myself/childen/aboutUs",
-			"name": "aboutUs",
-			"style": {
-				"navigationBarTitleText": "关于我们",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/myself/childen/shezhi",
-			"name": "shezhi",
-			"style": {
-				"navigationBarTitleText": "系统设置",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/myself/childen/yijian",
-			"name": "yijian",
-			"style": {
-				"navigationBarTitleText": "意见反馈",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/myself/childen/genxin",
-			"name": "genxin",
-			"style": {
-				"navigationBarTitleText": "隐私政策",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/business/business",
-			"style": {
-				"navigationBarTitleText": "工作台",
-				"enablePullDownRefresh": false,
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/myself/childen/xinxi",
-			"name": "xinxi",
-			"style": {
-				"navigationBarTitleText": "账户信息",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/myself/childen/info/nickName",
-			"name": "nickName",
-			"style": {
-				"navigationBarTitleText": "修改昵称",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/myself/childen/info/phone",
-			"name": "phone",
-			"style": {
-				"navigationBarTitleText": "修改电话",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/myself/childen/info/email",
-			"name": "email",
-			"style": {
-				"navigationBarTitleText": "修改邮箱",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/myself/childen/info/birthday",
-			"name": "birthday",
-			"style": {
-				"navigationBarTitleText": "修改生日",
-				"navigationBarBackgroundColor": "#F56968"
-			}
-		},
-		{
-			"path": "pages/reported/reported",
-			"name": "reported",
-			"style": {
-				"navigationBarTitleText": "我要报",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
-			"path": "pages/groupChat/groupChat",
-			"name": "groupChat",
-			"style": {
-				"navigationBarTitleText": "我要说",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "components/submit/submit",
-			"style": {}
-		},
-		{
-			"path": "pages/groupChat/chating",
-			"name": "chating",
-			"style": {
-				"navigationBarTitleText": "聊天室2",
-				"navigationStyle": "custom",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
-			"path": "pages/groupChat/chatingQZ",
-			"name": "chatingQZ",
-			"style": {
-				"navigationBarTitleText": "聊天室2",
-				"navigationStyle": "custom",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
-			"path": "pages/infoRegistration/infoRegistration",
-			"name": "infoRegistration",
-			"style": {
-				"navigationBarTitleText": "信息登记"
-			}
-		},
-		{
-			"path": "pages/infoRegistration/infoCheck",
-			"name": "infoCheck",
-			"style": {
-				"navigationBarTitleText": "信息核实"
-			}
-		},
-		{
-			"path": "pages/visitRecord/visitRecord",
-			"name": "visitRecord",
-			"style": {
-				"navigationBarTitleText": "拜访记录"
-			}
-		},
-		{
-			"path": "pages/riskReporting/riskReporting",
-			"name": "riskReporting",
-			"style": {
-				"navigationBarTitleText": "风险上报"
-			}
-		},
-		{
-			"path": "pages/equipment/equipment",
-			"name": "equipment",
-			"style": {
-				"navigationBarTitleText": "设备安装"
-			}
-		},
-		{
-			"path": "pages/article/article",
-			"style": {
-				"navigationBarTitleText": "资讯",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white",
-				"onReachBottomDistance": 0
-			}
-		},
-		{
-			"path": "pages/article/article_video",
-			"style": {
-				"navigationBarTitleText": "视频",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white",
-				"app-plus": {
-					"titleNView": false,
-					"subNVues": [{
-						"id": "comment",
-						"path": "pages/subnvue/comment",
-						"style": {
-							"height": "100%",
-							"position": "absolute",
-							"bottom": "0",
-							"background": "transparent",
-							"zindex": 1
+                "navigationBarTitleText": "首页",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom"
+            }
+        },
+        {
+            "path": "pages/shengzs/index",
+            "style": {
+                "navigationBarTitleText": "能量树",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/myself/childen/collect",
+            "style": {
+                "navigationBarTitleText": "我的收藏",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/myself/myself",
+            "name": "myself",
+            "style": {
+                "navigationBarTitleText": "",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/myself/childen/aboutUs",
+            "name": "aboutUs",
+            "style": {
+                "navigationBarTitleText": "关于我们",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/myself/childen/shezhi",
+            "name": "shezhi",
+            "style": {
+                "navigationBarTitleText": "系统设置",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/myself/childen/yijian",
+            "name": "yijian",
+            "style": {
+                "navigationBarTitleText": "意见反馈",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/myself/childen/genxin",
+            "name": "genxin",
+            "style": {
+                "navigationBarTitleText": "隐私政策",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/business/business",
+            "style": {
+                "navigationBarTitleText": "工作台",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom"
+            }
+        },
+        {
+            "path": "pages/myself/childen/xinxi",
+            "name": "xinxi",
+            "style": {
+                "navigationBarTitleText": "账户信息",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/myself/childen/info/nickName",
+            "name": "nickName",
+            "style": {
+                "navigationBarTitleText": "修改昵称",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/myself/childen/info/phone",
+            "name": "phone",
+            "style": {
+                "navigationBarTitleText": "修改电话",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/myself/childen/info/email",
+            "name": "email",
+            "style": {
+                "navigationBarTitleText": "修改邮箱",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/myself/childen/info/birthday",
+            "name": "birthday",
+            "style": {
+                "navigationBarTitleText": "修改生日",
+                "navigationBarBackgroundColor": "#F56968"
+            }
+        },
+        {
+            "path": "pages/reported/reported",
+            "name": "reported",
+            "style": {
+                "navigationBarTitleText": "我要报",
+                "app-plus": {
+                    "titleNView": false
+                }
+            }
+        },
+        {
+            "path": "pages/groupChat/groupChat",
+            "name": "groupChat",
+            "style": {
+                "navigationBarTitleText": "我要说",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "components/submit/submit",
+            "style": {}
+        },
+        {
+            "path": "pages/groupChat/chating",
+            "name": "chating",
+            "style": {
+                "navigationBarTitleText": "聊天室2",
+                "navigationStyle": "custom",
+                "app-plus": {
+                    "titleNView": false
+                }
+            }
+        },
+        {
+            "path": "pages/groupChat/chatingQZ",
+            "name": "chatingQZ",
+            "style": {
+                "navigationBarTitleText": "聊天室2",
+                "navigationStyle": "custom",
+                "app-plus": {
+                    "titleNView": false
+                }
+            }
+        },
+        {
+            "path": "pages/infoRegistration/infoRegistration",
+            "name": "infoRegistration",
+            "style": {
+                "navigationBarTitleText": "信息登记"
+            }
+        },
+        {
+            "path": "pages/infoRegistration/infoCheck",
+            "name": "infoCheck",
+            "style": {
+                "navigationBarTitleText": "信息核实"
+            }
+        },
+        {
+            "path": "pages/visitRecord/visitRecord",
+            "name": "visitRecord",
+            "style": {
+                "navigationBarTitleText": "拜访记录"
+            }
+        },
+        {
+            "path": "pages/riskReporting/riskReporting",
+            "name": "riskReporting",
+            "style": {
+                "navigationBarTitleText": "风险上报"
+            }
+        },
+        {
+            "path": "pages/equipment/equipment",
+            "name": "equipment",
+            "style": {
+                "navigationBarTitleText": "设备安装"
+            }
+        },
+        {
+            "path": "pages/article/article",
+            "style": {
+                "navigationBarTitleText": "资讯",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white",
+                "onReachBottomDistance": 0
+            }
+        },
+        {
+            "path": "pages/article/article_video",
+            "style": {
+                "navigationBarTitleText": "视频",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white",
+                "app-plus": {
+                    "titleNView": false,
+                    "subNVues": [{
+                        "id": "comment",
+                        "path": "pages/subnvue/comment",
+                        "style": {
+                            "height": "100%",
+                            "position": "absolute",
+                            "bottom": "0",
+                            "background": "transparent",
+                            "zindex": 1
 
-						}
-					}, {
-						"id": "input-box",
-						"path": "pages/subnvue/input-box",
-						"style": {
-							"height": "100%",
-							"position": "absolute",
-							"bottom": "0",
-							"background": "transparent",
-							"zindex": 2
-						}
-					}]
-				}
-			}
-		},
-		{
-			"path": "pages/article/article_detail",
-			"name": "equipment",
-			"style": {
-				"navigationBarTitleText": "详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/patrol/patrol",
-			"name": "equipment",
-			"style": {
-				"navigationBarTitleText": "巡逻任务",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/investigation/investigation",
-			"name": "investigation",
-			"style": {
-				"navigationBarTitleText": "地图",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/workbench/workbench",
-			"name": "workbench",
-			"style": {
-				"navigationBarTitleText": "我要巡",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
-			"path": "pages/handle/handle",
-			"style": {
-				"navigationBarTitleText": "我要办",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/alarm_list/alarm_list",
-			"name": "alarm_list",
-			"style": {
-				"navigationBarTitleText": "我要查",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		// {
-		// 	"path": "pages/grabOrders/grabOrders备份/grabOrders",
-		// 	"name": "grabOrders",
-		// 	"style": {
-		// 		"navigationBarTitleText": "我参与",
-		// 		"navigationBarBackgroundColor": "#103289",
-		// 		"navigationBarTextStyle": "white"
-		// 	}
-		// },
-		{ //治安巡查
-			"path": "pages/grabOrders/grabOrdersZAXC/grabOrders",
-			"name": "grabOrdersZAXC",
-			"style": {
-				"navigationBarTitleText": "治安巡查",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAXC/map",
-			"name": "map",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAXC/task",
-			"name": "task",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAXC/feedback",
-			"name": "feedback",
-			"style": {
-				"navigationBarTitleText": "任务反馈",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{ //治安义务宣传
-			"path": "pages/grabOrders/grabOrdersZAYWXC/grabOrders",
-			"name": "grabOrdersZAYWXC",
-			"style": {
-				"navigationBarTitleText": "治安义务宣传",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAYWXC/map",
-			"name": "map",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAYWXC/task",
-			"name": "task",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAYWXC/feedback",
-			"name": "feedback",
-			"style": {
-				"navigationBarTitleText": "任务反馈",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{ //治安防范培训
-			"path": "pages/grabOrders/grabOrdersZAFFPX/grabOrders",
-			"name": "grabOrdersZAFFPX",
-			"style": {
-				"navigationBarTitleText": "治安防范培训",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAFFPX/map",
-			"name": "map",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAFFPX/task",
-			"name": "task",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/grabOrders/grabOrdersZAFFPX/feedback",
-			"name": "feedback",
-			"style": {
-				"navigationBarTitleText": "任务反馈",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
+                        }
+                    }, {
+                        "id": "input-box",
+                        "path": "pages/subnvue/input-box",
+                        "style": {
+                            "height": "100%",
+                            "position": "absolute",
+                            "bottom": "0",
+                            "background": "transparent",
+                            "zindex": 2
+                        }
+                    }]
+                }
+            }
+        },
+        {
+            "path": "pages/article/article_detail",
+            "name": "equipment",
+            "style": {
+                "navigationBarTitleText": "详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/patrol/patrol",
+            "name": "equipment",
+            "style": {
+                "navigationBarTitleText": "巡逻任务",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/investigation/investigation",
+            "name": "investigation",
+            "style": {
+                "navigationBarTitleText": "地图",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/workbench/workbench",
+            "name": "workbench",
+            "style": {
+                "navigationBarTitleText": "我要巡",
+                "app-plus": {
+                    "titleNView": false
+                }
+            }
+        },
+        {
+            "path": "pages/handle/handle",
+            "style": {
+                "navigationBarTitleText": "我要办",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/alarm_list/alarm_list",
+            "name": "alarm_list",
+            "style": {
+                "navigationBarTitleText": "我要查",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        // {
+        // 	"path": "pages/grabOrders/grabOrders备份/grabOrders",
+        // 	"name": "grabOrders",
+        // 	"style": {
+        // 		"navigationBarTitleText": "我参与",
+        // 		"navigationBarBackgroundColor": "#103289",
+        // 		"navigationBarTextStyle": "white"
+        // 	}
+        // },
+        { //治安巡查
+            "path": "pages/grabOrders/grabOrdersZAXC/grabOrders",
+            "name": "grabOrdersZAXC",
+            "style": {
+                "navigationBarTitleText": "治安巡查",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAXC/map",
+            "name": "map",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAXC/task",
+            "name": "task",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAXC/feedback",
+            "name": "feedback",
+            "style": {
+                "navigationBarTitleText": "任务反馈",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        { //治安义务宣传
+            "path": "pages/grabOrders/grabOrdersZAYWXC/grabOrders",
+            "name": "grabOrdersZAYWXC",
+            "style": {
+                "navigationBarTitleText": "治安义务宣传",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAYWXC/map",
+            "name": "map",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAYWXC/task",
+            "name": "task",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAYWXC/feedback",
+            "name": "feedback",
+            "style": {
+                "navigationBarTitleText": "任务反馈",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        { //治安防范培训
+            "path": "pages/grabOrders/grabOrdersZAFFPX/grabOrders",
+            "name": "grabOrdersZAFFPX",
+            "style": {
+                "navigationBarTitleText": "治安防范培训",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAFFPX/map",
+            "name": "map",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAFFPX/task",
+            "name": "task",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/grabOrders/grabOrdersZAFFPX/feedback",
+            "name": "feedback",
+            "style": {
+                "navigationBarTitleText": "任务反馈",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/issue/issue",
+            "name": "issue",
+            "style": {
+                "navigationBarTitleText": "发布",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/index/index",
+            "name": "index",
+            "style": {
+                "navigationBarTitleText": "首页"
+            }
+        },
+        {
+            "path": "pages/map/map",
+            "name": "map",
+            "style": {
+                "navigationBarTitleText": "群防任务",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/currentMap/currentMap",
+            "name": "currentMap",
+            "style": {
+                "navigationBarTitleText": "获取辖区",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/clockSignIn/clockSignIn",
+            "name": "clockSignIn",
+            "style": {
+                "navigationBarTitleText": "打卡签到",
+                "navigationBarBackgroundColor": "#25262E",
+                "app-plus": {
+                    "titleNView": false
+                }
+            }
+        },
+        {
+            "path": "pages/poput/workbench/policeDetails/policeDetails",
+            "name": "policeDetails",
+            "style": {
+                "navigationBarTitleText": "警情详情提交信息页面"
+            }
+        },
+        {
+            "path": "pages/poput/mapJQtijiao/mapJQtijiao/mapJQtijiao",
+            "name": "mapJQtijiao",
+            "style": {
+                "navigationBarTitleText": "处理结果",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/poput/alarmOver/alarmOver",
+            "name": "alarmOver",
+            "style": {
+                "navigationBarTitleText": "任务详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        },
+        {
+            "path": "pages/error-page/403",
+            "style": {
+                "navigationBarTitleText": "403"
+            }
+        },
+        {
+            "path": "pages/error-page/404",
+            "style": {
+                "navigationBarTitleText": "404"
+            }
+        },
+        {
+            "path": "pages/error-page/500",
+            "style": {
+                "navigationBarTitleText": "500"
+            }
+        }, {
+            "path": "pages/alarm_list/integral/integral",
+            "style": {
+                "navigationBarTitleText": "查积分",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		{
-			"path": "pages/issue/issue",
-			"name": "issue",
-			"style": {
-				"navigationBarTitleText": "发布",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
+        }, {
+            "path": "pages/alarm_list/organ/organ",
+            "style": {
+                "navigationBarTitleText": "组织申请",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		{
-			"path": "pages/index/index",
-			"name": "index",
-			"style": {
-				"navigationBarTitleText": "首页"
-			}
-		},
-		{
-			"path": "pages/map/map",
-			"name": "map",
-			"style": {
-				"navigationBarTitleText": "群防任务",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/currentMap/currentMap",
-			"name": "currentMap",
-			"style": {
-				"navigationBarTitleText": "获取辖区",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/clockSignIn/clockSignIn",
-			"name": "clockSignIn",
-			"style": {
-				"navigationBarTitleText": "打卡签到",
-				"navigationBarBackgroundColor": "#25262E",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
-			"path": "pages/poput/workbench/policeDetails/policeDetails",
-			"name": "policeDetails",
-			"style": {
-				"navigationBarTitleText": "警情详情提交信息页面"
-			}
-		},
-		{
-			"path": "pages/poput/mapJQtijiao/mapJQtijiao/mapJQtijiao",
-			"name": "mapJQtijiao",
-			"style": {
-				"navigationBarTitleText": "处理结果",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/poput/alarmOver/alarmOver",
-			"name": "alarmOver",
-			"style": {
-				"navigationBarTitleText": "任务详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-		},
-		{
-			"path": "pages/error-page/403",
-			"style": {
-				"navigationBarTitleText": "403"
-			}
-		},
-		{
-			"path": "pages/error-page/404",
-			"style": {
-				"navigationBarTitleText": "404"
-			}
-		},
-		{
-			"path": "pages/error-page/500",
-			"style": {
-				"navigationBarTitleText": "500"
-			}
-		}, {
-			"path": "pages/alarm_list/integral/integral",
-			"style": {
-				"navigationBarTitleText": "查积分",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/alarm_list/industry/industry",
+            "style": {
+                "navigationBarTitleText": "行业政策",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/alarm_list/organ/organ",
-			"style": {
-				"navigationBarTitleText": "组织申请",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/alarm_list/industry/industry_detail",
+            "style": {
+                "navigationBarTitleText": "行业政策",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/alarm_list/industry/industry",
-			"style": {
-				"navigationBarTitleText": "行业政策",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/voting/vote",
+            "style": {
+                "navigationBarTitleText": "参与投票",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/alarm_list/industry/industry_detail",
-			"style": {
-				"navigationBarTitleText": "行业政策",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/voting/voteManage",
+            "style": {
+                "navigationBarTitleText": "我的投票",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/voting/vote",
-			"style": {
-				"navigationBarTitleText": "参与投票",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/voting/voteDetail",
+            "style": {
+                "navigationBarTitleText": "投票详情",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/voting/voteManage",
-			"style": {
-				"navigationBarTitleText": "我的投票",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/voting/votRanking",
+            "style": {
+                "navigationBarTitleText": "投票排名",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/voting/voteDetail",
-			"style": {
-				"navigationBarTitleText": "投票详情",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/registerUser/agreement",
+            "style": {
+                "navigationBarTitleText": "",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/voting/votRanking",
-			"style": {
-				"navigationBarTitleText": "投票排名",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        },
+        {
+            "path": "pages/voting/information",
+            "style": {
+                "navigationBarTitleText": "电子证件",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
 
-		}, {
-			"path": "pages/registerUser/agreement",
-			"style": {
-				"navigationBarTitleText": "",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
+        }, {
+            "path": "pages/exam/startexam",
+            "name": "startexam",
+            "style": {
+                "navigationBarTitleText": "开始考试",
+                "navigationBarBackgroundColor": "#103289",
+                "navigationBarTextStyle": "white"
+            }
+        }, {
+            "path": "pages/exam/examTextPage",
+            "name": "examTextPage",
+            "style": {
+                "navigationStyle": "custom",
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+        },
+        {
+            "path": "pages/exam/examReviewPage",
+            "name": "examReviewPage",
+            "style": {
+                "navigationStyle": "custom",
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
 
-		},
-		{
-			"path": "pages/voting/information",
-			"style": {
-				"navigationBarTitleText": "电子证件",
-				"navigationBarBackgroundColor": "#103289",
-				"navigationBarTextStyle": "white"
-			}
-
-		}
-	],
-	"globalStyle": { //将组件安装在项目的components目录下,并符合components/组件名称/组件名称.vue目录结构。可以不用引用、注册,直接在页面中使用。
-		"autoscan": true
-	},
-	"tabBar": {
-		"color": "#7a7e83",
-		"selectedColor": "#0faeff",
-		"backgroundColor": "#ffffff",
-		"list": [{
-				"pagePath": "pages/home/home",
-				"text": "首页",
-				"iconPath": "static/tabbar/index01.png",
-				"selectedIconPath": "static/tabbar/index02.png"
-			},
-			{
-				"pagePath": "pages/article/article",
-				"text": "资讯",
-				"iconPath": "static/tabbar/article.png",
-				"selectedIconPath": "static/tabbar/articleH.png"
-			},
-			{
-				"pagePath": "pages/issue/issue",
-				"iconPath": "static/tabbar/addIcon.png",
-				"selectedIconPath": "static/tabbar/addSelectedIcon.png",
-				"text": "发布"
-			},
-			{
-				"pagePath": "pages/business/business",
-				"text": "工作台",
-				"iconPath": "static/tabbar/workbench.png",
-				"selectedIconPath": "static/tabbar/workbenchH.png"
-			},
-			{
-				"pagePath": "pages/myself/myself",
-				"text": "我的",
-				"iconPath": "static/tabbar/my.png",
-				"selectedIconPath": "./static/tabbar/my-blue.png"
-			}
-		]
-	},
-	"globalStyle": { // 不能在globalStyle中设置隐藏头部导航栏,否则聊天页面的头部栏会不显示,在pages中设置titleNView为false就可以隐藏头部导航栏了
-		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "hello",
-		"navigationBarBackgroundColor": "#fff",
-		"backgroundColor": "#f7f7f7",
-		"backgroundTextStyle": "light",
-		"pageOrientation": "portrait", //横屏配置,屏幕旋转设置
-		"app-plus": {
-			"bounce": "none"
-		}
-	}
-}
+        }
+    ],
+    "globalStyle": { //将组件安装在项目的components目录下,并符合components/组件名称/组件名称.vue目录结构。可以不用引用、注册,直接在页面中使用。
+        "autoscan": true
+    },
+    "tabBar": {
+        "color": "#7a7e83",
+        "selectedColor": "#0faeff",
+        "backgroundColor": "#ffffff",
+        "list": [{
+                "pagePath": "pages/home/home",
+                "text": "首页",
+                "iconPath": "static/tabbar/index01.png",
+                "selectedIconPath": "static/tabbar/index02.png"
+            },
+            {
+                "pagePath": "pages/article/article",
+                "text": "资讯",
+                "iconPath": "static/tabbar/article.png",
+                "selectedIconPath": "static/tabbar/articleH.png"
+            },
+            {
+                "pagePath": "pages/issue/issue",
+                "iconPath": "static/tabbar/addIcon.png",
+                "selectedIconPath": "static/tabbar/addSelectedIcon.png",
+                "text": "发布"
+            },
+            {
+                "pagePath": "pages/business/business",
+                "text": "工作台",
+                "iconPath": "static/tabbar/workbench.png",
+                "selectedIconPath": "static/tabbar/workbenchH.png"
+            },
+            {
+                "pagePath": "pages/myself/myself",
+                "text": "我的",
+                "iconPath": "static/tabbar/my.png",
+                "selectedIconPath": "./static/tabbar/my-blue.png"
+            }
+        ]
+    },
+    "globalStyle": { // 不能在globalStyle中设置隐藏头部导航栏,否则聊天页面的头部栏会不显示,在pages中设置titleNView为false就可以隐藏头部导航栏了
+        "navigationBarTextStyle": "black",
+        "navigationBarTitleText": "hello",
+        "navigationBarBackgroundColor": "#fff",
+        "backgroundColor": "#f7f7f7",
+        "backgroundTextStyle": "light",
+        "pageOrientation": "portrait", //横屏配置,屏幕旋转设置
+        "app-plus": {
+            "bounce": "none"
+        }
+    }
+}
\ No newline at end of file
diff --git a/pages/business/business.vue b/pages/business/business.vue
index 5d69ca1..b04ee39 100644
--- a/pages/business/business.vue
+++ b/pages/business/business.vue
@@ -26,7 +26,7 @@
 				<view class="list">
 					<u-grid :col="4" :border="false">
 						<u-grid-item bg-color="transparent" v-for="(item, index) in dataTwo" :key="index">
-							<navigator hover-class="none" class="nav-item" @click="goTwoPage(item.url,index)">
+							<navigator hover-class="none" url="" class="nav-item" @click="goTwoPage(item.url,index)">
 								<image :src="item.img" mode="widthFix" class="nav-item-img"></image>
 								<view class="nav-item-name">{{item.title}}</view>
 							</navigator>
@@ -84,7 +84,13 @@
 					title: '投票排行',
 					img: '../../static/workbench/task6.png',
 					url: '/pages/voting/votRanking'
-				}]
+				}
+                // ,{
+				// 	title:'模拟考试',
+				// 	img:'../../static/workbench/exam.png',
+				// 	url:'/pages/exam/startexam'
+				// }
+                ]
 			};
 		},
 		onLoad() {
diff --git a/pages/exam/examReviewPage.vue b/pages/exam/examReviewPage.vue
new file mode 100644
index 0000000..b85b304
--- /dev/null
+++ b/pages/exam/examReviewPage.vue
@@ -0,0 +1,199 @@
+<template>
+	<view>
+		<nav-bar-sub></nav-bar-sub>
+		<!-- 用于提示是否确认退出考试 -->
+		<!-- <u-modal v-model="show" :content="content" :show-cancel-button="true" @confirm="handleConfirm"></u-modal> -->
+		<!-- 渲染题目 -->
+		<Answer :isReviewed='isReview' examType="exam" @submit='handleCommit' @timeEnd='handleConfirm'
+			@onChange='onChange'></Answer>
+	</view>
+
+</template>
+
+<script>
+	import Answer from '@/components/dyw-answer/answer.vue';
+	export default {
+		data() {
+			return {
+				// show: false,
+				// content: '是否确认交卷',
+				isReview: true,
+				confirmSubmitContent: '',
+				questionList: [],
+				examType: '', //考试类型
+			}
+		},
+		onLoad(option) {
+			var that = this
+			this.$api.checkGrade(option.recordId)
+				.then(res => {
+					console.log(res.values);
+					that.$store.state.examDetail = res.values
+					var quesModules = res.values.modules
+					// 提取出所有的题目
+					for (let i = 0; i < quesModules.length; i++) {
+						for (let j = 0; j < quesModules[i].questions.length; j++) {
+							// 解决theoryExamAnswer可能为null的问题,把它赋值为字符串
+							if (quesModules[i].questions[j].theoryExamAnswer == null) {
+								quesModules[i].questions[j].unAnswered = true //标记此题未答
+							}
+							quesModules[i].questions[j].template = quesModules[i].template //防止template初始值是null
+							quesModules[i].questions[j].tempAnswer = ''
+							quesModules[i].questions[j].rightAnswer = ''
+							// quesModules[i].questions[j].recordId = that.$store.state.examDetail.recordId //搬移recordId的位置
+							// 遍历选项得出正确答案和用户答案
+							if (quesModules[i].questions[j].template == 1 || quesModules[i].questions[j].template ==
+								2) {
+								// 单选题与多选题
+								if (quesModules[i].questions[j].unAnswered) {
+									quesModules[i].questions[j].theoryExamAnswer = {
+										optAnswer: "未作答"
+									}
+								}
+
+								// 用户答案
+								quesModules[i].questions[j].tempAnswer = quesModules[i].questions[j]
+									.theoryExamAnswer.optAnswer
+
+								// 赋值选择题正确答案
+								for (let k = 0; k < quesModules[i].questions[j].options.length; k++) {
+									// 获取选择题的正确答案
+									if (quesModules[i].questions[j].options[k].optAnswer == 1) {
+										if (quesModules[i].questions[j].rightAnswer == '') {
+											quesModules[i].questions[j].rightAnswer = quesModules[i].questions[j]
+												.options[k].optLetter
+										} else {
+											quesModules[i].questions[j].rightAnswer += ',' + quesModules[i]
+												.questions[j].options[k].optLetter
+										}
+									}
+								}
+
+								// 判断题目错选了哪一项
+								var rightArr = quesModules[i].questions[j].rightAnswer.split(',')
+								var userArr = quesModules[i].questions[j].tempAnswer.split(',')
+								quesModules[i].questions[j].wrongArr = [] // 保存选中的错误的选项
+
+								for (var item of userArr) {
+									// 用户的该答案不在正确答案数组在
+									if (rightArr.indexOf(item) < 0) {
+										quesModules[i].questions[j].wrongArr.push(item)
+									}
+								}
+
+							} else if (quesModules[i].questions[j].template == 3) {
+								// 3.判断题
+								quesModules[i].questions[j].wrongArr = ''
+								if (quesModules[i].questions[j].unAnswered) {
+									quesModules[i].questions[j].theoryExamAnswer = {
+										optAnswer: "未作答"
+									}
+								}
+								// 题目已经作答 获取用户判断题答案 0错误 1正确
+								quesModules[i].questions[j].tempAnswer = quesModules[i].questions[j]
+									.theoryExamAnswer.optAnswer
+
+								// 为判断题的答案赋值
+								if (quesModules[i].questions[j].options[0].optAnswer == 0) {
+									quesModules[i].questions[j].rightAnswer = "错误"
+								} else {
+									quesModules[i].questions[j].rightAnswer = "正确"
+								}
+								
+								// 判断题目错选了哪一项
+								if (quesModules[i].questions[j].tempAnswer != quesModules[i].questions[j].options[0]
+									.optAnswer) {
+									quesModules[i].questions[j].wrongArr = quesModules[i].questions[j].tempAnswer
+								}
+
+							} else if (quesModules[i].questions[j].template == 4) {
+								// 4.填空题
+								if (!quesModules[i].questions[j].unAnswered) {
+									// 题目已经作答 获取用户填空题答案
+									quesModules[i].questions[j].blankArr = quesModules[i].questions[j]
+										.theoryExamAnswer
+										.shortAnswer.split("||~||")
+										quesModules[i].questions[j].blankString = quesModules[i].questions[j].blankArr.join(',')
+								} else {
+									// 题目未作答
+									quesModules[i].questions[j].blankArr = [] //新建blankArr属性,临时保存填空题答案
+									quesModules[i].questions[j].blankString = '' //新建blankArr属性,临时保存填空题答案
+									quesModules[i].questions[j].theoryExamAnswer = {}
+									for (let m = 0; m < quesModules[i].questions[j].options.length; m++) {
+										quesModules[i].questions[j].theoryExamAnswer.shortAnswer += "暂未作答||~||"
+									}
+								}
+
+								// 为填空题附上正确答案
+								for (let k = 0; k < quesModules[i].questions[j].options.length; k++) {
+									// 把null赋值为空字符串
+									if (quesModules[i].questions[j].rightAnswer == '') {
+										quesModules[i].questions[j].rightAnswer = quesModules[i].questions[j]
+											.options[
+												k].optContent
+									} else {
+										quesModules[i].questions[j].rightAnswer += ',' + quesModules[i].questions[
+												j]
+											.options[k].optContent
+									}
+								}
+							} else {
+								// 5.简答题
+								if (!quesModules[i].questions[j].unAnswered) {
+									// 题目已经作答 获取用户的简答题答案
+									quesModules[i].questions[j].tempAnswer = quesModules[i].questions[j]
+										.theoryExamAnswer
+										.shortAnswer
+								} else {
+									quesModules[i].questions[j].theoryExamAnswer = {}
+									quesModules[i].questions[j].theoryExamAnswer.shortAnswer = "暂未作答"
+								}
+
+								// 正确答案
+								quesModules[i].questions[j].rightAnswer = quesModules[i].questions[j].queAnswer
+							}
+							that.questionList.push(quesModules[i].questions[j])
+						}
+					}
+					that.$store.state.questionList = that.questionList
+					console.log('questionList:', that.questionList);
+				})
+			console.log('考题列表:', this.questionList);
+		},
+		components: {
+			Answer
+		},
+		methods: {
+			/* 提交答案 显示再次确认*/
+			handleCommit(questionList) {
+				// 显示是否确认交卷
+				this.show = true;
+			},
+
+			// 已确认进行答案提交
+			handleConfirm() {
+				// uni.setStorageSync('questionList', questionList)
+				// 进行交卷的api请求
+				this.$api.commitExam(this.$store.state.examDetail.exam.id, this.$store.state.examDetail.recordId)
+					.then(res => {
+						console.log('交卷:', res);
+					})
+
+				uni.redirectTo({
+					url: '/pages/exam/examResultPage',
+				})
+			},
+			/* 题目答案变化
+			 */
+			onChange(answer) {
+				console.log(answer)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #FFFFFF;
+	}
+</style>
diff --git a/pages/exam/examTextPage.vue b/pages/exam/examTextPage.vue
new file mode 100644
index 0000000..a21fcf4
--- /dev/null
+++ b/pages/exam/examTextPage.vue
@@ -0,0 +1,178 @@
+<template>
+	<view>
+		<!-- <nav-bar-sub></nav-bar-sub> -->
+		<!-- 用于提示是否确认退出考试 -->
+		<u-modal v-model="show" :content="content" :show-cancel-button="true" @confirm="handleConfirm"></u-modal>
+
+		<!-- 渲染题目 -->
+		<Answer :isReviewed='isReview' :examType="examType" @submit='handleCommit' @timeEnd='handleConfirm'
+			@onChange='onChange'></Answer>
+
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import Answer from '@/components/dyw-answer/answer.vue';
+	import {
+		enterExam
+	} from '@/common/api/exam'
+	import {
+		ModifyQuesList
+	} from '@/common/api/examFunc'
+	export default {
+		data() {
+			return {
+				show: false,
+				content: '是否确认交卷',
+				isReview: false,
+				questionList: [],
+				examType: 'exam', //考试类型
+			}
+		},
+		onLoad(option) {
+
+			this.examType = option.examType
+			
+			var that = this
+			if (option.examType == 'exam') {
+				// 理论考试
+				enterExam({
+					idCardNo: option.id
+				}).then(res => {
+					var examObj = res.data.data.simulateExamRecord
+
+					examObj.exam = {
+						name: '测试考试',
+						examScore: 100,
+						examTime: res.data.data.simulateExamRecord.answerTime,
+						checkFace: 1,
+						...option
+					}
+					
+					
+
+					examObj.exam.totalQuestion = res.data.data.examSubjectInfo.length
+					examObj.totalQuestion = res.data.data.examSubjectInfo.length
+					that.$store.state.examDetail = examObj
+
+					// 提取出所有的题目
+					ModifyQuesList(res.data.data.examSubjectInfo)
+				})
+			} else if (option.examType == 'paper') {
+				// 模拟考试
+				this.$api.paperStart(option.paperId)
+					.then(res => {
+						console.log('paperStart:', res);
+						that.$store.state.examDetail = res.values
+						console.log('paper examDetail:', res.values);
+						var quesModules = res.values.modules
+						that.$api.ModifyQuesList(quesModules)
+						console.log(that.$store.state.pracDetail);
+						console.log(that.$store.state.pracQuesList);
+					})
+			} else if (option.examType == 'know') {
+				// 知识点练习
+				const knowSearch = JSON.parse(decodeURIComponent(option.knowSearch));
+				console.log(knowSearch);
+				this.$api.startKnow(knowSearch)
+					.then(res => {
+						if (res.status == 1) {
+							// 获取知识点失败
+							this.$refs.uToast.show({
+								title: res.message,
+								type: 'error',
+								// icon: false,
+								url: '/pages/exam/pracIndexKnow'
+							})
+						} else {
+							console.log('开始知识点练习的请求结果:', res);
+							that.$store.state.examDetail = res.values
+							var quesModules = res.values.modules
+							that.$api.ModifyQuesList(quesModules)
+							console.log(that.$store.state.pracDetail);
+							console.log(that.$store.state.pracQuesList);
+						}
+					})
+			} else if (option.examType == 'course') {
+				this.$api.startTheory(that.$store.state.access_token, option.paperId)
+					.then(res => {
+						that.$store.state.examDetail = res.values
+						var quesModules = res.values.modules
+						that.$api.ModifyQuesList(quesModules)
+					})
+			} else {
+				console.log("考试类型错误,请输入正确的类型");
+				// return false
+			}
+
+			console.log('考题列表:', this.questionList);
+		},
+		components: {
+			Answer
+		},
+		methods: {
+			/* 提交答案 显示再次确认*/
+			handleCommit(questionList) {
+				// 显示是否确认交卷
+				this.show = true;
+			},
+
+			// 已确认进行答案提交
+			handleConfirm() {
+				// 进行交卷的api请求
+				let that = this
+				if (this.examType == 'exam') {
+					this.$api.commitExam(this.$store.state.examDetail.exam.id, this.$store.state.examDetail.recordId)
+						.then(res => {
+							console.log('交卷:', res);
+							that.$u.route('/pages/exam/examResultPage', {
+								recordId: that.$store.state.examDetail.recordId,
+								examType: 'exam'
+							})
+						})
+				} else if ((this.examType == 'paper') || (this.examType == 'know')) {
+					this.$api.commitPaper(this.$store.state.examDetail.exerciseId)
+						.then(res => {
+							console.log('交卷:', res);
+							that.$u.route('/pages/exam/examResultPage', {
+								exerciseId: that.$store.state.examDetail.exerciseId,
+								examType: 'paper',
+							})
+						})
+				} else if (this.examType == 'store') {
+					this.$api.commitExam(this.$store.state.examDetail.exam.id, this.$store.state.examDetail.recordId)
+						.then(res => {
+							console.log('交卷:', res);
+							that.$u.route('/pages/exam/examResultPage', {
+								recordId: that.$store.state.examDetail.recordId,
+								examType: 'exam'
+							})
+						})
+				} else if (this.examType == 'course') {
+					this.$api.commitCourse(this.$store.state.access_token, this.$store.state.examDetail.exerciseId)
+						.then(res => {
+							console.log('交卷:', res);
+							that.$u.route('/pages/exam/examResultPage', {
+								exerciseId: that.$store.state.examDetail.exerciseId,
+								examType: 'course',
+							})
+						})
+				} else {
+					console.log("提交的考试类型出错");
+				}
+			},
+			/* 题目答案变化
+			 */
+			onChange(answer) {
+				console.log(answer)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	page {
+		background-color: #FFFFFF;
+	}
+</style>
diff --git a/pages/exam/startexam.vue b/pages/exam/startexam.vue
new file mode 100644
index 0000000..2f669b1
--- /dev/null
+++ b/pages/exam/startexam.vue
@@ -0,0 +1,150 @@
+<template>
+	<view>
+		<view class="subTitle">
+			考试信息
+		</view>
+		<view class="examContent">
+			<view>考试名称:<text>{{examItem.name}}</text> </view>
+			<view>考试总分:<text>{{examItem.examScore}}</text>分</view>
+			<view v-if="examItem.examTime>0">考试时长:<text>{{examItem.examTime}}</text>分钟</view>
+			<view v-else>考试时长:<text>不限时长</text></view>
+		</view>
+		<view class="subTitle">考试须知</view>
+		<view class="tipsArea">
+			<ul>
+				<li>1、答题时要注意“剩余时间”提示,当剩余时间为0时,系统将自动交卷。</li>
+				<li>2、答题完成后,点击“我要交卷”按钮进行交卷,否则考试无效。</li>
+				<li>3、如果你准备好了,就点击“进入考场”吧,预祝取得好的成绩。</li>
+			</ul>
+		</view>
+		<view class="btnArea">
+			<!-- checkFace==1 不需要人脸识别,checkFace==2 需要人脸识别 -->
+			<u-button v-if="needCheckFace==2 && !passFace " class="btnClass" type="primary" :ripple="true"
+				shape="circle" @click="checkFace">开始人脸识别</u-button>
+			<u-button v-if="needCheckFace==1 || passFace" class="btnClass" type="success" :ripple="true" shape="circle"
+				@click="enterExam">进入考试</u-button>
+			<u-button class="btnClass" type="error" :ripple="true" shape="circle" @click="exitExam">退出考试</u-button>
+		</view>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				examItem: {},
+				examNote: `
+				1、答题时要注意“剩余时间”提示,当剩余时间为0时,系统将自动交卷。
+				2、答题完成后,点击“我要交卷”按钮进行交卷,否则考试无效。
+				3、如果你准备好了,就点击“进入考场”吧,预祝取得好的成绩。`,
+				passFace: false,
+
+			}
+		},
+		methods: {
+			enterExam() {
+				// 进入考试
+				// uni.navigateTo({
+				// 	url: '/pages/exam/examTextPage'
+				// })
+
+				this.$u.route('/pages/exam/examTextPage', {
+					id: this.examItem.id,
+					examType: 'exam',
+				})
+
+			},
+			exitExam() {
+				// 退出考试
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			checkFace() {
+				var that = this
+				this.$api.uploadImg2('face')
+					.then(res => {
+						console.log('faceRes', res)
+						if (res.data.indexOf('操作成功') >= 0) {
+							this.passFace = true
+						}
+					})
+			},
+		},
+		computed: {
+			needCheckFace: function() {
+				// checkFace==1 不需要人脸识别,checkFace==2 需要人脸识别
+				// H5 平台不需要检测人脸
+				// #ifdef  H5 
+				return 1
+				// #endif
+
+				// #ifdef APP-PLUS || MP-WEIXIN
+				return this.examItem.checkFace
+				// #endif
+			}
+		},
+		onLoad(options) {
+			// 页面跳转 传递对象 传对象
+			options = {
+				id: '360198198812130014',
+				name: '测试考试',
+				examScore: 100,
+				examTime: 90,
+				checkFace: 1
+			}
+			this.examItem = options
+			console.log("考试信息:", this.examItem);
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		font-size: 31rpx;
+
+		ul li {
+			list-style: none;
+		}
+	}
+
+	.tipsArea {
+		padding: 0 40rpx;
+		margin-left: -30rpx;
+	}
+
+	.subTitle {
+		font-size: $uni-font-size-title;
+		font-weight: bold;
+		color: #103289;
+		text-align: center;
+		margin: 40rpx auto 20rpx auto;
+	}
+
+	.examContent {
+		line-height: 50rpx;
+		margin-left: 180rpx;
+
+		text {
+			font-weight: bold;
+		}
+	}
+
+	ol {
+		// padding: 80rpx;
+		// background-color: #0077AA;
+		margin: 0 30rpx;
+		line-height: 50rpx;
+	}
+
+	.btnArea {
+		display: flex;
+		margin-top: 50rpx;
+
+		.btnClass {
+			width: 300rpx;
+		}
+	}
+</style>
diff --git a/pages/registerUser/registerUser.vue b/pages/registerUser/registerUser.vue
index 94a19f1..e545fb7 100644
--- a/pages/registerUser/registerUser.vue
+++ b/pages/registerUser/registerUser.vue
@@ -58,7 +58,7 @@
 		</div>
 
 		<u-button class="submit" @click="zc">
-			下一步</u-button>
+			注册</u-button>
 
 		<!-- <u-button class="submit" @click="submit">提交</u-button> -->
 	</view>
@@ -420,18 +420,52 @@
 							return
 
 						}
-
-						that.$refs.uForm.validate(valid => {
-							if (valid) {
-								var d = that.form;
-								uni.navigateTo({
-									url: '/pages/registerUser/idphoto?data= ' +
-										encodeURIComponent(JSON.stringify(
-											d))
+						var d = that.form;
+						var url = that.$store.state.piAPI + '/zc/inster',
+							data = {
+								// deptid: ,
+								password: d.pass,
+								password2: d.passTwo,
+								phone: d.phone,
+								sex: d.sex == '男' ? 1 : 2,
+								sname: d.name,
+								username: d.user,
+								deptid: d.objId,
+								parentId: d.jsid,
+								jurisdiction: d.xqobjId,
+								cardid: d.carId,
+								address: d.address,
+								workunit: d.obj
+							}
+						uni.request({
+							url: url,
+							method: 'POST',
+							data: data,
+							success: (res) => {
+								uni.showToast({
+									title: '注册成功,请等待审核',
+									icon: 'none',
+									duration: 2000
 								});
+								setTimeout(function() {
+									uni.navigateTo({
+										url: '/pages/loging/loging'
+									})
+								}, 2000);
 							}
 						});
 
+						// that.$refs.uForm.validate(valid => {
+						// 	if (valid) {
+						// 		var d = that.form;
+						// 		uni.navigateTo({
+						// 			url: '/pages/registerUser/idphoto?data= ' +
+						// 				encodeURIComponent(JSON.stringify(
+						// 					d))
+						// 		});
+						// 	}
+						// });
+
 					}
 				});
 
diff --git a/static/workbench/exam.png b/static/workbench/exam.png
new file mode 100644
index 0000000..65cdea8
--- /dev/null
+++ b/static/workbench/exam.png
Binary files differ
diff --git a/store/apiConfig.js b/store/apiConfig.js
index 00b8b68..5fa0df5 100644
--- a/store/apiConfig.js
+++ b/store/apiConfig.js
@@ -3,7 +3,7 @@
 	var api = 'http://223.82.109.183:2082/api/';
 	var wsapi = 'ws://223.82.109.183:2082/wss/websocket';
 } else {
-	var api = 'http://192.168.0.108:83/';
+	var api = 'http://192.168.0.198/';
 	var wsapi = 'ws://192.168.0.108:9034/websocket';
 }
 
diff --git a/store/state.js b/store/state.js
index e91adf9..aef65ac 100644
--- a/store/state.js
+++ b/store/state.js
@@ -2,6 +2,9 @@
 import positions from "./positions.js"
 import apis from "./apiConfig.js"
 const state = {
+	examDetail: {}, // 考试详情
+	questionList: [], // 考试考题列表
+	queTypeArr:[0,0,0,0,0],
 	loging: false,
 	message: {
 		useName: '过客',

--
Gitblit v1.9.3