diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/SwaggerDoc.xml b/Yi.Framework/Yi.Framework.ApiMicroservice/SwaggerDoc.xml index 33305d1d..9d315f5f 100644 --- a/Yi.Framework/Yi.Framework.ApiMicroservice/SwaggerDoc.xml +++ b/Yi.Framework/Yi.Framework.ApiMicroservice/SwaggerDoc.xml @@ -146,11 +146,11 @@ - + 用于给角色设置菜单的时候,点击一个角色,显示这个角色拥有的并列的菜单 - + diff --git a/Yi.Framework/Yi.Framework.Core/TreeMenuBuild.cs b/Yi.Framework/Yi.Framework.Core/TreeMenuBuild.cs new file mode 100644 index 00000000..14b0e6f8 --- /dev/null +++ b/Yi.Framework/Yi.Framework.Core/TreeMenuBuild.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Model.Models; + +namespace Yi.Framework.Core +{ + public static class TreeMenuBuild + { + /// + /// 过滤所有已经删除的菜单 + /// + /// + /// + public static menu Normal(menu menu_data) + { + for (int i = menu_data.children.Count() - 1; i >= 0; i--) + { + if (menu_data.children[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted) + { + menu_data.children.Remove(menu_data.children[i]); + } + else if (menu_data.children[i] != null) + { + Normal(menu_data.children[i]); + } + } + return menu_data; + } + + + + public static menu ShowFormat(menu menu_data, List allMenuIds) + { + return Format(Show(menu_data, allMenuIds)); + } + + + + /// + /// 过滤用户不展示及已删除及未拥有的菜单 + /// + /// + /// + /// + private static menu Show(menu menu_data, List allMenuIds) + { + for (int i = menu_data.children.Count() - 1; i >= 0; i--) + { + if (!allMenuIds.Contains(menu_data.children[i].id) || menu_data.children[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted || menu_data.children[i].is_show == (short)Common.Enum.ShowFlagEnum.NoShow) + { + menu_data.children.Remove(menu_data.children[i]); + } + else + { + Show(menu_data.children[i], allMenuIds); + } + } + return menu_data; + } + + /// + /// 为了匹配前端格式,通常和show方法一起 + /// + /// + /// + private static menu Format(menu menu_data) + { + for (int i = menu_data.children.Count() - 1; i >= 0; i--) + { + if (menu_data.children[i].icon == null) + { + menu_data.children[i].icon = "mdi-view-dashboard"; + } + if (menu_data.children != null || menu_data.children.Count() != 0) + { + Format(menu_data.children[i]); + } + } + if (menu_data.children.Count() == 0) + { + menu_data.children = null; + } + + return menu_data; + } + + public static menu Sort(menu menu_data) + { + if (menu_data.children != null) + { + for (int i = menu_data.children.Count() - 1; i >= 0; i--) + { + menu_data.children = menu_data.children.AsEnumerable().OrderByDescending(u => u.sort).ToList(); + + if (menu_data.children != null || menu_data.children.Count() != 0) + { + Sort(menu_data.children[i]); + } + } + } + return menu_data; + } + + } +} diff --git a/Yi.Framework/Yi.Framework.Service/MenuService.cs b/Yi.Framework/Yi.Framework.Service/MenuService.cs index 8e1c5d19..3fba9f09 100644 --- a/Yi.Framework/Yi.Framework.Service/MenuService.cs +++ b/Yi.Framework/Yi.Framework.Service/MenuService.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core; using Yi.Framework.Interface; using Yi.Framework.Model.Models; @@ -38,7 +39,7 @@ namespace Yi.Framework.Service .Where(u =>u.is_delete == Normal && u.is_show == (short)Common.Enum.ShowFlagEnum.Show && u.is_top == (short)Common.Enum.TopFlagEnum.Top) .OrderByDescending(u=>u.sort) .FirstOrDefaultAsync(); - return TopMenuBuild(menu_data); + return TreeMenuBuild.Normal(menu_data); } public async Task> GetTopMenusByTopMenuIds(List menuIds) @@ -55,26 +56,7 @@ namespace Yi.Framework.Service return menu_data; } - /// - /// 过滤已经被删除的(这个应该是别的地方有方法的,不应该写到service层里面的) - /// - /// - /// - private menu TopMenuBuild(menu menu_data) - { - for (int i = menu_data.children.Count() - 1; i >= 0; i--) - { - if (menu_data.children[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted) - { - menu_data.children.Remove(menu_data.children[i]); - } - else if (menu_data.children[i] != null) - { - TopMenuBuild(menu_data.children[i]); - } - } - return menu_data; - } + public async Task> GetTopMenuByUserId(int userId) { var user_data = await _DbRead.Set().Include(u => u.roles).ThenInclude(u => u.menus).FirstOrDefaultAsync(); diff --git a/Yi.Framework/Yi.Framework.Service/UserService.cs b/Yi.Framework/Yi.Framework.Service/UserService.cs index 7abe95c3..9e4b54ad 100644 --- a/Yi.Framework/Yi.Framework.Service/UserService.cs +++ b/Yi.Framework/Yi.Framework.Service/UserService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core; using Yi.Framework.Interface; using Yi.Framework.Model; using Yi.Framework.Model.ModelFactory; @@ -64,70 +65,16 @@ namespace Yi.Framework.Service menuList = menuList.Union(m).OrderByDescending(u => u.sort).ToList(); } //menu_data为角色所有的菜单,不是一个递归的啊 - var allMenuIds = menuList.Select(u => u.id).ToList(); - var topMenu = menuList.Where(u => u.is_top == (short)Common.Enum.ShowFlagEnum.Show); + + var topMenu =await _DbRead.Set().Include(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).Where(u => u.is_top == (short)Common.Enum.ShowFlagEnum.Show).FirstOrDefaultAsync(); + + //现在要开始关联菜单了 - - List endMenu = new(); - foreach (var item in topMenu) - { - var p = await _DbRead.Set().Where(u => u.id == item.id).Include(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).ThenInclude(u => u.children).ToListAsync(); - endMenu = endMenu.Union(p).ToList(); - } - - - return TopMenuBuild2(TopMenuBuild(endMenu, allMenuIds))[0]; - } - /// - /// 这种就命名的话,改成MenuIconAndShowBuild - /// - /// - /// - /// - private List TopMenuBuild(List menu_data, List allMenuIds) - { - - for (int i = menu_data.Count() - 1; i >= 0; i--) - { - if (!allMenuIds.Contains(menu_data[i].id) || menu_data[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted || menu_data[i].is_show == (short)Common.Enum.ShowFlagEnum.NoShow) - { - menu_data.Remove(menu_data[i]); - } - else if (menu_data[i].children != null) - { - menu_data[i].children = TopMenuBuild(menu_data[i].children.ToList(), allMenuIds); - } - } - return menu_data; + return TreeMenuBuild.Sort(TreeMenuBuild.ShowFormat(topMenu, allMenuIds)); ; } - /// - /// 这种就命名的话,改成MenuChildrenBuild,这个方法应该可以提到core层,这是一个公用的方法 - /// - /// - /// - private List TopMenuBuild2(List menu_data) - { - - for (int i = menu_data.Count() - 1; i >= 0; i--) - { - if (menu_data[i].icon == null) - { - menu_data[i].icon = "mdi-view-dashboard"; - } - if (menu_data[i].children.Count() == 0) - { - menu_data[i].children = null; - } - else if (menu_data[i].children != null) - { - menu_data[i].children = TopMenuBuild2(menu_data[i].children.ToList()); - } - } - return menu_data; - } public async Task GetUserInRolesByHttpUser(int userId) diff --git a/Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj b/Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj index 10f15f2f..a12bfcff 100644 --- a/Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj +++ b/Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj @@ -17,6 +17,7 @@ + diff --git a/Yi.Vue/src/store/modules/user.js b/Yi.Vue/src/store/modules/user.js index 353add9d..1ba572b8 100644 --- a/Yi.Vue/src/store/modules/user.js +++ b/Yi.Vue/src/store/modules/user.js @@ -8,7 +8,7 @@ const state = { //状态 dark: false, drawer: { image: 0, - gradient: 0, + gradient: 1, mini: false, }, gradients: [