arandu / laravel-mui-admin

适用于Laravel的高度可定制CMS,使用React和Material UI构建。

v0.5.0 2024-01-12 14:34 UTC

README

面向模型,高度可定制的Laravel 8.x CMS,提供一套全栈工具,以实现敏捷的Web应用开发。

Material-UIReact构建

英文文档

注意: 此包仍在开发中。在1.0.0版本之前,API可能发生重大变化。

模板

我们提供了一个模板,以使用此包开始一个项目。[点击这里]({{LINK AQUI}})

如果您想手动安装,请参阅安装文档

基本使用

  • 创建初始角色
  • 创建新的管理员用户
  • 渲染管理面板
  • 为管理面板准备模型
    • 添加HasAdminSupport特质
    • 前端Eloquent模型
    • 个性化
      • 个性化模型页面列
      • 添加自定义字段
      • 添加自定义标签页
      • 添加自定义搜索

创建初始角色

要创建初始角色,请将RolesAndPermissionsSeeder添加到DatabaseSeeder文件中。示例

    $this->call([
        // ...
        RolesAndPermissionsSeeder::class,
    ]);

然后,执行以下命令执行seeder类

php artisan db:seed

或者,您可以使用以下命令仅种植功能和权限

php artisan db:seed --class=RolesAndPermissionsSeeder

创建新模型权限

在开发过程中,您可以创建需要访问权限的新模型。要更新应用程序的权限列表,请执行以下命令

php artisan admin:permissions

创建新的管理员用户

要创建新的管理员用户,请执行以下命令

php artisan admin:credentials

此命令将询问用户名、电子邮件和密码,并创建一个新的具有admin角色的用户。

为管理面板准备模型

为了准备模型以供管理面板使用,您需要向其添加HasAdminSupport特质。此特质将为模型添加使它与管理面板一起工作的必要方法。

此外,您必须在模型中配置$fillable属性。此属性用于告知前端哪些字段可以填充,也用于渲染模型页面列。您可以如后文所述自定义字段和列。

添加HasAdminSupport特质

use Arandu\LaravelMuiAdmin\Traits\HasAdminSupport;

class Post extends Model
{
    use HasAdminSupport;

    protected $fillable = [
        'title',
        'content',
    ];
}

添加特质后,应有一个与模型复数名称和蛇形名称对应的路由。例如,如果模型名为Post,则路由应为/posts。如果模型名为BlogPost,则路由应为/blog_posts。通过更改resources/js/src/views/Layouts/Admin.jsx文件添加侧边菜单链接

import { NavLink } from 'react-router-dom';
import { route } from '@arandu/laravel-mui-admin';

const navMenuItems = [
    // ...
    {
        key: 3,
        text: 'Posts',
        icon: 'posts',
        ListItemButtonProps: {
            component: NavLink,
            to: route('admin.post.index'),
        },
    },
]

请注意,使用route函数从其名称中获取路由路径。将HasAdminSupport特质添加到模型后,以下路由将可用

  • WEB
    • admin.{model_name}.index:模型页面
  • API
    • admin.{model_name}.list:获取分页模型列表
    • admin.{model_name}.create:创建新模型
    • admin.{model_name}.item:通过id获取模型
    • admin.{model_name}.update:通过id更新模型
    • admin.{model_name}.delete:通过id删除模型

如果模型具有SoftDeletes特质,以下路由也将可用

  • API
    • admin.{model_name}.restore:通过id恢复模型
    • admin.{model_name}.forceDelete:通过id永久删除一个模型

如果您想自定义路由,可以向模型中添加以下方法

public function getWebUrls()
{
    return [
        'index' => 'custom/url/path',
        // use este array para criar rotas web adicionais, se desejar
    ];
}

public function getApiUrls()
{
    return [
        'list' => 'custom/url/to/posts',
        'item' => 'custom/url/to/posts/{id}',
        'create' => [
            'url' => 'custom/url/to/posts/create',
            'method' => 'post',
        ],
        'update' => [
            'url' => 'custom/url/to/posts/{id}/update',
            'method' => 'post',
        ],
        'delete' => [
            'url' => 'custom/url/to/posts/{id}/delete',
            'method' => 'delete',
        ],
    // Se o modelo tiver o trait SoftDeletes, adicione o seguinte também:
    //    'restore' => [
    //        'url' => 'custom/url/to/posts/{id}/restore',
    //        'method' => 'post',
    //    ],
    //    'forceDelete' => [
    //        'url' => 'custom/url/to/posts/{id}/force-delete',
    //        'method' => 'delete',
    //    ],

    // use este array para criar rotas api adicionais, se desejar
    // porém será necessário criar os métodos correspondentes no controller
    // e registrar a controller na configuração 'admin.cms.controller_overrides'
    ];
}

关于关系的一些说明

由于前端模型,此包会检查模型“后端”中存在的每个关系。为了使它工作,关系方法必须在具有类型提示的模型中定义。例如

class Post extends Model
{
    public function user(): BelongsTo # ou : HasMany, : HasOne, etc.
    {
        return $this->belongsTo(User::class);
    }
}

