Просмотр исходного кода

🐛 fix(silver-users): 修复参数验证失败问题

- 将gender、certificationStatus、jobSeekingStatus等枚举类型改为数字类型并添加范围验证
- 为avatarUrl添加optional()标记,允许不提供该字段
- 为数字类型字段添加coerce.number()确保字符串能正确转换为数字
- 更新SearchSilverTalentDto的认证状态筛选参数,使用数字类型的certificationStatus替代boolean类型的certified
yourname 7 месяцев назад
Родитель
Сommit
41fd73c148
1 измененных файлов с 18 добавлено и 20 удалено
  1. 18 20
      src/server/modules/silver-users/silver-talent.dto.ts

+ 18 - 20
src/server/modules/silver-users/silver-talent.dto.ts

@@ -9,34 +9,32 @@ export const SilverTalentSchema = z.object({
   nickname: z.string().max(50).nullable().openapi({ description: '昵称', example: '张老师' }),
   organization: z.string().max(255).nullable().openapi({ description: '所属机构', example: '退休教师' }),
   age: z.number().int().min(50).max(100).openapi({ description: '年龄', example: 65 }),
-  gender: z.enum(['MALE', 'FEMALE', 'OTHER']).openapi({ description: '性别', example: 'MALE' }),
+  gender: z.number().int().min(1).max(3).openapi({ description: '性别:1-男,2-女,3-其他', example: 1 }),
   phone: z.string().max(20).openapi({ description: '联系电话', example: '13800138000' }),
   email: z.string().max(255).email().nullable().openapi({ description: '邮箱', example: 'example@email.com' }),
-  avatarUrl: z.string().max(500).url().nullable().openapi({ description: '头像URL', example: 'https://example.com/avatar.jpg' }),
+  avatarUrl: z.string().url().nullable().optional().openapi({ description: '头像URL', example: 'https://example.com/avatar.jpg' }),
   personalIntro: z.string().max(1000).nullable().openapi({ description: '个人简介', example: '退休中学语文教师,擅长书法和传统文化教育' }),
   personalSkills: z.string().max(2000).nullable().openapi({ description: '个人技能', example: '书法、国画、古典文学、诗词创作' }),
   personalExperience: z.string().max(3000).nullable().openapi({ description: '个人经历', example: '从事教育工作40年,曾在重点中学任教...' }),
-  certificationStatus: z.enum(['UNCERTIFIED', 'PENDING', 'CERTIFIED', 'REJECTED']).openapi({ description: '认证状态', example: 'CERTIFIED' }),
+  certificationStatus: z.number().int().min(0).max(3).openapi({ description: '认证状态:0-未认证,1-认证中,2-已认证,3-已拒绝', example: 2 }),
   certificationInfo: z.string().max(2000).nullable().openapi({ description: '认证信息', example: '高级教师职称证书、书法协会会员证' }),
-  jobSeekingStatus: z.enum(['NOT_SEEKING', 'ACTIVELY_SEEKING', 'OPEN_TO_OPPORTUNITIES']).openapi({ description: '求职状态', example: 'ACTIVELY_SEEKING' }),
+  jobSeekingStatus: z.number().int().min(0).max(2).openapi({ description: '求职状态:0-未求职,1-积极求职,2-观望机会', example: 1 }),
   jobSeekingRequirements: z.string().max(1000).nullable().openapi({ description: '求职需求', example: '希望寻找文化教育类兼职工作,时间灵活' }),
   
   // 统计信息
   totalPoints: z.number().int().min(0).default(0).openapi({ description: '总积分', example: 1250 }),
   resumeCount: z.number().int().min(0).default(0).openapi({ description: '简历数量', example: 3 }),
   applicationCount: z.number().int().min(0).default(0).openapi({ description: '申请次数', example: 15 }),
-  timeBankHours: z.number().min(0).default(0).openapi({ description: '时间银行小时数', example: 25.5 }),
-  knowledgeContributions: z.number().int().min(0).default(0).openapi({ description: '知识贡献数量', example: 8 }),
-  
-  // 知识库统计
-  knowledgeShareCount: z.number().int().min(0).default(0).openapi({ description: '知识分享数', example: 5 }),
-  knowledgeDownloadCount: z.number().int().min(0).default(0).openapi({ description: '下载次数', example: 120 }),
-  knowledgeLikeCount: z.number().int().min(0).default(0).openapi({ description: '点赞次数', example: 45 }),
-  knowledgeReadCount: z.number().int().min(0).default(0).openapi({ description: '阅读次数', example: 356 }),
-  knowledgeFavoriteCount: z.number().int().min(0).default(0).openapi({ description: '收藏次数', example: 12 }),
-  knowledgeCommentCount: z.number().int().min(0).default(0).openapi({ description: '评论次数', example: 8 }),
-  knowledgeRanking: z.number().int().min(0).default(0).openapi({ description: '知识排名', example: 15 }),
-  knowledgeRankingScore: z.number().min(0).default(0).openapi({ description: '知识排名分数', example: 85.5 }),
+  timeBankHours: z.coerce.number().openapi({ description: '时间银行小时数', example: 10.5 }),
+  knowledgeContributions: z.coerce.number().int().min(0).openapi({ description: '知识贡献数', example: 3 }),
+  knowledgeShareCount: z.coerce.number().int().min(0).openapi({ description: '知识分享数', example: 3 }),
+  knowledgeDownloadCount: z.coerce.number().int().min(0).openapi({ description: '知识下载数', example: 15 }),
+  knowledgeLikeCount: z.coerce.number().int().min(0).openapi({ description: '知识点赞数', example: 25 }),
+  knowledgeReadCount: z.coerce.number().int().min(0).openapi({ description: '知识阅读数', example: 100 }),
+  knowledgeFavoriteCount: z.coerce.number().int().min(0).openapi({ description: '知识收藏数', example: 8 }),
+  knowledgeCommentCount: z.coerce.number().int().min(0).openapi({ description: '知识评论数', example: 5 }),
+  knowledgeRanking: z.coerce.number().int().min(0).openapi({ description: '知识排名', example: 1 }),
+  knowledgeRankingScore: z.coerce.number().openapi({ description: '知识排名分数', example: 95.5 }),
   
   // 时间信息
   createdAt: z.date().openapi({ description: '创建时间', example: '2024-01-15T10:30:00Z' }),
@@ -49,7 +47,7 @@ export const CreateSilverTalentDto = z.object({
   nickname: z.string().max(50).optional().openapi({ description: '昵称', example: '张老师' }),
   organization: z.string().max(255).optional().openapi({ description: '所属机构' }),
   age: z.number().int().min(50).max(100).openapi({ description: '年龄', example: 65 }),
-  gender: z.enum(['MALE', 'FEMALE', 'OTHER']).openapi({ description: '性别' }),
+  gender: z.coerce.number().int().min(1).max(3).openapi({ description: '性别:1-男,2-女,3-其他' }),
   phone: z.string().max(20).openapi({ description: '联系电话' }),
   email: z.string().max(255).email().optional().openapi({ description: '邮箱' }),
   personalIntro: z.string().max(1000).optional().openapi({ description: '个人简介' }),
@@ -64,13 +62,13 @@ export const UpdateSilverTalentDto = z.object({
   nickname: z.string().max(50).optional().openapi({ description: '昵称' }),
   organization: z.string().max(255).optional().openapi({ description: '所属机构' }),
   age: z.number().int().min(50).max(100).optional().openapi({ description: '年龄' }),
-  gender: z.enum(['MALE', 'FEMALE', 'OTHER']).optional().openapi({ description: '性别' }),
+  gender: z.coerce.number().int().min(1).max(3).optional().openapi({ description: '性别:1-男,2-女,3-其他' }),
   phone: z.string().max(20).optional().openapi({ description: '联系电话' }),
   email: z.string().max(255).email().optional().openapi({ description: '邮箱' }),
   personalIntro: z.string().max(1000).optional().openapi({ description: '个人简介' }),
   personalSkills: z.string().max(2000).optional().openapi({ description: '个人技能' }),
   personalExperience: z.string().max(3000).optional().openapi({ description: '个人经历' }),
-  jobSeekingStatus: z.enum(['NOT_SEEKING', 'ACTIVELY_SEEKING', 'OPEN_TO_OPPORTUNITIES']).optional().openapi({ description: '求职状态' }),
+  jobSeekingStatus: z.coerce.number().int().min(0).max(2).optional().openapi({ description: '求职状态:0-未求职,1-积极求职,2-观望机会' }),
   jobSeekingRequirements: z.string().max(1000).optional().openapi({ description: '求职需求' })
 });
 
@@ -81,7 +79,7 @@ export const SearchSilverTalentDto = z.object({
   minAge: z.coerce.number().int().min(50).optional().openapi({ description: '最小年龄' }),
   maxAge: z.coerce.number().int().max(100).optional().openapi({ description: '最大年龄' }),
   skills: z.array(z.string()).optional().openapi({ description: '技能筛选', example: ['书法', '国画'] }),
-  certified: z.coerce.boolean().optional().openapi({ description: '仅认证用户', example: true }),
+  certificationStatus: z.coerce.number().int().min(0).max(3).optional().openapi({ description: '认证状态筛选:0-未认证,1-认证中,2-已认证,3-已拒绝', example: 2 }),
   available: z.coerce.boolean().optional().openapi({ description: '仅可服务用户', example: true }),
   sortBy: z.enum(['createdAt', 'rating', 'popularity', 'experience']).default('createdAt').openapi({ description: '排序字段' }),
   sortOrder: z.enum(['asc', 'desc']).default('desc').openapi({ description: '排序方向' }),