ソースを参照

权限控制调整

zhangjie 2 年 前
コミット
11d67bd61b

+ 0 - 1
.gitignore

@@ -14,7 +14,6 @@ yarn-error.log*
 
 # Editor directories and files
 .idea
-.vscode
 *.suo
 *.ntvs*
 *.njsproj

+ 8 - 0
.vscode/extensions.json

@@ -0,0 +1,8 @@
+{
+  "recommendations": [
+    "editorconfig.editorconfig",
+    "dbaeumer.vscode-eslint",
+    "esbenp.prettier-vscode",
+    "octref.vetur"
+  ]
+}

+ 1 - 1
src/assets/styles/element-ui-costom.scss

@@ -14,7 +14,7 @@
 
     .el-dialog__header {
       width: 100%;
-      position: fixed;
+      position: absolute;
       z-index: 9;
       background-color: #fff;
       border-bottom: 1px solid $--color-border;

+ 93 - 0
src/assets/styles/home.scss

@@ -566,3 +566,96 @@
     }
   }
 }
+// select-scope-dialog
+.select-scope-dialog {
+  .select-search {
+    margin-bottom: 5px;
+  }
+  .select-tree {
+    padding: 5px;
+    border: 1px solid #e0e0e0;
+    height: 300px;
+    overflow: auto;
+  }
+  .select-part-title {
+    height: 28px;
+    line-height: 26px;
+    border-radius: 5px;
+    background-color: #f0f0f0;
+    border: 1px solid #e0e0e0;
+    text-align: center;
+    margin-bottom: 5px;
+  }
+  .select-list {
+    border: 1px solid #e0e0e0;
+    padding: 5px;
+    height: 333px;
+    overflow: auto;
+  }
+  .select-item {
+    margin: 3px 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: #f0f0f0;
+    border-radius: 3px;
+  }
+  .select-cont {
+    line-height: 20px;
+    padding: 4px 6px;
+  }
+  .select-delete {
+    padding: 0;
+    color: $--color-danger;
+
+    &:hover {
+      color: mix(#000, $--color-danger, 10%);
+    }
+  }
+}
+// privilege-dialog
+.privilege-dialog {
+  .el-dialog {
+    width: 1000px;
+  }
+  .el-dialog__body {
+    padding-top: 75px !important;
+    height: 100%;
+    overflow: auto;
+  }
+
+  .privilege-group {
+    margin-bottom: 20px;
+    &-title {
+      font-weight: 600;
+      line-height: 1;
+      padding-bottom: 10px;
+    }
+
+    .privilege-item {
+      display: inline-block;
+      margin-bottom: 10px;
+      margin-right: 30px;
+      min-width: 80px;
+
+      &-scope {
+        display: block;
+      }
+    }
+  }
+
+  .privilege-scope-edit {
+    .scope-edit {
+      &-label {
+        display: block;
+        width: 80px;
+        text-align: right;
+        float: left;
+        padding: 8px 0;
+      }
+      &-content {
+        margin-left: 80px;
+      }
+    }
+  }
+}

+ 3 - 109
src/constants/navs.js

@@ -10,12 +10,14 @@ export const navs = [
     parentId: "1",
     name: "用户管理",
     url: "UserManage",
+    privilege: "USER_VIEW",
   },
   {
     id: "3",
     parentId: "1",
     name: "机构管理",
     url: "OrgManage",
+    privilege: "ORG_VIEW",
   },
   {
     id: "4",
@@ -28,114 +30,6 @@ export const navs = [
     parentId: "1",
     name: "微信小程序管理",
     url: "WeChatAppManage",
+    privilege: "WXAPP_VIEW",
   },
 ];
-
-export const ROLE_NAV = {
-  DEV: [
-    { url: "admin" },
-    {
-      url: "AppManage",
-      privilege: [
-        "app_version",
-        "app_version_add",
-        "app_version_edit",
-        "app_version_archive",
-        "app_version_master",
-        "app_config",
-        "app_config_baseline",
-        "app_config_baseline_edit",
-        "app_config_baseline_item_edit",
-        "app_config_test",
-        "app_config_prod",
-        "app_nginx",
-        "app_nginx_baseline",
-        "app_nginx_baseline_edit",
-        "app_nginx_test",
-        "app_nginx_prod",
-      ],
-    },
-  ],
-  TEST: [
-    { url: "admin" },
-    {
-      url: "AppManage",
-      privilege: [
-        "app_version",
-        "app_config",
-        "app_config_baseline",
-        "app_config_test",
-        "app_config_prod",
-        "app_nginx",
-        "app_nginx_baseline",
-        "app_nginx_test",
-        "app_nginx_prod",
-      ],
-    },
-  ],
-  OPS: [
-    { url: "admin" },
-    {
-      url: "AppManage",
-      privilege: [
-        "app_config",
-        "app_config_baseline",
-        "app_config_test",
-        "app_config_prod",
-        "app_nginx",
-        "app_nginx_baseline",
-        "app_nginx_test",
-        "app_nginx_prod",
-      ],
-    },
-  ],
-  ADMIN: [
-    { url: "admin" },
-    {
-      url: "AppManage",
-      privilege: [
-        "app_add",
-        "app_edit",
-        "app_user",
-        "app_user_bind",
-        "app_deploy",
-        "app_deploy_add",
-        "app_deploy_edit",
-        "app_deploy_org",
-        "app_deploy_device",
-        "app_module",
-        "app_module_add",
-        "app_module_edit",
-        "app_module_enable",
-        "app_version",
-        "app_version_add",
-        "app_version_edit",
-        "app_version_archive",
-        "app_version_master",
-        "app_env",
-        "app_env_add",
-        "app_env_edit",
-        "app_config",
-        "app_config_baseline",
-        "app_config_baseline_edit",
-        "app_config_baseline_item_edit",
-        "app_config_test",
-        "app_config_test_item_add",
-        "app_config_test_item_edit",
-        "app_config_prod",
-        "app_config_prod_item_add",
-        "app_config_prod_item_edit",
-        "app_nginx",
-        "app_nginx_baseline",
-        "app_nginx_baseline_edit",
-        "app_nginx_test",
-        "app_nginx_test_edit",
-        "app_nginx_prod",
-        "app_nginx_prod_edit",
-      ],
-    },
-    { url: "UserManage", privilege: ["add", "edit", "enable", "resetPwd"] },
-    { url: "OrgManage", privilege: ["add", "edit", "enable"] },
-    { url: "WeChatAppManage", privilege: ["add", "edit"] },
-  ],
-};

+ 171 - 0
src/constants/privilege.js

@@ -0,0 +1,171 @@
+export const privilegeConfig = [
+  {
+    title: "用户",
+    options: [
+      {
+        code: "USER_VIEW",
+        name: "用户管理",
+      },
+      {
+        code: "USER_INSERT",
+        name: "用户新增",
+      },
+      {
+        code: "USER_EDIT",
+        name: "用户修改",
+      },
+    ],
+  },
+  {
+    title: "微信小程序",
+    options: [
+      {
+        code: "WXAPP_VIEW",
+        name: "微信小程序管理",
+      },
+      {
+        code: "WXAPP_INSERT",
+        name: "微信小程序新增",
+      },
+      {
+        code: "WXAPP_EDIT",
+        name: "微信小程序修改",
+      },
+    ],
+  },
+  {
+    title: "机构",
+    options: [
+      {
+        code: "ORG_VIEW",
+        name: "机构管理",
+      },
+      {
+        code: "ORG_INSERT",
+        name: "机构新增",
+      },
+      {
+        code: "ORG_EDIT",
+        name: "机构修改",
+      },
+    ],
+  },
+  {
+    title: "应用",
+    options: [
+      {
+        code: "APP_INSERT",
+        name: "应用新增",
+      },
+      {
+        code: "APP_EDIT",
+        name: "应用修改",
+      },
+    ],
+  },
+  {
+    title: "模块",
+    options: [
+      {
+        code: "MODULE_INSERT",
+        name: "模块新增",
+      },
+      {
+        code: "MODULE_EDIT",
+        name: "模块修改",
+      },
+    ],
+  },
+  {
+    title: "环境",
+    options: [
+      {
+        code: "ENV_INSERT",
+        name: "环境新增",
+      },
+      {
+        code: "ENV_EDIT",
+        name: "环境修改",
+      },
+    ],
+  },
+  {
+    title: "版本",
+    options: [
+      {
+        code: "VERSION_INSERT",
+        name: "版本新增",
+        dataPrivilege: "app.id",
+      },
+      {
+        code: "VERSION_EDIT",
+        name: "版本修改",
+        dataPrivilege: "app.id",
+      },
+    ],
+  },
+  {
+    title: "程序配置",
+    options: [
+      {
+        code: "PROPERTY_BASELINE_EDIT",
+        name: "基线配置修改",
+        dataPrivilege: "app.id",
+      },
+      {
+        code: "PROPERTY_EDIT",
+        name: "程序配置修改",
+        dataPrivilege: "app.id",
+      },
+    ],
+  },
+  {
+    title: "Nginx配置",
+    options: [
+      {
+        code: "NGINX_BASELINE_EDIT",
+        name: "Nginx基线修改",
+        dataPrivilege: "app.id",
+      },
+      {
+        code: "NGINX_EDIT",
+        name: "Nginx配置修改",
+        dataPrivilege: "app.id",
+      },
+    ],
+  },
+  {
+    title: "部署",
+    options: [
+      {
+        code: "DEPLOY_INSERT",
+        name: "部署新增",
+      },
+      {
+        code: "DEPLOY_EDIT",
+        name: "部署修改",
+        dataPrivilege: "deploy.id",
+      },
+      {
+        code: "DEPLOY_ORG_EDIT",
+        name: "部署绑定机构修改",
+        dataPrivilege: "deploy.id",
+      },
+      {
+        code: "DEPLOY_DEVICE_EDIT",
+        name: "部署绑定设备修改",
+        dataPrivilege: "deploy.id",
+      },
+      {
+        code: "DEPLOY_SECRET_VIEW",
+        name: "部署密钥查看",
+        dataPrivilege: "deploy.id",
+      },
+      {
+        code: "DEPLOY_LICENSE_DOWNLOAD",
+        name: "部署证书下载",
+        dataPrivilege: "deploy.id",
+      },
+    ],
+  },
+];

+ 6 - 3
src/mixins/privilege.js

@@ -1,8 +1,11 @@
 export default {
   methods: {
-    checkPrivilege(field) {
-      const routerPrivileges = this.$store.state.privilegeMap[this.$route.name];
-      return routerPrivileges && routerPrivileges.has(field);
+    checkPrivilege(code, scopeId = "") {
+      const privilegeScope = this.$store.state.privilegeMap[code];
+      if (!privilegeScope) return false;
+      if (privilegeScope === "*") return true;
+
+      return privilegeScope.split(",").include(scopeId + "");
     },
   },
 };

+ 8 - 2
src/modules/admin/api.js

@@ -26,7 +26,7 @@ export const userInsertOrUpdate = (datas) => {
 export const appQuery = (datas) => {
   return $postParam("/api/admin/app/query", datas);
 };
-export const appList = (datas) => {
+export const appList = (datas = {}) => {
   // id/code/nameStartWith
   return $postParam("/api/admin/app/list", datas);
 };
@@ -78,8 +78,11 @@ export const appVersionInsertOrUpdate = (datas) => {
   }
 };
 // app-env-manage
+export const envList = () => {
+  return $postParam("/api/admin/env/list", {});
+};
 export const appEnvList = (datas) => {
-  return $postParam("/api/admin/env/list", datas);
+  return $postParam("/api/admin/env/app/list", datas);
 };
 export const appEnvTypes = () => {
   return $postParam("/api/admin/env/types", {});
@@ -128,6 +131,9 @@ export const appNginxConfigUpdate = (datas) => {
 };
 
 // app-deploy-manage
+export const deployList = () => {
+  return $postParam("/api/admin/deploy/list", {});
+};
 export const appDeployList = (datas) => {
   return $postParam("/api/admin/deploy/query", datas);
 };

+ 12 - 25
src/modules/admin/components/AppConfigManage.vue

@@ -48,7 +48,7 @@
               >查询</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_config_baseline_edit')"
+              v-if="checkPrivilege('PROPERTY_BASELINE_EDIT', app.id)"
               type="success"
               icon="md-add"
               @click="toUpdate"
@@ -147,7 +147,11 @@
                     >编辑</el-button
                   >
                   <el-button
-                    v-if="!item.isFromBaseline && group.name !== 'custom'"
+                    v-if="
+                      checkEditPrivilege(item) &&
+                      !item.isFromBaseline &&
+                      group.name !== 'custom'
+                    "
                     class="btn-danger cont-edit"
                     type="text"
                     @click="toDelete(item)"
@@ -163,7 +167,7 @@
 
     <!-- UpdateAppBaseline -->
     <update-app-baseline
-      v-if="checkPrivilege('app_config_baseline_edit')"
+      v-if="checkPrivilege('PROPERTY_BASELINE_EDIT', app.id)"
       ref="UpdateAppBaseline"
       :data="filter"
       @modified="baselineModified"
@@ -306,23 +310,15 @@ export default {
     },
     checkAddPrivilege(group) {
       const privilege =
-        (this.checkPrivilege("app_config_test_item_add") &&
-          this.curEnv.type === "TEST") ||
-        (this.checkPrivilege("app_config_prod_item_add") &&
-          this.curEnv.type === "PROD") ||
-        this.IS_MAINTAINER;
+        this.checkPrivilege("PROPERTY_EDIT", this.app.id) || this.IS_MAINTAINER;
       return group.name !== "custom" && !this.IS_BASELINE && privilege;
     },
     checkEditPrivilege(item) {
-      const privilege =
-        (this.checkPrivilege("app_config_test_item_edit") &&
-          this.curEnv.type === "TEST") ||
-        (this.checkPrivilege("app_config_prod_item_edit") &&
-          this.curEnv.type === "PROD");
+      const privilege = this.checkPrivilege("PROPERTY_EDIT", this.app.id);
 
       return (
         (item.mode !== "READONLY" && privilege) ||
-        (this.checkPrivilege("app_config_baseline_item_edit") &&
+        (this.checkPrivilege("PROPERTY_BASELINE_EDIT", this.appa.id) &&
           this.IS_BASELINE) ||
         (!this.IS_BASELINE && this.IS_MAINTAINER)
       );
@@ -337,17 +333,8 @@ export default {
       const res = await appEnvList({
         appId: this.app.id,
       });
-      let envList = res || [];
-      const testValid = this.checkPrivilege("app_config_test");
-      const prodValid = this.checkPrivilege("app_config_prod");
-      this.envList = envList.filter((env) => {
-        return (
-          (testValid && env.type === "TEST") ||
-          (prodValid && env.type === "PROD")
-        );
-      });
-      if (this.checkPrivilege("app_config_baseline"))
-        this.envList.unshift({ id: null, name: "基线" });
+      this.envList = res || [];
+      this.envList.unshift({ id: null, name: "基线" });
     },
     async getConfigModes() {
       if (Object.keys(this.modeMap).length) return;

+ 8 - 1
src/modules/admin/components/AppDeployBindDevice.vue

@@ -12,7 +12,12 @@
       @opened="visibleChange"
     >
       <div class="box-justify mb-2">
-        <el-button type="success" @click="toExport">导出通用许可证</el-button>
+        <el-button
+          v-if="checkPrivilege('DEPLOY_LICENSE_DOWNLOAD', instance.id)"
+          type="success"
+          @click="toExport"
+          >导出通用许可证</el-button
+        >
         <el-button type="primary" @click="toUpload">上传设备信息</el-button>
       </div>
       <div class="part-box part-box-pad">
@@ -31,12 +36,14 @@
           <el-table-column label="操作" width="200" class-name="action-column">
             <template slot-scope="scope">
               <el-button
+                v-if="checkPrivilege('DEPLOY_SECRET_VIEW', instance.id)"
                 class="btn-primary"
                 type="text"
                 @click="toDetail(scope.row)"
                 >设备信息</el-button
               >
               <el-button
+                v-if="checkPrivilege('DEPLOY_LICENSE_DOWNLOAD', instance.id)"
                 class="btn-success"
                 type="text"
                 @click="toExport(scope.row)"

+ 7 - 5
src/modules/admin/components/AppDeployManage.vue

@@ -29,7 +29,7 @@
               >查询</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_deploy_add')"
+              v-if="checkPrivilege('DEPLOY_INSERT')"
               type="success"
               icon="md-add"
               @click="toAdd"
@@ -52,21 +52,21 @@
           <el-table-column label="操作" width="200" class-name="action-column">
             <template slot-scope="scope">
               <el-button
-                v-if="checkPrivilege('app_deploy_edit')"
+                v-if="checkPrivilege('DEPLOY_EDIT', scope.row.id)"
                 class="btn-primary"
                 type="text"
                 @click="toEdit(scope.row)"
                 >编辑</el-button
               >
               <el-button
-                v-if="checkPrivilege('app_deploy_org')"
+                v-if="checkPrivilege('DEPLOY_ORG_EDIT', scope.row.id)"
                 class="btn-primary"
                 type="text"
                 @click="toBindOrg(scope.row)"
                 >关联机构</el-button
               >
               <el-button
-                v-if="checkPrivilege('app_deploy_device')"
+                v-if="checkPrivilege('DEPLOY_DEVICE_EDIT', scope.row.id)"
                 class="btn-primary"
                 type="text"
                 @click="toBindDevice(scope.row)"
@@ -92,7 +92,7 @@
     <!-- ModifyAppDeploy -->
     <modify-app-deploy
       v-if="
-        checkPrivilege('app_deploy_add') || checkPrivilege('app_deploy_edit')
+        checkPrivilege('DEPLOY_INSERT') || checkPrivilege('app_deploy_edit')
       "
       ref="ModifyAppDeploy"
       :instance="curRow"
@@ -101,11 +101,13 @@
     ></modify-app-deploy>
     <!-- AppDeployBindOrg -->
     <app-deploy-bind-org
+      v-if="checkPrivilege('DEPLOY_ORG_EDIT', scope.row.id)"
       ref="AppDeployBindOrg"
       :instance="curRow"
     ></app-deploy-bind-org>
     <!-- AppDeployBindDevice -->
     <app-deploy-bind-device
+      v-if="checkPrivilege('DEPLOY_DEVICE_EDIT', scope.row.id)"
       ref="AppDeployBindDevice"
       :instance="curRow"
     ></app-deploy-bind-device>

+ 8 - 4
src/modules/admin/components/AppEnvManage.vue

@@ -23,7 +23,7 @@
               >查询</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_env_add')"
+              v-if="checkPrivilege('ENV_INSERT')"
               type="success"
               icon="md-add"
               @click="toAdd"
@@ -52,10 +52,14 @@
               scope.row.updateTime | timestampFilter
             }}</span>
           </el-table-column> -->
-          <el-table-column label="操作" width="70" class-name="action-column">
+          <el-table-column
+            v-if="checkPrivilege('ENV_EDIT')"
+            label="操作"
+            width="70"
+            class-name="action-column"
+          >
             <template slot-scope="scope">
               <el-button
-                v-if="checkPrivilege('app_env_edit')"
                 class="btn-primary"
                 type="text"
                 @click="toEdit(scope.row)"
@@ -69,7 +73,7 @@
 
     <!-- ModifyAppEnv -->
     <modify-app-env
-      v-if="checkPrivilege('app_env_add') || checkPrivilege('app_env_edit')"
+      v-if="checkPrivilege('ENV_INSERT') || checkPrivilege('ENV_EDIT')"
       ref="ModifyAppEnv"
       :instance="curRow"
       :types="envTypes"

+ 8 - 7
src/modules/admin/components/AppModuleManage.vue

@@ -40,7 +40,7 @@
               >查询</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_module_add')"
+              v-if="checkPrivilege('MODULE_INSERT')"
               type="success"
               icon="md-add"
               @click="toAdd"
@@ -73,17 +73,20 @@
               scope.row.updateTime | timestampFilter
             }}</span>
           </el-table-column>
-          <el-table-column label="操作" width="100" class-name="action-column">
+          <el-table-column
+            v-if="checkPrivilege('MODULE_EDIT')"
+            label="操作"
+            width="100"
+            class-name="action-column"
+          >
             <template slot-scope="scope">
               <el-button
-                v-if="checkPrivilege('app_module_edit')"
                 class="btn-primary"
                 type="text"
                 @click="toEdit(scope.row)"
                 >编辑</el-button
               >
               <el-button
-                v-if="checkPrivilege('app_module_enable')"
                 :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
                 type="text"
                 @click="toEnable(scope.row)"
@@ -97,9 +100,7 @@
 
     <!-- ModifyAppModule -->
     <modify-app-module
-      v-if="
-        checkPrivilege('app_module_add') || checkPrivilege('app_module_edit')
-      "
+      v-if="checkPrivilege('MODULE_INSERT') || checkPrivilege('MODULE_EDIT')"
       ref="ModifyAppModule"
       :instance="curRow"
       @modified="getList"

+ 9 - 13
src/modules/admin/components/AppVersionManage.vue

@@ -37,7 +37,7 @@
               >查询</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_version_add')"
+              v-if="checkPrivilege('VERSION_INSERT', app.id)"
               type="success"
               icon="md-add"
               @click="toAdd"
@@ -81,30 +81,25 @@
               scope.row.updateTime | timestampFilter
             }}</span>
           </el-table-column>
-          <el-table-column label="操作" width="120" class-name="action-column">
+          <el-table-column
+            v-if="checkPrivilege('VERSION_EDIT', app.id)"
+            label="操作"
+            width="120"
+            class-name="action-column"
+          >
             <template slot-scope="scope">
               <el-button
-                v-if="checkPrivilege('app_version_edit')"
                 class="btn-primary"
                 type="text"
                 @click="toEdit(scope.row)"
                 >编辑</el-button
               >
               <el-button
-                v-if="checkPrivilege('app_version_archive')"
                 :class="scope.row.archived ? 'btn-danger' : 'btn-primary'"
                 type="text"
                 @click="toArchived(scope.row)"
                 >{{ scope.row.archived ? "取消归档" : "归档" }}</el-button
               >
-              <el-button
-                v-if="checkPrivilege('app_version_master')"
-                class="btn-primary"
-                type="text"
-                :disabled="scope.row.id === curMasterVersionId"
-                @click="toSetMaster(scope.row)"
-                >设置为主干版本</el-button
-              >
             </template>
           </el-table-column>
         </el-table>
@@ -125,7 +120,8 @@
     <!-- ModifyAppVersion -->
     <modify-app-version
       v-if="
-        checkPrivilege('app_version_add') || checkPrivilege('app_version_edit')
+        checkPrivilege('VERSION_INSERT', app.id) ||
+        checkPrivilege('VERSION_EDIT', app.id)
       "
       ref="ModifyAppVersion"
       :instance="curRow"

+ 5 - 14
src/modules/admin/components/EditNginxContent.vue

@@ -94,15 +94,7 @@ export default {
         appId: this.filterData.appId,
         moduleId: this.filterData.moduleId,
       });
