刘洋 1 gadu atpakaļ
vecāks
revīzija
bede215a79

+ 1 - 0
src/directives/directives.js

@@ -1,2 +1,3 @@
 import "../modules/questions/directives/directives";
 import "./domObserver";
+import "./permBtn";

+ 13 - 0
src/directives/permBtn.js

@@ -0,0 +1,13 @@
+import Vue from "vue";
+import store from "@/store";
+Vue.directive("permBtn", {
+  bind(el, binding) {
+    const authButtons = store.state.authButtons;
+    console.log("bbb", binding.value, authButtons);
+    if (authButtons.includes(binding.value)) {
+      el.style.display = "";
+    } else {
+      el.style.display = "none";
+    }
+  },
+});

+ 6 - 1
src/modules/paper/views/EditPaper.vue

@@ -104,7 +104,10 @@
             审核记录
           </el-button>
           <el-button
-            v-if="enableCardEdit"
+            v-if="
+              enableCardEdit &&
+              authButtons.includes('exam_paper_manager-edit_card')
+            "
             type="info"
             size="small"
             @click="toEditCard"
@@ -649,6 +652,7 @@ import SelectQuestionDialog from "../components/SelectQuestionDialog.vue";
 import QuestionAnswer from "../../question/components/QuestionAnswer.vue";
 import { calcSum } from "@/plugins/utils";
 import { downloadByApi } from "@/plugins/download";
