Skip to content

项目结构

深入了解 HEI FastAPI 的模块组织和分层设计。

总体架构

HEI FastAPI 采用模块化单体架构,通过清晰的目录结构实现边界划分。

hei-fastapi/
├── config/                          # 配置模块
│   └── settings.py                  # Pydantic BaseSettings(支持 env 覆盖)
├── core/                            # 核心模块
│   ├── app/                         # 应用设置
│   │   ├── setup.py                 # FastAPI 应用工厂
│   │   ├── router.py                # 路由注册(手动注册所有模块 router)
│   │   ├── lifespan.py              # 生命周期(DB/Redis/SM2/JWT/权限初始化)
│   │   └── health.py                # 健康检查 GET /
│   ├── auth/                        # 认证授权
│   │   ├── auth/                    # 认证工具
│   │   │   ├── hei_auth_tool.py     # B 端 JWT 认证工具
│   │   │   └── hei_client_auth_tool.py  # C 端 JWT 认证工具
│   │   ├── decorator/               # 权限装饰器
│   │   │   ├── hei_check_login.py         # @HeiCheckLogin
│   │   │   ├── hei_check_permission.py    # @HeiCheckPermission("module:action")
│   │   │   ├── hei_check_role.py          # @HeiCheckRole("admin")
│   │   │   ├── hei_client_check_login.py  # C 端 @HeiClientCheckLogin
│   │   │   └── hei_client_check_permission.py  # C 端 @HeiClientCheckPermission
│   │   ├── permission/              # 权限查询接口
│   │   │   ├── hei_permission_interface.py         # 权限查询接口定义
│   │   │   ├── hei_permission_interface_manager.py  # 接口管理器
│   │   │   └── hei_permission_tool.py               # 权限查询门面
│   │   └── permission_scan.py       # 权限自动扫描(启动时扫描装饰器 → Redis)
│   ├── db/                          # 数据库连接
│   │   ├── mysql.py                 # SQLAlchemy 同步引擎 + sessionmaker
│   │   ├── base_dao.py              # BaseDAO 通用 CRUD(软删除透明过滤)
│   │   └── redis.py                 # Redis 异步客户端(redis-py)
│   ├── middleware/                  # 中间件
│   │   ├── auth.py                  # AuthMiddleware(按路径分流 B/C/Public)
│   │   ├── cors.py                  # CORS 中间件
│   │   └── exception.py             # 全局异常处理
│   ├── result/                      # 统一返回
│   │   └── result.py                # success() / failure() / page_data()
│   ├── exception/                   # 异常定义
│   │   └── business_exception.py    # BusinessException
│   ├── enums/                       # 枚举类型
│   │   ├── data_scope_enum.py       # 数据范围枚举(ALL/CUSTOM/ORG/ORG_AND_BELOW/SELF)
│   │   ├── status_enum.py           # 状态枚举
│   │   ├── soft_delete_enum.py      # 软删除枚举
│   │   ├── export_type_enum.py      # 导出类型枚举
│   │   └── ...                      # 其他枚举
│   ├── pojo/                        # 公共数据对象
│   │   ├── page_bounds.py           # 分页参数(PageBounds)
│   │   └── ...                      # IdParam, IdsParam 等
│   └── utils/                       # 工具类
│       ├── sm2_crypto_util.py       # SM2 国密加解密
│       ├── excel_utils.py           # Excel 导出导入
│       ├── ip_utils.py              # 客户端 IP 提取
│       ├── snowflake_utils.py       # 雪花 ID 生成
│       └── model_utils.py           # 模型工具(系统字段剥离、更新、模板)
├── modules/                         # 业务模块
│   ├── auth/                        # 认证模块
│   │   ├── captcha/                 # 图形验证码生成与校验
│   │   └── username/                # 用户名密码登录/注册/登出
│   ├── sys/                         # 系统管理模块
│   │   ├── banner/                  # Banner 管理
│   │   ├── dict/                    # 字典管理(树形结构)
│   │   ├── group/                   # 用户组管理
│   │   ├── notice/                  # 通知管理
│   │   ├── org/                     # 组织管理
│   │   ├── permission/              # 权限管理
│   │   ├── position/                # 职位管理
│   │   ├── resource/                # 资源与模块管理
│   │   ├── role/                    # 角色管理(含权限/资源分配)
│   │   └── user/                    # 用户管理(含角色/组分配)
│   ├── client/                      # C 端模块
│   │   └── user/                    # C 端用户管理
│   └── dev/                         # 代码生成器
│       ├── gen_basic_service.py     # 表信息读取 + 代码生成
│       ├── gen_config_service.py    # 字段配置
│       ├── type_utils.py            # 类型映射工具
│       └── templates/               # Jinja2 模板
├── scripts/                         # 脚本文件
│   └── sqls/
│       └── hei_ddl.sql              # 数据库建表 DDL
├── .env                             # 环境配置
├── main.py                          # 应用入口
├── pyproject.toml                   # 项目配置
└── requirements.txt                 # 依赖列表

模块职责

config(配置模块)

应用配置管理,使用 pydantic-settings 读取环境变量:

  • AppConfig: 应用名称、版本、端口、调试模式
  • DatabaseConfig: MySQL 连接信息 + 连接池 + 软删除配置
  • RedisConfig: Redis 连接信息 + 连接池配置
  • JWTConfig: Token 签发参数
  • SM2Config: 国密密钥对
  • CORSConfig: 跨域配置
  • SnowflakeConfig: 雪花算法实例 ID

