|
@@ -0,0 +1,215 @@
|
|
|
|
|
+# Story 5.6: 乘客信息管理
|
|
|
|
|
+
|
|
|
|
|
+## Status
|
|
|
|
|
+Draft
|
|
|
|
|
+
|
|
|
|
|
+## Story
|
|
|
|
|
+**As a** 出行用户
|
|
|
|
|
+**I want** 能够管理我的乘客信息
|
|
|
|
|
+**so that** 快速选择乘车人
|
|
|
|
|
+
|
|
|
|
|
+## Acceptance Criteria
|
|
|
|
|
+1. 支持添加、编辑、删除乘客信息
|
|
|
|
|
+2. 支持设置默认乘客
|
|
|
|
|
+3. 验证乘客信息完整性(姓名、证件类型、证件号码、手机号)
|
|
|
|
|
+4. 支持多种证件类型(身份证、港澳通行证、护照等)
|
|
|
|
|
+
|
|
|
|
|
+## Tasks / Subtasks
|
|
|
|
|
+- [ ] 创建用户端乘客API路由 (AC: 1, 2, 3, 4)
|
|
|
|
|
+ - [ ] 创建 `src/server/api/passengers/index.ts` API路由文件
|
|
|
|
|
+ - [ ] 使用通用CRUD规范创建用户端乘客API
|
|
|
|
|
+ - [ ] 实现用户只能管理自己乘客的权限控制
|
|
|
|
|
+ - [ ] 支持默认乘客设置功能
|
|
|
|
|
+- [ ] 创建Taro小程序乘客管理页面 (AC: 1, 2, 3, 4)
|
|
|
|
|
+ - [ ] 创建 `mini/src/pages/passengers/passengers.tsx` 页面组件
|
|
|
|
|
+ - [ ] 实现乘客列表显示
|
|
|
|
|
+ - [ ] 实现添加乘客表单
|
|
|
|
|
+ - [ ] 实现编辑乘客功能
|
|
|
|
|
+ - [ ] 实现删除乘客功能
|
|
|
|
|
+ - [ ] 实现设置默认乘客功能
|
|
|
|
|
+- [ ] 迁移添加乘客页面 (AC: 1, 2, 3, 4)
|
|
|
|
|
+ - [ ] 迁移 `mini-demo/pages/add-passenger/add-passenger` 页面到 `mini/src/pages/passengers/add-passenger.tsx`
|
|
|
|
|
+ - [ ] 适配Taro框架和React技术栈
|
|
|
|
|
+ - [ ] 集成真实的后端API
|
|
|
|
|
+ - [ ] 保持原有样式和用户体验
|
|
|
|
|
+- [ ] 集成乘客页面到小程序路由 (AC: 1)
|
|
|
|
|
+ - [ ] 在Taro小程序路由配置中添加乘客页面
|
|
|
|
|
+ - [ ] 在个人中心页面添加乘客管理入口
|
|
|
|
|
+- [ ] 编写乘客管理测试 (AC: 1, 2, 3, 4)
|
|
|
|
|
+ - [ ] 编写用户端乘客API集成测试
|
|
|
|
|
+ - [ ] 编写Taro小程序乘客页面组件测试
|
|
|
|
|
+ - [ ] 编写乘客信息验证测试
|
|
|
|
|
+
|
|
|
|
|
+## Dev Notes
|
|
|
|
|
+
|
|
|
|
|
+### 数据模型设计
|
|
|
|
|
+基于 [docs/architecture/data-model-schema-changes.md#乘客模型],乘客实体已经存在,包含以下关键属性:
|
|
|
|
|
+
|
|
|
|
|
+**乘客实体关键属性** [Source: architecture/data-model-schema-changes.md#乘客模型]:
|
|
|
|
|
+- `id`: number - 主键标识符
|
|
|
|
|
+- `userId`: number - 用户ID
|
|
|
|
|
+- `name`: string - 乘客姓名
|
|
|
|
|
+- `idType`: IdType - 证件类型(身份证、港澳通行证、台湾通行证、护照等)
|
|
|
|
|
+- `idNumber`: string - 证件号码
|
|
|
|
|
+- `phone`: string - 手机号
|
|
|
|
|
+- `isDefault`: boolean - 是否默认乘客
|
|
|
|
|
+
|
|
|
|
|
+**证件类型枚举定义** [Source: architecture/data-model-schema-changes.md#枚举定义]:
|
|
|
|
|
+```typescript
|
|
|
|
|
+export enum IdType {
|
|
|
|
|
+ ID_CARD = '身份证',
|
|
|
|
|
+ HONG_KONG_MACAO_PASS = '港澳通行证',
|
|
|
|
|
+ TAIWAN_PASS = '台湾通行证',
|
|
|
|
|
+ PASSPORT = '护照',
|
|
|
|
|
+ OTHER = '其他证件'
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 通用CRUD规范要求
|
|
|
|
|
+基于 [docs/architecture/generic-crud-standards.md#使用指南],用户端乘客管理必须遵循通用CRUD规范:
|
|
|
|
|
+
|
|
|
|
|
+**实体设计** [Source: architecture/generic-crud-standards.md#实体设计]:
|
|
|
|
|
+- 所有实体必须继承 `ObjectLiteral`
|
|
|
|
|
+- 包含 `createdAt` 和 `updatedAt` 时间戳
|
|
|
|
|
+- 使用TypeORM装饰器定义字段
|
|
|
|
|
+
|
|
|
|
|
+**Schema设计** [Source: architecture/generic-crud-standards.md#schema设计]:
|
|
|
|
|
+- 创建和更新使用不同的schema
|
|
|
|
|
+- 响应schema应包含完整字段
|
|
|
|
|
+- 使用 `.optional()` 和 `.nullable()` 明确字段可选性
|
|
|
|
|
+
|
|
|
|
|
+**CRUD路由注册** [Source: architecture/generic-crud-standards.md#注册crud路由]:
|
|
|
|
|
+```typescript
|
|
|
|
|
+export const passengerRoutes = createCrudRoutes({
|
|
|
|
|
+ entity: Passenger,
|
|
|
|
|
+ createSchema: PassengerCreateSchema,
|
|
|
|
|
+ updateSchema: PassengerUpdateSchema,
|
|
|
|
|
+ getSchema: PassengerGetSchema,
|
|
|
|
|
+ listSchema: PassengerListSchema,
|
|
|
|
|
+ searchFields: ['name', 'phone', 'idNumber'],
|
|
|
|
|
+ relations: ['user'],
|
|
|
|
|
+ middleware: [authMiddleware],
|
|
|
|
|
+ userTracking: {
|
|
|
|
|
+ createdByField: 'createdBy',
|
|
|
|
|
+ updatedByField: 'updatedBy'
|
|
|
|
|
+ }
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 权限控制要求
|
|
|
|
|
+基于 [docs/architecture/security-integration.md#现有安全措施],用户端乘客API需要实现权限控制:
|
|
|
|
|
+
|
|
|
|
|
+**用户权限控制** [Source: architecture/security-integration.md#现有安全措施]:
|
|
|
|
|
+- 用户只能查看和管理自己的乘客信息
|
|
|
|
|
+- 使用JWT认证中间件验证用户身份
|
|
|
|
|
+- 在查询和操作时自动过滤用户ID
|
|
|
|
|
+
|
|
|
|
|
+### Taro小程序开发规范
|
|
|
|
|
+基于 [docs/architecture/coding-standards.md#taro小程序开发规范],乘客管理页面必须遵循Taro小程序开发标准:
|
|
|
|
|
+
|
|
|
|
|
+**技术栈要求** [Source: architecture/tech-stack.md#现有技术栈维护]:
|
|
|
|
|
+- **前端框架**: Taro + React
|
|
|
|
|
+- **状态管理**: React Query 5.83.0
|
|
|
|
|
+- **样式**: Tailwind CSS 4.1.11
|
|
|
|
|
+- **路由导航**: 统一使用Taro路由API
|
|
|
|
|
+
|
|
|
|
|
+**页面结构标准** [Source: architecture/source-tree.md#实际项目结构]:
|
|
|
|
|
+- 页面文件位置:`mini/src/pages/passengers/passengers.tsx`
|
|
|
|
|
+- 使用标准Taro页面组件结构
|
|
|
|
|
+- 遵循移动端优先的响应式设计
|
|
|
|
|
+
|
|
|
|
|
+### 文件位置
|
|
|
|
|
+基于 [docs/architecture/source-tree.md#实际项目结构],所有乘客相关文件必须放置在指定位置:
|
|
|
|
|
+
|
|
|
|
|
+**后端文件位置** [Source: architecture/source-tree.md#实际项目结构]:
|
|
|
|
|
+- **API路由**: `src/server/api/passengers/index.ts`
|
|
|
|
|
+- **实体定义**: `src/server/modules/passengers/passenger.entity.ts` (已存在)
|
|
|
|
|
+- **业务服务**: `src/server/modules/passengers/passenger.service.ts` (已存在)
|
|
|
|
|
+- **Zod Schema**: `src/server/modules/passengers/passenger.schema.ts` (已存在)
|
|
|
|
|
+
|
|
|
|
|
+**前端文件位置** [Source: architecture/source-tree.md#实际项目结构]:
|
|
|
|
|
+- **Taro小程序页面**: `mini/src/pages/passengers/passengers.tsx`
|
|
|
|
|
+- **迁移页面**: `mini/src/pages/passengers/add-passenger.tsx`
|
|
|
|
|
+- **共享类型**: `src/share/passenger.types.ts` (已存在)
|
|
|
|
|
+
|
|
|
|
|
+### 技术栈要求
|
|
|
|
|
+基于 [docs/architecture/tech-stack.md#现有技术栈维护],必须使用项目标准技术栈:
|
|
|
|
|
+
|
|
|
|
|
+**后端框架** [Source: architecture/tech-stack.md#现有技术栈维护]:
|
|
|
|
|
+- **运行时**: Node.js 20.19.2
|
|
|
|
|
+- **框架**: Hono 4.8.5
|
|
|
|
|
+- **数据库**: PostgreSQL 17
|
|
|
|
|
+- **ORM**: TypeORM 0.3.25
|
|
|
|
|
+
|
|
|
|
|
+**前端框架** [Source: architecture/tech-stack.md#现有技术栈维护]:
|
|
|
|
|
+- **前端框架**: Taro + React
|
|
|
|
|
+- **样式**: Tailwind CSS 4.1.11
|
|
|
|
|
+- **状态管理**: React Query 5.83.0
|
|
|
|
|
+
|
|
|
|
|
+### 开发规范要求
|
|
|
|
|
+基于 [docs/architecture/coding-standards.md#通用crud开发规范],必须遵循编码标准:
|
|
|
|
|
+
|
|
|
|
|
+**CRUD开发** [Source: architecture/coding-standards.md#通用crud开发规范]:
|
|
|
|
|
+- 遵循通用CRUD规范进行开发
|
|
|
|
|
+- 所有实体必须继承 `ObjectLiteral`,包含时间戳字段
|
|
|
|
|
+- 创建、更新、响应使用不同的Zod schema
|
|
|
|
|
+- 使用 `createCrudRoutes` 自动生成API路由
|
|
|
|
|
+
|
|
|
|
|
+**Taro小程序开发** [Source: architecture/coding-standards.md#taro小程序开发规范]:
|
|
|
|
|
+- 遵循Taro小程序开发规范进行开发
|
|
|
|
|
+- 正确处理微信小程序、H5等平台差异
|
|
|
|
|
+- 使用React Query管理服务端状态
|
|
|
|
|
+- 统一使用Taro路由API
|
|
|
|
|
+
|
|
|
|
|
+**页面迁移规范** [Source: architecture/coding-standards.md#mini-demo迁移规范]:
|
|
|
|
|
+- 遵循mini-demo迁移指导规范进行迁移
|
|
|
|
|
+- 确保百分百样式保留,保持用户体验一致性
|
|
|
|
|
+- 技术栈转换:原生小程序 → Taro + React + TypeScript
|
|
|
|
|
+- 数据集成:模拟数据 → 真实后端API
|
|
|
|
|
+
|
|
|
|
|
+### Testing
|
|
|
|
|
+
|
|
|
|
|
+**测试要求** [Source: architecture/testing-strategy.md#主项目测试体系]:
|
|
|
|
|
+- **主项目测试位置**: `tests/unit/`, `tests/integration/`, `tests/e2e/` 目录
|
|
|
|
|
+- **主项目测试框架**: Vitest + Testing Library + hono/testing + Playwright
|
|
|
|
|
+- **Taro小程序测试位置**: `mini/tests/` 目录
|
|
|
|
|
+- **Taro小程序测试框架**: Jest + @testing-library/react + 自定义Taro组件mock
|
|
|
|
|
+- **覆盖率目标**: 核心业务逻辑 > 80%
|
|
|
|
|
+
|
|
|
|
|
+**具体测试要求** [Source: architecture/testing-strategy.md#测试金字塔策略]:
|
|
|
|
|
+- **用户端乘客API集成测试** (P1优先级)
|
|
|
|
|
+ - 测试乘客列表API端点
|
|
|
|
|
+ - 验证用户权限控制
|
|
|
|
|
+ - 测试默认乘客设置功能
|
|
|
|
|
+- **Taro小程序乘客页面组件测试** (P1优先级)
|
|
|
|
|
+ - 测试乘客列表页面渲染
|
|
|
|
|
+ - 验证添加乘客表单功能
|
|
|
|
|
+ - 测试编辑和删除乘客功能
|
|
|
|
|
+- **页面迁移兼容性测试** (P1优先级)
|
|
|
|
|
+ - 验证迁移后的添加乘客页面功能完整性
|
|
|
|
|
+ - 测试样式保留和用户体验一致性
|
|
|
|
|
+ - 验证与后端API的集成
|
|
|
|
|
+- **乘客信息验证测试** (P0优先级)
|
|
|
|
|
+ - 验证证件类型和号码格式
|
|
|
|
|
+ - 测试手机号验证规则
|
|
|
|
|
+ - 验证必填字段完整性
|
|
|
|
|
+
|
|
|
|
|
+## Change Log
|
|
|
|
|
+| Date | Version | Description | Author |
|
|
|
|
|
+|------|---------|-------------|--------|
|
|
|
|
|
+| 2025-10-21 | 1.1 | 添加页面迁移任务和测试要求 | Bob (Scrum Master) |
|
|
|
|
|
+| 2025-10-21 | 1.0 | 初始故事创建,基于史诗005 US005-06需求 | Bob (Scrum Master) |
|
|
|
|
|
+
|
|
|
|
|
+## Dev Agent Record
|
|
|
|
|
+*此部分由开发代理在实施过程中填写*
|
|
|
|
|
+
|
|
|
|
|
+### Agent Model Used
|
|
|
|
|
+
|
|
|
|
|
+### Debug Log References
|
|
|
|
|
+
|
|
|
|
|
+### Completion Notes List
|
|
|
|
|
+
|
|
|
|
|
+### File List
|
|
|
|
|
+
|
|
|
|
|
+## QA Results
|
|
|
|
|
+*此部分由QA代理在审查完成后填写*
|