SysMenuService.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. using Attribute;
  2. using Common;
  3. using Dto;
  4. using Enums;
  5. using Extensions;
  6. using Model;
  7. using Service;
  8. using Services;
  9. using Vo;
  10. namespace Services
  11. {
  12. /// <summary>
  13. /// 菜单
  14. /// </summary>
  15. [AppService(ServiceType = typeof(ISysMenuService), ServiceLifetime = LifeTime.Transient)]
  16. public class SysMenuService : BaseService<SysMenu>, ISysMenuService
  17. {
  18. public ISysRoleService SysRoleService;
  19. public SysMenuService(ISysRoleService sysRoleService)
  20. {
  21. SysRoleService = sysRoleService;
  22. }
  23. /// <summary>
  24. /// 获取所有菜单数(菜单管理)
  25. /// </summary>
  26. /// <returns></returns>
  27. public List<TreeSelectVo> SelectTreeMenuList(MenuQueryDto menu, long userId)
  28. {
  29. // if (menu.parentId != null)
  30. // {
  31. // return GetMenusByMenuId(menu.parentId.ParseToInt(), userId);
  32. // }
  33. List<TreeSelectVo> menuList = BuildMenuTreeSelect(SelectMenuList(menu, userId));
  34. return menuList;
  35. }
  36. /// <summary>
  37. /// 获取所有菜单列表
  38. /// </summary>
  39. /// <returns></returns>
  40. public List<SysMenu> SelectMenuList(MenuQueryDto menu, long userId)
  41. {
  42. List<SysMenu> menuList;
  43. if (SysRoleService.IsAdmin(userId))
  44. {
  45. menuList = SelectMenuList(menu);
  46. }
  47. else
  48. {
  49. var userRoles = SysRoleService.SelectUserRoles(userId);
  50. menuList = SelectMenuListByRoles(menu, userRoles);
  51. }
  52. return menuList;
  53. }
  54. /// <summary>
  55. /// 获取菜单详情
  56. /// </summary>
  57. /// <param name="menuId"></param>
  58. /// <returns></returns>
  59. public SysMenu GetMenuByMenuId(int menuId)
  60. {
  61. return GetFirst(it => it.menuId == menuId);
  62. }
  63. /// <summary>
  64. /// 根据菜单id获取菜单列表
  65. /// </summary>
  66. /// <param name="menuId"></param>
  67. /// <param name="userId"></param>
  68. /// <returns></returns>
  69. public List<SysMenu> GetMenusByMenuId(int menuId, long userId)
  70. {
  71. var menuExpression = Expressionable.Create<SysMenu>();
  72. menuExpression.And(c => c.parentId == menuId);
  73. if (!SysRoleService.IsAdmin(userId))
  74. {
  75. var userRoles = SysRoleService.SelectUserRoles(userId);
  76. var roleMenus = Context.Queryable<SysRoleMenu>()
  77. .Where(r => userRoles.Contains(r.RoleId)).Select(s => s.MenuId).ToList();
  78. menuExpression.And(c => roleMenus.Contains(c.menuId));
  79. }
  80. var list = GetList(menuExpression.ToExpression()).OrderBy(f => f.sortOrder).ToList();
  81. Context.ThenMapper(list, item =>
  82. {
  83. item.subNum = Context.Queryable<SysMenu>().SetContext(x => x.parentId, () => item.menuId, item).Count;
  84. });
  85. return list;
  86. }
  87. /// <summary>
  88. /// 添加菜单
  89. /// </summary>
  90. /// <param name="menu"></param>
  91. /// <returns></returns>
  92. public long AddMenu(SysMenu menu)
  93. {
  94. menu.CreateTime = DateTime.Now;
  95. menu.UpdateTime = DateTime.Now;
  96. return InsertReturnBigIdentity(menu);
  97. }
  98. /// <summary>
  99. /// 编辑菜单
  100. /// </summary>
  101. /// <param name="menu"></param>
  102. /// <returns></returns>
  103. public long EditMenu(SysMenu menu)
  104. {
  105. menu.UpdateTime = DateTime.Now;
  106. menu.icon = string.IsNullOrEmpty(menu.icon) ? "" : menu.icon;
  107. return Update(menu, true);
  108. }
  109. /// <summary>
  110. /// 删除菜单管理信息
  111. /// </summary>
  112. /// <param name="menuId"></param>
  113. /// <returns></returns>
  114. public int DeleteMenuById(int menuId)
  115. {
  116. return Delete(menuId);
  117. }
  118. /// <summary>
  119. /// 校验菜单名称是否唯一
  120. /// </summary>
  121. /// <param name="menu"></param>
  122. /// <returns></returns>
  123. public string CheckMenuNameUnique(SysMenu menu)
  124. {
  125. long menuId = menu.menuId == 0 ? -1 : menu.menuId;
  126. SysMenu info = GetFirst(it => it.name == menu.name && it.parentId == menu.parentId);
  127. //if (info != null && menuId != info.menuId && menu.menuName.Equals(info.menuName))
  128. //{
  129. // return UserConstants.NOT_UNIQUE;
  130. //}
  131. if (info != null && info.menuId != menu.menuId)
  132. {
  133. return UserConstants.NOT_UNIQUE;
  134. }
  135. return UserConstants.UNIQUE;
  136. }
  137. /// <summary>
  138. /// 菜单排序
  139. /// </summary>
  140. /// <param name="menuDto"></param>
  141. /// <returns></returns>
  142. public int ChangeSortMenu(MenuDto menuDto)
  143. {
  144. return Update(new SysMenu() { menuId = menuDto.menuId, sortOrder = menuDto.sortOrder }, it => new { it.sortOrder });
  145. }
  146. /// <summary>
  147. /// 是否存在菜单子节点
  148. /// </summary>
  149. /// <param name="menuId"></param>
  150. /// <returns></returns>
  151. public bool HasChildByMenuId(long menuId)
  152. {
  153. return Count(it => it.parentId == menuId) > 0;
  154. }
  155. /// <summary>
  156. /// 获取左边导航栏菜单树
  157. /// </summary>
  158. /// <param name="userId"></param>
  159. /// <returns></returns>
  160. public List<SysMenu> SelectMenuTreeByUserId(long userId)
  161. {
  162. MenuQueryDto dto = new() { delFlag = "0", menuTypeIds = "M,C" };
  163. if (SysRoleService.IsAdmin(userId))
  164. {
  165. return SelectTreeMenuList(dto);
  166. }
  167. else
  168. {
  169. List<long> roleIds = SysRoleService.SelectUserRoles(userId);
  170. return SelectTreeMenuListByRoles(dto, roleIds);
  171. }
  172. }
  173. /// <summary>
  174. /// 查询精确到按钮的操作权限
  175. /// </summary>
  176. /// <param name="userId"></param>
  177. /// <returns></returns>
  178. public List<string> SelectMenuPermsByUserId(long userId)
  179. {
  180. var menus = Context.Queryable<SysMenu, SysRoleMenu, SysUserRole, SysRole>((m, rm, ur, r) => new JoinQueryInfos(
  181. JoinType.Left, m.menuId == rm.MenuId,
  182. JoinType.Left, rm.RoleId == ur.RoleId,
  183. JoinType.Left, ur.RoleId == r.roleId
  184. ))
  185. .WithCache(60 * 10)
  186. .Where((m, rm, ur, r) => m.DelFlag == "0" && ur.UserId == userId)
  187. .Select((m, rm, ur, r) => m).ToList();
  188. var menuList = menus.Where(f => !string.IsNullOrEmpty(f.permission));
  189. return menuList.Select(x => x.permission).Distinct().ToList();
  190. }
  191. /// <summary>
  192. /// 根据用户查询系统菜单列表
  193. /// </summary>
  194. /// <param name="menu"></param>
  195. /// <param name="roles">用户角色集合</param>
  196. /// <returns></returns>
  197. public List<SysMenu> SelectTreeMenuListByRoles(MenuQueryDto menu, List<long> roles)
  198. {
  199. var roleMenus = Context.Queryable<SysRoleMenu>()
  200. .Where(r => roles.Contains(r.RoleId))
  201. .Select(f => f.MenuId).Distinct().ToList();
  202. return Queryable()
  203. .Where(c => roleMenus.Contains(c.menuId))
  204. .WhereIF(!string.IsNullOrEmpty(menu.menuName), (c) => c.name.Contains(menu.menuName))
  205. .WhereIF(!string.IsNullOrEmpty(menu.visible), (c) => c.visible == menu.visible)
  206. .WhereIF(!string.IsNullOrEmpty(menu.delFlag), (c) => c.DelFlag == menu.delFlag)
  207. // .WhereIF(!string.IsNullOrEmpty(menu.menuTypeIds), c => menu.menuTypeIdArr.Contains(c.menuType))
  208. .OrderBy((c) => new { c.parentId, c.sortOrder })
  209. .Select(c => c)
  210. .ToTree(it => it.children, it => it.parentId, 0);
  211. }
  212. /// <summary>
  213. /// 根据用户查询系统菜单列表
  214. /// </summary>
  215. /// <param name="menu"></param>
  216. /// <param name="roleId">用户角色</param>
  217. /// <returns></returns>
  218. public List<RoleMenuExportDto> SelectRoleMenuListByRole(MenuQueryDto menu, int roleId)
  219. {
  220. var menuIds = Context.Queryable<SysRoleMenu>()
  221. .Where(r => r.RoleId == roleId)
  222. .Select(f => f.MenuId).Distinct().ToList();
  223. return Context.Queryable<SysMenu>()
  224. .InnerJoin<SysMenu>((t1, t2) => t1.menuId == t2.parentId)
  225. .InnerJoin<SysMenu>((t1, t2, t3) => t2.menuId == t3.parentId)
  226. .Where((t1, t2, t3) => menuIds.Contains(t1.menuId))
  227. .Select((t1, t2, t3) => new RoleMenuExportDto()
  228. {
  229. MenuName = $"{t1.name}->{t2.name}->{t3.name}",
  230. Path = t2.path,
  231. Component = t2.path,
  232. Perms = t3.permission,
  233. MenuType = (MenuType)(object)t3.menuType,
  234. Status = (MenuStatus)(object)t3.DelFlag
  235. }).ToList();
  236. }
  237. /// <summary>
  238. /// 获取所有菜单
  239. /// </summary>
  240. /// <returns></returns>
  241. private List<SysMenu> SelectMenuList(MenuQueryDto menu)
  242. {
  243. var menuExp = Expressionable.Create<SysMenu>();
  244. menuExp.AndIF(!string.IsNullOrEmpty(menu.menuName), it => it.name.Contains(menu.menuName));
  245. menuExp.AndIF(!string.IsNullOrEmpty(menu.visible), it => it.visible == menu.visible);
  246. menuExp.AndIF(!string.IsNullOrEmpty(menu.delFlag), it => it.DelFlag == menu.delFlag);
  247. // menuExp.AndIF(!string.IsNullOrEmpty(menu.menuTypeIds), it => menu.menuTypeIdArr.Contains(it.menuType));
  248. menuExp.AndIF(menu.parentId != null, it => it.parentId == menu.parentId);
  249. return Queryable()
  250. .Where(menuExp.ToExpression())
  251. .OrderBy(it => new { it.parentId, it.sortOrder })
  252. .ToList();
  253. }
  254. /// <summary>
  255. /// 根据用户查询系统菜单列表
  256. /// </summary>
  257. /// <param name="sysMenu"></param>
  258. /// <param name="roles">用户角色集合</param>
  259. /// <returns></returns>
  260. private List<SysMenu> SelectMenuListByRoles(MenuQueryDto sysMenu, List<long> roles)
  261. {
  262. var roleMenus = Context.Queryable<SysRoleMenu>()
  263. .Where(r => roles.Contains(r.RoleId));
  264. return Queryable()
  265. .InnerJoin(roleMenus, (c, j) => c.menuId == j.MenuId)
  266. .Where((c, j) => c.DelFlag == "0")
  267. .WhereIF(!string.IsNullOrEmpty(sysMenu.menuName), (c, j) => c.name.Contains(sysMenu.menuName))
  268. .WhereIF(!string.IsNullOrEmpty(sysMenu.visible), (c, j) => c.visible == sysMenu.visible)
  269. .OrderBy((c, j) => new { c.parentId, c.sortOrder })
  270. .Select(c => c)
  271. .ToList();
  272. }
  273. /// <summary>
  274. /// 获取所有菜单(菜单管理)
  275. /// </summary>
  276. /// <returns></returns>
  277. public List<SysMenu> SelectTreeMenuList(MenuQueryDto menu)
  278. {
  279. int parentId = menu.parentId != null ? (int)menu.parentId : 0;
  280. var list = Queryable()
  281. .WithCache(60 * 10)
  282. .WhereIF(!string.IsNullOrEmpty(menu.menuName), it => it.name.Contains(menu.menuName))
  283. .WhereIF(!string.IsNullOrEmpty(menu.visible), it => it.visible == menu.visible)
  284. .WhereIF(!string.IsNullOrEmpty(menu.delFlag), it => it.DelFlag == menu.delFlag)
  285. // .WhereIF(!string.IsNullOrEmpty(menu.menuTypeIds), it => menu.menuTypeIdArr.Contains(it.menuType))
  286. .WhereIF(menu.parentId != null, it => it.parentId == menu.parentId)
  287. .OrderBy(it => new { it.parentId, it.sortOrder })
  288. .ToTree(it => it.children, it => it.parentId, parentId);
  289. return list;
  290. }
  291. #region 方法
  292. ///// <summary>
  293. ///// 根据父节点的ID获取所有子节点
  294. ///// </summary>
  295. ///// <param name="list">分类表</param>
  296. ///// <param name="parentId">传入的父节点ID</param>
  297. ///// <returns></returns>
  298. //public List<SysMenu> GetChildPerms(List<SysMenu> list, int parentId)
  299. //{
  300. // List<SysMenu> returnList = new List<SysMenu>();
  301. // var data = list.FindAll(f => f.parentId == parentId);
  302. // foreach (var item in data)
  303. // {
  304. // RecursionFn(list, item);
  305. // returnList.Add(item);
  306. // }
  307. // return returnList;
  308. //}
  309. /// <summary>
  310. /// 递归列表
  311. /// </summary>
  312. /// <param name="list"></param>
  313. /// <param name="t"></param>
  314. private void RecursionFn(List<SysMenu> list, SysMenu t)
  315. {
  316. //得到子节点列表
  317. List<SysMenu> childList = GetChildList(list, t);
  318. t.children = childList;
  319. t.meta = new TreeSelectMeta();
  320. t.meta.title = t.name;
  321. t.meta.icon = t.icon;
  322. t.id = t.menuId;
  323. foreach (var item in childList)
  324. {
  325. if (GetChildList(list, item).Count() > 0)
  326. {
  327. RecursionFn(list, item);
  328. }
  329. }
  330. }
  331. /// <summary>
  332. /// 递归获取子菜单
  333. /// </summary>
  334. /// <param name="list">所有菜单</param>
  335. /// <param name="sysMenu"></param>
  336. /// <returns></returns>
  337. private List<SysMenu> GetChildList(List<SysMenu> list, SysMenu sysMenu)
  338. {
  339. return list.Where(p => p.parentId == sysMenu.menuId).ToList();
  340. }
  341. /// <summary>
  342. /// 获取路由侧边栏,动态生成
  343. /// </summary>
  344. /// <param name="menus"></param>
  345. /// <returns></returns>
  346. public List<RouterVo> BuildMenus(List<SysMenu> menus)
  347. {
  348. List<RouterVo> routers = new();
  349. if (menus == null) return routers;
  350. foreach (var menu in menus)
  351. {
  352. RouterVo router = new()
  353. {
  354. Hidden = "1".Equals(menu.visible),
  355. Name = GetRouteName(menu),
  356. Path = GetRoutePath(menu),
  357. Component = GetComponent(menu),
  358. Meta = new Meta(menu.name, menu.icon, "1".Equals(menu.keepAlive), menu.enName, menu.path, menu.CreateTime.Value)
  359. };
  360. List<SysMenu> cMenus = menu.children;
  361. //是目录并且有子菜单
  362. if (cMenus != null && cMenus.Count > 0 && UserConstants.TYPE_DIR.Equals(menu.menuType))
  363. {
  364. router.AlwaysShow = true;
  365. router.Redirect = "noRedirect";
  366. router.Children = BuildMenus(cMenus);
  367. }
  368. else if (IsMeunFrame(menu))
  369. {
  370. router.Meta = null;
  371. List<RouterVo> childrenList = new();
  372. RouterVo children = new()
  373. {
  374. Path = menu.path,
  375. Name = string.IsNullOrEmpty(menu.path) ? "" : menu.path.ToLower(),
  376. Meta = new Meta(menu.name, menu.icon, "1".Equals(menu.keepAlive), menu.enName, menu.path, menu.CreateTime.Value)
  377. };
  378. childrenList.Add(children);
  379. router.Children = childrenList;
  380. }
  381. else if (menu.parentId == 0 && IsInnerLink(menu))
  382. {
  383. router.Meta = new Meta(menu.name, menu.icon);
  384. router.Path = "/";
  385. List<RouterVo> childrenList = new();
  386. RouterVo children = new();
  387. string routerPath = InnerLinkReplaceEach(menu.path);
  388. children.Path = routerPath;
  389. children.Component = UserConstants.INNER_LINK;
  390. children.Name = routerPath.ToLower();
  391. children.Meta = new Meta(menu.name, menu.icon, menu.path);
  392. childrenList.Add(children);
  393. router.Children = childrenList;
  394. }
  395. routers.Add(router);
  396. }
  397. return routers;
  398. }
  399. /// <summary>
  400. /// 构建前端所需要下拉树结构
  401. /// </summary>
  402. /// <param name="menus">菜单列表</param>
  403. /// <returns>下拉树结构列表</returns>
  404. public List<SysMenu> BuildMenuTree(List<SysMenu> menus)
  405. {
  406. List<SysMenu> returnList = new();
  407. List<long> tempList = menus.Select(f => f.menuId).ToList();
  408. foreach (var menu in menus)
  409. {
  410. // 如果是顶级节点, 遍历该父节点的所有子节点
  411. if (!tempList.Contains(menu.parentId))
  412. {
  413. var menuInfo = menus.Find(f => f.menuId == menu.menuId);
  414. //移除按钮没有上级
  415. if (!tempList.Contains(menuInfo.parentId) && menu.menuType != "F")
  416. {
  417. RecursionFn(menus, menu);
  418. returnList.Add(menu);
  419. }
  420. }
  421. }
  422. if (!returnList.Any())
  423. {
  424. returnList = menus;
  425. }
  426. return returnList;
  427. }
  428. /// <summary>
  429. /// 构建前端所需要下拉树结构
  430. /// </summary>
  431. /// <param name="menus"></param>
  432. /// <returns></returns>
  433. public List<TreeSelectVo> BuildMenuTreeSelect(List<SysMenu> menus)
  434. {
  435. List<SysMenu> menuTrees = BuildMenuTree(menus);
  436. List<TreeSelectVo> treeMenuVos = new List<TreeSelectVo>();
  437. foreach (var item in menuTrees)
  438. {
  439. treeMenuVos.Add(new TreeSelectVo(item));
  440. }
  441. return treeMenuVos;
  442. }
  443. public List<LeftMenuVo> BuildLeftMenuTreeSelect(List<SysMenu> menus)
  444. {
  445. List<SysMenu> menuTrees = BuildMenuTree(menus);
  446. List<LeftMenuVo> treeMenuVos = new List<LeftMenuVo>();
  447. foreach (var item in menuTrees)
  448. {
  449. treeMenuVos.Add(new LeftMenuVo(item));
  450. }
  451. return treeMenuVos;
  452. }
  453. /// <summary>
  454. /// 获取路由名称
  455. /// </summary>
  456. /// <param name="menu">菜单信息</param>
  457. /// <returns>路由名称</returns>
  458. public string GetRouteName(SysMenu menu)
  459. {
  460. string routerName = menu.path.ToLower();
  461. // 非外链并且是一级目录(类型为目录)
  462. if (IsMeunFrame(menu))
  463. {
  464. routerName = string.Empty;
  465. }
  466. return routerName;
  467. }
  468. /// <summary>
  469. /// 获取路由路径
  470. /// </summary>
  471. /// <param name="menu">菜单信息</param>
  472. /// <returns>路由地址</returns>
  473. public string GetRoutePath(SysMenu menu)
  474. {
  475. string routerPath = menu.path;
  476. // 内链打开外网方式
  477. if (menu.parentId != 0 && IsInnerLink(menu))
  478. {
  479. routerPath = InnerLinkReplaceEach(routerPath);
  480. }
  481. // 非外链并且是一级目录(类型为目录)
  482. if (0 == menu.parentId && UserConstants.TYPE_DIR.Equals(menu.menuType)
  483. && UserConstants.NO_FRAME.Equals(menu.embedded))
  484. {
  485. routerPath = "/" + menu.path;
  486. }
  487. else if (IsMeunFrame(menu))// 非外链并且是一级目录(类型为菜单)
  488. {
  489. routerPath = "/";
  490. }
  491. return routerPath;
  492. }
  493. /// <summary>
  494. /// 获取组件名称
  495. /// </summary>
  496. /// <param name="menu"></param>
  497. /// <returns></returns>
  498. public string GetComponent(SysMenu menu)
  499. {
  500. string component = UserConstants.LAYOUT;
  501. // if (!string.IsNullOrEmpty(menu.Component) && !IsMeunFrame(menu))
  502. // {
  503. // component = menu.Component;
  504. // }
  505. // else if (menu.Component.IsEmpty() && menu.ParentId != 0 && IsInnerLink(menu))
  506. // {
  507. // component = UserConstants.INNER_LINK;
  508. // }
  509. // else if (string.IsNullOrEmpty(menu.Component) && IsParentView(menu))
  510. // {
  511. // component = UserConstants.PARENT_VIEW;
  512. // }
  513. return component;
  514. }
  515. /// <summary>
  516. /// 是否为菜单内部跳转
  517. /// </summary>
  518. /// <param name="menu">菜单信息</param>
  519. /// <returns></returns>
  520. public bool IsMeunFrame(SysMenu menu)
  521. {
  522. return menu.parentId == 0 && UserConstants.TYPE_MENU.Equals(menu.menuType)
  523. && menu.embedded.Equals(UserConstants.NO_FRAME);
  524. }
  525. /// <summary>
  526. /// 是否为内链组件
  527. /// </summary>
  528. /// <param name="menu">菜单信息</param>
  529. /// <returns>结果</returns>
  530. public bool IsInnerLink(SysMenu menu)
  531. {
  532. return menu.embedded.Equals(UserConstants.NO_FRAME) && Tools.IsUrl(menu.path);
  533. }
  534. /// <summary>
  535. /// 是否为parent_view组件
  536. /// </summary>
  537. /// <param name="menu">菜单信息</param>
  538. /// <returns></returns>
  539. public bool IsParentView(SysMenu menu)
  540. {
  541. return menu.parentId != 0 && UserConstants.TYPE_DIR.Equals(menu.menuType);
  542. }
  543. /// <summary>
  544. /// 内链域名特殊字符替换
  545. /// </summary>
  546. /// <param name = "path" ></ param >
  547. /// < returns ></ returns >
  548. public string InnerLinkReplaceEach(string path)
  549. {
  550. return path.IsNotEmpty() ? path
  551. .Replace(UserConstants.HTTP, "")
  552. .Replace(UserConstants.HTTPS, "")
  553. .Replace(UserConstants.WWW, "")
  554. .Replace(".", "/") : path;
  555. }
  556. #endregion
  557. public void AddSysMenu()
  558. {
  559. }
  560. }
  561. }