using Bootstrap.Security; using Bootstrap.Security.DataAccess; using Longbow.Cache; using Longbow.Data; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; namespace Bootstrap.DataAccess { /// /// /// public static class MenuHelper { /// /// /// public const string RetrieveMenusByRoleIdDataKey = "MenuHelper-RetrieveMenusByRoleId"; /// /// /// public const string RetrieveMenusAll = "BootstrapMenu-RetrieveMenus"; /// /// /// /// /// public static bool Save(BootstrapMenu p) { if (DictHelper.RetrieveSystemModel()) { if (p.Id.IsNullOrEmpty()) { if (p.Category == "0") p.Category = "1"; } else { if (RetrieveAllMenus("Admin").Where(m => m.Category == "0").Any(m => m.Id == p.Id)) { return true; } } } if (p.Id == string.Empty) p.Id = null; var ret = DbContextManager.Create().Save(p); if (ret) CacheCleanUtility.ClearCache(menuIds: string.IsNullOrEmpty(p.Id) ? new List() : new List() { p.Id }); return ret; } /// /// /// /// /// public static bool Delete(IEnumerable value) { if (DictHelper.RetrieveSystemModel()) { // 不允许删除系统菜单与前台演示系统的默认菜单 var menuNames = new string[] { "首页", "测试页面", "关于", "返回码云" }; var systemMenus = RetrieveAllMenus("Admin").Where(m => m.Category == "0" || menuNames.Any(n => n.Equals(m.Name, StringComparison.OrdinalIgnoreCase))); value = value.Where(v => !systemMenus.Any(m => m.Id == v)); if (!value.Any()) return true; } var ret = DbContextManager.Create().Delete(value); if (ret) CacheCleanUtility.ClearCache(menuIds: value); return ret; } /// /// 通过用户名获得所有菜单 /// /// /// public static IEnumerable RetrieveMenusByUserName(string userName) => RetrieveAllMenus(userName); /// /// /// /// /// public static IEnumerable RetrieveMenusByRoleId(string roleId) => CacheManager.GetOrAdd($"{RetrieveMenusByRoleIdDataKey}-{roleId}", k => DbContextManager.Create().RetrieveMenusByRoleId(roleId), RetrieveMenusByRoleIdDataKey); /// /// /// /// /// /// public static bool SaveMenusByRoleId(string roleId, IEnumerable menuIds) { var ret = DbContextManager.Create().SaveMenusByRoleId(roleId, menuIds); if (ret) CacheCleanUtility.ClearCache(menuIds: menuIds, roleIds: new List() { roleId }); return ret; } /// /// /// /// /// /// /// public static IEnumerable RetrieveAppMenus(string appId, string userName, string activeUrl) { var menus = RetrieveAllMenus(userName).Where(m => m.Category == "1" && m.IsResource == 0); if (appId != "0") menus = menus.Where(m => m.Application == appId); return DbHelper.CascadeMenus(menus, activeUrl); } /// /// 通过当前用户名获得后台菜单,层次化后集合 /// /// 当前登陆的用户名 /// 当前访问菜单 /// public static IEnumerable RetrieveSystemMenus(string userName, string activeUrl = null) { var menus = RetrieveAllMenus(userName).Where(m => m.Category == "0" && m.IsResource == 0); return DbHelper.CascadeMenus(menus, activeUrl); } /// /// 通过当前用户名与指定菜单路径获取此菜单下所有授权按钮集合 /// /// 请求上下文 /// 资源按钮所属菜单 /// 资源授权码 /// public static bool AuthorizateButtons(HttpContext context, string url, string key) { if (context.User.IsInRole("Administrators")) return true; var menus = RetrieveAllMenus(context.User.Identity.Name); var activeMenu = menus.FirstOrDefault(m => m.Url.Equals(url, StringComparison.OrdinalIgnoreCase)); if (activeMenu == null) return false; var authorKeys = menus.Where(m => m.ParentId == activeMenu.Id && m.IsResource == 2).Select(m => m.Url); var keys = key.SpanSplitAny(",. ;", StringSplitOptions.RemoveEmptyEntries); return keys.Any(m => authorKeys.Any(k => k == m)); } /// /// 通过当前用户名获得所有菜单,层次化后集合 /// /// /// public static IEnumerable RetrieveMenus(string userName) { var menus = RetrieveAllMenus(userName); return DbHelper.CascadeMenus(menus); } /// /// 通过用户获得所有菜单 /// /// /// public static IEnumerable RetrieveAllMenus(string userName) => CacheManager.GetOrAdd($"{RetrieveMenusAll}-{userName}", key => DbContextManager.Create().RetrieveAllMenus(userName), RetrieveMenusAll); } }