|
@@ -0,0 +1,471 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div id="ExamrecordPage">
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ width="1000px"
|
|
|
|
|
+ class="take-photo"
|
|
|
|
|
+ :visible.sync="Modal"
|
|
|
|
|
+ :close-on-click-modal="true"
|
|
|
|
|
+ :close-on-press-escape="true"
|
|
|
|
|
+ :show-close="true"
|
|
|
|
|
+ title="答题详情"
|
|
|
|
|
+ center="true"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-row :gutter="20" class="el_rowStyle">
|
|
|
|
|
+ <el-col :span="19" style="font-size: 14px; max-height: 100%; overflow-y: auto;width: 100%;">
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="showData"
|
|
|
|
|
+ style="padding: 0px 20px;"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(item, index) in getInfoRecord.historyExamJson"
|
|
|
|
|
+ :key="index"
|
|
|
|
|
+ style="margin: 14px 0px; background-color: #eee; padding: 10px"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div style="border-bottom: 1px dotted #666; padding: 4px 0px 10px">
|
|
|
|
|
+ <span style="margin-right: 14px">题目{{ index + 1 }}</span>
|
|
|
|
|
+ <span style="margin-right: 14px">{{
|
|
|
|
|
+ changeQuestType(item.type)
|
|
|
|
|
+ }}</span>
|
|
|
|
|
+ <span style="margin-right: 14px">分值:{{ item.score }}分</span>
|
|
|
|
|
+ <span style="margin-right: 14px; color: red"
|
|
|
|
|
+ >得分:{{ item.scoreResult }}分</span
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-if="item.type === 4 || item.type === 5"
|
|
|
|
|
+ style="margin-right: 14px"
|
|
|
|
|
+ type="text"
|
|
|
|
|
+ @click="setMath(item, index)"
|
|
|
|
|
+ >评分</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">题目内容:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <div v-html="item.content"></div>
|
|
|
|
|
+ <div v-if="item.type === 4">
|
|
|
|
|
+ <div
|
|
|
|
|
+ style="margin: 20px; background-color: #fff; padding: 12px"
|
|
|
|
|
+ v-for="(ite, ind) in item.jsonStr"
|
|
|
|
|
+ :key="ind"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="ddis_fs" v-if="item.ite !== 5">
|
|
|
|
|
+ <div>题目类型:{{ changeQuestType(ite.type) }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">题目内容:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <div v-html="ite.content"></div>
|
|
|
|
|
+ <ul>
|
|
|
|
|
+ <li
|
|
|
|
|
+ v-for="(items, indexs) in ite.optionsList"
|
|
|
|
|
+ :key="indexs"
|
|
|
|
|
+ style="margin-bottom: 10px"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ Gest(indexs + 1) }}:{{ items.content }}
|
|
|
|
|
+
|
|
|
|
|
+ <el-image
|
|
|
|
|
+ v-if="items.imgUrl"
|
|
|
|
|
+ style="
|
|
|
|
|
+ width: 40px;
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ vertical-align: middle;
|
|
|
|
|
+ "
|
|
|
|
|
+ :src="$methodsTools.splitImgHost(items.imgUrl)"
|
|
|
|
|
+ :preview-src-list="[
|
|
|
|
|
+ $methodsTools.splitImgHost(items.imgUrl),
|
|
|
|
|
+ ]"
|
|
|
|
|
+ >
|
|
|
|
|
+ </el-image>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs" v-if="ite.type !== 5">
|
|
|
|
|
+ <div class="content">正确答案:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <span v-if="ite.type === 3">
|
|
|
|
|
+ {{ ite.answerQuestion == 1 ? "正确" : "错误" }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span v-else>
|
|
|
|
|
+ {{ getDictChanges(ite.answerQuestion) }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">答案解析:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <div v-html="imgExiz(ite.analysisContent)"></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">填选答案:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <p
|
|
|
|
|
+ style="margin: 0px"
|
|
|
|
|
+ v-if="ite.type === 1 || ite.type === 2"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ getDictChanges(item.ques[ind]) }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <p style="margin: 0px" v-if="ite.type === 3">
|
|
|
|
|
+ {{ item.ques[ind] == 1 ? "正确" : "错误" }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <div v-if="ite.type === 5">
|
|
|
|
|
+ <p>{{ ite.ansText.text }}</p>
|
|
|
|
|
+ <ul>
|
|
|
|
|
+ <li
|
|
|
|
|
+ v-for="(k, ds) in ite.ansText.imageList"
|
|
|
|
|
+ :key="ds"
|
|
|
|
|
+ style="
|
|
|
|
|
+ width: 100px;
|
|
|
|
|
+ height: 100px;
|
|
|
|
|
+ float: left;
|
|
|
|
|
+ margin: 0px 10px 10px 0px;
|
|
|
|
|
+ "
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-image
|
|
|
|
|
+ v-if="k"
|
|
|
|
|
+ style="width: 100%; height: 100%"
|
|
|
|
|
+ :src="$methodsTools.splitImgHost(k)"
|
|
|
|
|
+ :preview-src-list="[
|
|
|
|
|
+ $methodsTools.splitImgHost(k),
|
|
|
|
|
+ ]"
|
|
|
|
|
+ >
|
|
|
|
|
+ </el-image>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ <div style="clear: both"></div>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <ul v-else>
|
|
|
|
|
+ <li
|
|
|
|
|
+ v-for="(items, indexs) in item.jsonStr"
|
|
|
|
|
+ :key="indexs"
|
|
|
|
|
+ style="margin-bottom: 10px"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ Gest(indexs + 1) }}:{{ items.content }}
|
|
|
|
|
+
|
|
|
|
|
+ <el-image
|
|
|
|
|
+ v-if="items.imgUrl"
|
|
|
|
|
+ style="width: 40px; height: 40px; vertical-align: middle"
|
|
|
|
|
+ :src="$methodsTools.splitImgHost(items.imgUrl)"
|
|
|
|
|
+ :preview-src-list="[
|
|
|
|
|
+ $methodsTools.splitImgHost(items.imgUrl),
|
|
|
|
|
+ ]"
|
|
|
|
|
+ >
|
|
|
|
|
+ </el-image>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs" v-if="item.type !== 4 && item.type !== 5">
|
|
|
|
|
+ <div class="content">正确答案:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <span v-if="item.type === 3">
|
|
|
|
|
+ {{ item.answerQuestion == 1 ? "正确" : "错误" }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span v-else>
|
|
|
|
|
+ {{ getDictChanges(item.answerQuestion) }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">答案解析:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <div v-html="imgExiz(item.analysisContent)"></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="ddis_fs">
|
|
|
|
|
+ <div class="content">填选答案:</div>
|
|
|
|
|
+ <div style="flex: 1">
|
|
|
|
|
+ <p
|
|
|
|
|
+ style="margin: 0px"
|
|
|
|
|
+ v-if="item.type === 1 || item.type === 2"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ getDictChanges(item.ques) }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <p style="margin: 0px" v-if="item.type === 3">
|
|
|
|
|
+ {{ item.ques == 1 ? "正确" : "错误" }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <div v-if="item.type === 5">
|
|
|
|
|
+ <p>{{ item.ansText.text }}</p>
|
|
|
|
|
+ <ul>
|
|
|
|
|
+ <li
|
|
|
|
|
+ v-for="(k, ds) in item.ansText.imageList"
|
|
|
|
|
+ :key="ds"
|
|
|
|
|
+ style="
|
|
|
|
|
+ width: 100px;
|
|
|
|
|
+ height: 100px;
|
|
|
|
|
+ float: left;
|
|
|
|
|
+ margin: 0px 10px 10px 0px;
|
|
|
|
|
+ "
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-image
|
|
|
|
|
+ v-if="k"
|
|
|
|
|
+ style="width: 100%; height: 100%"
|
|
|
|
|
+ :src="$methodsTools.splitImgHost(k)"
|
|
|
|
|
+ :preview-src-list="[$methodsTools.splitImgHost(k)]"
|
|
|
|
|
+ >
|
|
|
|
|
+ </el-image>
|
|
|
|
|
+ </li>
|
|
|
|
|
+ <div style="clear: both"></div>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <div style="height: 50px; text-align: center; line-height: 50px">
|
|
|
|
|
+ <el-button size="mini" type="success" @click="Modal=false"
|
|
|
|
|
+ >关闭</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+export default {
|
|
|
|
|
+ data() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ Modal: false,
|
|
|
|
|
+ getInfoRecord: [],
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ created() {
|
|
|
|
|
+ },
|
|
|
|
|
+ mounted() {
|
|
|
|
|
+ },
|
|
|
|
|
+ computed: {
|
|
|
|
|
+ imgExiz: function () {
|
|
|
|
|
+ return function (vms) {
|
|
|
|
|
+ if (!vms) {
|
|
|
|
|
+ return vms;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ var ast = vms.replace(/<img/gi, '<img style="max-width:100%;"');
|
|
|
|
|
+ return ast;
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ openBoxs(examId, orderGoodsId) {
|
|
|
|
|
+ this.Modal = true;
|
|
|
|
|
+ this.$api
|
|
|
|
|
+ .obtainVideorecordexam({
|
|
|
|
|
+ examId: examId,
|
|
|
|
|
+ orderGoodsId: orderGoodsId,
|
|
|
|
|
+ })
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ res.data.historyExamJson = JSON.parse(res.data.historyExamJson);
|
|
|
|
|
+ if (!res.data.score) {
|
|
|
|
|
+ res.data.score = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.getInfoRecord = res.data;
|
|
|
|
|
+ console.log( this.getInfoRecord);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ },
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 评分
|
|
|
|
|
+ */
|
|
|
|
|
+ setMath(item, index) {
|
|
|
|
|
+ this.$prompt(`题目最大分值为${item.score}分,请评分`, "提示", {
|
|
|
|
|
+ confirmButtonText: "确定",
|
|
|
|
|
+ cancelButtonText: "取消",
|
|
|
|
|
+ inputPattern: /^[0-9]*$/,
|
|
|
|
|
+ inputErrorMessage: "分值格式不正确",
|
|
|
|
|
+ beforeClose: (action, instance, done) => {
|
|
|
|
|
+ if (
|
|
|
|
|
+ action === "confirm" &&
|
|
|
|
|
+ Number(instance.inputValue) > item.score
|
|
|
|
|
+ ) {
|
|
|
|
|
+ this.$message.warning(`该题评分不得超过${item.score}分`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ done();
|
|
|
|
|
+ },
|
|
|
|
|
+ })
|
|
|
|
|
+ .then(({ value }) => {
|
|
|
|
|
+ this.$message({
|
|
|
|
|
+ type: "success",
|
|
|
|
|
+ message: "评分: " + value,
|
|
|
|
|
+ });
|
|
|
|
|
+ this.$set(
|
|
|
|
|
+ this.getInfoRecord.historyExamJson[index],
|
|
|
|
|
+ "scoreResult",
|
|
|
|
|
+ value
|
|
|
|
|
+ );
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(() => {});
|
|
|
|
|
+ },
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 点击记录触发
|
|
|
|
|
+ */
|
|
|
|
|
+ activeRecordId(row) {
|
|
|
|
|
+ if (this.activeRecordIs === row.recordId) return;
|
|
|
|
|
+ this.getRecodeInfo(row.recordId);
|
|
|
|
|
+ },
|
|
|
|
|
+ editForms() {
|
|
|
|
|
+ var data = JSON.parse(JSON.stringify(this.getInfoRecord));
|
|
|
|
|
+ data.score = 0;
|
|
|
|
|
+ for (let i = 0; i < data.historyExamJson.length; i++) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ (data.historyExamJson[i].type === 4 ||
|
|
|
|
|
+ data.historyExamJson[i].type === 5) &&
|
|
|
|
|
+ data.historyExamJson[i].scoreResult
|
|
|
|
|
+ ) {
|
|
|
|
|
+ data.score += data.historyExamJson[i].scoreResult*1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ data.historyExamJson = JSON.stringify(data.historyExamJson);
|
|
|
|
|
+ this.$api.editrecordexam(data).then((res) => {
|
|
|
|
|
+ this.$message.success("修改成功");
|
|
|
|
|
+ this.getRecodeInfo(data.recordId);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ getRecodeInfo(id) {
|
|
|
|
|
+ this.activeRecordIs = id;
|
|
|
|
|
+ this.$api.obtainrecordexam(id).then((res) => {
|
|
|
|
|
+ res.data.historyExamJson = JSON.parse(res.data.historyExamJson);
|
|
|
|
|
+ if (!res.data.score) {
|
|
|
|
|
+ res.data.score = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.getInfoRecord = res.data;
|
|
|
|
|
+ if (document.getElementsByClassName("showData")[0]) {
|
|
|
|
|
+ document.getElementsByClassName("showData")[0].scrollTop = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ getDictChanges(dan) {
|
|
|
|
|
+ var arst = [];
|
|
|
|
|
+ var arrays;
|
|
|
|
|
+ if (dan instanceof Object) {
|
|
|
|
|
+ arrays = dan;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (dan) {
|
|
|
|
|
+ arrays = dan.toString().split(",");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ for (let i = 0; i < arrays.length; i++) {
|
|
|
|
|
+ arst.push(this.Gest(arrays[i]));
|
|
|
|
|
+ }
|
|
|
|
|
+ return arst.join(",");
|
|
|
|
|
+ },
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 选项转换
|
|
|
|
|
+ */
|
|
|
|
|
+ Gest(ints) {
|
|
|
|
|
+ var int = parseInt(ints);
|
|
|
|
|
+ var ast = "";
|
|
|
|
|
+ switch (int) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ ast = "A";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ ast = "B";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ ast = "C";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ ast = "D";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ ast = "E";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 6:
|
|
|
|
|
+ ast = "F";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 7:
|
|
|
|
|
+ ast = "G";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 8:
|
|
|
|
|
+ ast = "H";
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ ast = "X";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ return ast;
|
|
|
|
|
+ },
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 题目类型
|
|
|
|
|
+ */
|
|
|
|
|
+ changeQuestType(int) {
|
|
|
|
|
+ var type = "";
|
|
|
|
|
+ switch (int) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ type = "单选题";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ type = "多选题";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ type = "判断题";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ type = "案例题";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ type = "简答题";
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ type = "未知";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ return type;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+};
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="less" scoped>
|
|
|
|
|
+.el_rowStyle {
|
|
|
|
|
+ height: calc(90vh - 100px);
|
|
|
|
|
+ .el-col {
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+.dis_style {
|
|
|
|
|
+ user-select: none;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ height: 36px;
|
|
|
|
|
+ line-height: 35px;
|
|
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
|
|
+ margin-left: 20px;
|
|
|
|
|
+ &:first-of-type {
|
|
|
|
|
+ border-top: 1px solid #eee;
|
|
|
|
|
+ }
|
|
|
|
|
+ &:last-of-type {
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+/deep/ .el-collapse {
|
|
|
|
|
+ border: 1px solid #e6ebf5;
|
|
|
|
|
+ padding-left: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+/deep/ .el-collapse-item__content {
|
|
|
|
|
+ padding-bottom: 0px;
|
|
|
|
|
+}
|
|
|
|
|
+.ddis_fs {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+.content {
|
|
|
|
|
+ width: 70px;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+}
|
|
|
|
|
+td {
|
|
|
|
|
+ padding: 6px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|