From a3f19959cbc1ad380ba84e6d8699d3e00afa07a7 Mon Sep 17 00:00:00 2001
From: 龚焕茏 <2842157468@qq.com>
Date: 星期三, 26 六月 2024 18:05:29 +0800
Subject: [PATCH] feat:考试监控

---
 src/views/exam/exam/monitor.vue    |  183 +++++++++++++++++++++++++++++++++++++++++++++
 src/views/education/cheat/list.vue |    9 -
 src/api/cheat.js                   |    2 
 src/api/exam.js                    |    9 ++
 src/router.js                      |    7 +
 src/views/exam/exam/ExamManage.vue |    7 +
 6 files changed, 208 insertions(+), 9 deletions(-)

diff --git a/src/api/cheat.js b/src/api/cheat.js
index 2b0a33e..d7e2656 100644
--- a/src/api/cheat.js
+++ b/src/api/cheat.js
@@ -3,7 +3,7 @@
 export default {
   list: query => post('/api/admin/cheat/list'),
   pageList: query => get('/api/admin/cheat/page', query),
-  edit: query => post('/api/admin/cheat/edit', query),
+  edit: query => post('/api/admin/cheat', query),
   select: id => post('/api/admin/cheat/select/' + id),
   deletecheat: id => post('/api/admin/cheat/delete/' + id),
   updateStatus: query => post('/api/admin/cheat/status', query),
diff --git a/src/api/exam.js b/src/api/exam.js
index c1887ca..6a10b09 100644
--- a/src/api/exam.js
+++ b/src/api/exam.js
@@ -75,3 +75,12 @@
     method: 'GET'
   })
 }
+
+// 鑰冭瘯鐩戞帶鍒楄〃
+export const monitorList = (params) => {
+  return axios({
+    url: '/api/admin/exam/monitor/list',
+    method: 'GET',
+    params: params
+  })
+}
diff --git a/src/router.js b/src/router.js
index 1d7acf6..9f0ea40 100644
--- a/src/router.js
+++ b/src/router.js
@@ -59,6 +59,13 @@
         name: 'MarkPaperDetail',
         meta: { title: '闃呭嵎'},
         hidden: true
+      },
+      {
+        path: '/exam/monitor',
+        component: () => import('@/views/exam/exam/monitor'),
+        name: 'monitor',
+        meta: { title: '鐩戞帶'},
+        hidden: true
       }
     ]
   },
diff --git a/src/views/education/cheat/list.vue b/src/views/education/cheat/list.vue
index e4c7bbb..147ae49 100644
--- a/src/views/education/cheat/list.vue
+++ b/src/views/education/cheat/list.vue
@@ -10,8 +10,8 @@
     </el-form>
 
     <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
-      <el-table-column align="center" prop="cheatUserName" label="浣滃紛浜哄悕绉�" show-overflow-tooltip />
-      <el-table-column align="center" prop="examName" label="鑰冭瘯鍚嶇О" />
+      <el-table-column align="center" prop="cheatUserName" label="濮撳悕" show-overflow-tooltip />
+      <el-table-column align="center" prop="examName" label="鑰冭瘯" />
       <el-table-column align="center" prop="createTime" label="浣滃紛鏃堕棿" />
       <!-- <el-table-column label="鎿嶄綔" align="center">
         <template slot-scope="{row}">
