|
|
@@ -13,25 +13,44 @@ Approve
|
|
|
2. 支持配置路线信息(出发地、目的地、上车点、下车点、出发时间、车型、价格、座位数)
|
|
|
3. 支持设置活动关联的路线
|
|
|
4. 支持启用/禁用活动、路线
|
|
|
+5. 支持创建和管理地点信息(名称、省份、城市、区县、详细地址、经纬度)
|
|
|
|
|
|
## Tasks / Subtasks
|
|
|
- [x] 创建基础数据实体 (AC: 1, 2, 3)
|
|
|
- [x] 在 `src/server/modules/routes/` 创建 `route.entity.ts`
|
|
|
- [x] 在 `src/server/modules/activities/` 创建 `activity.entity.ts`
|
|
|
- [x] 在 `src/share/` 创建相关类型定义
|
|
|
+- [ ] 创建地点实体和关联关系 (AC: 5)
|
|
|
+ - [ ] 在 `src/server/modules/locations/` 创建 `location.entity.ts`
|
|
|
+ - [ ] 更新ActivityEntity,添加venueLocation字段关联LocationEntity
|
|
|
+ - [ ] 更新RouteEntity,添加startLocation和endLocation字段关联LocationEntity
|
|
|
+ - [ ] 在 `src/share/` 创建地点相关类型定义
|
|
|
- [x] 创建Zod Schema (AC: 1, 2, 3, 4)
|
|
|
- [x] 在 `src/server/modules/routes/` 创建 `route.schema.ts` (创建、更新、获取、列表Schema)
|
|
|
- [x] 在 `src/server/modules/activities/` 创建 `activity.schema.ts` (创建、更新、获取、列表Schema)
|
|
|
- [x] 验证Schema符合业务逻辑约束
|
|
|
+- [ ] 创建地点Zod Schema (AC: 5)
|
|
|
+ - [ ] 在 `src/server/modules/locations/` 创建 `location.schema.ts` (创建、更新、获取、列表Schema)
|
|
|
+ - [ ] 更新Activity和Route的Schema,支持地点关联
|
|
|
+ - [ ] 验证地点Schema符合业务逻辑约束
|
|
|
- [x] 数据库迁移和种子数据 (AC: 1, 2, 3, 4)
|
|
|
- [x] 创建数据库迁移文件,添加活动、路线相关表结构
|
|
|
- [x] 创建种子数据,添加示例活动和路线数据
|
|
|
- [x] 验证数据库迁移和种子数据正确性
|
|
|
+- [ ] 地点数据库迁移和种子数据 (AC: 5)
|
|
|
+ - [ ] 创建数据库迁移文件,添加地点表结构
|
|
|
+ - [ ] 更新活动和路线表,添加地点关联字段
|
|
|
+ - [ ] 创建种子数据,添加示例地点数据
|
|
|
+ - [ ] 验证地点数据库迁移和种子数据正确性
|
|
|
- [x] 实现管理后台API (AC: 1, 2, 3, 4)
|
|
|
- [x] 在 `src/server/api/admin/activities/index.ts` 使用 `createCrudRoutes` 创建活动管理API
|
|
|
- [x] 在 `src/server/api/admin/routes/index.ts` 使用 `createCrudRoutes` 创建路线管理API
|
|
|
- [x] 配置搜索字段、关联关系、筛选条件
|
|
|
- [x] 实现启用/禁用功能
|
|
|
+- [ ] 实现地点管理API (AC: 5)
|
|
|
+ - [ ] 在 `src/server/api/admin/locations/index.ts` 使用 `createCrudRoutes` 创建地点管理API
|
|
|
+ - [ ] 配置搜索字段、关联关系、筛选条件
|
|
|
+ - [ ] 更新活动和路线API,支持地点关联查询
|
|
|
- [x] 实现管理后台页面 (AC: 1, 2, 3, 4)
|
|
|
- [x] 创建活动管理页面 - 活动类型配置和管理
|
|
|
- [x] 创建路线管理页面 - 路线信息配置和管理
|
|
|
@@ -40,6 +59,11 @@ Approve
|
|
|
- [x] 实现活动创建和编辑表单
|
|
|
- [x] 实现路线创建和编辑表单
|
|
|
- [x] 实现启用/禁用功能
|
|
|
+- [ ] 实现地点管理页面 (AC: 5)
|
|
|
+ - [ ] 创建地点管理页面 - 地点信息配置和管理
|
|
|
+ - [ ] 实现地点管理页面的搜索和筛选功能
|
|
|
+ - [ ] 实现地点创建和编辑表单
|
|
|
+ - [ ] 更新活动和路线表单,支持地点选择组件
|
|
|
- [x] 编写测试 (AC: 1, 2, 3, 4)
|
|
|
- [x] 管理后台API集成测试 (`tests/integration/server/`)
|
|
|
- [x] 活动管理API CRUD操作测试 (P0)
|
|
|
@@ -58,12 +82,30 @@ Approve
|
|
|
- [x] 路线管理E2E测试 (P1)
|
|
|
- [ ] 搜索筛选E2E测试 (P2)
|
|
|
- [x] 启用禁用操作E2E测试 (P1)
|
|
|
+- [ ] 编写地点管理测试 (AC: 5)
|
|
|
+ - [ ] 管理后台API集成测试 (`tests/integration/server/`)
|
|
|
+ - [ ] 地点管理API CRUD操作测试 (P0)
|
|
|
+ - [ ] 地点搜索和筛选功能测试 (P1)
|
|
|
+ - [ ] 地点关联关系测试 (P1)
|
|
|
+ - [ ] 管理后台页面组件测试 (`tests/integration/client/`)
|
|
|
+ - [ ] LocationManagementPage组件测试 (P1)
|
|
|
+ - [ ] LocationForm组件测试 (P1)
|
|
|
+ - [ ] LocationSelect组件测试 (P1)
|
|
|
+ - [ ] E2E测试 (`tests/e2e/specs/admin/`)
|
|
|
+ - [ ] 地点管理E2E测试 (P1)
|
|
|
- [x] 实现活动选择组件 (AC: 3)
|
|
|
- [x] 创建ActivitySelect组件,支持活动搜索和选择
|
|
|
- [x] 在RouteForm中集成ActivitySelect组件,替换原有的数字输入框
|
|
|
- [x] 实现活动搜索功能,支持按名称搜索
|
|
|
- [x] 实现活动列表展示,显示活动名称和类型
|
|
|
- [x] 添加活动选择验证
|
|
|
+- [ ] 实现地点选择组件 (AC: 5)
|
|
|
+ - [ ] 创建LocationSelect组件,支持地点搜索和选择
|
|
|
+ - [ ] 在ActivityForm中集成LocationSelect组件,选择举办地点
|
|
|
+ - [ ] 在RouteForm中集成LocationSelect组件,选择出发地和目的地
|
|
|
+ - [ ] 实现地点搜索功能,支持按名称、省份、城市搜索
|
|
|
+ - [ ] 实现地点列表展示,显示地点名称和完整地址
|
|
|
+ - [ ] 添加地点选择验证
|
|
|
- [x] 修复表单时间格式问题 (AC: 1, 2, 3, 4)
|
|
|
- [x] 修复活动API响应schema中的时间字段类型
|
|
|
- [x] 修复路线API响应schema中的时间字段类型
|
|
|
@@ -76,21 +118,31 @@ Approve
|
|
|
### 数据模型设计
|
|
|
基于 [docs/prd/epic-005-travel-service-core.md#后端数据模型] 和 [docs/architecture/data-model-schema-changes.md],需要实现以下实体:
|
|
|
|
|
|
-**Route实体** (遵循 [通用CRUD实体设计规范](../architecture/generic-crud-standards.md#实体设计)):
|
|
|
-- 包含上车点、下车点、出发时间、车型、价格、座位数等字段
|
|
|
-- 关联活动实体
|
|
|
+**Location实体** (遵循 [通用CRUD实体设计规范](../architecture/generic-crud-standards.md#实体设计)):
|
|
|
+- 包含地点名称、省份、城市、区县、详细地址、经纬度等字段
|
|
|
- 支持状态管理(启用/禁用)
|
|
|
- 包含 `createdAt` 和 `updatedAt` 时间戳
|
|
|
- 使用TypeORM装饰器定义字段
|
|
|
|
|
|
**Activity实体** (遵循 [通用CRUD实体设计规范](../architecture/generic-crud-standards.md#实体设计)):
|
|
|
- 包含活动名称、描述、类型(去程/返程)、开始日期、结束日期等字段
|
|
|
+- 关联举办地点实体(LocationEntity)
|
|
|
- 关联路线实体
|
|
|
- 支持状态管理(启用/禁用)
|
|
|
- 包含 `createdAt` 和 `updatedAt` 时间戳
|
|
|
- 使用TypeORM装饰器定义字段
|
|
|
|
|
|
+**Route实体** (遵循 [通用CRUD实体设计规范](../architecture/generic-crud-standards.md#实体设计)):
|
|
|
+- 包含上车点、下车点、出发时间、车型、价格、座位数等字段
|
|
|
+- 关联出发地点实体(LocationEntity)
|
|
|
+- 关联目的地点实体(LocationEntity)
|
|
|
+- 关联活动实体
|
|
|
+- 支持状态管理(启用/禁用)
|
|
|
+- 包含 `createdAt` 和 `updatedAt` 时间戳
|
|
|
+- 使用TypeORM装饰器定义字段
|
|
|
+
|
|
|
### 数据库迁移要求
|
|
|
+- 创建 `locations` 表,包含必要的字段和索引
|
|
|
- 创建 `routes` 表,包含必要的字段和索引
|
|
|
- 创建 `activities` 表,包含必要的字段和索引
|
|
|
- 创建关联关系表(如需要)
|
|
|
@@ -99,6 +151,20 @@ Approve
|
|
|
### 管理后台API设计
|
|
|
基于 [docs/prd/epic-005-travel-service-core.md#管理后台API],使用 [通用CRUD规范](../architecture/generic-crud-standards.md) 实现以下API端点:
|
|
|
|
|
|
+**地点管理API** (使用 `createCrudRoutes`):
|
|
|
+- `GET /api/v1/admin/locations` - 地点管理列表(支持分页、搜索、筛选)
|
|
|
+- `GET /api/v1/admin/locations/:id` - 地点详情
|
|
|
+- `POST /api/v1/admin/locations` - 创建地点
|
|
|
+- `PUT /api/v1/admin/locations/:id` - 更新地点
|
|
|
+- `DELETE /api/v1/admin/locations/:id` - 删除地点
|
|
|
+
|
|
|
+**地点管理API配置**:
|
|
|
+- **搜索字段**: `['name', 'province', 'city', 'district', 'address']`
|
|
|
+- **筛选字段**: `province`, `city`, `district`
|
|
|
+- **排序字段**: `name`, `province`, `city`
|
|
|
+- **中间件**: `[authMiddleware]`
|
|
|
+- **Zod Schema**: 创建、更新、获取、列表Schema
|
|
|
+
|
|
|
**活动管理API** (使用 `createCrudRoutes`):
|
|
|
- `GET /api/v1/admin/activities` - 活动管理列表(支持分页、搜索、筛选)
|
|
|
- `GET /api/v1/admin/activities/:id` - 活动详情
|
|
|
@@ -108,7 +174,7 @@ Approve
|
|
|
|
|
|
**活动管理API配置**:
|
|
|
- **搜索字段**: `['name', 'description']`
|
|
|
-- **关联关系**: `['routes']`
|
|
|
+- **关联关系**: `['routes', 'venueLocation']`
|
|
|
- **筛选字段**: `type` (活动类型)
|
|
|
- **中间件**: `[authMiddleware]`
|
|
|
- **Zod Schema**: 创建、更新、获取、列表Schema
|
|
|
@@ -121,13 +187,33 @@ Approve
|
|
|
- `DELETE /api/v1/admin/routes/:id` - 删除路线
|
|
|
|
|
|
**路线管理API配置**:
|
|
|
-- **搜索字段**: `['startPoint', 'endPoint', 'vehicleType']`
|
|
|
-- **关联关系**: `['activity']`
|
|
|
+- **搜索字段**: `['vehicleType']`
|
|
|
+- **关联关系**: `['activity', 'startLocation', 'endLocation']`
|
|
|
- **筛选字段**: `vehicleType`, `price` (范围查询)
|
|
|
- **排序字段**: `price`, `departureTime`
|
|
|
- **中间件**: `[authMiddleware]`
|
|
|
- **Zod Schema**: 创建、更新、获取、列表Schema
|
|
|
|
|
|
+### 地点选择组件设计
|
|
|
+基于地点实体设计方案,需要实现地点选择组件来提升用户体验:
|
|
|
+
|
|
|
+**LocationSelect组件功能要求**:
|
|
|
+- 支持地点搜索和选择,提升用户体验
|
|
|
+- 显示地点名称和完整地址信息(省份+城市+区县)
|
|
|
+- 支持按地点名称、省份、城市搜索
|
|
|
+- 集成到ActivityForm中,选择举办地点
|
|
|
+- 集成到RouteForm中,选择出发地和目的地
|
|
|
+- 遵循管理后台组件设计规范
|
|
|
+
|
|
|
+**组件位置**:
|
|
|
+- `src/client/admin/components/LocationSelect.tsx`
|
|
|
+
|
|
|
+**集成要求**:
|
|
|
+- 在ActivityForm中替换现有的venue输入字段
|
|
|
+- 在RouteForm中替换现有的startPoint和endPoint输入字段
|
|
|
+- 保持与现有表单验证的兼容性
|
|
|
+- 支持地点列表的异步加载和搜索
|
|
|
+
|
|
|
### 活动选择组件设计
|
|
|
基于用户体验改进需求,需要实现活动选择组件来替换原有的数字ID输入框:
|
|
|
|
|
|
@@ -149,6 +235,17 @@ Approve
|
|
|
### 管理后台页面设计
|
|
|
基于 [docs/prd/epic-005-travel-service-core.md#管理后台页面任务],需要实现以下页面:
|
|
|
|
|
|
+**地点管理页面**:
|
|
|
+- 地点信息配置和管理
|
|
|
+- 支持创建、编辑、删除地点
|
|
|
+- 支持启用/禁用地点
|
|
|
+- 配置地点名称、省份、城市、区县、详细地址、经纬度
|
|
|
+- 遵循 [管理后台页面结构标准](../architecture/admin-dashboard-standards.md#页面结构标准)
|
|
|
+- 使用 [数据表格规范](../architecture/admin-dashboard-standards.md#数据表格规范) 显示地点列表
|
|
|
+- 实现 [搜索和筛选功能](../architecture/admin-dashboard-standards.md#搜索和筛选规范) 支持按省份、城市、区县筛选
|
|
|
+- 使用 [表单处理规范](../architecture/admin-dashboard-standards.md#表单处理规范) 处理地点创建和编辑
|
|
|
+- 严格遵循 [RPC Client 使用规范](../architecture/admin-dashboard-standards.md#rpc-client-使用规范)
|
|
|
+
|
|
|
#### 前端RPC实现规范
|
|
|
严格遵循 [RPC Client 使用规范](../architecture/admin-dashboard-standards.md#rpc-client-使用规范):
|
|
|
|
|
|
@@ -256,21 +353,27 @@ const debouncedSearch = useCallback(
|
|
|
|
|
|
### 文件位置
|
|
|
- **后端实体**:
|
|
|
+ - `src/server/modules/locations/location.entity.ts`
|
|
|
- `src/server/modules/routes/route.entity.ts`
|
|
|
- `src/server/modules/activities/activity.entity.ts`
|
|
|
- **Zod Schema** (遵循 [Schema设计规范](../architecture/generic-crud-standards.md#schema-设计)):
|
|
|
+ - `src/server/modules/locations/location.schema.ts`
|
|
|
- `src/server/modules/routes/route.schema.ts`
|
|
|
- `src/server/modules/activities/activity.schema.ts`
|
|
|
- **共享类型**:
|
|
|
+ - `src/share/location.types.ts`
|
|
|
- `src/share/route.types.ts`
|
|
|
- `src/share/activity.types.ts`
|
|
|
- **管理后台API** (使用 [createCrudRoutes](../architecture/generic-crud-standards.md#createcrudroutes)):
|
|
|
+ - `src/server/api/admin/locations/index.ts`
|
|
|
- `src/server/api/admin/activities/index.ts`
|
|
|
- `src/server/api/admin/routes/index.ts`
|
|
|
- **管理后台页面** (遵循 [文件组织规范](../architecture/admin-dashboard-standards.md#文件组织)):
|
|
|
+ - `mini/src/pages/admin/locations/LocationManagementPage.tsx`
|
|
|
- `mini/src/pages/admin/activities/ActivityManagementPage.tsx`
|
|
|
- `mini/src/pages/admin/routes/RouteManagementPage.tsx`
|
|
|
-- **活动选择组件**:
|
|
|
+- **选择组件**:
|
|
|
+ - `src/client/admin/components/LocationSelect.tsx`
|
|
|
- `src/client/admin/components/ActivitySelect.tsx`
|
|
|
- **数据库迁移**: `src/server/migrations/` 目录
|
|
|
- **种子数据**: `src/server/seeds/` 目录
|
|
|
@@ -329,6 +432,7 @@ const debouncedSearch = useCallback(
|
|
|
## Change Log
|
|
|
| Date | Version | Description | Author |
|
|
|
|------|---------|-------------|--------|
|
|
|
+| 2025-10-17 | 3.0 | 添加地点实体设计方案,支持省市区结构化地址管理,优化活动实体设计 | John (PM) |
|
|
|
| 2025-10-16 | 2.0 | 修复TypeScript类型错误,提升代码质量:修复Schema定义、枚举类型、filters参数格式,移除所有any类型使用 | James (Dev Agent) |
|
|
|
| 2025-10-16 | 1.9 | 完成活动管理和路线管理E2E测试,实现完整的测试覆盖 | James (Dev Agent) |
|
|
|
| 2025-10-16 | 1.8 | 修复表单时间格式问题,补充日期时间处理规范 | Winston (Architect) |
|
|
|
@@ -353,6 +457,11 @@ Claude Sonnet 4.5 (2025-09-29)
|
|
|
- 检查并验证了管理后台API的实现
|
|
|
- 检查并验证了管理后台页面的实现
|
|
|
- 修复TypeScript类型错误:Schema定义、枚举类型、filters参数格式、any类型使用
|
|
|
+- 分析活动实体设计问题,识别缺少举办地点字段和去程/返程逻辑冗余
|
|
|
+- 设计地点实体方案,支持省市区结构化地址管理
|
|
|
+- 优化活动实体设计,添加venueLocation字段关联LocationEntity
|
|
|
+- 优化路线实体设计,添加startLocation和endLocation字段关联LocationEntity
|
|
|
+- 设计去程/返程动态判断逻辑:目的地=活动地点为去程,出发地=活动地点为返程
|
|
|
|
|
|
### Completion Notes List
|
|
|
✅ **已完成的任务:**
|