主题
代码生成
代码生成 真的是每个项目都必备的了!代码生成一般都是为了减少curd
的重复工作。因为后台管理的curd
真的是必备的,所以代码生成还是很有必要的。目前代码生成可以自动生成以下文件
- 控制器 Controller
- 表单验证请求
- 模型 Model
- 自动写入 restful 路由
- 数据库文件(migration)
- 前端列表页面
- 前端表单页面
- 自动生成权限菜单
WARNING
- 因为项目是前后端分离的,所以代码生成只能在开发环境使用
- 代码生成工具并不是智能工具,它是根据已有信息渲染对应的模板
INFO
旧版本视频教程地址Catchadmin 专业版模块开发
基本使用
模块
众所周知,CatchAdmin
是模块化的,那么首先需要干什么呢?没错,就是新增模块。如下图所示 点击新增按钮,按照提示信息输入模块信息,然后点击创建模块。
模块创建之后回生成如下文件,以本地 Test 模块为例,如下图所示 来解释下具体文件信息
php
// 模块服务,用于加载模块的配置和事件的,在[模块化]章节有详细介绍
class TestServiceProvider extends CatchModuleServiceProvider
{
/**
* route path
*
* @return string
*/
public function moduleName(): string
{
// TODO: Implement path() method.
return 'test';
}
}
php
// 模块路由
Route::prefix('test')->group(function () {
Route::adminResource('pay/order/refunds', PayOrderRefundsController::class);
Route::adminResource('admin/users', AdminUsersController::class);
//next
});
php
// 模块安装器,在[模块化]章节有详细介绍
class Installer extends ModuleInstaller
{
protected function info(): array
{
// TODO: Implement info() method.
return [
'title' => '测试',
'name' => 'test',
'path' => 'Test',
'keywords' => 'test',
'description' => 'test',
'provider' => TestServiceProvider::class,
];
}
protected function requirePackages(): void
{
// TODO: Implement requirePackages() method.
}
protected function removePackages(): void
{
// TODO: Implement removePackages() method.
}
}
模块创建完成之后,然后在创建 Schema
,这里所谓的 schema
就是数据库的表,支持新建表,也支持已有表创建。
新建表
按照提示填写表信息,然后点击下一步
如图,需要在这里添加表字段,完成之后,点击创建即可。如下图
已有表创建
从已有表里面创建对应生成表记录
代码生成
在 schema
管理页面的点击对应记录生成代码按钮之后,进入到生成代码的页面
参数
生成代码页面有几个比较重要的参数
模块
是必选的,这保证代码生成到某个模块中控制器
名称是必填的,会在模块的Http
目录下Controller
文件模型名称
是默认根据表名称生成模型名称,是大驼峰的命名方式菜单名称
填写了菜单名称会自动生成权限管理的菜单,不填则不生成模型关联关系
支持生成模型关联关系操作
目前支持生成导出数据导出章节和导入数据导入章节- 分页是否支持分页
- 是否生成表单
- 是否使用动态表单,动态表单相关文档
表格和表单生成
INFO
注意代码生成的字段是支持拖拽的,你可以拖拽到合适的位置
表单组件
普通的自带组件这里就不多做解释了。来看看 catchadmin 新增的和后台强制绑定的组件
字典组件
生成的效果如下
附件上传组件
单图/多图上传组件
单文件/多文件上传组件
远程级联组件
远程组件需要选择数据源,如下图,其他远程组件类似,如果需要支持树形的话,要选择父级字段。
生成后的效果
远程下拉组件
远程树形组件
远程树形下拉组件
图标选择组件
下拉
类似这种下拉选项的可以支持动态添加,例如 radio checkbox 等
验证规则
INFO
验证规则是 Laravel 内置的验证规则,只支持部分前端规则
以下是前端验证的规则
required
必须填写string
必须是字符串类型url
URL 格式不正确number
必须是数字类型email
邮箱格式不正确boolean
必须是布尔类型date
日期格式
验证规则会生成在,如下图
后端
枚举
如果你使用的是下拉选项之类的,就是包含options
选项的组件,后端会自动识别,并且生成文本返回。 例如状态字段,它的 options 选项如下
json
[
{
"label": "正常",
"value": "1"
},
{
"label": "禁用",
"value": "2"
}
]
那么模型会生成如下面的代码
php
/**
* status 字段转换器
*
* @return Attribute
*/
public function statusText(): Attribute
{
$text = [2 => '禁用', 1 => '正常'];
return Attribute::make(get: fn ($value) => $text[$this->status] ?? '');
}
前端的状态字段也会自动使用status_text
字段来渲染
图片
多图的情况下,会自动生成下面的代码,这里使用avatar
字段演示
php
/**
* avatar 转换
*
* @return Attribute
*/
public function avatar(): Attribute
{
return Attribute::make(
get: fn ($value) => ! $value ? [] : array_map(fn ($item) => $item ? url($item) : '', json_decode($value, true)),
set: fn ($value) => json_encode(array_map(fn ($value) => remove_app_url($value), $value))
);
}
Switch 组件
首先会在前端表格内生成一个switch
组件,用于字段值切换 还会在对应的控制器生成如下代码,因为是
status
字段,所以生成下面的默认代码
php
public function enable(mixed $id): mixed
{
return $this->model->toggleBy($id);
}
如果是其他非status
字段则生成如下代码
php
public function enable(mixed $id, Request $request): mixed
{
$field = $request->get('field');
return $this->model->toggleBy($id, $field);
}
WARNING
这里需要注意的是,系统内置的状态切换的值,并不是 0 和 1。而是 1 是
和 2 否
,如果不是这么做的,需要你自己再模型重写 toggleBy
方法
导出
如图,选择你需要导出的字段 最终代码生成一个导出得文件
modules/Test/Excel/Export/xxxxExport.php
,文件内容如下
INFO
下面的代码仅作演示, 详细请参考导出数据文档
php
/**
* 导出数据
*
*
* @class Excel\Export\AdminUsersExport
*/
class AdminUsersExport extends Export
{
protected array $header = [
'id',
'字典选择器',
'图标选择',
'远程树形',
'文件上传',
'但附件',
'多附件上传',
'图片上传',
'多图片上传',
'创建时间',
'更新时间',
];
/**
* @return array
*/
public function array(): array
{
return AdminUsers::query()->get()->select([
'id',
'username',
'password',
'avatar',
'remember_token',
'department_id',
'status_text',
'login_ip',
'login_at',
'created_at',
'updated_at',
])->toArray();
}
}
这里主要注意的是。代码生成器会在转换上面的枚举值,将对应的枚举值转换成中文说明
导入
跟导出是一样的,选择字段进行导入 最终代码生成一个导出得文件
modules/Test/Excel/Export/xxxxImport.php
,文件内容如下
INFO
下面的代码仅作演示, 详细请参考导入数据文档
php
/**
* 导入数据
*
*
* @class Excel\Import\AdminUsersImport
*/
class AdminUsersImport extends Import
{
/**
* 导入数据
*
*
* @param Collection $rows
* @return void
*/
public function collection(Collection $rows): void
{
$rows->each(function ($row) {
$model = new AdminUsers;
$model->id = $row[0];
$model->username = $row[1];
$model->password = $row[2];
$model->mobile = $row[3];
$model->email = $row[4];
$model->save();
});
}
}
CatchAdmin 还自动生成了一个模板文件,根据选择字段label
值。模板文件存放在storage/static/importTemplates/xxxx导入模板.xlsx
。
WARNING
实际导入业务比较复杂,可以自行修改导入类