FastAPI Web Admin 是一套开箱即用的后台管理脚手架,后端采用 系统模块 + 业务插件 分离架构,前端基于 Vue3 + Element Plus。
核心能力:
- RBAC 权限(菜单 / 按钮 / 接口)
- 动态路由与菜单配置
- 业务插件自动发现与注册
- Alembic 数据库版本管理
- uv 依赖管理与统一 CLI
- 开发环境自动建表与种子数据
默认账号: admin / 123456
| 层级 | 技术 |
|---|---|
| 后端 | FastAPI、SQLAlchemy 2.0、Pydantic v2、Alembic、Celery、Redis |
| 前端 | Vue 3、Vite、TypeScript、Element Plus、Pinia |
| 数据库 | MySQL 8.x(推荐) |
| 包管理 | 后端 uv,前端 yarn / npm |
fastapiwebadmin/
├── backend/ # 后端(Python / FastAPI)
│ ├── main.py # 唯一入口:create_app + CLI
│ ├── pyproject.toml # 依赖声明(uv 源)
│ ├── uv.lock
│ ├── alembic.ini
│ ├── env/ # 环境配置(唯一配置目录)
│ │ ├── .env.dev.example
│ │ └── .env.prod.example
│ ├── db_script/ # 种子 SQL(db_init.sql)
│ ├── app/
│ │ ├── api/v1/ # 系统 API(controller / service / schema / model)
│ │ ├── plugin/ # 业务插件(fea_project、fea_celery 等)
│ │ ├── orm/ # 仅 base.py 公共 ORM 基类
│ │ ├── shared/ # 跨模块共享:常量、异常、Schema、枚举、路由
│ │ ├── infrastructure/ # 持久化 / Redis / 建表
│ │ ├── bootstrap/ # 启动装配:异常处理、限流器
│ │ ├── core/ # 横切能力:权限、依赖、日志、插件发现
│ │ ├── config/ # setting.py / path_conf.py
│ │ ├── scripts/ # init_app.py、initialize.py
│ │ └── alembic/ # 迁移脚本
│ ├── run_win.bat # Windows 开发菜单
│ └── run_linux.sh # Linux 开发脚本
│
├── frontend/ # 前端(Vue3)
│ └── src/
│ ├── api/ # 接口封装
│ ├── views/ # 页面
│ ├── components/ # 公共组件(synrebort-table 等)
│ └── ...
│
└── README.md
注意: 旧版
app/apis/、app/services/、app/schemas/、config.py、cli.py已移除。所有开发请遵循下方规范,勿在废弃路径下新增代码。
每个业务模块固定四层文件,目录即模块边界:
<module>/
├── controller.py # 接口层:路由、入参校验、调用 service
├── service.py # 业务层:业务逻辑、事务编排
├── schema.py # 契约层:Pydantic 请求/响应/查询模型
└── model.py # 数据层:SQLAlchemy ORM 模型(继承 Base)
调用链(单向):
HTTP 请求 → controller → service → model → 数据库
↑ ↑
schema schema(入参/出参类型)
| 文件 | 职责 | 禁止 |
|---|---|---|
controller.py |
定义 APIRouter、绑定路由、返回 HttpResponse |
不写 SQL、不写复杂业务 |
service.py |
业务规则、组合多个 model 操作 | 不直接处理 HTTP Request |
schema.py |
入参校验、序列化,继承 BaseSchema |
不访问数据库 |
model.py |
表结构、查询/分页等数据访问方法 | 不写 HTTP 相关逻辑 |
系统模块示例:
app/api/v1/system/user/
├── controller.py
├── service.py
├── schema.py
└── model.py # User 表
业务插件示例:
app/plugin/fea_project/project/
├── controller.py
├── service.py
├── schema.py
└── model.py # ProjectInfo 等
model.py会被ImportUtil自动扫描,启动时create_all自动建表,无需注册到 Alembic。
除 app/orm/base.py 公共基类外,所有业务定义必须在模块目录内完成,禁止集中到 system_models.py 等共享文件。
<module>/
├── controller.py
├── service.py
├── schema.py
└── model.py
允许仅保留的公共层:
| 路径 | 内容 |
|---|---|
app/orm/base.py |
ORM 声明基类 Base |
app/shared/schemas/ |
Pydantic 基类 BaseSchema |
app/shared/response.py |
统一响应模型 |
app/config/ |
配置 |
| 类型 | 示例 | 说明 |
|---|---|---|
| 纯工具接口 | health/ |
仅 controller.py,无持久化 |
| 透传/聚合 | id_center/ |
仅转发,无独立表 |
| 基础设施插件 | fea_celery/ |
无 HTTP,含 worker.py + tasks/ |
| 仅表无接口 | notify/、request_history/ |
暂仅 model.py,预留扩展 |
| 位置 | 用途 |
|---|---|
app/api/v1/system/<module>/ |
系统内置模块(用户、角色、菜单…) |
app/api/v1/common/<module>/ |
公共能力(文件、健康检查) |
app/plugin/fea_<name>/<module>/ |
业务插件模块 |
app/shared/ |
跨模块共享:BaseSchema、响应模型、枚举、异常、常量 |
app/infrastructure/db/ |
数据库 / Redis / 建表 |
app/config/setting.py |
唯一配置入口 |
禁止:
- 在
backend/根目录新建config.py或第二套配置 - 新建
apis/、services/平级目录 - 新功能把 ORM 写进集中式
*_models.py文件 - 通过 re-export shim 做「兼容旧路径」
- 系统 API:在
app/api/v1/system/router.py聚合,前缀/api - 业务插件:
discover.py扫描fea_*/**/controller.py,自动挂载
插件目录名必须以 fea_ 开头:
app/plugin/fea_project/
├── plugin.toml
└── project/ # 子模块,遵循四层约定
├── controller.py
├── service.py
├── schema.py
├── model.py
fea_celery(后台任务插件,无 HTTP 四层中的 controller):
app/plugin/fea_celery/
├── plugin.toml
├── worker.py
├── model.py
├── schema.py
├── tasks/
└── scheduler/
# 开发
cp backend/env/.env.dev.example backend/env/.env.dev
# 生产
cp backend/env/.env.prod.example backend/env/.env.prod通过 ENVIRONMENT 切换:dev / prod。配置只读 backend/env/.env.{env},不使用根目录 .env。
关键项:
| 变量 | 开发建议 | 生产建议 |
|---|---|---|
AUTO_CREATE_TABLES |
True(空库自动建表) |
False(仅用 Alembic) |
AUTO_SEED_DATA |
True(空库导入种子) |
False |
SEED_SQL_FILE |
db_script/db_init.sql |
不启用 |
- 控制台 +
backend/logs/info.log+backend/logs/error.log - 使用
from app.core.logger import log, logger
- Python 3.10+,函数与公共方法加类型注解
- 遵循 PEP 8
- Schema 继承
app.shared.schemas.BaseSchema - API 响应统一走
app.utils.response.HttpResponse
- Python 3.10+
- Node.js 18+
- MySQL 8.0+
- Redis 6+(限流 / Celery 需要)
- uv
CREATE DATABASE fastapiwebadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;cd backend
# 安装依赖
uv sync
# 配置环境(首次)
cp env/.env.dev.example env/.env.dev
# 编辑 env/.env.dev:数据库、Redis 等
# 方式 A:开发菜单(Windows)
run_win.bat
# 方式 B:命令行
uv run main.py run --env=dev服务地址:
Linux 快捷脚本:
./run_linux.sh sync # 安装依赖
./run_linux.sh dev # 启动开发服务cd frontend
yarn install # 或 npm install
yarn dev # 开发:http://localhost:3000开发模式下 Vite 将 /api 代理到 http://127.0.0.1:8100,无需改接口路径。
开发环境(推荐): 启动时若库为空,会自动建表并导入 db_script/db_init.sql。
也可手动重置(会删表重建):
cd backend
uv run main.py reset --env=dev生产环境: 关闭 AUTO_CREATE_TABLES 与 AUTO_SEED_DATA,使用 Alembic(见下文)。
所有命令在 backend/ 目录执行:
uv run main.py <command> --env=dev|prod| 命令 | 说明 |
|---|---|
run |
启动 HTTP 服务 |
revision -m "描述" |
根据模型变更生成迁移脚本 |
upgrade |
应用迁移至最新(head) |
upgrade -r <revision> |
升级到指定版本 |
downgrade |
回滚一个版本 |
current |
查看当前迁移版本 |
history |
查看迁移历史 |
reset |
删表重建 + 种子数据(仅 dev) |
开启 AUTO_CREATE_TABLES=True 后,每次启动会自动:
- 扫描全项目各模块下的
model.py - 对缺失表执行
create_all(含新业务插件)
新增业务模块时:写好 model.py 重启服务即可,不必改 Alembic 配置。
关闭自动建表,使用 Alembic 显式迁移:
AUTO_CREATE_TABLES = False
AUTO_SEED_DATA = False迁移目录:backend/app/alembic/versions/。执行 revision 时同样通过 ImportUtil 自动发现模型,无需手动注册。
- 修改 ORM 模型(各业务模块
model.py,基类在app/orm/) - 生成迁移脚本
cd backend
uv run main.py revision --env=dev -m "add xxx column"- 检查生成的文件(
app/alembic/versions/xxxx_*.py),确认upgrade()/downgrade()无误 - 应用迁移
uv run main.py upgrade --env=dev- 提交迁移文件到 Git(与模型变更同一 PR)
# 1. 部署代码
# 2. 备份数据库
# 3. 应用迁移
uv run main.py upgrade --env=prod
# 4. 重启服务生产环境请设置:
AUTO_CREATE_TABLES = False
AUTO_SEED_DATA = False避免 create_all 与 Alembic 状态不一致。
uv run main.py downgrade --env=dev # 回滚 1 个版本
uv run main.py downgrade --env=dev -r -2 # 回滚 2 个版本
uv run main.py history --env=dev # 查看版本链当本地库混乱、种子数据异常时:
uv run main.py reset --env=dev等价于:删表 → create_tables() → 导入 db_init.sql。
- 在对应模块下创建
model.py,模型继承Base - 开发环境重启服务,确认表已自动创建
- 生产环境再执行
revision→upgrade
cd backend
uv sync --no-dev
cp env/.env.prod.example env/.env.prod
# 编辑生产配置
uv run main.py upgrade --env=prod
gunicorn "main:create_app()" \
--factory \
-w 4 \
-k uvicorn.workers.UvicornWorker \
-b 0.0.0.0:8100或使用 start.sh:
./start.sh app 8100异步任务已作为业务插件 app/plugin/fea_celery/ 提供,不启用时不影响主服务。
cd backend
# Worker(Windows 使用 --pool=solo)
celery -A app.plugin.fea_celery.worker.celery worker --pool=solo -l INFO
# Beat(数据库调度器)
celery -A app.plugin.fea_celery.worker.celery beat \
-S app.plugin.fea_celery.scheduler.schedulers:DatabaseScheduler -l INFO或使用 start.sh:
./start.sh celery-worker 8100
./start.sh celery-beat 8100新增任务:在 app/plugin/fea_celery/tasks/ 下编写,并在 plugin.toml 的 [celery].tasks 中注册。
cd frontend
yarn build
# 将 dist/ 部署到 Nginx 等静态服务器Nginx 需将 /api 反向代理到后端 8100 端口。
frontend/src/
├── api/ # 按模块封装 HTTP 请求
├── views/ # 页面(system/ 为系统管理)
├── components/ # 公共组件(synrebort-table、synrebort-card)
├── router/ # 路由与守卫
├── stores/ # Pinia 状态
└── utils/request.ts # Axios 封装
- 组件目录使用 kebab-case(如
synrebort-table/) - 全局组件在
utils/other.ts注册 - 权限按钮使用
v-permission指令
Q: 登录失败 / 用户不存在?
开发环境执行 uv run main.py reset --env=dev 重新导入种子数据。
Q: Redis 报错 AUTH but no password is set?
本地 Redis 无密码时,将 env/.env.dev 中 REDIS_PASSWORD 留空,REDIS_URI 不要带密码段。
Q: 前端请求不到后端?
确认后端已启动在 8100,且 frontend/vite.config.ts 代理 /api → 8100。
Q: bcrypt 密码错误?
项目固定 bcrypt==4.0.1(与 passlib 兼容),请使用 uv sync 安装锁定版本。
Q: 新人误改旧目录?
app/apis、app/services、config.py、cli.py 已删除。只按本文「后端开发规范」在 api/v1 或 plugin 下开发。
cd backend
uv run pytest本项目采用 MIT 协议。
Made with ❤️ by Rebort


