Просмотр исходного кода

feat(admin): 菜单管理全量初始化 + Layout动态加载

后端:
- admin_menu种子数据从18条扩展至100+条,覆盖全部现有菜单项
  家庭运营/任务中心/审核中心/商城营销/知识中心/活动管理/
  健康饮食/报告解析/家庭服务/业务管理/测评咨询/系统配置/菜单管理

前端:
- Layout.vue新增fetchMenu()方法,启动时从/api/admin/menu/tree加载菜单
- buildMenuItems()将树形结构转换为el-menu所需格式
- 接口失败时降级使用硬编码菜单(向后兼容)
- 菜单管理页可实时修改左侧导航
iwt 1 месяц назад
Родитель
Сommit
cea9fb2be8

Разница между файлами не показана из-за своего большого размера
+ 0 - 19
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java


+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-8ced2ae49f4cbc0b73944b307a1243d02c86a311
+3d88e179126905d71d31fa0bd4cab0ba441e742f

+ 35 - 0
cfc-web/src/views/Layout.vue

@@ -158,6 +158,7 @@ import { updateAdminInfo } from '@/api/admin'
 import { getMyInviteCode } from '@/api/guide'
 import { getUnreadMessageCount } from '@/api/teacherMessage'
 import { getEffectivePermissions, hasPermission, getRoleLabel } from '@/utils/permissions'
+import axios from 'axios'
 
 export default {
   data() {
@@ -421,6 +422,8 @@ export default {
     if (hasPermission(this.effectivePerms, 'messages') && this.currentRole !== 'admin') {
       this.fetchUnreadCount()
     }
+    // 从后端加载菜单,失败则使用硬编码菜单
+    this.fetchMenu()
   },
   beforeDestroy() {
     window.removeEventListener('resize', this.handleResize)
@@ -456,6 +459,38 @@ export default {
         }
       }
     },
+    async fetchMenu() {
+      try {
+        var res = await axios.post('/api/admin/menu/tree')
+        if (res.data && res.data.code === 200 && res.data.data && res.data.data.length > 0) {
+          this.menuItems = this.buildMenuItems(res.data.data)
+        }
+      } catch (e) {
+        console.warn('菜单加载失败,使用本地菜单', e)
+      }
+    },
+    buildMenuItems(nodes) {
+      var result = []
+      for (var i = 0; i < nodes.length; i++) {
+        var n = nodes[i]
+        var item = {}
+        if (n.path) {
+          item.path = n.path
+          item.label = n.name
+          item.icon = n.icon || 'el-icon-menu'
+          item.perm = n.perm || ''
+        } else {
+          item.title = n.name
+          item.icon = n.icon || 'el-icon-menu'
+          item.perm = n.perm || ''
+        }
+        if (n.children && n.children.length > 0) {
+          item.children = this.buildMenuItems(n.children)
+        }
+        result.push(item)
+      }
+      return result
+    },
     handleProfileCommand(command) {
       if (command === 'profile') {
         this.loadAdminInfo()

Некоторые файлы не были показаны из-за большого количества измененных файлов