Pārlūkot izejas kodu

📝 docs(architecture): update file paths and entity documentation

- update GenericCrudService file paths from src/server to packages/server
- update ConcreteCrudService file paths from src/server to packages/server
- update createCrudRoutes file paths from src/server to packages/server
- add field comments and JSDoc for User entity example

📝 docs(test): update test directory structure

- update unit test paths from tests/unit to web/tests/unit
- update integration test paths from tests/integration to web/tests/integration
- update e2e test paths from tests/e2e to web/tests/e2e

📝 docs(story): add order management admin story

- create story 5.7 for admin order information viewing
- define acceptance criteria for order list, filtering, details and reporting
- outline tasks for API routes, admin pages, routing and testing
- document technical requirements and implementation standards
yourname 3 mēneši atpakaļ
vecāks
revīzija
75bf76b1e2

+ 16 - 11
docs/architecture/generic-crud-standards.md

@@ -28,7 +28,7 @@
 
 ### 1. GenericCrudService
 
-**位置**: `src/server/utils/generic-crud.service.ts`
+**位置**: `packages/server/src/utils/generic-crud.service.ts`
 
 **核心功能**:
 - 分页列表查询(支持搜索、排序、复杂筛选)
@@ -66,7 +66,7 @@ async delete(id: number): Promise<boolean>
 
 ### 2. ConcreteCrudService
 
-**位置**: `src/server/utils/concrete-crud.service.ts`
+**位置**: `packages/server/src/utils/concrete-crud.service.ts`
 
 **用途**: 简化 `GenericCrudService` 的实例化,自动注入数据源。
 
