You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

68 lines
1.8 KiB

/**
* 用户相关的 Zod 验证 Schema
*/
import { z } from 'zod';
/**
* 用户信息 Schema
*/
export const userSchema = z.object({
id: z.string(),
username: z.string(),
email: z.string().email(),
avatar: z.string().url().optional(),
nickname: z.string().optional(),
phone: z.string().optional(),
createdAt: z.string().optional(),
});
/**
* 更新用户资料 Schema
*/
export const updateProfileSchema = z.object({
nickname: z.string().min(2, '昵称至少2个字符').max(20, '昵称最多20个字符').optional(),
avatar: z.string().url('请输入有效的头像URL').optional(),
phone: z
.string()
.regex(/^1[3-9]\d{9}$/, '请输入有效的手机号')
.optional()
.or(z.literal('')),
bio: z.string().max(200, '个人简介最多200个字符').optional(),
});
/**
* 绑定手机号 Schema
*/
export const bindPhoneSchema = z.object({
phone: z
.string()
.min(11, '请输入11位手机号')
.max(11, '请输入11位手机号')
.regex(/^1[3-9]\d{9}$/, '请输入有效的手机号'),
code: z
.string()
.min(6, '验证码为6位')
.max(6, '验证码为6位')
.regex(/^\d{6}$/, '验证码必须是6位数字'),
});
/**
* 绑定邮箱 Schema
*/
export const bindEmailSchema = z.object({
email: z.string().min(1, '请输入邮箱').email('请输入有效的邮箱地址'),
code: z
.string()
.min(6, '验证码为6位')
.max(6, '验证码为6位')
.regex(/^\d{6}$/, '验证码必须是6位数字'),
});
/**
* TypeScript 类型推断
*/
export type User = z.infer<typeof userSchema>;
export type UpdateProfileFormData = z.infer<typeof updateProfileSchema>;
export type BindPhoneFormData = z.infer<typeof bindPhoneSchema>;
export type BindEmailFormData = z.infer<typeof bindEmailSchema>;