SysMenuService.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. using Infrastructure;
  2. using Infrastructure.Attribute;
  3. using ZR.Common;
  4. using ZR.Model.System;
  5. using ZR.Model.System.Dto;
  6. using ZR.Model.System.Enums;
  7. using ZR.Model.System.Generate;
  8. using ZR.Model.System.Vo;
  9. namespace ZR.ServiceCore.Services
  10. {
  11. /// <summary>
  12. /// 菜单
  13. /// </summary>
  14. [AppService(ServiceType = typeof(ISysMenuService), ServiceLifetime = LifeTime.Transient)]
  15. public class SysMenuService : BaseService<SysMenu>, ISysMenuService
  16. {
  17. public ISysRoleService SysRoleService;
  18. public SysMenuService(ISysRoleService sysRoleService)
  19. {
  20. SysRoleService = sysRoleService;
  21. }
  22. /// <summary>
  23. /// 获取所有菜单数(菜单管理)
  24. /// </summary>
  25. /// <returns></returns>
  26. public List<SysMenu> SelectTreeMenuList(MenuQueryDto menu, long userId)
  27. {
  28. if (menu.ParentId != null)
  29. {
  30. return GetMenusByMenuId(menu.ParentId.ParseToInt(), userId);
  31. }
  32. List<SysMenu> menuList = BuildMenuTree(SelectMenuList(menu, userId));
  33. return menuList;
  34. }
  35. /// <summary>
  36. /// 获取所有菜单列表
  37. /// </summary>
  38. /// <returns></returns>
  39. public List<SysMenu> SelectMenuList(MenuQueryDto menu, long userId)
  40. {
  41. List<SysMenu> menuList;
  42. if (SysRoleService.IsAdmin(userId))
  43. {
  44. menuList = SelectMenuList(menu);
  45. }
  46. else
  47. {
  48. var userRoles = SysRoleService.SelectUserRoles(userId);
  49. menuList = SelectMenuListByRoles(menu, userRoles);
  50. }
  51. return menuList;
  52. }
  53. /// <summary>
  54. /// 获取菜单详情
  55. /// </summary>
  56. /// <param name="menuId"></param>
  57. /// <returns></returns>
  58. public SysMenu GetMenuByMenuId(int menuId)
  59. {
  60. return GetFirst(it => it.MenuId == menuId);
  61. }
  62. /// <summary>
  63. /// 根据菜单id获取菜单列表
  64. /// </summary>
  65. /// <param name="menuId"></param>
  66. /// <param name="userId"></param>
  67. /// <returns></returns>
  68. public List<SysMenu> GetMenusByMenuId(int menuId, long userId)
  69. {
  70. var menuExpression = Expressionable.Create<SysMenu>();
  71. menuExpression.And(c => c.ParentId == menuId);
  72. if (!SysRoleService.IsAdmin(userId))
  73. {
  74. var userRoles = SysRoleService.SelectUserRoles(userId);
  75. var roleMenus = Context.Queryable<SysRoleMenu>()
  76. .Where(r => userRoles.Contains(r.Role_id)).Select(s => s.Menu_id).ToList();
  77. menuExpression.And(c => roleMenus.Contains(c.MenuId));
  78. }
  79. var list = GetList(menuExpression.ToExpression()).OrderBy(f => f.OrderNum).ToList();
  80. Context.ThenMapper(list, item =>
  81. {
  82. item.SubNum = Context.Queryable<SysMenu>().SetContext(x => x.ParentId, () => item.MenuId, item).Count;
  83. });
  84. return list;
  85. }
  86. /// <summary>
  87. /// 添加菜单
  88. /// </summary>
  89. /// <param name="menu"></param>
  90. /// <returns></returns>
  91. public long AddMenu(SysMenu menu)
  92. {
  93. return InsertReturnBigIdentity(menu);
  94. }
  95. /// <summary>
  96. /// 编辑菜单
  97. /// </summary>
  98. /// <param name="menu"></param>
  99. /// <returns></returns>
  100. public long EditMenu(SysMenu menu)
  101. {
  102. menu.Icon = string.IsNullOrEmpty(menu.Icon) ? "" : menu.Icon;
  103. return Update(menu, false);
  104. }
  105. /// <summary>
  106. /// 删除菜单管理信息
  107. /// </summary>
  108. /// <param name="menuId"></param>
  109. /// <returns></returns>
  110. public int DeleteMenuById(int menuId)
  111. {
  112. return Delete(menuId);
  113. }
  114. /// <summary>
  115. /// 删除所有菜单
  116. /// </summary>
  117. /// <param name="menuId"></param>
  118. /// <returns></returns>
  119. public int DeleteAllMenuById(int menuId)
  120. {
  121. var childMenu = Queryable().ToChildList(x => x.ParentId, menuId).Select(x => x.MenuId);
  122. var result = UseTran(() =>
  123. {
  124. Delete(childMenu.ToArray(), "删除菜单");
  125. Context.Deleteable<SysRoleMenu>().Where(f => childMenu.Contains(f.Menu_id)).ExecuteCommand();
  126. });
  127. return result.IsSuccess ? 1 : 0;
  128. }
  129. /// <summary>
  130. /// 校验菜单名称是否唯一
  131. /// </summary>
  132. /// <param name="menu"></param>
  133. /// <returns></returns>
  134. public string CheckMenuNameUnique(SysMenu menu)
  135. {
  136. long menuId = menu.MenuId == 0 ? -1 : menu.MenuId;
  137. SysMenu info = GetFirst(it => it.MenuName == menu.MenuName && it.ParentId == menu.ParentId);
  138. if (menu.MenuType == "C")
  139. {
  140. SysMenu info2 = GetFirst(it => it.Path == menu.Path);
  141. if (info2 != null)
  142. {
  143. throw new CustomException($"{menu.Path}路由地址已存在");
  144. }
  145. }
  146. //if (info != null && menuId != info.menuId && menu.menuName.Equals(info.menuName))
  147. //{
  148. // return UserConstants.NOT_UNIQUE;
  149. //}
  150. if (info != null && info.MenuId != menu.MenuId)
  151. {
  152. return UserConstants.NOT_UNIQUE;
  153. }
  154. return UserConstants.UNIQUE;
  155. }
  156. /// <summary>
  157. /// 菜单排序
  158. /// </summary>
  159. /// <param name="menuDto"></param>
  160. /// <returns></returns>
  161. public int ChangeSortMenu(MenuDto menuDto)
  162. {
  163. return Update(new SysMenu() { MenuId = menuDto.MenuId, OrderNum = menuDto.OrderNum }, it => new { it.OrderNum });
  164. }
  165. /// <summary>
  166. /// 是否存在菜单子节点
  167. /// </summary>
  168. /// <param name="menuId"></param>
  169. /// <returns></returns>
  170. public bool HasChildByMenuId(long menuId)
  171. {
  172. return Count(it => it.ParentId == menuId) > 0;
  173. }
  174. /// <summary>
  175. /// 获取左边导航栏菜单树
  176. /// </summary>
  177. /// <param name="userId"></param>
  178. /// <returns></returns>
  179. public List<SysMenu> SelectMenuTreeByUserId(long userId)
  180. {
  181. MenuQueryDto dto = new() { Status = "0", MenuTypeIds = "M,C,L" };
  182. if (SysRoleService.IsAdmin(userId))
  183. {
  184. return SelectTreeMenuList(dto);
  185. }
  186. else
  187. {
  188. List<long> roleIds = SysRoleService.SelectUserRoles(userId);
  189. return SelectTreeMenuListByRoles(dto, roleIds);
  190. }
  191. }
  192. /// <summary>
  193. /// 查询精确到按钮的操作权限
  194. /// </summary>
  195. /// <param name="userId"></param>
  196. /// <returns></returns>
  197. public List<string> SelectMenuPermsByUserId(long userId)
  198. {
  199. var menus = Context.Queryable<SysMenu, SysRoleMenu, SysUserRole, SysRole>((m, rm, ur, r) => new JoinQueryInfos(
  200. JoinType.Left, m.MenuId == rm.Menu_id,
  201. JoinType.Left, rm.Role_id == ur.RoleId,
  202. JoinType.Left, ur.RoleId == r.RoleId
  203. ))
  204. .WithCache(60 * 10)
  205. .Where((m, rm, ur, r) => m.Status == "0" && r.Status == 0 && ur.UserId == userId)
  206. .Select((m, rm, ur, r) => m).ToList();
  207. var menuList = menus.Where(f => !string.IsNullOrEmpty(f.Perms));
  208. return menuList.Select(x => x.Perms).Distinct().ToList();
  209. }
  210. /// <summary>
  211. /// 根据用户查询系统菜单列表
  212. /// </summary>
  213. /// <param name="menu"></param>
  214. /// <param name="roles">用户角色集合</param>
  215. /// <returns></returns>
  216. public List<SysMenu> SelectTreeMenuListByRoles(MenuQueryDto menu, List<long> roles)
  217. {
  218. var roleMenus = Context.Queryable<SysRoleMenu>()
  219. .Where(r => roles.Contains(r.Role_id))
  220. .Select(f => f.Menu_id).Distinct().ToList();
  221. return Queryable()
  222. .Where(c => roleMenus.Contains(c.MenuId))
  223. .WhereIF(!string.IsNullOrEmpty(menu.MenuName), (c) => c.MenuName.Contains(menu.MenuName))
  224. .WhereIF(!string.IsNullOrEmpty(menu.Visible), (c) => c.Visible == menu.Visible)
  225. .WhereIF(!string.IsNullOrEmpty(menu.Status), (c) => c.Status == menu.Status)
  226. .WhereIF(!string.IsNullOrEmpty(menu.MenuTypeIds), c => menu.MenuTypeIdArr.Contains(c.MenuType))
  227. .OrderBy((c) => new { c.ParentId, c.OrderNum })
  228. .Select(c => c)
  229. .ToTree(it => it.Children, it => it.ParentId, 0);
  230. }
  231. /// <summary>
  232. /// 根据用户查询系统菜单列表
  233. /// </summary>
  234. /// <param name="menu"></param>
  235. /// <param name="roleId">用户角色</param>
  236. /// <returns></returns>
  237. public List<RoleMenuExportDto> SelectRoleMenuListByRole(MenuQueryDto menu, int roleId)
  238. {
  239. var menuIds = Context.Queryable<SysRoleMenu>()
  240. .Where(r => r.Role_id == roleId)
  241. .Select(f => f.Menu_id).Distinct().ToList();
  242. return Context.Queryable<SysMenu>()
  243. .InnerJoin<SysMenu>((t1, t2) => t1.MenuId == t2.ParentId)
  244. .InnerJoin<SysMenu>((t1, t2, t3) => t2.MenuId == t3.ParentId)
  245. .Where((t1, t2, t3) => menuIds.Contains(t1.MenuId))
  246. .Select((t1, t2, t3) => new RoleMenuExportDto()
  247. {
  248. MenuName = $"{t1.MenuName}->{t2.MenuName}->{t3.MenuName}",
  249. Path = t2.Path,
  250. Component = t2.Component,
  251. Perms = t3.Perms,
  252. MenuType = (MenuType)(object)t3.MenuType,
  253. Status = (MenuStatus)(object)t3.Status
  254. }).ToList();
  255. }
  256. /// <summary>
  257. /// 获取所有菜单
  258. /// </summary>
  259. /// <returns></returns>
  260. private List<SysMenu> SelectMenuList(MenuQueryDto menu)
  261. {
  262. var menuExp = Expressionable.Create<SysMenu>();
  263. menuExp.AndIF(!string.IsNullOrEmpty(menu.MenuName), it => it.MenuName.Contains(menu.MenuName));
  264. menuExp.AndIF(!string.IsNullOrEmpty(menu.Visible), it => it.Visible == menu.Visible);
  265. menuExp.AndIF(!string.IsNullOrEmpty(menu.Status), it => it.Status == menu.Status);
  266. menuExp.AndIF(!string.IsNullOrEmpty(menu.MenuTypeIds), it => menu.MenuTypeIdArr.Contains(it.MenuType));
  267. menuExp.AndIF(menu.ParentId != null, it => it.ParentId == menu.ParentId);
  268. return Queryable()
  269. .Where(menuExp.ToExpression())
  270. .OrderBy(it => new { it.ParentId, it.OrderNum })
  271. .ToList();
  272. }
  273. /// <summary>
  274. /// 根据用户查询系统菜单列表
  275. /// </summary>
  276. /// <param name="sysMenu"></param>
  277. /// <param name="roles">用户角色集合</param>
  278. /// <returns></returns>
  279. private List<SysMenu> SelectMenuListByRoles(MenuQueryDto sysMenu, List<long> roles)
  280. {
  281. var roleMenus = Context.Queryable<SysRoleMenu>()
  282. .Where(r => roles.Contains(r.Role_id));
  283. return Queryable()
  284. .InnerJoin(roleMenus, (c, j) => c.MenuId == j.Menu_id)
  285. .Where((c, j) => c.Status == "0")
  286. .WhereIF(!string.IsNullOrEmpty(sysMenu.MenuName), (c, j) => c.MenuName.Contains(sysMenu.MenuName))
  287. .WhereIF(!string.IsNullOrEmpty(sysMenu.Visible), (c, j) => c.Visible == sysMenu.Visible)
  288. .OrderBy((c, j) => new { c.ParentId, c.OrderNum })
  289. .Select(c => c)
  290. .ToList();
  291. }
  292. /// <summary>
  293. /// 获取所有菜单(菜单管理)
  294. /// </summary>
  295. /// <returns></returns>
  296. public List<SysMenu> SelectTreeMenuList(MenuQueryDto menu)
  297. {
  298. int parentId = menu.ParentId != null ? (int)menu.ParentId : 0;
  299. var list = Queryable()
  300. //.WithCache(60 * 10)
  301. .WhereIF(!string.IsNullOrEmpty(menu.MenuName), it => it.MenuName.Contains(menu.MenuName))
  302. .WhereIF(!string.IsNullOrEmpty(menu.Visible), it => it.Visible == menu.Visible)
  303. .WhereIF(!string.IsNullOrEmpty(menu.Status), it => it.Status == menu.Status)
  304. .WhereIF(!string.IsNullOrEmpty(menu.MenuTypeIds), it => menu.MenuTypeIdArr.Contains(it.MenuType))
  305. .WhereIF(menu.ParentId != null, it => it.ParentId == menu.ParentId)
  306. .OrderBy(it => new { it.ParentId, it.OrderNum })
  307. .ToTree(it => it.Children, it => it.ParentId, parentId);
  308. return list;
  309. }
  310. #region 方法
  311. /// <summary>
  312. /// 递归列表
  313. /// </summary>
  314. /// <param name="list"></param>
  315. /// <param name="t"></param>
  316. private void RecursionFn(List<SysMenu> list, SysMenu t)
  317. {
  318. //得到子节点列表
  319. List<SysMenu> childList = GetChildList(list, t);
  320. t.Children = childList;
  321. foreach (var item in childList)
  322. {
  323. if (GetChildList(list, item).Count() > 0)
  324. {
  325. RecursionFn(list, item);
  326. }
  327. }
  328. }
  329. /// <summary>
  330. /// 递归获取子菜单
  331. /// </summary>
  332. /// <param name="list">所有菜单</param>
  333. /// <param name="sysMenu"></param>
  334. /// <returns></returns>
  335. private List<SysMenu> GetChildList(List<SysMenu> list, SysMenu sysMenu)
  336. {
  337. return list.Where(p => p.ParentId == sysMenu.MenuId).ToList();
  338. }
  339. /// <summary>
  340. /// 获取路由侧边栏,动态生成
  341. /// </summary>
  342. /// <param name="menus"></param>
  343. /// <returns></returns>
  344. public List<RouterVo> BuildMenus(List<SysMenu> menus)
  345. {
  346. List<RouterVo> routers = new();
  347. if (menus == null) return routers;
  348. foreach (var menu in menus)
  349. {
  350. RouterVo router = new()
  351. {
  352. Query = menu.Query,
  353. Hidden = "1".Equals(menu.Visible),
  354. Name = GetRouteName(menu),
  355. Path = GetRoutePath(menu),
  356. Component = GetComponent(menu),
  357. Meta = new Meta(menu.MenuName, menu.Icon, "1".Equals(menu.IsCache), menu.MenuNameKey, menu.Path, menu.Create_time)
  358. };
  359. List<SysMenu> cMenus = menu.Children;
  360. //是目录并且有子菜单
  361. if (cMenus != null && cMenus.Count > 0 && UserConstants.TYPE_DIR.Equals(menu.MenuType))
  362. {
  363. router.AlwaysShow = true;
  364. router.Redirect = "noRedirect";
  365. router.Children = BuildMenus(cMenus);
  366. }
  367. else if (IsMeunFrame(menu))
  368. {
  369. router.Meta = null;
  370. List<RouterVo> childrenList = [];
  371. RouterVo children = new()
  372. {
  373. Query = menu.Query,
  374. Path = menu.Path,
  375. Component = menu.Component,
  376. Name = menu.RouteName.IsNotEmpty() ? menu.RouteName : menu.Path.ToLower(),
  377. Meta = new Meta(menu.MenuName, menu.Icon, "1".Equals(menu.IsCache), menu.MenuNameKey, menu.Path, menu.Create_time)
  378. };
  379. childrenList.Add(children);
  380. router.Children = childrenList;
  381. }
  382. else if (menu.ParentId == 0 && IsInnerLink(menu))
  383. {
  384. router.Meta = new Meta(menu.MenuName, menu.Icon);
  385. router.Path = "/";
  386. List<RouterVo> childrenList = new();
  387. RouterVo children = new();
  388. string routerPath = InnerLinkReplaceEach(menu.Path);
  389. children.Query = menu.Query;
  390. children.Path = routerPath;
  391. children.Component = UserConstants.INNER_LINK;
  392. children.Name = menu.RouteName.IsNotEmpty() ? menu.RouteName : routerPath.ToLower();
  393. children.Meta = new Meta(menu.MenuName, menu.Icon, menu.Path);
  394. childrenList.Add(children);
  395. router.Children = childrenList;
  396. }
  397. routers.Add(router);
  398. }
  399. return routers;
  400. }
  401. /// <summary>
  402. /// 构建前端所需要下拉树结构
  403. /// </summary>
  404. /// <param name="menus">菜单列表</param>
  405. /// <returns>下拉树结构列表</returns>
  406. public List<SysMenu> BuildMenuTree(List<SysMenu> menus)
  407. {
  408. List<SysMenu> returnList = new();
  409. List<long> tempList = menus.Select(f => f.MenuId).ToList();
  410. foreach (var menu in menus)
  411. {
  412. // 如果是顶级节点, 遍历该父节点的所有子节点
  413. if (!tempList.Contains(menu.ParentId))
  414. {
  415. var menuInfo = menus.Find(f => f.MenuId == menu.MenuId);
  416. //移除按钮没有上级
  417. if (!tempList.Contains(menuInfo.ParentId) && menu.MenuType != "F")
  418. {
  419. RecursionFn(menus, menu);
  420. returnList.Add(menu);
  421. }
  422. }
  423. }
  424. if (!returnList.Any())
  425. {
  426. returnList = menus;
  427. }
  428. return returnList;
  429. }
  430. /// <summary>
  431. /// 构建前端所需要下拉树结构
  432. /// </summary>
  433. /// <param name="menus"></param>
  434. /// <returns></returns>
  435. public List<TreeSelectVo> BuildMenuTreeSelect(List<SysMenu> menus)
  436. {
  437. List<SysMenu> menuTrees = BuildMenuTree(menus);
  438. List<TreeSelectVo> treeMenuVos = new List<TreeSelectVo>();
  439. foreach (var item in menuTrees)
  440. {
  441. treeMenuVos.Add(new TreeSelectVo(item));
  442. }
  443. return treeMenuVos;
  444. }
  445. /// <summary>
  446. /// 获取路由名称
  447. /// </summary>
  448. /// <param name="menu">菜单信息</param>
  449. /// <returns>路由名称</returns>
  450. public string GetRouteName(SysMenu menu)
  451. {
  452. string routerName = menu.Path.ToLower();
  453. if (menu.RouteName.IsNotEmpty())
  454. {
  455. routerName = menu.RouteName;
  456. }
  457. // 非外链并且是一级目录(类型为目录)
  458. if (IsMeunFrame(menu))
  459. {
  460. routerName = string.Empty;
  461. }
  462. return routerName;
  463. }
  464. /// <summary>
  465. /// 获取路由路径
  466. /// </summary>
  467. /// <param name="menu">菜单信息</param>
  468. /// <returns>路由地址</returns>
  469. public string GetRoutePath(SysMenu menu)
  470. {
  471. string routerPath = menu.Path;
  472. // 内链打开外网方式
  473. if (menu.ParentId != 0 && IsInnerLink(menu))
  474. {
  475. routerPath = InnerLinkReplaceEach(routerPath);
  476. }
  477. // 非外链并且是一级目录(类型为目录)
  478. if (0 == menu.ParentId && UserConstants.TYPE_DIR.Equals(menu.MenuType)
  479. && UserConstants.NO_FRAME.Equals(menu.IsFrame))
  480. {
  481. routerPath = "/" + menu.Path;
  482. }
  483. else if (IsMeunFrame(menu))// 非外链并且是一级目录(类型为菜单)
  484. {
  485. routerPath = "/";
  486. }
  487. return routerPath;
  488. }
  489. /// <summary>
  490. /// 获取组件名称
  491. /// </summary>
  492. /// <param name="menu"></param>
  493. /// <returns></returns>
  494. public string GetComponent(SysMenu menu)
  495. {
  496. string component = UserConstants.LAYOUT;
  497. if (!string.IsNullOrEmpty(menu.Component) && !IsMeunFrame(menu))
  498. {
  499. component = menu.Component;
  500. }
  501. else if (menu.Component.IsEmpty() && menu.ParentId != 0 && IsInnerLink(menu))
  502. {
  503. component = UserConstants.INNER_LINK;
  504. }
  505. else if (string.IsNullOrEmpty(menu.Component) && IsParentView(menu))
  506. {
  507. component = UserConstants.PARENT_VIEW;
  508. }
  509. return component;
  510. }
  511. /// <summary>
  512. /// 是否为菜单内部跳转
  513. /// </summary>
  514. /// <param name="menu">菜单信息</param>
  515. /// <returns></returns>
  516. public bool IsMeunFrame(SysMenu menu)
  517. {
  518. return menu.ParentId == 0 && UserConstants.TYPE_MENUS.Contains(menu.MenuType)
  519. && menu.IsFrame.Equals(UserConstants.NO_FRAME);
  520. }
  521. /// <summary>
  522. /// 是否为内链组件
  523. /// </summary>
  524. /// <param name="menu">菜单信息</param>
  525. /// <returns>结果</returns>
  526. public bool IsInnerLink(SysMenu menu)
  527. {
  528. return menu.IsFrame.Equals(UserConstants.NO_FRAME) && Tools.IsUrl(menu.Path);
  529. }
  530. /// <summary>
  531. /// 是否为parent_view组件
  532. /// </summary>
  533. /// <param name="menu">菜单信息</param>
  534. /// <returns></returns>
  535. public bool IsParentView(SysMenu menu)
  536. {
  537. return menu.ParentId != 0 && UserConstants.TYPE_DIR.Equals(menu.MenuType);
  538. }
  539. /// <summary>
  540. /// 内链域名特殊字符替换
  541. /// </summary>
  542. /// <param name = "path" ></ param >
  543. /// < returns ></ returns >
  544. public string InnerLinkReplaceEach(string path)
  545. {
  546. return path.IsNotEmpty() ? path
  547. .Replace(UserConstants.HTTP, "")
  548. .Replace(UserConstants.HTTPS, "")
  549. .Replace(UserConstants.WWW, "")
  550. .Replace(".", "/") : path;
  551. }
  552. #endregion
  553. public void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport, bool showImport)
  554. {
  555. var menu = GetFirst(f => f.MenuName == genTableInfo.FunctionName);
  556. if (menu is null)
  557. {
  558. menu = new()
  559. {
  560. MenuName = genTableInfo.FunctionName,
  561. ParentId = genTableInfo.Options.ParentMenuId,
  562. OrderNum = 0,
  563. Path = genTableInfo.BusinessName,
  564. Component = $"{genTableInfo.ModuleName.FirstLowerCase()}/{genTableInfo.BusinessName}",
  565. Perms = $"{permPrefix}:list",
  566. IsCache = "1",
  567. MenuType = "C",
  568. Visible = "0",
  569. Status = "0",
  570. Icon = "icon1",
  571. Create_by = "system",
  572. };
  573. menu.MenuId = AddMenu(menu);
  574. }
  575. else
  576. {
  577. menu.MenuName = genTableInfo.FunctionName;
  578. menu.ParentId = genTableInfo.Options.ParentMenuId;
  579. menu.Path = genTableInfo.BusinessName;
  580. menu.Component = $"{genTableInfo.ModuleName.FirstLowerCase()}/{genTableInfo.BusinessName}";
  581. menu.Perms = $"{permPrefix}:list";
  582. menu.IsCache = "1";
  583. menu.Visible = "0";
  584. menu.Status = "0";
  585. menu.Update_by = "system";
  586. menu.Update_time = DateTime.Now;
  587. EditMenu(menu);
  588. }
  589. List<SysMenu> menuList = new();
  590. SysMenu menuQuery = new()
  591. {
  592. MenuName = "查询",
  593. ParentId = menu.MenuId,
  594. OrderNum = 1,
  595. Perms = $"{permPrefix}:query",
  596. MenuType = "F",
  597. Visible = "0",
  598. Status = "0",
  599. Icon = "",
  600. };
  601. SysMenu menuAdd = new()
  602. {
  603. MenuName = "新增",
  604. ParentId = menu.MenuId,
  605. OrderNum = 2,
  606. Perms = $"{permPrefix}:add",
  607. MenuType = "F",
  608. Visible = "0",
  609. Status = "0",
  610. Icon = "",
  611. };
  612. SysMenu menuDel = new()
  613. {
  614. MenuName = "删除",
  615. ParentId = menu.MenuId,
  616. OrderNum = 3,
  617. Perms = $"{permPrefix}:delete",
  618. MenuType = "F",
  619. Visible = "0",
  620. Status = "0",
  621. Icon = "",
  622. };
  623. SysMenu menuEdit = new()
  624. {
  625. MenuName = "修改",
  626. ParentId = menu.MenuId,
  627. OrderNum = 4,
  628. Perms = $"{permPrefix}:edit",
  629. MenuType = "F",
  630. Visible = "0",
  631. Status = "0",
  632. Icon = "",
  633. };
  634. SysMenu menuExport = new()
  635. {
  636. MenuName = "导出",
  637. ParentId = menu.MenuId,
  638. OrderNum = 5,
  639. Perms = $"{permPrefix}:export",
  640. MenuType = "F",
  641. Visible = "0",
  642. Status = "0",
  643. Icon = "",
  644. };
  645. SysMenu menuImport = new()
  646. {
  647. MenuName = "导入",
  648. ParentId = menu.MenuId,
  649. OrderNum = 5,
  650. Perms = $"{permPrefix}:import",
  651. MenuType = "F",
  652. Visible = "0",
  653. Status = "0",
  654. Icon = "",
  655. };
  656. menuList.Add(menuQuery);
  657. menuList.Add(menuAdd);
  658. menuList.Add(menuDel);
  659. if (showEdit)
  660. {
  661. menuList.Add(menuEdit);
  662. }
  663. if (showExport)
  664. {
  665. menuList.Add(menuExport);
  666. }
  667. if (showImport)
  668. {
  669. menuList.Add(menuImport);
  670. }
  671. //Insert(menuList);
  672. var x = Context.Storageable(menuList)
  673. //.SplitInsert(it => !it.Any())
  674. //.SplitUpdate(it => !it.Any())
  675. .WhereColumns(it => new { it.MenuName, it.ParentId })
  676. .ToStorage();
  677. x.AsInsertable.ExecuteCommand();//插入可插入部分;
  678. x.AsUpdateable.ExecuteCommand();
  679. }
  680. /// <summary>
  681. /// 获取移动端工作台菜单
  682. /// </summary>
  683. /// <param name="perms"></param>
  684. /// <param name="v"></param>
  685. /// <returns></returns>
  686. public List<RouterVo> GetAppMenus(List<string> perms, int v)
  687. {
  688. var demoList = new List<RouterVo>(){
  689. new()
  690. {
  691. Path = "/pages/demo/index",
  692. Meta = new Meta("功能演示", "bookmark")
  693. },
  694. new()
  695. {
  696. Path = "/pages/demo/table/table",
  697. Meta = new Meta("列表表格", "grid")
  698. },
  699. new()
  700. {
  701. Path = "/pages/demo/table/table2",
  702. Meta = new Meta("水平表格", "list")
  703. }
  704. };
  705. if (v >= 1)
  706. {
  707. demoList.Add(new RouterVo
  708. {
  709. Path = "/pages/dashboard/index",
  710. Meta = new Meta("控制台", "list")
  711. });
  712. }
  713. var router = new List<RouterVo>
  714. {
  715. new()
  716. {
  717. Meta = new Meta("演示功能", ""){ IconColor = "#2389da"},
  718. Children = demoList
  719. },
  720. new()
  721. {
  722. Meta = new Meta("系统管理", ""){ IconColor = "#ff7d00"},
  723. Children = new List<RouterVo>()
  724. {
  725. new()
  726. {
  727. Path = "/pages/system/sysConfig/sysConfig",
  728. Meta = new Meta("系统配置", "setting"){ Permi = "system:config:list"},
  729. },
  730. new()
  731. {
  732. Path = "/pages/monitor/tasks/index",
  733. Meta = new Meta("任务管理", "hourglass-half-fill"){Permi = "monitor:job:list"}
  734. },
  735. new()
  736. {
  737. Path = "/pages/monitor/onlineuser",
  738. Meta = new Meta("在线用户", "grid"){ Permi = "admin"}
  739. },
  740. new()
  741. {
  742. Path = "/pages/system/user/user",
  743. Meta = new Meta("用户管理", "account"){ Permi = "system:user:list" }
  744. },
  745. new()
  746. {
  747. Path = "/pages/monitor/server",
  748. Meta = new Meta("系统监控", "play-right"){ Permi = "monitor:server:list"}
  749. },
  750. new()
  751. {
  752. Path = "/pages/notice/index",
  753. Meta = new Meta("通知公告", "volume")
  754. }
  755. }
  756. },
  757. new()
  758. {
  759. Meta = new Meta("日志管理", ""){ IconColor = "#8a8a8a"},
  760. Children = new List<RouterVo>()
  761. {
  762. new()
  763. {
  764. Path = "/pages/monitor/logininfo",
  765. Meta = new Meta("登录日志", "clock")
  766. },
  767. new()
  768. {
  769. Path = "/pages/monitor/operlog",
  770. Meta = new Meta("操作日志", "file-text"){ Permi = "monitor:operlog:list" }
  771. }
  772. }
  773. },
  774. };
  775. if (perms.Contains(GlobalConstant.AdminPerm))
  776. {
  777. return router;
  778. }
  779. var newRouter = new List<RouterVo>();
  780. foreach (var item in router)
  781. {
  782. RouterVo routerVo = new()
  783. {
  784. Children = new List<RouterVo>()
  785. };
  786. for (var i = 0; i < item.Children.Count; i++)
  787. {
  788. var chd = item.Children[i];
  789. if (chd.Meta.Permi != null && perms.Contains(chd.Meta.Permi))
  790. {
  791. routerVo.Children.Add(chd);
  792. }
  793. else if (chd.Meta.Permi == null)
  794. {
  795. routerVo.Children.Add(chd);
  796. }
  797. }
  798. if (routerVo.Children != null && routerVo.Children.Count > 0)
  799. {
  800. routerVo.Meta = item.Meta;
  801. newRouter.Add(routerVo);
  802. }
  803. }
  804. return newRouter;
  805. }
  806. }
  807. }