@@ -79,7 +79,7 @@ const userService = new ConcreteCrudService(User, {
 
 ### 3. createCrudRoutes
 
-**位置**: `src/server/utils/generic-crud.routes.ts`
+**位置**: `packages/server/src/utils/generic-crud.routes.ts`
 
 **功能**: 自动生成完整的 CRUD 路由,包括:
 - `GET /` - 分页列表
@@ -105,19 +105,24 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateCol
 
 @Entity()
 export class User {
+  /** 用户ID */
   @PrimaryGeneratedColumn()
   id: number;
 
-  @Column({ unique: true })
+  /** 用户名,唯一标识 */
+  @Column({ unique: true, comment: '用户名,唯一标识' })
   username: string;
 
-  @Column({ nullable: true })
+  /** 邮箱地址 */
+  @Column({ nullable: true, comment: '邮箱地址' })
   email: string | null;
 
-  @CreateDateColumn()
+  /** 创建时间 */
+  @CreateDateColumn({ comment: '创建时间' })
   createdAt: Date;
 
-  @UpdateDateColumn()
+  /** 更新时间 */
+  @UpdateDateColumn({ comment: '更新时间' })
   updatedAt: Date;
 }
 ```
@@ -150,14 +155,14 @@ export const UserListSchema = UserGetSchema;
 
 ```typescript
 // api/users/index.ts
-import { createCrudRoutes } from '../../../utils/generic-crud.routes';
-import { User } from '../../../modules/users/user.entity';
+import { createCrudRoutes } from '../../utils/generic-crud.routes';
+import { User } from './user.entity';
 import {
   UserCreateSchema,
   UserUpdateSchema,
   UserGetSchema,
   UserListSchema
-} from '../../../modules/users/user.schema';
+} from './user.schema';
 
 export const userRoutes = createCrudRoutes({
   entity: User,
@@ -237,8 +242,8 @@ searchFields: ['contract.client.name']
 ## 最佳实践
 
 ### 1. 实体设计
-- 所有实体必须继承 `ObjectLiteral`
 - 使用 TypeORM 装饰器定义字段
+- 为所有字段添加 `comment` 配置,说明字段用途
 - 包含 `createdAt` 和 `updatedAt` 时间戳
 - 考虑软删除需求
 

+ 5 - 5
docs/architecture/testing-strategy.md

@@ -24,8 +24,8 @@
 - **范围**: 单个函数、类或组件
 - **目标**: 验证独立单元的correctness
 - **位置**:
-  - 前端: `tests/unit/client/**/*.test.{ts,tsx}`
-  - 后端: `tests/unit/server/**/*.test.{ts,tsx}`
+  - 前端: `web/tests/unit/client/**/*.test.{ts,tsx}`
+  - 后端: `web/tests/unit/server/**/*.test.{ts,tsx}`
 - **框架**: Vitest
 - **覆盖率目标**: ≥ 80%
 - **执行频率**: 每次代码变更
@@ -34,8 +34,8 @@
 - **范围**: 多个组件/服务协作
 - **目标**: 验证模块间集成和交互
 - **位置**:
-  - 前端: `tests/integration/client/**/*.test.{ts,tsx}`
-  - 后端: `tests/integration/server/**/*.test.{ts,tsx}`
+  - 前端: `web/tests/integration/client/**/*.test.{ts,tsx}`
+  - 后端: `web/tests/integration/server/**/*.test.{ts,tsx}`
 - **框架**: Vitest + Testing Library + hono/testing
 - **覆盖率目标**: ≥ 60%
 - **执行频率**: 每次API变更
@@ -43,7 +43,7 @@
 #### E2E测试 (End-to-End Tests)
 - **范围**: 完整用户流程
 - **目标**: 验证端到端业务流程
-- **位置**: `tests/e2e/**/*.test.{ts,tsx}`
+- **位置**: `web/tests/e2e/**/*.test.{ts,tsx}`
 - **框架**: Playwright
 - **覆盖率目标**: 关键用户流程100%
 - **执行频率**: 每日或每次重大变更

+ 216 - 0
docs/stories/005.007.story.md

@@ -0,0 +1,216 @@
+# Story 5.7: 订单信息查看(管理后台)
+
+## Status
+Draft
+
+## Story
+**As a** 系统管理员
+**I want** 能够查看所有订单信息和状态
+**so that** 监控订单流程和处理异常订单
+
+## Acceptance Criteria
+1. 支持查看所有订单列表
+2. 支持按订单状态筛选(待支付、待出发、行程中、已完成、已取消)
+3. 显示订单详细信息(用户信息、路线信息、乘客信息、金额、状态)
+4. 支持订单状态统计和报表
+
+## Tasks / Subtasks
+- [ ] 创建管理后台订单API路由 (AC: 1, 2, 3, 4)
+  - [ ] 创建 `packages/server/src/api/admin/orders/index.ts` API路由文件
+  - [ ] 使用通用CRUD规范创建管理后台订单API
+  - [ ] 实现订单列表查询(支持分页、搜索、状态筛选)
+  - [ ] 实现订单详情查询(包含关联的用户、路线、乘客信息)
+  - [ ] 实现订单状态统计API
+- [ ] 创建管理后台订单管理页面 (AC: 1, 2, 3, 4)
+  - [ ] 创建 `web/src/client/admin/pages/Orders.tsx` 页面组件
+  - [ ] 实现订单列表表格(显示订单基本信息)
+  - [ ] 实现订单状态筛选器(待支付、待出发、行程中、已完成、已取消)
+  - [ ] 实现订单搜索功能(按订单号、用户信息搜索)
+  - [ ] 实现订单详情查看对话框
+  - [ ] 实现订单状态统计面板
+  - [ ] 实现数据导出功能
+- [ ] 集成订单页面到管理后台路由 (AC: 1)
+  - [ ] 在管理后台路由配置中添加订单管理页面
+  - [ ] 在管理后台菜单中添加订单管理入口
+- [ ] 编写订单管理测试 (AC: 1, 2, 3, 4)
+  - [ ] 编写管理后台订单API集成测试
+  - [ ] 编写订单管理页面组件测试
+  - [ ] 编写订单状态统计测试
+
+## Dev Notes
+
+### 数据模型设计
+基于 [docs/architecture/data-model-schema-changes.md#订单模型],订单实体已经存在,包含以下关键属性:
+
+**订单实体关键属性** [Source: architecture/data-model-schema-changes.md#订单模型]:
+- `id`: number - 主键标识符
+- `userId`: number - 用户ID
+- `routeId`: number - 路线ID
+- `passengerCount`: number - 乘客数量
+- `totalAmount`: number - 订单总金额
+- `status`: string - 订单状态(待支付、待出发、行程中、已完成、已取消)
+- `paymentStatus`: string - 支付状态
+- `passengerSnapshots`: JSON - 乘客信息快照数组(下单时的多个乘客信息)
+- `routeSnapshot`: JSON - 路线信息快照(下单时的路线信息)
+- `createdAt`: Date - 创建时间
+
+**订单状态枚举定义** [Source: architecture/data-model-schema-changes.md#枚举定义]:
+```typescript
+export enum OrderStatus {
+  PENDING_PAYMENT = '待支付',
+  WAITING_DEPARTURE = '待出发',
+  IN_PROGRESS = '行程中',
+  COMPLETED = '已完成',
+  CANCELLED = '已取消'
+}
+```
+
+**支付状态枚举定义** [Source: architecture/data-model-schema-changes.md#枚举定义]:
+```typescript
+export enum PaymentStatus {
+  PENDING = '待支付',
+  PAID = '已支付',
+  FAILED = '支付失败',
+  REFUNDED = '已退款'
+}
+```
+
+### 通用CRUD规范要求
+基于 [docs/architecture/generic-crud-standards.md#使用指南],管理后台订单管理必须遵循通用CRUD规范:
+
+**实体设计** [Source: architecture/generic-crud-standards.md#实体设计]:
+- 使用TypeORM装饰器定义字段
+- 为所有字段添加 `comment` 配置,说明字段用途
+- 包含 `createdAt` 和 `updatedAt` 时间戳
+
+**Schema设计** [Source: architecture/generic-crud-standards.md#schema设计]:
+- 创建和更新使用不同的schema
+- 响应schema应包含完整字段
+- 使用 `.optional()` 和 `.nullable()` 明确字段可选性
+
+**CRUD路由注册** [Source: architecture/generic-crud-standards.md#注册crud路由]:
+```typescript
+export const orderRoutes = createCrudRoutes({
+  entity: Order,
+  createSchema: OrderCreateSchema,
+  updateSchema: OrderUpdateSchema,
+  getSchema: OrderGetSchema,
+  listSchema: OrderListSchema,
+  searchFields: ['id', 'user.username'],
+  relations: ['user', 'route', 'passengers'],
+  middleware: [authMiddleware, adminMiddleware],
+  userTracking: {
+    createdByField: 'createdBy',
+    updatedByField: 'updatedBy'
+  }
+});
+```
+
+### 管理后台开发规范
+基于 [docs/architecture/admin-dashboard-standards.md#页面开发规范],订单管理页面必须遵循管理后台开发标准:
+
+**页面结构标准** [Source: architecture/admin-dashboard-standards.md#页面结构标准]:
+- 使用React + TypeScript + React Query技术栈
+- 遵循标准页面结构(标题、搜索栏、表格、分页)
+- 使用shadcn/ui组件库和Tailwind CSS样式
+
+**数据表格规范** [Source: architecture/admin-dashboard-standards.md#数据表格规范]:
+- 使用标准表格结构(Table、TableHeader、TableBody、TableRow、TableCell)
+- 实现分页组件(DataTablePagination)
+- 支持搜索和筛选功能
+
+**RPC Client使用规范** [Source: architecture/admin-dashboard-standards.md#rpc-client-使用规范]:
+- 从统一的API模块导入客户端
+- 使用InferResponseType和InferRequestType提取类型
+- 遵循标准API调用模式(GET、POST、PUT、DELETE)
+
+### 文件位置
+基于 [docs/architecture/source-tree.md#实际项目结构],所有订单相关文件必须放置在指定位置:
+
+**后端文件位置** [Source: architecture/source-tree.md#实际项目结构]:
+- **API路由**: `packages/server/src/api/admin/orders/index.ts`
+- **实体定义**: `packages/server/src/modules/orders/order.entity.ts` (已存在)
+- **业务服务**: `packages/server/src/modules/orders/order.service.ts` (已存在)
+- **Zod Schema**: `packages/server/src/modules/orders/order.schema.ts` (已存在)
+
+**前端文件位置** [Source: architecture/source-tree.md#实际项目结构]:
+- **管理后台页面**: `web/src/client/admin/pages/Orders.tsx`
+- **共享类型**: `packages/server/src/share/order.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#现有技术栈维护]:
+- **前端框架**: React 19.1.0+
+- **样式**: Tailwind CSS 4.1.11
+- **状态管理**: @tanstack/react-query
+- **UI组件**: shadcn/ui
+
+### 开发规范要求
+基于 [docs/architecture/coding-standards.md#通用crud开发规范],必须遵循编码标准:
+
+**CRUD开发** [Source: architecture/coding-standards.md#通用crud开发规范]:
+- 遵循通用CRUD规范进行开发
+- 使用TypeORM装饰器定义字段,为所有字段添加 `comment` 配置
+- 包含时间戳字段
+- 创建、更新、响应使用不同的Zod schema
+- 使用 `createCrudRoutes` 自动生成API路由
+
+**管理后台开发** [Source: architecture/coding-standards.md#管理后台开发规范]:
+- 遵循管理后台开发规范进行开发
+- 统一页面结构和布局标准
+- 实现基于角色的访问控制
+- 提供统一的加载状态、错误处理和用户反馈机制
+
+### Testing
+
+**测试要求** [Source: architecture/testing-strategy.md#主项目测试体系]:
+- **主项目测试位置**: `web/tests/unit/`, `web/tests/integration/`, `web/tests/e2e/` 目录
+- **主项目测试框架**: Vitest + Testing Library + hono/testing + Playwright
+- **管理后台测试位置**: `web/tests/unit/client/admin/` 目录
+- **覆盖率目标**: 核心业务逻辑 > 80%
+
+**具体测试要求** [Source: architecture/testing-strategy.md#测试金字塔策略]:
+- **管理后台订单API集成测试** (P1优先级)
+  - 测试订单列表API端点
+  - 验证订单状态筛选功能
+  - 测试订单详情查询
+  - 验证订单统计API
+- **订单管理页面组件测试** (P1优先级)
+  - 测试订单列表页面渲染
+  - 验证订单状态筛选器功能
+  - 测试订单搜索功能
+  - 验证订单详情对话框
+  - 测试订单统计面板
+- **管理后台权限测试** (P1优先级)
+  - 验证只有管理员可以访问订单管理页面
+  - 测试权限控制中间件
+- **E2E订单管理流程测试** (P2优先级)
+  - 测试完整的订单查看流程
+  - 验证订单状态筛选和搜索功能
+  - 测试订单详情查看功能
+
+## Change Log
+| Date | Version | Description | Author |
+|------|---------|-------------|--------|
+| 2025-10-23 | 1.0 | 初始故事创建,基于史诗005 US005-07需求 | Bob (Scrum Master) |
+
+## Dev Agent Record
+*此部分由开发代理在实施过程中填写*
+
+### Agent Model Used
+
+### Debug Log References
+
+### Completion Notes List
+
+### File List
+
+## QA Results
+*此部分由QA代理在审查完成后填写*