SysController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. using Hotline.Permissions;
  2. using Hotline.Repository.SqlSugar.System;
  3. using Hotline.Settings;
  4. using Hotline.Share.Dtos;
  5. using Hotline.Share.Dtos.Dic;
  6. using Hotline.Share.Dtos.Menu;
  7. using Hotline.Share.Dtos.Trunk;
  8. using Hotline.Share.Requests;
  9. using MapsterMapper;
  10. using Microsoft.AspNetCore.Authorization;
  11. using Microsoft.AspNetCore.Mvc;
  12. using System.Diagnostics.CodeAnalysis;
  13. using XF.Domain.Exceptions;
  14. using XF.Utility.UnifyResponse;
  15. namespace Hotline.Api.Controllers
  16. {
  17. /// <summary>
  18. /// 系统管理相关接口
  19. /// </summary>
  20. public class SysController : BaseController
  21. {
  22. private readonly IMapper _mapper;
  23. private readonly ISystemSettingRepository _systemSettingsRepository;
  24. private readonly ISystemSettingGroupRepository _systemSettingGroupRepository;
  25. private readonly ISystemMenuRepository _systemMenuRepository;
  26. private readonly ISystemButtonRepository _systemButtonRepository;
  27. private readonly ISysDicTypeRepository _sysDicTypeRepository;
  28. private readonly ISysDicDataRepository _sysDicDataRepository;
  29. /// <summary>
  30. /// 系统管理相关接口
  31. /// </summary>
  32. /// <param name="mapper"></param>
  33. /// <param name="systemSettingsRepository"></param>
  34. /// <param name="systemSettingGroupRepository"></param>
  35. /// <param name="systemMenuRepository"></param>
  36. /// <param name="systemButtonRepository"></param>
  37. /// <param name="sysDicDataRepository"></param>
  38. /// <param name="sysDicTypeRepository"></param>
  39. public SysController(
  40. IMapper mapper,
  41. ISystemSettingRepository systemSettingsRepository,
  42. ISystemSettingGroupRepository systemSettingGroupRepository,
  43. ISystemMenuRepository systemMenuRepository,
  44. ISystemButtonRepository systemButtonRepository,
  45. ISysDicTypeRepository sysDicTypeRepository,
  46. ISysDicDataRepository sysDicDataRepository)
  47. {
  48. _mapper = mapper;
  49. _systemSettingsRepository = systemSettingsRepository;
  50. _systemSettingGroupRepository = systemSettingGroupRepository;
  51. _systemMenuRepository = systemMenuRepository;
  52. _systemButtonRepository = systemButtonRepository;
  53. _sysDicTypeRepository = sysDicTypeRepository;
  54. _sysDicDataRepository = sysDicDataRepository;
  55. }
  56. #region 系统参数
  57. /// <summary>
  58. /// 获取系统参数列表
  59. /// </summary>
  60. /// <returns></returns>
  61. [Permission(EPermission.GetSysSettingsAsync)]
  62. [HttpGet("getsyssettings")]
  63. public async Task<List<SystemSettingGroup>> GetSysSettingsAsync()
  64. {
  65. return await _systemSettingGroupRepository.QueryExtAsync(x => true, x => x.Includes(d => d.SystemSettings));
  66. }
  67. /// <summary>
  68. /// 更新配置
  69. /// </summary>
  70. /// <param name="request"></param>
  71. /// <returns></returns>
  72. /// <exception cref="UserFriendlyException"></exception>
  73. [Permission(EPermission.ModifySettings)]
  74. [HttpPost("modifysettings")]
  75. public async Task ModifySettings([FromBody] ModifySettingsRequest request)
  76. {
  77. for (int i = 0; i < request.list.Count; i++)
  78. {
  79. var model = await _systemSettingsRepository.GetAsync(x => x.Id == request.list[i].id, HttpContext.RequestAborted);
  80. if (model != null)
  81. {
  82. model.SettingValue = request.list[i].value;
  83. await _systemSettingsRepository.UpdateAsync(model, HttpContext.RequestAborted);
  84. }
  85. }
  86. }
  87. #endregion
  88. #region 菜单管理
  89. /// <summary>
  90. /// 获取菜单
  91. /// </summary>
  92. /// <returns></returns>
  93. //[Permission(EPermission.GetMenuJson)]
  94. [AllowAnonymous]
  95. [HttpGet("getmenujson")]
  96. public async Task<IReadOnlyList<SystemMenu>> GetMenuJson()
  97. {
  98. //获取菜单树形
  99. return await _systemMenuRepository.GetSystemMenus();
  100. }
  101. /// <summary>
  102. /// 新增菜单
  103. /// </summary>
  104. /// <param name="dto"></param>
  105. /// <returns></returns>
  106. [Permission(EPermission.AddMenu)]
  107. [HttpPost("add-menu")]
  108. public async Task AddMenu([FromBody] AddMenuDto dto)
  109. {
  110. var menu = _mapper.Map<SystemMenu>(dto);
  111. await _systemMenuRepository.AddAsync(menu,HttpContext.RequestAborted);
  112. }
  113. /// <summary>
  114. /// 修改菜单
  115. /// </summary>
  116. /// <param name="dto"></param>
  117. /// <returns></returns>
  118. [Permission(EPermission.UpdateMenu)]
  119. [HttpPost("update-menu")]
  120. public async Task UpdateMenu([FromBody] UpdateMenuDto dto)
  121. {
  122. var menu = await _systemMenuRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  123. if (menu is null)
  124. throw UserFriendlyException.SameMessage("无效菜单");
  125. _mapper.Map(dto, menu);
  126. await _systemMenuRepository.UpdateAsync(menu, HttpContext.RequestAborted);
  127. }
  128. /// <summary>
  129. /// 删除菜单
  130. /// </summary>
  131. /// <param name="id"></param>
  132. /// <returns></returns>
  133. [Permission(EPermission.RemoveMenu)]
  134. [HttpDelete("removemenu/{id}")]
  135. public async Task RemoveMenu(string id)
  136. {
  137. var menu = await _systemMenuRepository.GetAsync(id, HttpContext.RequestAborted);
  138. if (menu is null)
  139. throw UserFriendlyException.SameMessage("无效菜单");
  140. //检查是否存在下级菜单
  141. var ishavemenu = await _systemMenuRepository.AnyAsync(x => x.ParentId == id);
  142. if (ishavemenu)
  143. throw UserFriendlyException.SameMessage("存在下级菜单,暂时不能删除");
  144. //检查是否存在按钮
  145. var ishavebutton = await _systemButtonRepository.AnyAsync(x => x.MenuId == id);
  146. if (ishavebutton)
  147. throw UserFriendlyException.SameMessage("存在按钮权限,暂时不能删除");
  148. await _systemMenuRepository.RemoveAsync(id, false, HttpContext.RequestAborted);
  149. }
  150. /// <summary>
  151. /// 获取菜单对象
  152. /// </summary>
  153. /// <param name="id"></param>
  154. /// <returns></returns>
  155. [Permission(EPermission.GetMenu)]
  156. [HttpGet("menu/{id}")]
  157. public async Task<SystemMenu> GetMenu(string id)
  158. {
  159. var menu = await _systemMenuRepository.GetAsync(id, HttpContext.RequestAborted);
  160. if (menu is null)
  161. throw UserFriendlyException.SameMessage("无效菜单");
  162. return menu;
  163. }
  164. #region 按钮管理
  165. /// <summary>
  166. /// 通过菜单ID获取按钮列表
  167. /// </summary>
  168. /// <param name="menuid"></param>
  169. /// <returns></returns>
  170. [Permission(EPermission.GetButtonByMenu)]
  171. [HttpGet("getbuttonmenu")]
  172. public async Task<IReadOnlyList<SystemButton>> GetButtonByMenu(string menuid)
  173. {
  174. return await _systemButtonRepository.QueryAsync(x => x.MenuId == menuid);
  175. }
  176. /// <summary>
  177. /// 新增按钮
  178. /// </summary>
  179. /// <param name="dto"></param>
  180. /// <returns></returns>
  181. [Permission(EPermission.AddButton)]
  182. [HttpPost("add-button")]
  183. public async Task AddButton([FromBody] AddButtonDto dto)
  184. {
  185. var button = _mapper.Map<SystemButton>(dto);
  186. await _systemButtonRepository.AddAsync(button);
  187. }
  188. /// <summary>
  189. /// 编辑按钮
  190. /// </summary>
  191. /// <param name="dto"></param>
  192. /// <returns></returns>
  193. [Permission(EPermission.UpdateButton)]
  194. [HttpPost("update-button")]
  195. public async Task UpdateButton([FromBody] UpdateButtonDto dto)
  196. {
  197. var button = await _systemButtonRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  198. if (button is null)
  199. throw UserFriendlyException.SameMessage("无效按钮");
  200. _mapper.Map(dto, button);
  201. await _systemButtonRepository.UpdateAsync(button);
  202. }
  203. /// <summary>
  204. /// 删除按钮
  205. /// </summary>
  206. /// <param name="id"></param>
  207. /// <returns></returns>
  208. [Permission(EPermission.RemoveButton)]
  209. [HttpDelete("removebutton/{id}")]
  210. public async Task RemoveButton(string id)
  211. {
  212. var button = await _systemButtonRepository.GetAsync(id, HttpContext.RequestAborted);
  213. if (button is null)
  214. throw UserFriendlyException.SameMessage("无效按钮");
  215. await _systemButtonRepository.RemoveAsync(id, false, HttpContext.RequestAborted);
  216. }
  217. /// <summary>
  218. /// 获取按钮对象
  219. /// </summary>
  220. /// <param name="id"></param>
  221. /// <returns></returns>
  222. [Permission(EPermission.GetButton)]
  223. [HttpGet("button/{id}")]
  224. public async Task<SystemButton> GetButton(string id)
  225. {
  226. var button = await _systemButtonRepository.GetAsync(id, HttpContext.RequestAborted);
  227. if (button is null)
  228. throw UserFriendlyException.SameMessage("无效按钮");
  229. return button;
  230. }
  231. #endregion
  232. #endregion
  233. #region 字典管理
  234. /// <summary>
  235. /// 获取字典类型列表
  236. /// </summary>
  237. /// <returns></returns>
  238. [Permission(EPermission.GetSysDicType)]
  239. [HttpPost("dictype-list")]
  240. public async Task<List<SysDicType>> GetSysDicType()
  241. {
  242. return await _sysDicTypeRepository.Queryable().ToListAsync();
  243. }
  244. /// <summary>
  245. /// 根据字典类型ID获取字典列表
  246. /// </summary>
  247. /// <param name="dto"></param>
  248. /// <returns></returns>
  249. [Permission(EPermission.GetSysDicData)]
  250. [HttpGet("dictdata-type")]
  251. public async Task<List<SysDicData>> GetSysDicData([FromQuery] GetSysDicDataDto dto)
  252. {
  253. return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeId == dto.typeid).WhereIF(!string.IsNullOrEmpty(dto.datavalue),x=>x.DicDataValue.Contains(dto.datavalue)).ToTreeAsync(x=>x.Children,x=>x.ParentId,"");
  254. }
  255. /// <summary>
  256. /// 根据字典类型Code获取字典列表
  257. /// </summary>
  258. /// <param name="code"></param>
  259. /// <returns></returns>
  260. [HttpGet("dictdata-code/{code}")]
  261. public async Task<List<SysDicData>> GetSysDicDataByCode(string code)
  262. {
  263. return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code).ToListAsync();
  264. }
  265. /// <summary>
  266. /// 获取字典对象
  267. /// </summary>
  268. /// <param name="id"></param>
  269. /// <returns></returns>
  270. [Permission(EPermission.SysDicDataModel)]
  271. [HttpGet("dicdata/{id}")]
  272. public async Task<SysDicData> SysDicDataModel(string id)
  273. {
  274. var dicData = await _sysDicDataRepository.GetAsync(id, HttpContext.RequestAborted);
  275. if (dicData is null)
  276. throw UserFriendlyException.SameMessage("无效数据");
  277. return dicData;
  278. }
  279. /// <summary>
  280. /// 新增字典数据
  281. /// </summary>
  282. /// <param name="dto"></param>
  283. /// <returns></returns>
  284. [Permission(EPermission.AddDicData)]
  285. [HttpPost("add-dicdata")]
  286. public async Task AddDicData([FromBody] AddDicDataDto dto)
  287. {
  288. var dicType = await _sysDicTypeRepository.GetAsync(dto.DicTypeId, HttpContext.RequestAborted);
  289. if (dicType is null)
  290. throw UserFriendlyException.SameMessage("无效字典类型");
  291. var dicData = _mapper.Map<SysDicData>(dto);
  292. dicData.DicTypeCode = dicType.DicTypeCode;
  293. await _sysDicDataRepository.AddAsync(dicData);
  294. }
  295. /// <summary>
  296. /// 修改字典数据
  297. /// </summary>
  298. /// <param name="dto"></param>
  299. /// <returns></returns>
  300. [Permission(EPermission.UpdateDicData)]
  301. [HttpPost("update-dicdata")]
  302. public async Task UpdateDicData([FromBody]UpdateDicDataDto dto)
  303. {
  304. var dicData = await _sysDicDataRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  305. if (dicData is null)
  306. throw UserFriendlyException.SameMessage("无效字典数据");
  307. var dicType = await _sysDicTypeRepository.GetAsync(dto.DicTypeId, HttpContext.RequestAborted);
  308. if (dicType is null)
  309. throw UserFriendlyException.SameMessage("无效字典类型");
  310. _mapper.Map(dto, dicData);
  311. dicData.DicTypeCode = dicType.DicTypeCode;
  312. await _sysDicDataRepository.UpdateAsync(dicData,HttpContext.RequestAborted);
  313. }
  314. #endregion
  315. }
  316. }