zhangjie 2 ani în urmă
părinte
comite
86d2d73c3f

+ 11 - 0
src/api/system.js

@@ -49,3 +49,14 @@ export function enableSystemConfig({ id, enable }) {
     { params: { id, enable } }
   );
 }
+// invigilation-video-manage
+export function searchInvigilationVideo(datas) {
+  return httpApp.post("/api/admin/sys/video/select", {}, { params: datas });
+}
+export function deleteInvigilationVideo(examId) {
+  return httpApp.post(
+    "/api/admin/sys/video/delete",
+    {},
+    { params: { examId } }
+  );
+}

+ 9 - 0
src/features/examwork/StudentManagement/StudentTrackRecord.vue

@@ -62,6 +62,11 @@
                       <span v-if="log.breachLogStatus">已撤销</span>
                     </template>
                     <h3>{{ log.title }}</h3>
+                    <b
+                      v-if="log.ipChange"
+                      :class="{ 'color-danger': log.ipChange }"
+                      >[ip变动]</b
+                    >
                   </div>
                   <p v-if="log.desc">{{ log.desc }}</p>
                   <p>
@@ -72,6 +77,9 @@
                   <p v-if="log.durationTime">
                     持续时长约:{{ log.durationTime }}
                   </p>
+                  <p :class="{ 'color-danger': log.ipChange }">
+                    ip:{{ log.ip }},属地:{{ log.province }}{{ log.city }}
+                  </p>
                 </div>
                 <ul class="warning-track-media" v-if="log.photos">
                   <li v-for="(photo, pindex) in log.photos" :key="pindex">
