public override void DoAdd() { if (Entity.IsInside == true) { var domain = DC.Set <FrameworkDomain>().Where(x => x.ID == Entity.DomainId).FirstOrDefault(); FrameworkAction act = null; if (domain == null) { act = DC.Set <FrameworkAction>().Include(x => x.Module.Area).Where(x => x.ID == Entity.ActionId).FirstOrDefault(); } else { act = APIHelper.CallAPI <FrameworkAction>(domain.Address + "/WebApi/Pub/GetAction?id=" + Entity.ActionId + "&domainid=" + Entity.DomainId + "&eventts=" + DateTime.Now.Ticks).Result; } if (act != null) { Entity.Url = "/" + act.Module.ClassName + "/" + act.MethodName; if (act.Module.Area != null) { Entity.Url = "/" + act.Module.Area.Prefix + Entity.Url; } Entity.ModuleName = act.Module.ModuleName; Entity.ActionName = act.ActionName; } } else { Entity.ActionId = null; Entity.ModuleId = null; if (Entity.Url != null && Entity.Url != "") { if (Entity.DomainId == null) { if (Entity.Url.ToLower().StartsWith("http://") == false) { Entity.Url = "http://" + Entity.Url; } } else { if (Entity.Url.StartsWith("/") == false) { Entity.Url = "/" + Entity.Url; } } } } var role = DC.Set <FrameworkRole>().Where(x => x.RoleCode == "001").SingleOrDefault(); if (role != null && SelectedRolesIDs.Contains(role.ID) == false && SelectedRolesID2.Contains(role.ID) == false) { Entity.Privileges.Add(new FunctionPrivilege { RoleId = role.ID, Allowed = true }); } base.DoAdd(); AddPrivilege(Entity.ID); }
/// <summary> /// 同步Actions /// </summary> /// <param name="newActions"></param> /// <param name="oldActions"></param> /// <param name="model"></param> /// <param name="DC"></param> private static void SycActions(List <FrameworkAction> newActions, List <FrameworkAction> oldActions, FrameworkModule model, IDataContext DC) { var ToRemove = new List <FrameworkAction>(); var ToAdd = new List <FrameworkAction>(); foreach (var oldItem in oldActions) { bool exist = false; foreach (var newItem in newActions) { if (oldItem.MethodName == newItem.MethodName) { exist = true; break; } } if (exist == false) { ToRemove.Add(oldItem); } } foreach (var newItem in newActions) { bool exist = false; foreach (var oldItem in oldActions) { if (oldItem.MethodName == newItem.MethodName) { oldItem.ActionName = newItem.ActionName; exist = true; break; } } if (exist == false) { ToAdd.Add(newItem); } } foreach (var remove in ToRemove) { DC.Set <FrameworkAction>().Remove(remove); } foreach (var add in ToAdd) { add.ModuleId = model.ID; FrameworkAction act = new FrameworkAction(); act.ModuleId = model.ID; act.MethodName = add.MethodName; act.Parameter = add.Parameter; act.ParasToRunTest = add.ParasToRunTest; act.ActionName = add.ActionName; DC.Set <FrameworkAction>().Add(act); } }
private void AddXXX() { FrameworkAction v = new FrameworkAction(); using (var context = new FrameworkContext(_seed, DBTypeEnum.Memory)) { v.ActionName = ""; v.Checked = true; context.Set <FrameworkAction>().Add(v); context.SaveChanges(); } }
public override void DoEdit(bool updateAllFields = false) { if (Entity.IsInside == true) { var domain = DC.Set <FrameworkDomain>().Where(x => x.ID == Entity.DomainId).FirstOrDefault(); FrameworkAction act = null; if (domain == null) { act = DC.Set <FrameworkAction>().Include(x => x.Module.Area).Where(x => x.ID == Entity.ActionId).FirstOrDefault(); } else { act = APIHelper.CallAPI <FrameworkAction>(domain.Address + "/WebApi/Pub/GetAction?id=" + Entity.ActionId + "&domainid=" + Entity.DomainId + "&eventts=" + DateTime.Now.Ticks).Result; } if (act != null) { Entity.Url = "/" + act.Module.ClassName + "/" + act.MethodName; if (act.Module.Area != null) { Entity.Url = "/" + act.Module.Area.Prefix + Entity.Url; } Entity.ModuleName = act.Module.ModuleName; Entity.ActionName = act.ActionName; } } else { Entity.ActionId = null; Entity.ModuleId = null; if (Entity.Url != null && Entity.Url != "") { if (Entity.DomainId == null) { if (Entity.Url.ToLower().StartsWith("http://") == false) { Entity.Url = "http://" + Entity.Url; } } else { if (Entity.Url.StartsWith("/") == false) { Entity.Url = "/" + Entity.Url; } } } } base.DoEdit(true); AddPrivilege(Entity.ID); }
/// <summary> /// 获取所有模块 /// </summary> /// <param name="controllers"></param> /// <returns></returns> private static List <FrameworkModule> GetAllModules(List <Type> controllers) { var modules = new List <FrameworkModule>(); foreach (var ctrl in controllers) { var pubattr1 = ctrl.GetCustomAttributes(typeof(PublicAttribute), false); var pubattr12 = ctrl.GetCustomAttributes(typeof(AllowAnonymousAttribute), false); var rightattr = ctrl.GetCustomAttributes(typeof(AllRightsAttribute), false); var debugattr = ctrl.GetCustomAttributes(typeof(DebugOnlyAttribute), false); var areaattr = ctrl.GetCustomAttributes(typeof(AreaAttribute), false); var model = new FrameworkModule { ClassName = ctrl.Name.Replace("Controller", string.Empty) }; if (ctrl.Namespace == "WalkingTec.Mvvm.Mvc") { continue; } if (areaattr.Length == 0 && model.ClassName == "Home") { continue; } if (pubattr1.Length > 0 || pubattr12.Length > 0 || rightattr.Length > 0 || debugattr.Length > 0) { model.IgnorePrivillege = true; } if (typeof(BaseApiController).IsAssignableFrom(ctrl)) { model.IsApi = true; } model.NameSpace = ctrl.Namespace; //获取controller上标记的ActionDescription属性的值 var attrs = ctrl.GetCustomAttributes(typeof(ActionDescriptionAttribute), false); if (attrs.Length > 0) { var ada = attrs[0] as ActionDescriptionAttribute; var nameKey = ada.GetDescription(ctrl); model.ModuleName = nameKey; } else { model.ModuleName = model.ClassName; } //获取该controller下所有的方法 var methods = ctrl.GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance); //过滤掉/Login/Login方法和特殊方法 if (model.ClassName.ToLower() == "login") { methods = methods.Where(x => x.IsSpecialName == false && x.Name.ToLower() != "login").ToArray(); } else { methods = methods.Where(x => x.IsSpecialName == false).ToArray(); } model.Actions = new List <FrameworkAction>(); //循环所有方法 foreach (var method in methods) { var pubattr2 = method.GetCustomAttributes(typeof(PublicAttribute), false); var pubattr22 = method.GetCustomAttributes(typeof(AllowAnonymousAttribute), false); var arattr2 = method.GetCustomAttributes(typeof(AllRightsAttribute), false); var debugattr2 = method.GetCustomAttributes(typeof(DebugOnlyAttribute), false); var postAttr = method.GetCustomAttributes(typeof(HttpPostAttribute), false); //如果不是post的方法,则添加到controller的action列表里 if (postAttr.Length == 0) { var action = new FrameworkAction { Module = model, MethodName = method.Name }; if (pubattr2.Length > 0 || pubattr22.Length > 0 || arattr2.Length > 0 || debugattr2.Length > 0) { action.IgnorePrivillege = true; } var attrs2 = method.GetCustomAttributes(typeof(ActionDescriptionAttribute), false); if (attrs2.Length > 0) { var ada = attrs2[0] as ActionDescriptionAttribute; var nameKey = ada.GetDescription(ctrl); action.ActionName = nameKey; } else { action.ActionName = action.MethodName; } var pars = method.GetParameters(); if (pars != null && pars.Length > 0) { action.ParasToRunTest = new List <string>(); foreach (var par in pars) { action.ParasToRunTest.Add(par.Name); } } model.Actions.Add(action); } } //再次循环所有方法 foreach (var method in methods) { var pubattr2 = method.GetCustomAttributes(typeof(PublicAttribute), false); var pubattr22 = method.GetCustomAttributes(typeof(AllowAnonymousAttribute), false); var arattr2 = method.GetCustomAttributes(typeof(AllRightsAttribute), false); var debugattr2 = method.GetCustomAttributes(typeof(DebugOnlyAttribute), false); var postAttr = method.GetCustomAttributes(typeof(HttpPostAttribute), false); //找到post的方法且没有同名的非post的方法,添加到controller的action列表里 if (postAttr.Length > 0 && model.Actions.Where(x => x.MethodName.ToLower() == method.Name.ToLower()).FirstOrDefault() == null) { if (method.Name.ToLower().StartsWith("dobatch")) { if (model.Actions.Where(x => "do" + x.MethodName.ToLower() == method.Name.ToLower()).FirstOrDefault() != null) { continue; } } var action = new FrameworkAction { Module = model, MethodName = method.Name }; if (pubattr2.Length > 0 || pubattr22.Length > 0 || arattr2.Length > 0 || debugattr2.Length > 0) { action.IgnorePrivillege = true; } var attrs2 = method.GetCustomAttributes(typeof(ActionDescriptionAttribute), false); if (attrs2.Length > 0) { var ada = attrs2[0] as ActionDescriptionAttribute; string nameKey = ada.GetDescription(ctrl); action.ActionName = nameKey; } else { action.ActionName = action.MethodName; } model.Actions.Add(action); } } if (model.Actions != null && model.Actions.Count() > 0) { if (areaattr.Length > 0) { string areaName = (areaattr[0] as AreaAttribute).RouteValue; var existArea = modules.Where(x => x.Area?.AreaName == areaName).Select(x => x.Area).FirstOrDefault(); if (existArea == null) { model.Area = new FrameworkArea { AreaName = (areaattr[0] as AreaAttribute).RouteValue, Prefix = (areaattr[0] as AreaAttribute).RouteValue, }; } else { model.Area = existArea; } } modules.Add(model); } } return(modules); }
public void DoBatchAdd() { var role = DC.Set <FrameworkRole>().Where(x => x.RoleCode == "001").SingleOrDefault(); if (role != null && SelectedRolesIDs.Contains(role.ID) == false && SelectedRolesID2.Contains(role.ID) == false) { Entity.Privileges.Add(new FunctionPrivilege { RoleId = role.ID, Allowed = true }); } if (Entity.ModuleId != null && Entity.ActionId != null) { var domain = DC.Set <FrameworkDomain>().Where(x => x.ID == Entity.DomainId).FirstOrDefault(); List <FrameworkAction> otherActions = null; FrameworkAction act = null; if (domain == null) { act = DC.Set <FrameworkAction>().Include(x => x.Module.Area).Where(x => x.ID == Entity.ActionId).FirstOrDefault(); otherActions = DC.Set <FrameworkAction>().Include(x => x.Module.Area).Where(x => x.ModuleId == this.Entity.ModuleId && x.ID != Entity.ActionId).ToList(); } else { otherActions = APIHelper.CallAPI <List <FrameworkAction> >(domain.Address + "/WebApi/Pub/GetOtherActions?id=" + Entity.ActionId + "&moduleid=" + Entity.ModuleId + "&eventts=" + DateTime.Now.Ticks).Result; act = APIHelper.CallAPI <FrameworkAction>(domain.Address + "/WebApi/Pub/GetAction?id=" + Entity.ActionId + "&domainid=" + Entity.DomainId + "&eventts=" + DateTime.Now.Ticks).Result; } if (act != null) { Entity.Url = "/" + act.Module.ClassName + "/" + act.MethodName; if (act.Module.Area != null) { Entity.Url = "/" + act.Module.Area.Prefix + Entity.Url; } Entity.ModuleName = act.Module.ModuleName; Entity.ActionName = act.ActionName; } int order = 1; foreach (var action in otherActions) { FrameworkMenu menu = new FrameworkMenu(); menu.ActionId = action.ID; menu.ModuleId = action.ModuleId; menu.FolderOnly = false; menu.IsPublic = false; menu.Parent = Entity; menu.ShowOnMenu = false; menu.DisplayOrder = order++; menu.Privileges = new List <FunctionPrivilege>(); menu.CreateBy = LoginUserInfo.ITCode; menu.CreateTime = DateTime.Now; menu.IsInside = true; menu.DomainId = Entity.DomainId; if (role != null) { menu.Privileges.Add(new FunctionPrivilege { RoleId = role.ID, Allowed = true }); } menu.PageName = action.ActionName; menu.ModuleName = action.Module.ModuleName; menu.ActionName = action.ActionName; menu.Url = "/" + action.Module.ClassName + "/" + action.MethodName; if (action.Module.Area != null) { menu.Url = "/" + action.Module.Area.Prefix + menu.Url; } Entity.Children.Add(menu); } } base.DoAdd(); AddPrivilege(Entity.ID); }
public override void DoAdd() { Entity.ICon = $"{IconFont} {IconFontItem}"; if (Entity.IsInside == false) { if (Entity.Url != null && Entity.Url != "" && Entity.Url.StartsWith("/") == false) { if (Entity.Url.ToLower().StartsWith("http://") == false && Entity.Url.ToLower().StartsWith("https://") == false) { Entity.Url = "http://" + Entity.Url; } } } else { if (string.IsNullOrEmpty(SelectedModule) == true && Entity.FolderOnly == false) { MSD.AddModelError("SelectedModule", Program._localizer["SelectModule"]); return; } if (string.IsNullOrEmpty(SelectedModule) == false && Entity.FolderOnly == false) { var modules = GlobalServices.GetRequiredService <GlobalData>().AllModule; List <FrameworkAction> otherActions = null; var mainAction = modules.Where(x => x.FullName == this.SelectedModule).SelectMany(x => x.Actions).Where(x => x.MethodName == "Index").SingleOrDefault(); if (mainAction == null && Entity.ShowOnMenu == true) { MSD.AddModelError("Entity.ModuleId", Program._localizer["NoIndexInModule"]); return; } if (mainAction == null && Entity.ShowOnMenu == false) { var model = modules.Where(x => x.FullName == this.SelectedModule).FirstOrDefault(); mainAction = new FrameworkAction(); mainAction.Module = model; mainAction.MethodName = null; } Entity.Url = mainAction.Url; Entity.ModuleName = mainAction.Module.ModuleName; Entity.ActionName = mainAction.ActionDes?.Description ?? mainAction.ActionName; Entity.ClassName = mainAction.Module.FullName; Entity.MethodName = null; Entity.Children = new List <FrameworkMenu>(); otherActions = modules.Where(x => x.FullName == this.SelectedModule).SelectMany(x => x.Actions).Where(x => x.MethodName != "Index").ToList(); int order = 1; foreach (var action in otherActions) { if (SelectedActionIDs?.Contains(action.Url) == true) { FrameworkMenu menu = new FrameworkMenu(); menu.FolderOnly = false; menu.IsPublic = false; menu.Parent = Entity; menu.ShowOnMenu = false; menu.DisplayOrder = order++; menu.Privileges = new List <FunctionPrivilege>(); menu.CreateBy = LoginUserInfo.ITCode; menu.CreateTime = DateTime.Now; menu.IsInside = true; menu.DomainId = Entity.DomainId; menu.PageName = action.ActionDes?.Description ?? action.ActionName; menu.ModuleName = action.Module.ModuleName; menu.ActionName = action.ActionDes?.Description ?? action.ActionName; menu.ClassName = action.Module.FullName; menu.MethodName = action.MethodName; menu.Url = action.Url; Entity.Children.Add(menu); } } } else { Entity.Children = null; Entity.Url = null; } } base.DoAdd(); List <Guid> guids = new List <Guid>(); guids.Add(Entity.ID); if (Entity.Children != null) { guids.AddRange(Entity.Children?.Select(x => x.ID).ToList()); } AddPrivilege(guids); }
public override void DoEdit(bool updateAllFields = false) { if (Entity.IsInside == false) { if (Entity.Url != null && Entity.Url != "") { if (Entity.DomainId == null) { if (Entity.Url.ToLower().StartsWith("http://") == false && Entity.Url.ToLower().StartsWith("https://") == false) { Entity.Url = "http://" + Entity.Url; } } else { if (Entity.Url.StartsWith("/") == false) { Entity.Url = "/" + Entity.Url; } } } } else { if (string.IsNullOrEmpty(SelectedModule) == true && Entity.FolderOnly == false) { MSD.AddModelError("SelectedModule", "请选择一个模块"); return; } if (string.IsNullOrEmpty(SelectedModule) == false && Entity.FolderOnly == false) { var modules = GlobalServices.GetRequiredService <GlobalData>().AllModule; List <FrameworkAction> otherActions = null; var mainAction = modules.Where(x => x.FullName == this.SelectedModule).SelectMany(x => x.Actions).Where(x => x.MethodName == "Index").SingleOrDefault(); if (mainAction == null && Entity.ShowOnMenu == true) { MSD.AddModelError("Entity.ModuleId", "模块中没有找到Index页面"); return; } if (mainAction == null && Entity.ShowOnMenu == false) { var model = modules.Where(x => x.FullName == this.SelectedModule).FirstOrDefault(); mainAction = new FrameworkAction(); mainAction.Module = model; mainAction.MethodName = "Index"; } var ndc = DC.ReCreate(); var oldIDs = ndc.Set <FrameworkMenu>().Where(x => x.ParentId == Entity.ID).Select(x => x.ID).ToList(); foreach (var oldid in oldIDs) { try { FrameworkMenu fp = new FrameworkMenu { ID = oldid }; ndc.Set <FrameworkMenu>().Attach(fp); ndc.DeleteEntity(fp); } catch { } } ndc.SaveChanges(); Entity.Url = mainAction.Url; Entity.ModuleName = mainAction.Module.ModuleName; Entity.ClassName = mainAction.Module.ClassName; Entity.MethodName = "Index"; otherActions = modules.Where(x => x.FullName == this.SelectedModule).SelectMany(x => x.Actions).Where(x => x.MethodName != "Index").ToList(); int order = 1; foreach (var action in otherActions) { if (SelectedActionIDs != null && SelectedActionIDs.Contains(action.Url)) { FrameworkMenu menu = new FrameworkMenu(); menu.FolderOnly = false; menu.IsPublic = false; menu.Parent = Entity; menu.ShowOnMenu = false; menu.DisplayOrder = order++; menu.Privileges = new List <FunctionPrivilege>(); menu.CreateBy = LoginUserInfo.ITCode; menu.CreateTime = DateTime.Now; menu.IsInside = true; menu.DomainId = Entity.DomainId; menu.PageName = action.ActionName; menu.ModuleName = action.Module.ModuleName; menu.ActionName = action.ActionName; menu.Url = action.Url; Entity.Children.Add(menu); } } } else { Entity.Children = null; Entity.Url = null; } } base.DoEdit(); List <Guid> guids = new List <Guid>(); guids.Add(Entity.ID); if (Entity.Children != null) { guids.AddRange(Entity.Children?.Select(x => x.ID).ToList()); } AddPrivilege(guids); }
private FrameworkMenu GetMenuFromAction(FrameworkAction act, bool isMainLink, List <FrameworkRole> allowedRoles, List <FrameworkUser> allowedUsers, int displayOrder = 1) { if (act == null) { return(null); } FrameworkMenu menu = new FrameworkMenu { ActionID = act.ID, ModuleID = act.ModuleID, Url = "/" + act.Module.ClassName + "/" + act.MethodName, Privileges = new List <FunctionPrivilege>(), ShowOnMenu = isMainLink, FolderOnly = false, MLContents = new List <FrameworkMenuMLContent>(), Children = new List <FrameworkMenu>(), IsInherit = true, IsPublic = false, IsInside = true, DisplayOrder = displayOrder, CreateTime = DateTime.Now }; if (act.Module.Area != null) { menu.Url = "/" + act.Module.Area.Prefix + menu.Url; } if (isMainLink) { foreach (var ml in act.Module.MLContents) { menu.MLContents.Add(new FrameworkMenuMLContent { LanguageCode = ml.LanguageCode, PageName = ml.ModuleName, ModuleName = ml.ModuleName, ActionName = act.MLContents.Where(x => x.LanguageCode == ml.LanguageCode).Select(x => x.ActionName).FirstOrDefault() }); } } else { foreach (var ml in act.MLContents) { menu.MLContents.Add(new FrameworkMenuMLContent { LanguageCode = ml.LanguageCode, PageName = ml.ActionName, ActionName = ml.ActionName, ModuleName = act.Module.MLContents.Where(x => x.LanguageCode == ml.LanguageCode).Select(x => x.ModuleName).FirstOrDefault() }); } } if (allowedRoles != null) { foreach (var role in allowedRoles) { menu.Privileges.Add(new FunctionPrivilege { RoleID = role.ID, Allowed = true }); } } if (allowedUsers != null) { foreach (var user in allowedUsers) { menu.Privileges.Add(new FunctionPrivilege { UserID = user.ID, Allowed = true }); } } return(menu); }