009.005.basic-info-optimization.story.md 6.3 KB

Story 009.005: 基本信息优化

Status

Draft

Story

As a 残疾人信息管理员 I want 在基本信息中增加"具体残疾部位和情况"字段 so that 更详细地记录残疾人的具体情况

Acceptance Criteria

  1. 在基本信息表单中添加"具体残疾部位和情况"字段
  2. 该字段为非必填项
  3. 数据存储和展示功能正常

Tasks / Subtasks

  • 修改残疾人实体,添加具体残疾部位和情况字段 (AC: 1, 2, 3)
    • 修改 allin-packages/disability-module/src/entities/disabled-person.entity.ts,添加 specificDisability 字段
    • 字段类型:varchar(500),可为空,注释:具体残疾部位和情况
  • 修改残疾人Schema验证规则 (AC: 1, 2, 3)
    • 修改 allin-packages/disability-module/src/schemas/disabled-person.schema.ts
    • BaseDisabledPersonSchema 中添加 specificDisability 字段,设为可选
    • DisabledPersonSchema 中添加 specificDisability 字段,设为可选
    • CreateDisabledPersonSchema 中添加 specificDisability 字段,设为可选
    • UpdateDisabledPersonSchema 中添加 specificDisability 字段,设为可选
    • 添加中文错误提示:最大长度500字符
  • 修改前端残疾人管理表单 (AC: 1, 2, 3)
    • 修改 allin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsx
    • 在创建表单默认值中添加 specificDisability: ''
    • 在表单字段网格中添加"具体残疾部位和情况"字段
    • 使用 Textarea 组件,支持多行输入
    • 字段标签为"具体残疾部位和情况(可选)"
    • 确保更新表单也包含该字段
  • 更新数据库实体(TypeORM自动同步) (AC: 3)
    • 修改实体文件后,TypeORM会自动同步数据库结构
    • 无需手动创建迁移脚本(开发阶段)
  • 添加测试覆盖 (AC: 1, 2, 3)
    • 更新残疾人模块集成测试,验证新字段功能
    • 更新残疾人管理UI包集成测试,验证表单字段显示和验证
    • 测试空值、有效值和边界值(500字符限制)

Dev Notes

技术栈信息 [Source: architecture/tech-stack.md]

  • 运行时:Node.js 20.18.3
  • 框架:Hono 4.8.5(Web框架和API路由,RPC类型安全)
  • 前端框架:React 19.1.0
  • 数据库:PostgreSQL 17(通过TypeORM)
  • ORM:TypeORM 0.3.25
  • 样式:Tailwind CSS 4.1.11
  • 状态管理:React Query 5.83.0

项目结构信息 [Source: architecture/source-tree.md]

  • 残疾人管理模块:allin-packages/disability-module/
    • 实体:src/entities/disabled-person.entity.ts
    • Schema:src/schemas/disabled-person.schema.ts
    • 服务:src/services/
    • 路由:src/routes/
  • 残疾人个人管理UI包:allin-packages/disability-person-management-ui/
    • 组件:src/components/DisabilityPersonManagement.tsx
    • API客户端:src/api/disabilityClient.ts
    • 测试:tests/integration/

后端模块包规范 [Source: architecture/backend-module-package-standards.md]

  • 包命名规范:@d8d/allin-disability-module
  • 目录结构规范:
    • src/entities/ - 实体定义
    • src/schemas/ - 验证Schema
    • src/services/ - 服务层
    • src/routes/ - 路由层
    • tests/integration/ - 集成测试
  • Schema验证要求:使用 @hono/zod-openapi,添加中文错误提示

UI包开发规范 [Source: architecture/ui-package-standards.md]

  • 包命名规范:@d8d/allin-disability-person-management-ui
  • 组件开发规范:
    • 使用RPC推断类型,而不是直接导入schema类型
    • 为关键交互元素添加 data-testid 属性
    • 使用条件渲染两个独立的Form组件(创建和更新)
    • 表单字段使用网格布局:grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4
  • 测试规范:
    • 测试文件位置:tests/integration/
    • 使用 data-testid 进行元素查询
    • 避免使用 getByText() 查找可能重复的文本元素

编码标准 [Source: architecture/coding-standards.md]

  • 测试框架:Vitest + Testing Library + hono/testing
  • 测试位置:tests/ 文件夹与源码并列
  • 覆盖率目标:核心业务逻辑 > 80%
  • 关键集成规则:
    • 确保现有API兼容性
    • 使用测试数据库,避免污染生产数据
    • 测试各种错误场景和边界条件

数据模型变更指导

  • 字段名称:specific_disability(数据库),specificDisability(代码)
  • 字段类型:VARCHAR(500),可为空
  • 字段注释:具体残疾部位和情况
  • 位置:添加到 disabled_person
  • 兼容性:新字段必须可为空,不影响现有数据
  • 数据库同步:开发阶段使用TypeORM自动同步,无需手动创建迁移脚本

表单字段设计

  • 组件类型:Textarea(多行文本输入)
  • 标签:"具体残疾部位和情况(可选)"
  • 占位符:"请输入具体残疾部位和情况,最多500字符"
  • 验证规则:最大长度500字符,中文错误提示
  • 布局:与其他基本信息字段在同一网格布局中

测试要求

  • 单元测试:验证Schema验证规则
  • 集成测试:验证API端点对新字段的支持
  • UI测试:验证表单字段显示、输入和验证
  • 边界测试:测试500字符限制
  • 兼容性测试:验证现有数据不受影响

Testing

  • 测试文件位置
    • 后端:allin-packages/disability-module/tests/integration/disability.integration.test.ts
    • 前端:allin-packages/disability-person-management-ui/tests/integration/disability-person.integration.test.tsx
  • 测试标准
    • 使用Vitest作为测试框架
    • 集成测试验证完整工作流
    • 测试覆盖率 > 80%
    • 使用 data-testid 进行元素查询
    • 测试边界条件和错误场景
  • 测试框架和模式
    • 后端:hono/testing + Vitest
    • 前端:Testing Library + Vitest
    • E2E:Playwright(如果需要)
  • 特定测试要求
    • 验证新字段在创建、更新、查询操作中正常工作
    • 验证字段为非必填项
    • 验证500字符长度限制
    • 验证现有数据兼容性

Change Log

Date Version Description Author
2025-12-10 1.0 初始故事创建 Bob (Scrum Master)

Dev Agent Record

Agent Model Used

Debug Log References

Completion Notes List

File List

QA Results