@@ -97,7 +97,6 @@
       })
     },
     edit(row) {
-      if (row) {
         cheatApi.select(row.id).then(re => {
           if (re.code === 1) {
             this.form = re.data;
@@ -106,10 +105,6 @@
             this.$message.error(re.message)
           }
         })
-      } else {
-        this.getItemOrder();
-        this.visible = true;
-      }
     },
     status(row) {
       let question = {
diff --git a/src/views/exam/exam/ExamManage.vue b/src/views/exam/exam/ExamManage.vue
index 5d391ab..11054e4 100644
--- a/src/views/exam/exam/ExamManage.vue
+++ b/src/views/exam/exam/ExamManage.vue
@@ -64,7 +64,7 @@
         width="150px"
         prop="createTime"
       ></el-table-column>
-      <el-table-column label="鎿嶄綔" fiexd="right" width="210px">
+      <el-table-column label="鎿嶄綔" fiexd="right" width="280px">
         <template slot-scope="scope">
           <el-button
             type="primary"
@@ -74,6 +74,7 @@
           </el-button>
           <el-button type="danger" size="small" @click="deleteExam(scope.row.id)">鍒犻櫎</el-button>
           <el-button type="success" size="small" @click="markPaper(scope.row)">闃呭嵎</el-button>
+          <el-button type="warning" size="small" @click="monitor(scope.row)">鐩戞帶</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -195,6 +196,10 @@
     this.MyExamPaperList()
   },
   methods: {
+    // 鑰冭瘯鐩戞帶鍒楄〃
+    monitor (row) {
+      this.$router.push({ path: '/exam/monitor', query: { examId: row.id } })
+    },
     markPaper (row) {
       // 璺宠浆闃呭嵎椤甸潰
       this.$router.push({ path: '/exam/mark/paper', query: { examName: row.examName, examId: row.id } })
diff --git a/src/views/exam/exam/monitor.vue b/src/views/exam/exam/monitor.vue
new file mode 100644
index 0000000..bbcee56
--- /dev/null
+++ b/src/views/exam/exam/monitor.vue
@@ -0,0 +1,183 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParam" ref="queryForm" :inline="true">
+      <el-form-item>
+        <el-input v-model="queryParam.keyword" placeholder="璇疯緭鍏ュ悕绉�" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="search">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
+      <el-table-column align="center" prop="examName" label="鑰冭瘯" />
+      <el-table-column align="center" prop="userName" label="濮撳悕" show-overflow-tooltip />
+      <el-table-column align="center" prop="createTime" label="寮�濮嬫椂闂�" />
+      <el-table-column align="center" prop="doTime" label="鑰楁椂锛堢锛�" />
+      <el-table-column align="center" prop="status" label="鐘舵��" :formatter="statusFormatter" />
+      <el-table-column label="鎿嶄綔" align="center">
+        <template slot-scope="{row}">
+          <el-button size="mini" type="danger" @click="handleNullify(row)">浣滃簾</el-button>
+          <el-button size="mini" type="primary" @click="edit(row)">鏀跺嵎</el-button>
+          <el-button size="mini" type="success" @click="edit(row)">鍔犳椂</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
+      @pagination="search" />
+
+    <el-dialog :visible.sync="visible" width="400px">
+      <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
+        <el-form-item label="鍚嶇О锛�" prop="name" required>
+          <el-input v-model="form.name" maxlength="10" show-word-limit />
+        </el-form-item>
+        <el-form-item label="鎺掑簭锛�" prop="itemOrder" required>
+          <el-input-number v-model="form.itemOrder" type="number" :min="1" :max="100" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+          <el-button @click="resetForm">閲嶇疆</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script>
+import { mapGetters, mapState } from 'vuex'
+import Pagination from '@/components/Pagination'
+import { monitorList } from '@/api/exam'
+import cheatApi from '@/api/cheat'
+
+export default {
+  components: { Pagination },
+  data() {
+    return {
+      listLoading: true,
+      queryParam: {
+        examId: '',
+        pageIndex: 1,
+        pageSize: 10
+      },
+      formLoading: false,
+      total: 0,
+      tableData: [],
+      form: {
+        id: '',
+        name: '',
+        itemOrder: ''
+      },
+      visible: false,
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }
+        ],
+        itemOrder: [
+          { required: true, message: '璇疯緭鍏ユ帓搴�', trigger: 'blur', type: 'number' }
+        ]
+      },
+    };
+  },
+  created() {
+    this.queryParam.examId = this.$route.query.examId;
+    this.search()
+  },
+  methods: {
+    handleNullify(row) {
+      let cheatObj = { examId: row.examId, cheatUser: row.userId };
+      cheatApi.edit(cheatObj).then(res => {
+        this.$message.success(res.message);
+      })
+    },
+    statusFormatter(row) {
+      if (row.status === 'temp') {
+        return '杩涜涓�'
+      } else if (row.status === 'finish') {
+        return '宸茬粨鏉�'
+      }
+    },
+    // 鑾峰彇鍒楄〃
+    search() {
+      this.listLoading = true
+      monitorList(this.queryParam).then(re => {
+        re = re.data
+        this.tableData = re.data.records
+        this.total = re.data.total
+        this.queryParam.pageSize = re.data.size
+        this.queryParam.pageIndex = re.data.pages
+        this.listLoading = false
+      })
+    },
+    edit(row) {
+      cheatApi.select(row.id).then(re => {
+        if (re.code === 1) {
+          this.form = re.data;
+          this.visible = true;
+        } else {
+          this.$message.error(re.message)
+        }
+      })
+    },
+    status(row) {
+      let question = {
+        id: row.id,
+        status: row.status === '绂佺敤' ? '鍚敤' : '绂佺敤'
+      }
+      cheatApi.updateStatus(question).then(re => {
+        if (re.code === 1) {
+          this.$message.success(re.message)
+          this.search()
+        } else {
+          this.$message.error(re.message)
+        }
+      })
+    },
+    deletecheat(row) {
+      let _this = this
+      cheatApi.deletecheat(row.id).then(re => {
+        if (re.code === 1) {
+          _this.search()
+          _this.$message.success(re.message)
+        } else {
+          _this.$message.error(re.message)
+        }
+      })
+    },
+    submitForm() {
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          cheatApi.edit(this.form).then(re => {
+            if (re.code === 1) {
+              _this.$message.success(re.message)
+              _this.search()
+              _this.formLoading = false
+              _this.visible = false
+            } else {
+              _this.$message.error(re.message)
+              _this.formLoading = false
+              _this.visible = false
+            }
+          })
+        }
+      })
+    },
+    resetForm() {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form.id = lastId
+    },
+  },
+  computed: {
+    ...mapGetters('enumItem', [
+      'enumFormat'
+    ]),
+    ...mapState('enumItem', {
+      levelEnum: state => state.user.levelEnum
+    })
+  }
+}
+</script>

--
Gitblit v1.8.0