创建角色,去掉各个id的专有DTO,将所有KEY都格式化

main
expressgy 3 months ago
parent f2504b390f
commit 86498a5c94
  1. 2486
      docs/pacAuth_database_0.2.ndm2
  2. 2
      src/application/app.module.ts
  3. 63
      src/application/auth-role/auth-role.controller.ts
  4. 9
      src/application/auth-role/auth-role.module.ts
  5. 208
      src/application/auth-role/auth-role.service.ts
  6. 154
      src/application/auth-role/dto/create-auth-role.dto.ts
  7. 113
      src/application/auth-role/dto/get-auth-role.dto.ts
  8. 4
      src/application/auth-role/dto/update-auth-role.dto.ts
  9. 7
      src/application/core-dict/dto/create-core-dict.dto.ts
  10. 10
      src/application/core-dict/dto/get-core-dict.dto.ts
  11. 1
      src/application/core-env/dto/create-core-env.dto.ts
  12. 5
      src/application/core-env/dto/get-core-env.dto.ts
  13. 2
      src/application/core-menu/core-menu.service.ts
  14. 4
      src/application/core-menu/dto/create-core-menu.dto.ts
  15. 4
      src/application/core-menu/dto/get-core-menu.dto.ts
  16. 4
      src/application/core-service/dto/create-core-service.dto.ts
  17. 5
      src/entities/relations.ts
  18. 56
      src/entities/schema.ts

File diff suppressed because it is too large Load Diff

