BasicLayout.razor.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using EasyTemplate.Tool;
  2. using EasyTemplate.Tool.Util;
  3. using Microsoft.JSInterop;
  4. namespace EasyTemplate.Blazor.Web.Components.Layout;
  5. public partial class BasicLayout : LayoutComponentBase, IDisposable
  6. {
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. /// <returns></returns>
  11. protected override async Task OnInitializedAsync()
  12. {
  13. if (Global.CurrentUser == null)
  14. {
  15. NavigationManager.NavigateTo("/account/login");
  16. }
  17. try
  18. {
  19. LocalizationChanged = (sender, args) => InvokeAsync(StateHasChanged);
  20. LocalizationService.LanguageChanged += LocalizationChanged;
  21. var menuList = await Menu.AsQueryable().Where(x => x.Enabled).OrderBy(x => x.Sort).ToListAsync();
  22. Global.Menus = BuildMenuTree(menuList, 0);
  23. if (Global.CurrentUser != null)
  24. {
  25. var key = $"menu_{Global.CurrentUser.RoleId}";
  26. if (!await Cache.Exist(key))
  27. {
  28. var menus = RoleMenu.AsQueryable()
  29. .LeftJoin<SystemMenu>((rm, m) => rm.MenuId == m.Id)
  30. .Where((rm, m) => rm.RoleId == Global.CurrentUser.RoleId && m.Id > 0 && m.Enabled)
  31. .OrderBy((rm, m) => m.Sort)
  32. .Select((rm, m) => new SystemMenu()
  33. {
  34. Id = m.Id,
  35. Name = m.Name,
  36. Path = m.Path,
  37. Icon = m.Icon,
  38. ParentId = m.ParentId,
  39. Sort = m.Sort
  40. })
  41. .ToList();
  42. var menuTree = BuildMenuTree(menus, 0);
  43. MenuData = menuTree.Select(ConvertToMenuDataItem).ToArray();
  44. Cache.Set(key, MenuData);
  45. }
  46. else
  47. {
  48. MenuData = await Cache.Get<MenuDataItem[]>(key);
  49. }
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. Log.Error(ex);
  55. }
  56. }
  57. protected override async Task OnAfterRenderAsync(bool firstRender)
  58. {
  59. if (firstRender)
  60. {
  61. }
  62. }
  63. /// <summary>
  64. /// 创建菜单树
  65. /// </summary>
  66. /// <param name="menus"></param>
  67. /// <param name="parentId"></param>
  68. /// <returns></returns>
  69. private List<SystemMenu> BuildMenuTree(List<SystemMenu> menus, long parentId)
  70. {
  71. var children = menus
  72. .Where(m => m.ParentId == parentId)
  73. .Select(m => {
  74. m.Children = BuildMenuTree(menus, m.Id);
  75. return m;
  76. })
  77. .ToList();
  78. return children.Count == 0 ? null : children;
  79. }
  80. /// <summary>
  81. /// 将菜单树转换为AntDesign的菜单结构
  82. /// </summary>
  83. /// <param name="menu"></param>
  84. /// <returns></returns>
  85. private MenuDataItem ConvertToMenuDataItem(SystemMenu menu)
  86. {
  87. return new MenuDataItem
  88. {
  89. Path = menu.Path,
  90. Name = menu.Name,
  91. Key = menu.Key,
  92. Icon = menu.Icon,
  93. Children = menu.Children?.Select(ConvertToMenuDataItem).ToArray()
  94. };
  95. }
  96. public void Dispose()
  97. {
  98. LocalizationService.LanguageChanged -= LocalizationChanged;
  99. }
  100. /// <summary>
  101. ///
  102. /// </summary>
  103. private MenuDataItem[] MenuData;
  104. /// <summary>
  105. ///
  106. /// </summary>
  107. [Inject] public NavigationManager NavigationManager { get; set; }
  108. /// <summary>
  109. ///
  110. /// </summary>
  111. [Inject] private ILocalizationService LocalizationService { get; set; }
  112. /// <summary>
  113. ///
  114. /// </summary>
  115. [Inject] private SqlSugarRepository<SystemMenu> Menu { get; set; }
  116. /// <summary>
  117. ///
  118. /// </summary>
  119. [Inject] private SqlSugarRepository<SystemRoleMenu> RoleMenu { get; set; }
  120. /// <summary>
  121. ///
  122. /// </summary>
  123. private EventHandler<CultureInfo> LocalizationChanged;
  124. /// <summary>
  125. ///
  126. /// </summary>
  127. private string CopyRight;
  128. }