@@ -278,6 +286,7 @@ export default {
           "POWER_CUT",
           "BREACH_HANDLE",
           "BREACH_REVOKE",
+          "OTHER",
         ],
       };
       const transformInfo = {

+ 9 - 0
src/features/invigilation/OnlinePatrol/PatrolWarningDetail.vue

@@ -153,6 +153,11 @@
                       <span v-if="log.breachLogStatus">已撤销</span>
                     </template>
                     <h3>{{ log.title }}</h3>
+                    <b
+                      v-if="log.ipChange"
+                      :class="{ 'color-danger': log.ipChange }"
+                      >[ip变动]</b
+                    >
                   </div>
                   <p v-if="log.desc">{{ log.desc }}</p>
                   <p>
@@ -163,6 +168,9 @@
                   <p v-if="log.durationTime">
                     持续时长约:{{ log.durationTime }}
                   </p>
+                  <p :class="{ 'color-danger': log.ipChange }">
+                    ip:{{ log.ip }},属地:{{ log.province }}{{ log.city }}
+                  </p>
                 </div>
                 <ul class="warning-track-media" v-if="log.photos">
                   <li v-for="(photo, pindex) in log.photos" :key="pindex">
@@ -322,6 +330,7 @@ export default {
           "POWER_CUT",
           "BREACH_HANDLE",
           "BREACH_REVOKE",
+          "OTHER",
         ],
       };
       const transformInfo = {

+ 9 - 0
src/features/invigilation/RealtimeMonitoring/WarningDetail.vue

@@ -238,6 +238,11 @@
                       <span v-else>已撤销</span>
                     </template>
                     <h3>{{ log.title }}</h3>
+                    <b
+                      v-if="log.ipChange"
+                      :class="{ 'color-danger': log.ipChange }"
+                      >[ip变动]</b
+                    >
                   </div>
                   <p v-if="log.desc">{{ log.desc }}</p>
                   <p>
@@ -248,6 +253,9 @@
                   <p v-if="log.durationTime">
                     持续时长约:{{ log.durationTime }}
                   </p>
+                  <p :class="{ 'color-danger': log.ipChange }">
+                    ip:{{ log.ip }},属地:{{ log.province }}{{ log.city }}
+                  </p>
                 </div>
                 <ul class="warning-track-media" v-if="log.photos">
                   <li v-for="(photo, pindex) in log.photos" :key="pindex">
@@ -554,6 +562,7 @@ export default {
           "POWER_CUT",
           "BREACH_HANDLE",
           "BREACH_REVOKE",
+          "OTHER",
         ],
       };
       const transformInfo = {

+ 9 - 0
src/features/system/BlackList/BlackList.vue

@@ -77,6 +77,15 @@ export default {
     this.searchForm();
   },
   methods: {
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    handleSizeChange(val) {
+      this.pageSize = val;
+      this.currentPage = 1;
+      this.searchForm();
+    },
     async searchForm() {
       const res = await searchBlackList({
         pageNumber: this.currentPage,

+ 160 - 0
src/features/system/VideoSaveManagement/VideoSaveManagement.vue

@@ -0,0 +1,160 @@
+<template>
+  <div class="user-management">
+    <div class="part-box-head">
+      <div class="part-box-head-left"><h1>用户管理</h1></div>
+    </div>
+    <div class="part-filter">
+      <div class="part-filter-form">
+        <el-form :model="form" inline>
+          <el-form-item label="机构代码">
+            <el-input v-model.trim="form.orgCode"></el-input>
+          </el-form-item>
+          <el-form-item label="机构名称">
+            <el-input v-model.trim="form.orgName"></el-input>
+          </el-form-item>
+          <el-form-item label="状态">
+            <el-select v-model="form.type">
+              <el-option
+                v-for="(val, key) in types"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="handleCurrentChange(0)"
+              >查询</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+
+    <el-table :data="tableData">
+      <el-table-column prop="orgId" label="机构ID"> </el-table-column>
+      <el-table-column prop="orgName" width="200" label="机构名称">
+      </el-table-column>
+      <el-table-column label="考试批次ID">
+        <span slot-scope="scope">{{ scope.row.examId }}</span>
+      </el-table-column>
+      <el-table-column label="考试批次名称">
+        <span slot-scope="scope">{{ scope.row.examName }}</span>
+      </el-table-column>
+      <el-table-column label="考试结束日期" width="170">
+        <span slot-scope="scope">{{
+          scope.row.examEndTime | datetimeFilter
+        }}</span>
+      </el-table-column>
+      <el-table-column width="120" label="存储时长">
+        <span slot-scope="scope">{{ scope.row.saveTime }}天</span>
+      </el-table-column>
+      <el-table-column width="100" label="状态">
+        <span slot-scope="scope">{{
+          scope.row.videoDelete ? "已删除" : "有效"
+        }}</span>
+      </el-table-column>
+      <el-table-column label="操作" width="160" fixed="right">
+        <div slot-scope="scope">
+          <span v-if="scope.row.videoDelete">{{
+            scope.row.videoDeleteTime | datetimeFilter
+          }}</span>
+          <el-button
+            v-if="!scope.row.videoDelete && scope.row.saveTime > 0"
+            size="mini"
+            type="danger"
+            plain
+            @click="toDelete(scope.row)"
+          >
+            删除
+          </el-button>
+        </div>
+      </el-table-column>
+    </el-table>
+
+    <div class="part-page">
+      <el-pagination
+        background
+        @current-change="handleCurrentChange"
+        :current-page="currentPage"
+        :page-size="pageSize"
+        :page-sizes="[10, 20, 50, 100, 200, 300]"
+        @size-change="handleSizeChange"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  searchInvigilationVideo,
+  deleteInvigilationVideo,
+} from "../../../api/system";
+
+export default {
+  name: "VideoSaveManagement",
+  data() {
+    return {
+      form: {
+        orgName: "",
+        orgCode: "",
+        type: "ALL",
+      },
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      types: {
+        ALL: "全部",
+        TRUE: "有效",
+        FALSE: "已删除",
+      },
+    };
+  },
+  created() {
+    this.searchForm();
+  },
+  methods: {
+    async searchForm() {
+      const res = await searchInvigilationVideo({
+        orgName: this.form.orgName,
+        orgCode: this.form.orgCode,
+        type: this.form.type,
+        pageNumber: this.currentPage,
+        pageSize: this.pageSize,
+      });
+      this.tableData = res.data.data.records;
+      this.total = res.data.data.total;
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    handleSizeChange(val) {
+      this.pageSize = val;
+      this.currentPage = 1;
+      this.searchForm();
+    },
+    async toDelete(row) {
+      const result = await this.$confirm(
+        `确定要删除当前考试的所有视频吗?`,
+        "操作提醒",
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          iconClass: "el-icon-warning",
+          customClass: "el-message-box__error",
+        }
+      ).catch(() => {});
+
+      if (result !== "confirm") return;
+
+      await deleteInvigilationVideo(row.examId);
+      this.$message.success("操作成功!");
+      this.searchForm();
+    },
+  },
+};
+</script>

+ 8 - 0
src/router/index.js

@@ -104,6 +104,14 @@ const routes = [
             /* webpackChunkName: "system" */ "../features/system/SystemConfig/SystemConfig.vue"
           ),
       },
+      {
+        path: "video-save-manage",
+        name: "VideoSaveManagement",
+        component: () =>
+          import(
+            /* webpackChunkName: "system" */ "../features/system/VideoSaveManagement/VideoSaveManagement.vue"
+          ),
+      },
     ],
   },
   {

+ 3 - 0
src/styles/base.scss

@@ -722,6 +722,9 @@ body {
       line-height: 16px;
       margin: 0;
     }
+    .color-danger {
+      color: #fe5863;
+    }
   }
 
   &-type {

+ 4 - 0
src/views/Layout/components/menu.js

@@ -50,6 +50,10 @@ const systemMenuConfig = [
         title: "系统参数",
         name: "SysConfigManagement",
       },
+      {
+        title: "视频存储管理",
+        name: "VideoSaveManagement",
+      },
     ],
   },
 ];