From 9057e04efad1b7d61c77a72e5c37a504d0aee935 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 26 九月 2025 09:24:03 +0800
Subject: [PATCH] H5静态化

---
 admin/src/components/system/role/PermissionConfigWindow.vue |  127 ++++++++++++++++++++----------------------
 1 files changed, 60 insertions(+), 67 deletions(-)

diff --git a/admin/src/components/system/role/PermissionConfigWindow.vue b/admin/src/components/system/role/PermissionConfigWindow.vue
index 4a08fbf..468b73d 100644
--- a/admin/src/components/system/role/PermissionConfigWindow.vue
+++ b/admin/src/components/system/role/PermissionConfigWindow.vue
@@ -1,24 +1,35 @@
 <template>
-  <GlobalWindow :visible.sync="visible" :confirm-working="isWorking" width="80%" 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 class="transfer"
-      :filter-method="filterPermissions" :titles="['鏈巿鏉冩潈闄�', '宸叉巿鏉冩潈闄�']" :props="{
-        key: 'id',
-        label: 'name'
-      }" :data="permissions">
-    </el-transfer>
+  <GlobalWindow
+    class="permission-config-dialog"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    width="576px"
+    title="鎺堟潈鏉冮檺"
+    @confirm="confirm"
+  >
+    <p class="tip" v-if="role != null">涓鸿鑹� <em>{{role.name}}</em> 閰嶇疆鏉冮檺</p>
+    <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 },
-  data() {
+  data () {
     return {
       visible: false,
       isWorking: false,
@@ -32,24 +43,18 @@
   },
   methods: {
     /**
-     * @role 瑙掕壊瀵硅薄
+     * 鎵撳紑绐楀彛
+     *
+     * @param role 鐩爣瑙掕壊
      */
-    open(role) {
-      if (this.$refs.permissionTransfer) {
-        this.$refs.permissionTransfer.clearQuery('left')
-        this.$refs.permissionTransfer.clearQuery('right')
-      }
-      fetchAll()
+    open (role) {
+      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
@@ -58,17 +63,22 @@
           this.$tip.apiFailed(e)
         })
     },
-    // 纭閫夋嫨鏉冮檺
-    confirm() {
+    /**
+     * 纭閫夋嫨鏉冮檺
+     */
+    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)
@@ -77,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)
+      }
     }
   }
 }
@@ -88,7 +117,6 @@
 
 <style scoped lang="scss">
 @import "@/assets/style/variables.scss";
-
 .global-window {
   .tip {
     em {
@@ -96,41 +124,6 @@
       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;
-    }
-  }
-}
-
-.transfer {
-  height: 600px;
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-
-  ::v-deep .el-transfer-panel {
-    flex: 1;
-    height: 100%;
-  }
-
-  ::v-deep .el-transfer-panel__body {
-    height: 500px;
-  }
-
-  ::v-deep .el-transfer-panel__list.is-filterable {
-    height: 480px;
   }
 }
 </style>

--
Gitblit v1.9.3