Explorar o código

feat: 图片管理

zhangjie hai 10 meses
pai
achega
a1a3a2db50

+ 7 - 0
src/constants/enumerate.js

@@ -51,6 +51,13 @@ export const DATA_TASK_RESULT = {
   ERROR: "失败",
 };
 
+export const EQUAL_TYPE = {
+  GREAT_THEN: "大于",
+  EQUAL: "等于",
+  LESS_THEN: "小于",
+  NOT_EQUAL: "不等于",
+};
+
 // 注意:下方数组内容必须与组件名称格式保持一致
 // [routeNameShouldKeepAlive, [whenReturedFromThisRoute]]
 export const keepAliveRoutesPairs = [["archives-manage", ["archives-detail"]]];

+ 5 - 0
src/modules/record/api.js

@@ -116,3 +116,8 @@ export const updateDocumentImageRotate = (datas) => {
 export const deleteDocumentImage = (datas) => {
   return $postParam("/api/admin/paper/document/other_detail", datas);
 };
+
+// picture manage
+export const pictureListPage = (datas) => {
+  return $postParam("/api/admin/paper/picture/page", datas);
+};

+ 9 - 3
src/modules/record/components/ArchivesDetailStudentDialog.vue

@@ -48,7 +48,9 @@
             </p>
           </div>
           <el-divider></el-divider>
-          <el-button type="primary" size="small" @click="toFix">纠错</el-button>
+          <el-button v-if="showFix" type="primary" size="small" @click="toFix"
+            >纠错</el-button
+          >
           <el-button
             type="primary"
             size="small"
@@ -59,7 +61,7 @@
           <el-button type="danger" size="small" @click="toDelete"
             >删除</el-button
           >
-          <p class="tips-info tips-error">
+          <p v-if="showFix" class="tips-info tips-error">
             注意:<br />
             当图片里学生信息与右侧学生信息不一致时请执行纠错操作!
           </p>
@@ -69,7 +71,7 @@
 
     <!-- LibraryDialog -->
     <library-dialog
-      v-if="modalIsShow"
+      v-if="modalIsShow && showFix"
       ref="LibraryDialog"
       mode="fix"
       :student="studentInfo"
@@ -98,6 +100,10 @@ export default {
         return {};
       },
     },
