Laravel-admin新手基础总结

  • Post author:
  • Post category:其他




1.添加菜单,指定路径



2.定义路由

routes.php

$router->group(['prefix' => 'test'], function ($router) {
    $router->get('', TestController::class.'@index');		       //列表
    $router->get('create', TestController::class.'@create');       //新增页
    $router->post('', TestController::class.'@store');             //新增提交
    $router->get('{id}/edit', TestController::class.'@edit');      //编辑页
    $router->put('{id}', TestController::class.'@update');         //修改提交
});

Laravel路由的具体方法的作用如下所示:

HTTP 方法 URI 控制器方法 路由名称 作用描述
GET /order index order.index 显示所有订单列表
GET /order/create create order.create 显示创建订单页面
POST /order store order.store 接收提交数据,创建订单
GET /order/{id} show order.show 显示单个订单信息
GET /order/{id}/edit edit order.edit 显示修改订单页面
PUT/PATCH /order/{id} update order.update 接收提交数据,修改订单
DELETE /order/{id} destroy order.destroy 删除订单



3.新建控制器



4.新建模型


php artisan admin:make TestController --model=App\\Models\\Test

#后台 创建控制器 和 关联数据模型

在app=>Models目录下新建模型,新建的文件为Test.php

<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class TestModel extends Model
{
    protected $table = "tbl_test";//要连接的表名称
    public $timestamps = false;//将时间戳设置为false,否则数据表没有对应字段(create_at等字段)就会报错
}

在App=>Admin=>Controllers目录下新建控制器,新建的文件为TestController.php

<?php
namespace App\Admin\Controllers;

use App\Http\Controllers\Controller;
use App\Model\TestModel;//引用模型
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use Encore\Admin\Controllers\ModelForm;

class TestController extends Controller
{
    use ModelForm;

    public function index()
    {
        return Admin::content(function (Content $content) {

            $content->header('广告');//这里是页面标题
            $content->description('列表');//这里是详情描述

            $content->body($this->grid());//指向grid方法显示表格
        });
    }


    public function create()
    {
        return Admin::content(function (Content $content) {

            $content->header('广告列表');
            $content->description('新增');
            $content->body($this->form());//调用form方法,显示表单

        });
    }

    public function edit($id)
    {
        return Admin::content(function (Content $content) use ($id) {
            $content->header('广告列表');
            $content->description();
            $content->body($this->form()->edit($id));//将id传给form,form的模型就是以id为查询条件的
        });
    }
    protected function form()
    {//点击新增或者修改进入form表单

        return Admin::form(TestModel::class, function (Form $form) {
//form表单显示内容,$form->显示的控件格式【文本框,多选框,文件上传......】(‘数据库中相应的字段’,‘在页面上显示的名称’)->其他方法();

            $form->text('name',名称)->rules("required");//required为名称规则,具体信息的定义在recourse=>lang=>zh_CN=>validation.php文件中


            $form->text('sort',排序)->default(TestModel::max('sort') + 1);//default定义默认值为数据表中sort字段的最大值+1

            $form->image('logo','图片')->uniqueName()->value('1.jpg');//value显示默认图片

            $form->editor('remark','备注');//富文本编辑框

//还有很多类型这里就不一一列举了,更具体的内容可以去官方文档查看
            });
    }

    protected function grid()
    {//页面显示的表格

        return Admin::grid(TestModel::class, function (Grid $grid) {
//grid显示表格内容,$grid->数据库中相应的字段(‘在页面上显示的名称’)->其他方法();或者$grid->column(‘数据库中相应的字段’,‘在页面上显示的名称’)->其他方法();

            $grid->id('ID')->sortable();

            $grid->name('名称');

            $grid->sort('排序');

           // $grid->disableExport();//禁用导出数据按钮

           // $grid->filter(function ($filter) {

             //   $filter->disableIdFilter();//禁用查询过滤器

               // $filter->like('name', '名称'));//用名称作为条件模糊查询

            });
        });
    }
}



自定义model


当列表数据获取有特定条件或自己写ORM方法时可以用到,支持排序。

