Skip to content

4.5 目录结构设计 ​

概述

目录结构遵循"按职责分层、按模块分组"的原则。后端以 app/ 为核心,按 Controller → Request → Service → Model 四层组织;前端以 src/ 为核心,按 API → Views → Store 分层。两侧通过路由和 API 接口对接。

后端整体结构 ​

text
项目根目录/
├── app/                    ← 应用代码(核心)
├── bootstrap/              ← 应用引导(中间件别名/分组、健康检查路由)
├── config/                 ← 配置文件(18 个,7 个独立业务配置)
├── database/               ← 迁移(空)/ 种子 / 工厂
├── docker/                 ← Docker 部署文件
├── public/                 ← Web 入口 + 静态资源
├── resources/              ← 生成器模板(templates/)+ Blade 视图 + Vite 资源
├── routes/                 ← 路由定义(api / web / console)
├── storage/                ← 运行时产物(日志/缓存/会话,需可写)
├── tests/                  ← PHPUnit 测试
├── uploads/                ← 上传文件目录
├── vendor/                 ← Composer 依赖
├── document/               ← 五种数据库初始化脚本
├── artisan                  ← Artisan 命令行入口
└── .env                     ← 环境变量配置

app/ 目录详解 ​

text
app/
├── Attributes/              注解定义(3 个)
│   ├── Permission.php       权限校验注解
│   ├── OperationLog.php     操作日志注解
│   └── DemoAllow.php        演示环境放行注解
├── Console/Commands/        命令行命令(5 个)
├── Exceptions/              异常处理
│   ├── BizException.php     业务异常
│   └── Handler.php          统一异常渲染(JSON)
├── Helpers/helpers.php      全局辅助函数(21 个)
├── Http/
│   ├── Controllers/
│   │   ├── Controller.php   控制器基类
│   │   └── Api/             控制器层(28 个)
│   ├── Middleware/           中间件(7 个)
│   └── Requests/            表单请求(24 个 + BaseRequest)
├── Models/                   数据模型层(25 个)
│   └── Concerns/            模型 Trait(3 个)
├── Observers/                模型观察者(3 个,缓存失效)
├── Providers/                服务提供者(启动校验 + Observer + oci 驱动注册)
├── Services/                 服务层(36 个)
│   └── Concerns/             Service Trait(7 个)
├── Support/                  基础支撑(Auth / Result)
└── Task/                     定时任务处理器(3 个)

各目录职责与命名规范 ​

目录职责命名规则数量说明
Http/Controllers/Api/HTTP 请求入口{Module}Controller.php28一个模块一个文件,注解标注权限和日志
Http/Requests/参数格式校验{Module}Request.php24+1继承 BaseRequest,控制器类型注入
Services/业务逻辑{Module}Service.php36属性配置 + 生命周期钩子,核心业务层
Models/数据库映射{TableName}.php(大驼峰)25模型 Trait 获软删除 + 审计字段
Http/Middleware/中间件见下方清单7请求拦截:认证、租户、日志等
Attributes/注解类{Name}.php3Permission、OperationLog、DemoAllow
Console/Commands/命令行{Name}Command.php 等5CLI 命令:生成器、迁移、任务、字典缓存
Task/任务处理器{Name}Task.php3定时任务的具体执行逻辑
Observers/缓存失效{Name}Observer.php3字典/菜单/角色菜单变更 → 清缓存
Support/基础支撑Auth.php / Result.php2当前登录用户 / 统一响应

模块文件对应关系 ​

以"用户管理"模块为例,一个完整模块包含 4 个文件:

text
app/
├── Http/Controllers/Api/UserController.php   ← HTTP 入口(路由指向这里)
├── Http/Requests/UserRequest.php             ← 参数校验(规则 + 中文消息)
├── Services/UserService.php                  ← 业务逻辑(属性配置 + 钩子)
└── Models/User.php                           ← 数据模型(表映射 + Trait)

请求流转:Controller → (FormRequest 校验) → Service → Model → 数据库

基类与公共文件 ​

