角色表结构如下:

权限表结构如下:

控制器代码:

  //递归查询权限列表
public function index(){
$data = ManagePermissionModel::query()->get()->toArray();
$array = $this->recursion($data, $pid = 0);
return $this->success($array);
} /***
* 获取取全树
*/
public function navList(){
$operationModel = new ManagePermissionModel();
$query = $operationModel->where('type','<>','a')->orderBy('sort', 'asc')->get()->toArray();
$tree = PHPTree::makeTreeForHtml($query,array(
'parent_key' => 'pid',
'primary_name' => 'name',
'primary_code' => 'code',
));
return $this->success($tree);
} public function menus(){
$operationModel = new ManagePermissionModel();
$menus = $operationModel->where('perm_type','<',3)->orderBy('sort', 'asc')->get()->toArray();
$r = PHPTree::makeTreeForHtml($menus,array(
'parent_key' => 'pid',
'primary_name' => 'name',
'primary_code' => 'code',
));
return $this->success($r);
} /**
* 创建栏目
* @param OperationRequest $request
*/
public function create(OperationRequest $request){
$operation = [
'permission_name' => $request->permission_name,
'address' => $request->address,
'type' => $request->type,
'pid' => $request->pid,
'parent_menu_id' => $request->parent_menu_id,
'perm_type' => $request->perm_type,
'sort' => $request->sort,
];
$addPermission = ManagePermissionModel::query()->create($operation);
if ($addPermission){
return $this->success($addPermission, "创建成功");
} else {
return $this->failed("创建失败");
}
} public function del(CheckIdRequest $request){
$id = $request->id;
$del = ManagePermissionModel::query()->where(['id' => $id])->delete();
if ($del){
return $this->success($del, "删除成功");
}else{
return $this->failed("删除失败");
}
} public function edit(OperationRequest $request){
if (empty($request['id']) || !is_numeric($request['id'])){
return $this->failed("非法传参");
}
$operation = [
'permission_name' => $request->permission_name,
'address' => $request->address,
'type' => $request->type,
'pid' => $request->pid,
'parent_menu_id' => $request->parent_menu_id,
'id' => $request->id,
'perm_type' => $request->perm_type,
'sort' => $request->sort,
];
$edit = ManagePermissionModel::query()->where(['id' => $operation['id']])->update($operation);
if ($edit){
return $this->success($edit, "修改成功");
} else {
return $this->failed("修改失败");
}
}

模型层代码:

/**
* 根据传过来的数组,构建以parent_menu_id为父节点的菜单树..
* @param $list 构建树所需要的节点,此值是根据权限节点算出来的
* @param $parent_menu_id 构建树的根节点
* @return array
*/
public function createTree($list,$parent_menu_id){
$data = [];
foreach($list as $k => $v){
if($v['parent_menu_id'] == $parent_menu_id){
$row = $v;
//取当前节点的url
// $row['url'] = $this->getUrl($v['id']);
$row['children'] = $this->createTree($list,$v['id']);
$data[] = $row;
}
}
return $data;
} /**
* 根据当前节点,取出当前节点的url,用于后台菜单节点的url生成
* @param $operation_id
* @param $list
*/
private function getUrl($operation_id){
static $list = [];
if(!$list){
$all = ManagePermissionModel::query()->get();
if(!$all->isEmpty()){
$all = $all->toArray();
}else{
$all = [];
}
foreach($all as $v){
$list[$v['id']] = $v;
}
} if(!isset($list[$operation_id])){
return "";
}
if($list[$operation_id]['type'] == 'm'){
return url($list[$operation_id]['code'] . '/index/index'); //一个模型,搞什么url?
}
if($list[$operation_id]['type'] == 'c'){
if(isset($list[$list[$operation_id]['pid']])){
return url($list[$list[$operation_id]['pid']]['code'] . '/'.$list[$operation_id]['code'].'/index');
}else{
return "";
}
}
if($list[$operation_id]['type'] == 'a'){
//取控制器
if(isset($list[$list[$operation_id]['pid']]) && isset($list[$list[$list[$operation_id]['pid']]['pid']])){
return url($list[$list[$list[$operation_id]['pid']]['pid']]['code'] . '/'.$list[$list[$operation_id]['pid']]['code'].'/'.$list[$operation_id]['code']);
}else{
return "";
}
}
return "";
}

