| | |
| | | using log4net; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Data; |
| | | using System.IO; |
| | | using System.Reflection; |
| | | using System.Threading; |
| | |
| | | private static ILog log = LogManager.GetLogger("PluginLoader"); |
| | | private static string PluginFolder = PathHelper.PluginFolder(); |
| | | |
| | | public bool Completed { get; private set; } = false; |
| | | public SqliteHelper sqliteHelper; |
| | | public List<PluginInfo> Menus { get; private set; } |
| | | public List<PluginInfo> Plugins { get; private set; } |
| | |
| | | { |
| | | Instance = null; |
| | | } |
| | | GC.Collect(); |
| | | } |
| | | |
| | | public static PluginLoader GetLoader() |
| | |
| | | LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED }); |
| | | }); |
| | | } |
| | | pluginContainer.DoCloseEvent += PluginContainer_DoCloseEvent; |
| | | } |
| | | |
| | | private void PluginContainer_DoCloseEvent(object sender, EventArgs e) |
| | | { |
| | | Reset(); |
| | | } |
| | | |
| | | private void LoadChildrenMenu() |
| | |
| | | foreach (var menu in Plugins) |
| | | { |
| | | CountdownEvent c = new CountdownEvent(1); |
| | | Thread.Sleep(80); |
| | | Thread.Sleep(50); |
| | | Application.Current.Dispatcher.Invoke(new Action(() => |
| | | { |
| | | try |
| | |
| | | } |
| | | } |
| | | |
| | | private PluginInfo ConvertPermission2PluginInfo(PermissionData data) |
| | | { |
| | | if (data.Type == "权限") return null; |
| | | PluginInfo info = new PluginInfo |
| | | { |
| | | Code = data.Code, |
| | | Name = data.Name, |
| | | Type = data.Type, |
| | | ParentCode = data.ParentCode, |
| | | DllPath = data.DllPath, |
| | | ClassName = data.ClassName, |
| | | IconFont = data.IconFont |
| | | //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString()))) |
| | | }; |
| | | if (data.Children != null && data.Children.Count > 0) |
| | | { |
| | | foreach (var child in data.Children) |
| | | { |
| | | var childInfo = ConvertPermission2PluginInfo(child); |
| | | if (childInfo != null) info.Children.Add(childInfo); |
| | | } |
| | | } |
| | | return info; |
| | | } |
| | | |
| | | public List<PluginInfo> LoadTreeMenu(Dispatcher dispatcher) |
| | | { |
| | | //LoadMessageAppend?.Invoke(this, "开始加载菜单..."); |
| | | List<PluginInfo> data = new List<PluginInfo>(); |
| | | List<PluginInfo> menus = new List<PluginInfo>(); |
| | | Dictionary<string, PluginInfo> cache = new Dictionary<string, PluginInfo>(); |
| | | try |
| | | { |
| | | UserInfo user = UserInfo.User; |
| | | string sql = $@"SELECT DISTINCT m.* FROM menu AS m INNER JOIN role_menu_rel AS rrel ON m.code = rrel.menuCode |
| | | INNER JOIN role AS r ON rrel.roleCode = r.code |
| | | INNER JOIN user_role_rel AS urel ON r.code = urel.roleCode |
| | | AND urel.username = '{user.Username}' ORDER BY m.level,m.sort, m.id;"; |
| | | |
| | | DataTable dt = sqliteHelper.GetDataTable(sql); |
| | | if (dt != null) |
| | | List<PermissionData> allPermissions = UserInfo.User?.AllPermissions; |
| | | if (allPermissions != null) |
| | | { |
| | | Application.Current.Dispatcher.Invoke(() => |
| | | { |
| | |
| | | new LoadMsg |
| | | { |
| | | Type = LoadMsgType.INIT, |
| | | NumData = dt.Rows.Count, |
| | | Message = this.lang("App.MenuCount", dt.Rows.Count), |
| | | NumData = allPermissions.Count, |
| | | Message = this.lang("App.MenuCount", allPermissions.Count), |
| | | }); |
| | | |
| | | foreach (DataRow dr in dt.Rows) |
| | | foreach (PermissionData data in allPermissions) |
| | | { |
| | | string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString()); |
| | | if (data.Type == "Permission") continue; |
| | | var menu = new PluginInfo |
| | | { |
| | | Code = dr["code"].ToString(), |
| | | Name = dr["name"].ToString(), |
| | | Type = dr["type"].ToString(), |
| | | ParentCode = dr["parentCode"].ToString(), |
| | | DllPath = dr["dllPath"].ToString(), |
| | | ClassName = dr["className"].ToString(), |
| | | IconFont = dr["icon"].ToString() |
| | | //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString()))) |
| | | Code = data.Code, |
| | | Name = data.Name, |
| | | Type = data.Type, |
| | | ParentCode = data.ParentCode, |
| | | DllPath = data.DllPath, |
| | | ClassName = data.ClassName, |
| | | IconFont = data.IconFont |
| | | }; |
| | | cache[menu.Code] = menu; |
| | | if (!cache.ContainsKey(menu.ParentCode)) |
| | | { |
| | | data.Add(menu); |
| | | menus.Add(menu); |
| | | } |
| | | else |
| | | { |
| | |
| | | { |
| | | //LoadMessageAppend?.Invoke(this, ex.Message); |
| | | } |
| | | return data; |
| | | return menus; |
| | | } |
| | | } |
| | | } |