前几个月弄了个网站,后台用了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的官方文档,比较清晰。
#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的扩展了。