user-menu.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 'use strict';
  2. const assert = require('assert');
  3. const _ = require('lodash');
  4. const moment = require('moment');
  5. const { ObjectId } = require('mongoose').Types;
  6. const { CrudService } = require('naf-framework-mongoose/lib/service');
  7. const { BusinessError, ErrorCode } = require('naf-core').Error;
  8. class UserMenuService extends CrudService {
  9. constructor(ctx) {
  10. super(ctx, 'usermenu');
  11. this.model = this.ctx.model.UserMenu;
  12. this.Rolemodel = this.ctx.model.Role;
  13. this.Menumodel = this.ctx.model.Menu;
  14. }
  15. async create(data) {
  16. const { userid } = data;
  17. let res;
  18. res = await this.model.findOne({ userid });
  19. if (res) {
  20. res = await this.model.update({ userid }, data);
  21. } else {
  22. res = await this.model.create(data);
  23. }
  24. return res;
  25. }
  26. async findUserMenu({ userid }) {
  27. assert(userid, '缺少用户信息');
  28. const res = await this.model.findOne({ userid });
  29. return res;
  30. }
  31. async getUserMenu({ type, userid }) {
  32. assert(type, '缺少需要查找角色代码');
  33. assert(userid, '缺少需要查找用户信息');
  34. // 找到这个角色的权限,找到用户权限,合并在一起
  35. // 找到这个角色的所有权限
  36. const menuids = [];
  37. const res = await this.Rolemodel.findOne({ type });
  38. if (!res) { throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定角色'); }
  39. const { menu: roleMenu, params } = res;
  40. // roleMenu只存id
  41. menuids.push(...roleMenu);
  42. // 找到用户的特殊权限
  43. if (userid !== 'dev') {
  44. const umidsRes = await this.ctx.service.userMenu.findUserMenu({ userid });
  45. if (umidsRes) {
  46. const { menu: uMenuids } = umidsRes;
  47. // uMenuids只存id
  48. menuids.push(...uMenuids);
  49. }
  50. }
  51. // 找到所有菜单的父级,下面过滤用,把父级目录拿出来(不单纯是根目录)
  52. const parentIdsRes = await this.Menumodel.find({ _id: menuids.map(i => ObjectId(i)) }, 'pid');
  53. let parentIds = parentIdsRes.map(i => i.pid);
  54. parentIds = _.compact(parentIds);
  55. menuids.push(...parentIds);
  56. // 找到该项目的所有的权限
  57. const allMenu = await this.Menumodel.find({ disabled: false }).sort({ sort: -1 });
  58. // 需要将根目录整理出来,将
  59. const dup = allMenu.filter(f => menuids.find(um => ObjectId(um).equals(f._id)));
  60. const userMenu = await this.ctx.service.menu.toFindChildren(dup);
  61. return { menu: userMenu, params };
  62. }
  63. }
  64. module.exports = UserMenuService;