91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Inject, InjectClient, Provide } from '@midwayjs/decorator';
 | |
| import { BaseService } from '@cool-midway/core';
 | |
| import { BaseSysMenuService } from './menu';
 | |
| import { BaseSysRoleService } from './role';
 | |
| import { BaseSysDepartmentService } from './department';
 | |
| import { Context } from '@midwayjs/koa';
 | |
| import { CachingFactory, MidwayCache } from '@midwayjs/cache-manager';
 | |
| import { BaseSysRoleEntity } from '../../entity/sys/role';
 | |
| import { In, Repository } from 'typeorm';
 | |
| import { InjectEntityModel } from '@midwayjs/typeorm';
 | |
| 
 | |
| /**
 | |
|  * 权限
 | |
|  */
 | |
| @Provide()
 | |
| export class BaseSysPermsService extends BaseService {
 | |
|   @InjectClient(CachingFactory, 'default')
 | |
|   midwayCache: MidwayCache;
 | |
| 
 | |
|   @Inject()
 | |
|   baseSysMenuService: BaseSysMenuService;
 | |
| 
 | |
|   @Inject()
 | |
|   baseSysRoleService: BaseSysRoleService;
 | |
| 
 | |
|   @Inject()
 | |
|   baseSysDepartmentService: BaseSysDepartmentService;
 | |
| 
 | |
|   @InjectEntityModel(BaseSysRoleEntity)
 | |
|   baseSysRoleEntity: Repository<BaseSysRoleEntity>;
 | |
| 
 | |
|   @Inject()
 | |
|   ctx: Context;
 | |
|   base: any;
 | |
| 
 | |
|   /**
 | |
|    * 刷新权限
 | |
|    * @param userId 用户ID
 | |
|    */
 | |
|   async refreshPerms(userId) {
 | |
|     const roleIds = await this.baseSysRoleService.getByUser(userId);
 | |
|     const perms = await this.baseSysMenuService.getPerms(roleIds);
 | |
|     await this.midwayCache.set(`admin:perms:${userId}`, perms);
 | |
|     // 更新部门权限
 | |
|     const departments = await this.baseSysDepartmentService.getByRoleIds(
 | |
|       roleIds,
 | |
|       await this.isAdmin(roleIds)
 | |
|     );
 | |
|     await this.midwayCache.set(`admin:department:${userId}`, departments);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 根据角色判断是不是超管
 | |
|    * @param roleIds
 | |
|    */
 | |
|   async isAdmin(roleIds: number[]) {
 | |
|     const roles = await this.baseSysRoleEntity.findBy({ id: In(roleIds) });
 | |
|     const roleLabels = roles.map(item => item.label);
 | |
|     return roleLabels.includes('admin');
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 获得权限菜单
 | |
|    * @param roleIds
 | |
|    */
 | |
|   async permmenu(roleIds: number[]) {
 | |
|     const perms = await this.baseSysMenuService.getPerms(roleIds);
 | |
|     const menus = await this.baseSysMenuService.getMenus(
 | |
|       roleIds,
 | |
|       this.ctx.admin.username === 'admin'
 | |
|     );
 | |
|     return { perms, menus };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * 根据用户ID获得部门权限
 | |
|    * @param userId
 | |
|    * @return 部门ID数组
 | |
|    */
 | |
|   async departmentIds(userId: number) {
 | |
|     const department: any = await this.midwayCache.get(
 | |
|       `admin:department:${userId}`
 | |
|     );
 | |
|     if (department) {
 | |
|       return department;
 | |
|     } else {
 | |
|       return [];
 | |
|     }
 | |
|   }
 | |
| }
 | 
