import { Provide, Inject, Init } from '@midwayjs/decorator'; import { InjectEntityModel } from '@midwayjs/typegoose'; import { ReturnModelType } from '@typegoose/typegoose'; import { BaseService, ServiceError, FrameworkErrorEnum } from 'free-midway-component'; import { Role } from '../../entity/system/role.entity'; import { Menus } from '../../entity/system/menus.entity'; import { MenusService } from './menus.service'; import { flattenDeep, uniq, get, lowerFirst, upperFirst, last } from 'lodash'; import { Context } from '@midwayjs/koa'; import { I18nService } from '../i18n.service'; import { FrameErrorEnum } from '../../error/frame.error'; type modelType = ReturnModelType; @Provide() export class RoleService extends BaseService { @InjectEntityModel(Role) model: modelType; @InjectEntityModel(Menus) menusModel: ReturnModelType; @Inject() i18n: I18nService; @Inject() menusService: MenusService; @Inject() ctx: Context; //是否是超级管理员 isSuperAdmin() { const user = this.ctx.user; if (user.role === 'Admin' && user.is_super === '0') return true; } async getUserMenus(needCode = false) { const user = this.ctx.user; // 这里需要改下. 平台的超级管理员有这些权限 if (this.isSuperAdmin()) { const menus = await this.menusService.queryMenu({ is_use: '0' }); return { menus }; } const roleCode = [lowerFirst(user.role), upperFirst(user.role)]; const role = await this.model.findOne({ code: roleCode, is_use: '0' }).lean(); if (!role) throw new ServiceError(this.i18n.translateError(FrameErrorEnum.ROLE_IS_DISABLED), FrameErrorEnum.ROLE_IS_DISABLED); const roleMenu = get(role, 'menu', []); const menu = roleMenu.map(i => { const arr = i.split('.'); return last(arr); }); if (needCode) return roleMenu; const menuList = await this.menusModel.find({ route_name: menu }).lean(); let treeMenu = menuList.filter(f => !f.parent_id); treeMenu = this.menusService.treeMenu(menuList, treeMenu); return { menus: treeMenu, role_code: roleMenu }; } /** * 根据角色id数组,整理菜单 * @param roleIdList 角色id数组 */ async getMenuByRoles(roleIdList) { let menus = []; // 第一步,整理所有菜单至一维数组 for (const r of roleIdList) { menus.push(...flattenDeep(r)); } menus = uniq(menus); const allMenu = await this.menusModel.find({ _id: menus, is_use: '0' }, { meta: 0, __v: 0 }).sort({ order_num: 1 }).lean(); let treeMenu = allMenu.filter(f => !f.parent_id); treeMenu = this.menusService.treeMenu(allMenu, treeMenu); return treeMenu; } }