Skip to content

目录结构

text
Hey26/
├── config/
│   ├── config.json         # 运行配置、密钥
│   ├── map.json            # 关卡映射(顺序即等级)
│   └── services.json       # 服务插件映射
├── static/                 # 可选:根静态资源(可覆盖 `/`)
├── statics/                # 主页静态站点(默认从 `/` 提供)
├── core/
│   ├── auth.py             # JWT 生成/解析
│   ├── config.py           # 配置与映射加载
│   ├── dependencies.py     # 关卡权限依赖
│   └── fingerprint.py      # 指纹生成
├── levels/
│   └── <module>/           # 关卡模块
│       ├── __init__.py     # FastAPI router
│       └── static/         # 可选:静态资源
├── services/
│   └── <module>/           # 服务插件
│       └── __init__.py
├── main.py                 # FastAPI 入口
├── manage.py               # TUI 管理器
└── vp/                     # VitePress 文档站点

启动流程(main.py:create_app()

  1. load_config():加载或生成 config/config.json
  2. 若存在根目录 static/:将 static/index.html 挂到 /,并将其他文件名挂到 /<filename>
  3. map_levels():读取 config/map.json 并按顺序加载关卡。
  4. 对每个关卡条目:
    • 导入 levels.<module>
    • 注入关卡索引:优先调用 set_level_index,否则设置 CURRENT_LEVEL_INDEX
    • 挂载 API 路由到 /api/{slug},带权限依赖 Depends(check_level_permission(idx))
    • 若存在 levels/<module>/static,挂载到 /{slug}
  5. map_services():读取 config/services.json 加载服务模块,挂载到 /services/{slug}(无默认权限依赖)。
  6. 注册 /health
  7. 若存在 statics/main/:挂载静态站点到 /(当根目录 static/index.html 存在时,/ 会优先命中该路由)。

路由布局

  • 根静态资源:/static/index.html,如果存在)与 /<filename>static/ 下文件名映射)
  • 关卡 API:/api/{slug}(权限依赖)
  • 关卡静态页:/{slug}(若存在 static)
  • 服务插件:/services/{slug}(默认无权限)