|
@@ -155,9 +155,14 @@
|
|
v-for="item in viewingAngles"
|
|
v-for="item in viewingAngles"
|
|
:key="item.code"
|
|
:key="item.code"
|
|
:command="item"
|
|
:command="item"
|
|
- :class="{ 'color-primary': item.code === curViewingAngle.code }"
|
|
|
|
>
|
|
>
|
|
- {{ item.name }}
|
|
|
|
|
|
+ <span
|
|
|
|
+ :class="{
|
|
|
|
+ 'color-primary': item.code === curViewingAngle.code,
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ {{ item.name }}
|
|
|
|
+ </span>
|
|
</el-dropdown-item>
|
|
</el-dropdown-item>
|
|
</el-dropdown-menu>
|
|
</el-dropdown-menu>
|
|
</el-dropdown>
|
|
</el-dropdown>
|
|
@@ -206,14 +211,24 @@
|
|
></right-or-wrong>
|
|
></right-or-wrong>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- <el-table-column prop="monitorStatusSource" label="推流通讯">
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
+ v-for="source in viewingAngles"
|
|
|
|
+ :key="source.param"
|
|
|
|
+ :prop="source.param"
|
|
|
|
+ :label="`${source.name}通讯`"
|
|
|
|
+ >
|
|
<template slot-scope="scope">
|
|
<template slot-scope="scope">
|
|
<right-or-wrong
|
|
<right-or-wrong
|
|
- :status="MONITOR_STATUS_SOURCE[scope.row.monitorStatusSource]"
|
|
|
|
|
|
+ :status="MONITOR_STATUS_SOURCE[scope.row[source.param]]"
|
|
></right-or-wrong>
|
|
></right-or-wrong>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- <el-table-column prop="clientCurrentIp" label="IP"></el-table-column>
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
+ prop="clientCurrentIp"
|
|
|
|
+ label="IP"
|
|
|
|
+ v-if="curExamBatch.enableIpLimit"
|
|
|
|
+ >
|
|
|
|
+ </el-table-column>
|
|
<el-table-column prop="updateTime" label="更新时间">
|
|
<el-table-column prop="updateTime" label="更新时间">
|
|
<span slot-scope="scope">
|
|
<span slot-scope="scope">
|
|
{{ scope.row.updateTime | datetimeFilter }}
|
|
{{ scope.row.updateTime | datetimeFilter }}
|
|
@@ -295,6 +310,7 @@ import handleRollupDialog from "./handleRollupDialog";
|
|
import TextClock from "../common/TextClock";
|
|
import TextClock from "../common/TextClock";
|
|
import {
|
|
import {
|
|
BOOLEAN_TYPE,
|
|
BOOLEAN_TYPE,
|
|
|
|
+ VIDEO_SOURCE_TYPE,
|
|
BOOLEAN_INVERSE_TYPE,
|
|
BOOLEAN_INVERSE_TYPE,
|
|
STUDENT_ONLINE_STATUS,
|
|
STUDENT_ONLINE_STATUS,
|
|
CLIENT_WEBSOCKET_STATUS,
|
|
CLIENT_WEBSOCKET_STATUS,
|
|
@@ -320,12 +336,14 @@ export default {
|
|
paperDownload: null,
|
|
paperDownload: null,
|
|
status: null,
|
|
status: null,
|
|
monitorStatusSource: null,
|
|
monitorStatusSource: null,
|
|
|
|
+ monitorVideoSource: null,
|
|
name: null,
|
|
name: null,
|
|
identity: null,
|
|
identity: null,
|
|
maxWarningCount: undefined,
|
|
maxWarningCount: undefined,
|
|
minWarningCount: undefined,
|
|
minWarningCount: undefined,
|
|
},
|
|
},
|
|
BOOLEAN_TYPE,
|
|
BOOLEAN_TYPE,
|
|
|
|
+ VIDEO_SOURCE_TYPE,
|
|
BOOLEAN_INVERSE_TYPE,
|
|
BOOLEAN_INVERSE_TYPE,
|
|
STUDENT_ONLINE_STATUS,
|
|
STUDENT_ONLINE_STATUS,
|
|
CLIENT_WEBSOCKET_STATUS,
|
|
CLIENT_WEBSOCKET_STATUS,
|
|
@@ -347,24 +365,13 @@ export default {
|
|
subjects: [],
|
|
subjects: [],
|
|
pageType: "0",
|
|
pageType: "0",
|
|
dataList: [],
|
|
dataList: [],
|
|
- viewingAngles: [
|
|
|
|
- {
|
|
|
|
- code: "client_camera",
|
|
|
|
- name: "电脑摄像头",
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- code: "client_screen",
|
|
|
|
- name: "电脑屏幕",
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- code: "mobile_first",
|
|
|
|
- name: "手机主机位",
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- code: "mobile_second",
|
|
|
|
- name: "手机辅机位",
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
|
|
+ videoSourceStatusParams: {
|
|
|
|
+ CLIENT_CAMERA: "cameraMonitorStatusSource",
|
|
|
|
+ CLIENT_SCREEN: "screenMonitorStatusSource",
|
|
|
|
+ MOBILE_FIRST: "mobileFirstMonitorStatusSource",
|
|
|
|
+ MOBILE_SECOND: "mobileSecondMonitorStatusSource",
|
|
|
|
+ },
|
|
|
|
+ viewingAngles: [],
|
|
};
|
|
};
|
|
},
|
|
},
|
|
created() {
|
|
created() {
|
|
@@ -415,6 +422,21 @@ export default {
|
|
if (!examBatch) return;
|
|
if (!examBatch) return;
|
|
this.filter.examId = examBatch.id;
|
|
this.filter.examId = examBatch.id;
|
|
this.curExamBatch = examBatch;
|
|
this.curExamBatch = examBatch;
|
|
|
|
+ if (examBatch.monitorVideoSource) {
|
|
|
|
+ this.viewingAngles = examBatch.monitorVideoSource
|
|
|
|
+ .split(",")
|
|
|
|
+ .map((item) => {
|
|
|
|
+ return {
|
|
|
|
+ code: item,
|
|
|
|
+ name: this.VIDEO_SOURCE_TYPE[item],
|
|
|
|
+ param: this.videoSourceStatusParams[item],
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ this.viewingAngles = [];
|
|
|
|
+ }
|
|
|
|
+ this.curViewingAngle = this.viewingAngles[0] || {};
|
|
|
|
+ this.filter.monitorVideoSource = this.curViewingAngle.code || "";
|
|
|
|
|
|
this.toSearch();
|
|
this.toSearch();
|
|
|
|
|
|
@@ -441,8 +463,11 @@ export default {
|
|
this.multipleSelection = [];
|
|
this.multipleSelection = [];
|
|
},
|
|
},
|
|
viewingAngleChange(data) {
|
|
viewingAngleChange(data) {
|
|
|
|
+ if (data.code === this.curViewingAngle.code) return;
|
|
this.curViewingAngle = data;
|
|
this.curViewingAngle = data;
|
|
- // TODO:视角切换
|
|
|
|
|
|
+ this.filter.monitorVideoSource = data.code;
|
|
|
|
+ this.dataList = [];
|
|
|
|
+ this.getList();
|
|
},
|
|
},
|
|
async getList() {
|
|
async getList() {
|
|
const datas = {
|
|
const datas = {
|