前几个月弄了个网站,后台用了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
代码我列到下面了:
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的扩展了。