瀏覽代碼

feat: 全局权限策略调整

zhangjie 9 月之前
父節點
當前提交
c443a8b769

+ 2 - 1
src/mixins/privilege.js

@@ -3,7 +3,8 @@ export default {
     checkPrivilege(type, field, routeName = null) {
       const key = `${type}_${field}`.toLowerCase();
       let routerName = routeName || this.$route.name;
-      const routerPrivileges = this.$store.state.privilegeMap[routerName] || [];
+      const routerPrivileges =
+        this.$store.state.app.privilegeMap[routerName] || [];
       return routerPrivileges.includes(key);
     },
   },

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

@@ -1,5 +1,4 @@
 // exam
-import WaitTask from "./views/WaitTask.vue";
 import ExamTaskManage from "./views/ExamTaskManage.vue";
 import TaskApplyManage from "./views/TaskApplyManage.vue";
 import TaskReviewManage from "./views/TaskReviewManage.vue";
@@ -11,11 +10,6 @@ import ActionLogManage from "./views/ActionLogManage.vue";
 import PdfBuildManage from "./views/PdfBuildManage.vue";
 
 export default [
-  {
-    path: "/exam/wait-task",
-    name: "WaitTask",
-    component: WaitTask,
-  },
   {
     path: "/exam/exam-task-manage",
     name: "ExamTaskManage",

+ 1 - 1
src/modules/login/views/Login.vue

@@ -319,7 +319,7 @@ export default {
         });
       } else {
         this.$router.push({
-          name: "Home",
+          name: "HomePage",
         });
       }
     },

+ 21 - 8
src/router.js

@@ -1,5 +1,6 @@
 import Vue from "vue";
 import Router from "vue-router";
+import store from "./store";
 
 import Home from "./views/Home.vue";
 import HomePage from "./views/home-page/HomePage.vue";
@@ -45,7 +46,7 @@ location / {
 }
 */
 
