Browse Source

refactor(菜单): 重构租户默认菜单生成逻辑

- 移除了 SysMenuService 中的种子菜单数据加载代码
- 重构了 SysTenantService 中的 GetTenantDefaultMenuList 方法
- 新增了 GetSeedDataTypes 方法,用于动态加载种子菜单数据
- 优化了菜单数据的加载和处理逻辑,支持多层级菜单生成
jobily 1 year ago
parent
commit
ffe585e973

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -275,7 +275,7 @@ public class SysMenuService : IDynamicApiController, ITransient
                 var menuIds = _sysTenantMenuRep.AsQueryable().Where(u => u.TenantId == tenantId).ToList(u => u.MenuId) ?? new();
 
                 // 种子菜单
-                menuIds.AddRange(new SysMenuSeedData().HasData().Select(u => u.Id).ToList());
+                //menuIds.AddRange(new SysMenuSeedData().HasData().Select(u => u.Id).ToList());
 
                 menuIds = menuIds.Distinct().ToList();
                 query = _sysMenuRep.AsQueryable().InnerJoinIF<SysTenantMenu>(false, (u, t) => true).Where(u => menuIds.Contains(u.Id));

+ 41 - 21
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -310,32 +310,37 @@ public class SysTenantService : IDynamicApiController, ITransient
     public IEnumerable<SysTenantMenu> GetTenantDefaultMenuList(bool ignoreHome = false)
     {
         var menuList = new List<SysMenu>();
-        var allMenuList = new SysMenuSeedData().HasData().ToList();
 
-        var dashboardMenu = allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "工作台");
-        menuList.AddRange(allMenuList.ToChildList(u => u.Id, u => u.Pid, dashboardMenu.Id));
-        if (ignoreHome) menuList = menuList.Where(u => !(u.Type == MenuTypeEnum.Menu && u.Name == "home")).ToList();
+        // 默认数据库配置
+        var defaultConfig = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault();
+        //从程序集中获取种子菜单数据,种子菜单存在于其他类库中,需要动态加载
+        var menuSeedDataTypeList = GetSeedDataTypes(defaultConfig, nameof(SysMenuSeedData));
+        var allMenuList = new List<SysMenu>();
+        foreach (var menu in menuSeedDataTypeList)
+        {
+            var menuSeedDataList = ((IEnumerable)menu.GetMethod("HasData")?.Invoke(Activator.CreateInstance(menu), null))?.Cast<SysMenu>();
+            if (menuSeedDataList != null)
+            {
+                allMenuList.AddRange(menuSeedDataList);
+            }
+        }
 
-        var systemMenu = allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "系统管理");
-        menuList.Add(systemMenu);
-        menuList.AddRange(allMenuList.ToChildList(u => u.Id, u => u.Pid, u => u.Pid == systemMenu.Id && new[] { "账号管理", "角色管理", "机构管理", "职位管理", "个人中心", "通知公告" }.Contains(u.Title)));
+        //实现三个层级的菜单
+        var topMenuList = allMenuList.Where(u => u.Pid == 0 && u.Type == MenuTypeEnum.Dir).ToList();
+        menuList.AddRange(topMenuList);
 
-        var platformMenu = allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "平台管理");
-        menuList.Add(platformMenu);
-        menuList.AddRange(allMenuList.ToChildList(u => u.Id, u => u.Pid, u => u.Pid == platformMenu.Id && new[] { "菜单管理", "字典管理", "模板管理", "系统配置" }.Contains(u.Title)));
-        var dictMenu = menuList.First(u => u.Type == MenuTypeEnum.Menu && u.Title == "字典管理");
-        menuList = menuList.Where(u => u.Pid != dictMenu.Id || !new[] { "编辑", "删除" }.Contains(u.Title)).ToList();
+        var childMenuList = allMenuList.ToChildList(u => u.Id, u => u.Pid, u => topMenuList.Select(p => p.Id).Contains(u.Pid));
+        menuList.AddRange(childMenuList);
 
-        var logMenu = allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "日志管理");
-        menuList.Add(logMenu);
-        menuList.AddRange(allMenuList.ToChildList(u => u.Id, u => u.Pid, u => u.Pid == logMenu.Id && new[] { "访问日志", "操作日志" }.Contains(u.Title)));
-        var logMenuIds = menuList.Where(u => u.Type == MenuTypeEnum.Menu && new[] { "访问日志", "操作日志" }.Contains(u.Title)).Select(u => u.Id).ToList();
-        menuList = menuList.Where(u => !logMenuIds.Contains(u.Pid) || !new[] { "清空" }.Contains(u.Title)).ToList();
+        var endMenuList = allMenuList.ToChildList(u => u.Id, u => u.Pid, u => childMenuList.Select(p => p.Id).Contains(u.Pid));
+        if (endMenuList != null)
+        {
+            menuList.AddRange(endMenuList);
+        }
+        //是否需要排除首页菜单
+        if (ignoreHome) menuList = menuList.Where(u => !(u.Type == MenuTypeEnum.Menu && u.Name == "home")).ToList();
 
-        var flow = _sysTenantRep.Context.Queryable<SysMenu>().First(u => u.Type == MenuTypeEnum.Menu && u.Title == "审批流程");
-        menuList.Add(allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "帮助文档"));
-        menuList.Add(allMenuList.First(u => u.Type == MenuTypeEnum.Menu && u.Title == "关于项目"));
-        if (flow != null) menuList.Add(flow);
+        menuList = menuList.Distinct().ToList();
 
         return menuList.Select(u => new SysTenantMenu
         {
@@ -345,6 +350,21 @@ public class SysTenantService : IDynamicApiController, ITransient
         });
     }
 
+    /// <summary>
+    /// 获取种子数据类型
+    /// </summary>
+    /// <param name="config">数据库连接配置</param>
+    /// <returns>种子数据类型列表</returns>
+    [NonAction]
+    private List<Type> GetSeedDataTypes(DbConnectionConfig config, string typeName)
+    {
+        return App.EffectiveTypes
+            .Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.Name == typeName && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>))))
+            .WhereIF(config.SeedSettings.EnableIncreSeed, u => u.IsDefined(typeof(IncreSeedAttribute), false))
+            .OrderBy(u => u.GetCustomAttributes(typeof(SeedDataAttribute), false).Length > 0 ? ((SeedDataAttribute)u.GetCustomAttributes(typeof(SeedDataAttribute), false)[0]).Order : 0)
+            .ToList();
+    }
+
     /// <summary>
     /// 获取租户默认菜单
     /// </summary>