geo/.qoder/repowiki/zh/content/项目概述/技术栈.md

348 lines
16 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>
**本文档引用的文件**
- [docker-compose.yml](file://docker-compose.yml)
- [backend/Dockerfile](file://backend/Dockerfile)
- [frontend/Dockerfile](file://frontend/Dockerfile)
- [backend/requirements.txt](file://backend/requirements.txt)
- [frontend/package.json](file://frontend/package.json)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/config.py](file://backend/app/config.py)
- [backend/app/database.py](file://backend/app/database.py)
- [backend/app/api/auth.py](file://backend/app/api/auth.py)
- [backend/app/workers/scheduler.py](file://backend/app/workers/scheduler.py)
- [frontend/tsconfig.json](file://frontend/tsconfig.json)
- [frontend/tailwind.config.ts](file://frontend/tailwind.config.ts)
- [frontend/.eslintrc.json](file://frontend/.eslintrc.json)
- [frontend/next.config.mjs](file://frontend/next.config.mjs)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本技术栈文档面向GEO项目的开发者与运维人员系统梳理了后端FastAPI + Python 3.9+、前端Next.js 14 + TypeScript、数据库PostgreSQL、缓存Redis以及容器化部署方案。文档重点解释各技术选型的原因与优势并结合仓库中的实际配置文件给出版本要求、兼容性信息与最佳实践建议帮助团队快速理解并高效迭代。
## 项目结构
项目采用前后端分离的多服务架构,通过 Docker Compose 编排数据库、缓存、后端API与前端应用形成可独立开发、测试与部署的完整环境。
```mermaid
graph TB
subgraph "本地开发环境"
FE["前端应用<br/>Next.js 14 + TypeScript"]
BE["后端API<br/>FastAPI + Python 3.11"]
DB["数据库<br/>PostgreSQL 15"]
RC["缓存<br/>Redis 7"]
end
FE --> |"HTTP/HTTPS"| BE
BE --> DB
BE --> RC
```
**图表来源**
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
- [backend/Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [frontend/Dockerfile:1-15](file://frontend/Dockerfile#L1-L15)
**章节来源**
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
## 核心组件
- 后端框架FastAPI高性能异步Web框架自动生成OpenAPI文档类型安全
- 数据库PostgreSQL企业级关系型数据库支持事务与复杂查询
- 缓存Redis高性能键值存储用于会话、限流与任务队列
- 前端框架Next.js 14App Router架构SSR/SSG支持TypeScript原生支持
- 异步ORMSQLAlchemy 2.x异步引擎与会话管理
- 任务调度APScheduler基于事件循环的异步调度器
- 浏览器自动化Playwright跨平台无头浏览器
- 开发工具链TypeScript、Tailwind CSS、ESLint、PostCSS、Tailwind CSS插件
**章节来源**
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
## 架构总览
下图展示了从浏览器到后端API、数据库与缓存的整体交互流程以及定时任务调度器在后台自动执行查询任务的机制。
```mermaid
graph TB
Browser["浏览器/移动端"] --> NextUI["Next.js 前端应用"]
NextUI --> FastAPI["FastAPI 后端"]
FastAPI --> SQLAlchemy["SQLAlchemy 异步ORM"]
SQLAlchemy --> PostgreSQL["PostgreSQL 数据库"]
FastAPI --> Redis["Redis 缓存"]
FastAPI --> APS["APScheduler 定时任务"]
APS --> Playwright["Playwright 浏览器自动化"]
Playwright --> ThirdParty["第三方平台接口"]
```
**图表来源**
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
## 详细组件分析
### 后端FastAPI + Python 3.11
- 应用入口与生命周期:通过 lifespan 钩子在启动时初始化模型与调度器,在关闭时优雅停机。
- 中间件与路由启用CORS以允许前端localhost访问按模块注册认证、查询、引用数据与报告相关路由。
- 健康检查:提供 /health 接口便于容器编排健康检查。
- 版本与依赖FastAPI≥0.109.0、Uvicorn标准变体、Pydantic≥2.0、SQLAlchemy≥2.0、Redis、APScheduler≥3.10、HTTPX、Playwright≥1.40、pytest-asyncio等。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "FastAPI 应用"
participant Router as "路由处理器"
participant DB as "异步数据库会话"
participant ORM as "SQLAlchemy 模型"
Client->>API : "HTTP 请求"
API->>Router : "分发到对应路由"
Router->>DB : "获取异步会话"
DB->>ORM : "执行查询/更新"
ORM-->>DB : "返回结果"
DB-->>Router : "提交/回滚"
Router-->>API : "序列化响应"
API-->>Client : "HTTP 响应"
```
**图表来源**
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43)
- [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29)
**章节来源**
- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48)
- [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43)
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
### 数据库与ORMPostgreSQL + SQLAlchemy 异步
- 连接配置:通过配置类集中管理 DATABASE_URL使用 asyncpg 作为异步驱动。
- 会话管理:定义异步引擎与异步会话工厂,提供依赖注入式数据库会话生成器。
- 模型基类:统一的 declarative_base便于扩展业务模型。
```mermaid
flowchart TD
Start(["应用启动"]) --> LoadCfg["加载数据库配置"]
LoadCfg --> CreateEngine["创建异步引擎"]
CreateEngine --> SessionFactory["创建异步会话工厂"]
SessionFactory --> Request["请求到达"]
Request --> GetSession["依赖注入获取会话"]
GetSession --> ExecOp["执行ORM操作"]
ExecOp --> Commit["提交事务"]
Commit --> Close["关闭会话"]
Close --> End(["请求结束"])
```
**图表来源**
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29)
**章节来源**
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29)
### 缓存Redis
- 配置:通过 REDIS_URL 指向 redis:6379/0容器网络内可达。
- 用途:会话存储、任务状态缓存、限流与临时数据缓存(结合业务场景使用)。
**章节来源**
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
### 任务调度APScheduler 异步调度器
- 触发周期:每小时检查一次到期的查询任务。
- 查询逻辑:筛选状态为 active 且 next_query_at 小于等于当前时间的任务。
- 执行流程:逐条调用引用引擎执行查询,异常记录日志但不中断整体流程。
- 关闭流程:优雅关闭调度器与引擎资源。
```mermaid
flowchart TD
S(["启动调度器"]) --> AddJob["添加定时任务每小时"]
AddJob --> Loop{"事件循环存在?"}
Loop --> |是| RunTask["在当前事件循环创建任务"]
Loop --> |否| NewLoop["新建事件循环执行"]
RunTask --> Check["查询数据库:查找到期任务"]
NewLoop --> Check
Check --> Found{"找到任务?"}
Found --> |否| Wait["等待下次触发"]
Found --> |是| Exec["逐条执行查询"]
Exec --> Wait
Wait --> AddJob
```
**图表来源**
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
**章节来源**
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
### 前端Next.js 14 + TypeScript
- 框架版本Next.js 14.2.35,使用 App Router 架构组织页面与布局。
- 类型系统TypeScript 5严格模式与路径别名配置确保类型安全。
- UI与样式Tailwind CSS 3.4.1,配合 tailwindcss-animate 插件实现动画与主题扩展。
- 工具链ESLint 8Next.js核心Web Vitals与TypeScript规则PostCSS开发脚本dev/build/start/lint
- 认证NextAuth.js 4.24.14集成OAuth与会话管理。
```mermaid
graph LR
Next["Next.js 14 App Router"] --> TS["TypeScript 5"]
Next --> Tailwind["Tailwind CSS 3.4.1"]
Tailwind --> Animate["tailwindcss-animate"]
Next --> ESLint["ESLint 8"]
Next --> NextAuth["NextAuth.js 4.24.14"]
Next --> Radix["Radix UI 组件库"]
Next --> Recharts["Recharts 图表库"]
```
**图表来源**
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [frontend/tsconfig.json:1-27](file://frontend/tsconfig.json#L1-L27)
- [frontend/tailwind.config.ts:1-57](file://frontend/tailwind.config.ts#L1-L57)
- [frontend/.eslintrc.json:1-4](file://frontend/.eslintrc.json#L1-L4)
**章节来源**
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
- [frontend/tsconfig.json:1-27](file://frontend/tsconfig.json#L1-L27)
- [frontend/tailwind.config.ts:1-57](file://frontend/tailwind.config.ts#L1-L57)
- [frontend/.eslintrc.json:1-4](file://frontend/.eslintrc.json#L1-L4)
- [frontend/next.config.mjs:1-5](file://frontend/next.config.mjs#L1-L5)
### 浏览器自动化Playwright
- 作用:支持对第三方平台进行无头浏览器模拟,满足动态内容抓取与登录态维护。
- 容器内安装Dockerfile 中安装 Chromium 并预装 Playwright 依赖。
**章节来源**
- [backend/Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [backend/requirements.txt:25-25](file://backend/requirements.txt#L25-L25)
## 依赖分析
- 后端依赖FastAPI、Uvicorn、SQLAlchemy 2.x、asyncpg、Alembic、Pydantic 2.x、Pydantic Settings、python-jose、passlib、redis、apscheduler、httpx、python-dotenv、pytest、pytest-asyncio、aiosqlite、playwright。
- 前端依赖Next.js 14、React 18、NextAuth.js、Radix UI、Lucide React、Recharts、Tailwind CSS、Tailwind Merge、Tailwind CSS Animate、TypeScript、ESLint、PostCSS、Tailwind CSS。
```mermaid
graph TB
subgraph "后端"
F["FastAPI"]
S["SQLAlchemy 2.x"]
R["Redis"]
P["Playwright"]
A["APScheduler"]
end
subgraph "前端"
N["Next.js 14"]
T["TypeScript"]
TA["Tailwind CSS"]
E["ESLint"]
NA["NextAuth.js"]
end
N --> F
F --> S
F --> R
F --> A
F --> P
N --> TA
N --> E
N --> NA
N --> T
```
**图表来源**
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
**章节来源**
- [backend/requirements.txt:1-35](file://backend/requirements.txt#L1-L35)
- [frontend/package.json:1-40](file://frontend/package.json#L1-L40)
## 性能考虑
- 异步优先后端使用异步ORM与异步调度器减少阻塞提升并发处理能力。
- 事件循环:调度器在当前事件循环或新建事件循环中执行任务,避免阻塞主事件循环。
- 缓存策略Redis用于热点数据与会话缓存降低数据库压力需结合业务设计合理的过期策略。
- 数据库连接:异步引擎与会话池化配置,避免频繁建立/断开连接。
- 前端优化Next.js 14 App Router支持服务端渲染与静态生成结合Tailwind CSS减少打包体积与样式开销。
## 故障排除指南
- 健康检查失败
- 现象:容器未就绪或重启频繁。
- 排查:查看 docker-compose 中 db 与 redis 的 healthcheck 配置,确认端口映射与环境变量正确。
- CORS 问题
- 现象:前端跨域请求被拒绝。
- 排查:确认后端 CORS 配置允许前端地址(默认允许 http://localhost:3000
- 数据库连接失败
- 现象:应用启动时报数据库连接错误。
- 排查:核对 DATABASE_URL 是否指向容器内的 db 服务,确认网络连通与凭据正确。
- Redis 连接失败
- 现象:缓存不可用或任务调度异常。
- 排查:核对 REDIS_URL 指向容器内的 redis 服务,确认端口映射与权限设置。
- Playwright 依赖问题
- 现象:容器内无法启动浏览器或报缺少系统库。
- 排查:确认 Dockerfile 中已安装 Playwright 依赖与浏览器,必要时重建镜像。
- 前端热更新异常
- 现象:修改代码后未生效。
- 排查:确认前端容器挂载了 node_modules 与源码目录,检查端口映射与命令是否正确。
**章节来源**
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)
- [backend/app/main.py:30-36](file://backend/app/main.py#L30-L36)
- [backend/app/config.py:7-8](file://backend/app/config.py#L7-L8)
- [backend/Dockerfile:6-25](file://backend/Dockerfile#L6-L25)
## 结论
GEO项目采用现代全栈技术栈后端以 FastAPI 为核心,结合 SQLAlchemy 异步ORM与 APscheduler 实现高并发与可维护的任务调度;前端以 Next.js 14 为基础,配合 TypeScript、Tailwind CSS 与 NextAuth.js 构建现代化用户界面与认证体系;数据库与缓存分别采用 PostgreSQL 与 Redis满足生产级数据持久化与缓存需求。通过 Docker Compose 实现一键编排,便于本地开发与部署。
## 附录
### 技术选型与优势
- FastAPI
- 优势高性能、自动生成OpenAPI文档、类型驱动的接口校验、异步支持。
- 适用高并发API、微服务、可观测性与可测试性要求高的场景。
- Next.js 14 + TypeScript
- 优势App Router架构、SSR/SSG、原生TypeScript支持、严格的类型约束。
- 适用现代Web应用、SEO友好、团队协作与质量保障。
- PostgreSQL
- 优势ACID事务、复杂查询、扩展性强、生态完善。
- 适用:数据一致性要求高、业务逻辑复杂的场景。
- Redis
- 优势高性能KV存储、丰富的数据结构、发布订阅与事务支持。
- 适用:会话存储、缓存、限流、任务队列。
- SQLAlchemy 异步ORM
- 优势类型安全、异步会话、灵活的查询DSL、与FastAPI依赖注入无缝集成。
- 适用需要强类型与异步IO的数据库访问层。
### 版本与兼容性
- Python后端使用 3.11容器镜像建议本地开发与CI保持一致。
- Node.js前端使用 20容器镜像建议本地开发与CI保持一致。
- Next.js14.2.35,使用 App Router 与TypeScript。
- FastAPI≥0.109.0,配合 Uvicorn 标准变体。
- SQLAlchemy≥2.0,异步引擎与会话。
- Pydantic≥2.0,配置与数据验证。
- Redis7-alpine使用默认端口6379。
- PostgreSQL15-alpine使用默认端口5432。
- Playwright≥1.40容器内预装Chromium与依赖。
- APScheduler≥3.10,异步调度器。
### 容器化与部署要点
- 多阶段思路:后端基于 slim 镜像安装系统依赖与Playwright前端基于 alpine 镜像,最小化依赖安装。
- 端口映射后端8000、前端3000、数据库5432、缓存6379。
- 健康检查db 与 redis 提供健康检查,后端提供 /health。
- 开发体验:前端启用 --reload开发命令后端使用 uvicorn --reload。
**章节来源**
- [backend/Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [frontend/Dockerfile:1-15](file://frontend/Dockerfile#L1-L15)
- [docker-compose.yml:1-71](file://docker-compose.yml#L1-L71)