-      let envList = res || [];
-      const testValid = this.checkPrivilege("app_nginx_test");
-      const prodValid = this.checkPrivilege("app_nginx_prod");
-      this.envList = envList.filter((env) => {
-        return (
-          (testValid && env.type === "TEST") ||
-          (prodValid && env.type === "PROD")
-        );
-      });
+      this.envList = res || [];
     },
     selectEnv(env) {
       this.curEnv = env || {};
@@ -111,11 +103,10 @@ export default {
     },
     checkEditPrivilege() {
       const privilege =
-        (this.checkPrivilege("app_nginx_test_edit") &&
-          this.curEnv.type === "TEST") ||
-        (this.checkPrivilege("app_nginx_prod_edit") &&
-          this.curEnv.type === "PROD") ||
-        (this.checkPrivilege("app_nginx_baseline_edit") && this.isBaseline);
+        (this.checkPrivilege("NGINX_EDIT", this.filter.appId) &&
+          !this.isBaseline) ||
+        (this.checkPrivilege("NGINX_BASELINE_EDIT", this.filter.appId) &&
+          this.isBaseline);
 
       return privilege || (!this.isBaseline && this.IS_MAINTAINER);
     },

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

@@ -1,5 +1,4 @@
 import AppManage from "./views/AppManage.vue";
-import UserManage from "./views/UserManage.vue";
 import OrgManage from "./views/OrgManage.vue";
 import WeChatAppManage from "./views/WeChatAppManage.vue";
 
@@ -9,11 +8,6 @@ export default [
     name: "AppManage",
     component: AppManage,
   },
-  {
-    path: "user-manage",
-    name: "UserManage",
-    component: UserManage,
-  },
   {
     path: "org-manage",
     name: "OrgManage",

+ 11 - 43
src/modules/admin/views/AppManage.vue

@@ -16,7 +16,7 @@
             >查询</el-button
           >
           <el-button
-            v-if="checkPrivilege('app_add')"
+            v-if="checkPrivilege('APP_INSERT')"
             type="success"
             icon="md-add"
             @click="toAdd"
@@ -34,7 +34,7 @@
         <el-table-column prop="masterVersionName" label="主干版本" width="120">
         </el-table-column>
         <el-table-column
-          v-if="checkPrivilege('app_edit')"
+          v-if="checkPrivilege('APP_EDIT')"
           label="操作"
           width="80"
           class-name="action-column"
@@ -50,50 +50,43 @@
         </el-table-column>
         <el-table-column label="管理" width="360" class-name="action-column">
           <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('app_user')"
+            <!-- <el-button
               class="btn-primary"
               type="text"
               @click="toEditUser(scope.row)"
               >用户</el-button
-            >
+            > -->
             <el-button
-              v-if="checkPrivilege('app_deploy')"
               class="btn-primary"
               type="text"
               @click="toEditDeploy(scope.row)"
               >部署</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_module')"
               class="btn-primary"
               type="text"
               @click="toEditModule(scope.row)"
               >模块</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_version')"
               class="btn-primary"
               type="text"
               @click="toEditVersion(scope.row)"
               >版本</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_env')"
               class="btn-primary"
               type="text"
               @click="toEditEnv(scope.row)"
               >环境</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_config')"
               class="btn-primary"
               type="text"
               @click="toEditConfig(scope.row)"
               >程序配置</el-button
             >
             <el-button
-              v-if="checkPrivilege('app_nginx')"
               class="btn-primary"
               type="text"
               @click="toEditConfigNginx(scope.row)"
@@ -117,55 +110,30 @@
 
     <!-- modify-app -->
     <modify-app
-      v-if="checkPrivilege('app_add') || checkPrivilege('app_edit')"
+      v-if="checkPrivilege('APP_INSERT') || checkPrivilege('APP_EDIT')"
       ref="ModifyApp"
       :instance="curRow"
       @modified="getList"
     >
     </modify-app>
     <!-- AppUserManage -->
-    <app-user-manage
-      v-if="checkPrivilege('app_user')"
-      ref="AppUserManage"
-      :app="curRow"
-    ></app-user-manage>
+    <app-user-manage ref="AppUserManage" :app="curRow"></app-user-manage>
     <!-- AppDeployManage -->
-    <app-deploy-manage
-      v-if="checkPrivilege('app_deploy')"
-      ref="AppDeployManage"
-      :app="curRow"
-    ></app-deploy-manage>
+    <app-deploy-manage ref="AppDeployManage" :app="curRow"></app-deploy-manage>
     <!-- AppModuleManage -->
-    <app-module-manage
-      v-if="checkPrivilege('app_module')"
-      ref="AppModuleManage"
-      :app="curRow"
-    ></app-module-manage>
+    <app-module-manage ref="AppModuleManage" :app="curRow"></app-module-manage>
     <!-- AppVersionManage -->
     <app-version-manage
-      v-if="checkPrivilege('app_version')"
       ref="AppVersionManage"
       :app="curRow"
       @master-change="getList"
     ></app-version-manage>
     <!-- AppEnvManage -->
-    <app-env-manage
-      v-if="checkPrivilege('app_env')"
-      ref="AppEnvManage"
-      :app="curRow"
-    ></app-env-manage>
+    <app-env-manage ref="AppEnvManage" :app="curRow"></app-env-manage>
     <!-- AppConfigManage -->
-    <app-config-manage
-      v-if="checkPrivilege('app_config')"
-      ref="AppConfigManage"
-      :app="curRow"
-    ></app-config-manage>
+    <app-config-manage ref="AppConfigManage" :app="curRow"></app-config-manage>
     <!-- AppNginxManage -->
-    <app-nginx-manage
-      v-if="checkPrivilege('app_nginx')"
-      ref="AppNginxManage"
-      :app="curRow"
-    ></app-nginx-manage>
+    <app-nginx-manage ref="AppNginxManage" :app="curRow"></app-nginx-manage>
   </div>
 </template>
 

+ 3 - 4
src/modules/admin/views/OrgManage.vue

@@ -67,7 +67,7 @@
             >查询</el-button
           >
           <el-button
-            v-if="checkPrivilege('add')"
+            v-if="checkPrivilege('ORG_INSERT')"
             type="success"
             icon="md-add"
             @click="toAdd"
@@ -122,6 +122,7 @@
           </template>
         </el-table-column>
         <el-table-column
+          v-if="checkPrivilege('ORG_EDIT')"
           class-name="action-column"
           label="操作"
           width="120"
@@ -129,14 +130,12 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('edit')"
               class="btn-primary"
               type="text"
               @click="toEdit(scope.row)"
               >编辑</el-button
             >
             <el-button
-              v-if="checkPrivilege('enable')"
               :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
               type="text"
               :disabled="loading"
@@ -161,7 +160,7 @@
 
     <!-- modify-app -->
     <ModifyOrg
-      v-if="checkPrivilege('edit') || checkPrivilege('add')"
+      v-if="checkPrivilege('ORG_EDIT') || checkPrivilege('ORG_INSERT')"
       ref="ModifyOrg"
       :datas="orgTypes"
       :instance="curRow"

+ 8 - 4
src/modules/admin/views/WeChatAppManage.vue

@@ -21,7 +21,7 @@
             >查询</el-button
           >
           <el-button
-            v-if="checkPrivilege('add')"
+            v-if="checkPrivilege('WXAPP_INSERT')"
             type="success"
             icon="md-add"
             @click="toAdd"
@@ -45,10 +45,14 @@
             scope.row.updateTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100">
+        <el-table-column
+          v-if="checkPrivilege('WXAPP_EDIT')"
+          class-name="action-column"
+          label="操作"
+          width="100"
+        >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('edit')"
               class="btn-primary"
               type="text"
               @click="toEdit(scope.row)"
@@ -71,7 +75,7 @@
     </div>
 
     <el-dialog
-      v-if="checkPrivilege('edit') || checkPrivilege('add')"
+      v-if="checkPrivilege('WXAPP_EDIT') || checkPrivilege('WXAPP_INSERT')"
       :visible.sync="visible"
       top="10vh"
       width="600px"

+ 27 - 0
src/modules/base/api.js

@@ -0,0 +1,27 @@
+import { $post, $postParam, qsRepeatParams } from "@/plugins/axios";
+
+// user-manage
+export const userListPage = (datas) => {
+  return $postParam("/api/admin/user/query", datas);
+};
+export const userRoleList = (datas) => {
+  return $postParam("/api/admin/user/roles", datas);
+};
+export const userListQuery = (datas) => {
+  return $postParam("/api/admin/user/list", datas);
+};
+export const resetPwd = (password) => {
+  return $postParam("/api/admin/user/change_password", { password });
+};
+export const userInsertOrUpdate = (datas) => {
+  const url = datas.id ? "/api/admin/user/update" : "/api/admin/user/insert";
+  return $postParam(url, datas, {
+    paramsSerializer: qsRepeatParams,
+  });
+};
+export const userPermissionQuery = (userId) => {
+  return $postParam("/api/admin/user/permission/query", { userId });
+};
+export const userPermissionSave = (datas) => {
+  return $post("/api/admin/user/permission/save", datas);
+};

+ 21 - 0
src/modules/base/router.js

@@ -0,0 +1,21 @@
+import UserManage from "./user/UserManage.vue";
+// import OrgManage from "./views/OrgManage.vue";
+// import WeChatAppManage from "./views/WeChatAppManage.vue";
+
+export default [
+  {
+    path: "user-manage",
+    name: "UserManage",
+    component: UserManage,
+  },
+  // {
+  //   path: "org-manage",
+  //   name: "OrgManage",
+  //   component: OrgManage,
+  // },
+  // {
+  //   path: "wxapp-manage",
+  //   name: "WeChatAppManage",
+  //   component: WeChatAppManage,
+  // },
+];

+ 206 - 0
src/modules/base/user/ModifyPrivilege.vue

@@ -0,0 +1,206 @@
+<template>
+  <div>
+    <el-dialog
+      class="page-dialog privilege-dialog"
+      :visible.sync="modalIsShow"
+      top="10px"
+      width="1000px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :show-close="false"
+      append-to-body
+      fullscreen
+      @opened="visibleChange"
+    >
+      <div class="box-justify" slot="title">
+        <h3>权限设置-{{ user.name }}</h3>
+        <div>
+          <el-button
+            size="mini"
+            type="primary"
+            :disabled="isSubmit"
+            @click="submit"
+            >确定</el-button
+          >
+          <el-button size="mini" type="danger" plain @click="cancel"
+            >取消</el-button
+          >
+        </div>
+      </div>
+      <div class="part-box part-box-pad">
+        <div v-for="item in dataList" :key="item.id" class="privilege-group">
+          <div class="privilege-group-title">
+            <h3>{{ item.title }}</h3>
+          </div>
+          <div class="privilege-group-body">
+            <div
+              v-for="option in item.options"
+              :key="option.code"
+              :class="[
+                'privilege-item',
+                { 'privilege-item-scope': option.dataPrivilege },
+              ]"
+            >
+              <el-checkbox v-model="option.selected">{{
+                option.name
+              }}</el-checkbox>
+              <privilege-scope-edit
+                v-if="option.dataPrivilege && option.selected"
+                v-model="option.scope"
+                :source-list="getSourceList(option.dataPrivilege)"
+              ></privilege-scope-edit>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { privilegeConfig } from "@/constants/privilege";
+import PrivilegeScopeEdit from "./PrivilegeScopeEdit.vue";
+import { appList, envList, deployList } from "../../admin/api";
+import { userPermissionQuery, userPermissionSave } from "../api";
+
+export default {
+  name: "modify-privilege",
+  components: { PrivilegeScopeEdit },
+  props: {
+    user: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      dataList: [],
+      curRow: {},
+      sources: {},
+      isSubmit: false,
+    };
+  },
+  mounted() {
+    this.getScources();
+  },
+  methods: {
+    visibleChange() {
+      this.initData();
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async getScources() {
+      const fetchFuncMap = {
+        app: this.fetchAppList,
+        env: this.fetchEnvList,
+        deploy: this.fetchDeployList,
+      };
+
+      let sources = {};
+      const sourceKeys = Object.keys(fetchFuncMap);
+      for (let i = 0; i < sourceKeys.length; i++) {
+        const sourceKey = sourceKeys[i];
+        sources[sourceKey] = await fetchFuncMap[sourceKey]();
+      }
+      this.sources = sources;
+    },
+    async fetchAppList() {
+      return await appList();
+    },
+    async fetchEnvList() {
+      const data = await envList();
+      return this.parseGroupData(data);
+    },
+    async fetchDeployList() {
+      const data = await deployList();
+      return this.parseGroupData(data);
+    },
+    parseGroupData(data) {
+      let groups = {};
+      let groupId = 1;
+      data.forEach((item) => {
+        if (!groups[item.appCode]) {
+          groups[item.appCode] = {
+            id: groupId++,
+            name: item.appName,
+            code: item.appCode,
+            children: [],
+          };
+        }
+
+        groups[item.appCode].children.push({
+          id: item.id,
+          name: `${item.appName}-${item.name}`,
+        });
+      });
+
+      Object.values(groups).forEach((item) => {
+        item.children.sort((a, b) => a.id - b.id);
+      });
+
+      return Object.values(groups);
+    },
+    getSourceList(dataPrivilege) {
+      const sourceKey = dataPrivilege.split(".")[0];
+      return this.sources[sourceKey] || [];
+    },
+    async initData() {
+      const res = await userPermissionQuery(this.user.id);
+      let userPrivilege = {};
+      const privilegeData = res || [];
+      privilegeData.forEach((item) => {
+        userPrivilege[item.code] = item.scope;
+      });
+
+      let dataList = privilegeConfig.map((item) => {
+        let nitem = { id: this.$randomCode(), title: item.title };
+        nitem.options = item.options.map((option) => {
+          return {
+            ...option,
+            selected: !!userPrivilege[option.code],
+            scope: userPrivilege[option.code] || "*",
+          };
+        });
+        return nitem;
+      });
+      this.dataList = dataList;
+    },
+    getData() {
+      let data = [];
+      this.dataList.forEach((item) => {
+        item.options.forEach((option) => {
+          if (!option.selected) return;
+          data.push({ code: option.code, scope: option.scope });
+        });
+      });
+      return data;
+    },
+    async submit() {
+      const data = this.getData();
+      if (!data.length) {
+        this.$message.error("请设置权限!");
+        return;
+      }
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const res = await userPermissionSave({
+        userId: this.user.id,
+        permission: data,
+      }).catch(() => {});
+      this.isSubmit = false;
+      if (!res) return;
+      this.$message.success("设置成功!");
+      this.$emit("modified");
+      this.cancel;
+    },
+  },
+};
+</script>

+ 1 - 1
src/modules/admin/components/ModifyUser.vue → src/modules/base/user/ModifyUser.vue

@@ -65,7 +65,7 @@
 
 <script>
 import { userInsertOrUpdate } from "../api";
-import { password } from "../../../plugins/formRules";
+import { password } from "@/plugins/formRules";
 
 const initModalForm = {
   id: "",

+ 100 - 0
src/modules/base/user/PrivilegeScopeEdit.vue

@@ -0,0 +1,100 @@
+<template>
+  <div class="privilege-scope-edit">
+    <span class="scope-edit-label">数据范围:</span>
+    <div class="scope-edit-content">
+      <div>
+        <span class="mr-2" v-if="!selectedScopes.length">无限制</span>
+        <el-button
+          class="btn-primary cont-edit"
+          size="medium"
+          type="text"
+          @click="toSelect"
+          >编辑</el-button
+        >
+      </div>
+
+      <el-tag
+        v-for="item in selectedScopes"
+        :key="item.id"
+        effect="dark"
+        type="primary"
+        style="margin-right: 5px; margin-bottom: 5px"
+        >{{ item.name }}</el-tag
+      >
+    </div>
+    <!-- SelectScopeDialog -->
+    <select-scope-dialog
+      ref="SelectScopeDialog"
+      :selected="selectedScopeIds"
+      :source-list="sourceList"
+      @modified="scopeChange"
+    ></select-scope-dialog>
+  </div>
+</template>
+
+<script>
+import SelectScopeDialog from "./SelectScopeDialog.vue";
+
+export default {
+  name: "privilege-scope-edit",
+  components: { SelectScopeDialog },
+  props: {
+    value: {
+      type: String,
+      default: "",
+    },
+    sourceList: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        if (!val || val === "*") {
+          this.selectedScopeIds = [];
+          this.selectedScopes = [];
+        } else {
+          this.selectedScopeIds = val.split(",").map((item) => item * 1);
+          this.getSelectedScopes(this.selectedScopeIds);
+        }
+      },
+    },
+  },
+  data() {
+    return {
+      selectedScopes: [],
+      selectedScopeIds: [],
+    };
+  },
+  methods: {
+    toSelect() {
+      this.$refs.SelectScopeDialog.open();
+    },
+    getSelectedScopes(selectedScopeIds) {
+      let selectedScopes = [];
+      const search = (dataList) => {
+        dataList.forEach((item) => {
+          if (selectedScopeIds.includes(item.id)) {
+            selectedScopes.push({ id: item.id, name: item.name });
+          }
+          if (item.children && item.children.length) {
+            search(item.children);
+          }
+        });
+      };
+      search(this.sourceList);
+      this.selectedSources = selectedScopes;
+    },
+    scopeChange(selectedSources) {
+      this.selectedSources = selectedSources;
+      const scope = this.selectedScopes.map((item) => item.id).join();
+      this.$emit("input", scope || "*");
+      this.$emit("change", scope || "*");
+    },
+  },
+};
+</script>

