소스 검색

菜单角色

zs 2 년 전
부모
커밋
8d3b44e8d1

+ 5 - 16
src/controller/system/menus.controller.ts

@@ -14,8 +14,7 @@ import {
   CDTO_menus,
   CVO_menus,
   FVO_menus,
-  QDTO_menus,
-  QVO_menus,
+  QueryVO_menus,
   UDTO_menus,
   UVAO_menus,
 } from '../../interface/system/menus.interface';
@@ -37,20 +36,10 @@ export class MenusController extends BaseController {
   }
   @Get('/')
   @ApiQuery({ name: 'query' })
-  @ApiResponse({ type: QVO_menus })
-  async query(
-    @Query() filter: QDTO_menus,
-    @Query('skip') skip: number,
-    @Query('limit') limit: number
-  ) {
-    const list = await this.service.query(filter, { skip, limit });
-    const data = [];
-    for (const i of list) {
-      const newData = new QVO_menus(i);
-      data.push(newData);
-    }
-    const total = await this.service.count(filter);
-    return { data, total };
+  @ApiResponse({ type: QueryVO_menus })
+  async query(@Query('module_id') module_id: string) {
+    const data = await this.service.queryMenu(module_id);
+    return data;
   }
 
   @Get('/:id')

+ 78 - 2
src/controller/system/role.controller.ts

@@ -8,8 +8,19 @@ import {
   Post,
   Query,
 } from '@midwayjs/decorator';
-import { BaseController } from 'free-midway-component';
+import {
+  BaseController,
+  FrameworkErrorEnum,
+  SearchBase,
+  ServiceError,
+} from 'free-midway-component';
 import { RoleService } from '../../service/system/role.service';
+import { ModuleService } from '../../service/system/module.service';
+import { MenusService } from '../../service/system/menus.service';
+import { AdminService } from '../../service/user/admin.service';
+import { CompanyService } from '../../service/user/company.service';
+import { ExpertService } from '../../service/user/expert.service';
+import { PersonalService } from '../../service/user/personal.service';
 import {
   CDTO_role,
   CVO_role,
@@ -19,13 +30,78 @@ import {
   UDTO_role,
   UVAO_role,
 } from '../../interface/system/role.interface';
-import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
+import {
+  ApiOperation,
+  ApiQuery,
+  ApiResponse,
+  ApiTags,
+} from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
+import get = require('lodash/get');
 @ApiTags(['角色'])
 @Controller('/role')
 export class RoleController extends BaseController {
   @Inject()
   service: RoleService;
+  @Inject()
+  moduleService: ModuleService;
+
+  @Inject()
+  menusService: MenusService;
+
+  @Inject()
+  adminService: AdminService;
+
+  @Inject()
+  companyService: CompanyService;
+
+  @Inject()
+  expertService: ExpertService;
+
+  @Inject()
+  personalService: PersonalService;
+
+  @Get('/um')
+  @ApiOperation({ description: '获取用户的菜单' })
+  async userMenu() {
+    const user = this.ctx.user;
+    if (!user)
+      throw new ServiceError('用户未登录', FrameworkErrorEnum.NOT_LOGIN);
+    const type = get(user, 'type');
+    const user_id = get(this.ctx.user, '_id');
+    let udata = {};
+    if (type === '1') udata = await this.adminService.fetch(user_id);
+    else if (type === '3') udata = await this.personalService.fetch(user_id);
+    else if (type === '4') udata = await this.companyService.fetch(user_id);
+    else if (type === '5') udata = await this.expertService.fetch(user_id);
+    else if (type === '0') {
+      // 超级管理员
+      const f = new SearchBase({});
+      const modules = await this.moduleService.query(f);
+      const allMenus = {};
+      for (const i of modules) {
+        const menus = await this.menusService.queryMenu(get(i, '_id'));
+        allMenus[get(i, '_id')] = menus;
+      }
+      return allMenus;
+    }
+    const menus = await this.service.getMenuByRoles(get(udata, 'role', []));
+    return menus;
+  }
+  @Get('/am')
+  @ApiOperation({ description: '获取所有菜单提供选择' })
+  async roleAllMenu() {
+    const f = new SearchBase({});
+    const moduleList = await this.moduleService.query(f, null, { lean: true });
+    const result = [];
+    for (const i of moduleList) {
+      const menus = await this.menusService.queryMenu(i._id);
+      const obj: any = { _id: i._id, name: i.name };
+      if (menus.length > 0) obj.children = menus;
+      result.push(obj);
+    }
+    return result;
+  }
 
   @Post('/')
   @Validate()

+ 1 - 1
src/interface/system/menus.interface.ts

@@ -37,7 +37,7 @@ export class FVO_menus {
   @ApiProperty({ description: '是否使用' })
   'is_use': string = undefined;
 }
-
+export class QueryVO_menus extends FVO_menus {}
 export class QDTO_menus extends SearchBase {
   constructor() {
     const like_prop = [];

+ 0 - 4
src/interface/user/admin.interface.ts

@@ -138,15 +138,11 @@ export class FetchVO_admin {
   'name': string = undefined;
   @ApiProperty({ description: '角色' })
   'role': Array<any> = undefined;
-  @ApiProperty({ description: '超级管理员!' })
-  'is_super': boolean = undefined;
 }
 
 export class LoginVO extends FetchVO_admin {
   constructor(data: object) {
     super(data);
-    if (get(data, 'is_super')) this.type = '0';
-    else this.type = '1';
   }
   @ApiProperty({ description: '用户类型' })
   'type': string = undefined;

+ 35 - 0
src/service/system/menus.service.ts

@@ -3,9 +3,44 @@ import { InjectEntityModel } from '@midwayjs/typegoose';
 import { ReturnModelType } from '@typegoose/typegoose';
 import { BaseService } from 'free-midway-component';
 import { Menus } from '../../entity/system/menus.entity';
+import orderBy = require('lodash/orderBy');
+import { Types } from 'mongoose';
+const ObjectId = Types.ObjectId;
 type modelType = ReturnModelType<typeof Menus>;
 @Provide()
 export class MenusService extends BaseService<modelType> {
   @InjectEntityModel(Menus)
   model: modelType;
+
+  async queryMenu(module_id: string): Promise<Array<object>> {
+    const data = await this.model
+      .find(
+        { module_id, is_use: '0' },
+        { meta: 0, __v: 0 },
+        { sort: { sort: 1 } }
+      )
+      .lean();
+    let treeMenu = data.filter(f => !f.parent_id);
+    treeMenu = this.treeMenu(data, treeMenu);
+    return treeMenu;
+  }
+
+  treeMenu(allMenus, nowMenu) {
+    for (const nm of nowMenu) {
+      const { _id, parent_id } = nm;
+      // 查下下级其是否有目录
+      let children = allMenus.filter(f =>
+        new ObjectId(f.parent_id).equals(_id)
+      );
+      children = this.treeMenu(allMenus, children);
+      if (children.length > 0) nm.children = children;
+      // 换父级组件的名称
+      if (parent_id) {
+        const r = allMenus.find(f => new ObjectId(f._id).equals(parent_id));
+        if (r) nm.parent_name = r.name;
+      }
+    }
+    nowMenu = orderBy(nowMenu, ['sort'], ['asc']);
+    return nowMenu;
+  }
 }

+ 39 - 1
src/service/system/role.service.ts

@@ -1,11 +1,49 @@
-import { Provide } from '@midwayjs/decorator';
+import { Inject, Provide } from '@midwayjs/decorator';
 import { InjectEntityModel } from '@midwayjs/typegoose';
 import { ReturnModelType } from '@typegoose/typegoose';
 import { BaseService } from 'free-midway-component';
 import { Role } from '../../entity/system/role.entity';
+import { Menus } from '../../entity/system/menus.entity';
+import { MenusService } from './menus.service';
+import get = require('lodash/get');
+import flattenDeep = require('lodash/flattenDeep');
+import uniq = require('lodash/uniq');
+import groupBy = require('lodash/groupBy');
 type modelType = ReturnModelType<typeof Role>;
 @Provide()
 export class RoleService extends BaseService<modelType> {
   @InjectEntityModel(Role)
   model: modelType;
+
+  @InjectEntityModel(Menus)
+  menusModel: ReturnModelType<typeof Menus>;
+
+  @Inject()
+  menusService: MenusService;
+  /**
+   * 根据角色id数组,整理菜单
+   * @param roleIdList 角色id数组
+   */
+  async getMenuByRoles(roleIdList) {
+    const roleList = await this.model.find({ _id: roleIdList }).lean();
+    let menus = [];
+    // 第一步,整理所有菜单至一维数组
+    for (const r of roleList) {
+      const rm = get(r, 'menu', []);
+      menus.push(...flattenDeep(rm));
+    }
+    menus = uniq(menus);
+    const allMenu = await this.menusModel
+      .find({ _id: menus }, { meta: 0, __v: 0 }, { sort: { sort: 1 } })
+      .lean();
+    const groupMenus = groupBy(allMenu, 'module_id');
+    const resetMenu = {};
+    for (const m in groupMenus) {
+      const mAllMenu = groupMenus[m];
+      let treeMenu = mAllMenu.filter(f => !f.parent_id);
+      treeMenu = this.menusService.treeMenu(mAllMenu, treeMenu);
+      resetMenu[m] = treeMenu;
+    }
+    return resetMenu;
+  }
 }