From 98278bad9e639711a61cf62588cbea41c19ffec1 Mon Sep 17 00:00:00 2001 From: "DEVICE8\\12494" Date: Thu, 6 Apr 2023 14:10:53 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=A0=B9=E6=8D=AE=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E5=88=A0=E9=99=A4=E8=A1=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=81=E7=A7=BB=E8=87=B3DataModel=20?= =?UTF-8?q?=E5=B7=B2=E6=9C=89=E6=8E=A5=E5=8F=A3=E4=B8=8B=202=E3=80=81?= =?UTF-8?q?=E5=B0=86=E6=A0=B9=E6=8D=AE=E8=A1=A8=E6=98=8E=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=EF=BC=8C=E4=BB=A3=E7=A0=81=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=E5=B7=B2=E6=9C=89=E6=95=B0=E6=8D=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3DataModel=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tnb.BasicData.Entitys/Class1.cs | 7 - Tnb.BasicData.Entitys/Mapper/Mapper.cs | 19 +++ .../Tnb.BasicData.Entitys.csproj | 1 + Tnb.BasicData/DataTableOperateService.cs | 72 ---------- .../DataBase/DatabaseTableDataCleanInput.cs | 6 +- .../Mapper/ConnectionMapper.cs | 24 ++++ system/Tnb.Systems/System/DataBaseService.cs | 126 ++++++++++++++++-- 7 files changed, 165 insertions(+), 90 deletions(-) delete mode 100644 Tnb.BasicData.Entitys/Class1.cs create mode 100644 Tnb.BasicData.Entitys/Mapper/Mapper.cs delete mode 100644 Tnb.BasicData/DataTableOperateService.cs rename Tnb.BasicData.Entitys/Dto/DataModeing/CleanTableDataInput.cs => system/Tnb.Systems.Entitys/Dto/System/DataBase/DatabaseTableDataCleanInput.cs (79%) create mode 100644 system/Tnb.Systems.Entitys/Mapper/ConnectionMapper.cs diff --git a/Tnb.BasicData.Entitys/Class1.cs b/Tnb.BasicData.Entitys/Class1.cs deleted file mode 100644 index 0264ac3e..00000000 --- a/Tnb.BasicData.Entitys/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Tnb.BasicData.Entitys -{ - public class Class1 - { - - } -} \ No newline at end of file diff --git a/Tnb.BasicData.Entitys/Mapper/Mapper.cs b/Tnb.BasicData.Entitys/Mapper/Mapper.cs new file mode 100644 index 00000000..e3260080 --- /dev/null +++ b/Tnb.BasicData.Entitys/Mapper/Mapper.cs @@ -0,0 +1,19 @@ +using JNPF.Systems.Entitys.System; +using Mapster; +using SqlSugar; + +namespace Tnb.BasicData.Entitys.Mapper +{ + public class Mapper : IRegister + { + public void Register(TypeAdapterConfig config) + { + config.ForType() + .Map(dest => dest.ConnectionString, src => src.DefaultConnection) + .AfterMapping((src, dest) => + { + dest.ConnectionString = string.Format(src.DefaultConnection, src.Host, src.Port, src.DBName, src.UserName, src.Password); + }); + } + } +} diff --git a/Tnb.BasicData.Entitys/Tnb.BasicData.Entitys.csproj b/Tnb.BasicData.Entitys/Tnb.BasicData.Entitys.csproj index 1cc24961..dbd75127 100644 --- a/Tnb.BasicData.Entitys/Tnb.BasicData.Entitys.csproj +++ b/Tnb.BasicData.Entitys/Tnb.BasicData.Entitys.csproj @@ -7,6 +7,7 @@ + diff --git a/Tnb.BasicData/DataTableOperateService.cs b/Tnb.BasicData/DataTableOperateService.cs deleted file mode 100644 index dbff32ec..00000000 --- a/Tnb.BasicData/DataTableOperateService.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using JNPF.Common.Configuration; -using JNPF.Common.Core.Manager; -using JNPF.DependencyInjection; -using JNPF.DynamicApiController; -using JNPF.Systems.Entitys.System; -using JNPF.Systems.Interfaces.System; -using Microsoft.AspNetCore.Mvc; -using Org.BouncyCastle.Bcpg.OpenPgp; -using Senparc.Weixin.MP.AdvancedAPIs.NewTmpl.NewTmplJson; -using SqlSugar; -using Tnb.BasicData.Entitys.Dto.DataModeing; - -namespace Tnb.BasicData -{ - /// - /// 数据库表操作服务 - /// - [ApiDescriptionSettings(Tag = "BasicData", Name = "Table", Order = 701)] - [Route("api/basic/db/[controller]")] - public class DataTableOperateService : IDynamicApiController, ITransient - { - private readonly DataBaseManager _dataBaseManager; - private readonly ISqlSugarRepository _repository; - private readonly IDbLinkService _dbLinkService; - public DataTableOperateService( - DataBaseManager dataBaseManager, - ISqlSugarRepository repository, - IDbLinkService dbLinkService - ) - { - _dataBaseManager = dataBaseManager; - _repository = repository; - _dbLinkService = dbLinkService; - } - /// - /// 清除表数据 - /// - /// - /// - [HttpPost("clean-data")] - public async Task CleanTableData(CleanTableDataInput input) - { - var link = await _dbLinkService.GetInfo(input.LinkId); - var sugarClient = _dataBaseManager.ChangeDataBase(link); - return await sugarClient.Deleteable().AS(input.TableName).ExecuteCommandAsync(); - } - - public async Task GenerateCode(CleanTableDataInput input) - { - var dir = Path.Combine(FileVariable.GenerateCodePath, "DbModel"); - if (!Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - var link = await _dbLinkService.GetInfo(input.LinkId); - var sugarClient = _dataBaseManager.ChangeDataBase(link); - var pos = input.TableName.IndexOf("_", StringComparison.Ordinal); - - - //sugarClient.DynamicBuilder().CreateClass(); - sugarClient.DbFirst.Where(input.TableName).CreateClassFile(FileVariable.GenerateCodePath, "DbModels"); - - return null; - - } - } -} diff --git a/Tnb.BasicData.Entitys/Dto/DataModeing/CleanTableDataInput.cs b/system/Tnb.Systems.Entitys/Dto/System/DataBase/DatabaseTableDataCleanInput.cs similarity index 79% rename from Tnb.BasicData.Entitys/Dto/DataModeing/CleanTableDataInput.cs rename to system/Tnb.Systems.Entitys/Dto/System/DataBase/DatabaseTableDataCleanInput.cs index 2c889edb..4dba9466 100644 --- a/Tnb.BasicData.Entitys/Dto/DataModeing/CleanTableDataInput.cs +++ b/system/Tnb.Systems.Entitys/Dto/System/DataBase/DatabaseTableDataCleanInput.cs @@ -5,15 +5,15 @@ using System.Text; using System.Threading.Tasks; using JNPF.DependencyInjection; -namespace Tnb.BasicData.Entitys.Dto.DataModeing +namespace JNPF.Systems.Entitys.Dto.Database { /// /// 清除表数据输入参数 /// [SuppressSniffer] - public class CleanTableDataInput + public class DatabaseTableDataCleanInput { - public string LinkId { get; set; } + /// /// 数据库名称 /// diff --git a/system/Tnb.Systems.Entitys/Mapper/ConnectionMapper.cs b/system/Tnb.Systems.Entitys/Mapper/ConnectionMapper.cs new file mode 100644 index 00000000..346b6708 --- /dev/null +++ b/system/Tnb.Systems.Entitys/Mapper/ConnectionMapper.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Mapster; +using SqlSugar; + +namespace Tnb.Systems.Entitys.Mapper +{ + public class ConnectionMapper : IRegister + { + public void Register(TypeAdapterConfig config) + { + config.ForType() + .Map(dest => dest.ConnectionString, src => src.DefaultConnection) + .AfterMapping((src, dest) => + { + dest.ConnectionString = string.Format(src.DefaultConnection, src.Host, src.Port, src.DBName, src.UserName, src.Password); + }); + + } + } +} diff --git a/system/Tnb.Systems/System/DataBaseService.cs b/system/Tnb.Systems/System/DataBaseService.cs index e85fc32d..2725f2a3 100644 --- a/system/Tnb.Systems/System/DataBaseService.cs +++ b/system/Tnb.Systems/System/DataBaseService.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Data; using System.Text; +using JNPF.Common.Configuration; using JNPF.Common.Core.Manager; using JNPF.Common.Core.Manager.Files; using JNPF.Common.Dtos.DataBase; @@ -17,6 +18,7 @@ using JNPF.Systems.Entitys.Model.DataBase; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using Mapster; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SqlSugar; @@ -323,16 +325,124 @@ public class DataBaseService : IDynamicApiController, ITransient await Create(linkid, data); } - #endregion + /// + /// 清除表数据 + /// + /// 数据库配置主键 + /// + /// + [HttpPost("{linkId}/clean-data")] + public async Task CleanTableData(string linkId, DatabaseTableDataCleanInput input) + { + SqlSugarScope sugarClient = null!; + if (linkId == "0") + { + ConnectionStringsOptions options = App.GetConfig("ConnectionStrings", true); + var connCfg = options.Adapt(); + sugarClient = new SqlSugarScope(connCfg); + } + else + { + var link = await _dbLinkService.GetInfo(linkId); + sugarClient = _dataBaseManager.ChangeDataBase(link); + } + return await sugarClient.Deleteable().AS(input.TableName).ExecuteCommandAsync(); + } + /// + /// 生成代码 + /// + /// 数据库配置表主键 + /// post输入参数 + /// + /// + /// + [HttpPost("{linkId}/gen-code")] + public async Task GenerateCode(string linkId,DatabaseTableDataCleanInput input) + { + if (input.TableName.IsNullOrWhiteSpace()) + { + throw new ArgumentNullException(nameof(input.TableName)); + } + if (!input.TableName.Contains("_")) + { + throw new ArgumentException($"表【{input.TableName}】,表名之间必须包含_"); + } + var dir = Path.Combine(FileVariable.GenerateCodePath, "DbModel"); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + SqlSugarScope sugarClient = null!; + if (linkId == "0") //默认时,使用当前默认数据库配置 + { + ConnectionStringsOptions options = App.GetConfig("ConnectionStrings", true); + var connCfg = options.Adapt(); + sugarClient = new SqlSugarScope(connCfg); + } + else + { + var link = await _dbLinkService.GetInfo(linkId); + sugarClient = _dataBaseManager.ChangeDataBase(link); + } - #region PrivateMethod + string CustomFormatName(string s) + { + var pos = 0; + if ((pos = s.IndexOf("_", StringComparison.Ordinal)) > -1) + { + var first = s.AsSpan().Slice(0, pos).ToString().ToUpperCase(); + var second = s.AsSpan().Slice(pos + 1).ToString().ToUpperCase(); + return $"{first}{second}"; + } + else + { + return s.ToUpperCase(); + } + } - /// - /// 是否系统表. - /// - /// - /// - private bool IsSysTable(string table) + foreach (var item in sugarClient.DbMaintenance.GetTableInfoList().Where(t => t.Name == input.TableName)) + { + string entityName = CustomFormatName(item.Name);/*实体名首字母大写*/ + sugarClient.MappingTables.Add(entityName, item.Name); + foreach (var col in sugarClient.DbMaintenance.GetColumnInfosByTableName(item.Name)) + { + var colName = CustomFormatName(col.DbColumnName); + sugarClient.MappingColumns.Add(colName /*类的属性首字母大写*/, col.DbColumnName, entityName); + } + } + + var newFileName = ""; + var pos = input.TableName.IndexOf("_", StringComparison.Ordinal); + var first = input.TableName.AsSpan().Slice(0, pos).ToString().ToUpperCase(); + var second = input.TableName.AsSpan().Slice(pos + 1).ToString().ToUpperCase(); + newFileName = $"{first}{second}"; + + sugarClient.DbFirst.Where(input.TableName) + .FormatFileName(CustomFormatName) + .IsCreateAttribute() + .CreateClassFile(dir, "DbModels"); + + var previewContent = ""; + var codeFile = Path.Combine(dir, $"{CustomFormatName(input.TableName)}.cs"); + if (File.Exists(codeFile)) + { + using (var sr = File.OpenText(codeFile)) + { + previewContent = await sr.ReadToEndAsync(); + } + } + return previewContent; + } + #endregion + + #region PrivateMethod + + /// + /// 是否系统表. + /// + /// + /// + private bool IsSysTable(string table) { string[] byoTable = {