+ 133 - 0
src/modules/base/user/SelectScopeDialog.vue

@@ -0,0 +1,133 @@
+<template>
+  <el-dialog
+    class="select-scope-dialog"
+    :visible.sync="modalIsShow"
+    title="选择范围"
+    top="10px"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <el-row type="flex" :gutter="10">
+      <el-col :span="12">
+        <div class="select-search">
+          <el-input
+            v-model="filterLabel"
+            placeholder="请输入名称"
+            clearable
+            size="mini"
+            prefix-icon="el-icon-search"
+            @input="labelChange"
+          ></el-input>
+        </div>
+        <div class="select-tree">
+          <el-tree
+            ref="DataTree"
+            :data="dataList"
+            node-key="id"
+            :default-checked-keys="selectedSourceIds"
+            :props="defaultProps"
+          >
+          </el-tree>
+        </div>
+      </el-col>
+      <el-col :span="12">
+        <div class="select-part-title">已选范围</div>
+        <div class="select-list">
+          <div
+            v-for="item in selectedSources"
+            :key="item.id"
+            class="select-item"
+          >
+            <p class="select-cont">
+              <span>{{ item.name }}</span>
+            </p>
+            <el-button
+              class="select-delete"
+              type="text"
+              icon="el-icon-remove"
+              @click="toDelete(user)"
+            ></el-button>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+
+    <div slot="footer">
+      <el-button type="primary" @click="submit">确认</el-button>
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { deepCopy } from "@/plugins/utils";
+export default {
+  name: "select-scope-dialog",
+  props: {
+    selected: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+    sourceList: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      filterLabel: "",
+      dataList: [],
+      selectedSources: [],
+      selectedSourceIds: [],
+      defaultProps: {
+        children: "children",
+        label: "name",
+      },
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.dataList = deepCopy(this.sourceList);
+      this.filterLabel = "";
+
+      this.$refs.DataTree.setCheckedKeys(this.selectedSourceIds);
+      const selectedData = this.$refs.DataTree.getCheckedNodes(true);
+      this.selectedSources = selectedData.map((item) => {
+        return {
+          id: item.id,
+          name: item.name,
+        };
+      });
+      this.selectedSourceIds = this.selectedData.map((item) => item.id);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    labelChange() {
+      this.$refs.DataTree.filter(this.filterLabel);
+      this.$refs.DataTree.setCheckedKeys(this.selectedSourceIds);
+    },
+    toDelete(data) {
+      const pos = this.selectedSources.findIndex((item) => item.id === data.id);
+      this.selectedSources.splice(pos, 1);
+      this.selectedSourceIds = this.selectedSources.map((item) => item.id);
+      this.$refs.DataTree.setCheckedKeys(this.selectedSourceIds);
+    },
+    submit() {
+      this.$emit("modified", this.selectedSources);
+      this.cancel();
+    },
+  },
+};
+</script>

