zhangjie 2 سال پیش
والد
کامیت
56704fdb9f

+ 8 - 1
src/assets/styles/common-comp.scss

@@ -8,6 +8,11 @@
 
 // image-preview
 .image-preview-dialog {
+  .el-dialog {
+    .el-dialog__body {
+      padding: 0;
+    }
+  }
   .image-preview-close {
     position: absolute;
     width: 30px;
@@ -98,6 +103,8 @@
       text-align: center;
       cursor: pointer;
       transition: transform 0.2s linear;
+      // text-shadow: 0 0 1px #000;
+      color: #777;
     }
     li:hover {
       // color: #000;
@@ -148,7 +155,7 @@
     width: 160px;
     height: 160px;
     margin: 0 10px 10px 0;
-    border: 1px solid $--color-text-gray-4;
+    border: 1px solid $--color-background;
     position: relative;
     overflow: hidden;
     font-size: 14px;

+ 8 - 5
src/assets/styles/pages.scss

@@ -148,8 +148,8 @@
   }
 }
 
-// data-check-dialog
-.data-check-dialog {
+// library-dialog
+.library-dialog {
   .el-dialog__body {
     height: 100%;
   }
@@ -199,6 +199,8 @@
       flex-grow: 2;
       margin: 0 0 0 20px;
       position: relative;
+      background-color: $--color-text-gray-5;
+      // background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC");
 
       &-page {
         position: absolute;
@@ -209,12 +211,12 @@
     }
   }
 }
