diff --git a/src/store/getters.js b/src/store/getters.js index 200de1f..8e471fe 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -12,6 +12,8 @@ id: state => state.user.id, name: state => state.user.name, nickName: state => state.user.nickName, + isAdmin: state => state.user.isAdmin, + parentId: state => state.user.parentId, introduction: state => state.user.introduction, roles: state => state.user.roles, permissions: state => state.user.permissions, diff --git a/src/store/modules/user.js b/src/store/modules/user.js index ed86cc4..58ad72f 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -12,6 +12,8 @@ const user = { name: '', nickName: '', avatar: '', + isAdmin: false, + parentId: '', roles: [], permissions: [] }, @@ -32,6 +34,12 @@ const user = { SET_AVATAR: (state, avatar) => { state.avatar = avatar }, + SET_IS_ADMIN: (state, isAdmin) => { + state.isAdmin = isAdmin + }, + SET_PARENT_ID: (state, parentId) => { + state.parentId = parentId + }, SET_ROLES: (state, roles) => { state.roles = roles }, @@ -65,6 +73,8 @@ const user = { res=res.data; const user = res.user + const userId = user.userId !== undefined && user.userId !== null ? user.userId : user.id + const userName = user.userName || user.account || "" let avatar = user.avatar || "" if (!isHttp(avatar)) { avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar @@ -75,10 +85,12 @@ const user = { } else { commit('SET_ROLES', ['ROLE_DEFAULT']) } - commit('SET_ID', user.userId) - commit('SET_NAME', user.userName) + commit('SET_ID', userId) + commit('SET_NAME', userName) commit('SET_NICK_NAME', user.nickName) commit('SET_AVATAR', avatar) + commit('SET_IS_ADMIN', user.isAdmin === true || user.isAdmin === 1 || user.isAdmin === "1") + commit('SET_PARENT_ID', user.parentId !== undefined && user.parentId !== null ? String(user.parentId) : '') /* 初始密码提示 */ if(res.isDefaultModifyPwd) { MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { @@ -107,6 +119,8 @@ const user = { reject(error) }).finally(() => { commit('SET_TOKEN', '') + commit('SET_IS_ADMIN', false) + commit('SET_PARENT_ID', '') commit('SET_ROLES', []) commit('SET_PERMISSIONS', []) removeToken() @@ -118,6 +132,8 @@ const user = { FedLogOut({ commit }) { return new Promise(resolve => { commit('SET_TOKEN', '') + commit('SET_IS_ADMIN', false) + commit('SET_PARENT_ID', '') removeToken() resolve() }) diff --git a/src/views/device/device/index.vue b/src/views/device/device/index.vue index 3a35ad1..09862f4 100644 --- a/src/views/device/device/index.vue +++ b/src/views/device/device/index.vue @@ -74,13 +74,13 @@ > --> - + {{ $t("device.button.import") }} - + {{ $t("device.button.claim") }} - + {{ $t("device.button.pendingActivate") }} @@ -89,7 +89,7 @@ {{ $t("device.button.batchDisable") }} - + {{ $t("device.button.assign") }} @@ -696,6 +696,11 @@ export default { importResultColumns() { return this.$store.getters.device === "mobile" ? 1 : 2; }, + canManageDeviceMenus() { + const isAdmin = this.$store.getters.isAdmin === true; + const parentId = this.$store.getters.parentId; + return isAdmin || String(parentId) === "0"; + }, canSearchByEmployee() { const permissions = this.$store.getters.permissions || []; return permissions.includes("*:*:*") diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index c8d5924..5e646fb 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -285,7 +285,7 @@ export default { }, getMenuTreeselect() { menuTreeselect().then((response) => { - this.menuOptions = response.data; + this.menuOptions = this.filterRoleMenuOptions(response.data); }); }, getMenuAllCheckedKeys() { @@ -302,10 +302,41 @@ export default { }, getRoleMenuTreeselect(roleId) { return roleMenuTreeselect(roleId).then((response) => { - this.menuOptions = response.menus; + this.menuOptions = this.filterRoleMenuOptions(response.menus); return response; }); }, + filterRoleMenuOptions(options) { + const source = Array.isArray(options) ? options : []; + return source.map((item) => this.filterRoleMenuNode(item)).filter(Boolean); + }, + filterRoleMenuNode(node) { + if (!node || typeof node !== "object") { + return null; + } + const current = { + ...node, + }; + const children = Array.isArray(node.children) ? node.children : []; + if (String(current.id) === "1" || current.label === "系统管理") { + return null; + } + current.children = children + .map((item) => this.filterRoleMenuNode(item)) + .filter(Boolean); + return current; + }, + collectTreeNodeIds(treeNodes, idSet = new Set()) { + const nodes = Array.isArray(treeNodes) ? treeNodes : []; + nodes.forEach((node) => { + if (!node || node.id === undefined || node.id === null) { + return; + } + idSet.add(node.id); + this.collectTreeNodeIds(node.children, idSet); + }); + return idSet; + }, getDeptTree(roleId) { return deptTreeSelect(roleId).then((response) => { this.deptOptions = response.depts; @@ -422,7 +453,8 @@ export default { this.open = true; this.$nextTick(() => { roleMenu.then((res) => { - const checkedKeys = res.checkedKeys; + const visibleIdSet = this.collectTreeNodeIds(this.menuOptions); + const checkedKeys = (res.checkedKeys || []).filter((id) => visibleIdSet.has(id)); checkedKeys.forEach((value) => { this.$nextTick(() => { this.$refs.menu.setChecked(value, true, false);