|
@@ -25,9 +25,16 @@
|
|
|
<div class="student-head">
|
|
|
<div class="student-head-left">
|
|
|
<p><i class="icon icon-user-act"></i></p>
|
|
|
- <p><span>姓名:</span><span>张龙龙</span></p>
|
|
|
- <p><span>证件号:</span><span>000000000000000008</span></p>
|
|
|
- <p><span>科目(代码):</span><span>大学语文(1001)</span></p>
|
|
|
+ <p>
|
|
|
+ <span>姓名:</span><span>{{ detailInfo.examStudentName }}</span>
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ <span>证件号:</span><span>{{ detailInfo.identity }}</span>
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ <span>科目(代码):</span
|
|
|
+ ><span>{{ detailInfo.courseNameCode }}</span>
|
|
|
+ </p>
|
|
|
</div>
|
|
|
<div class="student-head-right">
|
|
|
<el-button
|
|
@@ -44,7 +51,7 @@
|
|
|
</div>
|
|
|
<div class="student-views">
|
|
|
<div class="student-avatar">
|
|
|
- <img :src="curStudent.stdAvatar" alt="" />
|
|
|
+ <img :src="detailInfo.stdAvatar" alt="" />
|
|
|
</div>
|
|
|
<div class="student-video">
|
|
|
<div class="student-video-item">
|
|
@@ -71,10 +78,10 @@
|
|
|
</div>
|
|
|
<div class="student-exception">
|
|
|
<ul>
|
|
|
- <li v-for="(item, index) in exceptionList" :key="index">
|
|
|
+ <li v-for="(item, index) in detailInfo.exceptionInfos" :key="index">
|
|
|
<i>{{ index + 1 }}</i>
|
|
|
- <h4>{{ item.title }}</h4>
|
|
|
- <p>{{ item.desc }}</p>
|
|
|
+ <h4>{{ item.remark }}</h4>
|
|
|
+ <p>{{ item.info }}</p>
|
|
|
</li>
|
|
|
</ul>
|
|
|
</div>
|
|
@@ -101,28 +108,107 @@
|
|
|
<div class="warning-body-head-info summary-line">
|
|
|
<p class="summary-line-item">
|
|
|
<i class="line-point line-point-danger"></i
|
|
|
- ><span class="line-name">系统预警</span><span>1次</span>
|
|
|
+ ><span class="line-name">系统预警</span
|
|
|
+ ><span>{{ detailInfo.warningCount }}次</span>
|
|
|
</p>
|
|
|
<p class="summary-line-item">
|
|
|
<i class="line-point line-point-danger"></i
|
|
|
- ><span class="line-name">陌生人脸</span><span>1次</span>
|
|
|
+ ><span class="line-name">陌生人脸</span
|
|
|
+ ><span>{{ detailInfo.multipleFaceCount }}次</span>
|
|
|
</p>
|
|
|
<p class="summary-line-item">
|
|
|
<i class="line-point line-point-danger"></i
|
|
|
- ><span class="line-name">异常处理</span><span>1次</span>
|
|
|
+ ><span class="line-name">异常处理</span
|
|
|
+ ><span>{{ detailInfo.exceptionCount }}次</span>
|
|
|
</p>
|
|
|
<p class="summary-line-item">
|
|
|
- <span></span><span>违纪状态:正常</span>
|
|
|
+ <span></span><span>违纪状态:{{ detailInfo.status }}</span>
|
|
|
</p>
|
|
|
- <el-button type="danger" icon="icon icon-stop">违纪处理</el-button>
|
|
|
- <el-button type="warning" icon="icon icon-forbide"
|
|
|
+ <el-button type="danger" icon="icon icon-stop" @click="toBreach"
|
|
|
+ >违纪处理</el-button
|
|
|
+ >
|
|
|
+ <el-button type="warning" icon="icon icon-forbide" @click="toFinish"
|
|
|
>强制收卷</el-button
|
|
|
>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="warning-body-main"></div>
|
|
|
+ <div class="warning-body-main">
|
|
|
+ <div class="warning-history">
|
|
|
+ <div class="warning-history-info">
|
|
|
+ <h3>进入考试</h3>
|
|
|
+ <p>时间段:08:00:01</p>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-type type-common">
|
|
|
+ <i class="icon icon-current-step"></i>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-media">
|
|
|
+ <ul class="media-list">
|
|
|
+ <li></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history">
|
|
|
+ <div class="warning-history-info">
|
|
|
+ <h3>违纪预警</h3>
|
|
|
+ <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
+ <p>持续时长约:10分钟16秒</p>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-type type-exception">
|
|
|
+ <i class="icon icon-warning-act"></i>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-media">
|
|
|
+ <ul class="media-list">
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ <li></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history">
|
|
|
+ <div class="warning-history-info">
|
|
|
+ <h3>异常处理</h3>
|
|
|
+ <h5>类型:网络故障</h5>
|
|
|
+ <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
+ <p>持续时长约:10分钟16秒</p>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-type type-exception">
|
|
|
+ <i class="icon icon-net-break"></i>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-media">
|
|
|
+ <ul class="media-list">
|
|
|
+ <li></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history">
|
|
|
+ <div class="warning-history-info">
|
|
|
+ <h3>异常处理</h3>
|
|
|
+ <h5>类型:网络故障</h5>
|
|
|
+ <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
+ <p>持续时长约:10分钟16秒</p>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-type type-exception">
|
|
|
+ <i class="icon icon-net-break"></i>
|
|
|
+ </div>
|
|
|
+ <div class="warning-history-media">
|
|
|
+ <ul class="media-list">
|
|
|
+ <li></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
+ <student-breach-dialog
|
|
|
+ :instance="curDetail"
|
|
|
+ ref="StudentBreachDialog"
|
|
|
+ ></student-breach-dialog>
|
|
|
+
|
|
|
<!-- 通话弹出层 -->
|
|
|
<el-dialog
|
|
|
custom-class="communication-dialog"
|
|
@@ -162,31 +248,78 @@
|
|
|
|
|
|
<script>
|
|
|
import { createClient, createStream } from "@/plugins/trtc";
|
|
|
+import { invigilateFinish } from "@/api/invigilation";
|
|
|
import FlvMedia from "../common/FlvMedia";
|
|
|
import { invigilateDetail, warningStudentDetail } from "@/api/invigilation";
|
|
|
+import StudentBreachDialog from "./StudentBreachDialog";
|
|
|
+
|
|
|
+const test = {
|
|
|
+ breachStatus: 0,
|
|
|
+ courseNameCode: "大学语文(1001)",
|
|
|
+ examActivityId: 0,
|
|
|
+ examId: 0,
|
|
|
+ examRecordId: 11111,
|
|
|
+ examStudentId: 0,
|
|
|
+ examStudentName: "张一三",
|
|
|
+ exceptionCount: 0,
|
|
|
+ exceptionInfos: [
|
|
|
+ {
|
|
|
+ createTime: "",
|
|
|
+ info: "系统发现该考生身份识别多次不通过,请监考老师关注!",
|
|
|
+ remark: "身份验证不通过",
|
|
|
+ type: "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ createTime: "",
|
|
|
+ info:
|
|
|
+ "系统发现该考生至少有多次以上持续1分钟以上的违规动作,且违规动作的持续时间已超出合理范围,请监考老师关注!",
|
|
|
+ remark: "疑似:有违规动作",
|
|
|
+ type: "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ createTime: "",
|
|
|
+ info: "系统检测到考生可能使用了虚拟摄像头,请监考老师关注!",
|
|
|
+ remark: "疑似:启用虚拟摄像头",
|
|
|
+ type: "",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ stdAvatar: "/img/avatars/2.jpg",
|
|
|
+ identity: "000000000000000008",
|
|
|
+ multipleFaceCount: 0,
|
|
|
+ roomCode: "111",
|
|
|
+ roomName: "第一考场",
|
|
|
+ status: "正常",
|
|
|
+ statusCode: "0124",
|
|
|
+ studentLogs: [
|
|
|
+ {
|
|
|
+ createTime: "",
|
|
|
+ info: "",
|
|
|
+ remark: "",
|
|
|
+ type: "",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ warningCount: 0,
|
|
|
+ warningInfos: [
|
|
|
+ {
|
|
|
+ approveStatus: 0,
|
|
|
+ createTime: "",
|
|
|
+ info: "",
|
|
|
+ level: "",
|
|
|
+ remark: "",
|
|
|
+ type: "",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+};
|
|
|
|
|
|
export default {
|
|
|
name: "warning-detail",
|
|
|
- components: { FlvMedia },
|
|
|
+ components: { FlvMedia, StudentBreachDialog },
|
|
|
data() {
|
|
|
return {
|
|
|
- recordId: "32145907927482368",
|
|
|
- // recordId: this.$route.params.recordId,
|
|
|
- exceptionList: [
|
|
|
- {
|
|
|
- title: "身份验证不通过",
|
|
|
- desc: "系统发现该考生身份识别多次不通过,请监考老师关注!",
|
|
|
- },
|
|
|
- {
|
|
|
- title: "疑似:有违规动作",
|
|
|
- desc:
|
|
|
- "系统发现该考生至少有多次以上持续1分钟以上的违规动作,且违规动作的持续时间已超出合理范围,请监考老师关注!",
|
|
|
- },
|
|
|
- {
|
|
|
- title: "疑似:启用虚拟摄像头",
|
|
|
- desc: "系统检测到考生可能使用了虚拟摄像头,请监考老师关注!",
|
|
|
- },
|
|
|
- ],
|
|
|
+ // recordId: "32145907927482368",
|
|
|
+ recordId: this.$route.params.recordId,
|
|
|
+ detailInfo: test,
|
|
|
+ curDetail: {},
|
|
|
curStudent: {
|
|
|
stdAvatar: "/img/avatars/2.jpg",
|
|
|
stdCardNo: "000000000000000008",
|
|
@@ -221,8 +354,8 @@ export default {
|
|
|
};
|
|
|
},
|
|
|
mounted() {
|
|
|
- this.initClinet();
|
|
|
- this.initData();
|
|
|
+ // this.initClinet();
|
|
|
+ // this.initData();
|
|
|
},
|
|
|
methods: {
|
|
|
initClinet() {
|
|
@@ -249,8 +382,43 @@ export default {
|
|
|
},
|
|
|
async getInvigilateDetail() {
|
|
|
const res = await invigilateDetail(this.recordId);
|
|
|
+ this.detailInfo = res;
|
|
|
console.log(res);
|
|
|
},
|
|
|
+ toBreach() {
|
|
|
+ this.curDetail = {
|
|
|
+ examStudentName: this.detailInfo.examStudentName,
|
|
|
+ identity: this.detailInfo.identity,
|
|
|
+ courseNameCode: this.detailInfo.courseNameCode,
|
|
|
+ description: "",
|
|
|
+ examRecordId: this.detailInfo.examRecordId,
|
|
|
+ status: 1,
|
|
|
+ type: "",
|
|
|
+ };
|
|
|
+ this.$refs.StudentBreachDialog.open();
|
|
|
+ },
|
|
|
+ async toFinish() {
|
|
|
+ const result = await this.$confirm(
|
|
|
+ "试卷若被强制回收,考试再无法重置继续完成考试,请您慎重选择!您确定要强制回收改考试试卷吗?",
|
|
|
+ "强制收卷确认提醒",
|
|
|
+ {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ iconClass: "el-icon-warning",
|
|
|
+ customClass: "el-message-box__error",
|
|
|
+ }
|
|
|
+ ).catch(() => {});
|
|
|
+
|
|
|
+ if (!result) return;
|
|
|
+
|
|
|
+ await invigilateFinish({
|
|
|
+ examRecordId: this.detailInfo.examRecordId,
|
|
|
+ type: true,
|
|
|
+ });
|
|
|
+ this.$message.success("强制收卷成功!");
|
|
|
+ this.goBack();
|
|
|
+ },
|
|
|
+ // video relative
|
|
|
initSubscribeVideo() {
|
|
|
if (this.firstViewVideo.id) this.firstViewVideoReady = true;
|
|
|
if (this.secondViewVideo.id) this.secondViewVideoReady = true;
|
|
@@ -569,9 +737,10 @@ export default {
|
|
|
}
|
|
|
.warning-detail-body {
|
|
|
margin-top: 30px;
|
|
|
+ border-radius: 6px;
|
|
|
+ background: #fff;
|
|
|
}
|
|
|
.warning-body-head {
|
|
|
- background: #fff;
|
|
|
border-bottom: 1px solid #f0f4f9;
|
|
|
padding: 20px;
|
|
|
&-action {
|
|
@@ -594,15 +763,107 @@ export default {
|
|
|
}
|
|
|
&-info {
|
|
|
float: right;
|
|
|
+ padding: 0;
|
|
|
> p {
|
|
|
height: 32px;
|
|
|
line-height: 32px;
|
|
|
margin-right: 20px;
|
|
|
}
|
|
|
+ .el-button {
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.warning-body-main {
|
|
|
min-height: 400px;
|
|
|
- background: #fff;
|
|
|
+ padding: 15px;
|
|
|
+}
|
|
|
+.warning-history {
|
|
|
+ display: flex;
|
|
|
+ min-height: 130px;
|
|
|
+ align-items: center;
|
|
|
+ &-info {
|
|
|
+ padding: 15px 30px 15px 0;
|
|
|
+ text-align: right;
|
|
|
+ width: 210px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ > h3 {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #202b4b;
|
|
|
+ line-height: 22px;
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ > h5 {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #626a82;
|
|
|
+ line-height: 18px;
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ > p {
|
|
|
+ font-size: 12px;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #626a82;
|
|
|
+ line-height: 17px;
|
|
|
+ margin: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &-type {
|
|
|
+ position: relative;
|
|
|
+ width: 36px;
|
|
|
+ height: 36px;
|
|
|
+ padding-top: 5px;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 50%;
|
|
|
+ border: 2px solid #1cd1a1;
|
|
|
+ background-color: #fff;
|
|
|
+ z-index: 9;
|
|
|
+ flex-shrink: 0;
|
|
|
+ &.type-exception {
|
|
|
+ border-color: #fe5863;
|
|
|
+ }
|
|
|
+ > i {
|
|
|
+ width: 18px;
|
|
|
+ height: 17px;
|
|
|
+ }
|
|
|
+ i.icon-current-step {
|
|
|
+ width: 12px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &-media {
|
|
|
+ padding: 10px 0 10px 20px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 8;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: "";
|
|
|
+ display: block;
|
|
|
+ position: absolute;
|
|
|
+ height: 100%;
|
|
|
+ border-left: 1px solid #f0f4f9;
|
|
|
+ left: -18px;
|
|
|
+ top: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .media-list {
|
|
|
+ padding: 0;
|
|
|
+ margin: 0;
|
|
|
+ list-style: none;
|
|
|
+
|
|
|
+ li {
|
|
|
+ display: inline-block;
|
|
|
+ vertical-align: top;
|
|
|
+ width: 160px;
|
|
|
+ height: 100px;
|
|
|
+ margin: 5px 10px;
|
|
|
+ border-radius: 6px;
|
|
|
+ background-color: #626a82;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|