12 KiB
12 KiB
项目结构说明
> 文档版本: v1.0.0 > 创建日期: 2026-05-25 > 适用范围: FischerX 项目开发人员
目录
整体架构
FischerX 采用 Monorepo 架构,使用 Turborepo 作为构建工具,pnpm 作为包管理器。项目分为以下几个主要部分:
FischerX/
├── apps/ # 应用层 - 用户可访问的应用
├── packages/ # 共享包 - 可复用的代码和组件
├── services/ # 后端服务 - API 和业务逻辑
├── infra/ # 基础设施 - Docker、K8s 配置
├── docs/ # 文档 - 项目文档和架构文档
└── tools/ # 工具 - 开发工具和脚本
架构图
graph TB
subgraph "应用层 (apps)"
Web[Web 应用 (Next.js)]
Admin[管理后台 (Next.js)]
Mobile[移动应用 (React Native)]
MiniApp[小程序]
end
subgraph "共享层 (packages)"
Types[类型定义 @fischerx/types]
Constants[常量 @fischerx/constants]
Utils[工具函数 @fischerx/utils]
Config[配置管理 @fischerx/config]
UI[UI 组件库 @fischerx/ui]
Core[核心业务 @fischerx/core]
end
subgraph "服务层 (services)"
API[API 服务 (NestJS)]
Worker[后台任务 Worker]
Realtime[实时通信服务]
end
subgraph "数据层"
PostgreSQL[(PostgreSQL)]
Redis[(Redis)]
Storage[对象存储]
end
Web --> Types
Web --> UI
Web --> Utils
Web --> API
Admin --> Types
Admin --> UI
Admin --> Utils
Admin --> API
API --> Types
API --> Core
API --> PostgreSQL
API --> Redis
API --> Storage
目录结构详解
apps/ - 应用层
包含所有可独立部署的应用程序。
apps/
├── web/ # Web 应用 - 面向用户的主应用
│ ├── src/
│ │ ├── app/ # Next.js App Router 页面
│ │ ├── components/ # 应用专属组件
│ │ ├── hooks/ # 应用专属 Hooks
│ │ ├── lib/ # 工具函数
│ │ └── styles/ # 样式文件
│ ├── public/ # 静态资源
│ └── package.json
│
└── admin/ # 管理后台 - 内部管理系统
├── src/
│ ├── app/
│ ├── components/
│ └── ...
└── package.json
apps/web/ - Web 应用
基于 Next.js 的 Web 应用,提供用户界面。
主要技术栈:
- Next.js 16 (App Router)
- React 18
- TypeScript
- Tailwind CSS
- Shadcn UI
- Zustand (状态管理)
- React Query (数据获取)
- React Hook Form (表单)
端口配置:
- 开发: 3000
- 生产: 3000
apps/admin/ - 管理后台
基于 Next.js 的管理后台,提供内部管理功能。
端口配置:
- 开发: 3001
- 生产: 3001
packages/ - 共享包
包含可在多个应用和服务之间共享的代码。
packages/
├── types/ # 类型定义
│ ├── src/
│ │ └── index.ts
│ └── package.json
│
├── constants/ # 常量定义
│ ├── src/
│ │ └── index.ts
│ └── package.json
│
├── utils/ # 工具函数
│ ├── src/
│ │ └── index.ts
│ └── package.json
│
├── config/ # 配置管理
│ ├── src/
│ │ └── index.ts
│ └── package.json
│
├── ui/ # UI 组件库
│ ├── src/
│ │ ├── components/
│ │ └── index.ts
│ └── package.json
│
└── core/ # 核心业务逻辑
├── src/
│ ├── auth/
│ ├── user/
│ ├── payment/
│ └── index.ts
└── package.json
packages/types/ - 类型定义
包名: @fischerx/types
共享的 TypeScript 类型定义,包括:
- API 请求/响应类型
- 数据库模型类型
- 通用数据类型
使用示例:
import type { User, CreateUserInput } from '@fischerx/types';
packages/constants/ - 常量定义
包名: @fischerx/constants
共享的常量定义,包括:
- 路由常量
- 环境变量键名
- 错误码
- 配置默认值
packages/utils/ - 工具函数
包名: @fischerx/utils
共享的工具函数,包括:
- 日期处理
- 字符串处理
- 数字处理
- 验证函数
packages/config/ - 配置管理
包名: @fischerx/config
共享的配置管理,包括:
- 环境配置
- 应用配置
- 服务配置
packages/ui/ - UI 组件库
包名: @fischerx/ui
共享的 UI 组件库,基于 Shadcn UI,包括:
- 基础组件 (Button, Input, Card 等)
- 复合组件 (Form, Table, Modal 等)
- 布局组件
packages/core/ - 核心业务逻辑
包名: @fischerx/core
共享的核心业务逻辑,包括:
- 认证授权
- 用户管理
- 支付逻辑
- 权限控制
services/ - 后端服务
包含后端服务和 API。
services/
├── api/ # API 服务 - 主 API 服务
│ ├── src/
│ │ ├── controllers/ # 控制器
│ │ ├── services/ # 业务服务
│ │ ├── models/ # 数据模型
│ │ ├── middleware/ # 中间件
│ │ ├── guards/ # 守卫
│ │ ├── filters/ # 过滤器
│ │ ├── interceptors/ # 拦截器
│ │ ├── pipes/ # 管道
│ │ ├── modules/ # 模块
│ │ └── main.ts
│ ├── prisma/ # Prisma Schema
│ │ └── schema.prisma
│ ├── test/ # 测试文件
│ └── package.json
│
├── worker/ # 后台任务 Worker
│ ├── src/
│ │ ├── jobs/ # 任务定义
│ │ └── main.ts
│ └── package.json
│
└── realtime/ # 实时通信服务
├── src/
│ └── main.ts
└── package.json
services/api/ - API 服务
基于 NestJS 的 RESTful API 服务。
主要技术栈:
- NestJS 11
- Prisma 6 (ORM)
- PostgreSQL (数据库)
- Redis (缓存)
- Passport.js (认证)
- JWT (Token)
- Class Validator (验证)
- Swagger (API 文档)
端口配置:
- 开发: 4000
- 生产: 4000
API 文档地址:
services/worker/ - 后台任务
处理异步任务和定时任务。
技术栈:
- NestJS
- Bull (队列)
- Redis
infra/ - 基础设施
包含基础设施配置。
infra/
├── docker/ # Docker 配置
│ ├── docker-compose.yml
│ ├── Dockerfile.api
│ ├── Dockerfile.web
│ └── Dockerfile.admin
│
├── k8s/ # Kubernetes 配置
│ ├── deployments/
│ ├── services/
│ ├── ingresses/
│ └── configmaps/
│
├── terraform/ # Terraform 配置
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
│
└── scripts/ # 脚本
├── deploy.sh
├── backup.sh
└── migrate.sh
docs/ - 文档
包含项目文档。
docs/
├── architecture/ # 架构文档
│ ├── overview.md
│ ├── tech-stack.md
│ ├── module-design.md
│ └── design-decisions/ # ADR
│
├── development/ # 开发文档
│ ├── quick-start.md
│ ├── project-structure.md
│ ├── coding-standards.md
│ ├── best-practices.md
│ ├── troubleshooting.md
│ ├── contributing.md
│ ├── migration-guide.md
│ ├── standards/
│ ├── best-practices/
│ └── guides/
│
├── api/ # API 文档
│ ├── README.md
│ ├── authentication/
│ ├── user/
│ ├── payment/
│ └── error-codes.md
│
├── deployment/ # 部署文档
│ ├── environment-setup.md
│ ├── docker-guide.md
│ ├── kubernetes-guide.md
│ ├── aliyun-guide.md
│ └── ci-cd-pipeline.md
│
├── operations/ # 运维文档
│ ├── monitoring/
│ ├── logging/
│ ├── troubleshooting/
│ └── backup-restore/
│
├── user/ # 用户文档
│ ├── getting-started.md
│ ├── user-manual.md
│ ├── usage-guide/
│ └── faq.md
│
└── templates/ # 文档模板
根目录文件
FischerX/
├── package.json # 根 package.json
├── pnpm-workspace.yaml # pnpm workspace 配置
├── turbo.json # Turborepo 配置
├── tsconfig.json # TypeScript 配置
├── .eslintrc.js # ESLint 配置
├── .prettierrc # Prettier 配置
├── .editorconfig # EditorConfig
├── .gitignore # Git 忽略
├── .env.example # 环境变量示例
├── README.md # 项目说明
├── CHANGELOG.md # 变更日志
├── LICENSE # 许可证
└── .github/ # GitHub 配置
├── workflows/ # GitHub Actions
└── ISSUE_TEMPLATE/ # Issue 模板
Monorepo 工作流
使用 Turborepo
Turborepo 提供了智能的缓存和并行构建功能。
常用命令:
# 运行所有包的 dev 命令
pnpm dev
# 构建所有包
pnpm build
# 运行所有包的 lint
pnpm lint
# 运行所有包的 test
pnpm test
# 清除所有缓存
pnpm clean
过滤特定包
使用 --filter 参数来运行特定包的命令:
# 只运行 web 应用的 dev
pnpm --filter web dev
# 只构建 api 服务
pnpm --filter api build
# 运行所有 packages 下的包
pnpm --filter "@fischerx/*" build
添加依赖
# 在特定包中添加依赖
pnpm --filter web add lodash
# 在特定包中添加开发依赖
pnpm --filter web add -D @types/lodash
# 在工作区根目录添加依赖(所有包共享)
pnpm add -w typescript
# 在包之间添加内部依赖
pnpm --filter web add @fischerx/ui@workspace:*
pnpm --filter api add @fischerx/types@workspace:*
包依赖关系
依赖规则
- 应用层 (apps/) 可以依赖所有共享包和后端服务 API
- 共享包 (packages/) 之间可以相互依赖,但要避免循环依赖
- 服务层 (services/) 可以依赖共享包,但不能依赖应用层
- 所有包 都应该使用
workspace:*来引用内部包
依赖图
apps/web
├── @fischerx/types
├── @fischerx/constants
├── @fischerx/utils
├── @fischerx/config
├── @fischerx/ui
└── @fischerx/core
apps/admin
├── @fischerx/types
├── @fischerx/constants
├── @fischerx/utils
├── @fischerx/config
├── @fischerx/ui
└── @fischerx/core
services/api
├── @fischerx/types
├── @fischerx/constants
├── @fischerx/utils
├── @fischerx/config
└── @fischerx/core
packages/ui
├── @fischerx/types
├── @fischerx/constants
└── @fischerx/utils
packages/core
├── @fischerx/types
├── @fischerx/constants
└── @fischerx/utils
添加新包
添加新应用
# 创建应用目录
mkdir -p apps/new-app
# 初始化 package.json
cd apps/new-app
pnpm init
# 编辑 package.json,添加必要的依赖和脚本
添加新共享包
# 创建包目录
mkdir -p packages/new-package/src
# 初始化 package.json
cd packages/new-package
pnpm init
# 设置包名(使用 @fischerx 前缀)
# package.json: "name": "@fischerx/new-package"
更新 turbo.json
如果需要,在 turbo.json 中配置新包的构建管道。
下一步
> 文档维护: 本文档由开发团队维护,如有问题或建议请提交 Issue。 > 最后更新: 2026-05-25