# 开发指南

<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)