menu.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import BaseService from '../../base';
  2. import * as _ from 'lodash';
  3. import { IsNull, Not } from 'typeorm';
  4. /**
  5. * 系统-菜单
  6. */
  7. export default class SysMenuService extends BaseService {
  8. /**
  9. * 获取所有菜单
  10. */
  11. async list() {
  12. return await this.getRepo().admin.sys.Menu.find();
  13. }
  14. /**
  15. * 保存或新增菜单
  16. */
  17. async save(menu: any) {
  18. const result = await this.getRepo().admin.sys.Menu.save(menu);
  19. return result;
  20. }
  21. /**
  22. * 根据角色获取所有菜单
  23. */
  24. async getMenus(uid: number) {
  25. const roleIds = await this.service.admin.sys.role.getRoleIdByUser(uid);
  26. let menus: any = [];
  27. if (_.includes(roleIds, this.config.rootRoleId)) {
  28. // root find all
  29. menus = await this.getRepo().admin.sys.Menu.find();
  30. } else {
  31. // [ 1, 2, 3 ] role find
  32. menus = await this.getRepo().admin.sys.Menu.createQueryBuilder('menu')
  33. .innerJoinAndSelect('sys_role_menu', 'role_menu', 'menu.id = role_menu.menu_id')
  34. .andWhere('role_menu.role_id IN (:...roldIds)', { roldIds: roleIds })
  35. .orderBy('menu.order_num', 'DESC')
  36. .getMany();
  37. }
  38. return menus;
  39. }
  40. /**
  41. * 查找当前菜单下的子菜单,目录以及菜单
  42. */
  43. async findChildMenus(mid: number) {
  44. const allMenus: any = [];
  45. const menus = await this.getRepo().admin.sys.Menu.find({ parentId: mid });
  46. // if (_.isEmpty(menus)) {
  47. // return allMenus;
  48. // }
  49. // const childMenus: any = [];
  50. for (let i = 0; i < menus.length; i++) {
  51. if (menus[i].type !== 2) {
  52. // 子目录下是菜单或目录,继续往下级查找
  53. const c = await this.findChildMenus(menus[i].id);
  54. allMenus.push(c);
  55. }
  56. allMenus.push(menus[i].id);
  57. }
  58. return allMenus;
  59. }
  60. /**
  61. * 获取某个菜单的信息
  62. * @param mid menu id
  63. */
  64. async getMenuItemInfo(mid: number) {
  65. const menu = await this.getRepo().admin.sys.Menu.findOne({ id: mid });
  66. return menu;
  67. }
  68. /**
  69. * 获取某个菜单以及关联的父菜单的信息
  70. */
  71. async getMenuItemAndParentInfo(mid: number) {
  72. const menu = await this.getRepo().admin.sys.Menu.findOne({ id: mid });
  73. let parentMenu: any = null;
  74. if (menu && menu.parentId) {
  75. parentMenu = await this.getRepo().admin.sys.Menu.findOne({ id: menu.parentId });
  76. }
  77. return { menu, parentMenu };
  78. }
  79. /**
  80. * 查找节点路由是否存在
  81. */
  82. async findRouterExist(router: string) {
  83. const menus = await this.getRepo().admin.sys.Menu.findOne({ router });
  84. return !_.isEmpty(menus);
  85. }
  86. /**
  87. * 获取当前用户的所有权限
  88. */
  89. async getPerms(uid: number) {
  90. const roleIds = await this.service.admin.sys.role.getRoleIdByUser(uid);
  91. let perms: any[] = [];
  92. let result: any = null;
  93. if (_.includes(roleIds, this.config.rootRoleId)) {
  94. // root find all perms
  95. result = await this.getRepo().admin.sys.Menu.find({ perms: Not(IsNull()), type: 3 });
  96. } else {
  97. result = await this.getRepo().admin.sys.Menu.createQueryBuilder('menu')
  98. .innerJoinAndSelect('sys_role_menu', 'role_menu', 'menu.id = role_menu.menu_id')
  99. .andWhere('role_menu.role_id IN (:...roldIds)', { roldIds: roleIds })
  100. .andWhere('menu.type = 3')
  101. .andWhere('menu.perms IS NOT NULL')
  102. .getMany();
  103. }
  104. if (!_.isEmpty(result)) {
  105. result.forEach(e => {
  106. perms = _.concat(perms, e.perms.split(','));
  107. });
  108. perms = _.uniq(perms);
  109. }
  110. return perms;
  111. }
  112. /**
  113. * 删除多项菜单
  114. */
  115. async deleteMenuItem(mids: number[]) {
  116. return await this.getRepo().admin.sys.Menu.delete(mids);
  117. }
  118. /**
  119. * 刷新指定用户ID的权限
  120. */
  121. async refreshPerms(uid: number) {
  122. const perms = await this.getPerms(uid);
  123. const online = await this.getAdminRedis().get(`admin:token:${uid}`);
  124. if (online) {
  125. // 判断是否在线
  126. await this.getAdminRedis().set(`admin:perms:${uid}`, JSON.stringify(perms));
  127. }
  128. }
  129. /**
  130. * 刷新所有在线用户的权限
  131. */
  132. async refreshOnlineUserPerms() {
  133. const onlineUserIds: string[] = await this.getAdminRedis().keys('admin:token:*');
  134. if (onlineUserIds && onlineUserIds.length > 0) {
  135. for (let i = 0; i < onlineUserIds.length; i++) {
  136. const uid = onlineUserIds[i].split('admin:token:')[1];
  137. const perms = await this.getPerms(parseInt(uid));
  138. await this.getAdminRedis().set(`admin:perms:${uid}`, JSON.stringify(perms));
  139. }
  140. }
  141. }
  142. }