SysTemplateService.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. .WhereIF(input.Type.HasValue, u => u.Type == input.Type)
  40. .OrderBy(u => new { u.OrderNo, u.Id })
  41. .ToPagedListAsync(input.Page, input.PageSize);
  42. }
  43. /// <summary>
  44. /// 获取模板 📑
  45. /// </summary>
  46. /// <param name="code"></param>
  47. /// <returns></returns>
  48. [DisplayName("获取模板")]
  49. [ApiDescriptionSettings]
  50. public async Task<SysTemplate> GetTemplate(string code)
  51. {
  52. return await _sysTemplateRep.GetFirstAsync(u => u.Name == code);
  53. }
  54. /// <summary>
  55. /// 预览模板内容 📑
  56. /// </summary>
  57. /// <param name="input"></param>
  58. /// <returns></returns>
  59. [DisplayName("预览模板内容")]
  60. [ApiDescriptionSettings]
  61. public async Task<string> ProView(ProViewTemplateInput input)
  62. {
  63. var template = await _sysTemplateRep.GetFirstAsync(u => u.Id == input.Id);
  64. return await RenderAsync(template.Content, input.Data);
  65. }
  66. /// <summary>
  67. /// 增加模板 📑
  68. /// </summary>
  69. /// <param name="input"></param>
  70. /// <returns></returns>
  71. [DisplayName("增加模板")]
  72. [ApiDescriptionSettings(Name = "Add"), HttpPost]
  73. public async Task AddTemplate(AddTemplateInput input)
  74. {
  75. var isExist = await _sysTemplateRep.IsAnyAsync(u => u.Name == input.Name);
  76. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1000);
  77. isExist = await _sysTemplateRep.IsAnyAsync(u => u.Code == input.Code);
  78. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1001);
  79. await _sysTemplateRep.InsertAsync(input.Adapt<SysTemplate>());
  80. }
  81. /// <summary>
  82. /// 更新模板 📑
  83. /// </summary>
  84. /// <param name="input"></param>
  85. /// <returns></returns>
  86. [DisplayName("更新模板")]
  87. [ApiDescriptionSettings(Name = "Update"), HttpPost]
  88. public async Task UpdateTemplate(UpdateTemplateInput input)
  89. {
  90. var isExist = await _sysTemplateRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.Id);
  91. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1000);
  92. isExist = await _sysTemplateRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id);
  93. if (isExist) throw Oops.Oh(ErrorCodeEnum.T1001);
  94. await _sysTemplateRep.AsUpdateable(input.Adapt<SysTemplate>()).IgnoreColumns(true).ExecuteCommandAsync();
  95. }
  96. /// <summary>
  97. /// 删除模板 📑
  98. /// </summary>
  99. /// <param name="input"></param>
  100. /// <returns></returns>
  101. [DisplayName("删除模板")]
  102. [ApiDescriptionSettings(Name = "Delete"), HttpPost]
  103. public async Task DeleteTemplate(BaseIdInput input)
  104. {
  105. await _sysTemplateRep.DeleteAsync(u => u.Id == input.Id);
  106. }
  107. /// <summary>
  108. /// 获取分组列表 🔖
  109. /// </summary>
  110. /// <returns></returns>
  111. [ApiDescriptionSettings]
  112. [DisplayName("获取分组列表")]
  113. public async Task<List<string>> GetGroupList()
  114. {
  115. return await _sysTemplateRep.AsQueryable()
  116. .GroupBy(u => u.GroupName)
  117. .Select(u => u.GroupName).ToListAsync();
  118. }
  119. /// <summary>
  120. /// 渲染模板内容 📑
  121. /// </summary>
  122. /// <param name="input"></param>
  123. /// <returns></returns>
  124. [DisplayName("渲染模板内容")]
  125. [ApiDescriptionSettings, HttpPost]
  126. public async Task<string> Render(RenderTemplateInput input)
  127. {
  128. return await RenderAsync(input.Content, input.Data);
  129. }
  130. /// <summary>
  131. /// 渲染模板内容 📑
  132. /// </summary>
  133. /// <param name="content"></param>
  134. /// <param name="data"></param>
  135. /// <returns></returns>
  136. [NonAction]
  137. public async Task<string> RenderAsync(string content, object data)
  138. {
  139. return await _viewEngine.RunCompileFromCachedAsync(Regex.Replace(content, "@\\((.*?)\\)", "@(Model.$1)"), data, builderAction: builder =>
  140. {
  141. builder.AddAssemblyReferenceByName("System.Text.RegularExpressions");
  142. builder.AddAssemblyReferenceByName("System.Collections");
  143. builder.AddAssemblyReferenceByName("System.Linq");
  144. builder.AddUsing("System.Text.RegularExpressions");
  145. builder.AddUsing("System.Collections.Generic");
  146. builder.AddUsing("System.Linq");
  147. });
  148. }
  149. /// <summary>
  150. /// 根据编码渲染模板内容
  151. /// </summary>
  152. /// <param name="code"></param>
  153. /// <param name="data"></param>
  154. /// <returns></returns>
  155. [NonAction]
  156. public async Task<string> RenderByCode(string code, Dictionary<string, object> data)
  157. {
  158. var template = await _sysTemplateRep.GetFirstAsync(u => u.Code == code);
  159. return await RenderAsync(template.Content, data);
  160. }
  161. }