DataBaseManager.cs 8.8 KB

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