NavigationManager.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Abp;
  5. using Abp.Authorization;
  6. using Abp.Dependency;
  7. using Abp.Domain.Repositories;
  8. using Abp.Runtime.Caching;
  9. using IwbZero.Authorization.Users;
  10. using IwbZero.BaseSysInfo;
  11. using IwbZero.Session;
  12. namespace IwbZero.Navigation
  13. {
  14. //public class IwbNavigationManager<TFun, TUser> : IIwbNavigationManager<TFun, TUser>, ISingletonDependency
  15. public class IwbNavigationManager<TFun, TUser> : IIwbNavigationManager, ISingletonDependency
  16. where TUser : IwbSysUser<TUser>,new()
  17. where TFun : IwbSysFunction<TUser>
  18. {
  19. public IwbSession AbpSession { get; set; }
  20. protected readonly ICacheManager CacheManager;
  21. //private readonly ILocalizationContext _localizationContext;
  22. protected readonly IIocResolver IocResolver;
  23. protected readonly IRepository<TFun, int> SysFunctionRepository;
  24. public IwbNavigationManager(IRepository<TFun, int> sysFunctionRepository,
  25. //ILocalizationContext localizationContext,
  26. ICacheManager cacheManager,
  27. IIocResolver iocResolver)
  28. {
  29. SysFunctionRepository = sysFunctionRepository;
  30. CacheManager = cacheManager;
  31. //_localizationContext = localizationContext;
  32. IocResolver = iocResolver;
  33. }
  34. public virtual async Task<IwbUserMenu> GetMenuAsync(UserIdentifier user)
  35. {
  36. if (!TryGetFuns(out var funs))
  37. {
  38. funs = await SysFunctionRepository.GetAllListAsync();
  39. await CacheManager.GetCache(IwbZeroConsts.SysFunctionCache).SetAsync("SysFun", funs);
  40. }
  41. var menus = await GetMenuAsync(user, funs);
  42. return menus;
  43. }
  44. public async Task<IwbUserMenu> GetMenuAsync(UserIdentifier user, List<TFun> funs)
  45. {
  46. var menuDefinition = GetMenuDefinition(funs);
  47. var userMenu = new IwbUserMenu(menuDefinition);
  48. await FillUserMenuItems(user, menuDefinition.Items, userMenu.Items);
  49. return userMenu;
  50. }
  51. private bool TryGetFuns(out List<TFun> funs)
  52. {
  53. funs = (List<TFun>)CacheManager.GetCache(IwbZeroConsts.SysFunctionCache).GetOrDefault("SysFun") ??
  54. new List<TFun>();
  55. return funs.Any();
  56. }
  57. private async Task<int> FillUserMenuItems(UserIdentifier user, IList<IwbMenuItemDefinition> menuItemDefinitions, IList<IwbUserMenuItem> userMenuItems)
  58. {
  59. //TODO: Can be optimized by re-using FeatureDependencyContext.
  60. var addedMenuItemCount = 0;
  61. using (var scope = IocResolver.CreateScope())
  62. {
  63. var permissionDependencyContext = scope.Resolve<PermissionDependencyContext>();
  64. permissionDependencyContext.User = user;
  65. //var featureDependencyContext = scope.Resolve<FeatureDependencyContext>();
  66. //featureDependencyContext.TenantId = user == null ? null : user.TenantId;
  67. foreach (var menuItemDefinition in menuItemDefinitions)
  68. {
  69. if (AbpSession.UserName != UserBase.AdminUserName)
  70. {
  71. if (menuItemDefinition.RequiresAuthentication && user == null)
  72. {
  73. continue;
  74. }
  75. if (!string.IsNullOrEmpty(menuItemDefinition.RequiredPermissionName))
  76. {
  77. var permissionDependency = new SimplePermissionDependency(menuItemDefinition.RequiredPermissionName);
  78. if (user == null || !(await permissionDependency.IsSatisfiedAsync(permissionDependencyContext)))
  79. {
  80. continue;
  81. }
  82. }
  83. if (menuItemDefinition.PermissionDependency != null &&
  84. (user == null || !(await menuItemDefinition.PermissionDependency.IsSatisfiedAsync(permissionDependencyContext))))
  85. {
  86. continue;
  87. }
  88. //if (menuItemDefinition.FeatureDependency != null &&
  89. // (AbpSession.MultiTenancySide == MultiTenancySides.Tenant || (user != null && user.TenantId != null)) &&
  90. // !(await menuItemDefinition.FeatureDependency.IsSatisfiedAsync(featureDependencyContext)))
  91. //{
  92. // continue;
  93. //}
  94. }
  95. var userMenuItem = new IwbUserMenuItem(menuItemDefinition);
  96. if (menuItemDefinition.IsLeaf || (await FillUserMenuItems(user, menuItemDefinition.Items, userMenuItem.Items)) > 0)
  97. {
  98. userMenuItems.Add(userMenuItem);
  99. ++addedMenuItemCount;
  100. }
  101. }
  102. }
  103. return addedMenuItemCount;
  104. }
  105. private IwbMenuDefinition GetMenuDefinition(List<TFun> funs)
  106. {
  107. var menuDefinition = new IwbMenuDefinition("IwbAdmin", "IwbAdminNavMenu");
  108. //await _sysFunctionRepository.GetAllListAsync();
  109. //var funs = await _cacheManager.GetCache(IwbConsts.SysFunctionCache).GetAsync("SysFun", () => _sysFunctionRepository.GetAllListAsync());
  110. var topFunNo = System.Configuration.ConfigurationManager.AppSettings["SystemFunction.Top.FunctionNo"] ?? "HTSystem";
  111. var topFun = funs.FirstOrDefault(a => a.FunctionNo == topFunNo);
  112. if (topFun != null)
  113. {
  114. menuDefinition.AddItem(
  115. new IwbMenuItemDefinition(topFun.PermissionName, "主页", topFun.Icon, "/", true,customData:topFun.FunctionType));
  116. }
  117. var childfuns = funs.Where(a => a.ParentNo == topFunNo);
  118. foreach (var fun in childfuns)
  119. {
  120. var menuItem = new IwbMenuItemDefinition(fun.PermissionName, fun.FunctionName, fun.Icon,
  121. fun.Url, false, fun.PermissionName,customData:fun.FunctionType);
  122. AddMenuItemDefinition(menuItem, funs, fun.FunctionNo);
  123. menuDefinition.AddItem(menuItem);
  124. }
  125. return menuDefinition;
  126. }
  127. private void AddMenuItemDefinition(IwbMenuItemDefinition menuItem, List<TFun> funs, string parentFunNo)
  128. {
  129. var childFuns = funs.Where(a => a.ParentNo == parentFunNo);
  130. foreach (var fun in childFuns)
  131. {
  132. var childMenuItem = new IwbMenuItemDefinition(fun.PermissionName, fun.FunctionName, fun.Icon,
  133. fun.Url, false, fun.PermissionName,customData:fun.FunctionType);
  134. menuItem.AddItem(childMenuItem);
  135. AddMenuItemDefinition(childMenuItem, funs, fun.FunctionNo);
  136. }
  137. }
  138. }
  139. }