查询admin_groups理所有的角色信息,发送给前端。
//角色列表public function index() {//20 查询角色表(admin_group),全部数据$data['roles'] = $this->db->table('admin_groups')->lists();$this->assign('data', $data);return $this->fetch();}
前端页面通过传过来的数据,循环出角色列表,有编辑、添加,删除按钮,用js设置相应的方法add,delete。这里和之前一样,编辑和添加用一个方法,用传入的gid值来区分,add方法将传入的gid,转给Roles类下的add方法,跳转到roles/add.php。delete是将gid通过post转给Roles下的delete方法处理。```html
<!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>
<style type="text/css">
.header span{background: #009688;margin-left: 30px;padding: 10px;color:#ffffff;}
.header div{border-bottom: solid 2px #009688;margin-top: 8px;}
</style>
</head>
<body style="padding: 10px;">
<div class="header">
<span>角色列表</span>
<button class="layui-btn layui-btn-xs" style="float: right;" onclick="add()">添加</button>
<div></div>
</div>
<table class="layui-table">
<thead>
<tr>
<th>ID</th>
<td>角色名称</td>
<td>操作</td>
</tr>
</thead>
<tbody>
{volist name=”data.roles” id=”vo”}
<tr>
<td>{$vo.gid}</td>
<td>{$vo.title}</td>
<td>
<button class="layui-btn layui-btn-warm layui-btn-xs" onclick="add({$vo.gid})">编辑</button>
<button class="layui-btn layui-btn-danger layui-btn-xs" onclick="del({$vo.gid})">删除</button>
</td>
</tr>
{/volist}
</tbody>
</table>
</body>
</html>
<script type="text/javascript">
layui.use([‘layer’],function(){
$ = layui.jquery;
layer = layui.layer;
});
// 添加
function add(gid){
layer.open({
type: 2,
title: gid>0?’编辑角色’:’添加角色’,
shade: 0.3,
area: [‘580px’, ‘520px’],
content: ‘/index.php/admins/Roles/add?gid=’+gid
});
}
// 删除
function del(gid){
layer.confirm(‘确定要删除吗?’, {
icon:3,
btn: [‘确定’,’取消’]
}, function(){
$.post(‘/index.php/admins/roles/delete’,{‘gid’:gid},function(res){
if(res.code>0){
layer.alert(res.msg,{icon:2});
}else{
layer.msg(res.msg);
setTimeout(function(){window.location.reload();},1000);
}
},’json’);
});
}
</script>###### 增加Roles下的add方法,新建roles/add.php。
add方法通过get过来的gid判断,有值为修改,0是新增;通过gid查询出符合条件的单条记录,然后通过判断该条记录是否为空且是否存在,且记录里面的权限转换为数组后是否存在,都为真的话,将该条数据传给前端;
查询出状态正常的所有菜单列表(也就是权限值对应的菜单),整理菜单列表,就是让二级菜单移动他所属的一级菜单下的children数组。对每个一级菜单下面的所有菜单进行递归,让二级菜单及其子菜单都成为children里面的子项且都平级。返回到add.php前端php
//编辑添加角色
public function add() {
//21 通过get传值 获取到gid 也就是角色id
//21 没有传值就是新增 有值就是修改
$gid = (int)input(‘get.gid’);
//21 查询admin_groups 找到gid对应的那条信息
$role = $this->db->table(‘admin_groups’)->where(array(‘gid’=>$gid))->item();
//21 查询的单条信息$role存在且里面有权限$role[‘rights’]且将权限的内容解析为数组且有值
$role && $role[‘rights’] && $role[‘rights’]=json_decode($role[‘rights’]);
//21 把查询出的单条记录传给前端
$this->assign(‘role’, $role);
//21 查询菜单表显示状态正常的所有信息
$menu_list = $this->db->table(‘admin_menus’)->where(array(‘status’=>0))->cates(‘mid’);
//21 整理菜单列表
$menus = $this->gettreeitems($menu_list);
// print_r($menus);
//21 空数组用来装整理好的菜单
$results = [];
foreach ($menus as $value) {
// 21,判断菜单是否有权限,有权限给值,没权限给false
// 21,尽量把一些逻辑性的代码,在php里处理好。前端页面,最后只用作展示数据
$value[‘children’] = isset($value[‘children’]) ? $this->formatMenus($value[‘children’]) : false;
$results[] = $value;
}
// print_r($results);
$this->assign(‘menus’,$results);
return $this->fetch();
}
// 递归处理菜单
// 22,为什么要使用递归,不使用两次循环。 因为递归可以处理,多维循环。
// 22,比如6维数组, 那你要循环6次(要写6次foreach),递归就可以解决代码多的问题。
private function formatMenus($items,&$res = array()){
// 22,处理菜单方法,接收2个变量,一个是数组(是权限这个字段,rights),第二个默认返回值
// 22,& 接收的值$res,有变化,传过来的值,也会跟着改变。
// 22,循环权限字段(rights) 值: [1,4,5,6,2] 整合单条菜单,形成二维数组
foreach($items as $item){
// 22,如果children没有的话,我们直接把数组 赋值给$res
// 22,children 是子菜单,如果子菜单有,重新执行本方法,就是递归。
if(!isset($item[‘children’])){
$res[] = $item;
}else{
// 22,如果children有值,把数组赋值给$tem,然后在重新执行 本方法
$tem = $item[‘children’];
// 22,unset函数 是删除数据。 $item[‘children’]是数组。
// 22,为什么要删除children,因为当children有值得时,要把它删除,把剩下的数据,复制给$res 变量。 如果不删除,会进行死循环。 因为不删除$item[‘children’],它会一直判断$item[‘children’]里面有值,一直递归下去,无限递归,导致电脑奔溃。
unset($item[‘children’]);
$res[] = $item;
// 22,回调本方法,就是自己。
$this->formatMenus($tem,$res);
}
}
return $res;
}
//整理菜单
private function gettreeitems($items) {
//初始化$tree 作为整理好的菜单容齐
$tree = array();
foreach ($items as $item) {
//如果二级数组里的pid值作为下标的,有值,那么他必定是二级菜单
//那么就让二级菜单所属的一级菜单自定义下标children 然后将二级菜单的信息移动过来
if (isset($items[$item[‘pid’]])) {
//这里用引用符号&就是后面的值变化前面也变,
//意思就是将二级菜单整个移动到所属的一级菜单以前的结构就变了
$items[$item[‘pid’]][‘children’][] = &$items[$item[‘mid’]];
} else {
//把最终的一级菜单包括下面的二级菜单全部组装
$tree[] = &$items[$item[‘mid’]];
}
}
return $tree;
}add前端,把传过来的数据展示出来,循环出1级菜单,把当前角色有的权限搭上对号,循环出二级及以下菜单,把角色对应个的权限对应打上对号。保存按钮调用js中save方法,把表单中所有的信息post到Roles下的save方法。html
<!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="{$role.gid}">
<div class="layui-form-item">
<label class="layui-form-label">角色名称</label>
<div class="layui-input-block">
<input type="text" class="layui-input" name="title" value="{$role.title}">
</div>
</div>
<div class="layui-form-itme"><label class="layui-form-label">权限菜单</label>{volist name="menus" id="vo"}<hr><div class="layui-input-block"><!-- in_array 查询值是否存在这个数组里 --><input type="checkbox" name="menu[{$vo.mid}]" lay-skin="primary" title="{$vo.title}" {:isset($role['rights']) && $role['rights'] && in_array($vo.mid,$role['rights'])?'checked':''}><hr>{volist name="vo.children" id="cvo"}<input type="checkbox" name="menu[{$cvo.mid}]" lay-skin="primary" title="{$cvo.title}" {:isset($role['rights']) && $role['rights'] && in_array($cvo.mid,$role['rights'])?'checked':''}>{/volist}</div>{/volist}</div>
</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('/index.php/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>
###### 新建Roles下的savesave方法储存post过来的gid,title,menu/a,对title判空,然后如果menu有数据,就把menu中的数组的key存到data['right']。接这对gid进行判断,存在的话就是修改执行修改操作,否则就是添加,执行添加操作,最后数据库操作执行成功输出成功的json数据。```php//保存菜单public function save() {//23 保存post过来的gid$gid = (int)input('post.gid');//23 保存post过来的title$data['title'] = trim(input('post.title'));//23 保存post过来的menu 强制数组$menus = input('post.menu/a');//23 角色名称判空(权限可以为空 名称不能)if (!$data['title']) {exit(json_encode(array('code'=>1, 'msg'=>'角色名称不能为空')));}//23 如果权限不为空,把权限的下标给到$data['rights']$menus && $data['rights'] = json_encode(array_keys($menus));//23 如果有gid那么就是修改 如果不是就是插入if ($gid) {$this->db->table('admin_groups')->where(array('gid'=>$gid))->update($data);} else {//插入$this->db->table('admin_groups')->insert($data);}exit(json_encode(array('code'=>0, 'msg'=>'保存成功')));}
将传过来的gid为条件,找到admin_groups中的该条记录,进行删除操作,返回数据库操作成功与否的json。
//删除操作public function delete() {//接收gid$gid = (int)input('post.gid');//执行删除操作$res = $this->db->table('admin_groups')->where(array('gid'=>$gid))->delete();//根据结果输出给前端if ($res) {exit(json_encode(array('code'=>0, 'msg'=>'删除成功')));} else {exit(json_encode(array('code'=>1, 'msg'=>'删除失败')));}}
index方法查询出config表中的所有记录,如果存在记录,那么就把记录里面的value值json接续成数组,然后传给前端,前端循环展示出来。前端中用save保存数据传给Config里新建的save方法
public function index(){//24 查询配置表config 获得所有数据$site = $this->db->table('config')->lists();//如果有值就把每条记录理的values值json化if ($site) {foreach ($site as &$v) {$v['values'] = json_decode($v['values']);}}$this->assign('site', $site);return $this->fetch();}
<!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><style type="text/css">.header span{background: #009688;margin-left: 30px;padding: 10px;color:#ffffff;}.header div{border-bottom: solid 2px #009688;margin-top: 8px;}.header button{float: right;margin-top: -5px;}</style></head><body style="padding: 10px;"><div class="header"><span>网站设置</span><div></div></div><form class="layui-form" style="margin-top: 10px;">{volist name="site" id="site_v"}<div class="layui-form-item"><label class="layui-form-label">{$site_v.names}</label><div class="layui-input-inline"><input type="text" class="layui-input" name="{$site_v.yingwen}" value="{$site_v.values}"></div></div>{/volist}</form><div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" onclick="save()">提交</button></div></div></body></html><script type="text/javascript">layui.use(['layer'],function(){$ = layui.jquery;layer = layui.layer;});function save(){var site = $.trim($('input[name="site"]').val());if(site==''){layer.msg('网站名称不能为空',{'icon':2});return;}$.post('/index.php/admins/config/save',$('form').serialize(),function(res){if(res.code>0){layer.msg(res.msg,{'icon':2});}else{layer.msg(res.msg,{'icon':1});setTimeout(function(){window.location.reload();},1000);}},'json');}</script>
在save方法中循环post过来的所有信息,把信息的值json化然后,在config表中进行修改,输出数据库成功的json化数据
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号