From 61beac9ef2486c4df968fa65a782084a27ec9e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= <454313500@qq.com> Date: Fri, 22 Dec 2023 18:57:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AE=9A=E6=97=B6=E5=A4=87=E4=BB=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ISqlSugarDbContext.cs | 5 ++ .../DbConnOptions.cs | 2 + .../SqlSugarDbContext.cs | 45 ++++++++++++++++-- .../Yi.Framework.SqlSugarCore.csproj | 1 + .../Jobs/BackupDataBaseJob.cs | 47 ++++++++++++++----- .../Options/RbacOptions.cs | 5 ++ Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs | 2 +- Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj | 1 + Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json | 5 +- 9 files changed, 95 insertions(+), 18 deletions(-) diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/ISqlSugarDbContext.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/ISqlSugarDbContext.cs index a76d9a51..eed39e76 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/ISqlSugarDbContext.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/ISqlSugarDbContext.cs @@ -12,5 +12,10 @@ namespace Yi.Framework.SqlSugarCore.Abstractions { // IAbpLazyServiceProvider LazyServiceProvider { get; set; } ISqlSugarClient SqlSugarClient { get; } + + /// + /// 数据库备份 + /// + void BackupDataBase(); } } diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/DbConnOptions.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/DbConnOptions.cs index a31abf1d..4beaa57b 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/DbConnOptions.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/DbConnOptions.cs @@ -43,5 +43,7 @@ namespace Yi.Framework.SqlSugarCore /// 读写分离 /// public List? ReadUrl { get; set; } + + } } diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs index 77cfd63f..01a70e75 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs @@ -218,13 +218,13 @@ namespace Yi.Framework.SqlSugarCore /// /// /// - protected virtual void OnLogExecuting(string sql , SugarParameter[] pars) + protected virtual void OnLogExecuting(string sql, SugarParameter[] pars) { if (Options.EnabledSqlLog) { - Logger.CreateLogger().LogDebug("Yi-SQL执行:"+UtilMethods.GetSqlString(DbType.SqlServer, sql, pars)); + Logger.CreateLogger().LogDebug("Yi-SQL执行:" + UtilMethods.GetSqlString(DbType.SqlServer, sql, pars)); } - + } /// @@ -234,6 +234,45 @@ namespace Yi.Framework.SqlSugarCore /// protected virtual void OnLogExecuted(string sql, SugarParameter[] pars) { + } + + public void BackupDataBase() + { + string directoryName = "database_backup"; + string fileName = DateTime.Now.ToString($"yyyyMMdd_HHmmss")+ $"_{SqlSugarClient.Ado.Connection.Database}"; + if (!Directory.Exists(directoryName)) + { + Directory.CreateDirectory(directoryName); + } + switch (Options.DbType) + { + case DbType.MySql: + //MySql + SqlSugarClient.DbMaintenance.BackupDataBase(SqlSugarClient.Ado.Connection.Database, $"{Path.Combine(directoryName, fileName) }.sql");//mysql 只支持.net core + break; + + + case DbType.Sqlite: + //Sqlite + SqlSugarClient.DbMaintenance.BackupDataBase(null, $"{fileName}.db"); //sqlite 只支持.net core + break; + + + case DbType.SqlServer: + //SqlServer + SqlSugarClient.DbMaintenance.BackupDataBase(SqlSugarClient.Ado.Connection.Database, $"{Path.Combine(directoryName, fileName)}.bak"/*服务器路径*/);//第一个参数库名 + break; + + + default: + throw new NotImplementedException("其他数据库备份未实现"); + + } + + + + + } } } diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Yi.Framework.SqlSugarCore.csproj b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Yi.Framework.SqlSugarCore.csproj index 8675531b..9b032976 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Yi.Framework.SqlSugarCore.csproj +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Yi.Framework.SqlSugarCore.csproj @@ -3,6 +3,7 @@ + diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Jobs/BackupDataBaseJob.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Jobs/BackupDataBaseJob.cs index ac05fe7e..9f5abc10 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Jobs/BackupDataBaseJob.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Jobs/BackupDataBaseJob.cs @@ -3,21 +3,42 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Quartz; +using Quartz.Logging; using Volo.Abp.BackgroundWorkers.Quartz; +using Volo.Abp.Domain.Repositories; +using Yi.Framework.Rbac.Domain.Shared.Options; +using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.Rbac.Application.Jobs { - //public class BackupDataBaseJob : QuartzBackgroundWorkerBase - //{ - // public TestJob() - // { - // JobDetail = JobBuilder.Create().WithIdentity(nameof(TestJob)).Build(); - // Trigger = TriggerBuilder.Create().WithIdentity(nameof(TestJob)).WithCronSchedule("* * * * * ? *").Build(); - // } - // public override Task Execute(IJobExecutionContext context) - // { - // Console.WriteLine("你好,世界"); - // return Task.CompletedTask; - // } - //} + public class BackupDataBaseJob : QuartzBackgroundWorkerBase + { + private ISqlSugarDbContext _dbContext; + public BackupDataBaseJob(ISqlSugarDbContext dbContext) + { + _dbContext = dbContext; + JobDetail = JobBuilder.Create().WithIdentity(nameof(BackupDataBaseJob)).Build(); + + //每天00点与24点进行备份 + Trigger = TriggerBuilder.Create().WithIdentity(nameof(BackupDataBaseJob)).WithCronSchedule("0 0 0,12 * * ? ").Build(); + //Trigger = TriggerBuilder.Create().WithIdentity(nameof(BackupDataBaseJob)).WithSimpleSchedule(x=>x.WithIntervalInSeconds(10)).Build(); + } + public override Task Execute(IJobExecutionContext context) + { + var options = LazyServiceProvider.GetRequiredService>(); + if (options.Value.EnableDataBaseBackup) + { + var logger = LoggerFactory.CreateLogger(); + logger.LogWarning("正在进行数据库备份"); + _dbContext.BackupDataBase(); + logger.LogWarning("数据库备份已完成"); + + } + return Task.CompletedTask; + } + } } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs index 86602947..596594b3 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs @@ -22,5 +22,10 @@ namespace Yi.Framework.Rbac.Domain.Shared.Options /// 是否开启用户注册功能 /// public bool EnableRegister { get; set; } = false; + + /// + /// 是否开启数据库备份 + /// + public bool EnableDataBaseBackup { get; set; } = false; } } diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs b/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs index b0f0f73e..428bf158 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs @@ -9,7 +9,7 @@ Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft.AspNetCore.Hosting.Diagnostics",LogEventLevel.Error) .MinimumLevel.Override("Quartz", LogEventLevel.Warning) .Enrich.FromLogContext() -.WriteTo.Async(c => c.File("Logs/log-.txt", rollingInterval: RollingInterval.Day)) +.WriteTo.Async(c => c.File("logs/log-.txt", rollingInterval: RollingInterval.Day)) .WriteTo.Async(c => c.Console()) .CreateLogger(); diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj b/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj index 49d86308..2d64e460 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj @@ -36,6 +36,7 @@ + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json b/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json index 6ac03747..cc9f5c7e 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json @@ -47,6 +47,9 @@ "EnableCaptcha": true, //是否开启注册功能 - "EnableRegister": false + "EnableRegister": false, + + //开启定时数据库备份 + "EnableDataBaseBackup": false } }