+    showFix: {
+      type: Boolean,
+      default: true,
+    },
   },
   data() {
     return {

+ 6 - 0
src/modules/record/router.js

@@ -3,6 +3,7 @@ import ArchivesManage from "./views/ArchivesManage";
 import ArchivesDetail from "./views/ArchivesDetail";
 import LibraryManage from "./views/LibraryManage";
 import DocumentManage from "./views/DocumentManage";
+import PictureManage from "./views/PictureManage.vue";
 
 export default [
   {
@@ -33,4 +34,9 @@ export default [
     name: "DocumentManage",
     component: DocumentManage,
   },
+  {
+    path: "/record/picture-manage",
+    name: "PictureManage",
+    component: PictureManage,
+  },
 ];

+ 311 - 0
src/modules/record/views/PictureManage.vue

@@ -0,0 +1,311 @@
+<template>
+  <div>
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="90px" inline>
+        <el-form-item label="姓名/学号:">
+          <el-input
+            v-model.trim="filter.param"
+            placeholder="姓名/学号"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="起止成绩:">
+          <el-input-number
+            style="width: 80px"
+            v-model="filter.minScore"
+            :min="0"
+            :max="999"
+            :step="1"
+            step-strictly
+            :controls="false"
+            placeholder="成绩"
+          ></el-input-number>
+          <span class="el-input-split"></span>
+          <el-input-number
+            style="width: 80px"
+            v-model="filter.maxScore"
+            :min="0"
+            :max="999"
+            :step="1"
+            step-strictly
+            :controls="false"
+            placeholder="成绩"
+          ></el-input-number>
+        </el-form-item>
+        <el-form-item label="学期:">
+          <semester-select
+            v-model.trim="filter.semesterId"
+            placeholder="学期"
+          ></semester-select>
+        </el-form-item>
+        <el-form-item label="考试:">
+          <exam-select
+            v-model="filter.examId"
+            :semester-id="filter.semesterId"
+          ></exam-select>
+        </el-form-item>
+        <el-form-item label="课程(代码):">
+          <course-select
+            v-model.trim="filter.courseCode"
+            :filter-data="{
+              semesterId: filter.semesterId,
+              examId: filter.examId,
+            }"
+            placeholder="课程(代码)"
+            clearable
+          ></course-select>
+        </el-form-item>
+        <el-form-item label="任课老师:">
+          <el-input
+            v-model.trim="filter.teacher"
+            placeholder="任课老师"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="collegeName" label="学院:">
+          <el-input
+            v-model.trim="filter.collegeName"
+            placeholder="学院"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="majorName" label="专业:">
+          <el-input
+            v-model.trim="filter.majorName"
+            placeholder="专业"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="clazzName" label="班级:">
+          <el-input
+            v-model.trim="filter.clazzName"
+            placeholder="班级"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="教学班:">
+          <el-input
+            v-model.trim="filter.teachClass"
+            placeholder="教学班"
+            clearable
+          ></el-input>
+        </el-form-item>
+
+        <el-form-item label="图片张数:">
+          <el-select
+            v-model="filter.pictureSymbol"
+            :clearable="false"
+            style="width: 100px"
+          >
+            <el-option
+              v-for="(val, key) in EQUAL_TYPE"
+              :key="key"
+              :value="key"
+              :label="val"
+            ></el-option>
+          </el-select>
+          <el-input-number
+            style="width: 100px; margin-left: 5px"
+            v-model="filter.pictureCount"
+            :min="0"
+            :max="9999"
+            :step="1"
+            step-strictly
+            :controls="false"
+            placeholder="图片张数"
+          ></el-input-number>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          type="success"
+          icon="el-icon-upload"
+          :loading="loading"
+          :disabled="!multipleSelection.length"
+          @click="toDownload"
+          >下载图片</el-button
+        >
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad mb-0">
+      <el-table
+        ref="TableList"
+        :data="dataList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          type="selection"
+          width="55"
+          align="center"
+        ></el-table-column>
+        <el-table-column
+          prop="studentName"
+          label="姓名"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="studentCode"
+          label="学号"
+          width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="batchNo"
+          label="扫描批次号"
+          width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="courseCodeName"
+          label="课程名称(代码)"
+          min-width="260"
+        >
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="teacher"
+          label="任课老师"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="teachClass"
+          label="教学班"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="collegeName"
+          label="学院"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="majorName"
+          label="专业"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="className"
+          label="班级"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="examRoom"
+          label="考场"
+          :min-width="120"
+        ></el-table-column>
+        <el-table-column prop="score" label="成绩" width="80"></el-table-column>
+        <el-table-column
+          prop="remark"
+          label="备注"
+          width="120"
+        ></el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="图片"
+          width="80"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              @click="toDetail(scope.row)"
+            >
+              <span class="cont-link">{{ scope.row.bindCount }}</span>
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- ArchivesDetailStudentDialog -->
+    <archives-detail-student-dialog
+      ref="ArchivesDetailStudentDialog"
+      :student="curRow"
+      :show-fix="false"
+    ></archives-detail-student-dialog>
+  </div>
+</template>
+
+<script>
+import { pictureListPage } from "../api";
+import { EQUAL_TYPE } from "@/constants/enumerate";
+import ArchivesDetailStudentDialog from "../components/ArchivesDetailStudentDialog.vue";
+
+export default {
+  name: "picture-manage",
+  components: { ArchivesDetailStudentDialog },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        courseCode: "",
+        collegeName: "",
+        majorName: "",
+        clazzName: "",
+        teacher: "",
+        teachClass: "",
+        param: "",
+        minScore: undefined,
+        maxScore: undefined,
+        pictureSymbol: "EQUAL",
+        pictureCount: undefined,
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      EQUAL_TYPE,
+      multipleSelection: [],
+      loading: false,
+    };
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+      const data = await pictureListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val.map((item) => item.studentId);
+    },
+    toDownload() {},
+    toDetail(row) {
+      if (!row.bindCount) return;
+
+      this.curRow = {
+        ...row,
+        paperScanTaskId: this.task.paperScanTaskId,
+        semesterId: this.task.semesterId,
+      };
+      this.$refs.ArchivesDetailStudentDialog.open();
+    },
+  },
+};
+</script>