SysTemplateService.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. namespace Admin.NET.Core.Service;
  7. /// <summary>
  8. /// 系统模板服务 🧩
  9. /// </summary>
  10. [ApiDescriptionSettings(Order = 305)]
  11. public class SysTemplateService : IDynamicApiController, ITransient
  12. {
  13. private readonly SqlSugarRepository<SysTemplate> _sysTemplateRep;
  14. private readonly UserManager _userManager;
  15. private readonly IViewEngine _viewEngine;
  16. public SysTemplateService(
  17. SqlSugarRepository<SysTemplate> sysTemplateRep,
  18. IViewEngine viewEngine,
  19. UserManager userManager)
  20. {
  21. _sysTemplateRep = sysTemplateRep;
  22. _userManager = userManager;
  23. _viewEngine = viewEngine;
  24. }
  25. /// <summary>
  26. /// 获取模板列表 📑
  27. /// </summary>
  28. /// <param name="input"></param>
  29. /// <returns></returns>
  30. [ApiDescriptionSettings]
  31. [DisplayName("获取模板列表")]
  32. public async Task<SqlSugarPagedList<SysTemplate>> Page(PageTemplateInput input)
  33. {
  34. return await _sysTemplateRep.AsQueryable()
  35. .WhereIF(!string.IsNullOrWhiteSpace(input.GroupName), u => u.GroupName.Contains(input.GroupName))
  36. .WhereIF(_userManager.SuperAdmin && input.TenantId > 0, u => u.TenantId == input.TenantId)
  37. .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
  38. .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
  39. .OrderBy(u => new { u.OrderNo, u.Id })
  40. .ToPagedListAsync(input.Page, input.PageSize);
  41. }
  42. /// <summary>
  43. /// 获取模板 📑
  44. /// </summary>
  45. /// <param name="code"></param>
  46. /// <returns></returns>
  47. [DisplayName("获取模板")]
  48. [ApiDescriptionSettings]
  49. public async Task<SysTemplate> GetTemplate(string code)
  50. {
  51. return await _sysTemplateRep.GetFirstAsync(u => u.Name == code);
  52. }
  53. /// <summary>
  54. /// 预览模板内容 📑
  55. /// </summary>
  56. /// <param name="input"></param>
  57. /// <returns></returns>
  58. [DisplayName("预览模板内容")]
  59. [ApiDescriptionSettings]
  60. public async Task<string> ProView(ProViewTemplateInput input)
  61. {
  62. var template = await _sysTemplateRep.GetFirstAsync(u => u.Id == input.Id);
  63. return await RenderAsync(template.Content, input.Data);
  64. }
  65. /// <summary>
  66. /// 增加模板 📑
  67. /// </summary>
  68. /// <param name="input"></param>
  69. /// <returns></returns>
  70. [DisplayName("增加模板")]
  71. [ApiDescriptionSettings(Name = "Add"), HttpPost]
  72. public async Task AddTemplate(AddTemplateInput input)
  73. {
  74. var isExist = await _sysTemplateRep.IsAnyAsync(u => u.Name == input.Name);
  75. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1000);
  76. isExist = await _sysTemplateRep.IsAnyAsync(u => u.Code == input.Code);
  77. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1001);
  78. await _sysTemplateRep.InsertAsync(input.Adapt<SysTemplate>());
  79. }
  80. /// <summary>
  81. /// 更新模板 📑
  82. /// </summary>
  83. /// <param name="input"></param>
  84. /// <returns></returns>
  85. [DisplayName("更新模板")]
  86. [ApiDescriptionSettings(Name = "Update"), HttpPost]
  87. public async Task UpdateTemplate(UpdateTemplateInput input)
  88. {
  89. var isExist = await _sysTemplateRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.Id);
  90. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1000);
  91. isExist = await _sysTemplateRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id);
  92. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1001);
  93. await _sysTemplateRep.AsUpdateable(input.Adapt<SysTemplate>()).IgnoreColumns(true).ExecuteCommandAsync();
  94. }
  95. /// <summary>
  96. /// 删除模板 📑
  97. /// </summary>
  98. /// <param name="input"></param>
  99. /// <returns></returns>
  100. [DisplayName("删除模板")]
  101. [ApiDescriptionSettings(Name = "Delete"), HttpPost]
  102. public async Task DeleteTemplate(BaseIdInput input)
  103. {
  104. await _sysTemplateRep.DeleteAsync(u => u.Id == input.Id);
  105. }
  106. /// <summary>
  107. /// 获取分组列表 🔖
  108. /// </summary>
  109. /// <returns></returns>
  110. [ApiDescriptionSettings]
  111. [DisplayName("获取分组列表")]
  112. public async Task<List<string>> GetGroupList()
  113. {
  114. return await _sysTemplateRep.AsQueryable()
  115. .GroupBy(u => u.GroupName)
  116. .Select(u => u.GroupName).ToListAsync();
  117. }
  118. /// <summary>
  119. /// 渲染模板内容 📑
  120. /// </summary>
  121. /// <param name="input"></param>
  122. /// <returns></returns>
  123. [DisplayName("渲染模板内容")]
  124. [ApiDescriptionSettings, HttpPost]
  125. public async Task<string> Render(RenderTemplateInput input)
  126. {
  127. return await RenderAsync(input.Content, input.Data);
  128. }
  129. /// <summary>
  130. /// 渲染模板内容 📑
  131. /// </summary>
  132. /// <param name="content"></param>
  133. /// <param name="data"></param>
  134. /// <returns></returns>
  135. [NonAction]
  136. public async Task<string> RenderAsync(string content, object data)
  137. {
  138. return await _viewEngine.RunCompileFromCachedAsync(Regex.Replace(content, "@\\((.*?)\\)", "@(Model.$1)"), data, builderAction: builder =>
  139. {
  140. builder.AddAssemblyReferenceByName("System.Text.RegularExpressions");
  141. builder.AddAssemblyReferenceByName("System.Collections");
  142. builder.AddAssemblyReferenceByName("System.Linq");
  143. builder.AddUsing("System.Text.RegularExpressions");
  144. builder.AddUsing("System.Collections.Generic");
  145. builder.AddUsing("System.Linq");
  146. });
  147. }
  148. /// <summary>
  149. /// 根据编码渲染模板内容
  150. /// </summary>
  151. /// <param name="code"></param>
  152. /// <param name="data"></param>
  153. /// <returns></returns>
  154. [NonAction]
  155. public async Task<string> RenderByCode(string code, Dictionary<string, object> data)
  156. {
  157. var template = await _sysTemplateRep.GetFirstAsync(u => u.Code == code);
  158. return await RenderAsync(template.Content, data);
  159. }
  160. }