将 mini-auth-demo 项目中开发的高度通用模块(地区、地点、小程序认证、支付、乘客管理)从 /mini-auth-demo/packages/server/src 拆分反哺到主项目的 /packages 目录下,以独立 package 方式组织,为未来继承该 starter 的项目提供按需使用的可复用基础模块,同时保持模块的独立性和向后兼容性。
Current relevant functionality:
Technology stack:
Integration points:
What's being added/changed:
Package 架构设计:
packages/
├── server/ # 核心服务器 (现有,重构后)
├── shared-types/ # 共享类型定义 (新增)
├── shared-utils/ # 工具核心 (新增)
├── shared-crud/ # CRUD核心基础设施 (新增)
├── shared-test-util/ # 测试基础设施 (新增)
├── user-module/ # 用户管理模块 (新增)
├── auth-module/ # 认证管理模块 (已包含小程序认证功能)
├── file-module/ # 文件管理模块 (新增)
├── mini-payment/ # 小程序支付 (待实现)
├── geo-areas/ # 地区模块 (待实现)
├── geo-locations/ # 地点模块 (待实现)
└── passenger-management/ # 乘客管理 (待实现)
How it integrates:
Success criteria:
Primary Risk: 数据库 schema 变更可能影响现有数据 Mitigation: 使用 TypeORM migrations 管理数据库变更,确保数据迁移安全 Rollback Plan: 保留数据库备份,提供回滚脚本,模块化设计便于独立禁用
Primary Risk: 小程序认证与现有认证系统冲突 Mitigation: 扩展现有认证服务,提供多种认证方式共存 Rollback Plan: 保持原有认证方式不变,小程序认证作为可选功能
Primary Risk: Package 依赖关系复杂化 Mitigation: 设计清晰的依赖层次,基础设施package作为基础依赖 Rollback Plan: 保持核心 server package 独立,其他 package 可选择性移除
Primary Risk: 基础设施重构影响现有功能 Mitigation: 分阶段重构,每个阶段完成后进行回归测试 Rollback Plan: 保留重构前的代码备份,提供快速回滚方案
packages/
├── server/ # 核心服务器 (现有,重构后)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── shared-types/ # 共享类型定义 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── shared-utils/ # 工具核心 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── shared-crud/ # CRUD核心基础设施 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── shared-test-util/ # 测试基础设施 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── user-module/ # 用户管理模块 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── auth-module/ # 认证管理模块 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── file-module/ # 文件管理模块 (新增)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── mini-auth/ # 小程序认证增强 (待实现)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── mini-payment/ # 小程序支付 (待实现)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── geo-areas/ # 地区模块 (待实现)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── geo-locations/ # 地点模块 (待实现)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
└── passenger-management/ # 乘客管理 (待实现)
├── src/
├── package.json
└── tsconfig.json
shared-types (基础类型)
↑
shared-utils (工具基础设施)
↑
shared-crud (CRUD基础设施) + shared-test-util (测试基础设施)
↑
业务模块 (user-module, auth-module, file-module)
↑
server (应用入口)
shared-crud package
{
"name": "@d8d/shared-crud",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"@d8d/shared-utils": "workspace:*",
"typeorm": "^0.3.20",
"@hono/zod-openapi": "1.0.2",
"zod": "^4.1.12"
}
}
shared-utils package
{
"name": "@d8d/shared-utils",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"jsonwebtoken": "^9.0.2",
"bcrypt": "^6.0.0",
"typeorm": "^0.3.20",
"pg": "^8.16.3"
}
}
shared-test-util package
{
"name": "@d8d/shared-test-util",
"dependencies": {
"@d8d/shared-utils": "workspace:*",
"typeorm": "^0.3.20",
"vitest": "^3.2.4"
},
"peerDependencies": {
"hono": "^4.8.5"
}
}
shared-types package
{
"name": "@d8d/shared-types",
"dependencies": {
// 纯类型定义,不需要外部依赖
}
}
user-module package
{
"name": "@d8d/user-module",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"@d8d/shared-utils": "workspace:*",
"@d8d/shared-crud": "workspace:*",
"typeorm": "^0.3.20"
},
"devDependencies": {
"@d8d/shared-test-util": "workspace:*"
}
}
auth-module package
{
"name": "@d8d/auth-module",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"@d8d/shared-utils": "workspace:*",
"@d8d/user-module": "workspace:*",
"typeorm": "^0.3.20"
},
"devDependencies": {
"@d8d/shared-test-util": "workspace:*"
}
}
file-module package
{
"name": "@d8d/file-module",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"@d8d/shared-utils": "workspace:*",
"@d8d/shared-crud": "workspace:*",
"typeorm": "^0.3.20"
},
"devDependencies": {
"@d8d/shared-test-util": "workspace:*"
}
}
重构后的 server package
{
"name": "@d8d/server",
"dependencies": {
"@d8d/shared-types": "workspace:*",
"@d8d/shared-utils": "workspace:*",
"@d8d/shared-crud": "workspace:*",
"@d8d/user-module": "workspace:*",
"@d8d/auth-module": "workspace:*",
"@d8d/file-module": "workspace:*",
// 其他现有依赖保持不变
}
}
// 基础工具类型
export type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
// 通用响应类型
export interface ApiResponse<T> {
data: T;
message?: string;
code?: number;
}
// 分页类型
export interface Pagination {
total: number;
current: number;
pageSize: number;
}
// 通用查询参数
export interface QueryParams {
page?: number;
pageSize?: number;
keyword?: string;
sortBy?: string;
sortOrder?: 'ASC' | 'DESC';
}
// 通用错误类型
export interface ApiError {
code: number;
message: string;
details?: any;
}
每个模块 package 遵循统一的导出模式,业务相关类型放在各自package中:
// 实体
export { AreaEntity } from './entities/area.entity';
// 服务
export { AreaService } from './services/area.service';
// DTOs
export { CreateAreaDto, UpdateAreaDto } from './dto/area.dto';
// 控制器
export { AreaController } from './controllers/area.controller';
// 路由
export { areaRoutes } from './routes/area.routes';
// 业务相关类型 (放在各自package中)
export type { Area, AreaLevel } from './types/area.types';
geo-areas package 中的类型
// 地区相关类型
export interface Area {
id: string;
name: string;
code: string;
level: number;
parentId?: string;
}
export type AreaLevel = 1 | 2 | 3; // 省市区
geo-locations package 中的类型
// 地点相关类型
export interface Location {
id: string;
name: string;
latitude: number;
longitude: number;
areaId: string;
}
mini-auth package 中的类型
// 小程序认证相关类型
export interface MiniAuthUser {
openid: string;
unionid?: string;
sessionKey: string;
}
// package.json - 只需要地区功能
{
"dependencies": {
"@d8d/server": "^1.0.0",
"@d8d/geo-areas": "^1.0.0"
}
}
// package.json - 需要完整地理位置功能
{
"dependencies": {
"@d8d/server": "^1.0.0",
"@d8d/geo-areas": "^1.0.0",
"@d8d/geo-locations": "^1.0.0"
}
}
// package.json - 需要小程序生态功能
{
"dependencies": {
"@d8d/server": "^1.0.0",
"@d8d/mini-auth": "^1.0.0",
"@d8d/mini-payment": "^1.0.0"
}
}
// 只导入需要的模块和类型
import { AreaService, type Area } from '@d8d/geo-areas';
import { LocationService, type Location } from '@d8d/geo-locations';
import { MiniAuthService, type MiniAuthUser } from '@d8d/mini-auth';
// 使用通用类型
import type { ApiResponse, Pagination } from '@d8d/shared-types';
// 或者从 server 统一导入
import {
AreaService,
LocationService,
MiniAuthService
} from '@d8d/server';
阶段 2: 业务模块 Package 化 - 待实现
Story 5: 地理位置和乘客模块 package (geo-locations, passenger-management)
"请为这个brownfield epic开发详细的用户故事。关键考虑因素:
该epic应该保持系统完整性,同时实现将mini-auth-demo项目中的通用模块(地区、地点、小程序认证、支付、乘客管理)标准化并集成到主项目的目标。"