/** * @file 权限模块Schema定义 * @author AI Assistant * @date 2024-12-19 * @lastEditor AI Assistant * @lastEditTime 2025-01-07 * @description 定义权限模块的Schema,包括新增权限、删除权限、修改权限、查看权限树等 */ import { t, type Static } from 'elysia'; /** * 新增权限请求参数Schema * @description 新增权限的请求参数验证规则 */ export const CreatePermissionSchema = t.Object({ /** 权限标识,全局唯一 */ permissionKey: t .Transform( t.String({ minLength: 1, maxLength: 100, pattern: '^[a-zA-Z0-9_]+$', description: '权限标识,全局唯一,只允许字母数字下划线,自动转换为小写并去除两端空格', examples: ['user:create', 'user:read', 'user:update', 'user:delete'], }), ) .Decode((value: string) => value.trim().toLowerCase()) .Encode((value: string) => value), /** 权限名称 */ name: t .Transform( t.String({ minLength: 1, maxLength: 50, description: '权限名称,同级下唯一,自动去除两端空格', examples: ['创建用户', '查看用户', '修改用户', '删除用户'], }), ) .Decode((value: string) => value.trim()) .Encode((value: string) => value), /** 权限描述 */ description: t.Optional( t.Transform( t.String({ maxLength: 255, description: '权限描述,自动去除两端空格', examples: ['创建新用户的权限', '查看用户信息的权限'], }), ) .Decode((value: string) => value.trim()) .Encode((value: string) => value), ), /** 权限类型(1=菜单 2=按钮 3=接口 4=数据) */ type: t.Union([ t.Literal(1), t.Literal(2), t.Literal(3), t.Literal(4), t.Literal('1'), t.Literal('2'), t.Literal('3'), t.Literal('4'), ], { description: '权限类型:1=菜单,2=按钮,3=接口,4=数据', examples: [1, 2, 3, 4], }), /** 接口路径标识 */ apiPathKey: t.Optional( t.Transform( t.String({ maxLength: 200, description: '接口路径标识,type为3(接口)时建议填写,自动去除两端空格', examples: ['/api/user', '/api/user/create', 'POST:/api/user'], }), ) .Decode((value: string) => value.trim()) .Encode((value: string) => value), ), /** 前端路由标识 */ pagePathKey: t.Optional( t.Transform( t.String({ maxLength: 200, description: '前端路由标识,type为1(菜单)时建议填写,自动去除两端空格', examples: ['/user', '/user/list', '/user/detail'], }), ) .Decode((value: string) => value.trim()) .Encode((value: string) => value), ), /** 所属模块 */ module: t .Transform( t.String({ minLength: 1, maxLength: 30, pattern: '^[a-zA-Z0-9_]+$', description: '所属模块,只允许字母数字下划线,自动转换为小写并去除两端空格', examples: ['user', 'role', 'permission', 'system'], }), ) .Decode((value: string) => value.trim().toLowerCase()) .Encode((value: string) => value), /** 父权限ID,0表示顶级 */ pid: t.Optional( t.Union([ t.Literal('0'), t.String({ pattern: '^[1-9]\\d*$', description: '父权限ID,Bigint字符串形式', }), ], { description: '父权限ID,0表示顶级权限', examples: ['0', '1', '2'], default: '0', }), ), /** 排序值 */ sort: t.Optional( t.String({ maxLength: 20, description: '排序值,同级内排序使用', examples: ['0','1', '10', '100'], }) ), /** 图标标识 */ icon: t.Optional( t.Transform( t.String({ maxLength: 100, description: '图标标识,CSS类名或图标路径,自动去除两端空格', examples: ['icon-user', 'icon-add', '/icons/user.png'], }), ) .Decode((value: string) => value.trim()) .Encode((value: string) => value), ), /** 状态(1=启用, 0=禁用) */ status: t.Optional( t.Union([ t.Literal(1), t.Literal(0), t.Literal('1'), t.Literal('0'), ], { description: '权限状态:1=启用,0=禁用', examples: [1, 0], default: 1, }), ), }); /** 新增权限请求参数类型 */ export type CreatePermissionRequest = Static; /** * 删除权限接口参数Schema * @description 校验DELETE /api/permission/:id 路径参数 */ export const DeletePermissionParamsSchema = t.Object({ id: t.String({ pattern: '^[1-9]\\d*$', description: '权限ID,bigint字符串,必须为正整数', examples: ['1', '100', '123456789'], }), }); /** 删除权限参数类型 */ export type DeletePermissionParams = Static; /** * 权限类型枚举 */ export const PermissionType = { MENU: 1, // 菜单 BUTTON: 2, // 按钮 API: 3, // 接口 DATA: 4, // 数据 } as const; /** * 权限状态枚举 */ export const PermissionStatus = { ENABLED: 1, // 启用 DISABLED: 0, // 禁用 } as const;