laravel_admin笔记
一。 将5.5以上的laravel框架方在编辑器
二。修改配置文件正确连接数据库
三。 cmd 命令进入框架
四。运行如下命令
五。 cmd运行
php artisan serve
六。 自己创建增删改
1.创建数据表(在admin数据库创建数据表如title)
2.创建模型层
php artisan make:model /Admin/Models/Title
在模型层绑定数据表
protected $table=’title’;
public $timestamps=false;
3. 创建控制器
php artisan admin:make TitleCotrollers –model=App\Admin\Models\Title
如下:
4.运行: php artisan serve
5.谷歌url访问:
大功尚未告成:
同学继续努力!
更新头像命令:php artisan config:cache
页面添加创建的表
控制器各方法的作用:
$title属性用来设置这个CURD模块的标题,可以将它修改为任何其它的字符串。
grid方法对应数据的列表页,参考model-grid 文档来实现列表页的相关功能逻辑。
detail方法对应数据的详情页,在列表页操作列的详情显示按钮点击进入,参考model-show 文档来实现详情页的相关功能逻辑。
form方法对应数据的创建和编辑页,参考model-form 文档来实现数据创建和编辑页的相关功能逻辑。
grid方法对应数据的列表页,参考model-grid 文档来实现列表页的相关功能逻辑。
示例:
// 第一列显示id字段,并将这一列设置为可排序列
$grid->column(‘id’, ‘ID’)->sortable();
1)->sortable()显示排序
2)$grid->column(‘’,__’列显示名’)->display(function() { return ‘定义方法查询你需要的内容,显示内容’; });
3) // 第六列显示released字段,通过display($callback)方法来格式化显示输出 $grid->column(‘released’, ‘上映’)->display(function ($released) { return $released ? ‘是’ : ‘否’; //三元运算判断是否上映 });
4)->using([‘0’=>’不显示’,’1’=>’展示’,’2’=>’到时显示’])
5)开关按钮展示
// $states = [
// ‘on’ => [‘value’ => 1, ‘text’ => ‘打开’, ‘color’ => ‘primary’],
// ‘off’ => [‘value’ => 2, ‘text’ => ‘关闭’, ‘color’ => ‘default’],
// ];
// $grid->column(‘hh’)->switch($states);
改格式 截取30位 超出用。。。显示
列对象的setAttributes()方法用来给当前这一列的每一行添加HTML属性, 比较有用的一个场景是给当前列增加样式
$grid->column(‘title’)->setAttributes([‘style’ => ‘color:red;’]);
基于setAttributes()方法封装了style()方法,直接添加样式,比如限制列的宽度:
$grid->column(‘desc’)->style(‘max-width:200px;word-break:break-all;’);
$grid->column(‘tags’)->pluck(‘name’);数据表若存的是json串的用->pluck(‘name’)可取其对应的值
自定义行&批量操作
php artisan admin:action Post\Replicate –grid-row –name=”复制”
Post对应控制器名创建的文件 Replicate自己定义的名 name为行操作的名字
控制器写
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new Value());// Value为你创建的操作自己定义的名字
});
创建文件写:
class Value extends Action
{
protected $selector = ‘.value’;
//弹出框表单处理逻辑(入库等)
public function handle(Request $request)
{
$goods = new IbrandGoods();
$a = $goods->goodsGetFrst($request->get(‘goods_no’));
$arr[“pic_url”] = $a[‘goods_img’];
$arr[“goods_name”] = $a[‘goods_name’];
$arr[“good_info”] = $a;
$arr[“type”] = $request[‘type’];
$arr[“goods_no”] = $request[‘goods_no’];
$arr[“page_url”] = $request[‘page_url’];
$arr[“status”] = $request[‘status’];
$arr[“publish_time”] = $request[‘publish_time’];
if($request[‘type’]==1&&$request[‘page_url’]==null){
return $this->response()->success(‘您选择了轮播图广告,所以广告链接地址必需填写’)->refresh();
}
if($request[“status”]==2&&$request[“publish_time”]==null ){
return $this->response()->success(‘您选择了到时显示,所以必需填写推送时间’)->refresh();
}
$recommend = new Recommend();
/* $recommend->good_info=$arr[‘good_info ‘];
$recommend->pic_url=$arr[‘goods_img ‘];
$recommend->type=$arr[‘type ‘];
$recommend->status=$arr[‘status ‘];
$recommend->good_no=$arr[‘good_no ‘];
$recommend->page_url=$arr[‘page_url ‘];
$recommend->publish_time=$arr[‘publish_time ‘];
$recommend->save();*/
$aaa = $recommend->add($arr);
return $this->response()->success($aaa)->refresh();
}
//弹出表单页面
public function form()
{
//$this->image(‘pic_url’, ‘Placeholder…’);
$directors = [
‘0’ => ‘轮播图商品’,
‘1’ => ‘轮播图广告’,
‘2’ => ‘左边栏商品’,
‘3’ => ‘右边栏商品’,
‘4’ => ‘热卖商品’
];
$this->select(‘type’, ‘展示地方’)->options($directors);
$dir = [
‘0’ => ‘不显示’,
‘1’ => ‘展示’,
‘2’ => ‘到时显示’
];
$this->select(‘status’, __(‘是否展示’))->default(‘0’)->options($dir);
$this->text(‘goods_no’, __(‘商品编码’));
$this->text(‘page_url’, __(‘广告链接地址’))->placeholder(‘如选择轮播图广告请输入广告链接地址’);
$this->datetime(‘publish_time’, __(‘推送时间’));
}
public function html()
{
return <<<HTML
HTML;
}
}
倒序关联模型层 展示 修改 添加
//关联模型层
public function newsuser()
{
return $this->belongsTo(NewsUser::class, ‘user_id’,’id’);
}
$grid->column(‘newsuser.uname’, __(‘User id’));
$form->select(‘user_id’)->options(NewsUser::all()->pluck(‘uname’, ‘id’));
正序模型关联 一对一
//主模型层
public function useraddress()
{
return $this->hasOne(IbrandUserAddress::class,’user_id’,’id’);
}
$grid->column(‘useraddress.is_default’, __(‘状态’));
//关联方法名点要显示的字段名
如果表格的字段比较多,挤压了列的显示,可以用过fixColumns方法来设置固定列 (有滑动条查看其他列)
$grid->fixColumns(3, -2);
第一个参数表示固定从头开始的前三列,第二个参数表示固定从后往前数的两列,(第二个参数可不传,默认为-1)
开关 注释:要想修改关联查询显示的数据,必需再修改页面添加对应的form表单修改哪一行的数据
on和off对用开关的两个值1和0:
修改页
$states = [ ‘on’ => [‘value’ => 1, ‘text’ => ‘打开’, ‘color’ => ‘success’], ‘off’ => [‘value’ => 0, ‘text’ => ‘关闭’, ‘color’ => ‘danger’], ]; $form->switch(字段名)->states($states);//一般要用int类型
展示页
// 设置text、color、和存储值 $states = [ ‘on’ => [‘value’ => 1, ‘text’ => ‘打开’, ‘color’ => ‘primary’], ‘off’ => [‘value’ => 2, ‘text’ => ‘关闭’, ‘color’ => ‘default’], ]; $grid->column(‘status’)->switch($states);
行内编辑器 ->editable();可以直接修改字段数据
可以让你在表格中点击数据,在弹出的对话框里面编辑保存数据,使用方法如下
$grid->column(‘title’)->editable(‘select’, [1 => ‘option1’, 2 => ‘option2’, 3 => ‘option3’]);
效果图
列的展开(一般用于一对多表主表展示)
更牛操作网址博客:扩展 Laravel-admin,实现一行代码展现内联表格的功能,自动加页码,... 可以分页
主表模型层
public function catrend()
{ //副表 副表字段 主表字段
return $this->hasMany(Recommend::class,’type’,’cate_id’);
}
主表控制器
$grid->column(‘cate_id’, __(‘推荐栏位id’))
->using([‘0’ => ‘轮播图商品’, ‘1’ => ‘轮播图广告’, ‘2’ => ‘左边栏商品’, ‘3’ => ‘右边栏商品’, ‘4’ => ‘热卖商品’])
->expand(function ($model) {
//关联方法名 获取全部
$comments = $model->catrend()->take(10)->get()->map(function ($comment) {
// return $comment->only([‘goods_name’, ‘goods_no’, ‘status’,’created_at’]);
//副表字段名
$data= $comment->only([‘pic_url’,’goods_name’, ‘goods_no’, ‘status’,’created_at’]);
$sta= $data[‘status’]; //如果想展示你要的效果,把字段值单提出来,重新新赋值处理你想要的效果
$imgurl=$data[‘pic_url’];
$img=”<img src=’www.humz.com/upload/$imgurl' style="max-width:100px;max-height:100px">”;
$data[‘pic_url’]=$img;
//[‘0’ => ‘不显示’, ‘1’ => ‘展示’, ‘2’ => ‘到时显示’]
if($sta==0){
$data[‘status’]=’不显示’;
}elseif($sta==1){
$data[‘status’]=’显示’;
}else{
$data[‘status’]=’到时显示’;
}
return $data;
});
return new Table([‘商品图片’,’商品名’, ‘商品编号’,’是否显示 ‘,’发布时间’], $comments->toArray());
});
效果图
当一列的字段太多时也可以用向列展开一样的效果展示
$grid->column(‘goods_name’, ‘商品名称’)->expand(function ($model) {
//获取其他字段
$comments[] = $model->only([‘market_price’,’sell_price’,’cost_price’,’goods_detail’,’created_at’,’updated_at’]);
return new Table([‘市场价’,’销售价’,’成本价’,’商品详情’,’发布时间’,’修改时间’], $comments);
})->width(260);
效果图
列的弹出框显示
主表模型层
public function goods()
{
return $this->hasOne(IbrandGoods::class,’goods_no’,’goods_no’);
}
主表控制器
$grid->column(‘goods.goods_name’, ‘商品基本信息’)->modal(‘最新评论’, function ($model) {
//主表模型层关联表方法
$comments = $model->goods()->take(10)->get()->map(function ($comment) {
return $comment->only([‘goods_name’, ‘goods_no’, ‘sale_count’,’sell_price’,’googs_detail’]);
});
return new Table([‘商品名称’, ‘商品编号’, ‘商品销量’,’商品售价’,’商品描述’], $comments->toArray());
});
效果图
图片轮播(必需在模型层将图片字段转成json存入数据库)
protected $casts = [
‘good_pic’ => ‘json’,
];
如果字段值为图片数组,可以用下面的调用显示为图片轮播组件
$grid->column(‘good_pic’, __(‘Good pic’))->carousel($width = 300, $height = 200);
表单控制器
$form->multipleImage(‘good_pic’, __(‘多图上传’))->removable()->sortable();
规格选择器
$grid->selector(function (Grid\Tools\Selector $selector) {
$selector->select(‘字段名’, ‘品牌’, [
1 => ‘华为’,
2 => ‘小米’,
3 => ‘OPPO’,
4 => ‘vivo’,
]);
});
效果图
图片放大效果安装
命令行安装扩展
composer require laravel-admin-ext/grid-lightbox
php artisan vendor:publish –tag=laravel-admin-grid-lightbox
配置
打开config/admin.php,将属于此扩展的配置添加到extensions部分。
‘extensions’ => [
‘grid-lightbox’ => [
// Set to false
if you want to disable this extension
‘enable’ => true,
]
]
用法
$grid->pic(‘海报图’)->lightbox([‘width’ => 50, ‘height’ => 50]);
admin后台脚手架
参考博客:博客:Larave-admin 搭建管理后台 - 脚手架工具
composer require laravel-admin-ext/helpers
php artisan admin:import helpers
模型树操作 (用于手机分类)
参考博客:博客:Laravel-admin 搭建管理后台 - 数据模型树(1)
博客:Laravel-admin 搭建管理后台 - 数据模型树(2)
效果图
简便操作
文档地址:laravel-admin.org/docs/zh/model-tr...
1.前提条件:表格结构里面有三个必要的字段parent_id (父级id)、order(排序)、title(名称),其它字段没有要求。
2.正常建立模型层 控制器 路由的定义
3.模型层绑表 做字段修改 引用 use ModelTree;
<?php
namespace App\Admin\Models;
use Encore\Admin\Traits\AdminBuilder;
use Encore\Admin\Traits\ModelTree;
use Illuminate\Database\Eloquent\Model;
class IbrandGoodsCategory extends Model
{
use ModelTree, AdminBuilder;
protected $table = ‘ibrand_goods_category’;
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
//这里根据自己的字段修改
$this->setParentColumn(‘parent_id’);
$this->setTitleColumn(‘order’);
$this->setTitleColumn(‘category_name’);
}
}
4.控制器操作 请参照地址:www.erlo.vip/share/2/58762.html
use App\Admin\Models\IbrandGoodsCategory;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Row;
use Encore\Admin\Show;
use Encore\Admin\Widgets\Box;
public function index(Content $content)
{
return Admin::content(function ($content) {
$content->header('商品分类管理');
$content->row(function (Row $row) {
$row->column(6, $this->viewterr());
$row->column(6, function (Column $column) {
$form = new \Encore\Admin\Widgets\Form();
$form->action(admin_url('ibrand_goods_categories'));//设置表单提交地址
$form->select('parent_id', __('父级分类'))
->options(IbrandGoodsCategory::selectOptions(function ($category) {
return $category->where('parent_id', '0');
}));
$form->text('category_name', __('分类名称'));
//小图标入库 icon
$form->icon('category_icon', __('分类图标'));
//设置获取时间戳 字符串截取 留取排序的数字
$form->number('order', __('排序'))->default(substr(time(), 4));
$form->hidden('_token')->default(csrf_token()); //post提交是设置安全提交
$column->append(new Box(__('规格管理'), $form));
});
});
});
}
public function viewterr()
{ // 模型层
return IbrandGoodsCategory::tree(function ($tree) {
$tree->branch(function ($branch) {
//小图标显示
$img="<i class='fa {$branch['category_icon']}'></i>";
//前台显示的每行字段
return "$img {$branch['id']} - {$branch['category_name']} ";
});
});
}
修改form
select中使用分类树
$form->select(‘parent_id’, __(‘Parent id’))->options(Category::selectOptions())->default(1);
效果图
富文本编辑 (采集页面图片上传等更方便)
composer require jxlwqq/quill
php artisan vendor:publish –tag=laravel-admin-quill
2.配置config/admin.php
‘extensions’ => [
‘quill’ => [
// If the value is set to false, this extension will be disabled
‘enable’ => true,
‘config’ => [
‘modules’ => [
‘syntax’ => true,
‘toolbar’ =>
[
[‘size’ => []],
[‘header’ => []],
‘bold’,
‘italic’,
‘underline’,
‘strike’,
[‘script’ => ‘super’],
[‘script’ => ‘sub’],
[‘color’ => []],
[‘background’ => []],
‘blockquote’,
‘code-block’,
[‘list’ => ‘ordered’],
[‘list’ => ‘bullet’],
[‘indent’ => ‘-1’],
[‘indent’ => ‘+1’],
‘direction’,
[‘align’ => []],
‘link’,
‘image’,
‘video’,
‘formula’,
‘clean’
],
],
‘theme’ => ‘snow’,
‘height’ => ‘200px’,
]
]
]
3.刷新框架
php artisan config:cache
4.对应的控制器添加修改
$form->quill(‘content’);
5.显示用 ->view(‘渲染页面’)
$grid->column(‘content’, __(‘Content’))->view(‘aaa’);
6. 渲染页面 aaa.blade.php
{!! $value !!} 次方法可以将数据库的html数据解析到页面渲染
效果图
后台页面布局(一页分块展示)
public function index(Content $content)
{
// 选填
$content->header(‘填写页面头标题’);
// 选填
$content->description(‘填写页面描述小标题’);
$content->row(function(Row $row) {
$row->column(6, $this->tree());//¥this-》tree()为显示页面的方法
$row->column(6, $this->form());
});
return $content;
}
$this->tree();树状结构显示的方法;
protected function tree()
{
return Category::tree(function (Tree $tree) {
$tree->branch(function ($data) {
return “{$data[‘id’]} - {$data[‘title’]}”;
});
});
}
$this->form(); 添加表单显示的方法;
protected function form()
{
$form = new Form(new Category);
$form->display(‘id’, ‘ID’);
$form->select(‘parent_id’, ‘所属类别’)->options(Category::selectOptions());
$form->text(‘title’, ‘类别名称’)->rules(‘required’);
$form->display(‘created_at’, ‘Created At’);
$form->display(‘updated_at’, ‘Updated At’);
return $form;
}
效果图:
模型详情 (后台详情页展示多模型的数据页)
效果图:
sers表和上面的posts表为一对一关联关系,通过posts.author_id字段关联,users表结构如下:
users id - integer name - string email - string posts id - integer author_id - integer content - text
模型定义为:
class User extends Model
{
}
class Post extends Model
{
public function author()
{
return $this->belongsTo(User::class, ‘author_id’);
}
}
那么可以用下面的方式显示post所属的用户的详细:
$show->author(‘作者信息’, function ($author) {
$author->setResource(‘/admin/users’);
$author->id();
$author->name();
$author->email();
});
其中$author对象也是Show实例,同样可以使用上面的各种方法
注意:为了能够正常使用这个面板右上角的工具,必须用setResource()方法设置用户资源的url访问路径
一对多或多对多关系
一对多或多对多关系的关联数据会以Model-grid的方式呈现,下面是简单的例子
posts表和评论表comments为一对多关系(一条post有多条comments),通过comments.post_id字段关联
comments id - integer post_id - integer content - string
模型定义为:
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}
class Comment extends Model
{
}
那么评论的显示通过下面的代码实现:
$show->关联方法名(‘评论’, function ($comments) {
$comments->resource(‘/admin/comments’);
$comments->id();
$comments->content()->limit(10);
$comments->filter(function ($filter) {
$filter->like(‘content’);
});
});
$comments是一个Encore\Admin\Grid实例,详细的使用方法可以参考model-grid
注意:为了能够正常使用这个数据表格的功能,必须用resource()方法设置comments资源的url访问路径
面板工具设置
面板右上角默认有三个按钮编辑、删除、列表,可以分别用下面的方式关掉它们:
$show->panel()
->tools(function ($tools) {
$tools->disableEdit();
$tools->disableList();
$tools->disableDelete();
});
地址省市区入库及显示
在laravel_admin文档 扩展 找中国省市区级联选择
github.com/laravel-admin-extension...
composer require laravel-admin-ext/china-distpicker
php artisan vendor:publish –tag=laravel-admin-china-distpicker
配置文件config
‘extensions’ => [
‘china-distpicker’ => [
// 如果要关掉这个扩展,设置为false
‘enable’ => true,
]
]
在数据库导入sql文件 china_area.sql
文件下载地址 博客:中国城市区域数据下载
admin使用 blog.csdn.net/xiaxia_Lin/article/d...
引用 use Illuminate\Support\Facades\DB;
$form->distpicker([
‘province’ => ‘省’,
‘city’ => ‘市’,
‘district’ => ‘区’
]);
//省名
$grid->column(‘province’, __(‘Province’))
->display(function($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
//市名
$grid->column(‘city’, __(‘City’))
->display(function($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
//区名
$grid->column(‘district’, __(‘District’))
->display(function($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
$show->field(‘province’, __(‘Province’))
->unescape()->as(function ($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
$show->field(‘city’, __(‘City’))
->unescape()->as(function ($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
$show->field(‘district’, __(‘District’))
->unescape()->as(function ($code) {
$name = DB::table(‘china_area’)->where(‘code’, $code)->value(‘name’);
return $name;
});
下拉列展示
$data是返回的字段值
$grid->column(‘’, __(‘地址’))->expand(function ($model) {
$comments = $model->useraddres()->take(10)->get()->map(function ($comment) {
$data=$comment->only([‘id’, ‘name’, ‘mobile’, ‘province’, ‘city’, ‘area’, ‘address’
]);
$name = DB::table(‘china_area’)->where(‘code’, $data[‘area’])->value(‘name’);
$data[‘area’]=$name;
return $data;
});
return new Table([‘ID’, ‘收件人’, ‘联系电话’, ‘省’, ‘市’, ‘区’, ‘详细地址’], $comments->toArray());
});
有颜色的效果展示 效果图
$grid->column(‘status’, __(‘是否展示’))->using([‘0’ => ‘不显示’, ‘1’ => ‘展示’, ‘2’ => ‘到时展示’])->filter([
0 => ‘不显示’,
1 => ‘展示’,
2 => ‘到时展示’,
])->label([
1 => ‘warning’,
2 => ‘default’,
3 => ‘success’,
4 => ‘info’,
]);
本作品采用《CC 协议》,转载必须注明作者和本文链接
格式可以优化一下
可以看一下 markdown 语法,标题自动加粗显示,按级排放还能形成目录;
把代码放在代码区域内,也比较美观易懂;