Draft
As a 平台管理员 I want 邮箱字段改为非必要输入项 so that 在不需要邮箱的场景下快速完成平台相关操作
''改为undefined.optional().or(z.literal('')).transform(val => val === '' ? undefined : val)前端技术栈:
项目结构:
allin-packages/platform-management-ui [Source: 实际项目结构检查]allin-packages/platform-module [Source: 实际项目结构检查]UI包开发规范:
data-testid属性 [Source: architecture/coding-standards.md#关键检查点]平台管理表单现状:
allin-packages/platform-management-ui/src/components/PlatformManagement.tsx:395-406平台schema现状:
allin-packages/platform-module/src/schemas/platform.schema.ts:53 - contactEmail字段有.email()验证和.optional()allin-packages/platform-module/src/schemas/platform.schema.ts:77 - contactEmail字段有.email()验证和.optional()allin-packages/platform-module/src/entities/platform.entity.ts:47 - contactEmail字段为nullable: true问题分析:
当前schema中contactEmail字段有.optional()和.email()验证,这意味着:
undefined)✅ 符合"非必要输入项"要求关键问题发现: 前端表单默认值设置有问题:
allin-packages/platform-management-ui/src/components/PlatformManagement.tsx:42contactEmail: ''(空字符串)''不是有效的邮箱格式,会导致Zod验证失败undefined技术细节:
.optional()允许undefined,但不允许无效的邮箱格式defaultValues中可以使用undefined,但输入框清空后值是'''',但只有contactEmail需要特殊处理,因为它是可选但需要邮箱验证的字段解决方案选项:
推荐方案:修改schema,使用.or(z.literal(''))允许空字符串,然后转换
contactEmail: z.string().email().max(100).optional()
.or(z.literal('')) // 允许空字符串
.transform(val => val === '' ? undefined : val) // 将空字符串转为undefined
备选方案:前端在提交前将空字符串转换为undefined
简单方案:只修改默认值为undefined,但用户清空输入框后还是''
根据故事需求,推荐使用方案1,因为它:
undefined根据故事"邮箱字段改为非必要输入项"的要求,需要:
undefined''改为undefinedallin-packages/platform-management-ui/src/components/PlatformManagement.tsxallin-packages/platform-module/src/schemas/platform.schema.tsallin-packages/platform-module/src/entities/platform.entity.tscontactEmail字段已经是nullable: true,无需修改数据库结构测试策略:
tests/文件夹与源码并列 [Source: 实际项目结构检查]测试要求:
具体测试场景:
''转换为undefined通过验证undefined通过验证(可选字段)tests/文件夹与源码并列 [Source: 实际项目结构检查]data-testid属性 [Source: architecture/coding-standards.md#关键检查点]allin-packages/platform-management-ui/tests/integration/platform-management.integration.test.tsx| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-10 | 1.0 | 初始故事创建 | Scrum Master Bob |
此部分由开发代理在实施期间填写
此部分由QA代理在审查期间填写