namespace Admin.NET.Core.Service; /// /// 系统数据库管理服务 /// [ApiDescriptionSettings(Order = 145)] public class SysDatabaseService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly IViewEngine _viewEngine; private readonly CodeGenOptions _codeGenOptions; public SysDatabaseService(ISqlSugarClient db, IViewEngine viewEngine, IOptions codeGenOptions) { _db = db; _viewEngine = viewEngine; _codeGenOptions = codeGenOptions.Value; } /// /// 获取库列表 /// /// [HttpGet("/sysDatabase/list")] public List GetDbList() { return App.GetOptions().ConnectionConfigs.Select(u => u.ConfigId).ToList(); } /// /// 获取字段列表 /// /// 表名 /// ConfigId /// [HttpGet("/sysDatabase/columnList")] [AllowAnonymous] public List GetColumnList(string tableName, string configId = SqlSugarConst.ConfigId) { var db = _db.AsTenant().GetConnectionScope(configId); if (string.IsNullOrWhiteSpace(tableName)) return new List(); return db.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>(); } /// /// 增加列 /// /// [HttpPost("/sysDatabase/addColumn")] public void AddColumn(DbColumnInput input) { var column = new DbColumnInfo { ColumnDescription = input.ColumnDescription, DbColumnName = input.DbColumnName, IsIdentity = input.IsIdentity == 1, IsNullable = input.IsNullable == 1, IsPrimarykey = input.IsPrimarykey == 1, Length = input.Length, DecimalDigits = input.DecimalDigits, DataType = input.DataType }; var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.AddColumn(input.TableName, column); db.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription); if (column.IsPrimarykey) db.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName); } /// /// 删除列 /// /// [HttpPost("/sysDatabase/deleteColumn")] public void DeleteColumn(DeleteDbColumnInput input) { var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.DropColumn(input.TableName, input.DbColumnName); } /// /// 编辑列 /// /// [HttpPost("/sysDatabase/updateColumn")] public void UpdateColumn(UpdateDbColumnInput input) { var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.RenameColumn(input.TableName, input.OldColumnName, input.ColumnName); if (db.DbMaintenance.IsAnyColumnRemark(input.ColumnName, input.TableName)) db.DbMaintenance.DeleteColumnRemark(input.ColumnName, input.TableName); db.DbMaintenance.AddColumnRemark(input.ColumnName, input.TableName, string.IsNullOrWhiteSpace(input.Description) ? input.ColumnName : input.Description); } /// /// 获取表列表 /// /// ConfigId /// [HttpGet("/sysDatabase/tableList")] public List GetTableList(string configId = SqlSugarConst.ConfigId) { var db = _db.AsTenant().GetConnectionScope(configId); return db.DbMaintenance.GetTableInfoList(false); } /// /// 增加表 /// /// [HttpPost("/sysDatabase/addTable")] public void AddTable(DbTableInput input) { var columns = new List(); if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any()) throw Oops.Oh(ErrorCodeEnum.db1000); if (input.DbColumnInfoList.GroupBy(q => q.DbColumnName).Any(q => q.Count() > 1)) { throw Oops.Oh(ErrorCodeEnum.db1002); } input.DbColumnInfoList.ForEach(m => { columns.Add(new DbColumnInfo { DbColumnName = m.DbColumnName.Trim(), DataType = m.DataType, Length = m.Length, ColumnDescription = m.ColumnDescription, IsNullable = m.IsNullable == 1, IsIdentity = m.IsIdentity == 1, IsPrimarykey = m.IsPrimarykey == 1, DecimalDigits = m.DecimalDigits }); }); var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.CreateTable(input.TableName, columns, false); if (columns.Any(m => m.IsPrimarykey)) db.DbMaintenance.AddPrimaryKey(input.TableName, columns.FirstOrDefault(m => m.IsPrimarykey).DbColumnName); if (db.CurrentConnectionConfig.DbType == SqlSugar.DbType.Sqlite || db.CurrentConnectionConfig.DbType == SqlSugar.DbType.MySql) return; db.DbMaintenance.AddTableRemark(input.TableName, input.Description); input.DbColumnInfoList.ForEach(m => { db.DbMaintenance.AddColumnRemark(m.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(m.ColumnDescription) ? m.DbColumnName : m.ColumnDescription); }); } /// /// 删除表 /// /// [HttpPost("/sysDatabase/deleteTable")] public void DeleteTable(DeleteDbTableInput input) { var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.DropTable(input.TableName); } /// /// 编辑表 /// /// [HttpPost("/sysDatabase/updateTable")] public void UpdateTable(UpdateDbTableInput input) { var db = _db.AsTenant().GetConnectionScope(input.ConfigId); db.DbMaintenance.RenameTable(input.OldTableName, input.TableName); if (db.DbMaintenance.IsAnyTableRemark(input.TableName)) db.DbMaintenance.DeleteTableRemark(input.TableName); db.DbMaintenance.AddTableRemark(input.TableName, input.Description); } /// /// 创建实体 /// /// [HttpPost("/sysDatabase/createEntity")] public void CreateEntity(CreateEntityInput input) { input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position; input.EntityName = (input.EntityName == input.TableName && input.EntityName.Contains("_")) ? CodeGenUtil.CamelColumnName(input.EntityName, null) : input.EntityName; string[] dbColumnNames = _codeGenOptions.EntityBaseColumn[input.BaseClassName]; var templatePath = GetEntityTemplatePath(); var targetPath = GetEntityTargetPath(input); var db = _db.AsTenant().GetConnectionScope(input.ConfigId); DbTableInfo dbTableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName); if (dbTableInfo == null) throw Oops.Oh(ErrorCodeEnum.db1001); List dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false); if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase)) dbColumnInfos = dbColumnInfos.Where(c => !dbColumnNames.Contains(c.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList(); dbColumnInfos.ForEach(m => { m.DataType = CodeGenUtil.ConvertDataType(m); }); var tContent = File.ReadAllText(templatePath); var tResult = _viewEngine.RunCompileFromCached(tContent, new { NameSpace = $"{input.Position}.Entity", input.TableName, input.EntityName, BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}", input.ConfigId, dbTableInfo.Description, TableField = dbColumnInfos }); File.WriteAllText(targetPath, tResult, Encoding.UTF8); } /// /// 获取实体模板文件路径 /// /// private static string GetEntityTemplatePath() { var templatePath = App.WebHostEnvironment.WebRootPath + @"\Template\"; return Path.Combine(templatePath, "Entity.cs.vm"); } /// /// 设置生成实体文件路径 /// /// /// private static string GetEntityTargetPath(CreateEntityInput input) { var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity"); return Path.Combine(backendPath, input.EntityName + ".cs"); } }