18 KiB
1.3 目录结构
目录说明
在软件开发过程中,优秀的软件目录结构对于项目的组织、开发、维护和扩展至关重要,合理的目录结构能够显著提升开发效率和代码可维护性。
1. 清晰的层次结构:按照功能模块划分目录,方便团队成员快速定位代码。
2. 分层架构:Controller(HTTP)、Service(业务)、Model(数据)分离,职责清晰。
3. Trait 组合复用:通用能力集中在 BaseService 与 6 个 Concerns Trait,子类只声明差异。
4. 提升开发效率:清晰的目录结构和模块划分,减少查找代码的时间,提高开发效率。
项目根目录
RXThinkCMF_Laravel13_AntdVue/
├── app/ // 后端源码(见下方详解)
├── bootstrap/ // 应用引导(app.php 注册中间件别名与健康检查路由)
├── config/ // 配置文件(18 个)
├── database/
│ ├── migrations/ // 数据库迁移(本项目为空,建表以 SQL 脚本为准)
│ ├── seeders/ // 种子数据(DatabaseSeeder:租户/部门/角色/菜单/用户/字典)
│ └── factories/ // 模型工厂(测试数据)
├── docker/ // Docker 部署文件(Dockerfile / nginx.conf / .env.docker)
├── document/ // 项目资料(五种数据库初始化脚本,按类型分组)
├── docs/ // 专项文档(定时任务调度说明)
├── public/ // Web 公开目录(入口 index.php、静态资源)
├── resources/
│ ├── templates/ // ★ 代码生成器模板(*.tpl + ui/ + ui2/)
│ ├── views/ // Blade 视图(欢迎页等少量页面)
│ ├── css/ js/ // Vite 资源入口(TailwindCSS)
├── routes/
│ ├── api.php // ★ 全部 API 路由(公开接口在中间件组外)
│ ├── console.php // 命令调度注册
│ └── web.php // 欢迎页路由
├── storage/ // 运行时产物(日志/缓存/会话/编译视图,需可写)
├── tests/ // PHPUnit 测试(Feature / Unit)
├── ui/ // ★ 前端 AntdVue 管理后台(Vue3 + AntDesign,见第 9 章)
├── uploads/ // 上传文件目录
├── vendor/ // Composer 依赖(不提交到版本控制)
├── artisan // Artisan 命令行入口
├── composer.json // PHP 依赖清单(含 setup / dev / test 脚本)
├── package.json // 后端资源构建依赖(Vite + TailwindCSS,前端依赖见 ui/package.json)
├── vite.config.js // Vite 构建配置
├── docker-compose.yml // Docker 容器编排
├── .env.example // 环境变量模板
├── .env // 环境变量(不提交到版本控制)
└── README.md // 项目说明
:::tip 前端代码位置
本仓库包含后端服务与 ui/ 目录内的前端 AntdVue 管理后台(Vue3 + AntDesign);代码生成器会把生成的前端页面输出到 ui/src/ 对应位置(见 10.6 自定义模板开发)。前端工程结构详见 第 9 章 前端开发。
:::
后端目录 (app/)
app/
├── Attributes/ // PHP 8 注解
│ ├── Permission.php // 权限校验注解(#[Permission('sys:user:add')])
│ ├── OperationLog.php // 操作日志注解(类型 + 模板,40 种操作类型)
│ └── DemoAllow.php // 演示环境放行注解
├── Console/Commands/ // 5 个 Artisan 命令
│ ├── GeneratorCommand.php // generate:code 代码生成器 CLI
│ ├── DbMigrateCommand.php // db:migrate 跨库数据迁移
│ ├── JobRunCommand.php // job:run 定时任务一次性执行(配合系统 cron)
│ ├── JobDaemonCommand.php // job:daemon 定时任务常驻进程(配合 supervisor)
│ └── ClearDictCache.php // dict:clear-cache 清除字典缓存
├── Exceptions/ // 统一异常处理
│ ├── BizException.php // 业务异常(Service 层抛出,默认 code=1)
│ └── Handler.php // 全局异常渲染(异常 → 统一 JSON)
├── Helpers/helpers.php // 21 个全局辅助函数(composer autoload.files 加载)
├── Http/
│ ├── Controllers/
│ │ ├── Controller.php // 控制器基类(统一响应 + _page/_add 等通用 CRUD)
│ │ └── Api/ // 28 个业务控制器
│ │ ├── AuthController.php // 登录认证(JWT 双令牌 / OAuth2)
│ │ ├── UserController.php // 用户管理
│ │ ├── RoleController.php // 角色管理
│ │ ├── MenuController.php // 菜单管理
│ │ ├── ExampleController.php // 案例演示(标准 CRUD 参考模板)
│ │ ├── GeneratorController.php // 代码生成器
│ │ └── ... // 其他模块
│ ├── Middleware/ // 7 个中间件
│ │ ├── ProxyMiddleware.php // 真实 IP 提取(受信代理)
│ │ ├── Cors.php // 跨域处理
│ │ ├── ForceJsonResponse.php // 强制 JSON 响应
│ │ ├── Authenticate.php // JWT 认证 + #[Permission] 鉴权(auth.jwt)
│ │ ├── ResolveTenant.php // 租户上下文解析(tenant)
│ │ ├── LogOperation.php // 操作日志采集(log.operation,terminable 落库)
│ │ └── DemoMiddleware.php // 演示模式写操作拦截
│ └── Requests/ // 24 个 FormRequest(统一继承 BaseRequest)
│ ├── BaseRequest.php // 基类:授权放行 + 失败统一 JSON
│ ├── ExampleRequest.php // 示例请求验证
│ └── ... // 其他模块请求验证
├── Models/ // Eloquent 模型(25 个)
│ ├── Concerns/ // 3 个模型 Trait
│ │ ├── SoftDeletesByFlag.php // is_delete 软删除
│ │ ├── SoftDeleteFlagScope.php// 全局软删除范围
│ │ └── HasAuditColumns.php // 审计字段自动填充
│ ├── User.php // 用户模型($table = 'user',前缀由 DB_PREFIX 决定)
│ ├── Example.php // 案例模型
│ └── ... // 其他模型
├── Observers/ // 模型观察者(数据变更 → 缓存失效)
│ ├── DictItemObserver.php // 字典项变更 → 清除字典缓存
│ ├── MenuObserver.php // 菜单变更 → 清除菜单/权限缓存
│ └── RoleMenuObserver.php // 角色菜单变更 → 清除角色权限缓存
├── Providers/
│ └── AppServiceProvider.php // 启动校验(JWT_SECRET fail-close)+ Observer 注册
├── Services/ // ★ 业务逻辑层(36 个)
│ ├── BaseService.php // 核心基类(全部声明式属性集中于此)
│ ├── BaseTenantService.php // 租户版基类(tenant_id 查询/写入双隔离)
│ ├── Concerns/ // 7 个 Service Trait(只放方法)
│ │ ├── HasCrudOperations.php // add/update/delete + 生命周期钩子 + 事务
│ │ ├── HasQueryScopes.php // buildQuery / 排序白名单
│ │ ├── HasFileProcessing.php // 文件字段自动处理(临时→正式、域名补全)
│ │ ├── HasDataScope.php // 数据权限 + 租户隔离
│ │ ├── HasSerializeMaps.php // 字典翻译(DictCacheService 批量优化)
│ │ ├── HasUniqueCheck.php // 唯一性校验
│ │ └── HasConfigValueProcessing.php // 配置项 value 按类型处理(文件迁移 / valueList)
│ ├── ExampleService.php // 案例演示服务(标准 CRUD 参考模板)
│ ├── JwtService.php // JWT 签发 / 刷新 / 解析
│ ├── DictCacheService.php // 字典服务(两级缓存)
│ ├── GeneratorService.php // 代码生成服务
│ ├── ExcelService.php // Excel 导入导出
│ ├── DbMigrateService.php // 跨数据库数据迁移
│ └── ... // 其他业务/横切服务
├── Support/ // 基础支撑
│ ├── Auth.php // 当前登录用户(Auth::userId() 等)
│ └── Result.php // 统一响应类(success/page/fail/...)
└── Task/ // 定时任务处理器
├── BaseTask.php // 任务基类
├── HelloWorldTask.php // 测试任务(验证 daemon 调度)
└── SendSmsTask.php // 示例任务
后端模块内部结构
每个业务模块遵循统一的文件结构:
app/Http/Controllers/Api/{Name}Controller.php // HTTP 入口(注解 + 调用快捷方法)
app/Http/Requests/{Name}Request.php // 参数格式验证(FormRequest)
app/Services/{Name}Service.php // 业务逻辑(属性配置 + 钩子)
app/Models/{Name}.php // 数据模型(表映射 + 关联)
| 文件 | 职责 | 基类 |
|---|---|---|
| Controller | 接收请求、调用 Service、返回统一响应 | App\Http\Controllers\Controller |
| Request | 参数格式验证(必填、类型、格式) | BaseRequest |
| Service | 业务逻辑、属性声明、生命周期钩子 | BaseService / BaseTenantService |
| Model | 数据库表映射、关联关系、软删除、审计字段 | Eloquent Model + Concerns Trait |
配置目录 (config/)
config/
├── api.php // API 配置(驼峰/下划线自动转换开关)★ 独立配置
├── captcha.php // 验证码配置(长度/字符集/有效期/万能码)★ 独立配置
├── cors.php // 跨域配置(允许来源/方法/头)★ 独立配置
├── file.php // 文件上传配置(目录/域名/大小/后缀白名单)★ 独立配置
├── jwt.php // JWT 配置(密钥/有效期/签发者)★ 独立配置
├── middleware.php // 中间件配置(受信代理等)★ 独立配置
├── tenant.php // 多租户配置(默认租户 ID)★ 独立配置
├── generator.php // 代码生成器配置(父菜单 ID、应用名)
├── app.php // 应用配置(名称/时区/调试模式)
├── auth.php // 认证配置
├── cache.php // 缓存配置(redis 驱动)
├── database.php // 数据库配置(mysql/pgsql/sqlsrv/sqlite + redis)
├── filesystems.php // 文件系统配置
├── logging.php // 日志配置
├── mail.php // 邮件配置
├── queue.php // 队列配置
├── services.php // 第三方服务配置
└── session.php // 会话配置
:::tip 独立配置约定
标 ★ 的 7 个配置文件为本项目独立维护(不与 Laravel 默认配置合并),通过 config('jwt.secret')、config('file.domain_url') 等方式读取。完整配置项见 附录 C 配置项速查。
:::
数据库目录 (database/)
database/
├── migrations/ // 迁移目录(本项目为空,建表以 SQL 导出为准)
├── seeders/
│ └── DatabaseSeeder.php // 初始数据:租户、部门、角色、菜单、用户、字典
└── factories/ // 模型工厂
:::warning 注意
本项目未使用 Laravel 迁移建表,数据库结构以 document/<数据库类型>/rxthinkcmf.laravel13.antdvue.sql 脚本为准(25 张业务表,laravel_ 前缀,五种数据库各有专用脚本)。composer setup 中的 migrate --force 仅初始化迁移记录表,不会创建业务表。详见 2.5 数据库初始化。
:::
代码生成模板 (resources/templates/)
resources/templates/
├── controller.php.tpl // 控制器模板
├── service.php.tpl // 服务层模板
├── model.php.tpl // 模型模板
├── request.php.tpl // FormRequest 模板
├── ui/ // 普通列表模板(前端文件)
│ ├── index.vue.tpl // 列表页模板
│ ├── edit.vue.tpl // 编辑弹窗模板
│ ├── detail.vue.tpl // 详情弹窗模板
│ ├── api.ts.tpl // API 接口模板
│ ├── columns.ts.tpl // 表格列定义模板
│ └── querySchemas.ts.tpl // 查询条件模板
└── ui2/ // 树形结构模板(前端文件)
路由目录 (routes/)
routes/
├── api.php // ★ 全部 API 路由(约 165 条)
│ // 公开接口(login/captcha/refresh/oauth2)在中间件组外
│ // 认证接口在 ['auth.jwt','tenant','log.operation'] 组内
├── console.php // Artisan 调度注册
└── web.php // 欢迎页路由(/up 健康检查由 bootstrap/app.php 注册)
Docker 目录 (docker/)
docker-compose.yml // 四容器编排(Nginx + PHP-FPM + MySQL + Redis)
docker/
├── Dockerfile // PHP 8.3-fpm 应用镜像(扩展 + Composer 依赖)
├── nginx.conf // Nginx 站点配置(Laravel 路由重写 + 安全规则)
└── .env.docker // 容器环境变量(密码、端口、JWT 密钥)
资料目录 (document/)
document/
├── .gitignore // 忽略规则(脚本等大文件不进版本库)
├── mysql/
│ └── rxthinkcmf.laravel13.antdvue.sql // ★ MySQL 初始化脚本(约 226MB,25 张业务表 + 初始数据)
├── postgresql/
│ └── rxthinkcmf.laravel13.antdvue.sql // PostgreSQL 初始化脚本
├── sqlserver/
│ └── rxthinkcmf.laravel13.antdvue.sql // SQL Server 初始化脚本
├── oracle/
│ └── rxthinkcmf.laravel13.antdvue.sql // Oracle 初始化脚本
└── sqlite/
└── rxthinkcmf.laravel13.antdvue.sql // SQLite 初始化脚本
:::tip
五种数据库脚本按类型分组,已做对应 SQL 语法适配,直接导入即可(见 2.5 数据库初始化)。Docker 首次启动自动导入 document/mysql/ 下的脚本。
:::
关键配置文件
| 文件 | 作用 |
|---|---|
.env |
数据库连接、JWT 密钥、Redis 密码、文件上传等环境变量 |
config/database.php |
数据库配置(4 种关系库 + Redis 连接) |
config/jwt.php |
JWT 配置(密钥 / access·refresh 有效期 / 签发者) |
config/file.php |
文件上传配置(目录 / 域名 / 大小 / 后缀白名单) |
config/cors.php |
跨域配置(允许来源 / 方法 / 头) |
config/app.php |
应用配置(名称 / 时区 / 调试模式、受信代理 trusted_proxies) |
config/api.php |
响应驼峰/下划线自动转换开关 |
config/tenant.php |
多租户配置(默认租户 ID) |
config/generator.php |
代码生成器配置(父菜单 ID、应用名) |
composer.json |
依赖清单 + setup / dev / test 脚本 |
bootstrap/app.php |
中间件别名注册、全局中间件组、/up 健康检查 |
:::tip 注意事项
- 保持一致性:目录结构一旦确定,应保持一致性,避免随意更改。
- 合理划分模块:根据项目的实际需求,合理划分功能模块,避免过度模块化。
- 文档记录:在项目文档中详细说明目录结构和各模块的功能,便于新成员快速上手。
- 版本控制:使用
Git等版本控制工具,并在.gitignore文件中配置不需要跟踪的目录和文件(vendor/、storage/、.env等)。 :::
总结
软件架构的目录结构是项目开发和维护的基础,直接影响到项目的可维护性、可扩展性和开发效率。本项目采用分层的目录结构(后端 Controller → Service → Model,Trait 组合复用横切能力),结合模块化管理,是一个有效的解决方案。通过合理规划和遵循最佳实践,可以确保项目的结构清晰、功能明确,为团队开发和长期维护打下坚实的基础。