作者 赵彬吉

update

<?php
namespace App\Http\Controllers\Aside;
use App\Helper\Arr;
use App\Http\Logic\Aside\GroupLogic;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* 用户组
* Class Group
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class GroupController extends BaseController
{
public function list(Request $request, GroupLogic $logic)
{
$list = $logic->getList();
return view("admin.group", ["list" => $list]);
}
public function info(Request $request, GroupLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(GroupLogic $request, GroupLogic $logic){
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, GroupLogic $logic){
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
... ... @@ -2,25 +2,53 @@
namespace App\Http\Controllers\Aside;
use App\Http\Controllers\Controller;
use App\Helper\Arr;
use App\Http\Logic\Aside\MenuLogic;
use App\Rules\Ids;
use Illuminate\Http\Request;
/**
* Class Menu
* 后台菜单
* Class MenuController
* @package App\Http\Controllers\Aside
* @author zbj
* @date 2023/4/19
*/
class MenuController extends Controller
class MenuController extends BaseController
{
/**
* 菜单列表
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function index(Request $request)
public function list(Request $request, MenuLogic $logic)
{
echo 111;
$map = [];
$sort = ['id' => 'desc'];
$list = $logic->getList($map, $sort, ['*'],0);
return view("admin.menu", ["list" => Arr::listToTree($list)]);
}
public function info(Request $request, MenuLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(MenuLogic $request, MenuLogic $logic){
$data = $logic->save($this->param);
return $this->success($data);
}
public function delete(Request $request, MenuLogic $logic){
$request->validate([
'ids'=>['required', new Ids()]
],[
'ids.required' => 'ID不能为空'
]);
$data = $logic->delete($this->param['ids']);
return $this->success($data);
}
}
... ...
... ... @@ -3,6 +3,7 @@
namespace App\Http\Logic\Aside;
use App\Enums\Common\Common;
use App\Http\Logic\Logic;
/**
... ... @@ -14,6 +15,8 @@ class BaseLogic extends Logic
{
protected $requestAll;
protected $side = Common::A;
public function __construct()
{
$this->requestAll = request()->all();
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Group;
/**
* Class GroupLogic
* @package App\Http\Logic\Aside
* @author zbj
* @date 2023/4/19
*/
class GroupLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Group();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级菜单不能是本菜单');
}
$p_Group = $this->getCacheInfo($param['pid']);
if(!$p_Group){
$this->fail('上级菜单不存在');
}
}
return parent::save($param);
}
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子菜单
if(Group::where('pid', $id)->count()){
$this->fail("菜单{$info['title']}存在子菜单,不能删除");
}
}
return parent::delete($ids);
}
}
... ...
<?php
namespace App\Http\Logic\Aside;
use App\Helper\Arr;
use App\Models\Menu;
/**
* Class MenuLogic
* @package App\Http\Logic\Aside
* @author zbj
* @date 2023/4/19
*/
class MenuLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Menu();
}
public function save($param){
if(!empty($param['pid'])){
if(!empty($param['id']) && $param['pid'] == $param['id']){
$this->fail('上级菜单不能是本菜单');
}
$p_menu = $this->getCacheInfo($param['pid']);
if(!$p_menu){
$this->fail('上级菜单不存在');
}
}
return parent::save($param);
}
public function delete($ids, $map = []){
$ids= array_filter(Arr::splitFilterToArray($ids), 'intval');
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有子菜单
if(Menu::where('pid', $id)->count()){
$this->fail("菜单{$info['title']}存在子菜单,不能删除");
}
}
return parent::delete($ids);
}
}
... ...
... ... @@ -16,6 +16,8 @@ class Logic
{
protected $model;
protected $side;
protected $is_cache = true; //是否缓存数据
/**
... ... @@ -70,7 +72,9 @@ class Logic
}else{
$result = $query->select($columns)->get();
}
if($this->side == Common::A){
return $this->success($result);
}
return $this->success($result ? $result->toArray() : []);
}
... ...
<?php
namespace App\Http\Requests\Aside;
use App\Models\Group;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
/**
* Class GroupRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/19
*/
class GroupRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => ['required', 'max:32'],
'rights' => ['required', 'array'],
'status' => ['required', Rule::in(array_keys(Group::statusMap()))],
];
}
public function messages()
{
return [
'title.required' => '请输入权限组名称',
'title.max' => '权限组名称长度不超过32个字符',
'rights.required' => '请输入选择权限节点',
'rights.array' => '权限节点无效',
'status.required' => '请选择状态',
'status.in' => '状态值无效',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside;
use App\Models\Menu;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
/**
* Class MenuRequest
* @package App\Http\Requests\Bside\product
* @author zbj
* @date 2023/4/19
*/
class MenuRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => ['required', 'max:32'],
'icon' => ['max:32'],
'route_name' => ['max:32'],
'type' => ['required', Rule::in(array_keys(Menu::typeMap()))],
'status' => ['required', Rule::in(array_keys(Menu::statusMap()))],
];
}
public function messages()
{
return [
'title.required' => '请输入菜单名称',
'title.max' => '菜单名称长度不超过32个字符',
'pid.exists' => '父菜单不存在',
'icon.max' => '图标长度不超过32个字符',
'route_name.max' => '路由长度不超过32个字符',
'type.required' => '请选择类型',
'type.in' => '类型值无效',
'status.required' => '请选择状态',
'status.in' => '状态值无效',
];
}
}
... ...
<?php
namespace App\Models;
use App\Helper\Arr;
class Group extends Base
{
protected $table = 'gl_group';
const STATUS_NORMAL = 0;
const STATUS_ABNORMAL = 1;
/**
* 超级管理员ID, 当前ID拥有所有权限, 不能进行修改
*/
const ADMINISTRATOR_ID = 1;
/**
* @return string[]
*/
public static function statusMap(){
return [
self::STATUS_NORMAL => '正常',
self::STATUS_ABNORMAL => '禁用',
];
}
/**
* 获取用户组路由权限
* @param $gid
* @return array
*/
public static function getRouteByGroupId($gid)
{
try {
$group = self::where(['id' => $gid, 'status' => self::STATUS_NORMAL])->first();
$group_route = Menu::where(['status' => Menu::STATUS_NORMAL])->whereIn('id', $group->rights)->pluck('route_name')->toArray();
return $group_route;
} catch (\Exception $e) {
return [];
}
}
public function getRightsAttribute($value)
{
return Arr::s2a($value);
}
public function setRightsAttribute($value)
{
$this->attributes['rights'] = Arr::a2s($value);
}
}
... ...
... ... @@ -5,4 +5,34 @@ namespace App\Models;
class Menu extends Base
{
protected $table = 'gl_menu';
const STATUS_NORMAL = 0;
const STATUS_ABNORMAL = 1;
const TYPE_SHOW = 'show';
const TYPE_SAVE = 'save';
const TYPE_DELETE = 'delete';
/**
* @return string[]
*/
public static function statusMap(): array
{
return [
self::STATUS_NORMAL => '正常',
self::STATUS_ABNORMAL => '禁用',
];
}
/**
* @return string[]
*/
public static function typeMap(): array
{
return [
self::TYPE_SHOW => '查看',
self::TYPE_SAVE => '保存',
self::TYPE_DELETE => '删除',
];
}
}
... ...
... ... @@ -12,7 +12,7 @@ Route::middleware(['web'])->group(function (){ //admin用渲染默认要加上w
//菜单
Route::prefix('menu')->group(function () {
Route::get('/', [Aside\MenuController::class, 'index'])->name('admin.menu');
Route::get('/', [Aside\MenuController::class, 'list'])->name('admin.menu');
Route::get('/info', [Aside\MenuController::class, 'info'])->name('admin.menu_info');
Route::post('/save', [Aside\MenuController::class, 'save'])->name('admin.menu_save');
Route::any('/delete', [Aside\MenuController::class, 'delete'])->name('admin.menu_delete');
... ...