laravel-admin商户权限的封装
情景
laravel-admin本身有一套权限系统,因为我们的系统要区分总管理后台和商户管理后台。总管理后台可以看到所有商户的信息。所以做2套系统有点麻烦。于是又加了一层权限。 加了这层权限后会遇到这些问题。
- 编辑页总管理后台可以选择商户,商户管理后台没有这个选项。
- 列表页总管理后台可以看到商户名称,商户管理后台没有这个列表。
- 商户管理后台不能看到属于其他商户的信息。
- 商户管理后台只能修改属于自己的信息。
- 总部后台可以编辑查看所有商户的信息。
经过抽茧剥丝之后,我写出了以下封装。
<?php
/**
* Created by PhpStorm.
* User: 清行
* Date: 2019/12/24
* Time: 13:40
*/
namespace App\Traits;
use App\Models\Merchant;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use Illuminate\Support\MessageBag;
trait LaravelAdmin
{
public $isMerchant = false;
public $merchantId = '';
public $adminId = '';
static $ddd = 0;
public function __construct()
{
// if (empty(self::$ddd))
// {
// self::$ddd++;
// }else{
// self::$ddd+=2;
// }
//// session()->put('q','d');
//// dd(session()->all());
//// if (empty(session()->get('adminId')))
//// {
//// $this->singleObject();
//// }
}
public function singleObject()
{
// $this->init();
session([
'isMerchant'=> $this->isMerchant,
'merchantId'=> $this->merchantId,
'adminId'=> $this->adminId,
]);
}
/*********************************************************
* 初始化 Start
*/
//初始化数据
public function init()
{
$this->isMerchant();
$this->getMerchantId();
$this->getAdminId();
}
//自动初始化数据
public function autoInit()
{
if (empty($this->adminId))
{
$this->init();
}
}
//判断是否是商家
public function isMerchant()
{
$this->isMerchant = \Admin::user()->isRole('merchant');
return $this->isMerchant;
}
//获取商户ID
public function getMerchantId()
{
$this->merchantId = \Admin::user()->merchant_id;
return $this->merchantId;
}
//获取管理员ID
public function getAdminId()
{
$this->adminId = \Admin::user()->id;
return $this->adminId;
}
/**
* 初始化 END
*********************************************************/
/*********************************************************
* 功能 Start
*/
//页面跳转
public function header($url)
{
return header('Location: '.config('admin_url').$url);
}
//获取form编辑页的id
public function getFormId()
{
return current(request()->route()->parameters());
}
/**
* 功能 END
*********************************************************/
/*********************************************************
* 筛选 Start
*/
/**
* 初始化 并 根据merchant_id筛选
* @param $grid
* @param bool $isDisableDelete
*/
public function defaultFilter($grid,$isDisableDelete=false)
{
$this->init();
$this->filterMerchantId($grid,$isDisableDelete);
}
/**
* 根据商户merchant_id筛选出显示的内容
*
* @param $grid
* @param bool $isDisableDelete
*/
public function filterMerchantId($grid,$isDisableDelete=false)
{
if ($this->isMerchant)
{
if ($isDisableDelete)
{
$grid->actions(function ($actions) {
$actions->disableDelete();
});
}
$grid->model()->where('merchant_id',$this->merchantId);
}
}
/**
* 筛选 END
*********************************************************/
/**
* 显示商户的名称
*
* @param $grid
* @param $name 列名称
*/
public function showMerchantName($model,$name='所属商户',$isHaveStore=false)
{
$this->autoInit();
if ($model instanceof Grid) {
if (!$this->isMerchant){
$model->column('merchant_id', __($name))->display(function ($id){
return Merchant::getName($id);
});
}
}
if ($model instanceof Show){
if (!$this->isMerchant){
$model->field('merchant_id', __($name))->as(function ($id){
return Merchant::getName($id);
});
}
}
if ($model instanceof Form){
if (!$this->isMerchant){
if ($isHaveStore)
{
$model->select('merchant_id', __($name))->options(Merchant::getAllKV())->required()->load('store_id', '/admin/ajax/storeListByMerchantId');
$model->select('store_id', __('所属门店'))->options('/admin/ajax/storeListByMerchantId')->required();
}else{
$model->select('merchant_id', __($name))->options(Merchant::getAllKV())->required();
}
}else{
if ($isHaveStore) {
$model->select('store_id', __('所属门店'))->options('/admin/ajax/storeListByMerchantId?q='.$this->merchantId)->required();
}
//保存前回调
$model->saving(function (Form $form) {
if ($this->isMerchant)
{
$form->model()->merchant_id = $this->merchantId;
}
});
}
}
}
public function __get($name)
{
// TODO: Implement __get() method.
dd($name);
$this->init();
}
/*********************************************************
* 检测 Start
*/
/***
* 检查是否属于本商户自己的信息 不属于就报错
*/
public function checkIsMy($model)
{
$this->autoInit();
if ($model instanceof Show)
{
if ($this->isMerchant)
{
if ( $this->merchantId != $model->getModel()->merchant_id)
{
admin_error('您没有查看此内容的权限', '请检查请求是否正确');
return false;
}
}
}
if ($model instanceof Form)
{
if ($this->isMerchant)
{
$model->editing(function ($form) use ($model) {
if ( $this->merchantId != $form->model()->merchant_id)
{
admin_error('您没有此内容的编辑权限', '请检查请求是否正确');
$this->header('/admin/');
return false;
// return $this->header('/admin/');
}else{
return $model;
}
});
$model->deleting(function ($form) use ($model) {
if ( $this->merchantId != $form->model()->merchant_id)
{
// return $this->header('/admin/ajax/notDelete');
$error = new MessageBag([
'title' => '您没有权限',
'message' => '您没有此内容的编辑权限',
]);
return back()->with(compact('error'));
}else{
return $model;
}
});
}
}
return $model;
}
/**
* 检测 END
*********************************************************/
}
介绍一下
1. 列表页显示应该看到的内容 defaultFilter()
加了这个总部看所有,商户只能看到属于自己的信息
$this->defaultFilter($grid);
2. 检测权限checkIsMy()函数
detail里这样用
return $this->checkIsMy($show);
form里这样用
return $this->checkIsMy($form);
3. 所属商户 showMerchantName()函数
第二个参数是自定义显示的名称, 第三个参数是是否显示门店列表。
grid 列表页这么用
$this->showMerchantName($grid,'归属商户');
detail里这样用
$this->showMerchantName($show,'归属商户');
form里这样用
$this->showMerchantName($form,'归属商户');
我们商户下面还有门店,如果要显示门店列表就这么用
$this->showMerchantName($form,'归属商户',true);
怎么样,我封装的还不错吧???反正我用起来还挺方便,代码又简洁。
其实,Laravel-admin的列表、 详情、编辑、有些函数的函数名弄成一样的多好啊,我记性不好,还要查文档。