这将解锁一些功能,如关系同步,并允许前端自动加载相关模型。

个性化

自定义模型页面上的列

默认情况下,组件RepositoryIndex将渲染一个具有与模型属性$fillable相对应的列的表格。如果您想自定义列,必须在您的项目中创建一个名为app/Admin/Tables/{$model}Table.php的类。例如,如果模型名为Post,类名应该是PostTable

创建的类必须至少有一个名为default的方法,该方法将在未指定其他方法时使用。例如,如果您想自定义Post模型的列,您必须在app/Admin/Tables/PostTable.php中创建一个包含以下内容的类

<?php

namespace App\Admin\Tables;

use Arandu\LaravelMuiAdmin\Contracts\Table;

class PostTable extends Table
{
    public function default()
    {
        return [
            [
                // 'key' é o nome do atributo no modelo
                'key' => 'title',
                // 'label' é o texto que será exibido na coluna
                'label' => __('Title'),
            ],
            [
                // Você pode utilizar o ponto para acessar atributos aninhados
                'key' => 'author.name',
                'label' => __('Author Name'),
            ],
            [
                // Você pode criar colunas personalizadas para serem
                // gerenciadas posteriormente no frontend
                'key' => 'categories',
                'label' => __('Categories'),
            ]
        ];
    }
}

如果您想在其他地方创建类或使用其他名称,您需要在模型中添加$tableClass属性。例如:protected $tableClass = 'App\\Tables\\PostTableWithCustomName';

添加自定义字段

默认情况下,组件RepositoryIndex将渲染一个具有与模型属性$fillable相对应的字的表单,并且所有字段都将类型为text。如果您想自定义字段,必须在您的项目中创建一个名为app/Admin/Forms/{$model}Form.php的类。例如,如果模型名为Post,类名应该是PostForm。这个类必须扩展Arandu\LaravelMuiAdmin\Contracts\Form类,并且必须至少有一个名为default的方法,该方法将在未指定其他方法时使用。

<?php

namespace App\Admin\Forms;

use Arandu\LaravelMuiAdmin\Contracts\Form;

class PostForm extends Form
{
    public function default()
    {
        return [
            [
                // 'name' é o nome do atributo no modelo
                'name' => 'title',
                // 'label' é o texto que será exibido no campo
                'label' => __('Title'),
                // 'type' é o tipo do campo, por padrão é 'text'
                'type' => 'text',
                // parâmetros adicionais serão passados para o componente
                'required' => true,
            ],
            [
                'name' => 'content',
                'label' => __('Content'),
                'multiline' => true,
            ],

            // Você pode relacionar modelos com o 
            // campo tipo 'autocomplete'. Para isso,
            // o relacionamento deve estar definido
            // com dicas de tipo, como descrito acima.
            // Ex: relação tipo `BelongsTo` com uma model 
            // `User` chamada `author`. 
            // Também será necessário que
            // a chave estrangeira (ex: `author_id`)
            // esteja no array `$fillable` do modelo Post.
            [
                'name' => 'author',
                'label' => __('Author'),
                'type' => 'autocomplete',
                // O autocomplete irá listar itens
                // da model relacionada, por padrão.

                // É possível também fornecer resultados personalizados
                // para a listagem do autocomplete, ex:
                // 'list' => function ($search) {
                //    return User::role('author')->search($search)->get(['id', 'name']);    
                // }

            ]
        ];
    }
}

如果您想在其他地方创建类或使用其他名称,您需要在模型中添加$formClass属性。例如:protected $formClass = 'App\\Forms\\PostFormWithCustomName';

添加自定义标签页

显示在页面上的选项卡应通过使用@arandu/laravel-mui-admin包的addFilter方法注册一个过滤器来在前端自定义,请参阅此处

要处理选项卡的查询,请在模型中覆盖scopeWhereBelongsToTab方法。例如,如果您想添加一个选项卡以仅显示已发布的帖子,您必须向模型Post添加以下方法

public function scopeWhereBelongsToTab($query, $tab)
{
    if ($tab === 'published') {
        $query->where('published', true);
    }
}

默认情况下,组件RepositoryIndex将渲染一个名为all的选项卡,该选项卡将显示所有模型。如果模型具有SoftDeletes特质,则还会渲染一个名为trashed的选项卡。不要忘记在scopeWhereBelongsToTab方法中处理这些选项卡。

添加搜索

默认的搜索实现将对属性$fillable的所有字段使用"LIKE"进行查询。如果您想自定义搜索,请覆盖模型中的scopeSearch方法。例如,如果您只想根据标题或作者名进行搜索,您必须向模型Post添加以下方法

public function scopeSearch($query, $search)
{
    $query->where(function ($query) use ($search) {
        $query->where('title', 'like', "%{$search}%");
        $query->orWhereHas('author', function ($query) use ($search) {
                $query->where('name', 'like', "%{$search}%");
            });
    });
}

深入探讨

有关更多信息,请等待完整的文档。目前,您可以查看此包的源代码以及包(@arandu/laravel-mui-admin)[https://github.com/AranduTech/react-laravel-mui-admin],以了解可以做什么。