From c7376f8d1091b70597ba4430a281496b585b386e Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期四, 23 十月 2025 21:58:26 +0800
Subject: [PATCH] 钥匙柜

---
 admin/src/components/system/role/PermissionConfigWindow.vue |   97 +++++++++++++++++++++++++-----------------------
 1 files changed, 51 insertions(+), 46 deletions(-)

diff --git a/admin/src/components/system/role/PermissionConfigWindow.vue b/admin/src/components/system/role/PermissionConfigWindow.vue
index 17476a0..468b73d 100644
--- a/admin/src/components/system/role/PermissionConfigWindow.vue
+++ b/admin/src/components/system/role/PermissionConfigWindow.vue
@@ -1,32 +1,31 @@
 <template>
   <GlobalWindow
+    class="permission-config-dialog"
     :visible.sync="visible"
     :confirm-working="isWorking"
-    width="582px"
-    title="閰嶇疆瑙掕壊鏉冮檺"
+    width="576px"
+    title="鎺堟潈鏉冮檺"
     @confirm="confirm"
   >
     <p class="tip" v-if="role != null">涓鸿鑹� <em>{{role.name}}</em> 閰嶇疆鏉冮檺</p>
-    <p class="tip-warn"><i class="el-icon-warning"></i>鎻愰啋锛氭潈闄愰厤缃悗闇�閲嶆柊鐧诲綍鍚庣敓鏁�</p>
-    <el-transfer
-      ref="permissionTransfer"
-      v-model="selectedIds"
-      filterable
-      :filter-method="filterPermissions"
-      :titles="['鏈巿鏉冩潈闄�', '宸叉巿鏉冩潈闄�']"
-      :props="{
-        key: 'id',
-        label: 'name'
-      }"
-      :data="permissions">
-    </el-transfer>
+    <el-tree
+      ref="tree"
+      :data="permissions"
+      show-checkbox
+      node-key="id"
+      default-expand-all
+      :default-checked-keys="selectedIds"
+      :expand-on-click-node="false"
+      :check-on-click-node="true"
+      :props="{children: 'children',label: 'name'}">
+    </el-tree>
   </GlobalWindow>
 </template>
 
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
 import { createRolePermission } from '@/api/system/role'
-import { fetchAll } from '@/api/system/permission'
+import { fetchTree } from '@/api/system/permission'
 export default {
   name: 'PermissionConfigWindow',
   components: { GlobalWindow },
@@ -44,24 +43,18 @@
   },
   methods: {
     /**
-     * @role 瑙掕壊瀵硅薄
+     * 鎵撳紑绐楀彛
+     *
+     * @param role 鐩爣瑙掕壊
      */
     open (role) {
-      if (this.$refs.permissionTransfer) {
-        this.$refs.permissionTransfer.clearQuery('left')
-        this.$refs.permissionTransfer.clearQuery('right')
-      }
-      fetchAll()
+      fetchTree()
         .then(records => {
           this.role = role
           this.permissions = records
           // 濡傛灉涓哄浐瀹氳鑹诧紝鍒欏浐瀹氭潈闄愪笉鍙洿鏀�
           if (this.role.fixed) {
-            for (const perm of this.permissions) {
-              if (perm.fixed) {
-                perm.disabled = true
-              }
-            }
+            this.__handleFixedPermissions(this.permissions)
           }
           this.selectedIds = role.permissions.map(r => r.id)
           this.visible = true
@@ -70,17 +63,22 @@
           this.$tip.apiFailed(e)
         })
     },
-    // 纭閫夋嫨鏉冮檺
+    /**
+     * 纭閫夋嫨鏉冮檺
+     */
     confirm () {
+      const selectedPermissions = this.$refs.tree.getCheckedNodes(false, true).filter(item => item.type !== 'module').map(item => item.id)
       this.isWorking = true
       createRolePermission({
         roleId: this.role.id,
-        permissionIds: this.selectedIds
+        permissionIds: selectedPermissions
       })
         .then(() => {
-          this.$tip.apiSuccess('鏉冮檺閰嶇疆鎴愬姛锛岀敤鎴烽噸鏂扮櫥褰曞悗鐢熸晥')
           this.visible = false
           this.$emit('success')
+          setTimeout(() => {
+            this.$dialog.attentionConfirm('鏉冮檺閰嶇疆鎴愬姛锛岀敤鎴烽渶閲嶆柊鐧诲綍鍚庣敓鏁�').then(() => {})
+          }, 300)
         })
         .catch(e => {
           this.$tip.apiFailed(e)
@@ -89,10 +87,29 @@
           this.isWorking = false
         })
     },
-    // 鎼滅储鏉冮檺
-    filterPermissions (query, item) {
-      const lowerCaseQuery = query.toLowerCase()
-      return item.code.toLowerCase().indexOf(lowerCaseQuery) > -1 || item.name.toLowerCase().indexOf(lowerCaseQuery) > -1
+    /**
+     * 澶勭悊鍥哄畾鏉冮檺
+     *
+     * @param permissions 鏉冮檺鍒楄〃
+     * @param module 鎵�灞炴ā鍧�
+     * @private
+     */
+    __handleFixedPermissions (permissions, module) {
+      if (permissions == null) {
+        return
+      }
+      for (const permission of permissions) {
+        if (permission.type !== 'module') {
+          if (permission.fixed) {
+            permission.disabled = true
+            if (module != null) {
+              module.disabled = true
+            }
+          }
+          continue
+        }
+        this.__handleFixedPermissions(permission.children, permission)
+      }
     }
   }
 }
@@ -106,18 +123,6 @@
       font-style: normal;
       color: $primary-color;
       font-weight: bold;
-    }
-  }
-  .tip-warn {
-    margin: 4px 0 12px 0;
-    font-size: 12px;
-    color: #999;
-    i {
-      color: orange;
-      margin-right: 4px;
-      font-size: 14px;
-      position: relative;
-      top: 1px;
     }
   }
 }

--
Gitblit v1.9.3