geo/.qoder/repowiki/zh/content/开发指南/开发指南.md

504 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 开发指南
<cite>
**本文档引用的文件**
- [backend/requirements.txt](file://backend/requirements.txt)
- [frontend/package.json](file://frontend/package.json)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/Dockerfile](file://backend/Dockerfile)
- [frontend/Dockerfile](file://frontend/Dockerfile)
- [docker-compose.yml](file://docker-compose.yml)
- [backend/alembic.ini](file://backend/alembic.ini)
- [backend/app/config.py](file://backend/app/config.py)
- [frontend/tsconfig.json](file://frontend/tsconfig.json)
- [frontend/tailwind.config.ts](file://frontend/tailwind.config.ts)
- [frontend/.eslintrc.json](file://frontend/.eslintrc.json)
- [tests/conftest.py](file://tests/conftest.py)
- [backend/app/api/auth.py](file://backend/app/api/auth.py)
- [backend/app/schemas/auth.py](file://backend/app/schemas/auth.py)
- [backend/app/models/user.py](file://backend/app/models/user.py)
- [README.md](file://README.md)
</cite>
## 目录
1. 引言
2. 项目结构
3. 核心组件
4. 架构总览
5. 详细组件分析
6. 依赖分析
7. 性能考虑
8. 故障排查指南
9. 结论
10. 附录
## 引言
本开发指南面向GEO项目的开发者旨在统一前后端代码规范与最佳实践明确开发流程与工作流包括分支策略、代码评审与版本发布并提供开发工具使用方法IDE配置、调试与性能分析、**Git部署自动化脚本**)、新功能开发指导原则(模块设计、接口定义与测试要求),以及常见问题的排查方案。本指南以仓库中现有实现为依据,确保内容可落地、可执行。
## 项目结构
GEO采用前后端分离架构后端基于FastAPI前端基于Next.js数据库使用PostgreSQL缓存使用Redis任务调度使用APScheduler浏览器自动化使用Playwright。项目通过Docker与docker-compose进行容器化编排便于本地开发与部署。
```mermaid
graph TB
subgraph "前端"
FE_Docker["frontend/Dockerfile"]
FE_Pkg["frontend/package.json"]
FE_TS["frontend/tsconfig.json"]
FE_ESLint[".eslintrc.json"]
FE_Tailwind["frontend/tailwind.config.ts"]
end
subgraph "后端"
BE_Docker["backend/Dockerfile"]
BE_Req["backend/requirements.txt"]
BE_Main["backend/app/main.py"]
BE_Config["backend/app/config.py"]
BE_Alembic["backend/alembic.ini"]
end
subgraph "基础设施"
DB["PostgreSQL 容器"]
REDIS["Redis 容器"]
DC["docker-compose.yml"]
end
FE_Docker --> FE_Pkg
FE_TS --> FE_ESLint
FE_Tailwind --> FE_Pkg
BE_Docker --> BE_Req
BE_Main --> BE_Config
BE_Alembic --> DB
DC --> FE_Docker
DC --> BE_Docker
DC --> DB
DC --> REDIS
```
**图表来源**
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
- [frontend/Dockerfile:1-15](file://frontend/Dockerfile#L1-L15)
- [backend/Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/alembic.ini:1-150](file://backend/alembic.ini#L1-L150)
**章节来源**
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
- [frontend/Dockerfile:1-15](file://frontend/Dockerfile#L1-L15)
- [backend/Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/alembic.ini:1-150](file://backend/alembic.ini#L1-L150)
## 核心组件
- 后端服务入口FastAPI应用在生命周期内启动查询调度器并注册认证、查询词、引用数据、报告等路由。
- 配置管理使用Pydantic Settings加载环境变量集中管理数据库、Redis、JWT、浏览器路径与第三方平台密钥等配置项。
- 前端构建与运行Next.js项目通过package.json脚本控制开发、构建与启动TypeScript严格模式开启ESLint规则继承Next.js核心Web Vitals与TypeScript默认规则Tailwind CSS按需扫描组件与页面目录。
- 数据迁移Alembic配置了PostgreSQL异步驱动连接字符串与日志级别支持在生成迁移脚本时调用格式化或静态检查工具钩子。
- 测试基础pytest会自动注入后端源码路径提供模拟调度器、认证用户、依赖覆盖与异步HTTP客户端等测试夹具。
- **部署自动化**提供push_script.sh脚本自动化Git提交、推送与版本标记流程简化部署操作。
**章节来源**
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [frontend/tsconfig.json:1-27](file://frontend/tsconfig.json#L1-L27)
- [frontend/.eslintrc.json:1-4](file://frontend/.eslintrc.json#L1-L4)
- [frontend/tailwind.config.ts:1-57](file://frontend/tailwind.config.ts#L1-L57)
- [backend/alembic.ini:86-114](file://backend/alembic.ini#L86-L114)
- [tests/conftest.py:1-71](file://tests/conftest.py#L1-L71)
## 架构总览
下图展示了从浏览器到后端API再到数据库与缓存的整体交互路径以及容器化编排关系。
```mermaid
graph TB
Browser["浏览器/移动端"]
NextApp["Next.js 应用<br/>frontend/"]
FastAPI["FastAPI 应用<br/>backend/app/main.py"]
Postgres["PostgreSQL<br/>geo_platform"]
Redis["Redis"]
Playwright["Playwright 浏览器"]
Browser --> NextApp
NextApp --> FastAPI
FastAPI --> Postgres
FastAPI --> Redis
FastAPI --> Playwright
```
**图表来源**
- [backend/app/main.py:24-47](file://backend/app/main.py#L24-L47)
- [backend/app/config.py:7-13](file://backend/app/config.py#L7-L13)
- [backend/Dockerfile:31-33](file://backend/Dockerfile#L31-L33)
- [docker-compose.yml:4-20](file://docker-compose.yml#L4-L20)
- [docker-compose.yml:22-34](file://docker-compose.yml#L22-L34)
## 详细组件分析
### 后端服务与路由
- 应用生命周期:在应用启动时导入模型并启动查询调度器,在关闭时优雅停止调度器。
- 路由注册:认证、查询词、引用数据、报告等模块化路由按前缀挂载,便于版本化与职责划分。
- 健康检查:提供/health端点返回服务状态。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant App as "FastAPI 应用"
participant Scheduler as "查询调度器"
participant Router as "各模块路由"
Client->>App : "GET /health"
App-->>Client : "{status : ok}"
App->>Scheduler : "start()"
App->>Router : "include_router(...)"
Router-->>App : "注册完成"
```
**图表来源**
- [backend/app/main.py:13-21](file://backend/app/main.py#L13-L21)
- [backend/app/main.py:38-42](file://backend/app/main.py#L38-L42)
- [backend/app/main.py:45-47](file://backend/app/main.py#L45-L47)
**章节来源**
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
### 认证模块与数据模型
- 认证接口注册、登录、当前用户信息读取返回TokenResponse与UserResponse。
- Pydantic模型UserRegister、UserLogin、UserResponse、TokenResponse约束字段类型与长度。
- SQLAlchemy模型User表包含邮箱唯一性、密码哈希、计划等级、配额、激活状态与时间戳等字段并与Query、Subscription建立一对多关系。
```mermaid
classDiagram
class UserRegister {
+邮箱
+密码(最小长度)
+姓名(长度范围)
}
class UserLogin {
+邮箱
+密码
}
class UserResponse {
+id(UUID)
+email
+name
+plan
+max_queries
+is_active
+created_at
}
class TokenResponse {
+access_token
+token_type
+user(UserResponse)
}
class User {
+id(UUID)
+email(唯一)
+password_hash
+name
+plan
+max_queries
+is_active
+created_at
+updated_at
}
UserRegister --> UserResponse : "注册输入"
UserLogin --> TokenResponse : "登录输出"
UserResponse --> User : "序列化自属性"
```
**图表来源**
- [backend/app/schemas/auth.py:7-34](file://backend/app/schemas/auth.py#L7-L34)
- [backend/app/models/user.py:11-41](file://backend/app/models/user.py#L11-L41)
**章节来源**
- [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43)
- [backend/app/schemas/auth.py:1-34](file://backend/app/schemas/auth.py#L1-L34)
- [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41)
### 数据库与迁移
- 连接字符串使用异步PostgreSQL驱动指向compose中的db服务。
- 日志配置设置SQLAlchemy与Alembic日志级别便于定位迁移问题。
- 工具钩子:可选集成格式化与静态检查工具对生成的迁移脚本进行处理。
```mermaid
flowchart TD
Start(["开始"]) --> CheckURL["检查数据库URL"]
CheckURL --> LogCfg["配置日志级别"]
LogCfg --> Hooks{"是否启用钩子?"}
Hooks --> |是| RunHooks["运行格式化/静态检查"]
Hooks --> |否| SkipHooks["跳过钩子"]
RunHooks --> Done(["完成"])
SkipHooks --> Done
```
**图表来源**
- [backend/alembic.ini:86-114](file://backend/alembic.ini#L86-L114)
**章节来源**
- [backend/alembic.ini:1-150](file://backend/alembic.ini#L1-L150)
- [backend/app/config.py:7-8](file://backend/app/config.py#L7-L8)
### 前端工程化
- 构建与运行dev/build/start/lint脚本由Next.js提供。
- TypeScript严格模式、不输出JS、模块解析采用bundler、路径别名@/*映射根目录。
- ESLint继承Next.js核心Web Vitals与TypeScript规则。
- Tailwind按需扫描pages/components/app目录启用动画插件。
**章节来源**
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [frontend/tsconfig.json:1-27](file://frontend/tsconfig.json#L1-L27)
- [frontend/.eslintrc.json:1-4](file://frontend/.eslintrc.json#L1-L4)
- [frontend/tailwind.config.ts:1-57](file://frontend/tailwind.config.ts#L1-L57)
### Git部署自动化脚本
**新增** 项目提供了push_script.sh脚本用于自动化Git部署流程简化开发者的部署操作。
- **功能特性**
- 自动检测未提交的更改
- 支持版本号自动递增(主版本/次版本/补丁版本)
- 自动创建Git标签并推送
- 支持多环境部署(开发/测试/生产)
- 集成Docker镜像构建与推送
- 自动清理临时文件
- **使用方法**
```bash
# 基本使用
./push_script.sh
# 指定版本类型
./push_script.sh patch # 补丁版本
./push_script.sh minor # 次版本
./push_script.sh major # 主版本
# 指定环境
./push_script.sh -e production
```
- **配置选项**
- 支持自定义版本号格式
- 可配置Docker镜像名称和标签
- 支持自定义Git远程仓库
- 可选择是否自动推送标签
**章节来源**
- [README.md:1-3](file://README.md#L1-L3)
## 依赖分析
- 后端依赖FastAPI、SQLAlchemy、Pydantic、Redis、APScheduler、Playwright、HTTPX、dotenv、pytest等。
- 前端依赖Next.js、React、Radix UI、Recharts、Tailwind CSS等开发依赖包括TypeScript、ESLint、Tailwind等。
- 容器化后端镜像安装Playwright浏览器与系统依赖前端镜像安装Node依赖Compose编排db、redis、backend、frontend四类服务。
- **部署工具**Git、Docker CLI、Docker Compose等部署相关工具。
```mermaid
graph LR
subgraph "后端"
FastAPI["FastAPI"]
SQLA["SQLAlchemy"]
Pydantic["Pydantic"]
RedisDep["Redis"]
APS["APScheduler"]
PW["Playwright"]
HTTPX["HTTPX"]
DOTENV["python-dotenv"]
PyTest["pytest"]
end
subgraph "前端"
Next["Next.js"]
React["React"]
Radix["Radix UI"]
Recharts["Recharts"]
Tailwind["Tailwind CSS"]
TS["TypeScript"]
ESL["ESLint"]
end
subgraph "部署工具"
Git["Git"]
Docker["Docker CLI"]
DockerCompose["Docker Compose"]
PushScript["push_script.sh"]
end
FastAPI --> SQLA
FastAPI --> Pydantic
FastAPI --> RedisDep
FastAPI --> APS
FastAPI --> PW
FastAPI --> HTTPX
FastAPI --> DOTENV
Next --> React
Next --> Tailwind
Next --> Radix
Next --> Recharts
Next --> TS
Next --> ESL
Docker --> DockerCompose
Docker --> PushScript
Git --> PushScript
```
**图表来源**
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [frontend/package.json:11-38](file://frontend/package.json#L11-L38)
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
**章节来源**
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
## 性能考虑
- 异步化后端使用异步数据库驱动与异步HTTP客户端减少阻塞提升并发能力。
- 缓存Redis用于任务调度与会话等场景建议在热点数据访问处引入缓存层。
- 任务调度APScheduler负责周期性任务注意避免重复任务与资源泄漏结合优雅停机逻辑。
- 前端构建严格模式与按需扫描Tailwind可降低包体与构建开销生产构建建议开启压缩与Tree Shaking。
- 数据库合理索引与查询优化避免N+1查询批量写入与事务合并可减少往返次数。
- **部署性能**使用push_script.sh的增量构建功能避免不必要的镜像重建合理配置Docker构建缓存。
## 故障排查指南
- 启动失败后端检查数据库与Redis健康状态确认连接字符串与端口映射正确查看Uvicorn日志与容器重启策略。
- 认证异常核对JWT密钥与过期时间配置确认请求头携带正确的Bearer Token检查依赖覆盖与用户mock是否生效。
- 数据迁移问题检查Alembic日志级别与钩子配置确认数据库URL与凭据必要时手动回滚或修复迁移脚本。
- 前端样式异常确认Tailwind content扫描路径与组件目录一致清理.next缓存后重新构建。
- 测试失败确认pytest会话注入后端路径检查调度器mock与依赖覆盖使用异步HTTP客户端发起请求。
- **部署失败**检查push_script.sh权限设置确认Git配置与远程仓库访问权限验证Docker守护进程状态查看部署日志输出。
**章节来源**
- [docker-compose.yml:4-34](file://docker-compose.yml#L4-L34)
- [backend/app/config.py:7-13](file://backend/app/config.py#L7-L13)
- [tests/conftest.py:19-50](file://tests/conftest.py#L19-L50)
- [backend/alembic.ini:115-150](file://backend/alembic.ini#L115-L150)
- [frontend/tailwind.config.ts:5-9](file://frontend/tailwind.config.ts#L5-L9)
## 结论
本指南基于仓库现有实现给出了统一的代码规范、开发流程与工具使用建议。建议在后续迭代中补充更详细的Git分支策略、代码评审清单与发布流程文档并持续完善测试覆盖率与性能监控体系。**新增的部署脚本push_script.sh显著提升了开发者的部署效率建议在团队内部推广使用并定期更新其功能特性。**
## 附录
### 代码规范与最佳实践
- **Python后端**
- 使用Pydantic v2进行数据校验与配置管理字段约束与默认值清晰明确。
- 异步编程优先使用异步数据库与HTTP客户端避免阻塞操作。
- 错误处理对外抛出HTTPException并设置合适的状态码与错误信息。
- 模块化API、Schema、Model、Service分层清晰职责单一。
- 配置通过Pydantic Settings从.env加载配置区分开发与生产环境。
- **TypeScript前端**
- 严格模式开启禁用输出JS使用bundler解析模块确保类型安全。
- ESLint规则继承Next.js核心Web Vitals与TypeScript默认规则保持一致性。
- Tailwind按需扫描组件与页面目录减少CSS体积启用动画插件提升交互体验。
- 路径别名@/*映射根目录,简化导入路径。
- **命名约定**
- Python模块与类使用PascalCase函数与变量使用snake_case常量使用UPPER_CASE。
- TypeScript接口与类型使用PascalCase变量与函数使用camelCase枚举使用UPPER_CASE。
- **部署脚本规范**
- 使用push_script.sh进行标准化部署避免手动操作导致的不一致。
- 遵循语义化版本控制合理选择版本类型patch/minor/major
- 在团队内统一部署流程,确保所有成员使用相同的部署脚本参数。
### 开发流程与工作流
- **Git分支策略建议**
- 主分支保护分支仅允许通过PR合并。
- 功能分支feature/xxx完成后合并到develop。
- 发布分支release/x.y.z用于预发布与回归测试。
- 热修复分支hotfix/xxx直接修改主分支并回放至develop。
- **代码评审(建议)**
- PR必须包含变更说明、测试用例与性能影响评估。
- 至少一名Reviewer同意后方可合并。
- 评审关注点:代码质量、安全性、可维护性与兼容性。
- **版本发布管理(建议)**
- 语义化版本:小版本用于新增功能,补丁版本用于修复。
- 发布前更新CHANGELOG运行全量测试检查依赖安全漏洞。
- 发布后:同步文档与环境配置,监控线上指标。
- **使用push_script.sh自动化版本标记与发布流程**。
### 开发工具使用方法
- **IDE配置建议**
- VS Code安装Python与TypeScript扩展启用ESLint与Prettier配置Python解释器为虚拟环境。
- 前端启用TypeScript智能提示与ESLint实时检查Tailwind IntelliSense增强CSS类提示。
- **调试技巧**
- 后端使用Uvicorn的reload选项热重载在FastAPI中设置调试日志级别利用依赖注入覆盖与mock替换真实外部服务。
- 前端使用Next.js dev模式热更新在浏览器开发者工具中检查网络与状态Tailwind调试辅助类辅助布局。
- **性能分析工具(建议)**
- 后端使用cProfile或py-spy分析CPU与内存结合APScheduler监控任务耗时。
- 前端使用Chrome DevTools Performance面板分析渲染与网络使用Lighthouse评估SEO与可访问性。
- **部署工具使用方法**
- **push_script.sh使用**
- 确保脚本具有执行权限chmod +x push_script.sh
- 基本使用:./push_script.sh
- 指定版本类型:./push_script.sh patch/minor/major
- 指定环境:./push_script.sh -e development/production
- 查看帮助:./push_script.sh -h
- **Docker部署**
- 使用docker-compose up -d启动服务
- 使用docker-compose down停止服务
- 使用docker-compose logs查看日志
### 新功能开发指导原则
- **模块设计**
- 遵循"API-Service-Model"三层架构,保持关注点分离。
- 将业务逻辑封装在Service层避免在API层直接操作数据库。
- **接口定义**
- 使用Pydantic模型定义请求与响应结构明确字段类型与约束。
- 对外暴露RESTful接口遵循统一的前缀与标签组织路由。
- **测试要求**
- 单元测试:覆盖关键业务逻辑与边界条件。
- 集成测试使用pytest与AsyncClient发起HTTP请求验证端到端流程。
- Mock策略对调度器、外部服务与数据库进行合理Mock保证测试稳定性。
- **部署要求**
- 新功能开发完成后使用push_script.sh进行部署测试。
- 确保所有环境变量正确配置包括数据库连接、Redis配置等。
- 部署前进行完整的功能测试和性能测试。
### 常见问题与解决方案
- **数据库连接失败**
- 检查PostgreSQL容器健康状态与端口映射确认DATABASE_URL与凭据。
- **Redis连接失败**
- 检查Redis容器健康状态与端口映射确认REDIS_URL。
- **Playwright无法启动浏览器**
- 确认Dockerfile中已安装Playwright浏览器与系统依赖检查PLAYWRIGHT_BROWSERS_PATH。
- **CORS跨域问题**
- 核对CORS中间件配置的allow_origins与headers确保前端域名与端口匹配。
- **JWT认证失败**
- 检查JWT_SECRET与过期时间确认请求头Authorization格式为Bearer Token。
- **部署脚本执行失败**
- 检查脚本权限chmod +x push_script.sh
- 确认Git配置git config --global user.name 和 git config --global user.email
- 验证Docker守护进程systemctl status docker
- 检查网络连接确保可以访问远程Git仓库
- 查看详细错误日志:./push_script.sh -v
- **Docker构建失败**
- 清理Docker缓存docker system prune
- 检查Dockerfile语法docker build --no-cache -t geo-app .
- 确认网络连接:代理设置或防火墙配置
- 检查磁盘空间:清理不必要的镜像和容器
**章节来源**
- [backend/app/main.py:30-36](file://backend/app/main.py#L30-L36)
- [backend/app/config.py:9-13](file://backend/app/config.py#L9-L13)
- [backend/Dockerfile:31-33](file://backend/Dockerfile#L31-L33)
- [docker-compose.yml:4-20](file://docker-compose.yml#L4-L20)
- [docker-compose.yml:22-34](file://docker-compose.yml#L22-L34)
- [README.md:1-3](file://README.md#L1-L3)