+ 26 - 8
src/modules/admin/views/UserManage.vue → src/modules/base/user/UserManage.vue

@@ -44,7 +44,10 @@
 
         <el-form-item label-width="0px">
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button v-if="checkPrivilege('add')" type="success" @click="toAdd"
+          <el-button
+            v-if="checkPrivilege('USER_INSERT')"
+            type="success"
+            @click="toAdd"
             >新增</el-button
           >
         </el-form-item>
@@ -85,28 +88,32 @@
           }}</span>
         </el-table-column>
         <el-table-column
+          v-if="checkPrivilege('USER_EDIT')"
           class-name="action-column"
           label="操作"
-          width="160px"
+          width="140"
           fixed="right"
         >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('edit')"
               class="btn-primary"
               type="text"
               @click="toEdit(scope.row)"
               >编辑</el-button
             >
             <el-button
-              v-if="checkPrivilege('enable')"
+              class="btn-primary"
+              type="text"
+              @click="toEditPrivilege(scope.row)"
+              >权限设置</el-button
+            >
+            <el-button
               :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
               type="text"
               @click="toEnable(scope.row)"
               >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
             >
             <el-button
-              v-if="checkPrivilege('resetPwd')"
               class="btn-danger"
               type="text"
               @click="toResetPwd(scope.row)"
