Skip to content

Commit e543b38

Browse files
committed
feat: 菜单授权根据当前返回
1 parent 5f5c302 commit e543b38

File tree

6 files changed

+102
-58
lines changed

6 files changed

+102
-58
lines changed

src/api/menus/menus.module.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { AccountRoleEntity } from '../accountRole/entities/account.role.entity';
66
import { ResourcesEntity } from '../resources/entities/resources.entity';
77
import { RoleResourcesEntity } from '../roleResources/entities/role.resources.entity';
88
import { MenusController } from './menus.controller';
9+
import { MenusRepository } from './menus.repository';
910
import { MenusService } from './menus.service';
1011

1112
@Module({
@@ -19,7 +20,7 @@ import { MenusService } from './menus.service';
1920
TypeOrmModule.forFeature([ResourcesEntity, AccountRoleEntity, RoleResourcesEntity]),
2021
],
2122
controllers: [MenusController],
22-
providers: [MenusService],
23-
exports: [MenusService],
23+
providers: [MenusService, MenusRepository],
24+
exports: [MenusRepository],
2425
})
2526
export class MenusModule {}

src/api/menus/menus.repository.ts

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { InjectRepository } from '@nestjs/typeorm';
3+
import { ICurrentUserType } from '@src/decorators';
4+
import { AccountTypeEnum } from '@src/enums/account.type.enum';
5+
import { mapToObj } from '@src/utils';
6+
import { Repository, FindOperator, In } from 'typeorm';
7+
import { AccountRoleEntity } from '../accountRole/entities/account.role.entity';
8+
import { ResourcesEntity } from '../resources/entities/resources.entity';
9+
import { RoleResourcesEntity } from '../roleResources/entities/role.resources.entity';
10+
11+
@Injectable()
12+
export class MenusRepository {
13+
constructor(
14+
@InjectRepository(AccountRoleEntity)
15+
private readonly accountRoleRepository: Repository<AccountRoleEntity>,
16+
@InjectRepository(RoleResourcesEntity)
17+
private readonly roleResourcesRepository: Repository<RoleResourcesEntity>,
18+
@InjectRepository(ResourcesEntity)
19+
private readonly resourcesRepository: Repository<ResourcesEntity>
20+
) {}
21+
22+
/**
23+
* @Author:
24+
* @Date: 2023-05-20 17:08:22
25+
* @LastEditors:
26+
* @Description: 内部使用,根据当前用户获取授权的资源id
27+
* @param {ICurrentUserType} userInfo
28+
* @return {*}
29+
*/
30+
async getResourcesIdList(userInfo: ICurrentUserType): Promise<number[]> {
31+
const { accountType } = userInfo;
32+
if (accountType == AccountTypeEnum.SUPER_ACCOUNT) {
33+
const resourcesEntity: Pick<ResourcesEntity, 'id'>[] = await this.resourcesRepository.find({
34+
select: ['id'],
35+
});
36+
return resourcesEntity.map((item: Pick<ResourcesEntity, 'id'>) => item.id);
37+
} else {
38+
const query = new Map<string, FindOperator<string>>();
39+
// 1.查询当前用户授权的角色
40+
const accountRoleEntity: Pick<AccountRoleEntity, 'roleId'>[] =
41+
await this.accountRoleRepository.find({
42+
where: { accountId: userInfo.id },
43+
select: ['roleId'],
44+
});
45+
if (!accountRoleEntity.length) {
46+
return [];
47+
}
48+
query.set('roleId', In(accountRoleEntity.map((item) => item.roleId)));
49+
// 2.根据角色查询授权的资源
50+
const roleResourcesEntity: Pick<RoleResourcesEntity, 'resourcesId'>[] =
51+
await this.roleResourcesRepository.find({
52+
where: mapToObj(query),
53+
select: ['resourcesId'],
54+
});
55+
if (!roleResourcesEntity.length) {
56+
return [];
57+
}
58+
return roleResourcesEntity.map((item) => item.resourcesId);
59+
}
60+
}
61+
}

src/api/menus/menus.service.ts

+6-49
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,16 @@ import { StatusEnum } from '@src/enums';
55
import { AccountTypeEnum } from '@src/enums/account.type.enum';
66
import { mapToObj } from '@src/utils';
77
import { FindOperator, In, Repository } from 'typeorm';
8-
import { AccountRoleEntity } from '../accountRole/entities/account.role.entity';
98
import { ResourcesEntity } from '../resources/entities/resources.entity';
10-
import { RoleResourcesEntity } from '../roleResources/entities/role.resources.entity';
9+
import { MenusRepository } from './menus.repository';
1110
import { ApiVo, MenusVo } from './vo/menus.vo';
1211

