Dcat Admin 教程 - 如何从 Laravel admin 迁移到 dcat admin?(更新)

Laravel框架
693
0
0
2022-09-17

前几个月弄了个网站,后台用了laravel-admin,当时感觉挺好用,很短的时间迅速建立一个强大的后台,随之而来的问题就是bug有点多,更新维护实在太慢。

  • 比如一个表里的同一个字段如果有不同的列类型,有些列的即时编辑功能就会失效,比如用select框的时候。
  • 还有就是在后台删除记录的时候,需要在Model层去监听事件,才能同步删除其他表的东西,确实有点麻烦。
  • 还有就是CDN的问题,后台直接用的cdn.jsdelivr.net,这个域名对中国的网络不好,导致后台时不时的很慢,还没有地方修改。
  • 还有后台每次到第2天编辑的时候,第一次编辑肯定失败,一定得强制刷新页面后才会好。

后来无意中发现这个Dcat admin,基于laravel admin开发的,不过2.0以后已经独立出来了,功能方面强化了很多,更新很快,

所以就想着把它从laravel admin换到dcat admin,网上有一篇文章,我参考了下,毕竟几年前了,不太能完全用,链接如下:

https://learnku.com/articles/44235

首先我是从laravel-admin 1.8 升级到 dcat admin 2.2.2-beta,版本不同,migration会稍有差异,自行可以看下官方的migration文件。

1. 新建一个代码分支,git checkout -b dcat_admin,把config下admin.php备份下,备份下数据库

2. 卸载原来的laravel-admin包,安装上dcat admin包

composer remove encore/laravel-admin
composer require dcat/laravel-admin:"2.*"

3. 发布资源文件:

php artisan admin:publish --force

把自定义原来备份的admin里的文件改更过的变量更新到新的admin.php里

4. 建立migration 文件,执行命令:

php artisan make:migration to_dcat_admin

代码我列到下面了:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class ToDcatAdmin extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */ 
    public function up()
    {

        Schema::create(config('database.extensions_table') ?: 'admin_extensions', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->string('name', 100)->unique();
            $table->string('version', 20)->default('');
            $table->tinyInteger('is_enabled')->default(0);
            $table->text('options')->nullable();
            $table->timestamps();

            $table->engine = 'InnoDB';
        });

        Schema::create(config('database.extension_histories_table') ?: 'admin_extension_histories', function (Blueprint $table) {
            $table->bigIncrements('id')->unsigned();
            $table->string('name', 100);
            $table->tinyInteger('type')->default(1);
            $table->string('version', 20)->default(0);
            $table->text('detail')->nullable();

            $table->index('name');
            $table->timestamps();

            $table->engine = 'InnoDB';
        });

        Schema::table(config('admin.database.menu_table'), function (Blueprint $table) {
            $table->dropColumn('permission');
            $table->string('extension', 50)->default('')->after('uri');
            $table->tinyInteger('show')->default(1)->after('extension');
            $table->string('icon', 50)->nullable(true)->change();
        });

        Schema::table(config('admin.database.permissions_table'), function (Blueprint $table) {
            $table->bigInteger('parent_id')->default(0)->after('http_path');
            $table->integer('order')->default(0)->after('parent_id');
        });

        Schema::create(config('admin.database.permission_menu_table'), function (Blueprint $table) {
            $table->bigInteger('permission_id');
            $table->bigInteger('menu_id');
            $table->unique(['permission_id', 'menu_id']);
            $table->timestamps();
        });

        Schema::create(config('admin.database.settings_table') ?: 'admin_settings', function (Blueprint $table) {
            $table->string('slug', 100)->primary();
            $table->longText('value');
            $table->timestamps();
        });

        Schema::drop('admin_user_permissions');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */ 
    public function down()
    {
        Schema::table(config('admin.database.permissions_table'), function (Blueprint $table) {
            $table->dropColumn('parent_id');
            $table->dropColumn('order');
        });

        Schema::dropIfExists(config('admin.database.permission_menu_table'));
        //没有写完,自行可以补一下
    }
}

先删除dcat admin的migration,因为我们是升级,不是重新安装

rm -rf database/migrations/2016_01_04_173148_create_admin_tables.php database/migrations/2020_09_07_090635_create_admin_settings_table.php database/migrations/2020_09_22_015815_create_admin_extensions_table.php database/migrations/2020_11_01_083237_update_admin_menu_table.php

或者指定文件运行,加上参数--path=,如果线上还要运行的话,建议删除,运行一下命令升级数据库表结构:

php artisan migrate

5. 把 app\Admin目录下所有文件做下替换,把 Encore\Admin 替换为 Dcat\Admin,然后把后台的首页给它替换成dcat admin自带的首页,刷新下,后台首页已经变成dcat admin的首页了。

6 下面我列出我遇到的laravel-admin和dcat admir的不同之处,详细的大家可以自行查阅dcat admin的官方文档,比较清晰。

dcat admin官方文档

#tree

$tree->disableCreate();
//换成
$tree->disableCreateButton();

#bootstrap.php

\Encore\Admin\Facades\Admin::style(...)
//换成
\Dcat\Admin\Admin::style(...)

form 相关

#radio

$form->radioButton(
//换成
$form->radio(

#keyValue

$form->keyValue('log')->with(...)
//换成,不再支持with方法
$form->keyValue('log')

laravel-admin不支持的$form->deleted事件和$form->deleting事件在dcat admin里是支持的,有必要的话,代码可以相应的做下更改。

grid column相关:

#switch

$column->switch([...])
//换成,里面不能带参数
$column->switch()

#column suffix

$grid->column(‘log’)->suffix('log')
//换成,方法名更改
$grid->column(‘log’)->append('log')

#column prefix

$grid->column(‘log’)->prefix('log')
//换成,方法名更改
$grid->column(‘log’)->prepend('log')

#column textarea

$grid->column('log')->textarea(6)
//换成,去除textarea的参数
$grid->column('log')->textarea()

#editable

->editable(‘text’);
->editable('select', [...])
->editable('textarea')
//editable里面带参数到,需要去除,换成相应的
->editable();
->select([...])
->textarea()

#modal

->modal('Log', function ($model) {
//之前function里的参数是数据的Illuminate\Database\Eloquent\Model对象,需要换成Grid\Displayers\Modal对象,使用$modal->row代替原来的$model对象,如下
->modal('Log', function (Grid\Displayers\Modal $modal) {
$model = $modal->row;

#ModelTree

$this->setParentColumn('parent_id');
$this->setOrderColumn('sort');
$this->setTitleColumn('title');

换成,方法变成变量

protected $parentColumn = 'parent_id';
protected $orderColumn = 'sort';
protected $titleColumn = 'title';

我的后台并不复杂,所以目前只遇到这些不同的,改完就算迁移完成了,加上阅读dcat admin的文档,差不多也就花2天左右的时间,还是很值得的,dcat admin的功能多,bug比较少,更新维护也快,如果大家感兴趣,不妨一试。

更新到线上后,别忘了在Admin菜单项里添加扩展(Extensions)子菜单,路由是 auth/extensions,Helpers菜单在线上环境是不显示的,这样就可以安装dcat admin的扩展了。