Skip to main content

laravel-admin商户权限的封装

情景

laravel-admin本身有一套权限系统,因为我们的系统要区分总管理后台和商户管理后台。总管理后台可以看到所有商户的信息。所以做2套系统有点麻烦。于是又加了一层权限。 加了这层权限后会遇到这些问题。

  1. 编辑页总管理后台可以选择商户,商户管理后台没有这个选项。
  2. 列表页总管理后台可以看到商户名称,商户管理后台没有这个列表。
  3. 商户管理后台不能看到属于其他商户的信息。
  4. 商户管理后台只能修改属于自己的信息。
  5. 总部后台可以编辑查看所有商户的信息。

经过抽茧剥丝之后,我写出了以下封装。

<?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的列表、 详情、编辑、有些函数的函数名弄成一样的多好啊,我记性不好,还要查文档。