# 新功能开发 **本文档引用的文件** - [backend/app/main.py](file://backend/app/main.py) - [backend/app/api/auth.py](file://backend/app/api/auth.py) - [backend/app/api/queries.py](file://backend/app/api/queries.py) - [backend/app/schemas/auth.py](file://backend/app/schemas/auth.py) - [backend/app/schemas/query.py](file://backend/app/schemas/query.py) - [backend/app/models/user.py](file://backend/app/models/user.py) - [backend/app/models/query.py](file://backend/app/models/query.py) - [backend/app/services/auth.py](file://backend/app/services/auth.py) - [backend/app/services/query.py](file://backend/app/services/query.py) - [frontend/app/layout.tsx](file://frontend/app/layout.tsx) - [frontend/components/providers.tsx](file://frontend/components/providers.tsx) - [frontend/lib/api.ts](file://frontend/lib/api.ts) - [tests/test_auth.py](file://tests/test_auth.py) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本指导文档面向在 GEO 平台进行新功能开发的工程师,系统阐述后端 API 模块设计原则、接口定义与依赖管理;前端页面开发规范(页面组织、组件设计、状态管理);数据库模型设计指导(表结构、关系映射、索引策略);以及测试驱动开发(TDD)最佳实践与单元测试编写指南。文档以现有代码库为依据,结合可扩展性与一致性原则,帮助团队高效、安全地交付高质量功能。 ## 项目结构 - 后端采用 FastAPI + SQLAlchemy 异步 ORM 架构,按领域分层组织:API 路由、服务层、模型层、模式层(Pydantic)、依赖注入与工具。 - 前端采用 Next.js App Router,使用 TypeScript、TailwindCSS 与 NextAuth 管理会话状态,通过统一的 API 客户端封装调用。 - 测试覆盖后端 API 与服务逻辑,使用 pytest 异步客户端与依赖覆盖机制。 ```mermaid graph TB subgraph "前端" FE_App["Next.js 应用
根布局与全局样式"] FE_Providers["会话提供者
NextAuth Provider"] FE_API["API 客户端
统一请求封装"] end subgraph "后端" BE_Main["FastAPI 应用
生命周期与中间件"] BE_Routers["API 路由
认证/查询/引用/报告"] BE_Services["服务层
业务逻辑"] BE_Models["模型层
SQLAlchemy ORM"] BE_Schemas["模式层
Pydantic 校验"] end FE_App --> FE_Providers FE_API --> BE_Routers BE_Main --> BE_Routers BE_Routers --> BE_Services BE_Services --> BE_Models BE_Services --> BE_Schemas ``` 图表来源 - [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48) - [frontend/app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [frontend/components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) 章节来源 - [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48) - [frontend/app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [frontend/components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) ## 核心组件 - 后端应用与生命周期:定义 CORS、路由注册、健康检查与任务调度器启动/关闭。 - 认证模块:注册、登录、当前用户信息,配合 JWT 令牌与密码哈希。 - 查询模块:CRUD、分页、权限校验(用户配额限制)、频率变更触发下次执行时间重算。 - 数据模型:用户、查询、引用记录、查询任务、订阅等,定义字段、外键与索引。 - 前端布局与会话:根布局、全局样式、NextAuth Provider 包裹。 - 前端 API 客户端:统一封装鉴权头、错误处理与各模块接口。 章节来源 - [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/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) - [frontend/app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [frontend/components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) ## 架构总览 后端通过 FastAPI 聚合多个领域路由,每个路由对应一个服务层函数,服务层通过 SQLAlchemy 异步会话访问数据库模型,并使用 Pydantic 模式进行输入输出校验。前端通过统一 API 客户端发起请求,自动附加鉴权头,错误时统一解析并抛出。 ```mermaid sequenceDiagram participant FE as "前端页面" participant API as "API 客户端" participant Router as "FastAPI 路由" participant Service as "服务层" participant Model as "模型层(SQLAlchemy)" participant DB as "数据库" FE->>API : "调用接口(带鉴权头)" API->>Router : "HTTP 请求" Router->>Service : "调用业务方法" Service->>Model : "ORM 查询/更新" Model->>DB : "异步 SQL 执行" DB-->>Model : "结果集" Model-->>Service : "领域对象" Service-->>Router : "返回结果" Router-->>API : "JSON 响应" API-->>FE : "解析并渲染" ``` 图表来源 - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) ## 详细组件分析 ### 后端模块设计原则与依赖管理 - 模块划分 - API 层:定义路由、参数校验、异常映射与响应模型。 - 服务层:封装业务规则、权限控制与跨模型操作。 - 模型层:定义表结构、关系与索引。 - 模式层:Pydantic 模型用于请求/响应序列化与校验。 - 接口定义 - 统一前缀与标签:如 /api/v1/auth、/api/v1/queries 等。 - 参数校验:Query 分页参数、Pydantic 字段长度与枚举校验。 - 错误处理:HTTP 状态码与错误详情映射。 - 依赖管理 - 依赖注入:数据库会话、当前用户通过 Depends 获取。 - 生命周期:应用启动时初始化模型与调度器,关闭时优雅退出。 章节来源 - [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/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/schemas/auth.py:1-34](file://backend/app/schemas/auth.py#L1-L34) - [backend/app/schemas/query.py:1-94](file://backend/app/schemas/query.py#L1-L94) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) ### 认证模块(API/服务/模式) - 路由设计 - 注册:接收注册体,返回用户信息(201)。 - 登录:校验凭据,签发 JWT,返回令牌与用户信息。 - 当前用户:基于依赖注入获取已认证用户。 - 处理逻辑 - 密码哈希与校验、JWT 过期时间配置、邮箱唯一性检查。 - 错误处理 - 注册重复邮箱、登录凭据无效、未授权访问。 ```mermaid sequenceDiagram participant C as "客户端" participant R as "认证路由" participant S as "认证服务" participant U as "用户模型" participant T as "JWT/密码库" C->>R : "POST /api/v1/auth/register" R->>S : "register_user()" S->>U : "查询邮箱是否已存在" U-->>S : "不存在" S->>T : "hash_password()" S->>U : "创建用户并持久化" U-->>S : "返回用户" S-->>R : "用户信息" R-->>C : "201 + 用户" C->>R : "POST /api/v1/auth/login" R->>S : "authenticate_user()" S->>U : "查找用户" U-->>S : "用户对象" S->>T : "verify_password()" T-->>S : "匹配成功" S-->>R : "用户+令牌" R-->>C : "200 + 令牌" ``` 图表来源 - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/schemas/auth.py:1-34](file://backend/app/schemas/auth.py#L1-L34) 章节来源 - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/schemas/auth.py:1-34](file://backend/app/schemas/auth.py#L1-L34) ### 查询模块(API/服务/模式/模型) - 路由设计 - 列表:支持 skip/limit 分页,返回 items 与 total。 - 创建:校验平台与频率,检查用户配额,计算 next_query_at。 - 读取/更新/删除:基于 query_id 与 user_id 的权限校验。 - 处理逻辑 - 频率变更时重算下次执行时间。 - 删除级联清理关联任务与引用记录。 - 错误处理 - 403 配额超限、404 未找到、401 未授权。 ```mermaid flowchart TD Start(["创建查询"]) --> Count["统计用户查询数量"] Count --> CheckLimit{"是否超过配额?"} CheckLimit --> |是| Raise403["抛出权限错误(403)"] CheckLimit --> |否| CalcNext["根据频率计算 next_query_at"] CalcNext --> Persist["持久化查询记录"] Persist --> Done(["完成"]) Raise403 --> End(["结束"]) Done --> End ``` 图表来源 - [backend/app/services/query.py:45-81](file://backend/app/services/query.py#L45-L81) 章节来源 - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) - [backend/app/schemas/query.py:1-94](file://backend/app/schemas/query.py#L1-L94) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) ### 前端页面开发规范 - 页面组织 - 使用 Next.js App Router 的分组路由与布局,根布局统一注入 Provider。 - 组件设计 - UI 组件库化,遵循语义化与可复用性;页面组件负责数据获取与展示。 - 状态管理 - 使用 NextAuth 提供的会话状态,通过 Provider 在应用根部注入。 - API 调用 - 统一的 api.ts 封装:自动添加 Content-Type 与 Authorization 头,统一错误处理与 JSON 解析。 ```mermaid graph LR Root["根布局
layout.tsx"] --> Providers["会话提供者
providers.tsx"] Providers --> Pages["页面与组件"] Pages --> API["API 客户端
api.ts"] API --> Backend["后端 API"] ``` 图表来源 - [frontend/app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [frontend/components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) 章节来源 - [frontend/app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [frontend/components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) ### 数据库模型设计指导 - 表结构设计 - 使用 UUID 主键,字符串长度约束,布尔与整数字段合理设置默认值。 - JSONB 字段用于存储动态列表(品牌别名、平台列表)。 - 关系映射 - 外键约束与级联删除(如用户删除时级联删除其查询与订阅)。 - 双向关系与回溯属性(back_populates)。 - 索引策略 - 对高频过滤字段建立复合或单列索引(如 user_id、status、next_query_at)。 章节来源 - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) ### 测试驱动开发(TDD)最佳实践与单元测试编写指南 - 设计原则 - 先写失败的测试,再实现最小逻辑使其通过;关注边界条件与错误路径。 - 使用依赖覆盖(dependency override)隔离外部依赖,确保测试可重复。 - 单元测试编写 - 使用 pytest 异步客户端发起请求,断言状态码与响应结构。 - Mock 服务层或模型层行为,验证路由层的参数传递与异常映射。 - 示例参考 - 认证模块测试覆盖注册成功/重复邮箱、登录成功/凭据错误、当前用户接口的鉴权场景。 章节来源 - [tests/test_auth.py:1-104](file://tests/test_auth.py#L1-L104) ## 依赖分析 - 后端模块耦合 - API 路由依赖服务层;服务层依赖模型层与配置;模式层独立于业务逻辑。 - 依赖注入降低耦合,便于替换与测试。 - 前后端交互 - 前端通过统一 API 客户端与后端路由通信,鉴权头由 NextAuth 管理。 ```mermaid graph TB API_Auth["认证路由"] --> Svc_Auth["认证服务"] API_Queries["查询路由"] --> Svc_Query["查询服务"] Svc_Auth --> Model_User["用户模型"] Svc_Query --> Model_Query["查询模型"] FE_API["前端 API 客户端"] --> API_Auth FE_API --> API_Queries ``` 图表来源 - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) 章节来源 - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) - [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) - [backend/app/models/user.py:1-41](file://backend/app/models/user.py#L1-L41) - [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) ## 性能考虑 - 数据库层面 - 为高频查询字段建立索引,避免全表扫描;对分页与排序字段保持索引覆盖。 - 使用批量查询与延迟加载策略,减少 N+1 查询风险。 - 服务层层面 - 合理拆分查询与计数,避免不必要的 COUNT 开销;缓存热点数据(如平台白名单)。 - API 层面 - 控制分页大小上限,防止过大数据量返回;对敏感字段进行选择性序列化。 - 前端层面 - 使用虚拟列表与懒加载优化长列表渲染;统一错误提示与加载态,提升用户体验。 ## 故障排查指南 - 常见问题定位 - 401 未授权:确认鉴权头是否正确传递与令牌是否过期。 - 403 权限错误:检查用户配额与资源归属(user_id)。 - 404 未找到:核对主键与所属用户 ID 是否匹配。 - 400 参数错误:检查 Pydantic 校验规则与枚举值。 - 日志与监控 - 后端开启路由级日志与异常捕获;前端统一错误上报与用户提示。 - 回滚与恢复 - 数据库迁移版本化管理;关键变更需配套回滚脚本与数据备份。 章节来源 - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) ## 结论 通过清晰的模块划分、严格的依赖注入、完善的模式校验与统一的前后端交互规范,GEO 平台具备良好的扩展性与可维护性。建议在新增功能时遵循本文档的设计原则与测试实践,确保功能快速落地且质量可控。 ## 附录 - 新增功能开发清单 - 明确领域边界与模块职责,避免跨模块耦合。 - 编写路由与模式定义,确保参数与响应结构清晰。 - 实现服务层业务逻辑,覆盖边界条件与异常路径。 - 设计数据库模型与索引,评估性能影响。 - 编写单元测试与集成测试,保证功能正确性。 - 前端页面与组件开发,统一状态管理与错误处理。 - 文档与回归测试同步推进,保障发布质量。