-// record-detail-student-dialog
-.record-detail-student-dialog {
+// archives-detail-student-dialog
+.archives-detail-student-dialog {
   .el-dialog__body {
     height: 100%;
   }
-  .record-student {
+  .archives-student {
     &-body {
       height: 100%;
       display: flex;
@@ -240,6 +242,7 @@
     &-content {
       flex-grow: 2;
       margin: 0 20px 0 0;
+      background-color: $--color-text-gray-5;
 
       .el-carousel {
         height: 100%;

+ 1 - 1
src/components/ImageListPreviewDialog.vue

@@ -71,7 +71,7 @@ export default {
     toPreview(index) {
       this.curImageIndex = index;
       this.selectImage(index);
-      this.$refs.SimpleImagePreview.open();
+      this.$refs.ImagePreviewDialog.open();
     },
     selectImage(index) {
       this.curImage = { url: this.imageList[index] };

+ 4 - 0
src/constants/enumerate.js

@@ -32,3 +32,7 @@ export const PRIVILEGE_TYPE = {
 export const ORG_TYPE = {
   PRINTING_HOUSE: "印刷室"
 };
+
+// 注意:下方数组内容必须与组件名称格式保持一致
+// [routeNameShouldKeepAlive, [whenReturedFromThisRoute]]
+export const keepAliveRoutesPairs = [["archives-manage", ["archives-detail"]]];

+ 0 - 2
src/constants/menus-data.js

@@ -1293,5 +1293,3 @@ export default [
     ]
   }
 ];
-
-export const HIDE_MENU_NAME = ["RecordDetail"];

+ 23 - 0
src/constants/submenus.js

@@ -0,0 +1,23 @@
+import { randomCode } from "../plugins/utils";
+
+export default [
+  {
+    getSubMenu(privileges) {
+      const relateMenu = privileges.find(item => item.url === "ArchivesManage");
+      if (!relateMenu || !relateMenu.links) return;
+
+      const validPrivilege = relateMenu.links.find(
+        item => item.url.toLowerCase() === "detail"
+      );
+      if (!validPrivilege) return;
+
+      return {
+        id: randomCode(),
+        parentId: relateMenu.parentId,
+        name: "档案详情",
+        type: "MENU",
+        url: "ArchivesDetail"
+      };
+    }
+  }
+];

+ 1 - 1
src/main.js

@@ -4,7 +4,7 @@ import router from "./router";
 import store from "./store";
 import globalVuePlugins from "./plugins/globalVuePlugins";
 import GLOBAL from "./config";
-// import "./plugins/keepAlive";
+import "./plugins/keepAlive";
 import "./plugins/filters";
 
 // https://github.com/RobinCK/vue-ls

+ 1 - 1
src/modules/record/api.js

@@ -48,7 +48,7 @@ export const updateArchives = datas => {
 export const deleteArchives = id => {
   return $postParam("/api/admin/paper/archives/delete", { id });
 };
-// data-check-manage
+// library-manage
 export const dataCheckUndoListPage = datas => {
   return $postParam("/api/admin/paper/library/page_unbind", datas);
 };

+ 15 - 8
src/modules/record/components/ArchivesDetailStudentDialog.vue

@@ -13,9 +13,8 @@
       <div class="archives-student-body">
         <div class="archives-student-content part-box">
           <el-carousel height="100%" :autoplay="false" arrow="always">
-            <el-carousel-item v-for="item in 4" :key="item">
-              <h3 class="small">{{ item }}</h3>
-              <!-- <el-image :src="" fit="contain"></el-image> -->
+            <el-carousel-item v-for="item in imageList" :key="item">
+              <el-image :src="item" fit="contain"></el-image>
             </el-carousel-item>
           </el-carousel>
         </div>
@@ -25,10 +24,10 @@
               <span>姓名:</span><span>{{ student.studentName }}</span>
             </p>
             <p>
-              <span>学号:</span><span>{{ student.studentNo }}</span>
+              <span>学号:</span><span>{{ student.studentCode }}</span>
             </p>
             <p>
-              <span>学院:</span><span>{{ student.collegeName }}</span>
+              <span>学院:</span><span>{{ student.belongOrgName }}</span>
             </p>
             <p>
               <span>专业:</span><span>{{ student.majorName }}</span>
@@ -43,7 +42,7 @@
               <span>任课老师:</span><span>{{ student.teacherName }}</span>
             </p>
             <p>
-              <span>教学班:</span><span>{{ student.teachingClazzName }}</span>
+              <span>教学班:</span><span>{{ student.teachClazzName }}</span>
             </p>
           </div>
           <el-divider></el-divider>
@@ -68,6 +67,7 @@
 
 <script>
 import LibraryDialog from "./LibraryDialog.vue";
+import { studentPictureList } from "../api";
 
 export default {
   name: "archives-detail-student-dialog",
@@ -82,17 +82,24 @@ export default {
   },
   data() {
     return {
-      modalIsShow: false
+      modalIsShow: false,
+      imageList: []
     };
   },
   methods: {
-    visibleChange() {},
+    visibleChange() {
+      this.getImageList();
+    },
     cancel() {
       this.modalIsShow = false;
     },
     open() {
       this.modalIsShow = true;
     },
+    async getImageList() {
+      const data = await studentPictureList(this.student.paperScanTaskDetailId);
+      this.imageList = data || [];
+    },
     toFix() {
       this.$refs.LibraryDialog.open();
     }

+ 11 - 2
src/modules/record/components/LibraryDialog.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-dialog
-      class="data-check-dialog page-dialog"
+      class="library-dialog page-dialog"
       :visible.sync="modalIsShow"
       title="数据处理"
       :close-on-click-modal="false"
@@ -9,6 +9,7 @@
       append-to-body
       fullscreen
       @open="visibleChange"
+      @closed="closed"
     >
       <div class="data-check-body">
         <div class="data-check-action part-box">
@@ -107,7 +108,7 @@ const initModalForm = {
 };
 
 export default {
-  name: "data-check-dialog",
+  name: "library-dialog",
   props: {
     model: {
       type: String,
@@ -183,6 +184,9 @@ export default {
 
       this.getNextPaper();
     },
+    closed() {
+      this.$emit("closed");
+    },
     cancel() {
       this.modalIsShow = false;
     },
@@ -228,7 +232,11 @@ export default {
       if (this.undoPageList.length <= 3 && this.IS_UNDO_MODEL)
         this.getUndoPageList();
 
+      // 已处理的最多记录10条
       if (this.curPage) this.donePageList.push({ ...this.curPage });
+      if (this.donePageList.length > 10)
+        this.donePageList = this.donePageList.slice(-10);
+
       this.getNextPaper();
     },
     getNextPaper() {
@@ -240,6 +248,7 @@ export default {
       this.switchCurPage(0);
     },
     toBind(row) {
+      this.lastPaperScanTaskId = this.curPage.paperScanTaskId;
       this.modalForm.paperScanTaskDetailId = row.paperScanTaskDetailId;
       this.confirm();
     },

+ 2 - 2
src/modules/record/components/LibraryStateDialog.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    class="data-check-state-dialog"
+    class="library-state-dialog"
     :visible.sync="modalIsShow"
     title="绑定详情"
     top="10vh"
@@ -36,7 +36,7 @@
 import { dataCheckStateDetail, releaseUserLibraryTask } from "../api";
 
 export default {
-  name: "data-check-state-dialog",
+  name: "library-state-dialog",
   props: {
     task: {
       type: Object,

+ 65 - 127
src/modules/record/views/ArchivesDetail.vue

@@ -2,113 +2,72 @@
   <div class="archives-detail">
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="学院:">
-            <el-select
-              v-model="filter.belongOrgId"
-              placeholder="学院"
-              filterable
-            >
-              <el-option
-                v-for="item in collegeList"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="专业:">
-            <el-select v-model="filter.majorName" placeholder="专业" filterable>
-              <el-option
-                v-for="item in majorList"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="班级:">
-            <el-select v-model="filter.clazzName" placeholder="班级" filterable>
-              <el-option
-                v-for="item in clazzList"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="课程:">
-            <el-select
-              v-model="filter.courseName"
-              placeholder="课程"
-              filterable
-            >
-              <el-option
-                v-for="item in courseList"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="任课老师:">
-            <el-input
-              v-model.trim="filter.teacherName"
-              placeholder="任课老师"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="教学班:">
-            <el-select
-              v-model="filter.teachClazzName"
-              placeholder="教学班"
-              filterable
+        <el-form-item label="学院:">
+          <college-select
+            v-model="filter.belongOrgId"
+            placeholder="学院"
+          ></college-select>
+        </el-form-item>
+        <el-form-item label="专业:">
+          <major-select
+            v-model="filter.majorName"
+            :college-id="filter.belongOrgId"
+            cascader
+            placeholder="专业"
+          ></major-select>
+        </el-form-item>
+        <el-form-item label="班级:">
+          <class-select
+            v-model="filter.clazzName"
+            :major-name="filter.majorName"
+            cascader
+            placeholder="班级"
+          ></class-select>
+        </el-form-item>
+        <el-form-item label="课程:">
+          <course-select v-model="filter.courseName" placeholder="课程">
+          </course-select>
+        </el-form-item>
+        <el-form-item label="任课老师:">
+          <el-input
+            v-model.trim="filter.teacherName"
+            placeholder="任课老师"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="教学班:">
+          <teach-clazz-select
+            v-model="filter.teachClazzName"
+            placeholder="教学班"
+          >
+          </teach-clazz-select>
+        </el-form-item>
+        <el-form-item label="绑定状态:">
+          <el-select v-model="filter.isBind" placeholder="绑定状态" clearable>
+            <el-option
+              v-for="(val, key) in BOUND_TYPE"
+              :key="key"
+              :value="key * 1"
+              :label="val"
             >
-              <el-option
-                v-for="item in teachingClazzList"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="绑定状态:">
-            <el-select v-model="filter.isBind" placeholder="绑定状态" clearable>
-              <el-option
-                v-for="(val, key) in BOUND_TYPE"
-                :key="key"
-                :value="key * 1"
-                :label="val"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="模糊查询:">
-            <el-input
-              v-model.trim="filter.param"
-              placeholder="姓名/学号"
-              clearable
-            ></el-input>
-          </el-form-item>
-        </template>
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="模糊查询:">
+          <el-input
+            v-model.trim="filter.param"
+            placeholder="姓名/学号"
+            clearable
+          ></el-input>
+        </el-form-item>
 
         <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+          <el-button @click="goback">返回</el-button>
         </el-form-item>
       </el-form>
       <div class="part-box-action">
         <el-button
-          v-if="checkPrivilege('button', 'add')"
           type="primary"
           icon="el-icon-circle-plus-outline"
           @click="toBatchDownload"
@@ -128,23 +87,15 @@
           width="55"
           align="center"
         ></el-table-column>
-        <el-table-column prop="studentNmae" label="姓名"></el-table-column>
+        <el-table-column prop="studentName" label="姓名"></el-table-column>
         <el-table-column prop="studentCode" label="学号"></el-table-column>
-        <el-table-column
-          prop="majorName"
-          label="专业"
-          width="120"
-        ></el-table-column>
+        <el-table-column prop="majorName" label="专业"></el-table-column>
         <el-table-column
           prop="clazzName"
           label="班级"
           width="180"
         ></el-table-column>
-        <el-table-column
-          prop="courseName"
-          label="课程"
-          width="120"
-        ></el-table-column>
+        <el-table-column prop="courseName" label="课程"></el-table-column>
         <el-table-column
           prop="teacherName"
           label="任课老师"
@@ -168,7 +119,6 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('link', 'edit')"
               class="btn-primary"
               type="text"
               @click="toDetail(scope.row)"
@@ -224,19 +174,8 @@ export default {
       size: this.GLOBAL.pageSize,
       total: 0,
       multipleSelection: [],
-      dataList: [
-        {
-          id: "1",
-          name: "12312",
-          bindCount: 5
-        }
-      ],
-      curRow: {},
-      collegeList: [],
-      majorList: [],
-      clazzList: [],
-      courseList: [],
-      teachingClazzList: []
+      dataList: [],
+      curRow: {}
     };
   },
   created() {
@@ -245,11 +184,10 @@ export default {
       this.$message.error("缺少档案信息,请退出当前页面!");
       return;
     }
+    this.toPage(1);
   },
   methods: {
     async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
       const datas = {
         ...this.filter,
         pageNumber: this.current,

+ 7 - 3
src/modules/record/views/LibraryManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="data-check-manage">
+  <div class="library-manage">
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
@@ -143,7 +143,11 @@
       :image-list="curImageList"
     ></image-list-preview-dialog>
     <!-- LibraryDialog -->
-    <library-dialog ref="LibraryDialog" :filter-data="filter"></library-dialog>
+    <library-dialog
+      ref="LibraryDialog"
+      :filter-data="filter"
+      @closed="search"
+    ></library-dialog>
   </div>
 </template>
 
@@ -157,7 +161,7 @@ import ImageListPreviewDialog from "../../../components/ImageListPreviewDialog.v
 import LibraryDialog from "../components/LibraryDialog.vue";
 
 export default {
-  name: "data-check-manage",
+  name: "library-manage",
   components: { ImageListPreviewDialog, LibraryDialog },
   filters: {
     fileNameFilter(val) {

+ 9 - 1
src/store.js

@@ -8,12 +8,14 @@ const privilegeMapData = window.sessionStorage.getItem("privilegeMap");
 const privilegeMap = privilegeMapData ? JSON.parse(privilegeMapData).value : {};
 
 // modules
+import { keepAliveRoutesPairs } from "@/constants/enumerate";
 
 export default new Vuex.Store({
   state: {
     user: {},
     privilegeMap,
-    shortupMenus: []
+    shortupMenus: [],
+    keepAliveRoutes: keepAliveRoutesPairs.map(v => v[0])
   },
   mutations: {
     setUser(state, user) {
@@ -21,6 +23,12 @@ export default new Vuex.Store({
     },
     setPrivilegeMap(state, privilegeMap) {
       state.privilegeMap = privilegeMap;
+    },
+    setEmptyKeepAliveRoutes(state) {
+      state.keepAliveRoutes = [];
+    },
+    setRestoreKeepAliveRoutes(state) {
+      state.keepAliveRoutes = keepAliveRoutesPairs.map(v => v[0]);
     }
   },
   actions: {},

+ 25 - 5
src/views/Home.vue

@@ -99,7 +99,10 @@
 
         <!-- home-view: page detail -->
         <div class="home-view">
-          <router-view />
+          <!-- <router-view /> -->
+          <keep-alive :include="keepAliveRoutes">
+            <router-view />
+          </keep-alive>
         </div>
       </div>
     </div>
@@ -114,11 +117,12 @@
 </template>
 
 <script>
-import localMenus, { HIDE_MENU_NAME } from "@/constants/menus-data";
+import localMenus from "@/constants/menus-data";
 import { sysMenu, logout } from "../modules/login/api";
 import ResetPwd from "../modules/base/components/ResetPwd";
 import { SYS_ADMIN_NAME } from "@/constants/enumerate";
 import { APP_TITLE } from "@/constants/app";
+import submenus from "../constants/submenus";
 
 export default {
   name: "home",
@@ -129,7 +133,7 @@ export default {
 
     return {
       APP_TITLE,
-      HIDE_MENU_NAME,
+      HIDE_MENU_NAME: [],
       privileges: [],
       menus: [],
       curMenu: { url: "", children: [] },
@@ -155,7 +159,11 @@ export default {
       this.routerChange();
     }
   },
-  computed: {},
+  computed: {
+    keepAliveRoutes() {
+      return this.$store.state.keepAliveRoutes;
+    }
+  },
   created() {
     // this.initData1();
     this.initData();
@@ -210,7 +218,18 @@ export default {
       this.menuChange(curMenu);
     },
     transformMenu(list) {
-      return list.map(item => {
+      let HIDE_MENU_NAME = [];
+      let extroNavs = [];
+      submenus.forEach(item => {
+        const menu = item.getSubMenu(list);
+        if (menu) {
+          extroNavs.push(menu);
+          HIDE_MENU_NAME.push(menu.url);
+        }
+      });
+      this.HIDE_MENU_NAME = HIDE_MENU_NAME;
+
+      let nlist = list.map(item => {
         return {
           id: item.id,
           parentId: item.parentId,
@@ -219,6 +238,7 @@ export default {
           url: item.url
         };
       });
+      return [...nlist, ...extroNavs];
     },
     getMenu() {
       this.validRoutes = this.privileges.map(item => item.url);