146 lines
3.7 KiB
TypeScript
146 lines
3.7 KiB
TypeScript
|
|
/**
|
||
|
|
* 用户相关的 Valibot 验证模式
|
||
|
|
* User-related Valibot validation schemas
|
||
|
|
*/
|
||
|
|
|
||
|
|
import * as v from 'valibot'
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 基础用户验证模式
|
||
|
|
* Base user validation schema
|
||
|
|
*/
|
||
|
|
export const BaseUserSchema = v.object({
|
||
|
|
name: v.pipe(
|
||
|
|
v.string('姓名必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.minLength(2, '姓名至少需要2个字符'),
|
||
|
|
v.maxLength(50, '姓名不能超过50个字符'),
|
||
|
|
v.nonEmpty('姓名不能为空')
|
||
|
|
),
|
||
|
|
email: v.pipe(
|
||
|
|
v.string('邮箱必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.email('请输入有效的邮箱地址'),
|
||
|
|
v.maxLength(100, '邮箱不能超过100个字符')
|
||
|
|
),
|
||
|
|
age: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.number('年龄必须是数字'),
|
||
|
|
v.integer('年龄必须是整数'),
|
||
|
|
v.minValue(1, '年龄不能小于1岁'),
|
||
|
|
v.maxValue(150, '年龄不能超过150岁')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
})
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 创建用户验证模式
|
||
|
|
* Create user validation schema
|
||
|
|
*/
|
||
|
|
export const CreateUserSchema = BaseUserSchema
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新用户验证模式 - 所有字段都是可选的
|
||
|
|
* Update user validation schema - all fields are optional
|
||
|
|
*/
|
||
|
|
export const UpdateUserSchema = v.object({
|
||
|
|
name: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.string('姓名必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.minLength(2, '姓名至少需要2个字符'),
|
||
|
|
v.maxLength(50, '姓名不能超过50个字符'),
|
||
|
|
v.nonEmpty('姓名不能为空')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
email: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.string('邮箱必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.email('请输入有效的邮箱地址'),
|
||
|
|
v.maxLength(100, '邮箱不能超过100个字符')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
age: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.number('年龄必须是数字'),
|
||
|
|
v.integer('年龄必须是整数'),
|
||
|
|
v.minValue(1, '年龄不能小于1岁'),
|
||
|
|
v.maxValue(150, '年龄不能超过150岁')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
})
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 用户查询参数验证模式
|
||
|
|
* User query parameters validation schema
|
||
|
|
*/
|
||
|
|
export const UserQuerySchema = v.object({
|
||
|
|
page: v.optional(
|
||
|
|
v.pipe(v.number('页码必须是数字'), v.integer('页码必须是整数'), v.minValue(1, '页码不能小于1')),
|
||
|
|
1
|
||
|
|
),
|
||
|
|
limit: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.number('每页数量必须是数字'),
|
||
|
|
v.integer('每页数量必须是整数'),
|
||
|
|
v.minValue(1, '每页数量不能小于1'),
|
||
|
|
v.maxValue(100, '每页数量不能超过100')
|
||
|
|
),
|
||
|
|
10
|
||
|
|
),
|
||
|
|
search: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.string('搜索关键词必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.maxLength(100, '搜索关键词不能超过100个字符')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
minAge: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.number('最小年龄必须是数字'),
|
||
|
|
v.integer('最小年龄必须是整数'),
|
||
|
|
v.minValue(1, '最小年龄不能小于1岁')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
maxAge: v.optional(
|
||
|
|
v.pipe(
|
||
|
|
v.number('最大年龄必须是数字'),
|
||
|
|
v.integer('最大年龄必须是整数'),
|
||
|
|
v.maxValue(150, '最大年龄不能超过150岁')
|
||
|
|
)
|
||
|
|
),
|
||
|
|
})
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 邮箱查询验证模式
|
||
|
|
* Email query validation schema
|
||
|
|
*/
|
||
|
|
export const EmailQuerySchema = v.object({
|
||
|
|
email: v.pipe(
|
||
|
|
v.string('邮箱必须是字符串'),
|
||
|
|
v.trim(),
|
||
|
|
v.email('请输入有效的邮箱地址'),
|
||
|
|
v.nonEmpty('邮箱不能为空')
|
||
|
|
),
|
||
|
|
})
|
||
|
|
|
||
|
|
/**
|
||
|
|
* ID 参数验证模式
|
||
|
|
* ID parameter validation schema
|
||
|
|
*/
|
||
|
|
export const UserIdSchema = v.object({
|
||
|
|
id: v.pipe(
|
||
|
|
v.number('用户ID必须是数字'),
|
||
|
|
v.integer('用户ID必须是整数'),
|
||
|
|
v.minValue(1, '用户ID必须大于0')
|
||
|
|
),
|
||
|
|
})
|
||
|
|
|
||
|
|
// 导出类型推断
|
||
|
|
export type CreateUserInput = v.InferInput<typeof CreateUserSchema>
|
||
|
|
export type UpdateUserInput = v.InferInput<typeof UpdateUserSchema>
|
||
|
|
export type UserQueryParams = v.InferInput<typeof UserQuerySchema>
|
||
|
|
export type EmailQuery = v.InferInput<typeof EmailQuerySchema>
|
||
|
|
export type UserIdParams = v.InferInput<typeof UserIdSchema>
|