Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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;
                }
Пример #3
0
        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);
            }));
        }