| 字段 | 值 |
|---|---|
| 史诗 | Epic 010: 统一广告管理系统 |
| 状态 | Ready for Review |
| 优先级 | 中 |
| 故事类型 | 修复 (Bug Fix) |
| 工作量 | 1小时 |
| 负责人 | - |
| 创建日期 | 2026-01-03 |
统一广告模块 (unified-advertisements-module) 的路由定义中缺少 params schema 定义,导致 RPC 客户端推断出的 :id 参数类型为 string,而不是 number。这违反了后端模块开发规范,需要在路由 schema 中添加 params 定义,使用 z.coerce.number() 进行类型转换。
String(id))createCrudRoutes 的开发规范故事 010.001 实施时,路由定义使用的是手动方式而非 createCrudRoutes,没有在 schema 中定义 request.params,导致 Hono RPC 客户端无法正确推断参数类型。
/:id 操作都包含 params schema 定义params 使用 z.coerce.number<number>() 进行类型转换:id 参数为 number 类型unified-advertisements.admin.routes.ts
getRoute 添加 request.params 定义updateRoute 添加 request.params 定义deleteRoute 添加 request.params 定义unified-advertisement-types.admin.routes.ts
getRoute 添加 request.params 定义updateRoute 添加 request.params 定义deleteRoute 添加 request.params 定义unified-advertisement-management-ui 组件
String(id) 类型转换对比项目 createCrudRoutes 的正确实现方式:
正确示例 (createCrudRoutes):
const getRouteDef = createRoute({
method: 'get',
path: '/{id}',
middleware,
request: {
params: z.object({
id: z.coerce.number<number>().openapi({
param: { name: 'id', in: 'path' },
example: 1,
description: '资源ID'
})
})
},
// ...
});
错误示例 (修复前的 unified-advertisements-module):
const getRoute = createRoute({
method: 'get',
path: '/:id',
middleware: [tenantAuthMiddleware] as const,
// ❌ 缺少 request.params 定义
responses: { /* ... */ }
});
正确示例 (修复后):
const getRoute = createRoute({
method: 'get',
path: '/:id',
middleware: [tenantAuthMiddleware] as const,
request: {
params: z.object({
id: z.coerce.number<number>().openapi({
param: { name: 'id', in: 'path' },
example: 1,
description: '广告ID'
})
})
},
responses: { /* ... */ }
});
packages/unified-advertisements-module/src/routes/admin/unified-advertisements.admin.routes.tspackages/unified-advertisements-module/src/routes/admin/unified-advertisement-types.admin.routes.tspackages/unified-advertisement-management-ui/src/components/UnifiedAdvertisementManagement.tsxpackages/unified-advertisement-management-ui/src/components/UnifiedAdvertisementTypeManagement.tsxpackages/unified-advertisements-module/tests/integration/unified-advertisements.integration.test.ts后端变更:
:id 的路由中添加 request.params 定义z.coerce.number<number>() 将字符串参数转换为数字前端变更:
String(id) 类型转换,直接传递 number 类型# 后端模块测试
pnpm --filter @d8d/unified-advertisements-module test
# 前端 UI 包类型检查
pnpm --filter @d8d/unified-advertisement-management-ui typecheck
已成功修复统一广告模块的路由参数类型规范问题。所有 /:id 路由现在都正确包含 request.params 定义,使用 z.coerce.number<number>() 进行类型转换。
packages/unified-advertisements-module/src/routes/admin/unified-advertisements.admin.routes.tspackages/unified-advertisements-module/src/routes/admin/unified-advertisement-types.admin.routes.tspackages/unified-advertisement-management-ui/src/components/UnifiedAdvertisementManagement.tsxpackages/unified-advertisement-management-ui/src/components/UnifiedAdvertisementTypeManagement.tsx