using System; using System.Collections.Generic; using System.Linq; using LitJson; using SimpleHttpServer; using System.Reflection; using Sog; namespace Operation { public static class Resolver { private static Dictionary Permissions = new Dictionary(); private static Dictionary menus = new Dictionary(); //无需登陆可直接请求的接口:注册、登陆、外部api等 public static List> Ignored = new List>(); public static List logRequestList = new List(); public static List AllRequestList = new List(); private static void CheckPermissionCode() { int[] permissionCodes = (int[])Enum.GetValues(typeof(PermissionCode)); bool hasDuplicates = permissionCodes.GroupBy(x => x).Any(g => g.Count() > 1); if (hasDuplicates) { throw new InvalidOperationException("permission code duplicates,please check"); } } public static void Register(string httpApiCmd, Func httpApiFunction) { if (httpApiFunction == null) { Ignored.Add(new KeyValuePair(key:httpApiCmd,value:"")); return; } if (AllRequestList.Contains(httpApiCmd)) { throw new InvalidOperationException(); } AllRequestList.Add(httpApiCmd); var method = httpApiFunction.Method; var declaringType = method.DeclaringType; string parent = ""; if (declaringType != null) { var menuMapping = declaringType.GetCustomAttribute(); if (menuMapping != null) { if (menuMapping.refc == null) { var name = menuMapping.Name; var order = menuMapping.Order; var icon = menuMapping.Icon; var permission = menuMapping.Pcode; parent = name; AddParentMenu(name, "", icon, order, permission); AddPermission(name, "", permission); } else { var refcMenuMapping = menuMapping.refc.GetCustomAttribute(); if (refcMenuMapping == null) { throw new InvalidOperationException(); } var name = refcMenuMapping.Name; var order = refcMenuMapping.Order; var icon = refcMenuMapping.Icon; var permission = refcMenuMapping.Pcode; parent = name; AddParentMenu(name, "", icon, order, permission); AddPermission(name, "", permission); } } } var attr = method.GetCustomAttribute(); if (attr != null) { var toMenu = attr.isMenu; var name = attr.Name; var pCode = (int)attr.Permission; if (toMenu) { AddSubMenu(parent, name, httpApiCmd, "", 1, pCode); } AddPermission(name, httpApiCmd, pCode); if (attr.toLog) { logRequestList.Add(httpApiCmd); } if (attr.Ignored) { Ignored.Add(new KeyValuePair(key:httpApiCmd,value:name)); } } else { Ignored.Add(new KeyValuePair(key:httpApiCmd,value:"")); TraceLog.Debug("Resolver.Register http request permission not found, url={0}", httpApiCmd); } } public static void AddParentMenu(string name, string url, string icon, int order, int permission) { if (menus.ContainsKey(name)) { return; } Menu menu = new Menu(); menu.Url = url; menu.Name = name; menu.Order = order; menu.ParentId = 0; menu.Icon = icon; menu.Permission = permission; menus[name] = menu; } public static void AddSubMenu(string parent, string name, string url, string icon, int order, int permission) { if (!menus.ContainsKey(parent)) { throw new InvalidOperationException("Resolver.AddSubMenu not found parent menu parentId=" + parent); } var pMenu = menus[parent]; Menu menu = new Menu(); menu.Url = url; menu.Name = name; menu.Order = order; menu.ParentId = 0; menu.Icon = icon; menu.Permission = permission; pMenu.subMenus.Add(menu); } public static void AddPermission(string name, string url, int code) { if (Permissions.ContainsKey(code)) { if (url != "") { Permissions[code].Urls.Add(url); } } else { int pocde = 0; Type enumType = typeof(PermissionCode); Array enumValues = Enum.GetValues(enumType); foreach (var p in enumValues) { FieldInfo fieldInfo = enumType.GetField(p.ToString()); PermissionMapping customAttribute = (PermissionMapping)Attribute.GetCustomAttribute(fieldInfo, typeof(PermissionMapping)); if ((int)p == code && customAttribute != null) { pocde = customAttribute.PCode; break; } } Permission permission = new Permission(); permission.Name = name; permission.Id = code; permission.ParentId = pocde; if (url != "") { permission.Urls.Add(url); } Permissions[code] = permission; } } public static bool IsIgnored(string httpCmd) { return Ignored.Any(pair => pair.Key.Equals(httpCmd)); } public static bool IsWritLog(string httpCmd) { return logRequestList.Contains(httpCmd); } public static string GetUrlName(string url) { foreach (var pair in Permissions) { var urls = pair.Value.Urls; foreach (var u in urls) { if (u.Equals(url)) { return pair.Value.Name; } } } return ""; } //刷新菜单权限数据 public static void Flusher() { CheckPermissionCode(); AdminSvc.InitMenus(menus); AdminSvc.InitPermissions(Permissions); // Permissions.Clear(); // menus.Clear(); } } }