角色管理总结
效果图
前端代码
<!DOCTYPE html>
<html>
<head>
<title>角色管理</title>
<link rel="stylesheet" type="text/css" href="/static/plugins/layui/css/layui.css">
<script type="text/javascript" src="/static/plugins/layui/layui.js"></script>
</head>
<body style="padding: 10px">
<form class="layui-form">
<input type="hidden" name="gid" value="{$item.gid}">
<div class="layui-form-item">
<label class="layui-form-label">角色名称</label>
<div class="layui-input-inline">
<input type="text" name="title" value="{$item.title}" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">权限管理</label>
</div>
{volist name="menus" id="vo"}
<hr>
<div class="layui-input-block">
<input type="checkbox" name="menu[{$vo.mid}]" lay-skin="primary" title="{$vo.title}" {:isset($item['rights']) && $item['rights'] && in_array($vo.mid,$item['rights'])?'checked':''}>
<hr>
{volist name="vo.children" id="cvo"}
<input type="checkbox" name="menu[{$cvo.mid}]" lay-skin="primary" title="{$cvo.title}" {:isset($item['rights']) && $item['rights'] && in_array($cvo.mid,$item['rights'])?'checked':''}>
{/volist}
</div>
{/volist}
</form>
<div class="layui-form-item" style="margin-top: 10px;">
<div class="layui-input-block">
<button class="layui-btn " onclick="save()">保存</button>
</div>
</div>
</body>
</html>
<script type="text/javascript">
layui.use(['layer','form'],function(){
var form = layui.form;
layer = layui.layer;
$ = layui.jquery;
});
function save(){
var title = $.trim($('input[name="title"]').val());
if(title==''){
layer.msg('请填写角色名称',{'icon':2});
return;
}
$.post('/admins/roles/save',$('form').serialize(),function(res){
if(res.code>0){
layer.msg(res.msg,{'icon':2});
}else{
layer.msg(res.msg,{'icon':1});
setTimeout(function(){parent.window.location.reload();},1000);
}
},'json');
}
</script>
服务器端代码
<?php
namespace app\admins\controller;
use app\BaseController;
use think\facade\View;
use think\facade\Db;
/**
* 角色管理
*/
class Roles extends Bases
{
//角色列表
public function index()
{
//查询角色列表
$data['item'] = Db::table('admin_groups')->lists();
return view('',$data); //渲染
}
//添加编辑角色
public function add()
{
$gid = (int)input('get.gid'); //get获取url中gid的值
$item = Db::table('admin_groups')->where('gid',$gid)->item();//查询对应gid数据
//逻辑与 判断两者是否存在 条件成立 将字符串转换成数组
$item && $item['rights'] && $item['rights'] = json_decode($item['rights']);
//if($role && $role['rights']){$role['rights'] = json_decode($role['rights']);}
$data['item'] =$item;
//查询所有菜单列表 并将下标更换与mid等值 cates是自己封装的 下方有解释
$menu_lists = Db::table('admin_menus')->where('status',0)->cates('mid');
//进行树状处理 组成无限级菜单 gettreeitems是自己封装的 下方有解释
$menus = $this->gettreeitems($menu_lists);
//创建一个空数组
$temp = array();
foreach($menus as $value){
//当数据中有children时,进行递归处理,转换成二级菜单
$value['children'] = isset($value['children'])?$this->formatMenus($value['children']):false;
//将转换的新数据赋值给空数组
$temp[] = $value;
}
$data['menus'] = $temp;
// dump($data['menus']);
return view('',$data);
}
//保存
public function save()
{
$gid = (int)input('post.gid');
$title = trim(input('post.title'));
$menus = input('post.menu');
$menus = $menus?$menus:[];
if($gid>0){
Db::table('admin_groups')->where('gid',$gid)->update(array('title'=>$title,'rights'=>json_encode(array_keys($menus))));
}else{
Db::table('admin_groups')->insert(array('title'=>$title,'rights'=>json_encode(array_keys($menus))));
}
exit(json_encode(array('code'=>0,'msg'=>'保存成功')));
}
//树状处理
/*
** 创建新的数组 传进的数据进行遍历 该数据下标已进行处理,与mid一致 mid与pid进行父子关系绑定
** 当父级pid为0时,为最高级;
** 当遍历到某条数据pid不为0时,则在该下标为pid这条数据中 增加一个下标children
** 并将这条数据 添加进下标为该pid的数据中children中去
*/
private function gettreeitems($items)
{
$tree = array();
foreach ($items as $item) {
if(isset($items[$item['pid']])){
$items[$item['pid']]['children'][] = &$items[$item['mid']];
}else{
$tree[] = &$items[$item['mid']];
}
}
return $tree;
}
// 递归无限级菜单,使其转换为二级菜单
/*
** 创建一个空数组 当传进的数组 没有children下标这一数据 存进res空数组中
** 当某个数据有children下标时 将下标中里的数据存进 tem新的数组中
** 销毁下标后的数据存进res空数组中 tem中的数组在检测是否有children
** 有的话按157 158行文字处理 没有的话按156行文字处理 然后返回res数组
*/
private function formatMenus($items,&$res = array()){
foreach($items as $item){
if(!isset($item['children'])){
$res[] = $item;
}else{
$tem = $item['children'];
unset($item['children']);
$res[] = $item;
$this->formatMenus($tem,$res);
}
}
return $res;
}
}
树状处理
//树状处理 需要指针 转换成无限级菜单
private function gettreeitems($items)
{
$tree = array();
foreach ($items as $item) {
if(isset($items[$item['pid']])){
$items[$item['pid']]['children'][] = &$items[$item['mid']];
}else{
$tree[] = &$items[$item['mid']];
}
}
return $tree;
}
递归无限级菜单,转换为二级菜单
// 递归无限级菜单,使其转换为二级菜单
private function formatMenus($items,&$res = array()){
foreach($items as $item){
if(!isset($item['children'])){
$res[] = $item;
}else{
$tem = $item['children'];
unset($item['children']);
$res[] = $item;
$this->formatMenus($tem,$res);
}
}
return $res;
}