在Laravel框架配置里封装:

配置目录:

封装代码:

/**
* 根据父级id查找子级数据
* @param $data 要查询的数据
* @param int $pid 父级id
*/
public function recursion($data, $pid = 0)
{
// 定义存储子级数据数组
$child = [];
foreach ($data as $key => $value) {
if ($value['pid'] == $pid) {
// 使用过后可以销毁
unset($data[$key]);
// 递归调用,查找当前数据的子级
$value['child'] = $this->recursion($data, $value['id']);
// 把子级数据添加进数组
$child[] = $value;
}
}
return $child;
}

  

Laravel框架角色、权限的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  2. DRF框架之 用户角色权限与访问频率的权限设置

    1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...

  3. [php]laravel框架容器管理的一些要点

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  4. 使用 Laravel 框架:成为微信公众平台开发者

    转: http://ninghao.net/blog/1441 作者:王皓发布于:2014-05-30 13:16更新于:2014-05-31 12:05 我们可以使用Laravel 框架为微信公众平 ...

  5. [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...

  6. laravel框架详解

    一.基础篇 1.概念 Laravel是一个有着美好前景的年轻框架,它的社区充满着活力,同时提供了完整而清晰的文档,而且为快速.安全地开发现代应用提供了必要的功能.2011年,Taylor Otwell ...

  7. laravel框架容器管理

    来自http://www.cnblogs.com/chy1000/p/7072936.html 本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章 ...

  8. laravel框架入门

    本文摘自网络,个人感觉写的很不错,决定收藏一下纯属本人学习之用 本文介绍如何开始使用 Laravel. 读完本文,你将学到: 如何安装 Laravel,新建 Laravel 程序,如何连接数据库: L ...

  9. Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

随机推荐

  1. Java学习(十)

    今天学习的是参数的传入,感觉这个和c++差不多. 传一个参数进去,要看这个参数是地址还是一个值,如果是值的话那无论在方法中如何加减,也只是另一个局部变量的事情了,与该参数无关,在原方法中参数的值保持不 ...

  2. C语言二分查找法

    参考了C语言中折半查找法(二分法)的实现 二分查找算法(C语言实现) 先附上代码 #include<stdio.h> int BinSearch(int arr[],int len,int ...

  3. 大白话讲解Mybatis的plugin(Interceptor)的使用

    mybatis提供了一个入口,可以让你在语句执行过程中的某一点进行拦截调用.官方称之为插件plugin,但是在使用的时候需要实现Interceptor接口,默认情况下,MyBatis 允许使用插件来拦 ...

  4. Robot frawork关键字使用报错原因

    对比发现1或者${1}两种方式赋值输出的类型都为整形 >>> ${test1}    set variable   'www' >>> log    ${test1 ...

  5. [hdu6991]Increasing Subsequence

    令$f_{i}$​​表示以$i$​​为结尾的极长上升子序列个数,则有$f_{i}=\sum_{j<i,a_{j}<a_{i},\forall j<k<i,a_{k}\not\i ...

  6. 32、最长有效括号 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(32)最长有效括号 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "滑动窗 ...

  7. Python之浏览器的前进或后退

    import webbrowserwebbrowser.back() 后退webbrowser.forward() 前进

  8. 为什么前端H5工程师工资那么高?

    目前,企业对于html5前端开发人才需求量非常大,小到企业网站.个人主页,大到政府部门,都是通过网站向外界展示形象.传播信息,网站离不开HTML5前端开发人员,所以学习html5前端开发在当前社会非常 ...

  9. Codeforces Round #701 (Div. 2) 题解

    由于今天实在是太自闭了就前来写场已经 AK 的 div.2 的题解了 这场比赛是我的 div.2 首 AK 哦 A 先特判 \(b=1\),强制将 \(b+1\) 否则容易发现答案最大为 \(\log ...

  10. kubernetes整个基础环境的准备

    1.三台centos7,用CentOS-7-x86_64-Minimal-1708.iso安装的,记得统一选好时区,这三台会有etcd集群,其中一台做kubernetes服务端(也可以做三台服务端做负 ...