/// <summary> /// 获取状态 /// </summary> /// <returns></returns> public async Task <IActionResult> OnGetXncfStatAsync() { //所有已安装模块 var installedXncfModules = await _xncfModuleServiceEx.GetFullListAsync(z => true); //未安装或待升级模块 var updateXncfRegisters = _xncfModuleServiceEx.GetUnInstallXncfModule(installedXncfModules); //未安装货代升级模块的版本 var newVersions = updateXncfRegisters.Select(z => _xncfModuleServiceEx.GetVersionDisplayName(installedXncfModules, z)); //需要升级的版本号 var newXncfCount = newVersions.Count(z => !z.Contains("->")); //全新未安装的版本号 var updateVersionXncfCount = newVersions.Count() - newXncfCount; //安装后缺失的模块 var xncfRegisterManager = new XncfRegisterManager(_serviceProvider); var missingXncfCount = installedXncfModules.Count(z => !XncfRegisterManager.RegisterList.Exists(r => r.Uid == z.Uid)); var data = new { success = true, data = new { installedXncfCount = installedXncfModules.Count, updateVersionXncfCount, newXncfCount, missingXncfCount } }; return(new JsonResult(data)); }
/// <summary> /// 获取 Admin 后台左侧菜单结构 /// </summary> /// <param name="sysMenuTreeItems"></param> /// <returns></returns> private async Task <IEnumerable <SysMenuTreeItemDto> > GetSysMenuTreesMainRecursiveAsync(IEnumerable <SysMenuDto> sysMenuTreeItems) { bool hideModuleManager = FullSystemConfig.HideModuleManager == true;//是否处于发布状态,需要隐藏部分菜单 List <SysMenuTreeItemDto> sysMenuTrees = new List <SysMenuTreeItemDto>(); List <SysMenuDto> dest = new List <SysMenuDto>(); int index = 60000; XncfRegisterManager xncfRegisterManager = new XncfRegisterManager(_serviceProvider); //遍历菜单设置项目,查找和 XNCF 模块有关的菜单节点 foreach (var item in sysMenuTreeItems) { //定位 XNCF 模块 IXncfRegister xncfRegister = XncfRegisterList .FirstOrDefault(z => !string.IsNullOrEmpty(item.Url) && item.Url.Contains($"uid={z.Uid}", StringComparison.OrdinalIgnoreCase)); //TODO:判断Xncf条件还可以更细 var isStoredXncf = !string.IsNullOrEmpty(item.Url) && item.Url.Contains("uid=", StringComparison.OrdinalIgnoreCase); //在数据库里面注册为模块 var xncfMissing = isStoredXncf && xncfRegister == null; //程序集未加载 if (xncfRegister != null && xncfRegister is Senparc.Ncf.Core.Areas.IAreaRegister xncfAreapage && xncfAreapage.AareaPageMenuItems.Count() > 0) { if (hideModuleManager) { item.ParentId = null; item.Id = (index++).ToString(); } else { dest.Add(new SysMenuDto() { MenuName = "设置/执行", Url = item.Url, Id = (index++).ToString(), ParentId = item.Id, Icon = "fa fa-play" }); } dest.AddRange(xncfAreapage.AareaPageMenuItems.Select(_ => new SysMenuDto() { MenuName = _.Name, Url = _.Url, Icon = _.Icon, Id = string.IsNullOrEmpty(_.Id) ? (index++).ToString() : _.Id, ParentId = string.IsNullOrEmpty(_.ParentId) ? item.Id : _.ParentId })); item.Url = string.Empty; }
public void ThreadConfig(XncfThreadBuilder xncfThreadBuilder) { xncfThreadBuilder.AddThreadInfo(new Ncf.XncfBase.Threads.ThreadInfo( name: "定时备份", intervalTime: TimeSpan.FromSeconds(30), task: async(app, threadInfo) => { try { //SenparcTrace.SendCustomLog("执行调试", "DatabaseToolkit.Register.ThreadConfig"); threadInfo.RecordStory("开始检测并备份"); using (var scope = app.ApplicationServices.CreateScope()) { var serviceProvider = scope.ServiceProvider; //检测当前模块是否可用 XncfRegisterManager xncfRegisterManager = new XncfRegisterManager(serviceProvider); var xncfIsValiable = await xncfRegisterManager.CheckXncfValiable(this); if (!xncfIsValiable) { throw new NcfModuleException($"{this.MenuName} 模块当前不可用,跳过数据库自动备份轮询"); } //初始化数据库备份方法 BackupDatabase backupDatabase = new BackupDatabase(serviceProvider); //初始化参数 var backupParam = new BackupDatabase.BackupDatabase_Parameters(); var dbConfigService = serviceProvider.GetService <ServiceBase <DbConfig> >(); var dbConfig = await dbConfigService.GetObjectAsync(z => true); var stopBackup = false; try { if (dbConfig != null && dbConfig.BackupCycleMinutes > 0 && !dbConfig.BackupPath.IsNullOrEmpty()) { if (SystemTime.NowDiff(dbConfig.LastBackupTime) > TimeSpan.FromMinutes(dbConfig.BackupCycleMinutes)) { backupParam.Path = dbConfig.BackupPath; //await backupParam.LoadData(serviceProvider); //threadInfo.RecordStory("完成备份设置数据载入"); } else { stopBackup = true; } } else { threadInfo.RecordStory("不需要备份,或没有设置备份周期/路径,已忽略本次备份计划"); stopBackup = true; //不需要备份,或没有设置,返回 } } catch (Exception ex) { threadInfo.RecordStory($@"遇到异常,可能未配置数据库,已忽略本次备份计划。如需启动,请更新此模块到最新版本。 异常信息:{ex.Message} {ex.StackTrace}"); stopBackup = true; //可能没有配置数据库,返回 } if (stopBackup) { return; } //执行备份方法 threadInfo.RecordStory("备份开始:" + backupParam.Path); var result = backupDatabase.Run(backupParam); if (!result.Success) { threadInfo.RecordStory("执行备份发生异常:" + result.Message); throw new Exception("执行备份发生异常"); } dbConfig.RecordBackupTime(); await dbConfigService.SaveObjectAsync(dbConfig); threadInfo.RecordStory("完成数据库自动备份:" + result.Message); SenparcTrace.SendCustomLog("完成数据库自动备份", backupParam.Path); } } catch (NcfModuleException ex) { throw; } catch { throw; } finally { threadInfo.RecordStory("检测并备份结束"); } }, exceptionHandler: ex => { SenparcTrace.SendCustomLog("DatabaseToolkit", $@"{ex.Message} {ex.StackTrace} {ex.InnerException?.StackTrace}"); return(Task.CompletedTask); })); }