core(核心模块)

最基础的公共模块,被所有业务模块依赖:

  • app: FastAPI 应用创建、路由注册、生命周期管理、健康检查
  • auth: 认证装饰器、JWT 认证工具、权限查询接口、权限自动扫描
  • db: MySQL 引擎 + sessionmaker、BaseDAO 通用 CRUD、Redis 客户端
  • middleware: CORS、认证(按路径分流)、全局异常处理
  • result: 统一返回结构 success() / failure() / page_data()
  • exception: BusinessException 业务异常
  • enums: 数据范围、状态、导出类型、软删除等枚举
  • pojo: 分页参数、ID 参数等公共数据对象
  • utils: SM2 加密、Excel、IP、雪花ID、模型工具等

modules(业务模块)

按业务领域划分的具体实现模块:

模块路径说明主要功能
auth/captcha验证码图形验证码生成与校验
auth/username用户名认证B 端登录/注册/登出,SM2 解密 + bcrypt 验证
sys/bannerBanner 管理Banner 轮播图 CRUD
sys/dict字典管理树形字典,支持父子层级和分类
sys/group用户组管理用户组 CRUD + 角色分配
sys/notice通知管理系统通知 CRUD
sys/org组织管理组织架构 CRUD
sys/permission权限管理系统权限 CRUD + 模块列表查询
sys/position职位管理职位 CRUD
sys/resource资源与模块管理模块 + 菜单资源 CRUD
sys/role角色管理角色 CRUD + 权限/资源分配
sys/user用户管理用户 CRUD + 角色/组分配
client/userC 端用户管理客户端用户 CRUD(C 端认证)
dev代码生成器从数据库表自动生成完整 CRUD 模块

垂直切片设计

每个业务模块遵循标准的分层架构,每模块一组 5 个文件:

modules/<domain>/
├── models.py        # SQLAlchemy ORM 模型(Mapped + mapped_column)
├── params.py        # Pydantic v2 请求/响应模型(VO, PageParam, ExportParam, ImportParam)
├── dao.py           # 数据访问层(继承 BaseDAO)
├── service.py       # 业务逻辑层
└── api/v1/api.py    # FastAPI 路由定义 + @HeiCheckPermission 装饰器

数据流

请求 → [中间件] → [路由] → [权限装饰器] → [Service] → [DAO] → 数据库

                                    Result 统一响应 → 返回

模块结构约定

每个业务模块的 API 端点遵循统一的命名规范:

端点方法权限标识说明
/{module}/pageGET{module}:page分页查询
/{module}/createPOST{module}:create新增
/{module}/modifyPOST{module}:modify修改
/{module}/removePOST{module}:remove删除(支持批量)
/{module}/detailGET{module}:detail详情
/{module}/exportGET{module}:exportExcel 导出
/{module}/templateGET{module}:template导入模板下载
/{module}/importPOST{module}:importExcel 导入
/{module}/grant-*POST{module}:grant*分配关联(如角色分配权限)
/{module}/own-*GET{module}:own*获取已分配关联

统一返回结构

所有接口统一使用标准封装返回结果:

json
{
  "code": 200,
  "message": "请求成功",
  "data": { ... },
  "success": true
}

分页返回:

json
{
  "code": 200,
  "message": "请求成功",
  "data": {
    "records": [...],
    "total": 100,
    "page": 1,
    "size": 20,
    "pages": 5
  },
  "success": true
}

认证中间件

AuthMiddleware 自动根据 API 路径进行认证检查:

python
# 路径匹配规则
PUBLIC_B_PATTERN     = r"^/api/v\d+/public/b/"      # B端公开
PUBLIC_C_PATTERN     = r"^/api/v\d+/public/c/"      # C端公开
PRIVATE_C_PATTERN    = r"^/api/v\d+/c/"              # C端私有
PRIVATE_B_PATTERN    = r"^/api/v\d+/b/"              # B端私有(显式)
DEFAULT_B_PATTERN    = r"^/api/v\d+/(?!b|c|public)[^/]+/"  # B端私有(默认)

权限装饰器

B 端权限装饰器

python
from core.auth.decorator import HeiCheckLogin, HeiCheckRole, HeiCheckPermission

@router.get("/api/v1/sys/example/page")
@HeiCheckPermission("sys:example:page")
async def page(request: Request, db: Session = Depends(get_db)):
    return success(service.page(param))

装饰器必须位于 @router.* 下方(紧贴函数)。

C 端权限装饰器

python
from core.auth.decorator import HeiClientCheckLogin, HeiClientCheckPermission

@router.get("/api/v1/c/example/page")
@HeiClientCheckPermission("c:example:page")
async def c_page(request: Request, db: Session = Depends(get_db)):
    return success(service.page(param))

权限数据链路

User ──→ RalUserRole ──→ Role ──→ RalRolePermission ──→ Permission
User ──→ RalUserGroup ──→ Group ──→ RalGroupRole ──→ Role ──→ ...
User ──→ RalUserPermission ──→ Permission (直授)

数据范围存储在关系表中,多角色多路径下按最严策略合并。

Released under the MIT License.