DataBaseManager.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using Admin.NET.Core.Util;
  2. using Furion;
  3. using Furion.DependencyInjection;
  4. using Furion.DynamicApiController;
  5. using Furion.FriendlyException;
  6. using Furion.ViewEngine;
  7. using Mapster;
  8. using Microsoft.AspNetCore.Mvc;
  9. using SqlSugar;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Text;
  14. namespace Admin.NET.Core.Service
  15. {
  16. /// <summary>
  17. /// 数据库管理服务
  18. /// </summary>
  19. [ApiDescriptionSettings(Name = "数据库管理", Order = 145)]
  20. public class DataBaseManager : IDynamicApiController, ITransient
  21. {
  22. private readonly ISqlSugarClient _sqlSugarClient;
  23. private readonly IViewEngine _viewEngine;
  24. public DataBaseManager(ISqlSugarClient sqlSugarClient, IViewEngine viewEngine)
  25. {
  26. _sqlSugarClient = sqlSugarClient;
  27. _viewEngine = viewEngine;
  28. }
  29. /// <summary>
  30. /// 添加列
  31. /// </summary>
  32. /// <param name="input"></param>
  33. [HttpPost("/column/add")]
  34. public void ColumnAdd(DbColumnInfoInput input)
  35. {
  36. var column = new DbColumnInfo
  37. {
  38. ColumnDescription = input.ColumnDescription,
  39. DbColumnName = input.DbColumnName,
  40. IsIdentity = input.IsIdentity == 1,
  41. IsNullable = input.IsNullable == 1,
  42. IsPrimarykey = input.IsPrimarykey == 1,
  43. Length = input.Length,
  44. DecimalDigits = input.DecimalDigits,
  45. DataType = input.DataType
  46. };
  47. _sqlSugarClient.DbMaintenance.AddColumn(input.TableName, column);
  48. _sqlSugarClient.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription);
  49. if (column.IsPrimarykey)
  50. {
  51. _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName);
  52. }
  53. }
  54. /// <summary>
  55. /// 删除列
  56. /// </summary>
  57. /// <param name="input"></param>
  58. [HttpPost("/column/delete")]
  59. public void ColumnDelete(DbColumnInfoOutput input)
  60. {
  61. _sqlSugarClient.DbMaintenance.DropColumn(input.TableName, input.DbColumnName);
  62. }
  63. /// <summary>
  64. /// 编辑列
  65. /// </summary>
  66. /// <param name="input"></param>
  67. [HttpPost("/column/edit")]
  68. public void ColumnEdit(EditColumnInput input)
  69. {
  70. _sqlSugarClient.DbMaintenance.RenameColumn(input.TableName, input.OldName, input.DbColumnName);
  71. if (_sqlSugarClient.DbMaintenance.IsAnyColumnRemark(input.DbColumnName, input.TableName))
  72. {
  73. _sqlSugarClient.DbMaintenance.DeleteColumnRemark(input.DbColumnName, input.TableName);
  74. }
  75. _sqlSugarClient.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(input.ColumnDescription) ? input.DbColumnName : input.ColumnDescription);
  76. }
  77. /// <summary>
  78. /// 获取表字段
  79. /// </summary>
  80. /// <param name="tableName"></param>
  81. /// <returns></returns>
  82. [HttpGet("/dataBase/columnInfoList")]
  83. public List<DbColumnInfoOutput> GetColumnInfosByTableName(string tableName)
  84. {
  85. if (string.IsNullOrWhiteSpace(tableName))
  86. return new List<DbColumnInfoOutput>();
  87. return _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt<List<DbColumnInfoOutput>>();
  88. }
  89. /// <summary>
  90. /// 获取所有表
  91. /// </summary>
  92. /// <returns></returns>
  93. [HttpGet("/dataBase/tableInfoList")]
  94. public List<DbTableInfo> GetTableInfoList()
  95. {
  96. return _sqlSugarClient.DbMaintenance.GetTableInfoList(false);
  97. }
  98. /// <summary>
  99. /// 新增表
  100. /// </summary>
  101. /// <param name="input"></param>
  102. [HttpPost("/table/add")]
  103. public void TableAdd(DbTableInfoInput input)
  104. {
  105. var columns = new List<DbColumnInfo>();
  106. if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any())
  107. {
  108. throw Oops.Oh(ErrorCodeEnum.db1000);
  109. }
  110. input.DbColumnInfoList.ForEach(m =>
  111. {
  112. columns.Add(new DbColumnInfo
  113. {
  114. DbColumnName = m.DbColumnName.Trim(),
  115. DataType = m.DataType,
  116. Length = m.Length,
  117. ColumnDescription = m.ColumnDescription,
  118. IsNullable = m.IsNullable == 1,
  119. IsIdentity = m.IsIdentity == 1,
  120. IsPrimarykey = m.IsPrimarykey == 1,
  121. DecimalDigits = m.DecimalDigits
  122. });
  123. });
  124. _sqlSugarClient.DbMaintenance.CreateTable(input.Name, columns, false);
  125. _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description);
  126. if (columns.Any(m => m.IsPrimarykey))
  127. {
  128. _sqlSugarClient.DbMaintenance.AddPrimaryKey(input.Name, columns.FirstOrDefault(m => m.IsPrimarykey).DbColumnName);
  129. }
  130. input.DbColumnInfoList.ForEach(m =>
  131. {
  132. _sqlSugarClient.DbMaintenance.AddColumnRemark(m.DbColumnName, input.Name, string.IsNullOrWhiteSpace(m.ColumnDescription) ? m.DbColumnName : m.ColumnDescription);
  133. });
  134. }
  135. /// <summary>
  136. /// 删除表
  137. /// </summary>
  138. /// <param name="input"></param>
  139. [HttpPost("/table/delete")]
  140. public void TableDelete(DbTableInfo input)
  141. {
  142. _sqlSugarClient.DbMaintenance.DropTable(input.Name);
  143. }
  144. /// <summary>
  145. /// 编辑表
  146. /// </summary>
  147. /// <param name="input"></param>
  148. [HttpPost("/table/edit")]
  149. public void TableEdit(EditTableInput input)
  150. {
  151. _sqlSugarClient.DbMaintenance.RenameTable(input.OldName, input.Name);
  152. if (_sqlSugarClient.DbMaintenance.IsAnyTableRemark(input.Name))
  153. {
  154. _sqlSugarClient.DbMaintenance.DeleteTableRemark(input.Name);
  155. }
  156. _sqlSugarClient.DbMaintenance.AddTableRemark(input.Name, input.Description);
  157. }
  158. /// <summary>
  159. /// 创建实体
  160. /// </summary>
  161. /// <param name="input"></param>
  162. [HttpPost("/table/createEntity")]
  163. public void CreateEntity(CreateEntityInput input)
  164. {
  165. input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Magic.Application" : input.Position;
  166. input.BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}";
  167. var templatePath = GetTemplatePath();
  168. var targetPath = GetTargetPath(input);
  169. DbTableInfo dbTableInfo = _sqlSugarClient.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName);
  170. if (dbTableInfo == null)
  171. throw Oops.Oh(ErrorCodeEnum.db1001);
  172. List<DbColumnInfo> dbColumnInfos = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(input.TableName, false);
  173. if (input.BaseClassName.Contains("DBEntityTenant"))
  174. {
  175. dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id"
  176. && c.DbColumnName != "TenantId"
  177. && c.DbColumnName != "CreateTime"
  178. && c.DbColumnName != "UpdateTime"
  179. && c.DbColumnName != "CreateUserId"
  180. && c.DbColumnName != "UpdateUserId"
  181. && c.DbColumnName != "IsDelete").ToList();
  182. }
  183. else if (input.BaseClassName.Contains("EntityBase"))
  184. {
  185. dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id"
  186. && c.DbColumnName != "CreateTime"
  187. && c.DbColumnName != "UpdateTime"
  188. && c.DbColumnName != "CreateUserId"
  189. && c.DbColumnName != "UpdateUserId"
  190. && c.DbColumnName != "IsDelete").ToList();
  191. }
  192. else if (input.BaseClassName.Contains("EntityBaseId"))
  193. {
  194. dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id").ToList();
  195. }
  196. dbColumnInfos.ForEach(m =>
  197. {
  198. m.DataType = CodeGenUtil.ConvertDataType(m.DataType);
  199. });
  200. var tContent = File.ReadAllText(templatePath);
  201. var tResult = _viewEngine.RunCompileFromCached(tContent, new
  202. {
  203. input.TableName,
  204. input.EntityName,
  205. input.BaseClassName,
  206. dbTableInfo.Description,
  207. TableField = dbColumnInfos
  208. });
  209. File.WriteAllText(targetPath, tResult, Encoding.UTF8);
  210. }
  211. /// <summary>
  212. /// 获取模板文件路径集合
  213. /// </summary>
  214. /// <returns></returns>
  215. private static string GetTemplatePath()
  216. {
  217. var templatePath = App.WebHostEnvironment.WebRootPath + @"\Template\";
  218. return Path.Combine(templatePath, "Entity.cs.vm");
  219. }
  220. /// <summary>
  221. /// 设置生成文件路径
  222. /// </summary>
  223. /// <param name="input"></param>
  224. /// <returns></returns>
  225. private static string GetTargetPath(CreateEntityInput input)
  226. {
  227. var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity");
  228. var entityPath = Path.Combine(backendPath, input.EntityName + ".cs");
  229. return entityPath;
  230. }
  231. }
  232. }