$grid->model()->select('id','name')->where('status',1)->groupBy('project_id');
$grid->model()->select('id','name')->where('status',1)->groupBy('project_id');
//结合having 查出名字重复的
$grid->model()->select('name_en')->groupBy('name_en')->havingRaw('count(name_en)>1')
//嵌套子查询 查出名字重复的全部信息
$grid->model()->select('id','name_en')->whereIn('name_en',Project::select('name_en')->groupBy('name_en')->havingRaw('count(name_en)>1'))->orderBy('name_en');



模型数据获取


第一列显示id字段,并将这一列设置为可排序列

$grid->id('ID')->sortable();


获取单列数据的方法

$grid->name_cn('名称');


注:name_cn为与数据库对应的字段名

$grid->column('name_cn','名称');


判断type来显示不同的状态

$grid->column('type','类型?')->display(function ($type) {
    return $type == 1 ? '111' : '222';
});


where条件

$grid->model()->where('type', 0);


三个时间的显示

// 下面为三个时间字段的列显示
$grid->release_at();
$grid->created_at();
$grid->updated_at();



筛选框控制方法


基本方法

//filter($callback)方法用来设置表格的简单搜索框
$grid->filter(function ($filter) {
    //1.时间段筛选   设置created_at字段的范围查询
    $filter->between('created_at', '筛选时间')->datetime();
    //2.字段模糊查询 like = '% %'
    $filter->like('name', '姓名');
    //3.字段equal 筛选
    $filter->equal('status', '状态')->select([0 => '下线', 1 => '上线']);
    //4.去掉默认的ID搜索
    $filter->disableIdFilter();
    //5.

});



按钮控制


禁用导出

$grid->disableExport();


禁用新增

$grid->disableCreateButton();


禁用分页条

$grid->disablePagination();


禁用行选择checkbox

$grid->disableRowSelector();


去掉重置 [from]

$form->disableReset();


关闭默认行操作

 $grid->actions(function ($actions) {
     //关闭删除
    $actions->disableDelete();
    //关闭编辑
    $actions->disableEdit();
    //自定义操作按钮
    $actions->append('<button type="button" class="btn btn-danger noShow" data-id="' . $actions->getKey() . '"  >隐藏</button>');
});


关闭批量删除

$grid->tools(function ($tools) {
    //关闭批量删除
    $tools->batch(function ($batch) {
        $batch->disableDelete();
    });
});


禁用查询过滤器

$grid->disableFilter();


禁用导出数据按钮

$grid->disableExport();


禁用行操作列

$grid->disableActions();


设置分页选择器选项

$grid->perPages([10, 20, 30, 40, 50]);

model-grid默认有两个行操作编辑和删除,可以通过下面的方式关闭它们:

 $grid->actions(function ($actions) {
    // 隐藏删除按钮
    $actions->disableDelete();
    // 隐藏修改按钮
    $actions->disableEdit();
});


如果有自定义的操作按钮,可以通过下面的方式添加:

$grid->actions(function ($actions) {
    // append一个操作
    $actions->append('<a href=""><i class="fa fa-eye"></i></a>');
 
    // prepend一个操作
    $actions->prepend('<a href=""><i class="fa fa-paper-plane"></i></a>');
});


获取主键信息或者获取当前行的数组

$grid->actions(function ($actions) {
    // 当前行的数据数组
    $row = $actions->row;
    // 获取当前行主键值
    $id = $actions->getKey(); 
});


目前默认实现了批量删除操作的功能,如果要关掉批量删除操作:

$grid->tools(function ($tools) {
    $tools->batch(function ($batch) {
        $batch->disableDelete();
    });
});


查询过滤Filter:如下

$grid->filter(function ($query) {
 
    // 去掉默认的id过滤器
    $query->disableIdFilter();
 
    $query->like('title', '文章标题');
 
    $query->equal('cate_id', '所属分类')->select(
        ArticleCategories::pluck('name', 'id')
    );
});



FORM表单提交


禁用重置按钮

 $form->disableReset();


文本输入框