@@ -130,23 +137,30 @@
 
     <!-- ModifyUser -->
     <modify-user
-      v-if="checkPrivilege('edit') || checkPrivilege('add')"
+      v-if="checkPrivilege('USER_EDIT') || checkPrivilege('USER_INSERT')"
       ref="ModifyUser"
       :instance="curUser"
       :roles="roles"
       @modified="getList"
     ></modify-user>
+    <!-- ModifyPrivilege -->
+    <modify-privilege
+      v-if="checkPrivilege('USER_EDIT')"
+      ref="ModifyPrivilege"
+      :user="curUser"
+    ></modify-privilege>
   </div>
 </template>
 
 <script>
-import ModifyUser from "../components/ModifyUser";
+import ModifyUser from "./ModifyUser";
+import ModifyPrivilege from "./ModifyPrivilege";
 import { userListPage, userRoleList, userInsertOrUpdate } from "../api";
 import { ABLE_TYPE } from "../../../constants/enumerate";
 
 export default {
   name: "user-manage",
-  components: { ModifyUser },
+  components: { ModifyUser, ModifyPrivilege },
   data() {
     return {
       filter: {
@@ -242,6 +256,10 @@ export default {
       row.enable = enable;
       this.$message.success("操作成功!");
     },
+    toEditPrivilege(row) {
+      this.curUser = row;
+      this.$refs.ModifyPrivilege.open();
+    },
   },
 };
 </script>

+ 9 - 0
src/modules/login/views/Login.vue

@@ -115,6 +115,15 @@ export default {
       }
       this.$ls.set("token", data.token);
       this.$ls.set("user", data);
+
+      const permissions = data.permissions || [];
+      let privilegeMap = {};
+      permissions.forEach((item) => {
+        privilegeMap[item.code] = item.scope;
+      });
+      this.$store.commit("setPrivilegeMap", privilegeMap);
+      this.$ls.set("privilegeMap", privilegeMap);
+
       await this.getOrgTypes();
       this.$router.push({
         name: "Home",

+ 2 - 1
src/router.js

@@ -5,6 +5,7 @@ import Home from "./views/Home.vue";
 import login from "./modules/login/router";
 // module-admin
 import admin from "./modules/admin/router";
+import base from "./modules/base/router";
 
 // ignore NavigationDuplicated. https://github.com/vuejs/vue-router/issues/2881
 const originalPush = Router.prototype.push;
@@ -34,7 +35,7 @@ let router = new Router({
       path: "/admin",
       name: "Home",
       component: Home,
-      children: [...admin],
+      children: [...admin, ...base],
     },
     // [lazy-loaded] route level code-splitting
     // {

+ 4 - 1
src/store.js

@@ -3,10 +3,13 @@ import Vuex from "vuex";
 
 Vue.use(Vuex);
 
+const privilegeMapData = window.sessionStorage.getItem("vs_privilegeMap");
+const privilegeMap = privilegeMapData ? JSON.parse(privilegeMapData).value : {};
+
 export default new Vuex.Store({
   state: {
     user: {},
-    privilegeMap: {},
+    privilegeMap,
   },
   mutations: {
     setUser(state, user) {

+ 10 - 25
src/views/Home.vue

@@ -79,7 +79,7 @@
 </template>
 
 <script>
-import { navs, ROLE_NAV } from "@/constants/navs";
+import { navs } from "@/constants/navs";
 import { APP_TITLE } from "../constants/app";
 import ResetPwd from "../modules/admin/components/ResetPwd";
 
@@ -115,11 +115,10 @@ export default {
   },
   methods: {
     initData() {
-      this.privileges = this.getPrivileges(navs);
       this.menus = this.getMenu();
 
       if (this.$route.name === "Home") {
-        console.log(this.getMenuFirstRouter());
+        // console.log(this.getMenuFirstRouter());
         this.$router.replace({ name: this.getMenuFirstRouter() });
         return;
       }
@@ -133,26 +132,6 @@ export default {
 
       this.updateBreadcrumbs();
     },
-    getPrivileges(navList) {
-      let privilegesUrls = [];
-      let privilegeMap = {};
-      this.userRoles.forEach((role) => {
-        const navs = ROLE_NAV[role] || [];
-        const urls = navs.map((item) => item.url);
-        navs.forEach((nav) => {
-          if (!privilegeMap[nav.url]) {
-            privilegeMap[nav.url] = new Set();
-          }
-          if (nav.privilege)
-            nav.privilege.forEach((elem) => privilegeMap[nav.url].add(elem));
-        });
-
-        privilegesUrls.push(...urls);
-      });
-      this.$store.commit("setPrivilegeMap", privilegeMap);
-
-      return navList.filter((item) => privilegesUrls.includes(item.url));
-    },
     getMenuFirstRouter() {
       let firstRouteName = "";
       let menu = this.menus[0];
@@ -164,9 +143,15 @@ export default {
       return firstRouteName;
     },
     getMenu() {
+      const privilegeMap = this.$store.state.privilegeMap;
       const getChildren = (id) => {
-        return this.privileges
-          .filter((item) => item.parentId === id)
+        return navs
+          .filter(
+            (item) =>
+              item.parentId === id &&
+              (!item.privilege ||
+                (item.privilege && privilegeMap[item.privilege]))
+          )
           .map((item) => {
             return { ...item };
           });