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
}
}