文件说明
Http/Controllers/Controller.php控制器基类:success/fail/paginate 响应 + _page/_add 等通用 CRUD 快捷方法 + 参数获取
Http/Requests/BaseRequest.php请求基类:授权统一放行、失败统一 JSON
Services/BaseService.php服务基类:全部声明式属性集中声明 + Trait 占位方法 + 处理链
Services/BaseTenantService.php租户服务基类:继承 BaseService,自动 tenant_id 查询/写入隔离
Exceptions/Handler.php异常处理:api/* 异常统一渲染为 JSON 响应
Exceptions/BizException.php业务异常:Service 抛出,默认 code=1
Support/Result.php统一响应:success/page/fail/unauthorized/forbidden/notFound/validateError
Support/Auth.php当前登录用户:Auth::userId() / Auth::username()
Helpers/helpers.php公共函数:驼峰转换、文件处理、字符串等 21 个(composer autoload.files)

Services 横切服务清单 ​

跨模块复用的无状态能力(业务 Service 之外):

服务文件说明
JWT 认证JwtService.php登录、刷新、解析、踢下线(Redis 有状态)
密码加密PasswordService.phpbcrypt(成本因子 12)
字典服务DictCacheService.php字典缓存与查询(两级缓存)
验证码CaptchaService.php图片验证码生成与校验(IP 限流)
请求信息RequestInfoService.php客户端 IP、UA、归属地解析(ip2region)
代码生成GeneratorService.php根据数据库表生成 CRUD 代码
数据库迁移DbMigrateService.php跨数据库迁移引擎(五驱动)
DDL 生成DbSchemaBuilder.php跨库类型映射的 DDL 生成器(Oracle 序列/触发器)
ExcelExcelService.php导入导出(表头映射、分批)
配置管理ConfigService.php系统配置读写与缓存
字典管理DictService.php字典/字典项管理

Middleware 中间件清单 ​

中间件文件别名作用域说明
真实 IPProxyMiddleware.phpproxy全局(api prepend)受信代理 X-Forwarded-For 解析
跨域Cors.phpcors全局CORS 头设置(config/cors.php)
强制 JSONForceJsonResponse.phpforce.json全局规范化 Accept 头
认证权限Authenticate.phpauth.jwt路由组JWT 校验 + #[Permission] 鉴权
租户上下文ResolveTenant.phptenant路由组解析注入 tenantId
操作日志LogOperation.phplog.operation路由组基于 #[OperationLog] 采集,terminable 落库
演示环境DemoMiddleware.phpdemo路由别名写操作拦截,#[DemoAllow] 放行

Console 命令清单 ​

命令文件签名说明
代码生成GeneratorCommand.phpgenerate:codeCLI 方式生成 CRUD 代码
数据库迁移DbMigrateCommand.phpdb:migrate跨数据库迁移 CLI 工具
定时任务执行JobRunCommand.phpjob:run执行一次到期任务(配合系统 cron)
定时任务守护JobDaemonCommand.phpjob:daemon常驻进程循环扫描执行
字典缓存清理ClearDictCache.phpdict:clear-cache清除字典缓存

config/ 配置文件 ​

text
config/
├── api.php                   API 配置(驼峰转换开关)★
├── captcha.php               验证码配置 ★
├── cors.php                  跨域配置 ★
├── file.php                  文件上传配置(域名、大小限制)★
├── jwt.php                   JWT 配置(密钥、过期时间)★
├── middleware.php            中间件配置(受信代理)★
├── tenant.php                多租户配置 ★
├── generator.php             代码生成器配置
├── app.php / auth.php / cache.php / database.php / filesystems.php
├── logging.php / mail.php / queue.php / services.php / session.php

标 ★ 为本项目独立维护的配置文件(不与 Laravel 默认配置合并)。

routes/ 路由定义 ​

text
routes/
├── api.php                   全部 API 路由(公开接口在中间件组外)
├── web.php                   欢迎页
└── console.php               调度注册

路由组织约定见 3.7 路由注册。

resources/templates/ 代码生成模板 ​

text
resources/templates/
├── controller.php.tpl        控制器模板
├── service.php.tpl           服务层模板
├── model.php.tpl             模型模板
├── request.php.tpl           FormRequest 模板
├── ui/                       普通列表前端模板(6 个)
└── ui2/                      树形结构前端模板

由 GeneratorService 渲染,通过 CLI(generate:code)或 Web 界面调用。

前端目录设计 ​

text
ui/src/
├── api/            ← API 接口(按业务域分组)
├── views/          ← 页面视图(按业务域分组)
├── components/     ← 公共组件(跨页面复用)
├── store/          ← 状态管理(Pinia)
├── router/         ← 路由配置(动态路由由后端菜单驱动)
├── hooks/          ← 组合式函数
├── directives/     ← 自定义指令(v-perm 权限)
├── enums/          ← 枚举常量
├── styles/         ← 全局样式
├── utils/          ← 工具函数(http 封装)
├── layout/         ← 布局组件
├── plugins/        ← 插件
├── settings/       ← 项目配置
└── assets/         ← 静态资源

TIP

前端工程位于本仓库 ui/ 目录,代码生成器输出至 ui/src/ 对应位置。详细结构见 9.2 目录结构详解。

前后端目录对应关系 ​

后端前端说明
Http/Controllers/Api/UserController.phpui/src/api/system/user.tsAPI 接口函数
Services/UserService.phpsrc/views/system/user/业务页面
Models/User.php—前端不直接操作模型
Http/Requests/UserRequest.php表单组件校验前端校验为体验层,后端 FormRequest 为最终防线
routes/api.phpui/src/api/**/*.ts路由 ↔ API 函数映射
字典数据(dict 表)src/enums/字典 ↔ 枚举常量

设计原则 ​

按职责分层 ​

每层只做一件事,层间通过方法调用串联:

层职责不应该做
Controller参数注入、响应封装、注解标注业务逻辑、数据库操作
Request参数格式校验业务规则校验
Service业务编排、钩子处理、业务规则校验直接 HTTP 交互
Model表映射、关联关系、软删除、审计复杂业务判断

按模块分组 ​

同一业务模块的 4 个文件分散在各自目录中,通过命名前缀关联。这种"水平分层 + 垂直命名"的方式:

  • 便于按职责查找(所有服务在一起)
  • 便于代码生成器按模板批量生成
  • 便于基类统一处理(BaseService 属性驱动 + Trait 占位覆盖)

文件命名规范 ​

类型规范示例
控制器大驼峰 + ControllerArticleController.php
请求大驼峰 + RequestArticleRequest.php
服务大驼峰 + ServiceArticleService.php
模型大驼峰(表名)Article.php
中间件大驼峰(动词+名词)Authenticate.php / ResolveTenant.php
注解大驼峰Permission.php、OperationLog.php
命令大驼峰 + Command(或动词开头)GeneratorCommand.php、ClearDictCache.php
任务大驼峰 + TaskSendSmsTask.php
Trait动词开头 + Has/ByHasCrudOperations.php、SoftDeletesByFlag.php

小蚂蚁云团队 · 提供技术支持