1312
@Injectable()
1413
export class MenusService {
1514
constructor(
16-
@InjectRepository(AccountRoleEntity)
17-
private readonly accountRoleRepository: Repository<AccountRoleEntity>,
18-
@InjectRepository(RoleResourcesEntity)
19-
private readonly roleResourcesRepository: Repository<RoleResourcesEntity>,
2015
@InjectRepository(ResourcesEntity)
21-
private readonly resourcesRepository: Repository<ResourcesEntity>
16+
private readonly resourcesRepository: Repository<ResourcesEntity>,
17+
private readonly menusRepository: MenusRepository
2218
) {}
2319

2420
/**
@@ -36,7 +32,7 @@ export class MenusService {
3632
query.set('resourcesType', In([0, 1]));
3733
// 如果是不是超级管理员就返回角色下的资源
3834
if (accountType !== AccountTypeEnum.SUPER_ACCOUNT) {
39-
const resourcesIdList = await this.getResourcesIdList(userInfo);
35+
const resourcesIdList = await this.menusRepository.getResourcesIdList(userInfo);
4036
console.log(resourcesIdList, '资源');
4137
query.set('id', In(resourcesIdList));
4238
}
@@ -68,7 +64,7 @@ export class MenusService {
6864
return [];
6965
}
7066
// 获取授权的资源id
71-
const resourcesId = await this.getResourcesIdList(userInfo);
67+
const resourcesId = await this.menusRepository.getResourcesIdList(userInfo);
7268
console.log(resourcesId, '全部资源');
7369
return await this.resourcesRepository.find({
7470
where: {
@@ -91,48 +87,9 @@ export class MenusService {
9187
* @return {*}
9288
*/
9389
async getResourcesList(userInfo: ICurrentUserType): Promise<ResourcesEntity[]> {
94-
const resourcesId = await this.getResourcesIdList(userInfo);
90+
const resourcesId = await this.menusRepository.getResourcesIdList(userInfo);
9591
return await this.resourcesRepository.find({
9692
where: { id: In(resourcesId) },
9793
});
9894
}
99-
/**
100-
* @Author:
101-
* @Date: 2023-05-20 17:08:22
102-
* @LastEditors:
103-
* @Description: 内部使用,根据当前用户获取授权的资源id
104-
* @param {ICurrentUserType} userInfo
105-
* @return {*}
106-
*/
107-
private async getResourcesIdList(userInfo: ICurrentUserType): Promise<number[]> {
108-
const { accountType } = userInfo;
109-
if (accountType == AccountTypeEnum.SUPER_ACCOUNT) {
110-
const resourcesEntity: Pick<ResourcesEntity, 'id'>[] = await this.resourcesRepository.find({
111-
select: ['id'],
112-
});
113-
return resourcesEntity.map((item: Pick<ResourcesEntity, 'id'>) => item.id);
114-
} else {
115-
const query = new Map<string, FindOperator<string>>();
116-
// 1.查询当前用户授权的角色
117-
const accountRoleEntity: Pick<AccountRoleEntity, 'roleId'>[] =
118-
await this.accountRoleRepository.find({
119-
where: { accountId: userInfo.id },
120-
select: ['roleId'],
121-
});
122-
if (!accountRoleEntity.length) {
123-
return [];
124-
}
125-
query.set('roleId', In(accountRoleEntity.map((item) => item.roleId)));
126-
// 2.根据角色查询授权的资源
127-
const roleResourcesEntity: Pick<RoleResourcesEntity, 'resourcesId'>[] =
128-
await this.roleResourcesRepository.find({
129-
where: mapToObj(query),
130-
select: ['resourcesId'],
131-
});
132-
if (!roleResourcesEntity.length) {
133-
return [];
134-
}
135-
return roleResourcesEntity.map((item) => item.resourcesId);
136-
}
137-
}
13895
}

src/api/resources/resources.controller.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Query,
1111
UseGuards,
1212
} from '@nestjs/common';
13+
import { CurrentUser, ICurrentUserType } from '@src/decorators';
1314
import { AuthGuard } from '@src/guard/auth.guard';
1415
import { ResourcesDto } from './dto/resources.dto';
1516
import { QueryResourcesDto } from './dto/resources.query.dto';
@@ -54,8 +55,11 @@ export class ResourcesController {
5455
}
5556