//默认展示$data['name']的值,新接收的值存储user表name字段
$form->text('user.name', '名称')->default($data['name']);


禁止编辑

 $form->text('name','用户名')->value(**)->readonly();    


上传图片/文件

$form->image('user.logo', 'logo')
                #随机文件名
                ->uniqueName()
                #验证文件格式('mimes:doc,docx,xlsx');
                ->rules('mimes:png')
                #输入框下边的help提示语
                ->help($str);


表单提交url

$form->url('user.website', '官网')
                #默认填充url 传参
                ->default($url)
                #提示的url
                ->help('eg: http://www.aware.bi');


表单提交下拉框

#下拉框展示$message提示语
$form->multipleSelect('project.tags1', $message)
                #下拉框数据
                ->options($tags['children']);


select下来

$types = array('0'=>'教育','1'=>'医疗');
$form->select('type', '类型')->options($types);


laravel SQL取值

$users = User::all()->pluck('name', 'id')->toArray();


表单输入HTML editor编辑器

$form->editor('detail', '详细介绍');


单选按钮 样式转换

$states = [
    'on'  => ['value' => 1, 'text' => '上线', 'color' => 'success'],
    'off' => ['value' => 0, 'text' => '下线', 'color' => 'danger'],
];
$form->switch('status', '上/下线')->states($states);


隐藏域

$form->hidden('is_in');




保存数据的回调


保存前回调

$form->saving(function (Form $form) {
    #指定值为固定1
    $form->is_in = 1;
    #验证值是够有重复
    if($from->nick_name !== $form->model()->email && User::where('email',$form->email)->value('id')){
    #错误信息提示
    $error = new MessageBag(['title'=>'提示','message'=>'邮箱已存在!']);
        return back()->withInput()->with(compact('error'));
    }
});


保存后回调

$form->saved(function (Form $form) {
 
});


可以加rules验证规则

$form->text('from', '文章来源')->rules('required')   
$form->image('thumb', '文章缩略图')->uniqueName()
    ->move('upload/article/' . date("Ymd"))
    ->options(['overwriteInitial' => true]);//代表新图片替换修图片
    ->uniqueName() //为随机名称


设置表单提交的action

$form->setAction('admin/users');


自定义按钮操作

我们先自定义了一个隐藏按钮

 $grid->actions(function ($actions) {
    //自定义操作按钮
    $actions->append('<button type="button" class="btn btn-danger noShow" 
    data-id="' . $actions->getKey() . '"  >隐藏</button>');
    //当前数据的ID
});




获取URL中的id

$shopId = request()->route()->parameter('shop');

当为

添加

操作时,店铺名称不可和数据库内其他数据重复

当为

修改

操作时,店铺名称除自己外不可和数据库内其他数据重复

if ($shopId) {
    $form->text('shop_name', '店铺名称')
        ->rules("required|unique:shops,shop_name,{$shopId},id");
} else {
    $form->text('shop_name', '店铺名称')
        ->rules("required|unique:shops");
}

进入grid表格时,

默认id倒序

$grid->model()->orderBy('id', 'desc');
            $js = <<<EOD
            <script>
            //隐藏的点击事件
$(document).on('click', '.noShow', function() {
    //获取的ID
    var id = $(this).data('id');
       console.log(id);
    swal({
      title: "确认隐藏?",
      type: "warning",
      showCancelButton: true,
      confirmButtonColor: "#DD6B55",
      confirmButtonText: "确认",
      closeOnConfirm: false,
      cancelButtonText: "取消"
    },
    function(){
       $.ajax({
            method: 'post',
            url: '/admin/articles/hidden',
            data: {
                //文章ID
                id:id,
                //post请求token
                _token:LA.token,
            },
            success: function (data) {
                $.pjax.reload('#pjax-container');
                if (typeof data === 'object') {
                    if (data.status == 1) {
                        swal(data.msg, '', 'success');
                    } else {
                        swal(data.msg, '', 'error');
                    }
                }
            }
        })
    }
    )
});
            </script>
EOD;
            //传递到页面
            $content->body($js);
            //执行你的model
            $content->body();