@ -14,6 +14,7 @@ import { CoreDictModule } from './core-dict/core-dict.module';
import { GlobalModule } from '@app/global.module'; import { GlobalModule } from '@app/global.module';
import { CoreEnvModule } from './core-env/core-env.module'; import { CoreEnvModule } from './core-env/core-env.module';
import { CoreMenuModule } from './core-menu/core-menu.module'; import { CoreMenuModule } from './core-menu/core-menu.module';
import { AuthRoleModule } from './auth-role/auth-role.module';
@Module({ @Module({
imports: [ imports: [
@ -27,6 +28,7 @@ import { CoreMenuModule } from './core-menu/core-menu.module';
CoreDictModule, CoreDictModule,
CoreEnvModule, CoreEnvModule,
CoreMenuModule, CoreMenuModule,
AuthRoleModule,
], ],
controllers: [AppController], controllers: [AppController],
providers: [ providers: [

@ -0,0 +1,63 @@
import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common';
import { AuthRoleService } from './auth-role.service';
import { CreateAuthRoleDto } from './dto/create-auth-role.dto';
import { UpdateAuthRoleDto } from './dto/update-auth-role.dto';
import { ApiOperation, ApiProduces, ApiTags } from '@nestjs/swagger';
import { PacInfo } from '@common/decorator/pac-info/pac-info.decorator';
import { PacInfoType } from '@utils/myType';
import { query } from 'express';
import { GetPacAuthRoleAllDto } from '@app/auth-role/dto/get-auth-role.dto';
@ApiTags('角色服务')
@Controller('authRole')
export class AuthRoleController {
constructor(private readonly authRoleService: AuthRoleService) {}
@ApiOperation({
summary: '添加角色',
description: '增加一个角色,菜单和数据权限',
})
@ApiProduces('application/json')
@Post()
create(@Body() createAuthRoleDto: CreateAuthRoleDto, @PacInfo() pacInfo: PacInfoType) {
return this.authRoleService.create(createAuthRoleDto, pacInfo);
}
@ApiOperation({
summary: '获取角色列表',
description: '查询角色分页或者列表',
})
@ApiProduces('application/json')
@Get()
findAll(@Query() getPacAuthRoleAllDto: GetPacAuthRoleAllDto) {
return this.authRoleService.findAll(getPacAuthRoleAllDto);
}
@ApiOperation({
summary: '获取角色详细信息',
description: '查询角色详细信息,目录菜单列表,数据权限范围',
})
@ApiProduces('application/json')
@Get(':id')
findOne(@Param('id') id: string) {
return this.authRoleService.findOne(+id);
}
@ApiOperation({
summary: '更新角色信息',
description: '更新角色信息',
})
@ApiProduces('application/json')
@Patch(':id')
update(@Param('id') id: string, @Body() updateAuthRoleDto: UpdateAuthRoleDto) {
return this.authRoleService.update(+id, updateAuthRoleDto);
}
@ApiOperation({
summary: '删除目标角色',
description: '删除目标角色信息',
})
@ApiProduces('application/json')
@Delete(':id')
remove(@Param('id') id: string) {
return this.authRoleService.remove(+id);
}
}

@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { AuthRoleService } from './auth-role.service';
import { AuthRoleController } from './auth-role.controller';
@Module({
controllers: [AuthRoleController],
providers: [AuthRoleService],
})
export class AuthRoleModule {}

@ -0,0 +1,208 @@
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { CreateAuthRoleDto } from './dto/create-auth-role.dto';
import { UpdateAuthRoleDto } from './dto/update-auth-role.dto';
import { LoggerService } from '@service/logger/logger.service';
import { MysqlService } from '@common/service/mysql/mysql.service';
import { RedisService } from '@common/service/redis/redis.service';
import { Snowflake } from '@service/snowflake/snowflake.service';
import { ConfigService } from '@nestjs/config';
import { PacInfoType } from '@utils/myType';
import { isTrueEnum } from '@utils/boolean.enum';
import { pacAuthLinkRoleDept, pacAuthLinkRoleMenu, pacAuthRole, pacAuthUser, pacCoreDict } from '@entities/schema';
import { and, eq, isNull, sql } from 'drizzle-orm';
import { GetPacAuthRoleAllDto } from '@app/auth-role/dto/get-auth-role.dto';
@Injectable()
export class AuthRoleService {
// 基本分页信息
private readonly roleBaseType = {};
// 角色详细信息
private readonly roleMoreType = {
roleId: pacAuthRole.roleId,
pid: pacAuthRole.pid,
roleName: pacAuthRole.roleName,
roleKey: pacAuthRole.roleKey,
roleDesc: pacAuthRole.roleDesc,
roleType: pacAuthRole.roleType,
roleTypeName: pacCoreDict.dictName,
roleTypeKey: pacCoreDict.dictKey,
deptScope: pacAuthRole.deptScope,
root: pacAuthRole.root,
orderNum: pacAuthRole.orderNum,
status: pacAuthRole.status,
createby: pacAuthRole.createby,
createName: pacAuthUser.nickname,
createtime: pacAuthRole.createtime,
updateby: pacAuthRole.updateby,
updateName: pacAuthUser.nickname,
updatetime: pacAuthRole.updatetime,
};
// 角色列表/数信息
private readonly roleListType = {
roleId: pacAuthRole.roleId,
pid: pacAuthRole.pid,
roleName: pacAuthRole.roleName,
roleKey: pacAuthRole.roleKey,
roleType: pacAuthRole.roleType,
roleTypeName: pacCoreDict.dictName,
deptScope: pacAuthRole.deptScope,
orderNum: pacAuthRole.orderNum,
};
constructor(
private readonly logger: LoggerService,
private readonly mysqlService: MysqlService,
private readonly redisService: RedisService,
private readonly snowflake: Snowflake,
private readonly config: ConfigService,
) {}
/** Service
* NAME: create
* DESC: 创建角色信息
* DATE: 2024-06-25 15:53:04 -
* */
public async create(createAuthRoleDto: CreateAuthRoleDto, pacInfo: PacInfoType) {
// ! 判断是否是root账户,非root账户无法设置为root
if (this.config.get<number>('masterId') !== pacInfo.userId && isTrueEnum(createAuthRoleDto.root)) {
throw new HttpException('没有权限创建原始角色!', HttpStatus.UNAUTHORIZED);
}
// ! 加目标锁
const lock = await this.redisService.distributedLock('DICT' + createAuthRoleDto.roleKey, createAuthRoleDto.roleKey);
// ? 存在正在进行写入的角色
if (!lock) throw new HttpException('服务繁忙,角色标识重复!', HttpStatus.CONFLICT);
// @ 核心内容
try {
// ! 查重
const result = await this.getRoleForRoleKey(createAuthRoleDto.roleKey);
// ? 是否存在重复的角色
if (result.length > 0) throw new HttpException('角色标识重复!', HttpStatus.CONFLICT);
// ! 添加角色数据
const newRoleResult = await this.addRoleData(createAuthRoleDto, pacInfo.userId).catch((e) => {
this.logger.error(e.message + e.track.toString());
throw new HttpException('角色写入错误!', HttpStatus.INTERNAL_SERVER_ERROR);
});
// ! 增加关联菜单
await this.createMenuLink(newRoleResult.roleId, createAuthRoleDto.menuList, pacInfo.userId).catch((e) => {
this.logger.error(e.message + e.track.toString());
throw new HttpException('添加菜单关系出现错误,角色写入错误!', HttpStatus.INTERNAL_SERVER_ERROR);
});
// ! 增加关联部门
await this.createDeptLink(newRoleResult.roleId, createAuthRoleDto.deptList, pacInfo.userId).catch((e) => {
this.logger.error(e.message + e.track.toString());
throw new HttpException('添加部门数据范围关系出现错误,角色写入错误!', HttpStatus.INTERNAL_SERVER_ERROR);
});
// ! 解锁
lock();
// !更新父节点的子节点数量
await this.haveChildrenSelfIncreasing(createAuthRoleDto.pid);
// ! 返回结果
return newRoleResult;
} catch (e) {
// ! 解锁
lock();
// ! 抛出错误
throw e;
}
}
findAll(getPacAuthRoleAllDto: GetPacAuthRoleAllDto) {
return `This action returns all authRole`;
}
findOne(id: number) {
return `This action returns a #${id} authRole`;
}
update(id: number, updateAuthRoleDto: UpdateAuthRoleDto) {
return `This action updates a #${id} authRole`;
}
remove(id: number) {
return `This action removes a #${id} authRole`;
}
// DB 通过roleKey查找角色信息
private getRoleForRoleKey(key: string) {
return this.mysqlService.db
.select()
.from(pacAuthRole)
.where(and(isNull(pacAuthRole.deleteby), eq(pacAuthRole.roleKey, key)));
}
// DB 添加角色信息
private async addRoleData(createAuthRoleDto: CreateAuthRoleDto, userId) {
// ! 生成雪花id,用于角色主键
const id = await this.snowflake.generate();
// ! 定义写入的角色数据
const newRoleData: typeof pacAuthRole.$inferInsert = {
roleId: id as any,
pid: createAuthRoleDto.pid,
roleName: createAuthRoleDto.roleName,
roleKey: createAuthRoleDto.roleKey,
roleDesc: createAuthRoleDto.roleDesc,
roleType: createAuthRoleDto.roleType,
deptScope: createAuthRoleDto.deptScope,
root: isTrueEnum(createAuthRoleDto.root) ? 1 : 0,
orderNum: createAuthRoleDto.orderNum,
createby: userId,
createtime: sql`now()` as any,
};
const result = await this.mysqlService.db.insert(pacAuthRole).values(newRoleData);
return {
...result[0],
roleId: id.toString(),
};
}
// DB 更新父级子元素数量
private async haveChildrenSelfIncreasing(roleId: string, isAdd = true) {
return this.mysqlService.db
.update(pacAuthRole)
.set({
haveChildren: isAdd ? sql`${pacAuthRole.haveChildren} + 1` : sql`${pacAuthRole.haveChildren} - 1`,
})
.where(eq(pacAuthRole.roleId as any, roleId));
}
// DB 建立菜单角色关联
private async createMenuLink(roleId, menuIdList, userId) {
const newMenuIdList = Array.from(new Set(menuIdList));
await this.mysqlService.db.delete(pacAuthLinkRoleMenu).where(eq(pacAuthLinkRoleMenu.roleId as any, roleId));
await this.mysqlService.db.insert(pacAuthLinkRoleMenu).values(
newMenuIdList.map((i) => ({
roleId,
menuId: i,
createby: userId,
createtime: sql`now()` as any,
})),
);
}
// DB 建立部门角色关联
private async createDeptLink(roleId, deptIdList, userId) {
const newDeptIdList = Array.from(new Set(deptIdList));
await this.mysqlService.db.delete(pacAuthLinkRoleDept).where(eq(pacAuthLinkRoleDept.roleId as any, roleId));
await this.mysqlService.db.insert(pacAuthLinkRoleDept).values(
newDeptIdList.map((i) => ({
roleId,
deptId: i,
createby: userId,
createtime: sql`now()` as any,
})),
);
}
}

@ -0,0 +1,154 @@
import { ApiProperty } from '@nestjs/swagger';
import Trim from '@common/decorator/trim/trim.decorator';
import { ArrayMinSize, IsEnum, IsInt, IsOptional, IsString, Length, Max, MaxLength, Min, MinLength } from 'class-validator';
import { BooleanEnum } from '@utils/boolean.enum';
import ChangeCase, {
CaseType
} from "@common/decorator/change-case/change-case.decorator";
export class CreateAuthRoleDto {
@ApiProperty({
description: '角色父ID',
type: String,
example: '0',
required: false,
minLength: 1,
maxLength: 32,
})
@Trim()
@IsString({ message: '角色关联属性应为字符串格式!' })
@IsOptional()
readonly pid?: string = '0';
@ApiProperty({
description: '角色名称',
type: String,
example: '管理员',
required: true,
minLength: 1,
maxLength: 32,
})
@Trim()
@IsString({ message: '角色名称应为字符串格式!' })
@Length(1, 32, { message: '角色名称长度控制在1到32位之间!' })
readonly roleName: string;
@ApiProperty({
description: '角色标志',
type: String,
example: 'Country',
required: true,
minLength: 1,
maxLength: 32,
})
@Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '角色标志应为字符串格式!' })
@Length(1, 32, { message: '请将角色标志长度控制在1到32位之间!' })
readonly roleKey: string;
@ApiProperty({
description: '角色类型,来自于字典',
type: String,
example: '0',
required: false,
minLength: 19,
maxLength: 19,
})
@Trim()
@IsString({ message: '角色类型格式不正确!' })
@Length(19, 19, { message: '角色类型格式不正确!' })
@IsOptional()
readonly roleType: string;
@ApiProperty({
description: '角色描述',
type: String,
example: '0',
required: false,
minLength: 1,
maxLength: 255,
})
@Trim()
@IsString({ message: '角色描述应为字符串格式!' })
@Length(1, 255, { message: '请将角色描述长度控制在1到255位之间!' })
@IsOptional()
readonly roleDesc?: string;
@ApiProperty({
description: '数据权限范围',
type: Number,
example: 10,
required: false,
minimum: -1000,
maximum: 1000,
})
@IsOptional()
@IsInt({
message: '数据权限范围必须是整数!',
})
@Min(0, {
message: '数据权限范围不能小于0!',
})
@Max(5, {
message: '数据权限范围不能超过5',
})
readonly deptScope?: number = 0;
@ApiProperty({
description: '数据范围组织部门Id列表',
type: [String],
example: ['a'],
required: false,
minItems: 1,
})
@IsString({ each: true, message: '部门id格式错误' })
@ArrayMinSize(1, { message: '至少需要选择一个部门作为数据范围' })
@Length(19, 19, { each: true, message: '部门id格式错误' })
@IsOptional()
readonly deptList?: string[];
@ApiProperty({
description: '菜单列表',
type: [String],
example: ['a'],
required: false,
minItems: 1,
})
@IsString({ each: true, message: '菜单id格式错误' })
@ArrayMinSize(1, { message: '至少需要选择一个菜单作为权限' })
@Length(19, 19, { each: true, message: '菜单id格式错误' })
readonly menuList?: string[];
@ApiProperty({
description: '是否属于PAC',
type: BooleanEnum,
enum: BooleanEnum,
example: false,
required: false,
})
@Trim()
@IsEnum(BooleanEnum, { message: 'root参数格式错误' })
@IsOptional()
readonly root?: BooleanEnum = BooleanEnum.FALSE;
@ApiProperty({
description: '排序',
type: Number,
example: 10,
required: false,
minimum: -1000,
maximum: 1000,
})
@IsOptional()
@IsInt({
message: '排序必须是整数!',
})
@Min(-1000, {
message: '排序不能小于-1000!',
})
@Max(1000, {
message: '排序不能超过1000',
})
readonly orderNum?: number = 0;
}

@ -0,0 +1,113 @@
// | ------------------------------------------------------------
// | @版本: version 0.1
// | @创建人: 【Nie-x7129】
// | @E-mail: x71291@outlook.com
// | @所在项目: pac-auth
// | @文件描述: get-auth-role.dto.ts -
// | @创建时间: 2024-06-25 17:22
// | @更新时间: 2024-06-25 17:22
// | @修改记录:
// | -*-*-*- (时间--修改人--修改说明) -*-*-*-
// | =
// | ------------------------------------------------------------
import { GetDto } from '@dto/get.dto';
import { ApiProperty } from '@nestjs/swagger';
import Trim from '@common/decorator/trim/trim.decorator';
import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator';
import { BooleanEnum } from '@utils/boolean.enum';
import Int from '@common/decorator/int/int.descrator';
import ChangeCase, { CaseType } from '@common/decorator/change-case/change-case.decorator';
export class GetPacAuthRoleAllDto extends GetDto {
@ApiProperty({
description: '角色',
type: String,
example: '管理员',
required: false,
minLength: 1,
maxLength: 128,
})
@Trim()
@IsString({ message: '字典信息应为字符串格式!' })
@Length(0, 128, { message: '请将字典信息长度控制在1到128位之间!' })
@IsOptional()
readonly roleInfo?: string;
@ApiProperty({
description: '角色类型,来自于字典',
type: String,
example: '0',
required: true,
minLength: 19,
maxLength: 19,
})
@Trim()
@IsString({ message: '角色类型格式不正确!' })
@Length(19, 19, { message: '角色类型格式不正确!' })
readonly roleType: string;
@ApiProperty({
description: '是否属于PAC',
type: BooleanEnum,
enum: BooleanEnum,
example: 0,
required: false,
})
@Trim()
@IsEnum(BooleanEnum, { message: 'root参数格式错误' })
@IsOptional()
readonly root: BooleanEnum;
@ApiProperty({
description: '字典状态',
type: Number,
example: 0,
required: false,
minimum: -100,
maximum: 100,
})
@Trim()
@Int()
@IsInt({
message: '字典状态必须是整数!',
})
@Min(-100, {
message: '字典状态需要大于-100!',
})
@Max(100, {
message: '字典状态不能超过100',
})
@IsOptional()
readonly status?: string;
@ApiProperty({
description: '字典层级id',
type: Number,
example: 0,
required: false,
minimum: 0,
maximum: 100,
})
@Trim()
@IsString({ message: '字典层级id应为字符串格式!' })
@Length(1, 20, { message: '字典层级id格式错误!' })
@IsOptional()
readonly hierarchy?: string;
}
export class PacAuthRoleTargetListDto {
@ApiProperty({
description: '是否查找树结构',
type: BooleanEnum,
enum: BooleanEnum,
example: 0,
required: false,
})
@Trim()
@IsEnum(BooleanEnum, {
message: '查找树结构数据错误',
})
@IsOptional()
readonly isTree: BooleanEnum;
}

@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateAuthRoleDto } from './create-auth-role.dto';
export class UpdateAuthRoleDto extends PartialType(CreateAuthRoleDto) {}

@ -2,6 +2,9 @@ import { ApiProperty } from '@nestjs/swagger';
import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator'; import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator';
import Trim from '@common/decorator/trim/trim.decorator'; import Trim from '@common/decorator/trim/trim.decorator';
import { BooleanEnum } from '@utils/boolean.enum'; import { BooleanEnum } from '@utils/boolean.enum';
import ChangeCase, {
CaseType
} from "@common/decorator/change-case/change-case.decorator";
export class CreateCoreDictDto { export class CreateCoreDictDto {
@ApiProperty({ @ApiProperty({
@ -26,6 +29,7 @@ export class CreateCoreDictDto {
maxLength: 32, maxLength: 32,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '字典标志应为字符串格式!' }) @IsString({ message: '字典标志应为字符串格式!' })
@Length(1, 32, { message: '请将字典标志长度控制在1到32位之间!' }) @Length(1, 32, { message: '请将字典标志长度控制在1到32位之间!' })
readonly dictKey: string; readonly dictKey: string;
@ -95,7 +99,7 @@ export class CreateCoreDictDto {
required: false, required: false,
}) })
@Trim() @Trim()
@IsEnum(BooleanEnum, { message: 'ownOfPac参数格式错误' }) @IsEnum(BooleanEnum, { message: 'root参数格式错误' })
@IsOptional() @IsOptional()
readonly root?: BooleanEnum = BooleanEnum.FALSE; readonly root?: BooleanEnum = BooleanEnum.FALSE;
@ -128,6 +132,7 @@ export class CreateCoreDictDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -17,6 +17,7 @@ import Trim from '@common/decorator/trim/trim.decorator';
import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator'; import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator';
import { BooleanEnum } from '@utils/boolean.enum'; import { BooleanEnum } from '@utils/boolean.enum';
import Int from '@common/decorator/int/int.descrator'; import Int from '@common/decorator/int/int.descrator';
import ChangeCase, { CaseType } from '@common/decorator/change-case/change-case.decorator';
export class GetPacCoreDictAllDto extends GetDto { export class GetPacCoreDictAllDto extends GetDto {
@ApiProperty({ @ApiProperty({
@ -33,13 +34,17 @@ export class GetPacCoreDictAllDto extends GetDto {
@IsOptional() @IsOptional()
readonly dictInfo?: string; readonly dictInfo?: string;
@ApiProperty({ @ApiProperty({
description: '字典类型', description: '字典类型',
type: String, type: String,
example: 0, example: '0',
required: false, required: false,
minLength: 19,
maxLength: 19,
}) })
@Trim() @Trim()
@Length(19, 19, { message: '字典类型格式不正确!' })
@IsString({ message: '字典类型应为字符串格式!' }) @IsString({ message: '字典类型应为字符串格式!' })
@IsOptional() @IsOptional()
readonly dictType?: string; readonly dictType?: string;
@ -52,7 +57,7 @@ export class GetPacCoreDictAllDto extends GetDto {
required: false, required: false,
}) })
@Trim() @Trim()
@IsEnum(BooleanEnum, { message: 'ownOfPac参数格式错误' }) @IsEnum(BooleanEnum, { message: 'root参数格式错误' })
@IsOptional() @IsOptional()
readonly root: BooleanEnum; readonly root: BooleanEnum;
@ -65,6 +70,7 @@ export class GetPacCoreDictAllDto extends GetDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -125,6 +125,7 @@ export class CreateCoreEnvDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -43,9 +43,9 @@ export class GetCoreEnvDTO extends GetDto {
required: false, required: false,
}) })
@Trim() @Trim()
@IsEnum(BooleanEnum, { message: 'ownOfPac参数格式错误' }) @IsEnum(BooleanEnum, { message: 'root参数格式错误' })
@IsOptional() @IsOptional()
readonly ownOfPac: BooleanEnum; readonly root: BooleanEnum;
@ApiProperty({ @ApiProperty({
description: '服务的唯一标识', description: '服务的唯一标识',
@ -56,6 +56,7 @@ export class GetCoreEnvDTO extends GetDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -178,7 +178,7 @@ export class CoreMenuService {
.where(eq(pacCoreMenu.menuId as any, menuId)); .where(eq(pacCoreMenu.menuId as any, menuId));
} }
// 查菜单数据 // DB 查菜单数据
private getMenuData(data: GetPacCoreMenuAllDto, pacInfo: PacInfoType, selectData = undefined) { private getMenuData(data: GetPacCoreMenuAllDto, pacInfo: PacInfoType, selectData = undefined) {
// ! 定义基础查询函数 // ! 定义基础查询函数
// 启用动态查询模式 $dynamic // 启用动态查询模式 $dynamic

@ -2,6 +2,9 @@ import { ApiProperty } from '@nestjs/swagger';
import Trim from '@common/decorator/trim/trim.decorator'; import Trim from '@common/decorator/trim/trim.decorator';
import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator'; import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator';
import { BooleanEnum } from '@utils/boolean.enum'; import { BooleanEnum } from '@utils/boolean.enum';
import ChangeCase, {
CaseType
} from "@common/decorator/change-case/change-case.decorator";
export class CreateCoreMenuDto { export class CreateCoreMenuDto {
@ApiProperty({ @ApiProperty({
@ -178,6 +181,7 @@ export class CreateCoreMenuDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -17,6 +17,9 @@ import Trim from '@common/decorator/trim/trim.decorator';
import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator'; import { IsEnum, IsInt, IsOptional, IsString, Length, Max, Min } from 'class-validator';
import { BooleanEnum } from '@utils/boolean.enum'; import { BooleanEnum } from '@utils/boolean.enum';
import Int from '@common/decorator/int/int.descrator'; import Int from '@common/decorator/int/int.descrator';
import ChangeCase, {
CaseType
} from "@common/decorator/change-case/change-case.decorator";
export class GetPacCoreMenuAllDto extends GetDto { export class GetPacCoreMenuAllDto extends GetDto {
@ApiProperty({ @ApiProperty({
@ -56,6 +59,7 @@ export class GetPacCoreMenuAllDto extends GetDto {
maxLength: 16, maxLength: 16,
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
@IsOptional() @IsOptional()

@ -1,6 +1,9 @@
import { IsOptional, IsString, Length } from 'class-validator'; import { IsOptional, IsString, Length } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
import Trim from '@common/decorator/trim/trim.decorator'; import Trim from '@common/decorator/trim/trim.decorator';
import ChangeCase, {
CaseType
} from "@common/decorator/change-case/change-case.decorator";
export class CreateCoreServiceDto { export class CreateCoreServiceDto {
@ApiProperty({ @ApiProperty({
@ -17,6 +20,7 @@ export class CreateCoreServiceDto {
// minItems: 1, // 数组属性的最小项目数 // minItems: 1, // 数组属性的最小项目数
}) })
@Trim() @Trim()
@ChangeCase(CaseType.constant)
@IsString({ message: '服务标识应为字符串格式!' }) @IsString({ message: '服务标识应为字符串格式!' })
@Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' }) @Length(2, 16, { message: '请将服务标识长度控制在2到16位之间!' })
readonly serviceKey: string; readonly serviceKey: string;

@ -1,2 +1,3 @@
import { relations } from 'drizzle-orm/relations'; import { relations } from "drizzle-orm/relations";
import {} from './schema'; import { } from "./schema";

@ -1,5 +1,6 @@
import { mysqlTable, mysqlSchema, AnyMySqlColumn, primaryKey, unique, int, varchar, datetime } from 'drizzle-orm/mysql-core'; import { mysqlTable, mysqlSchema, AnyMySqlColumn, primaryKey, unique, int, varchar, datetime } from 'drizzle-orm/mysql-core';
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { bigintString } from '@entities/customType'; import { bigintString } from '@entities/customType';
const bigint = bigintString; const bigint = bigintString;
export const pacAuthDept = mysqlTable( export const pacAuthDept = mysqlTable(
@ -35,19 +36,13 @@ export const pacAuthLinkRoleDept = mysqlTable(
'pac_auth_link_role_dept', 'pac_auth_link_role_dept',
{ {
index: int('index').autoincrement().notNull(), index: int('index').autoincrement().notNull(),
roleId: int('role_id').notNull(), roleId: bigint('role_id', { mode: 'number' }).notNull(),
deptId: int('dept_id').notNull(), deptId: bigint('dept_id', { mode: 'number' }).notNull(),
scopeId: int('scope_id').notNull(), createby: bigint('createby', { mode: 'number' }).notNull(),
createby: int('createby').notNull(),
createtime: datetime('createtime', { mode: 'string' }).notNull(), createtime: datetime('createtime', { mode: 'string' }).notNull(),
updateby: int('updateby'),
updatetime: datetime('updatetime', { mode: 'string' }),
deleteby: int('deleteby'),
deletetime: datetime('deletetime', { mode: 'string' }),
}, },
(table) => { (table) => {
return { return {
pacAuthLinkRoleDeptScopeId: primaryKey({ columns: [table.scopeId], name: 'pac_auth_link_role_dept_scope_id' }),
pacIndex: unique('pac_index').on(table.index), pacIndex: unique('pac_index').on(table.index),
}; };
}, },
@ -57,14 +52,10 @@ export const pacAuthLinkRoleMenu = mysqlTable(
'pac_auth_link_role_menu', 'pac_auth_link_role_menu',
{ {
index: int('index').autoincrement().notNull(), index: int('index').autoincrement().notNull(),
roleId: int('role_id').notNull(), roleId: bigint('role_id', { mode: 'number' }).notNull(),
menuId: int('menu_id').notNull(), menuId: bigint('menu_id', { mode: 'number' }).notNull(),
createby: int('createby').notNull(), createby: bigint('createby', { mode: 'number' }).notNull(),
createtime: datetime('createtime', { mode: 'string' }).notNull(), createtime: datetime('createtime', { mode: 'string' }).notNull(),
updateby: int('updateby'),
updatetime: datetime('updatetime', { mode: 'string' }),
deleteby: int('deleteby'),
deletetime: datetime('deletetime', { mode: 'string' }),
}, },
(table) => { (table) => {
return { return {
@ -78,14 +69,10 @@ export const pacAuthLinkUserDept = mysqlTable(
'pac_auth_link_user_dept', 'pac_auth_link_user_dept',
{ {
index: int('index').autoincrement().notNull(), index: int('index').autoincrement().notNull(),
userId: int('user_id').notNull(), userId: bigint('user_id', { mode: 'number' }).notNull(),
deptId: int('dept_id').notNull(), deptId: bigint('dept_id', { mode: 'number' }).notNull(),
createby: int('createby').notNull(), createby: bigint('createby', { mode: 'number' }).notNull(),
createtime: datetime('createtime', { mode: 'string' }).notNull(), createtime: datetime('createtime', { mode: 'string' }).notNull(),
updateby: int('updateby'),
updatetime: datetime('updatetime', { mode: 'string' }),
deleteby: int('deleteby'),
deletetime: datetime('deletetime', { mode: 'string' }),
}, },
(table) => { (table) => {
return { return {
@ -99,14 +86,10 @@ export const pacAuthLinkUserPost = mysqlTable(
'pac_auth_link_user_post', 'pac_auth_link_user_post',
{ {
index: int('index').autoincrement().notNull(), index: int('index').autoincrement().notNull(),
userId: int('user_id').notNull(), userId: bigint('user_id', { mode: 'number' }).notNull(),
postId: int('post_id').notNull(), postId: bigint('post_id', { mode: 'number' }).notNull(),
createby: int('createby').notNull(), createby: bigint('createby', { mode: 'number' }).notNull(),
createtime: datetime('createtime', { mode: 'string' }).notNull(), createtime: datetime('createtime', { mode: 'string' }).notNull(),
updateby: int('updateby'),
updatetime: datetime('updatetime', { mode: 'string' }),
deleteby: int('deleteby'),
deletetime: datetime('deletetime', { mode: 'string' }),
}, },
(table) => { (table) => {
return { return {
@ -120,14 +103,10 @@ export const pacAuthLinkUserRole = mysqlTable(
'pac_auth_link_user_role', 'pac_auth_link_user_role',
{ {
index: int('index').autoincrement().notNull(), index: int('index').autoincrement().notNull(),
userId: int('user_id').notNull(), userId: bigint('user_id', { mode: 'number' }).notNull(),
roleId: int('role_id').notNull(), roleId: bigint('role_id', { mode: 'number' }).notNull(),
createby: int('createby').notNull(), createby: bigint('createby', { mode: 'number' }).notNull(),
createtime: datetime('createtime', { mode: 'string' }).notNull(), createtime: datetime('createtime', { mode: 'string' }).notNull(),
updateby: int('updateby'),
updatetime: datetime('updatetime', { mode: 'string' }),
deleteby: int('deleteby'),
deletetime: datetime('deletetime', { mode: 'string' }),
}, },
(table) => { (table) => {
return { return {
@ -165,7 +144,7 @@ export const pacAuthPost = mysqlTable(
export const pacAuthRole = mysqlTable( export const pacAuthRole = mysqlTable(
'pac_auth_role', 'pac_auth_role',
{ {
index: int('index').notNull(), index: int('index').autoincrement().notNull(),
roleId: bigint('role_id', { mode: 'number' }).notNull(), roleId: bigint('role_id', { mode: 'number' }).notNull(),
pid: bigint('pid', { mode: 'number' }).notNull(), pid: bigint('pid', { mode: 'number' }).notNull(),
roleName: varchar('role_name', { length: 255 }).notNull(), roleName: varchar('role_name', { length: 255 }).notNull(),
@ -173,6 +152,7 @@ export const pacAuthRole = mysqlTable(
roleDesc: varchar('role_desc', { length: 255 }), roleDesc: varchar('role_desc', { length: 255 }),
roleType: bigint('role_type', { mode: 'number' }).notNull(), roleType: bigint('role_type', { mode: 'number' }).notNull(),
deptScope: int('dept_scope').default(1).notNull(), deptScope: int('dept_scope').default(1).notNull(),
haveChildren: int('have_children').default(0).notNull(),
root: int('root').default(0).notNull(), root: int('root').default(0).notNull(),
orderNum: int('order_num').default(0).notNull(), orderNum: int('order_num').default(0).notNull(),
status: int('status').default(0).notNull(), status: int('status').default(0).notNull(),

Loading…
Cancel
Save