Become a sponsor

概述
目录结构遵循"按职责分层、按模块分组"的原则。后端以 app/ 为核心,按 Controller → Logic → Model → Validate 四层组织;前端以 src/ 为核心,按 API → Views → Store 分层。两侧通过路由和 API 接口对接。
项目根目录/
├── app/ ← 应用代码(核心)
├── config/ ← 配置文件
├── extend/ ← 扩展类库(非 Composer)
├── public/ ← Web 入口 + 静态资源
├── route/ ← 路由定义
├── templates/ ← 代码生成器模板
├── runtime/ ← 运行时缓存(自动生成)
├── vendor/ ← Composer 依赖
├── wiki/ ← 文档站点(VitePress)
├── document/ ← 开发参考手册(txt)
├── .env ← 环境变量配置
└── think ← ThinkPHP 命令行入口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 个文件:
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 等 |
服务层提供跨模块复用的无状态能力,按单一职责拆分:
| 服务 | 文件 | 说明 |
|---|---|---|
| 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 | 导入导出(支持大数据量分批) |
| 中间件 | 文件 | 作用域 | 说明 |
|---|---|---|---|
| 跨域 | CorsMiddleware.php | 全局 | CORS 头设置 |
| 认证权限 | AuthMiddleware.php | 路由级 | JWT 校验 + 权限校验 |
| 租户上下文 | TenantMiddleware.php | 路由级 | 解析注入 tenantId |
| 演示环境 | DemoMiddleware.php | 路由级 | 演示环境写操作拦截 |
| 操作日志 | LogMiddleware.php | 路由级 | 基于注解记录操作日志 |
| 命令 | 文件 | 说明 |
|---|---|---|
| 定时任务执行 | JobRunCommand.php | 执行一次定时任务 |
| 定时任务守护 | JobDaemonCommand.php | 常驻进程循环扫描执行 |
| 代码生成 | GeneratorCommand.php | CLI 方式生成 CRUD 代码 |
| 数据库迁移 | DbMigrateCommand.php | 跨数据库迁移 CLI 工具 |
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) |
存放不通过 Composer 管理的自定义类库,按 PSR-4 自动加载:
extend/
├── jwt/
│ └── Jwt.php JWT 工具类(封装 firebase/php-jwt)
├── response/
│ └── Result.php 统一响应类(success/fail/page 等)
└── (无自定义扩展类)使用方式:直接通过命名空间引用,如 \response\Result::success()、\jwt\Jwt::getTokenFromHeader()。
route/
└── app.php 应用路由定义(所有 API 路由)路由按模块分组,示例:
// 公开接口(无需认证)
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/
├── controller.php.tpl 控制器模板
├── logic.php.tpl 业务逻辑模板
├── model.php.tpl 模型模板
├── validate.php.tpl 验证器模板
├── ui/ 普通列表前端模板
└── ui2/ 树形结构前端模板由 GeneratorService 渲染,通过代码生成器 CLI 或 API 调用。
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)分散在各自目录中,通过命名前缀关联。这种"水平分层 + 垂直命名"的方式:
| 类型 | 规范 | 示例 |
|---|---|---|
| 控制器 | 大驼峰 + 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 |