Files
dpb/backend/README.md
T
34047007@qq.com 86126ea16f checkpoint: 架构治理四件套——统一 async / 测试真 PG / Redis 降级可选 / DPB 扶正
- A1 业务层统一 async:gencode 表内省改 run_sync 异步(不再阻塞事件循环)、
  check_db 改 async_engine、dict_util 启动预热异步载入;psycopg 降为
  APScheduler SQLAlchemyJobStore 专用同步孤岛(注释标注)
- A2 测试真 PG 化:conftest 弃 SQLite + mock Redis,改连真实 PG16(dpb_test)+
  Redis(number_gen advisory lock 路径真被测);新增 docker/test-compose.yaml
  测试依赖栈(postgres:16:5433 + redis:7:6380);run_ci 前置探测 + 容器兜底,
  pytest -m pg 10 套正式 tc 全过(真实 PG16 + Redis)
- B1 Redis 启动不强依赖:redis_connect 失败降级启动,缓存类回源 DB、存储类
  (会话/AI 配置/调度)经 require_redis 守卫返回 503;真机 3 阶段降级测试
  PASS=11 FAIL=0(独立 Redis 6390 + 后端 8091,不动共享 dev 服务)
- C 扶正 DPB:后端横幅/日志(dpb.log)/README/pyproject/ai_factory agent 名、
  前端 package.json/署名注释/链接文案/deploy.sh/docker 注释全部去 fastapiadmin;
  grep backend/app + frontend/web/src 零残留
- 验证:全量回归 pass=72 fail=0
2026-08-07 09:06:19 +08:00

135 lines
5.4 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.
# DPB 桃育种系统后端
基于 FastAPI 框架自研的桃树育种管理系统后端,为前端 Vue3 管理界面提供完整的 API 服务支持。
> **与仓库根文档的关系**:项目总览、一键前后端启动、演示账号、Docker 部署、架构图与默认端口等请以 [根目录 README.md](../README.md) 为准;**本文档**侧重 `backend/` 目录结构、迁移命令与后端开发约定。
## 技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| FastAPI | 0.115.2 | 现代 Web 框架 |
| SQLAlchemy | 2.0.36 | ORM 框架 |
| Alembic | 1.15.1 | 数据库迁移工具 |
| Pydantic | 2.x | 数据验证与序列化 |
| APScheduler | 3.11.0 | 定时任务调度 |
| Redis | 5.2.1 | 缓存与会话存储 |
| Uvicorn | 0.30.6 | ASGI 服务器 |
| Python | 3.12+ | 运行环境 |
## 项目结构
```txt
backend/
├── app/ # 项目核心代码
│ ├── alembic/ # 数据库迁移管理
│ ├── api/ # API 接口模块
│ │ └── v1/ # API v1 版本
│ │ ├── module_system/ # 系统管理模块
│ │ ├── module_monitor/ # 系统监控模块
│ │ ├── module_ai/ # AI 功能模块
│ │ └── module_*/ # 其他业务模块
│ ├── common/ # 公共组件(常量、枚举、响应封装)
│ ├── config/ # 项目配置文件
│ ├── core/ # 核心模块(数据库、中间件、安全)
│ ├── module_task/ # 定时任务模块
│ ├── plugin/ # 插件模块(二开目录)
│ ├── scripts/ # 初始化脚本和数据
│ └── utils/ # 工具类(验证码、文件上传等)
├── env/ # 环境配置文件
├── logs/ # 日志输出目录
├── sql/ # SQL 初始化脚本
├── static/ # 静态资源文件
├── main.py # 项目启动入口
├── alembic.ini # Alembic 迁移配置
├── requirements.txt # Python 依赖包
└── pyproject.toml # 项目配置(uv / ruff
```
### 模块分层
每个业务模块采用统一的分层结构:
```txt
module_*/
├── controller.py # 控制器 - HTTP 请求处理
├── service.py # 服务层 - 业务逻辑处理
├── crud.py # 数据层 - 数据库操作
├── model.py # ORM 模型 - 数据库表定义
├── schema.py # Pydantic 模型 - 数据验证
└── param.py # 参数模型 - 请求参数
```
分包理念:按业务竖切(module_bre 育种 / module_system 系统 / module_monitor 监控 / module_ai AI)而非按技术层次分包,每个业务模块内部再按 controller/service/crud/model/schema 分层。
## 快速开始
### 环境要求
- **Python**: 3.12+
- **数据库**: PostgreSQL 16(连接串在 `env/.env.dev`;测试套件连独立测试库 `dpb_test`,同为真实 PostgreSQL16,见 `run_ci.py`
- **Redis**: 与 `.env.dev` 中配置一致
### 第一次在本机跑起来
1. 复制 `env/.env.dev.example``env/.env.dev`,填写数据库、Redis 等(先在 DB 中建好空库)。
2.**`backend/` 目录下** 安装依赖:推荐 **`uv sync`**;或 `pip install -r requirements.txt`
3. **启动**`uv run main.py run --env=dev`(或 `python main.py run --env=dev`)。**首次启动会自动初始化数据库表与基础数据**,一般**无需**先执行 `upgrade`。接口文档示例:`http://127.0.0.1:8001/docs`(端口见 `.env.dev``SERVER_PORT`)。
### 数据库迁移命令(模型变更时使用)
日常**首次启动不必手动执行**;当你**修改了 ORM 模型**并需用 Alembic 管理结构变更时再使用:
```bash
# 生成迁移文件(模型变更后)
python main.py revision --env=dev
# 应用迁移
python main.py upgrade --env=dev
# 使用 uv 时
uv run main.py revision --env=dev
uv run main.py upgrade --env=dev
```
### 安装依赖与启动服务
```bash
# 推荐使用 uv(与 pyproject.toml 一致)
uv sync
uv run main.py run --env=dev
# 或使用传统 pip / venv
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python main.py run --env=dev
```
### 代码格式化(ruff
```bash
ruff check
ruff check --fix
ruff check --watch
# 使用 uv 时
uv run ruff check
uv run ruff check --fix
uv run ruff check --watch
```
## 后端约定(日期与序列化)
使用 **Pydantic v2****PostgreSQLasyncpg** 时:ORM 写入需要 Python 原生日期时间,JSON 输出需要可序列化字符串。
- 自定义 `DateStr` / `TimeStr` / `DateTimeStr``app/core/validator.py`)使用 **`PlainSerializer(..., when_used='json')`**
- `model_dump(mode='python')` 供 ORM 使用原生类型;JSON / Redis 使用 `model_dump(mode='json')`
- 统一 HTTP 响应见 `app/common/response.py` 中的 **`jsonable_encoder`**
- 写入 Redis 时请使用 **`model_dump(mode='json')`** 再序列化
## 相关链接
- **FastAPI 官方文档**: [https://fastapi.tiangolo.com/](https://fastapi.tiangolo.com/)
- **SQLAlchemy 文档**: [https://docs.sqlalchemy.org/](https://docs.sqlalchemy.org/)
- **Pydantic 文档**: [https://pydantic-docs.helpmanual.io/](https://pydantic-docs.helpmanual.io/)