# 4.5 目录结构设计 :::tip 概述 目录结构遵循"按职责分层、按模块分组"的原则。后端以 `app/` 为核心,按 Controller → Logic → Model → Validate 四层组织;前端以 `src/` 为核心,按 API → Views → Store 分层。两侧通过路由和 API 接口对接。 ::: ## 后端整体结构 ```text 项目根目录/ ├── app/ ← 应用代码(核心) ├── config/ ← 配置文件 ├── extend/ ← 扩展类库(非 Composer) ├── public/ ← Web 入口 + 静态资源 ├── route/ ← 路由定义 ├── templates/ ← 代码生成器模板 ├── runtime/ ← 运行时缓存(自动生成) ├── vendor/ ← Composer 依赖 ├── document/ ← 开发参考手册(txt) ├── .env ← 环境变量配置 └── think ← ThinkPHP 命令行入口 ``` ## app/ 目录详解 ```text app/ ├── BaseController.php 控制器基类 ├── BaseModel.php 模型基类 ├── BaseLogic.php 业务逻辑基类(系统共享模块) ├── BaseTenantLogic.php 租户逻辑基类(租户隔离模块) ├── ExceptionHandle.php 统一异常处理(JSON 响应) ├── Request.php 请求类扩展 ├── common.php 公共函数库 ├── event.php 事件定义 ├── middleware.php 全局中间件注册 │ ├── controller/ 控制器层(28 个) ├── logic/ 业务逻辑层(26 个) ├── model/ 数据模型层(25 个) ├── validate/ 验证器(21 个) ├── service/ 通用服务层(11 个) ├── middleware/ 中间件(5 个) ├── attribute/ 注解定义(3 个) ├── command/ 命令行命令(4 个) └── task/ 定时任务处理器(3 个) ``` ### 各目录职责与命名规范 | 目录 | 职责 | 命名规则 | 数量 | 说明 | |------|------|----------|------|------| | `controller/` | HTTP 请求入口 | `{Module}Controller.php` | 28 | 一个模块一个文件,注解标注权限和日志 | | `logic/` | 业务逻辑 | `{Module}Logic.php` | 26 | 属性配置 + 生命周期钩子,核心业务层 | | `model/` | 数据库映射 | `{TableName}.php`(大驼峰) | 25 | 继承 BaseModel,获软删除 + 审计字段 | | `validate/` | 参数校验 | `{Module}Validate.php` | 21 | 定义规则 + 场景,Logic 层自动调用 | | `service/` | 通用服务 | `{Name}Service.php` | 11 | 跨模块复用的无状态工具类 | | `middleware/` | 中间件 | `{Name}Middleware.php` | 5 | 请求拦截:认证、租户、日志等 | | `attribute/` | 注解类 | `{Name}.php` | 3 | PHP 8 注解:Log、Permission、DemoAllow | | `command/` | 命令行 | `{Name}Command.php` | 4 | CLI 命令:定时任务、代码生成、迁移 | | `task/` | 任务处理器 | `{Name}Task.php` | 3 | 定时任务的具体执行逻辑 | ### 模块文件对应关系 以"用户管理"模块为例,一个完整模块包含 4 个文件: ```text app/ ├── controller/UserController.php ← HTTP 入口(路由指向这里) ├── logic/UserLogic.php ← 业务逻辑(属性配置 + 钩子) ├── model/User.php ← 数据模型(表映射) └── validate/UserValidate.php ← 参数校验(规则 + 场景) ``` 请求流转:`Controller → Logic → Model → 数据库` ### 基类与公共文件 | 文件 | 说明 | |------|------| | `BaseController.php` | 控制器基类:统一响应、参数获取、通用 CRUD 快捷方法 | | `BaseLogic.php` | 逻辑基类:声明式 CRUD、生命周期钩子、自动参数校验、文件/富文本/枚举/权限/租户处理 | | `BaseTenantLogic.php` | 租户逻辑基类:继承 BaseLogic,自动启用 `tenant_id` 隔离 | | `BaseModel.php` | 模型基类:软删除(`is_delete`)、审计字段自动写入 | | `ExceptionHandle.php` | 异常处理:所有异常统一渲染为 JSON 响应 | | `common.php` | 公共函数:字符串处理、加密、文件操作、驼峰转换等 | | `event.php` | 事件定义:全局事件监听 | | `middleware.php` | 全局中间件注册:CORS 等 | ### service/ 服务层清单 服务层提供跨模块复用的无状态能力,按单一职责拆分: | 服务 | 文件 | 说明 | |------|------|------| | JWT 认证 | `JwtService.php` | 登录、刷新、解析 Token | | 密码加密 | `PasswordService.php` | bcrypt 双重加盐 | | 字典服务 | `DictService.php` | 字典缓存与查询(两级缓存) | | 系统参数 | `ParamService.php` | 系统参数服务(两级缓存) | | 验证码 | `CaptchaService.php` | 图片验证码生成与校验 | | 请求信息 | `RequestInfoService.php` | 客户端 IP、UA、归属地解析 | | 注解读取 | `AttributeService.php` | PHP 8 注解反射读取 + 缓存 | | 代码生成 | `GeneratorService.php` | 根据数据库表生成 CRUD 代码 | | 数据库迁移 | `DbMigrateService.php` | 跨数据库迁移引擎 | | DDL 生成 | `DbSchemaBuilder.php` | 跨库类型映射的 DDL 生成器 | | Excel | `ExcelService.php` | 导入导出(支持大数据量分批) | ### middleware/ 中间件清单 | 中间件 | 文件 | 作用域 | 说明 | |--------|------|--------|------| | 跨域 | `CorsMiddleware.php` | 全局 | CORS 头设置 | | 认证权限 | `AuthMiddleware.php` | 路由级 | JWT 校验 + 权限校验 | | 租户上下文 | `TenantMiddleware.php` | 路由级 | 解析注入 tenantId | | 演示环境 | `DemoMiddleware.php` | 路由级 | 演示环境写操作拦截 | | 操作日志 | `LogMiddleware.php` | 路由级 | 基于注解记录操作日志 | ### command/ 命令行清单 | 命令 | 文件 | 说明 | |------|------|------| | 定时任务执行 | `JobRunCommand.php` | 执行一次定时任务 | | 定时任务守护 | `JobDaemonCommand.php` | 常驻进程循环扫描执行 | | 代码生成 | `GeneratorCommand.php` | CLI 方式生成 CRUD 代码 | | 数据库迁移 | `DbMigrateCommand.php` | 跨数据库迁移 CLI 工具 | ## config/ 配置文件 ```text config/ ├── api.php API 配置(驼峰转换开关) ├── app.php 应用配置(调试模式、异常处理) ├── cache.php 缓存配置(支持 Redis) ├── console.php 命令行配置 ├── cors.php 跨域配置 ├── database.php 数据库配置 ├── file.php 文件上传配置(域名、大小限制) ├── jwt.php JWT 配置(密钥、过期时间) ├── middleware.php 中间件排除列表 └── route.php 路由配置 ``` | 配置文件 | 关键配置项 | 说明 | |----------|-----------|------| | `api.php` | `camel_snake_convert` | 驼峰/下划线自动转换开关 | | `database.php` | `type` / `hostname` / `database` | 数据库连接(支持 MySQL/PG/SqlServer/Oracle/SQLite) | | `file.php` | `domain_url` / `max_size` | 文件上传域名和大小限制 | | `jwt.php` | `secret` / `access_ttl` / `refresh_ttl` | JWT 密钥和令牌有效期 | | `cache.php` | `type` / `host` | 缓存驱动(file/redis) | ## extend/ 扩展类库 存放不通过 Composer 管理的自定义类库,按 PSR-4 自动加载: ```text extend/ ├── jwt/ │ └── Jwt.php JWT 工具类(封装 firebase/php-jwt) ├── response/ │ └── Result.php 统一响应类(success/fail/page 等) └── (无自定义扩展类) ``` 使用方式:直接通过命名空间引用,如 `\response\Result::success()`、`\jwt\Jwt::getTokenFromHeader()`。 ## route/ 路由定义 ```text route/ └── app.php 应用路由定义(所有 API 路由) ``` 路由按模块分组,示例: ```php // 公开接口(无需认证) Route::group('login', function () { Route::post('login', 'LoginController/login'); Route::get('captcha', 'LoginController/captcha'); }); // 需认证接口(AuthMiddleware) Route::group('article', function () { Route::get('page', 'ArticleController/page'); Route::post('add', 'ArticleController/add'); Route::put('update', 'ArticleController/update'); Route::delete('delete/:id', 'ArticleController/delete'); })->middleware(AuthMiddleware::class); ``` ## templates/ 代码生成模板 ```text templates/ ├── controller.php.tpl 控制器模板 ├── logic.php.tpl 业务逻辑模板 ├── model.php.tpl 模型模板 ├── validate.php.tpl 验证器模板 ├── ui/ 普通列表前端模板 └── ui2/ 树形结构前端模板 ``` 由 `GeneratorService` 渲染,通过代码生成器 CLI 或 API 调用。 ## 前端目录设计 ```text ui/src/ ├── api/ ← API 接口(按业务域分组) ├── views/ ← 页面视图(按业务域分组) ├── components/ ← 公共组件(跨页面复用) ├── store/ ← 状态管理(Pinia) ├── router/ ← 路由配置 ├── hooks/ ← 组合式函数 ├── directives/ ← 自定义指令 ├── enums/ ← 枚举常量 ├── styles/ ← 全局样式 ├── utils/ ← 工具函数 ├── layout/ ← 布局组件 ├── plugins/ ← 插件 ├── settings/ ← 项目配置 └── assets/ ← 静态资源 ``` ## 前后端目录对应关系 | 后端 | 前端 | 说明 | |------|------|------| | `app/controller/UserController.php` | `src/api/system/user.ts` | API 接口函数 | | `app/logic/UserLogic.php` | `src/views/system/user/` | 业务页面 | | `app/model/User.php` | — | 前端不直接操作模型 | | `app/validate/UserValidate.php` | — | 前端校验由表单组件处理 | | `route/app.php` | `src/api/**/*.ts` | 路由 ↔ API 函数映射 | | `config/dict*.php` | `src/enums/` | 字典 ↔ 枚举常量 | ## 设计原则 ### 按职责分层 每层只做一件事,层间通过方法调用串联: | 层 | 职责 | 不应该做 | |----|------|----------| | Controller | 参数获取、响应封装、注解标注 | 业务逻辑、数据库操作 | | Logic | 业务编排、钩子处理、校验 | 直接 HTTP 交互 | | Model | 表映射、关联关系、软删除 | 复杂业务判断 | | Validate | 参数格式校验 | 业务规则校验 | ### 按模块分组 同一业务模块的 4 个文件(Controller / Logic / Model / Validate)分散在各自目录中,通过命名前缀关联。这种"水平分层 + 垂直命名"的方式: - 便于按职责查找(所有控制器在一起) - 便于代码生成器按模板批量生成 - 便于基类统一处理(如 BaseLogic 的属性驱动) ### 文件命名规范 | 类型 | 规范 | 示例 | |------|------|------| | 控制器 | 大驼峰 + Controller | `ArticleController.php` | | 逻辑层 | 大驼峰 + Logic | `ArticleLogic.php` | | 模型 | 大驼峰(表名) | `Article.php` | | 验证器 | 大驼峰 + Validate | `ArticleValidate.php` | | 服务 | 大驼峰 + Service | `DictService.php` | | 中间件 | 大驼峰 + Middleware | `AuthMiddleware.php` | | 注解 | 大驼峰 | `Log.php`、`Permission.php` | | 命令 | 大驼峰 + Command | `GeneratorCommand.php` | | 任务 | 大驼峰 + Task | `SendSmsTask.php` |