Skip to content

Latest commit

 

History

History
233 lines (181 loc) · 6.56 KB

File metadata and controls

233 lines (181 loc) · 6.56 KB

Admin 开发介绍

概述

Admin 模块是基于 Amis 可视化页面构建工具构建的后台管理系统。它提供了一套完整的 CRUD 操作界面,开发者可以通过简单的配置快速搭建后台管理功能。

快速创建 Admin 模块

项目提供了 php artisan make:admin-controller 命令,可以快速生成 Admin 模块所需的控制器和 Repository 文件:

php artisan make:admin-controller "app\\model\\User"

该命令会自动生成以下文件和配置:

  1. Repository 文件:app/admin/controller/repository/UserRepository.php
  2. Controller 文件:app/admin/controller/UserController.php
  3. 自动在 app/admin/route.php 中添加路由配置
  4. 提示需要添加的菜单配置项

使用 --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;
    }
}

Repository 层

为了更好地分离业务逻辑和控制器逻辑,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([
                // 字段预设配置
            ]);
    }
    
    // 可以添加自定义的数据处理逻辑
}

Amis 页面配置

列表页配置

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 进行了功能扩充

其他