diff --git a/backend/Magic.Core/Service/DataBase/DataBaseManager.cs b/backend/Magic.Core/Service/DataBase/DataBaseManager.cs index d4320cdec05b3937af67fb50e26a1ffdbac2de66..3afa0aa9b803e7acd68bf01161646ac2e7fedd23 100644 --- a/backend/Magic.Core/Service/DataBase/DataBaseManager.cs +++ b/backend/Magic.Core/Service/DataBase/DataBaseManager.cs @@ -3,6 +3,7 @@ using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Furion.ViewEngine; +using Magic.Core.Service.DataBase.Extension; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; @@ -13,216 +14,224 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Magic.Core.Service; - -/// -/// 数据库管理 -/// -[ApiDescriptionSettings(Name = "DataBase", Order = 200)] -public class DataBaseManager : IDataBaseManager, IDynamicApiController, ITransient +namespace Magic.Core.Service { - private readonly ISqlSugarClient _sqlSugarClient; - private readonly IViewEngine _viewEngine; - public DataBaseManager(ISqlSugarClient sqlSugarClient, IViewEngine viewEngine) - { - _sqlSugarClient = sqlSugarClient; - _viewEngine = viewEngine; - } /// - /// 添加列 + /// 数据库管理 /// - /// - [HttpPost("/column/add")] - public void ColumnAdd(DbColumnInfoInput input) + [ApiDescriptionSettings(Name = "DataBase", Order = 200)] + public class DataBaseManager : IDataBaseManager, IDynamicApiController, ITransient { - DbColumnInfo column = new DbColumnInfo(); - column.ColumnDescription = input.ColumnDescription; - column.DbColumnName = input.DbColumnName; - column.IsIdentity = input.IsIdentity == 1; - column.IsNullable = input.IsNullable == 1; - column.IsPrimarykey = input.IsPrimarykey == 1; - column.Length = input.Length; - column.DecimalDigits = input.DecimalDigits; - column.DataType = input.DataType; - _sqlSugarClient.DbMaintenance.AddColumn(input.TableName, column); - _sqlSugarClient.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription); - if (column.IsPrimarykey) + private readonly ISqlSugarClient _sqlSugarClient; + private readonly IViewEngine _viewEngine; + + public DataBaseManager(ISqlSugarClient sqlSugarClient, IViewEngine viewEngine) { - _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName); + _sqlSugarClient = sqlSugarClient; + _viewEngine = viewEngine; } - } - - /// - /// 删除列 - /// - /// - [HttpPost("/column/delete")] - public void ColumnDelete(DbColumnInfoOutput input) - { - _sqlSugarClient.DbMaintenance.DropColumn(input.TableName, input.DbColumnName); - } - /// - /// 编辑列 - /// - /// - [HttpPost("/column/edit")] - public void ColumnEdit(EditColumnInput input) - { - _sqlSugarClient.DbMaintenance.RenameColumn(input.TableName, input.OldName, input.DbColumnName); - if (_sqlSugarClient.DbMaintenance.IsAnyColumnRemark(input.DbColumnName, input.TableName)) { - _sqlSugarClient.DbMaintenance.DeleteColumnRemark(input.DbColumnName, input.TableName); + /// + /// 添加列 + /// + /// + [HttpPost("/column/add")] + public void ColumnAdd(DbColumnInfoInput input) + { + DbColumnInfo column = new DbColumnInfo(); + column.ColumnDescription = input.ColumnDescription; + column.DbColumnName = input.DbColumnName; + column.IsIdentity = input.IsIdentity == 1; + column.IsNullable = input.IsNullable == 1; + column.IsPrimarykey = input.IsPrimarykey == 1; + column.Length = input.Length; + column.DecimalDigits = input.DecimalDigits; + column.DataType = input.DataType; + _sqlSugarClient.DbMaintenance.AddColumn(input.TableName, column); + _sqlSugarClient.DbMaintenance.AddColumnRemarkEx(input.DbColumnName, input.TableName, input.ColumnDescription); + if (column.IsPrimarykey) + { + _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName); + } } - _sqlSugarClient.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(input.ColumnDescription) ? input.DbColumnName : input.ColumnDescription); - } + /// + /// 删除列 + /// + /// + [HttpPost("/column/delete")] + public void ColumnDelete(DbColumnInfoOutput input) + { + _sqlSugarClient.DbMaintenance.DropColumn(input.TableName, input.DbColumnName); + } + /// + /// 编辑列 + /// + /// + [HttpPost("/column/edit")] + public void ColumnEdit(EditColumnInput input) + { + _sqlSugarClient.DbMaintenance.RenameColumn(input.TableName, input.OldName, input.DbColumnName); + if (_sqlSugarClient.DbMaintenance.IsAnyColumnRemarkEx(input.DbColumnName, input.TableName)) + { + _sqlSugarClient.DbMaintenance.DeleteColumnRemark(input.DbColumnName, input.TableName); + } + _sqlSugarClient.DbMaintenance.AddColumnRemarkEx(input.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(input.ColumnDescription) ? input.DbColumnName : input.ColumnDescription); + } - /// - /// 获取表字段 - /// - /// - /// - [HttpGet("/dataBase/columnInfoList")] - public List GetColumnInfosByTableName(string tableName) - { - if (string.IsNullOrWhiteSpace(tableName)) - return new List(); - return _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>(); - } + /// + /// 获取表字段 + /// + /// + /// + [HttpGet("/dataBase/columnInfoList")] + public List GetColumnInfosByTableName(string tableName) + { + if (string.IsNullOrWhiteSpace(tableName)) + return new List(); + return _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>(); + } - /// - /// 获取所有表 - /// - /// - [HttpGet("/dataBase/tableInfoList")] - public List GetTableInfoList() - { - return _sqlSugarClient.DbMaintenance.GetTableInfoList(false); - } - /// - /// 新增表 - /// - /// - [HttpPost("/table/add")] - public void TableAdd(DbTableInfoInput input) - { - List columns = new List(); - if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any()) + /// + /// 获取所有表 + /// + /// + [HttpGet("/dataBase/tableInfoList")] + public List GetTableInfoList() { - throw Oops.Oh(ErrorCode.db1000); + return _sqlSugarClient.DbMaintenance.GetTableInfoList(false); } - input.DbColumnInfoList.ForEach(m => + + /// + /// 新增表 + /// + /// + [HttpPost("/table/add")] + public void TableAdd(DbTableInfoInput input) { - columns.Add(new DbColumnInfo + List columns = new List(); + if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any()) { - DbColumnName = m.DbColumnName, - DataType = m.DataType, - Length = m.Length, - ColumnDescription = m.ColumnDescription, - IsNullable = m.IsNullable == 1, - IsIdentity = m.IsIdentity == 1, - IsPrimarykey = m.IsPrimarykey == 1, - DecimalDigits = m.DecimalDigits + throw Oops.Oh(ErrorCode.db1000); + } + input.DbColumnInfoList.ForEach(m => + { + columns.Add(new DbColumnInfo + { + DbColumnName = m.DbColumnName, + DataType = m.DataType, + Length = m.Length, + ColumnDescription = m.ColumnDescription, + IsNullable = m.IsNullable == 1, + IsIdentity = m.IsIdentity == 1, + IsPrimarykey = m.IsPrimarykey == 1, + DecimalDigits = m.DecimalDigits + }); + }); + _sqlSugarClient.DbMaintenance.CreateTable(input.Name, columns, false); + _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description); + if (columns.Any(m => m.IsPrimarykey)) + { + _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.Name, columns.FirstOrDefault(m => m.IsPrimarykey).DbColumnName); + } + input.DbColumnInfoList.ForEach(m => + { + _sqlSugarClient.DbMaintenance.AddColumnRemarkEx(m.DbColumnName, input.Name, m.DbColumnName); }); - }); - _sqlSugarClient.DbMaintenance.CreateTable(input.Name, columns, false); - _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description); - if (columns.Any(m => m.IsPrimarykey)) - { - _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.Name, columns.FirstOrDefault(m => m.IsPrimarykey).DbColumnName); } - input.DbColumnInfoList.ForEach(m => + + /// + /// 删除表 + /// + /// + [HttpPost("/table/delete")] + public void TableDelete(DbTableInfo input) { - _sqlSugarClient.DbMaintenance.AddColumnRemark(m.DbColumnName, input.Name, string.IsNullOrWhiteSpace(m.ColumnDescription) ? m.DbColumnName : m.ColumnDescription); - }); - } - /// - /// 删除表 - /// - /// - [HttpPost("/table/delete")] - public void TableDelete(DbTableInfo input) - { - _sqlSugarClient.DbMaintenance.DropTable(input.Name); - } - /// - /// 编辑表 - /// - /// - [HttpPost("/table/edit")] - public void TableEdit(EditTableInput input) - { - _sqlSugarClient.DbMaintenance.RenameTable(input.OldName, input.Name); - if (_sqlSugarClient.DbMaintenance.IsAnyTableRemark(input.Name)) { - _sqlSugarClient.DbMaintenance.DeleteTableRemark(input.Name); + _sqlSugarClient.DbMaintenance.DropTable(input.Name); } - _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description); - } - [HttpPost("/table/createEntity")] - public void CreateEntity(CreateEntityInput input) - { - Type baseType = Type.GetType($"Magic.Core.Entity.{input.BaseClassName}"); - - if (baseType.IsNullOrZero()) - throw Oops.Oh("父类不存在"); - - var baseTypeProperties = baseType.GetProperties().Select(m=>m.Name).ToList(); - - input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Magic.Application" : input.Position; - input.BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}"; - var templatePath = GetTemplatePath(); - var targetPath = GetTargetPath(input); - DbTableInfo dbTableInfo = _sqlSugarClient.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName); - if (dbTableInfo == null) - throw Oops.Oh(ErrorCode.db1001); - List dbColumnInfos = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(input.TableName,false).Where(m=> !baseTypeProperties.Contains(m.DbColumnName)).ToList(); - dbColumnInfos.ForEach(m => - { - m.DataType = CodeGenUtil.ConvertDataType(m.DataType); - }); - var tContent = File.ReadAllText(templatePath); - var tResult = _viewEngine.RunCompileFromCached(tContent, new + /// + /// 编辑表 + /// + /// + [HttpPost("/table/edit")] + public void TableEdit(EditTableInput input) { - input.TableName, - input.EntityName, - input.BaseClassName, - dbTableInfo.Description, - TableField = dbColumnInfos - }); - - #region 检查目录是否存在 - FileInfo fileInfo = new FileInfo(targetPath); - string entityPath = fileInfo.DirectoryName; - if (!Directory.Exists(entityPath)) - { - Directory.CreateDirectory(entityPath); + _sqlSugarClient.DbMaintenance.RenameTable(input.OldName, input.Name); + if (_sqlSugarClient.DbMaintenance.IsAnyTableRemarkEx(input.Name)) + { + _sqlSugarClient.DbMaintenance.DeleteTableRemark(input.Name); + } + _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description); } - #endregion - File.WriteAllText(targetPath, tResult, Encoding.UTF8); - } + [HttpPost("/table/createEntity")] + public void CreateEntity(CreateEntityInput input) + { + Type baseType = Type.GetType($"Magic.Core.Entity.{input.BaseClassName}"); + + if (baseType.IsNullOrZero()) + throw Oops.Oh("父类不存在"); + + var baseTypeProperties = baseType.GetProperties().Select(m => m.Name).ToList(); + + input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Magic.Application" : input.Position; + input.BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}"; + var templatePath = GetTemplatePath(); + var targetPath = GetTargetPath(input); + DbTableInfo dbTableInfo = _sqlSugarClient.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName); + if (dbTableInfo == null) + throw Oops.Oh(ErrorCode.db1001); + List dbColumnInfos = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(input.TableName, false).Where(m => !baseTypeProperties.Contains(m.DbColumnName)).ToList(); + dbColumnInfos.ForEach(m => + { + m.DataType = CodeGenUtil.ConvertDataType(m.DataType); + }); + var tContent = File.ReadAllText(templatePath); + var tResult = _viewEngine.RunCompileFromCached(tContent, new + { + input.TableName, + input.EntityName, + input.BaseClassName, + dbTableInfo.Description, + TableField = dbColumnInfos + }); - /// - /// 获取模板文件路径集合 - /// - /// - private string GetTemplatePath() - { - var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); - return Path.Combine(templatePath, "Entity.cs.vm"); - } + #region 检查目录是否存在 - /// - /// 设置生成文件路径 - /// - /// - /// - private string GetTargetPath(CreateEntityInput input) - { - var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity"); - var entityPath = Path.Combine(backendPath, input.EntityName + ".cs"); - return entityPath; + FileInfo fileInfo = new FileInfo(targetPath); + string entityPath = fileInfo.DirectoryName; + if (!Directory.Exists(entityPath)) + { + Directory.CreateDirectory(entityPath); + } + + #endregion 检查目录是否存在 + + File.WriteAllText(targetPath, tResult, Encoding.UTF8); + } + + /// + /// 获取模板文件路径集合 + /// + /// + private string GetTemplatePath() + { + var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); + return Path.Combine(templatePath, "Entity.cs.vm"); + } + + /// + /// 设置生成文件路径 + /// + /// + /// + private string GetTargetPath(CreateEntityInput input) + { + var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity"); + var entityPath = Path.Combine(backendPath, input.EntityName + ".cs"); + return entityPath; + } } -} +} \ No newline at end of file diff --git a/backend/Magic.Core/Service/DataBase/Extension/DbMaintenanceExtension.cs b/backend/Magic.Core/Service/DataBase/Extension/DbMaintenanceExtension.cs new file mode 100644 index 0000000000000000000000000000000000000000..54d9b7a44a815c580c700804d2e788f232ca8a69 --- /dev/null +++ b/backend/Magic.Core/Service/DataBase/Extension/DbMaintenanceExtension.cs @@ -0,0 +1,46 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Magic.Core.Service.DataBase.Extension +{ + internal static class DbMaintenanceExtension + { + public static bool IsAnyTableRemarkEx(this IDbMaintenance dbMaintenance, string tableName) + { + string sql = $"select * from information_schema.`Tables` where table_name='{tableName}'"; + + return dbMaintenance.Context.CurrentConnectionConfig.DbType switch + { + DbType.MySql => dbMaintenance.Context.Ado.GetDataTable(sql).Rows?.Count > 0, + _ => dbMaintenance.IsAnyTableRemark(tableName) + }; + } + + public static bool IsAnyColumnRemarkEx(this IDbMaintenance dbMaintenance, string tableName, string columnName) + { + string sql = $"select * from information_schema.`Columns` where table_name='{tableName}' and column_name='{columnName}'"; + + return dbMaintenance.Context.CurrentConnectionConfig.DbType switch + { + DbType.MySql => dbMaintenance.Context.Ado.GetDataTable(sql).Rows?.Count > 0, + _ => dbMaintenance.IsAnyColumnRemark(columnName, tableName) + }; + } + + public static void AddColumnRemarkEx(this IDbMaintenance dbMaintenance, string columnName, string tableName, string columnDescription) + { + if (dbMaintenance.Context.CurrentConnectionConfig.DbType == DbType.MySql) + dbMaintenance.UpdateColumn(tableName, new DbColumnInfo + { + DataType = $"VARCHAR(255) NOT NULL COMMENT '{(string.IsNullOrWhiteSpace(columnDescription) ? columnName : columnDescription)}'", + DbColumnName = columnName + }); + else + dbMaintenance.AddColumnRemark(columnName, tableName, string.IsNullOrWhiteSpace(columnDescription) ? columnName : columnDescription); + } + } +} \ No newline at end of file