-let router = new Router({
+const router = new Router({
   mode: "history",
   routes: [
     {
@@ -82,6 +83,9 @@ let router = new Router({
       path: "*",
       name: "404",
       component: NotFound,
+      meta: {
+        noRequire: true,
+      },
     },
     // [lazy-loaded] route level code-splitting
     // {
@@ -96,13 +100,7 @@ let router = new Router({
 });
 
 // route interceptor
-router.beforeEach((to, from, next) => {
-  const privilegeMap = Vue.ls.get("privilegeMap", {});
-  Vue.ls.set(
-    "privilegeId",
-    privilegeMap[to.name] ? privilegeMap[to.name][0] : ""
-  );
-
+router.beforeEach(async (to, from, next) => {
   const token = Vue.ls.get("token");
   if (to.meta.noRequire) {
     next();
@@ -130,6 +128,21 @@ router.beforeEach((to, from, next) => {
     return;
   }
 
+  if (!store.state.app.privileges.length) {
+    await store.dispatch("app/updatePrivilegeMap");
+  }
+
+  if (!store.state.app.validRoutes.includes(to.name)) {
+    next({ name: "404" });
+    return;
+  }
+
+  const privilegeMap = store.state.app.privilegeMap;
+  Vue.ls.set(
+    "privilegeId",
+    privilegeMap[to.name] ? privilegeMap[to.name][0] : ""
+  );
+
   next();
 });
 

+ 0 - 44
src/store.js

@@ -1,44 +0,0 @@
-import Vue from "vue";
-import Vuex from "vuex";
-
-Vue.use(Vuex);
-
-// TODO:待完善
-const privilegeMapData = window.sessionStorage.getItem("vs_privilegeMap");
-const privilegeMap = privilegeMapData ? JSON.parse(privilegeMapData).value : {};
-
-// modules
-import { card, free } from "./modules/card/store";
-import exam from "./modules/exam/store";
-import base from "./modules/base/store";
-import baseConfigs from "./modules/analysis/components/baseConfig/baseConfigsStore";
-import markParam from "./modules/mark/components/markParam/store";
-import report from "./modules/mark/components/report/store";
-import target from "./modules/target/store";
-
-export default new Vuex.Store({
-  state: {
-    user: {},
-    privilegeMap,
-    shortupMenus: [],
-  },
-  mutations: {
-    setUser(state, user) {
-      state.user = user;
-    },
-    setPrivilegeMap(state, privilegeMap) {
-      state.privilegeMap = privilegeMap;
-    },
-  },
-  actions: {},
-  modules: {
-    card,
-    free,
-    exam,
-    base,
-    baseConfigs,
-    markParam,
-    report,
-    target,
-  },
-});

+ 98 - 0
src/store/app.js

@@ -0,0 +1,98 @@
+import { sysMenu } from "../modules/login/api";
+import staticMenu from "../constants/staticMenu";
+// import localMenus from "../constants/menus-data";
+
+const state = {
+  privilegeMap: {},
+  privileges: [],
+  validRoutes: [],
+  menus: [],
+};
+
+const mutations = {
+  setPrivilegeMap(state, privilegeMap) {
+    state.privilegeMap = privilegeMap;
+  },
+  initStore() {
+    state.privilegeMap = {};
+    state.privileges = [];
+    state.validRoutes = [];
+    state.menus = [];
+  },
+};
+
+function getPrivilegeMap(data) {
+  const privilegeMap = {};
+  const pageSetTypes = ["conditions", "buttons", "lists", "links"];
+  data.forEach((item) => {
+    privilegeMap[item.url] = [item.id];
+    pageSetTypes.forEach((type) => {
+      if (item[type] && item[type].length) {
+        item[type].forEach((elem) => {
+          privilegeMap[item.url].push(`${elem.type}_${elem.url}`.toLowerCase());
+        });
+      }
+    });
+  });
+
+  return privilegeMap;
+}
+
+function transformMenu(list) {
+  return list.map((item) => {
+    return {
+      id: item.id,
+      parentId: item.parentId,
+      name: item.name,
+      type: item.type,
+      url: item.url,
+    };
+  });
+}
+
+function getMenu(privileges) {
+  const getChildren = (id) => {
+    return privileges
+      .filter((item) => item.parentId === id)
+      .map((item) => {
+        return { ...item };
+      });
+  };
+
+  const menus = getChildren("-1");
+  const validRoutes = ["Home"];
+  const toTree = (menus) => {
+    menus.forEach((menu) => {
+      const children = getChildren(menu.id);
+      if (children.length) {
+        menu.children = children;
+        toTree(menu.children);
+      } else {
+        validRoutes.push(menu.url);
+      }
+    });
+  };
+  toTree(menus);
+
+  return { menus, validRoutes };
+}
+
+const actions = {
+  async updatePrivilegeMap({ state, dispatch }) {
+    const data = await sysMenu();
+    // const data = { privileges: localMenus };
+    const privileges = [...staticMenu, ...data.privileges];
+    state.privilegeMap = getPrivilegeMap(privileges);
+    state.privileges = transformMenu(privileges);
+    const { validRoutes, menus } = getMenu(state.privileges);
+    state.menus = menus;
+    state.validRoutes = validRoutes;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 36 - 0
src/store/index.js

@@ -0,0 +1,36 @@
+import Vue from "vue";
+import Vuex from "vuex";
+
+Vue.use(Vuex);
+
+// modules
+import app from "./app";
+import { card, free } from "@/modules/card/store";
+import exam from "@/modules/exam/store";
+import base from "@/modules/base/store";
+import baseConfigs from "@/modules/analysis/components/baseConfig/baseConfigsStore";
+import markParam from "@/modules/mark/components/markParam/store";
+import report from "@/modules/mark/components/report/store";
+import target from "@/modules/target/store";
+
+export default new Vuex.Store({
+  state: {
+    user: {},
+  },
+  mutations: {
+    setUser(state, user) {
+      state.user = user;
+    },
+  },
+  modules: {
+    app,
+    card,
+    free,
+    exam,
+    base,
+    baseConfigs,
+    markParam,
+    report,
+    target,
+  },
+});

+ 16 - 148
src/views/Home.vue

@@ -70,11 +70,6 @@
               :route="{ name: nav.url }"
             >
               <span>{{ nav.name }}</span>
-              <span
-                class="nav-item-info"
-                v-if="nav.url === 'WaitTask' && waitTaskCount"
-                >{{ waitTaskCount }}</span
-              >
             </el-menu-item>
           </el-submenu>
           <el-menu-item
@@ -124,15 +119,14 @@
 </template>
 
 <script>
-import { mapState, mapActions } from "vuex";
-import localMenus from "@/constants/menus-data";
-import { sysMenu, logout } from "../modules/login/api";
-import ResetPwd from "../modules/base/components/ResetPwd.vue";
+import { mapState } from "vuex";
+import { logout } from "../modules/login/api";
 import { SYS_ADMIN_NAME } from "@/constants/enumerate";
-import staticMenu from "../constants/staticMenu";
+import { logoutHandle } from "../plugins/logout";
+
+import ResetPwd from "../modules/base/components/ResetPwd.vue";
 import SwitchSchoolDialog from "../modules/login/components/SwitchSchoolDialog.vue";
 import ViewFooter from "../components/ViewFooter.vue";
-import { logoutHandle } from "../plugins/logout";
 
 const HOME_PAGE_ROUTE = "HomePage";
 
@@ -149,13 +143,10 @@ export default {
     const IS_SUPER_ADMIN = user.loginName === SYS_ADMIN_NAME;
 
     return {
-      privileges: [],
-      menus: [],
       curMenu: { url: "", children: [] },
       curRouteName: "",
       curSubMenuNames: [],
       breadcrumbs: [],
-      validRoutes: [],
       username: user.realName,
       userRoles: user.roleList,
       schoolLogo: this.$ls.get("schoolLogo"),
@@ -181,6 +172,7 @@ export default {
   },
   computed: {
     ...mapState("exam", ["waitTaskCount"]),
+    ...mapState("app", ["menus", "privilegeMap", "validRoutes", "privileges"]),
     IS_HOME_PAGE() {
       return this.$route.name === HOME_PAGE_ROUTE;
     },
@@ -189,71 +181,18 @@ export default {
     },
   },
   created() {
-    // this.initData1();
     this.initData();
   },
   methods: {
-    ...mapActions("exam", ["updateWaitTaskCount"]),
-    initData1() {
-      // 开发阶段专用
-      const privileges = [...staticMenu, ...localMenus];
-      this.initPrivilegeMap(privileges);
-      this.privileges = this.transformMenu(privileges);
-      this.menus = this.getMenu();
-
-      if (this.IS_HOME_PAGE) return;
-
-      if (this.$route.name === "Home") {
-        this.$router.replace({
-          name: HOME_PAGE_ROUTE,
-        });
-        return;
-      }
-
-      if (!this.validRoutes.includes(this.$route.name)) {
-        this.$router.replace({
-          name: "404",
-        });
+    initData() {
+      this.updateWaitTypes();
+      if (this.IS_HOME_PAGE) {
+        this.curMenu = { url: HOME_PAGE_ROUTE };
         return;
       }
 
-      this.updateBreadcrumbs();
-      const curMenu = this.menus.find(
-        (menu) => menu.url === this.breadcrumbs[0].url
-      );
-      this.menuChange(curMenu);
-      if (
-        this.validRoutes.includes("WaitTask") &&
-        this.curMenu.url === "exam"
-      ) {
-        this.updateWaitTaskCount();
-      }
-    },
-    async initData() {
-      const data = await sysMenu();
-      const privileges = [...staticMenu, ...data.privileges];
-      this.initPrivilegeMap(privileges);
-      this.privileges = this.transformMenu(privileges);
-      this.menus = this.getMenu();
-
-      if (this.IS_HOME_PAGE) return;
-
       if (this.$route.name === "Home") {
         this.toMenu(this.menus[0]);
-        // if (this.IS_SUPER_ADMIN) {
-        //   this.toMenu(this.menus[0]);
-        // } else {
-        //   this.$router.replace({
-        //     name: HOME_PAGE_ROUTE
-        //   });
-        // }
-        return;
-      }
-
-      if (!this.validRoutes.includes(this.$route.name)) {
-        this.$router.replace({
-          name: "404",
-        });
         return;
       }
 
@@ -262,52 +201,6 @@ export default {
         (menu) => menu.url === this.breadcrumbs[0].url
       );
       this.menuChange(curMenu);
-
-      if (
-        this.validRoutes.includes("WaitTask") &&
-        this.curMenu.url === "exam"
-      ) {
-        this.updateWaitTaskCount();
-      }
-    },
-    transformMenu(list) {
-      return list.map((item) => {
-        return {
-          id: item.id,
-          parentId: item.parentId,
-          name: item.name,
-          type: item.type,
-          url: item.url,
-        };
-      });
-    },
-    getMenu() {
-      const getChildren = (id) => {
-        return this.privileges
-          .filter((item) => item.parentId === id)
-          .map((item) => {
-            return { ...item };
-          });
-      };
-
-      let menus = getChildren("-1");
-      let validRoutes = [];
-      const toTree = (menus) => {
-        menus.forEach((menu) => {
-          const children = getChildren(menu.id);
-          if (children.length) {
-            menu.children = children;
-            toTree(menu.children);
-          } else {
-            validRoutes.push(menu.url);
-          }
-        });
-      };
-      toTree(menus);
-
-      this.validRoutes = validRoutes;
-      // console.log(JSON.stringify(menus));
-      return menus;
     },
     getCurMenuFirstRouter() {
       let firstRouteName = "";
@@ -319,25 +212,7 @@ export default {
 
       return firstRouteName;
     },
-    initPrivilegeMap(data) {
-      let privilegeMap = {};
-      const pageSetTypes = ["conditions", "buttons", "lists", "links"];
-      data.forEach((item) => {
-        privilegeMap[item.url] = [item.id];
-        pageSetTypes.forEach((type, index) => {
-          if (item[type] && item[type].length) {
-            item[type].forEach((elem) => {
-              privilegeMap[item.url].push(
-                `${elem.type}_${elem.url}`.toLowerCase()
-              );
-            });
-          }
-        });
-      });
-      this.$store.commit("setPrivilegeMap", privilegeMap);
-      this.$ls.set("privilegeMap", privilegeMap);
-
-      // wait-types
+    updateWaitTypes() {
       const filterFunc = {
         flow: () => {
           return (
@@ -360,7 +235,6 @@ export default {
     },
     menuChange(menu) {
       this.curMenu = menu;
-
       this.curSubMenuNames = this.privileges
         .filter((item) => item.parentId === menu.id)
         .map((item) => item.url);
@@ -384,7 +258,7 @@ export default {
     },
     updateBreadcrumbs() {
       this.curRouteName = this.$route.name;
-      let breadcrumbs = [];
+      const breadcrumbs = [];
       let curBreadcrumb = this.privileges.find(
         (item) => item.url === this.curRouteName
       );
@@ -401,20 +275,11 @@ export default {
     },
     routerChange() {
       this.updateBreadcrumbs();
-      // console.log(this.breadcrumbs);
-      // console.log(this.curMenu);
 
       const curMenu = this.menus.find(
         (menu) => menu.url === this.breadcrumbs[0].url
       );
       this.menuChange(curMenu);
-
-      if (
-        this.validRoutes.includes("WaitTask") &&
-        this.curMenu.url === "exam"
-      ) {
-        this.updateWaitTaskCount();
-      }
     },
     toLogout() {
       this.$confirm("确定要退出登录吗?", "提示", {
@@ -426,7 +291,10 @@ export default {
         .catch(() => {});
     },
     toSelectSchool() {
-      if (this.IS_SUPER_ADMIN) this.$router.push({ name: "SelectSchool" });
+      if (this.IS_SUPER_ADMIN) {
+        this.$router.push({ name: "SelectSchool" });
+        return;
+      }
       if (this.hasMoreSchool) {
         this.$refs.SwitchSchoolDialog.open();
       }

+ 2 - 5
src/views/home-page/HomeGuide.vue

@@ -391,10 +391,7 @@ export default {
     };
   },
   computed: {
-    ...mapState(["privilegeMap"]),
-    validRouters() {
-      return Object.keys(this.privilegeMap);
-    },
+    ...mapState("app", ["validRoutes"]),
   },
   methods: {
     checkIsLink(key) {
@@ -412,7 +409,7 @@ export default {
       }
 
       if (objTypeOf(authentic) === "string") {
-        return this.validRouters.includes(authentic);
+        return this.validRoutes.includes(authentic);
       }
 
       return false;

+ 0 - 1
src/views/home-page/HomePage.vue

@@ -51,7 +51,6 @@ export default {
     };
   },
   computed: {
-    ...mapState(["privilegeMap"]),
     ...mapState("exam", ["waitTaskCount"]),
   },
   created() {

+ 3 - 0
tools/router.js

@@ -4,5 +4,8 @@ export default [
     name: "CardExchangeView",
     component: () =>
       import(/* webpackChunkName: "tool" */ "./card-exchange-view/Index.vue"),
+    meta: {
+      noRequire: true,
+    },
   },
 ];