Admin 模块是基于 Amis 可视化页面构建工具构建的后台管理系统。它提供了一套完整的 CRUD 操作界面,开发者可以通过简单的配置快速搭建后台管理功能。
项目提供了 php artisan make:admin-controller 命令,可以快速生成 Admin 模块所需的控制器和 Repository 文件:
php artisan make:admin-controller "app\\model\\User"该命令会自动生成以下文件和配置:
- Repository 文件:
app/admin/controller/repository/UserRepository.php - Controller 文件:
app/admin/controller/UserController.php - 自动在
app/admin/route.php中添加路由配置 - 提示需要添加的菜单配置项
使用 --overwrite 或 -f 参数可以强制覆盖已存在的文件:
php artisan make:admin-controller "app\\model\\User" --overwrite通过这个命令,可以快速搭建起一个完整的 Admin CRUD 模块,大大减少了重复性工作。
所有 Admin 控制器都应该继承 AbsSourceController 类,该类基于 Amis 提供了标准的 CRUD 操作。
使用 php artisan make:admin-controller 命令会自动生成控制器文件,示例如下:
<?php
namespace app\admin\controller;
use app\admin\controller\repository\AdminRepository;
use WebmanTech\AmisAdmin\Repository\RepositoryInterface;
/**
* @method AdminRepository repository()
*/
class AdminController extends AbsSourceController
{
/**
* {@inheritdoc}
*/
protected function createRepository(): RepositoryInterface
{
return new AdminRepository;
}
}为了更好地分离业务逻辑和控制器逻辑,Admin 模块采用了 Repository 模式。实际项目中,Repository 通常继承 AbsRepository
类,而不是直接继承 EloquentRepository。
使用 php artisan make:admin-controller 命令会自动生成 Repository 文件,示例如下:
<?php
namespace app\admin\controller\repository;
use app\model\Admin;
use WebmanTech\AmisAdmin\Repository\EloquentRepository;
class AdminRepository extends AbsRepository
{
public function __construct()
{
parent::__construct(Admin::class);
// 可以在这里配置预设字段和自定义逻辑
$this->getPresetsHelper()
->withPresets([
// 字段预设配置
]);
}
// 可以添加自定义的数据处理逻辑
}Admin 模块使用预设(Preset)机制来配置字段,而无需找到对应的端点一个个修改。可以通过在 Repository 的构造函数中配置预设来定义字段展示:
public function __construct()
{
parent::__construct(Admin::class);
$this->getPresetsHelper()
->withPresets([
'username' => new PresetItem(
label: '用户名',
filter: 'like',
rule: 'required|string|min:4',
),
'name' => new PresetItem(
label: '姓名',
filter: 'like',
),
]);
}表单配置同样通过预设机制实现,可以在 PresetItem 中定义表单字段的属性:
public function __construct()
{
parent::__construct(Admin::class);
$this->getPresetsHelper()
->withPresets([
'username' => new PresetItem(
label: '用户名',
formExt: fn(FormField $field) => $field->typeInputText()->required(),
),
'name' => new PresetItem(
label: '姓名',
formExt: fn(FormField $field) => $field->typeInputText()->required(),
),
]);
}更多关于 preset 配置的详细介绍,请参考 Preset 配置。
系统内置了权限控制机制,可以通过重写以下方法来自定义权限判断:
/**
* {@inheritdoc}
*/
protected function authDestroy($id = null): bool
{
if ($id == Admin::SUPER_ADMIN_ID) {
return false;
}
if ($id == Auth::guard()->getId()) {
return false;
}
return parent::authDestroy($id);
}
/**
* {@inheritdoc}
*/
protected function authDestroyVisible(): string
{
return implode(' && ', [
parent::authDestroyVisible(),
'this.id != "' . Admin::SUPER_ADMIN_ID . '"',
'this.id != "' . Auth::guard()->getId() . '"', // 不能删除自己
]);
}
// 控制详情页显示权限
protected function authDetail($id = null): bool
{
return true;
}可以在列表页添加自定义操作按钮:
/**
* {@inheritdoc}
*/
protected function gridActions(string $routePrefix): Amis\GridColumnActions
{
return parent::gridActions($routePrefix)
->withButtonDialog(
Amis\GridColumnActions::INDEX_UPDATE + 1,
'重置密码',
$this->buildFormFields([
['type' => 'alert', 'body' => '重置密码后会刷新 Access Token', 'level' => 'info', 'showIcon' => true],
FormField::make()->typeInputPassword()->name('new_password')->value(null)->required(),
FormField::make()->typeInputPassword()->name('new_password_confirmation')->value(null)->required()->schema([
'validations' => [
'equalsField' => 'new_password',
],
'validationErrors' => [
'equalsField' => '两次密码输入不一致',
],
]),
]),
[
'api' => route('admin.admin.resetPassword', ['id' => '${id}']),
'level' => 'warning',
]
);
}Admin 路由配置在 app/admin/route.php 文件中:
use support\facade\Route;
Route::resource('admin', controller\AdminController::class, ['name_prefix' => 'admin.', 'resetPassword']);注意:此处使用 support\facade\Route 代替 Webman\Route,因为对 resource 进行了功能扩充
- 更多关于 amis 的配置,见 Amis 配置
- 并非一定要 Model 才能实现一个 Crud 参考 FilesystemController.php
- 如果并非要实现一个完整的 Crud,可以参考 InfoController.php