+import { mapGetters } from "vuex";
 
 export default {
   name: "EditPaper",
@@ -703,6 +707,7 @@ export default {
     enableCardEdit() {
       return this.paper.auditStatus === "PASS";
     },
+    ...mapGetters(["authButtons"]),
   },
   created() {
     let qt = sessionStorage.getItem("quesTagShow");

+ 39 - 14
src/modules/portal/views/home/HomeSide.vue

@@ -21,6 +21,7 @@
         >
           <template slot="title">
             <i :class="'icon icon-' + MENU_ICONS[index]"></i>
+
             <span>{{ menu1.name }}</span>
           </template>
           <el-menu-item
@@ -77,7 +78,10 @@
       text-color="#383b4a"
       router
     >
-      <el-menu-item @click="safeSetOpen">
+      <el-menu-item
+        @click="safeSetOpen"
+        v-if="authButtons.includes('import_test_paper-safe')"
+      >
         <i class="icon icon-safe"></i>
         <span> 安全设置 </span>
       </el-menu-item>
@@ -101,7 +105,7 @@
 </template>
 
 <script>
-import { mapState } from "vuex";
+import { mapState, mapGetters } from "vuex";
 import { QUESTION_API } from "@/constants/constants";
 import QuestionSafetySetDialog from "@/modules/question/components/QuestionSafetySetDialog.vue";
 
@@ -187,6 +191,7 @@ export default {
   },
   computed: {
     ...mapState({ user: (state) => state.user }),
+    ...mapGetters(["authButtons"]),
   },
   watch: {
     $route() {
@@ -198,24 +203,44 @@ export default {
   },
   async created() {
     this.group = routesToMenu.find((v) => this.$route.path.startsWith(v.path));
-    this.menuList = await this.getUserPrivileges();
+    let list = await this.getUserPrivileges();
+    let authButtons = [];
+
+    list.forEach((level1) => {
+      if (level1.subRolePrivilege?.length) {
+        level1.subRolePrivilege.forEach((level2) => {
+          if (level2.subRolePrivilege?.length) {
+            level2.subRolePrivilege.forEach((level3) => {
+              if (level3.privilegeType === "BUTTON" && level3.enable) {
+                authButtons.push(level3.code);
+              }
+            });
+          }
+        });
+      }
+    });
+    this.setAuthButtons(authButtons);
+    console.log(this.$store.state.authButtons);
+    this.menuList = list;
     this.UPDATE_MENU_LIST(this.menuList);
     this.updatePath();
     this.getBadge();
   },
   methods: {
-    ...mapMutations([UPDATE_CURRENT_PATHS, UPDATE_MENU_LIST]),
+    ...mapMutations([UPDATE_CURRENT_PATHS, UPDATE_MENU_LIST, "setAuthButtons"]),
     getBadge() {
-      this.$httpWithMsg.post(QUESTION_API + "/pending/count").then((res) => {
-        if (res.data) {
-          this.badgeMenuNums["check_duplicate_list"] =
-            res.data?.duplicateCount || 0;
-          this.badgeMenuNums["paper_pending_trial"] =
-            res.data?.questionAuditCount || 0;
-          this.badgeMenuNums["exam_paper_pending_trial"] =
-            res.data?.paperAuditCount || 0;
-        }
-      });
+      this.$httpWithMsg
+        .post(QUESTION_API + "/rolePrivilege/pending/count")
+        .then((res) => {
+          if (res.data) {
+            this.badgeMenuNums["check_duplicate_list"] =
+              res.data?.duplicateCount || 0;
+            this.badgeMenuNums["paper_pending_trial"] =
+              res.data?.questionAuditCount || 0;
+            this.badgeMenuNums["exam_paper_pending_trial"] =
+              res.data?.paperAuditCount || 0;
+          }
+        });
     },
     safeSetOpen() {
       this.$refs.QuestionSafetySetDialog.open();

+ 9 - 0
src/modules/question/components/QuestionImportDialog.vue

@@ -308,6 +308,15 @@ export default {
 
       // this.$message.success("导入成功!");
       console.log("upload res", res);
+      if (this.importType !== "word" && res.data) {
+        this.$confirm(
+          "系统正在计算试题情况,请在后续检查试题查重与试题审核数据。",
+          "系统通知",
+          {
+            type: "warning",
+          }
+        );
+      }
       this.$emit("modified", {
         ...res.data,
         importData: this.modalForm,

+ 9 - 2
src/modules/question/components/QuestionImportEdit.vue

@@ -912,9 +912,16 @@ export default {
       }).catch(() => {});
 
       this.loading = false;
-      console.log("save", res);
       if (!res) return;
-      //todo
+      if (res.data) {
+        this.$confirm(
+          "系统正在计算试题情况,请在后续检查试题查重与试题审核数据。",
+          "系统通知",
+          {
+            type: "warning",
+          }
+        );
+      }
       this.$message.success("提交成功!");
       this.$emit("modified");
       this.cancel();

+ 3 - 1
src/modules/question/views/QuestionManage.vue

@@ -44,6 +44,7 @@
             >试题统计</el-button
           >
           <el-button
+            v-if="authButtons.includes('import_test_paper-safe')"
             type="danger"
             plain
             icon="el-icon-lock"
@@ -320,7 +321,7 @@ import FolderQuestionManageDialog from "../components/FolderQuestionManageDialog
 import PropertyTreeSelect from "../components/PropertyTreeSelect.vue";
 import QuestionImportEdit from "../components/QuestionImportEdit.vue";
 import GptQuestionDialog from "../components/GptQuestionDialog.vue";
-import { mapActions } from "vuex";
+import { mapActions, mapGetters } from "vuex";
 import { USER_SIGNIN } from "../../portal/store/user";
 import QuestionFolder from "@/modules/question/components/QuestionFolder.vue";
 
@@ -376,6 +377,7 @@ export default {
     user() {
       return this.$store.state.user;
     },
+    ...mapGetters(["authButtons"]),
   },
   mounted() {
     this.$refs.QuestionFolder.selectDefaultNode();

+ 3 - 1
src/modules/questions/views/Course.vue

@@ -59,6 +59,7 @@
           >
         </div>
         <el-button
+          v-if="authButtons.includes('index_course-add_course')"
           type="primary"
           icon="icon icon-plus-white"
           @click="insertCourse"
@@ -225,7 +226,7 @@
 <script>
 import { QUESTION_API } from "@/constants/constants.js";
 import { ENABLE_TYPE, LEVEL_TYPE } from "../constants/constants.js";
-import { mapState } from "vuex";
+import { mapState, mapGetters } from "vuex";
 import { courseExportApi } from "../api";
 import { downloadByApi } from "@/plugins/download";
 import ImportFileDialog from "@/components/ImportFileDialog.vue";
@@ -317,6 +318,7 @@ export default {
     ...mapState({
       user: (state) => state.user,
     }),
+    ...mapGetters(["authButtons"]),
     noBatchSelected() {
       return this.selectedCourseIds.length === 0;
     },

+ 11 - 0
src/modules/questions/views/OrgProperty.vue

@@ -246,6 +246,8 @@
             :props="defaultTreeProps"
             @check-change="treeCheckChange"
             @check="tab4Entered = true"
+            default-expand-all
+            :filter-node-method="filterTree"
           >
             <span class="custom-tree-node" slot-scope="{ node, data }">
               <span>{{ node.label }}</span>
@@ -616,6 +618,9 @@ export default {
           .filter((key) => !key.endsWith("__page"));
       });
     },
+    filterTree(value, data) {
+      return !data.originId;
+    },
   },
   watch: {
     activeName(val) {
@@ -650,6 +655,7 @@ export default {
                       enable: level2.enable,
                       name: "页面",
                       privilegeType: "PAGE",
+                      originId: level2.code,
                     });
                     checkedLeafCodes.push(level2.code + "__page");
                   } else {
@@ -667,6 +673,11 @@ export default {
           this.$refs.authTree.setCheckedKeys(checkedLeafCodes);
         });
     },
+    treeData() {
+      this.$nextTick(() => {
+        this.$refs.authTree?.filter("");
+      });
+    },
   },
 };
 </script>

+ 3 - 1
src/modules/questions/views/user.vue

@@ -109,6 +109,7 @@
         </div>
         <div>
           <el-button
+            v-if="authButtons.includes('index_user-add_user')"
             type="primary"
             icon="icon icon-plus-white"
             @click="openAddingDialog"
@@ -497,7 +498,7 @@
 
 <script>
 import { QUESTION_API } from "@/constants/constants.js";
-import { mapState } from "vuex";
+import { mapState, mapGetters } from "vuex";
 import ImportFileDialog from "@/components/ImportFileDialog.vue";
 
 export default {
@@ -638,6 +639,7 @@ export default {
     ...mapState({
       user: (state) => state.user,
     }),
+    ...mapGetters(["authButtons"]),
     userIds() {
       var userIds = "";
       for (let userId of this.selectedUserIds) {

+ 7 - 0
src/store/index.js

@@ -12,12 +12,16 @@ Vue.use(Vuex);
 export default new Vuex.Store({
   state: {
     version: "",
+    authButtons: [],
   },
   mutations: {
     setVersion(state, version) {
       sessionStorage.setItem("version", version);
       state.version = version;
     },
+    setAuthButtons(state, arr) {
+      state.authButtons = arr;
+    },
   },
   actions: {},
   modules: {
@@ -28,4 +32,7 @@ export default new Vuex.Store({
     "paper-export": paperExport,
     "import-edit": importEdit,
   },
+  getters: {
+    authButtons: (state) => state.authButtons,
+  },
 });