SysDatabaseService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 系统数据库管理服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 250)]
  6. public class SysDatabaseService : IDynamicApiController, ITransient
  7. {
  8. private readonly ISqlSugarClient _db;
  9. private readonly IViewEngine _viewEngine;
  10. private readonly CodeGenOptions _codeGenOptions;
  11. public SysDatabaseService(ISqlSugarClient db,
  12. IViewEngine viewEngine,
  13. IOptions<CodeGenOptions> codeGenOptions)
  14. {
  15. _db = db;
  16. _viewEngine = viewEngine;
  17. _codeGenOptions = codeGenOptions.Value;
  18. }
  19. /// <summary>
  20. /// 获取库列表
  21. /// </summary>
  22. /// <returns></returns>
  23. [DisplayName("获取库列表")]
  24. public List<dynamic> GetList()
  25. {
  26. return App.GetOptions<DbConnectionOptions>().ConnectionConfigs.Select(u => u.ConfigId).ToList();
  27. }
  28. /// <summary>
  29. /// 获取字段列表
  30. /// </summary>
  31. /// <param name="tableName">表名</param>
  32. /// <param name="configId">ConfigId</param>
  33. /// <returns></returns>
  34. [AllowAnonymous]
  35. [DisplayName("获取字段列表")]
  36. public List<DbColumnOutput> GetColumnList(string tableName, string configId = SqlSugarConst.ConfigId)
  37. {
  38. var db = _db.AsTenant().GetConnectionScope(configId);
  39. if (string.IsNullOrWhiteSpace(tableName))
  40. return new List<DbColumnOutput>();
  41. return db.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt<List<DbColumnOutput>>();
  42. }
  43. /// <summary>
  44. /// 增加列
  45. /// </summary>
  46. /// <param name="input"></param>
  47. [ApiDescriptionSettings(Name = "AddColumn"), HttpPost]
  48. [DisplayName("增加列")]
  49. public void AddColumn(DbColumnInput input)
  50. {
  51. var column = new DbColumnInfo
  52. {
  53. ColumnDescription = input.ColumnDescription,
  54. DbColumnName = input.DbColumnName,
  55. IsIdentity = input.IsIdentity == 1,
  56. IsNullable = input.IsNullable == 1,
  57. IsPrimarykey = input.IsPrimarykey == 1,
  58. Length = input.Length,
  59. DecimalDigits = input.DecimalDigits,
  60. DataType = input.DataType
  61. };
  62. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  63. db.DbMaintenance.AddColumn(input.TableName, column);
  64. db.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription);
  65. if (column.IsPrimarykey)
  66. db.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName);
  67. }
  68. /// <summary>
  69. /// 删除列
  70. /// </summary>
  71. /// <param name="input"></param>
  72. [ApiDescriptionSettings(Name = "DeleteColumn"), HttpPost]
  73. [DisplayName("删除列")]
  74. public void DeleteColumn(DeleteDbColumnInput input)
  75. {
  76. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  77. db.DbMaintenance.DropColumn(input.TableName, input.DbColumnName);
  78. }
  79. /// <summary>
  80. /// 编辑列
  81. /// </summary>
  82. /// <param name="input"></param>
  83. [ApiDescriptionSettings(Name = "UpdateColumn"), HttpPost]
  84. [DisplayName("编辑列")]
  85. public void UpdateColumn(UpdateDbColumnInput input)
  86. {
  87. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  88. db.DbMaintenance.RenameColumn(input.TableName, input.OldColumnName, input.ColumnName);
  89. if (db.DbMaintenance.IsAnyColumnRemark(input.ColumnName, input.TableName))
  90. db.DbMaintenance.DeleteColumnRemark(input.ColumnName, input.TableName);
  91. db.DbMaintenance.AddColumnRemark(input.ColumnName, input.TableName, string.IsNullOrWhiteSpace(input.Description) ? input.ColumnName : input.Description);
  92. }
  93. /// <summary>
  94. /// 获取表列表
  95. /// </summary>
  96. /// <param name="configId">ConfigId</param>
  97. /// <returns></returns>
  98. [DisplayName("获取表列表")]
  99. public List<DbTableInfo> GetTableList(string configId = SqlSugarConst.ConfigId)
  100. {
  101. var db = _db.AsTenant().GetConnectionScope(configId);
  102. return db.DbMaintenance.GetTableInfoList(false);
  103. }
  104. /// <summary>
  105. /// 增加表
  106. /// </summary>
  107. /// <param name="input"></param>
  108. [ApiDescriptionSettings(Name = "AddTable"), HttpPost]
  109. [DisplayName("增加表")]
  110. public void AddTable(DbTableInput input)
  111. {
  112. var columns = new List<DbColumnInfo>();
  113. if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any())
  114. throw Oops.Oh(ErrorCodeEnum.db1000);
  115. if (input.DbColumnInfoList.GroupBy(q => q.DbColumnName).Any(q => q.Count() > 1))
  116. throw Oops.Oh(ErrorCodeEnum.db1002);
  117. var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == input.ConfigId);
  118. input.DbColumnInfoList.ForEach(m =>
  119. {
  120. columns.Add(new DbColumnInfo
  121. {
  122. DbColumnName = config.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName.Trim()) : m.DbColumnName.Trim(),
  123. DataType = m.DataType,
  124. Length = m.Length,
  125. ColumnDescription = m.ColumnDescription,
  126. IsNullable = m.IsNullable == 1,
  127. IsIdentity = m.IsIdentity == 1,
  128. IsPrimarykey = m.IsPrimarykey == 1,
  129. DecimalDigits = m.DecimalDigits
  130. });
  131. });
  132. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  133. db.DbMaintenance.CreateTable(input.TableName, columns, false);
  134. if (db.CurrentConnectionConfig.DbType == SqlSugar.DbType.Sqlite || db.CurrentConnectionConfig.DbType == SqlSugar.DbType.MySql)
  135. return;
  136. if (columns.Any(m => m.IsPrimarykey))
  137. db.DbMaintenance.AddPrimaryKey(input.TableName, columns.FirstOrDefault(m => m.IsPrimarykey).DbColumnName);
  138. db.DbMaintenance.AddTableRemark(input.TableName, input.Description);
  139. input.DbColumnInfoList.ForEach(m =>
  140. {
  141. m.DbColumnName = config.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName) : m.DbColumnName;
  142. db.DbMaintenance.AddColumnRemark(m.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(m.ColumnDescription) ? m.DbColumnName : m.ColumnDescription);
  143. });
  144. }
  145. /// <summary>
  146. /// 删除表
  147. /// </summary>
  148. /// <param name="input"></param>
  149. [ApiDescriptionSettings(Name = "DeleteTable"), HttpPost]
  150. [DisplayName("删除表")]
  151. public void DeleteTable(DeleteDbTableInput input)
  152. {
  153. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  154. db.DbMaintenance.DropTable(input.TableName);
  155. }
  156. /// <summary>
  157. /// 编辑表
  158. /// </summary>
  159. /// <param name="input"></param>
  160. [ApiDescriptionSettings(Name = "UpdateTable"), HttpPost]
  161. [DisplayName("编辑表")]
  162. public void UpdateTable(UpdateDbTableInput input)
  163. {
  164. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  165. db.DbMaintenance.RenameTable(input.OldTableName, input.TableName);
  166. if (db.DbMaintenance.IsAnyTable(input.TableName))
  167. db.DbMaintenance.DeleteTableRemark(input.TableName);
  168. db.DbMaintenance.AddTableRemark(input.TableName, input.Description);
  169. }
  170. /// <summary>
  171. /// 创建实体
  172. /// </summary>
  173. /// <param name="input"></param>
  174. [ApiDescriptionSettings(Name = "CreateEntity"), HttpPost]
  175. [DisplayName("创建实体")]
  176. public void CreateEntity(CreateEntityInput input)
  177. {
  178. var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == input.ConfigId);
  179. input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position;
  180. input.EntityName = string.IsNullOrWhiteSpace(input.EntityName) ? (config.EnableUnderLine ? CodeGenUtil.CamelColumnName(input.TableName, null) : input.TableName) : input.EntityName;
  181. string[] dbColumnNames;//= _codeGenOptions.EntityBaseColumn[input.BaseClassName];
  182. _codeGenOptions.EntityBaseColumn.TryGetValue(input.BaseClassName, out dbColumnNames);
  183. if (dbColumnNames is null || dbColumnNames is { Length: 0 })
  184. throw Oops.Oh("基类配置文件不存在此类型");
  185. var templatePath = GetEntityTemplatePath();
  186. var targetPath = GetEntityTargetPath(input);
  187. var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
  188. DbTableInfo dbTableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName || m.Name == input.TableName.ToLower());
  189. if (dbTableInfo == null)
  190. throw Oops.Oh(ErrorCodeEnum.db1001);
  191. List<DbColumnInfo> dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false);
  192. dbColumnInfos.ForEach(m =>
  193. {
  194. m.DbColumnName = config.EnableUnderLine ? CodeGenUtil.CamelColumnName(m.DbColumnName, dbColumnNames) : m.DbColumnName;//转下划线后的列名 需要转回来
  195. m.DataType = CodeGenUtil.ConvertDataType(m);
  196. });
  197. if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase))
  198. dbColumnInfos = dbColumnInfos.Where(c => !dbColumnNames.Contains(c.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
  199. var tContent = File.ReadAllText(templatePath);
  200. var tResult = _viewEngine.RunCompileFromCached(tContent, new
  201. {
  202. NameSpace = $"{input.Position}.Entity",
  203. input.TableName,
  204. input.EntityName,
  205. BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}",
  206. input.ConfigId,
  207. dbTableInfo.Description,
  208. TableField = dbColumnInfos
  209. });
  210. File.WriteAllText(targetPath, tResult, Encoding.UTF8);
  211. }
  212. /// <summary>
  213. /// 获取实体模板文件路径
  214. /// </summary>
  215. /// <returns></returns>
  216. private static string GetEntityTemplatePath()
  217. {
  218. var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template");
  219. return Path.Combine(templatePath, "Entity.cs.vm");
  220. }
  221. /// <summary>
  222. /// 设置生成实体文件路径
  223. /// </summary>
  224. /// <param name="input"></param>
  225. /// <returns></returns>
  226. private static string GetEntityTargetPath(CreateEntityInput input)
  227. {
  228. var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity");
  229. if (!Directory.Exists(backendPath))
  230. Directory.CreateDirectory(backendPath);
  231. return Path.Combine(backendPath, input.EntityName + ".cs");
  232. }
  233. }