# 目录结构设计 本章详细说明项目目录结构设计,包括后端 `src/` 和前端 `ui/src/` 的完整目录树及各目录的设计意图。 :::tip 设计原则 目录结构遵循「按功能分组、按职责分层」的原则。后端 `src/` 按技术层次组织(core / middleware / api / modules),前端 `ui/src/` 按功能领域组织(api / views / components / store)。每个目录有明确的边界和单一职责。 ::: ## 后端目录结构 ``` src/ ├── main.py # 应用入口:uvicorn 启动,加载 create_app() ├── core/ # 核心基础设施层 │ ├── app.py # 应用工厂:create_app() 组装中间件、路由、异常处理 │ ├── config/ # 配置模块(从 .env 加载) │ │ ├── __init__.py # 加载 .env,统一导出所有配置 │ │ ├── app.py # 应用配置:DEBUG、CORS、上传限制 │ │ ├── auth.py # JWT 配置:密钥、过期时间 │ │ ├── captcha.py # 验证码配置 │ │ ├── database.py # 数据库配置:连接 URL、驱动注册、连接池 │ │ ├── email.py # 邮件配置 │ │ ├── rate_limit.py # 限流配置:开关、阈值、窗口 │ │ ├── redis.py # Redis 配置:连接参数 │ │ └── sms.py # 短信配置 │ ├── database.py # 数据库引擎:SessionLocal / _db_ctx / get_db_session() │ ├── redis_client.py # Redis 客户端:连接池、contextvars 注入、Lua 脚本 │ ├── jwt.py # JWT 工具:签发 / 解析 / 续签 / 黑名单 │ ├── password.py # 密码工具:bcrypt 哈希 + 盐值 │ ├── security.py # 安全工具:get_user_id / get_username / get_realname │ ├── response.py # 统一响应:R.ok() / R.failed() / R.page() │ ├── exceptions.py # 自定义异常:AuthorizationException / BusinessException │ ├── access_decorators.py # 访问装饰器:permission_required / check_demo │ ├── logger.py # 日志配置:结构化日志、文件输出 │ ├── base_model.py # 模型基类:通用字段 + to_dict() 序列化 │ ├── base_db.py # 数据库操作基类:save() 持久化方法 │ ├── base_repository.py # 仓库基类:通用 CRUD + 软删除 + 分页 │ ├── base_service.py # 服务基类:模板方法 CRUD + 差异点钩子 │ └── base_schemas.py # Schema 基类:BaseForm(含可选 id 字段) │ ├── middleware/ # HTTP 中间件层 │ ├── __init__.py # 统一导出 │ ├── cors.py # CORS 跨域中间件 │ ├── rate_limit.py # 滑动窗口限流中间件 │ ├── db_session.py # 数据库会话中间件(commit/rollback) │ ├── operation_log.py # 操作日志中间件 │ ├── upload_size_limit.py # 上传体积限制中间件 │ └── logger.py # 请求日志钩子 │ ├── api/ # 路由装配层 │ ├── __init__.py # register_router:挂载 auth(免认证)+ v1(login_required) │ ├── deps.py # login_required 依赖:JWT 解析 + Token 黑名单检查 │ └── v1/ # API v1 版本 │ ├── router.py # 中央路由注册:所有模块路由统一挂载到 v1 实例 │ └── endpoints/ # HTTP 端点层(每个模块一个文件) │ ├── auth.py # 登录/登出/验证码/Token 刷新 │ ├── position.py # 岗位管理 │ ├── level.py # 职级管理 │ ├── dept.py # 部门管理 │ ├── role.py # 角色管理 │ ├── role_menu.py # 角色菜单分配 │ ├── menu.py # 菜单管理 │ ├── user.py # 用户管理 │ ├── user_role.py # 用户角色分配 │ ├── city.py # 城市/行政区划 │ ├── notice.py # 通知公告 │ ├── param.py # 参数管理 │ ├── category.py # 文章分类 │ ├── article.py # 文章管理 │ ├── file_template.py # 文件模板 │ ├── link.py # 友链管理 │ ├── dict.py # 字典管理 │ ├── dict_item.py # 字典项管理 │ ├── config.py # 配置管理 │ ├── config_item.py # 配置项管理 │ ├── login_log.py # 登录日志 │ ├── operation_log.py # 操作日志 │ ├── job.py # 定时任务 │ ├── job_log.py # 任务日志 │ ├── upload.py # 文件上传 │ ├── generator.py # 代码生成器 │ ├── index.py # 系统主页 │ └── example.py # 案例演示 │ ├── modules/ # 业务模块层(纯业务逻辑) │ ├── auth/ # 认证模块 │ │ ├── models.py # 登录日志模型 │ │ ├── schemas.py # 登录表单校验 │ │ └── service.py # 登录/登出/验证码/锁定逻辑 │ ├── system/ # 系统管理模块组 │ │ ├── position/ # 岗位管理 │ │ │ ├── models.py # Position 模型 │ │ │ ├── repository.py # PositionRepository + 单例 │ │ │ ├── schemas.py # PositionForm / PositionStatusForm │ │ │ └── service.py # PositionService + 单例 │ │ ├── level/ # 职级管理(同结构) │ │ ├── dept/ # 部门管理(支持树形) │ │ ├── role/ # 角色管理 │ │ ├── role_menu/ # 角色菜单关联 │ │ ├── menu/ # 菜单管理(支持树形) │ │ ├── user/ # 用户管理(复杂模块) │ │ └── user_role/ # 用户角色关联 │ ├── dictionary/ # 字典模块组 │ │ ├── dict/ # 字典 │ │ └── dict_item/ # 字典项 │ ├── configuration/ # 配置模块组 │ │ ├── config/ # 配置 │ │ └── config_item/ # 配置项 │ ├── article/ # 文章管理 │ ├── category/ # 文章分类 │ ├── city/ # 城市/行政区划 │ ├── file_template/ # 文件模板 │ ├── link/ # 友链管理 │ ├── notice/ # 通知公告 │ ├── param/ # 参数管理 │ ├── job/ # 定时任务(含调度器) │ ├── job_log/ # 任务执行日志 │ ├── login_log/ # 登录日志 │ ├── operation_log/ # 操作日志 │ ├── upload/ # 文件上传 │ ├── generator/ # 代码生成器 │ └── example/ # 案例演示 │ ├── constants/ # 常量与枚举 │ ├── __init__.py # 统一导出 │ ├── constants.py # 通用常量:PAGE_SIZE / DEFAULT_PASSWORD / SERIALIZE_EXCLUDE_FIELDS │ └── pagination.py # 分页参数解析 │ ├── utils/ # 工具函数 │ ├── __init__.py # 重导出 R / password(向后兼容) │ ├── request.py # 请求工具:parse_batch_ids / like_contains / parse_pagination │ ├── string.py # 字符串工具:驼峰/下划线互转 │ ├── dict_util.py # 数据字典工具:进程内缓存 + Redis 二级缓存 │ ├── ip.py # IP 工具:客户端 IP 提取 │ ├── ip2region.py # IP 地理位置解析 │ ├── ua.py # User-Agent 解析 │ ├── rich_text.py # 富文本处理:图片迁移 + XSS 清洗 │ ├── file.py # 文件工具 │ ├── response_body.py # 响应体读取/重建(中间件用) │ ├── captcha/ # 验证码生成 │ └── perm_cache.py # 权限缓存工具 │ ├── scripts/ # 运维脚本 │ ├── init_db.py # 数据库初始化(建库 + 建表 + 灌数据) │ └── migrate_db.py # 跨库数据迁移工具 │ └── migrations/ # Alembic 迁移 ├── env.py # 迁移环境配置 └── versions/ # 迁移版本文件 └── 0001_baseline.py # 基线迁移 ``` ### 目录设计意图 | 目录 | 设计意图 | |:---|:---| | `core/` | 基础设施层,提供所有模块共用的基类、工具和配置。不包含业务逻辑 | | `core/config/` | 配置按功能拆分子模块,统一从 `.env` 加载,避免单一大文件 | | `middleware/` | 中间件独立于 core,职责单一,便于按需注册和测试 | | `api/` | 路由装配层,将所有模块的 HTTP 端点集中注册,便于查看全量 API | | `api/v1/endpoints/` | HTTP 端点层,每个模块一个文件,只做请求转发 | | `modules/` | 业务模块层,按功能域分组(system / dictionary / configuration),每个模块包含 models + repository + schemas + service | | `modules/{group}/` | 模块组:将关联模块归组(如 system 下的 user / role / menu / dept) | | `constants/` | 常量与枚举独立管理,避免硬编码散落各处 | | `utils/` | 工具函数按功能拆分,提供请求解析、字符串处理、缓存等通用能力 | | `scripts/` | 运维脚本独立于业务代码,便于部署和维护 | ## 前端目录结构 ``` ui/src/ ├── main.ts # 应用入口 ├── App.vue # 根组件 ├── api/ # API 接口层(按后端模块对应) │ ├── system/ # 系统管理 API │ │ ├── position.ts # 岗位管理 API │ │ ├── level.ts # 职级管理 API │ │ ├── dept.ts # 部门管理 API │ │ ├── role.ts # 角色管理 API │ │ ├── menu.ts # 菜单管理 API │ │ └── user.ts # 用户管理 API │ ├── content/ # 内容管理 API │ │ ├── article.ts # 文章管理 API │ │ ├── category.ts # 文章分类 API │ │ ├── notice.ts # 通知公告 API │ │ └── link.ts # 友链管理 API │ ├── data/ # 数据管理 API │ │ ├── dict.ts # 字典管理 API │ │ ├── config.ts # 配置管理 API │ │ └── param.ts # 参数管理 API │ ├── common/ # 公共 API │ │ └── index.ts # 登录/登出/验证码 │ ├── dashboard/ # 仪表盘 API │ ├── file/ # 文件管理 API │ ├── monitor/ # 监控 API │ ├── region/ # 行政区划 API │ ├── setting/ # 设置 API │ └── tool/ # 工具 API │ ├── views/ # 页面视图(按功能域分组) │ ├── login/ # 登录页 │ ├── dashboard/ # 仪表盘 │ ├── system/ # 系统管理页面 │ │ ├── position/ # 岗位管理页面 │ │ ├── level/ # 职级管理页面 │ │ ├── dept/ # 部门管理页面 │ │ ├── role/ # 角色管理页面 │ │ ├── menu/ # 菜单管理页面 │ │ └── user/ # 用户管理页面 │ ├── content/ # 内容管理页面 │ ├── data/ # 数据管理页面 │ ├── monitor/ # 监控页面 │ ├── setting/ # 设置页面 │ ├── tool/ # 工具页面 │ ├── file/ # 文件管理页面 │ ├── exception/ # 异常页面(404/403/500) │ ├── about/ # 关于页面 │ ├── iframe/ # 内嵌页面 │ └── redirect/ # 重定向页面 │ ├── components/ # 全局公共组件 │ ├── Table/ # 表格组件 │ ├── Form/ # 表单组件 │ ├── Modal/ # 弹窗组件 │ ├── Upload/ # 上传组件 │ ├── Editor/ # 富文本编辑器 │ ├── Excel/ # Excel 导入导出 │ ├── Select/ # 选择器组件 │ ├── Cropper/ # 图片裁剪 │ ├── Qrcode/ # 二维码 │ ├── Page/ # 分页组件 │ ├── Password/ # 密码组件 │ ├── Authority/ # 权限组件 │ ├── CheckToken/ # Token 检查 │ ├── ChinaArea/ # 中国行政区划 │ ├── Websocket/ # WebSocket 组件 │ ├── Lockscreen/ # 锁屏 │ ├── CountTo/ # 数字动画 │ ├── Render/ # 自定义渲染 │ ├── Application/ # 应用组件 │ ├── Region/ # 区域选择 │ ├── TableSelect/ # 表格选择 │ ├── icon/ # 图标组件 │ ├── importFile/ # 文件导入 │ ├── numberInput/ # 数字输入 │ └── pagination/ # 分页组件 │ ├── store/ # Pinia 状态管理 │ └── modules/ # 状态模块 │ ├── user.ts # 用户状态(Token/用户信息/权限) │ ├── app.ts # 应用状态(主题/布局/语言) │ ├── permission.ts # 权限状态(动态路由) │ ├── tabs.ts # 标签页状态 │ └── dict.ts # 字典缓存 │ ├── router/ # Vue Router 路由 │ ├── index.ts # 路由配置入口 │ └── menus/ # 菜单路由 │ ├── hooks/ # Composition API Hooks │ ├── core/ # 核心 Hooks │ ├── event/ # 事件 Hooks │ ├── setting/ # 设置 Hooks │ └── web/ # Web Hooks │ ├── layout/ # 布局组件 │ └── components/ # 布局子组件(侧边栏/头部/标签页) │ ├── directives/ # 自定义指令 ├── enums/ # 前端枚举 ├── plugins/ # 插件 ├── settings/ # 应用设置 ├── styles/ # 全局样式 │ ├── theme/ # 主题样式 │ └── transition/ # 过渡动画 ├── utils/ # 工具函数 │ ├── http/ # Axios 封装 │ ├── file/ # 文件工具 │ ├── helper/ # 辅助函数 │ ├── is/ # 类型判断 │ └── lib/ # 第三方库封装 └── assets/ # 静态资源 ├── icons/ # 图标 └── images/ # 图片 ``` ### 前后端目录对应关系 | 前端目录 | 后端目录 | 说明 | |:---|:---|:---| | `api/system/position.ts` | `api/v1/endpoints/position.py` | API 接口定义一一对应 | | `views/system/position/` | `modules/system/position/` | 页面视图对应业务模块 | | `store/modules/user.ts` | `modules/auth/service.py` | 用户状态对应认证服务 | | `components/` | `utils/` + `core/` | 公共组件对应后端工具 | ## 目录规范 :::warning 目录命名规范 1. **后端**:目录名使用小写下划线(snake_case),与 Python 模块命名一致 2. **前端**:目录名使用小写 kebab-case 或 camelCase,与 Vue 生态习惯一致 3. **模块文件**:每个模块固定包含 `models.py` / `repository.py` / `schemas.py` / `service.py` 四个文件 4. **端点文件**:每个模块对应一个端点文件,文件名与模块名一致 ::: ## 总结 目录结构是项目可维护性的基础。后端按技术层次(core / middleware / api / modules)组织,前端按功能领域(api / views / components / store)组织。每个目录有明确的边界和单一职责,模块内部遵循固定的文件结构(models + repository + schemas + service)。这种设计使得新开发者能快速定位代码,新模块能按既定模式快速创建。