5657
@Get('list')
57-
async getResourcesListApi(@Query('type') type: number): Promise<SimplenessResourceVo[]> {
58-
return await this.resourcesService.getResourcesListApi(type);
58+
async getResourcesListApi(
59+
@Query('type') type: number,
60+
@CurrentUser('userInfo') currentInfo: ICurrentUserType
61+
): Promise<SimplenessResourceVo[]> {
62+
return await this.resourcesService.getResourcesListApi(type, currentInfo);
5963
}
6064

6165
@Get('menus/:id')

src/api/resources/resources.module.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { Module } from '@nestjs/common';
22
import { RouterModule } from '@nestjs/core';
33
import { TypeOrmModule } from '@nestjs/typeorm';
44
import { ADMIN_PREFIX } from '@src/constants';
5+
import { AccountEntity } from '../account/entities/account.entity';
6+
import { AccountRoleEntity } from '../accountRole/entities/account.role.entity';
7+
import { MenusRepository } from '../menus/menus.repository';
8+
import { RoleResourcesEntity } from '../roleResources/entities/role.resources.entity';
59
import { ResourcesEntity } from './entities/resources.entity';
610
import { ResourcesController } from './resources.controller';
711
import { ResourcesService } from './resources.service';
@@ -14,9 +18,14 @@ import { ResourcesService } from './resources.service';
1418
module: ResourcesModule,
1519
},
1620
]),
17-
TypeOrmModule.forFeature([ResourcesEntity]),
21+
TypeOrmModule.forFeature([
22+
ResourcesEntity,
23+
AccountEntity,
24+
RoleResourcesEntity,
25+
AccountRoleEntity,
26+
]),
1827
],
1928
controllers: [ResourcesController],
20-
providers: [ResourcesService],
29+
providers: [ResourcesService, MenusRepository],
2130
})
2231
export class ResourcesModule {}

src/api/resources/resources.service.ts

+15-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { Injectable } from '@nestjs/common';
22
import { InjectRepository } from '@nestjs/typeorm';
3+
import { ICurrentUserType } from '@src/decorators';
34
import { PageEnum, StatusEnum } from '@src/enums';
45
import { mapToObj } from '@src/utils';
56
import { Equal, FindOperator, ILike, In, Repository } from 'typeorm';
7+
import { MenusRepository } from '../menus/menus.repository';
68
import { ResourcesDto } from './dto/resources.dto';
79
import { QueryResourcesDto } from './dto/resources.query.dto';
810
import { ResourcesEntity } from './entities/resources.entity';
@@ -12,7 +14,8 @@ import { ResourcesListVo, ResourcesVo, SimplenessResourceVo } from './vo/resourc
1214
export class ResourcesService {
1315
constructor(
1416
@InjectRepository(ResourcesEntity)
15-
private readonly resourcesRepository: Repository<ResourcesEntity>
17+
private readonly resourcesRepository: Repository<ResourcesEntity>,
18+
private readonly menusRepository: MenusRepository
1619
) {}
1720

1821
/**
@@ -161,15 +164,24 @@ export class ResourcesService {
161164
* @Description: type=0表示菜单,1表示按钮
162165
* @return {*}
163166
*/
164-
async getResourcesListApi(type: number): Promise<SimplenessResourceVo[]> {
167+
async getResourcesListApi(
168+
type: number,
169+
currentInfo: ICurrentUserType
170+
): Promise<SimplenessResourceVo[]> {
171+
console.log(currentInfo, '当前用户');
165172
let resourcesType: any = [];
166173
if (type == 0) {
167174
resourcesType = [0, 1];
168175
} else if (type == 1) {
169176
resourcesType = [0, 1, 2];
170177
}
178+
const resourcesIdList = await this.menusRepository.getResourcesIdList(currentInfo);
171179
return await this.resourcesRepository.find({
172-
where: { resourcesType: In(resourcesType), status: StatusEnum.NORMAL },
180+
where: {
181+
id: In(resourcesIdList),
182+
resourcesType: In(resourcesType),
183+
status: StatusEnum.NORMAL,
184+
},
173185
select: ['id', 'title', 'parentId', 'resourcesType'],
174186
});
175187
}

0 commit comments

Comments
 (0)