|
|
@@ -1,40 +1,48 @@
|
|
|
-# D8D Starter 遗留系统增强架构
|
|
|
+# 出行服务项目架构文档
|
|
|
|
|
|
## 版本信息
|
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
|
|------|------|------|------|
|
|
|
-| 2.0 | 2025-09-14 | 增强架构文档 | Winston |
|
|
|
-| 2.1 | 2025-09-19 | 添加数据库定时备份策略 | Winston |
|
|
|
-| 2.2 | 2025-09-19 | 更新测试策略文档引用 | Winston |
|
|
|
-| 2.3 | 2025-09-20 | 根据实际项目结构更新测试架构和共享目录 | Winston |
|
|
|
+| 3.1 | 2025-10-15 | 更新乘客信息支持多种证件类型 | Winston |
|
|
|
+| 3.0 | 2025-10-15 | 更新为出行服务项目架构 | Winston |
|
|
|
| 2.4 | 2025-09-20 | 完善BMAD全栈架构规范,添加高层架构图、API规范、安全架构 | Winston |
|
|
|
+| 2.3 | 2025-09-20 | 根据实际项目结构更新测试架构和共享目录 | Winston |
|
|
|
+| 2.2 | 2025-09-19 | 更新测试策略文档引用 | Winston |
|
|
|
+| 2.1 | 2025-09-19 | 添加数据库定时备份策略 | Winston |
|
|
|
+| 2.0 | 2025-09-14 | 增强架构文档 | Winston |
|
|
|
|
|
|
## 介绍
|
|
|
|
|
|
-本文档定义了D8D Starter项目的架构增强方案,基于对现有代码的深度分析。主要目标是将技术实现转化为明确的业务价值主张,同时保持与现有系统的完全兼容。
|
|
|
+本文档定义了出行服务项目的整体架构方案,基于对mini-demo页面迁移项目的深度分析。主要目标是将演示原型转化为功能完整的出行服务平台,同时保持技术架构的现代化和可扩展性。
|
|
|
|
|
|
**注意**: 本项目的详细架构文档已拆分为多个子文档,位于 `docs/architecture/` 目录中。如需查看完整的架构文档结构,请参阅 [架构文档索引](./architecture/index.md)。
|
|
|
|
|
|
### 文档范围
|
|
|
-全面定义系统增强的架构方法和集成策略
|
|
|
+全面定义出行服务项目的架构方案、技术栈选择、数据模型设计和集成策略
|
|
|
|
|
|
### 变更日志
|
|
|
| 日期 | 版本 | 描述 | 作者 |
|
|
|
|------|------|------|------|
|
|
|
-| 2024-09-14 | 1.0 | 初始现有系统分析 | Winston |
|
|
|
-| 2025-09-14 | 2.0 | 增强架构文档 | Winston |
|
|
|
-| 2025-09-19 | 2.1 | 添加数据库定时备份策略 | Winston |
|
|
|
-| 2025-09-19 | 2.2 | 更新测试策略文档引用 | Winston |
|
|
|
-| 2025-09-20 | 2.3 | 根据实际项目结构更新测试架构和共享目录 | Winston |
|
|
|
+| 2025-10-15 | 3.1 | 更新乘客信息支持多种证件类型(身份证、港澳通行证、台湾通行证、护照等) | Winston |
|
|
|
+| 2025-10-15 | 3.0 | 更新为出行服务项目架构 | Winston |
|
|
|
| 2025-09-20 | 2.4 | 完善BMAD全栈架构规范,添加高层架构图、API规范、安全架构 | Winston |
|
|
|
+| 2025-09-20 | 2.3 | 根据实际项目结构更新测试架构和共享目录 | Winston |
|
|
|
+| 2025-09-19 | 2.2 | 更新测试策略文档引用 | Winston |
|
|
|
+| 2025-09-19 | 2.1 | 添加数据库定时备份策略 | Winston |
|
|
|
+| 2025-09-14 | 2.0 | 增强架构文档 | Winston |
|
|
|
+| 2024-09-14 | 1.0 | 初始现有系统分析 | Winston |
|
|
|
|
|
|
## 现有项目分析
|
|
|
|
|
|
### 当前项目状态
|
|
|
-- **主要用途**: 现代化的全栈Web应用启动模板,专注于开发者体验
|
|
|
-- **技术栈总结**: Node.js 20.18.3 + Hono 4.8.5 + React 19.1.0 + TypeORM 0.3.25 + PostgreSQL 17
|
|
|
-- **架构风格**: 分层架构,前后端分离但统一仓库管理
|
|
|
-- **部署方式**: Docker Compose本地开发,Node.js生产部署
|
|
|
+- **主要用途**: 出行服务小程序平台,支持拼车、商务车、包车等出行服务
|
|
|
+- **项目结构**: 三目录结构(mini-demo、mini、src)
|
|
|
+ - **mini-demo**: 微信原生小程序,16个出行服务页面,纯前端演示
|
|
|
+ - **mini**: Taro + React 小程序项目,基础框架已搭建
|
|
|
+ - **src**: Hono + TypeORM 后端API和管理后台,用户管理基础已实现
|
|
|
+- **技术栈总结**: Node.js 20.19.2 + Hono 4.8.5 + Taro + React + TypeORM 0.3.25 + PostgreSQL 17
|
|
|
+- **架构风格**: 分层架构,前后端分离,统一仓库管理
|
|
|
+- **部署方式**: 多八多云端开发容器环境,开放8080端口外网访问
|
|
|
|
|
|
### 可用文档分析
|
|
|
✅ **技术文档完整**:
|
|
|
@@ -42,110 +50,142 @@
|
|
|
- 源码结构和模块组织清晰
|
|
|
- 数据模型定义完整
|
|
|
- API规范通过OpenAPI自动生成
|
|
|
+- 完整的PRD和项目简报
|
|
|
|
|
|
-⚠️ **需要补充**:
|
|
|
-- 完整的业务需求文档
|
|
|
-- 测试策略和覆盖率
|
|
|
-- 性能优化指南
|
|
|
-- 安全最佳实践
|
|
|
+✅ **已补充**:
|
|
|
+- 出行服务业务数据模型(基于MVP需求)
|
|
|
+- 活动-路线关系管理架构
|
|
|
+- 订单处理流程文档
|
|
|
+- 支付集成详细设计
|
|
|
|
|
|
### 识别出的约束
|
|
|
- 必须保持与现有shadcn设计系统的兼容性
|
|
|
- 需要支持PostgreSQL关系型数据库
|
|
|
- 前端构建基于Vite,后端基于Hono
|
|
|
- 部署环境支持Docker容器化
|
|
|
+- 必须兼容微信小程序平台限制
|
|
|
+- 需要支持活动-路线关系管理(1个活动关联多条线路)
|
|
|
+- 需要支持多个乘客信息管理(下单时选择N个乘车人)
|
|
|
- 现有代码中存在一些`any`类型需要修复
|
|
|
|
|
|
-## 增强范围和集成策略
|
|
|
+## 项目范围和集成策略
|
|
|
|
|
|
-### 增强概述
|
|
|
-- **增强类型**: 现有项目功能完善和业务需求文档化
|
|
|
-- **范围**: 将技术实现转化为明确的业务价值主张
|
|
|
-- **集成影响级别**: 中等 - 主要添加文档和优化,不改变核心架构
|
|
|
+### 项目概述
|
|
|
+- **项目类型**: mini-demo页面迁移和出行服务系统构建
|
|
|
+- **范围**: 将演示原型转化为功能完整的出行服务平台
|
|
|
+- **MVP范围**: 基于MVP需求,实现核心出行服务功能,不包括积分商城、优惠券、会员等级等高级功能
|
|
|
+- **集成影响级别**: 高 - 需要新增出行业务数据模型和核心功能
|
|
|
|
|
|
### 集成方法
|
|
|
-- **代码集成策略**: 增量改进,保持向后兼容
|
|
|
-- **数据库集成**: 无模式变更,仅优化查询和索引
|
|
|
-- **API集成**: 保持现有API不变,增强文档和错误处理
|
|
|
-- **UI集成**: 保持现有shadcn设计系统,优化用户体验
|
|
|
+- **代码集成策略**: 渐进式迁移,保持业务连续性
|
|
|
+- **数据库集成**: 新增出行服务数据模型(活动、路线、订单、乘客),扩展现有用户管理
|
|
|
+- **API集成**: 新增出行服务API,保持现有API兼容
|
|
|
+- **UI集成**: 迁移mini-demo页面到Taro + React,保持用户体验一致性
|
|
|
+- **MVP重点**: 优先实现路线查询、活动筛选、订单管理、乘客管理、支付集成等核心功能
|
|
|
|
|
|
### 兼容性要求
|
|
|
- **现有API兼容性**: 100%保持,不破坏现有客户端
|
|
|
-- **数据库Schema兼容性**: 无变更,确保数据完整性
|
|
|
-- **UI/UX一致性**: 遵循现有设计模式,保持视觉统一
|
|
|
-- **性能影响**: 响应时间保持在100ms以内,无性能退化
|
|
|
+- **数据库Schema兼容性**: 扩展现有模型,确保数据完整性
|
|
|
+- **UI/UX一致性**: 迁移页面保持原有交互体验
|
|
|
+- **性能影响**: 页面加载时间<2秒,API响应时间<500ms,无性能退化
|
|
|
|
|
|
## 高层架构
|
|
|
|
|
|
### 平台和基础设施选择
|
|
|
-**平台**: Docker + Node.js 本地开发部署
|
|
|
+**平台**: 多八多云端开发容器环境
|
|
|
**核心服务**: PostgreSQL 17, Redis 7, MinIO对象存储
|
|
|
-**部署主机**: 多八多云端开发容器环境,开放8080端口外网访问
|
|
|
+**部署主机**: Node.js 20.19.2运行时,开放8080端口外网访问
|
|
|
**区域**: 本地开发环境,生产环境参数相同
|
|
|
+**目标平台**: 微信小程序为主要发布平台
|
|
|
|
|
|
### 架构图
|
|
|
```mermaid
|
|
|
graph TD
|
|
|
subgraph "前端应用层"
|
|
|
- A[React 19 管理后台] --> B[React Router v7]
|
|
|
+ A[Taro + React 小程序] --> B[微信小程序API]
|
|
|
A --> C[React Query 状态管理]
|
|
|
A --> D[shadcn/ui 组件库]
|
|
|
+ E[React 管理后台] --> F[React Router v7]
|
|
|
end
|
|
|
|
|
|
subgraph "API网关层"
|
|
|
- E[Hono 4.8.5 API路由] --> F[Zod Schema验证]
|
|
|
- E --> G[JWT认证中间件]
|
|
|
- E --> H[OpenAPI文档生成]
|
|
|
+ G[Hono 4.8.5 API路由] --> H[Zod Schema验证]
|
|
|
+ G --> I[JWT认证中间件]
|
|
|
+ G --> J[OpenAPI文档生成]
|
|
|
end
|
|
|
|
|
|
subgraph "业务服务层"
|
|
|
- I[通用CRUD服务] --> J[TypeORM实体管理]
|
|
|
- I --> K[数据库备份工具]
|
|
|
- I --> L[数据库恢复工具]
|
|
|
+ K[出行服务模块] --> L[活动管理服务]
|
|
|
+ K --> M[路线管理服务]
|
|
|
+ K --> N[订单管理服务]
|
|
|
+ K --> O[乘客管理服务]
|
|
|
+ K --> P[支付集成服务]
|
|
|
+ Q[通用CRUD服务] --> R[TypeORM实体管理]
|
|
|
+ Q --> S[数据库备份工具]
|
|
|
end
|
|
|
|
|
|
subgraph "数据存储层"
|
|
|
- M[PostgreSQL 17] --> N[用户数据]
|
|
|
- M --> O[角色权限数据]
|
|
|
- P[Redis 7 缓存] --> Q[会话缓存]
|
|
|
- R[MinIO 对象存储] --> S[文件存储]
|
|
|
+ T[PostgreSQL 17] --> U[用户数据]
|
|
|
+ T --> V[活动数据]
|
|
|
+ T --> W[路线数据]
|
|
|
+ T --> X[订单数据]
|
|
|
+ T --> Y[乘客数据]
|
|
|
+ Z[Redis 7 缓存] --> AA[会话缓存]
|
|
|
+ AB[MinIO 对象存储] --> AC[文件存储]
|
|
|
+ end
|
|
|
+
|
|
|
+ subgraph "第三方服务"
|
|
|
+ AD[微信支付] --> AE[支付处理]
|
|
|
+ AF[地图服务] --> AG[位置服务]
|
|
|
end
|
|
|
|
|
|
subgraph "基础设施层"
|
|
|
- T[Docker Compose] --> U[本地开发环境]
|
|
|
- V[Node.js 20.18.3] --> W[生产运行时]
|
|
|
+ AH[多八多云端容器] --> AI[Node.js 20.19.2]
|
|
|
+ AJ[开放8080端口] --> AK[外网访问]
|
|
|
end
|
|
|
|
|
|
- A --> E
|
|
|
- E --> I
|
|
|
- I --> M
|
|
|
- I --> P
|
|
|
- E --> R
|
|
|
- H --> X[Swagger UI /ui]
|
|
|
+ A --> G
|
|
|
+ E --> G
|
|
|
+ G --> K
|
|
|
+ G --> Q
|
|
|
+ K --> T
|
|
|
+ Q --> T
|
|
|
+ G --> Z
|
|
|
+ G --> AB
|
|
|
+ K --> AD
|
|
|
+ K --> AF
|
|
|
+ J --> AL[Swagger UI /ui]
|
|
|
|
|
|
style A fill:#e1f5fe
|
|
|
style E fill:#f3e5f5
|
|
|
- style I fill:#fff3e0
|
|
|
- style M fill:#e8f5e8
|
|
|
- style P fill:#ffebee
|
|
|
- style R fill:#f3e5f5
|
|
|
+ style G fill:#fff3e0
|
|
|
+ style K fill:#e8f5e8
|
|
|
+ style O fill:#fff0f5
|
|
|
+ style R fill:#e8f5e8
|
|
|
+ style W fill:#ffebee
|
|
|
+ style Y fill:#f3e5f5
|
|
|
+ style AA fill:#fff3e0
|
|
|
+ style AC fill:#e1f5fe
|
|
|
```
|
|
|
|
|
|
### 架构模式
|
|
|
- **分层架构**: 清晰的前后端分离,统一的代码仓库管理
|
|
|
-- **组件化UI**: 基于React + shadcn/ui的可复用组件架构
|
|
|
+- **组件化UI**: 基于Taro + React + shadcn/ui的可复用组件架构
|
|
|
- **RESTful API**: 遵循OpenAPI规范的统一API设计
|
|
|
- **通用CRUD模式**: 类型安全的通用数据操作服务
|
|
|
- **中间件模式**: 统一的认证、验证、错误处理中间件
|
|
|
+- **领域驱动设计**: 基于出行服务业务领域的模块化设计
|
|
|
+- **快照模式**: 订单数据快照确保历史数据完整性
|
|
|
+- **活动-路线关联模式**: 支持1个活动关联多条路线的业务模型
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
### 现有技术栈维护
|
|
|
-| 类别 | 当前技术 | 版本 | 在增强中的用途 | 备注 |
|
|
|
+| 类别 | 当前技术 | 版本 | 在项目中的用途 | 备注 |
|
|
|
|------|----------|------|----------------|------|
|
|
|
-| 运行时 | Node.js | 20.18.3 | 服务器运行时环境 | ES模块支持 |
|
|
|
+| 运行时 | Node.js | 20.19.2 | 服务器运行时环境 | ES模块支持 |
|
|
|
| 框架 | Hono | 4.8.5 | Web框架和API路由 | RPC类型安全 |
|
|
|
-| 前端框架 | React | 19.1.0 | 用户界面构建 | 最新版本 |
|
|
|
+| 前端框架 | Taro + React | 最新 | 小程序用户界面构建 | 多端支持 |
|
|
|
| 构建工具 | Vite | 7.0.0 | 开发服务器和构建 | 热重载支持 |
|
|
|
| 数据库 | PostgreSQL | 17 | 数据持久化存储 | 通过TypeORM |
|
|
|
| ORM | TypeORM | 0.3.25 | 数据库操作抽象 | 实体管理 |
|
|
|
@@ -163,6 +203,12 @@ graph TD
|
|
|
| MinIO | latest | 对象存储服务 | 提供可扩展的文件存储解决方案,支持大文件上传和分段上传 | 通过MinIO客户端SDK集成 |
|
|
|
| MinIO客户端SDK | latest | MinIO API集成 | 提供与MinIO服务的完整交互能力 | 后端服务集成 |
|
|
|
|
|
|
+| Taro | 最新 | 多端小程序框架 | 支持微信小程序发布,更好的开发体验 | 替换mini-demo原生开发 |
|
|
|
+| 微信支付SDK | 最新 | 支付集成 | 支持出行服务支付需求 | 后端API集成 |
|
|
|
+| 地图服务SDK | 最新 | 位置服务 | 支持路线规划和位置跟踪 | 前后端集成 |
|
|
|
+| 活动-路线管理 | 自定义 | 活动路线关系 | 支持1个活动关联多条路线 | 业务逻辑层实现 |
|
|
|
+| 多乘客管理 | 自定义 | 乘客信息管理 | 支持下单时选择N个乘车人 | 业务逻辑层实现 |
|
|
|
+
|
|
|
## 数据模型和Schema变更
|
|
|
|
|
|
### 现有数据模型状态
|
|
|
@@ -188,7 +234,65 @@ graph TD
|
|
|
- `uploadTime`: Date - 上传时间
|
|
|
- **关系**: 与User实体建立多对一关系映射
|
|
|
|
|
|
-**优化重点**: 保持现有数据模型不变,新增文件管理功能,优化查询性能和验证逻辑
|
|
|
+### 新增出行服务数据模型
|
|
|
+**活动模型**:
|
|
|
+- **用途**: 管理出行活动,关联多条路线
|
|
|
+- **关键属性**:
|
|
|
+ - `id`: number - 主键标识符
|
|
|
+ - `name`: string - 活动名称
|
|
|
+ - `type`: ActivityType - 活动类型(去程活动/返程活动)
|
|
|
+ - `startDate`: Date - 活动开始日期
|
|
|
+ - `endDate`: Date - 活动结束日期
|
|
|
+ - `status`: ActivityStatus - 活动状态
|
|
|
+
|
|
|
+**路线模型**:
|
|
|
+- **用途**: 管理出行路线,关联到活动
|
|
|
+- **关键属性**:
|
|
|
+ - `id`: number - 主键标识符
|
|
|
+ - `activityId`: number - 关联的活动ID
|
|
|
+ - `startPoint`: string - 上车点
|
|
|
+ - `endPoint`: string - 下车点
|
|
|
+ - `departureTime`: Date - 出发时间
|
|
|
+ - `vehicleType`: string - 车型
|
|
|
+ - `maxPassengers`: number - 最大乘客数
|
|
|
+ - `price`: number - 价格
|
|
|
+ - `driverPlate`: string - 司机车牌
|
|
|
+ - `driverPhone`: string - 司机电话
|
|
|
+
|
|
|
+**订单模型**:
|
|
|
+- **用途**: 管理出行订单信息
|
|
|
+- **关键属性**:
|
|
|
+ - `id`: number - 主键标识符
|
|
|
+ - `userId`: number - 用户ID
|
|
|
+ - `routeId`: number - 路线ID
|
|
|
+ - `activityId`: number - 活动ID
|
|
|
+ - `passengerCount`: number - 乘客数量
|
|
|
+ - `totalAmount`: number - 订单总金额
|
|
|
+ - `status`: string - 订单状态(待出发、行程中、已完成、已取消)
|
|
|
+ - `paymentStatus`: string - 支付状态
|
|
|
+ - `passengerSnapshots`: JSON - 乘客信息快照数组(下单时的多个乘客信息)
|
|
|
+ - `routeSnapshot`: JSON - 路线信息快照(下单时的路线信息)
|
|
|
+ - `createdAt`: Date - 创建时间
|
|
|
+
|
|
|
+**乘客模型**:
|
|
|
+- **用途**: 管理乘客信息
|
|
|
+- **关键属性**:
|
|
|
+ - `id`: number - 主键标识符
|
|
|
+ - `userId`: number - 用户ID
|
|
|
+ - `name`: string - 乘客姓名
|
|
|
+ - `idType`: IdType - 证件类型(身份证、回乡证、护照等)
|
|
|
+ - `idNumber`: string - 证件号码
|
|
|
+ - `phone`: string - 手机号
|
|
|
+ - `isDefault`: boolean - 是否默认乘客
|
|
|
+
|
|
|
+**积分模型**:
|
|
|
+- **用途**: 管理用户积分(MVP阶段暂不实现)
|
|
|
+- **关键属性**:
|
|
|
+ - `id`: number - 主键标识符
|
|
|
+ - `userId`: number - 用户ID
|
|
|
+ - `points`: number - 积分余额
|
|
|
+ - `earnedPoints`: number - 累计获得积分
|
|
|
+ - `usedPoints`: number - 累计使用积分
|
|
|
|
|
|
### TypeScript接口定义
|
|
|
```typescript
|
|
|
@@ -213,70 +317,143 @@ export interface Role {
|
|
|
updatedAt: Date;
|
|
|
}
|
|
|
|
|
|
-// 用户创建DTO
|
|
|
-export interface CreateUserDto {
|
|
|
- username: string;
|
|
|
- email?: string;
|
|
|
- password: string;
|
|
|
- roleIds?: number[];
|
|
|
+// 活动实体接口
|
|
|
+export interface Activity {
|
|
|
+ id: number;
|
|
|
+ name: string;
|
|
|
+ type: ActivityType;
|
|
|
+ startDate: Date;
|
|
|
+ endDate: Date;
|
|
|
+ status: ActivityStatus;
|
|
|
+ routes: Route[];
|
|
|
+ createdAt: Date;
|
|
|
+ updatedAt: Date;
|
|
|
}
|
|
|
|
|
|
-// 用户更新DTO
|
|
|
-export interface UpdateUserDto {
|
|
|
- username?: string;
|
|
|
- email?: string | null;
|
|
|
- password?: string;
|
|
|
- roleIds?: number[];
|
|
|
+// 路线实体接口
|
|
|
+export interface Route {
|
|
|
+ id: number;
|
|
|
+ activityId: number;
|
|
|
+ activity: Activity;
|
|
|
+ startPoint: string;
|
|
|
+ endPoint: string;
|
|
|
+ departureTime: Date;
|
|
|
+ vehicleType: VehicleType;
|
|
|
+ maxPassengers: number;
|
|
|
+ price: number;
|
|
|
+ driverPlate: string;
|
|
|
+ driverPhone: string;
|
|
|
+ availableSeats: number;
|
|
|
+ orders: Order[];
|
|
|
+ createdAt: Date;
|
|
|
+ updatedAt: Date;
|
|
|
+}
|
|
|
+
|
|
|
+// 订单实体接口
|
|
|
+export interface Order {
|
|
|
+ id: number;
|
|
|
+ userId: number;
|
|
|
+ user: User;
|
|
|
+ routeId: number;
|
|
|
+ route: Route;
|
|
|
+ activityId: number;
|
|
|
+ activity: Activity;
|
|
|
+ passengerCount: number;
|
|
|
+ totalAmount: number;
|
|
|
+ status: OrderStatus;
|
|
|
+ paymentStatus: PaymentStatus;
|
|
|
+ passengerSnapshots: PassengerSnapshot[];
|
|
|
+ routeSnapshot: RouteSnapshot;
|
|
|
+ passengers: Passenger[];
|
|
|
+ createdAt: Date;
|
|
|
+ updatedAt: Date;
|
|
|
}
|
|
|
|
|
|
-// 文件实体接口
|
|
|
-export interface File {
|
|
|
+// 乘客实体接口
|
|
|
+export interface Passenger {
|
|
|
id: number;
|
|
|
+ userId: number;
|
|
|
+ user: User;
|
|
|
name: string;
|
|
|
- type: string | null;
|
|
|
- size: number | null;
|
|
|
- path: string;
|
|
|
- description: string | null;
|
|
|
- uploadUserId: number;
|
|
|
- uploadUser: User;
|
|
|
- uploadTime: Date;
|
|
|
- lastUpdated: Date | null;
|
|
|
+ idType: IdType; // 证件类型
|
|
|
+ idNumber: string; // 证件号码
|
|
|
+ phone: string;
|
|
|
+ isDefault: boolean;
|
|
|
+ orders: Order[];
|
|
|
createdAt: Date;
|
|
|
updatedAt: Date;
|
|
|
- fullUrl: Promise<string>; // 异步获取预签名URL
|
|
|
}
|
|
|
|
|
|
-// 文件创建DTO
|
|
|
-export interface CreateFileDto {
|
|
|
+// 乘客信息快照接口
|
|
|
+export interface PassengerSnapshot {
|
|
|
name: string;
|
|
|
- type?: string;
|
|
|
- size?: number;
|
|
|
- description?: string;
|
|
|
- uploadUserId: number;
|
|
|
+ idType: IdType; // 证件类型
|
|
|
+ idNumber: string; // 证件号码
|
|
|
+ phone: string;
|
|
|
+ isDefault: boolean;
|
|
|
}
|
|
|
|
|
|
-// 多部分上传策略响应
|
|
|
-export interface MultipartUploadPolicy {
|
|
|
- uploadId: string;
|
|
|
- bucket: string;
|
|
|
- key: string;
|
|
|
- host: string;
|
|
|
- partUrls: string[];
|
|
|
+// 路线信息快照接口
|
|
|
+export interface RouteSnapshot {
|
|
|
+ startPoint: string;
|
|
|
+ endPoint: string;
|
|
|
+ departureTime: Date;
|
|
|
+ vehicleType: VehicleType;
|
|
|
+ maxPassengers: number;
|
|
|
+ price: number;
|
|
|
+ driverPlate: string;
|
|
|
+ driverPhone: string;
|
|
|
}
|
|
|
|
|
|
-// 上传策略响应
|
|
|
-export interface UploadPolicy {
|
|
|
- uploadPolicy: {
|
|
|
- 'x-amz-algorithm': string;
|
|
|
- 'x-amz-credential': string;
|
|
|
- 'x-amz-date': string;
|
|
|
- 'x-amz-security-token'?: string;
|
|
|
- policy: string;
|
|
|
- 'x-amz-signature': string;
|
|
|
- host: string;
|
|
|
- key: string;
|
|
|
- bucket: string;
|
|
|
- };
|
|
|
+// 积分实体接口
|
|
|
+export interface Points {
|
|
|
+ id: number;
|
|
|
+ userId: number;
|
|
|
+ user: User;
|
|
|
+ points: number;
|
|
|
+ earnedPoints: number;
|
|
|
+ usedPoints: number;
|
|
|
+ lastUpdated: Date;
|
|
|
+}
|
|
|
+
|
|
|
+// 枚举定义
|
|
|
+export enum OrderStatus {
|
|
|
+ WAITING_DEPARTURE = '待出发',
|
|
|
+ IN_PROGRESS = '行程中',
|
|
|
+ COMPLETED = '已完成',
|
|
|
+ CANCELLED = '已取消'
|
|
|
+}
|
|
|
+
|
|
|
+export enum PaymentStatus {
|
|
|
+ PENDING = '待支付',
|
|
|
+ PAID = '已支付',
|
|
|
+ FAILED = '支付失败',
|
|
|
+ REFUNDED = '已退款'
|
|
|
+}
|
|
|
+
|
|
|
+export enum VehicleType {
|
|
|
+ CARPOOL = '拼车',
|
|
|
+ BUSINESS = '商务车',
|
|
|
+ CHARTER = '包车'
|
|
|
+}
|
|
|
+
|
|
|
+export enum ActivityType {
|
|
|
+ OUTBOUND = '去程活动',
|
|
|
+ INBOUND = '返程活动'
|
|
|
+}
|
|
|
+
|
|
|
+export enum ActivityStatus {
|
|
|
+ ACTIVE = '进行中',
|
|
|
+ ENDED = '已结束',
|
|
|
+ CANCELLED = '已取消'
|
|
|
+}
|
|
|
+
|
|
|
+export enum IdType {
|
|
|
+ ID_CARD = '身份证',
|
|
|
+ HONG_KONG_MACAO_PASS = '港澳通行证',
|
|
|
+ TAIWAN_PASS = '台湾通行证',
|
|
|
+ PASSPORT = '护照',
|
|
|
+ OTHER = '其他证件'
|
|
|
}
|
|
|
|
|
|
// 分页响应接口
|
|
|
@@ -293,14 +470,25 @@ export interface PaginatedResponse<T> {
|
|
|
|
|
|
### 数据关系
|
|
|
- **User ↔ Role**: 多对多关系,通过中间表关联
|
|
|
+- **User → Order**: 一对多关系,一个用户可以创建多个订单
|
|
|
+- **User → Passenger**: 一对多关系,一个用户可以管理多个乘客
|
|
|
+- **User → Points**: 一对一关系,每个用户有一个积分账户(MVP阶段暂不实现)
|
|
|
+- **Activity → Route**: 一对多关系,一个活动可以关联多条路线
|
|
|
+- **Route → Order**: 一对多关系,一条路线可以有多个订单
|
|
|
+- **Order ↔ Passenger**: 多对多关系,一个订单可以有多个乘客,一个乘客可以出现在多个订单中
|
|
|
- **User → (createdAt, updatedAt)**: 自动时间戳管理
|
|
|
- **Role → permissions**: 字符串数组存储权限列表
|
|
|
|
|
|
+**快照设计说明**:
|
|
|
+- **passengerSnapshots**: 存储下单时的多个乘客信息快照数组,确保订单历史数据完整性
|
|
|
+- **routeSnapshot**: 存储下单时的路线信息快照,防止路线信息变更影响历史订单
|
|
|
+
|
|
|
### Schema集成策略
|
|
|
-- **数据库变更要求**: 新增文件管理表,优化现有表结构
|
|
|
-- **新表**: file表(文件管理)
|
|
|
+- **数据库变更要求**: 新增出行服务数据表,扩展现有用户管理
|
|
|
+- **新表**: activity表(活动管理)、route表(路线管理)、order表(订单管理)、passenger表(乘客管理)
|
|
|
+- **可选表**: points表(积分管理,MVP阶段暂不实现)
|
|
|
- **修改的表**: 无结构性变更
|
|
|
-- **新索引**: 为文件查询字段添加索引(name, uploadUserId, uploadTime)
|
|
|
+- **新索引**: 为订单查询字段添加索引(userId, status, createdAt)、为路线查询字段添加索引(startPoint, endPoint, departureTime)、为活动查询字段添加索引(type, status)
|
|
|
- **迁移策略**: 使用TypeORM迁移工具,确保数据完整性
|
|
|
|
|
|
### 向后兼容性
|