Role.razor.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. using AntDesign.TableModels;
  2. using EasyTemplate.Tool;
  3. using Microsoft.JSInterop;
  4. using SqlSugar;
  5. namespace EasyTemplate.Blazor.Web.Components.Pages.Management.Role;
  6. public partial class Role
  7. {
  8. protected override async Task OnAfterRenderAsync(bool firstRender)
  9. {
  10. if (firstRender)
  11. {
  12. DefaultCheckedKeys = Global.Menus.Where(x => x.Necessary == true).Select(x => x.Id.ToString()).ToArray();
  13. await NavigationManager.RedirectLogin(IJSRuntime);
  14. //await Query();
  15. }
  16. }
  17. /// <summary>
  18. /// 查
  19. /// </summary>
  20. /// <returns></returns>
  21. private async Task Query()
  22. {
  23. Loading = true;
  24. RefAsync<int> total = 0;
  25. var res = await Repository.AsQueryable()
  26. .WhereIF(!string.IsNullOrWhiteSpace(Q_Name), x => x.Name.Contains(Q_Name))
  27. .OrderByDescending(x => x.Id)
  28. .ToPageListAsync(Pi, Ps, total);
  29. Total = total.Value;
  30. DataSource = res;
  31. Loading = false;
  32. //_table.ReloadData();
  33. }
  34. /// <summary>
  35. /// 增/改
  36. /// </summary>
  37. /// <param name="data"></param>
  38. /// <returns></returns>
  39. private async Task<bool> InsertOrUpdate(SystemRole data)
  40. {
  41. bool flag = false;
  42. if (data.Id == 0)
  43. {
  44. if (Repository.AsQueryable().Any(x => x.Name.ToLower() == data.Name.ToLower()))
  45. {
  46. MessageService.Error("该账号名已存在");
  47. return false;
  48. }
  49. var id = Repository.AsInsertable(data).ExecuteReturnIdentity();
  50. RoleMenu.Insert(new SystemRoleMenu() { RoleId = id, MenuId = 1 });
  51. return id > 0;
  52. }
  53. else
  54. {
  55. if (Repository.AsQueryable().Any(x => x.Name.ToLower() == data.Name.ToLower() && x.Id != data.Id))
  56. {
  57. MessageService.Error("该账号名已存在");
  58. return false;
  59. }
  60. return await Repository.AsUpdateable()
  61. .SetColumns(x => x.Name == data.Name)
  62. .SetColumns(x => x.RoleType == data.RoleType)
  63. .SetColumns(x => x.Enabled == data.Enabled)
  64. .Where(x => x.Id == data.Id)
  65. .ExecuteCommandAsync() > 0;
  66. }
  67. }
  68. /// <summary>
  69. /// 删除
  70. /// </summary>
  71. /// <param name="row"></param>
  72. /// <returns></returns>
  73. private async Task Delete(SystemRole row)
  74. {
  75. if (!await Comfirm($"确认删除 [{row.Name}] ?")) return;
  76. var flag = await Repository.AsUpdateable()
  77. .SetColumns(x => x.IsDelete == true)
  78. .Where(x => x.Id == row.Id)
  79. .ExecuteCommandAsync() > 0;
  80. Table.ReloadData(Pi, Ps);
  81. }
  82. /// <summary>
  83. ///
  84. /// </summary>
  85. private void UpdateMenu()
  86. {
  87. if (SelectedRow is null)
  88. {
  89. MessageService.Error("请先选择一个角色");
  90. return;
  91. }
  92. var nodes = Tree.CheckedKeys;
  93. if (nodes.Length == 0)
  94. {
  95. MessageService.Error("请选择菜单");
  96. return;
  97. }
  98. bool flag = false;
  99. try
  100. {
  101. RoleMenu.Context.Ado.BeginTran();
  102. RoleMenu.AsDeleteable().Where(x => x.RoleId == SelectedRow.Data.Id).ExecuteCommand();
  103. var menuIds = CalculateIds(nodes.ToList());
  104. var menus = menuIds.Select(x => new SystemRoleMenu() { RoleId = SelectedRow.Data.Id, MenuId = Convert.ToInt32(x) }).ToList();
  105. flag = RoleMenu.InsertRange(menus);
  106. RoleMenu.Context.Ado.CommitTran();
  107. }
  108. catch (Exception ex)
  109. {
  110. RoleMenu.Context.Ado.RollbackTran();
  111. flag = false;
  112. }
  113. if (flag)
  114. {
  115. MessageService.Success("修改成功");
  116. }
  117. else
  118. {
  119. MessageService.Error("修改失败");
  120. }
  121. CheckedKeys = Tree.CheckedKeys;
  122. SelectedRow = null;
  123. Table.ReloadData(Pi, Ps);
  124. //StateHasChanged();
  125. }
  126. private List<long> CalculateIds(List<string> ids)
  127. {
  128. var result = new List<long>();
  129. foreach (var id in ids)
  130. {
  131. var menuId = long.Parse(id);
  132. AddParentIds(menuId, result);
  133. }
  134. return result;
  135. }
  136. private void AddParentIds(long id, List<long> result)
  137. {
  138. var menu = Menu.AsQueryable().First(m => m.Id == id);
  139. if (menu != null && !result.Contains(menu.Id))
  140. {
  141. result.Add(menu.Id);
  142. if (menu.ParentId != 0)
  143. {
  144. AddParentIds(menu.ParentId, result);
  145. }
  146. }
  147. }
  148. /// <summary>
  149. /// 重置查询
  150. /// </summary>
  151. private async Task ResetQuery()
  152. {
  153. Q_Name = string.Empty;
  154. Pi = 1;
  155. await Query();
  156. }
  157. protected override async void OnInitialized()
  158. {
  159. await Query();
  160. }
  161. private async Task OnChange(QueryModel<SystemRole> query)
  162. => await Query();
  163. private async Task Search()
  164. => await Query();
  165. private void OnRowClick(RowData<SystemRole> row)
  166. {
  167. SelectedRow = row;
  168. CheckedKeys = RoleMenu.AsQueryable()
  169. .LeftJoin<SystemMenu>((rm, m) => rm.MenuId == m.Id)
  170. .Where((rm, m) => rm.RoleId == row.Data.Id)
  171. .Select((rm, m) => m.Id.ToString())
  172. .ToArray();
  173. //这里最好做一下筛选,也可以不做,目的是去除Global.Menus树形结构中没有的数据,如果_CheckedKeys有,而Global.Menus没有,会报错
  174. //一般出现的情形是有人从数据库删除了某个菜单项,但前端没有及时刷新,导致_CheckedKeys与Global.Menus数据不匹配
  175. CheckedKeys = FilterCheckedKeys(CheckedKeys, Global.Menus);
  176. }
  177. /// <summary>
  178. /// 过滤已选中的菜单项,确保它们在菜单树中存在
  179. /// </summary>
  180. /// <param name="checkedKeys"></param>
  181. /// <param name="menuTree"></param>
  182. /// <returns></returns>
  183. private string[] FilterCheckedKeys(string[] checkedKeys, List<SystemMenu> menuTree)
  184. {
  185. var validIds = new HashSet<string>();
  186. void CollectIds(List<SystemMenu> menus)
  187. {
  188. if (menus == null) return;
  189. foreach (var menu in menus)
  190. {
  191. validIds.Add(menu.Id.ToString());
  192. if (menu.Children != null && menu.Children.Count > 0)
  193. CollectIds(menu.Children);
  194. }
  195. }
  196. CollectIds(menuTree);
  197. return checkedKeys.Where(id => validIds.Contains(id)).ToArray();
  198. }
  199. private void CheckedChanged(SystemRole row)
  200. {
  201. Repository.AsUpdateable()
  202. .SetColumns(x => x.Enabled == row.Enabled)
  203. .Where(x => x.Id == row.Id)
  204. .ExecuteCommand();
  205. //_table.ReloadData();
  206. }
  207. /// <summary>
  208. /// 注入实例
  209. /// </summary>
  210. [Inject] private SqlSugarRepository<SystemRole> Repository { get; set; }
  211. /// <summary>
  212. ///
  213. /// </summary>
  214. [Inject] private SqlSugarRepository<SystemRoleMenu> RoleMenu { get; set; }
  215. /// <summary>
  216. ///
  217. /// </summary>
  218. [Inject] private SqlSugarRepository<SystemMenu> Menu { get; set; }
  219. /// <summary>
  220. ///
  221. /// </summary>
  222. [Inject] NavigationManager NavigationManager { get; set; }
  223. /// <summary>
  224. ///
  225. /// </summary>
  226. [Inject] IJSRuntime IJSRuntime { get; set; }
  227. /// <summary>
  228. /// 账号
  229. /// </summary>
  230. private string Q_Name { get; set; }
  231. /// <summary>
  232. ///
  233. /// </summary>
  234. private string[] DefaultCheckedKeys = [];
  235. /// <summary>
  236. ///
  237. /// </summary>
  238. private string[] CheckedKeys = [];
  239. /// <summary>
  240. ///
  241. /// </summary>
  242. private RowData<SystemRole> SelectedRow;
  243. /// <summary>
  244. ///
  245. /// </summary>
  246. private ITable Table;
  247. /// <summary>
  248. ///
  249. /// </summary>
  250. private Tree<SystemMenu> Tree;
  251. /// <summary>
  252. ///
  253. /// </summary>
  254. private IEnumerable<SystemRole> SelectedRows = [];
  255. /// <summary>
  256. ///
  257. /// </summary>
  258. private List<SystemRole> DataSource;
  259. /// <summary>
  260. ///
  261. /// </summary>
  262. private int Pi = 1;
  263. /// <summary>
  264. ///
  265. /// </summary>
  266. private int Ps = 20;
  267. /// <summary>
  268. ///
  269. /// </summary>
  270. private int Total;
  271. /// <summary>
  272. ///
  273. /// </summary>
  274. private bool Loading = false;
  275. /// <summary>
  276. ///
  277. /// </summary>
  278. Func<PaginationTotalContext, string> ShowTotal => x => $"总共 {Total} 条";
  279. }