<!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('請?zhí)顚懡巧Q',{'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數(shù)據(jù)
//邏輯與 判斷兩者是否存在 條件成立 將字符串轉換成數(shù)組
$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);
//創(chuàng)建一個空數(shù)組
$temp = array();
foreach($menus as $value){
//當數(shù)據(jù)中有children時,進行遞歸處理,轉換成二級菜單
$value['children'] = isset($value['children'])?$this->formatMenus($value['children']):false;
//將轉換的新數(shù)據(jù)賦值給空數(shù)組
$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'=>'保存成功')));
}
//樹狀處理
/*
** 創(chuàng)建新的數(shù)組 傳進的數(shù)據(jù)進行遍歷 該數(shù)據(jù)下標已進行處理,與mid一致 mid與pid進行父子關系綁定
** 當父級pid為0時,為最高級;
** 當遍歷到某條數(shù)據(jù)pid不為0時,則在該下標為pid這條數(shù)據(jù)中 增加一個下標children
** 并將這條數(shù)據(jù) 添加進下標為該pid的數(shù)據(jù)中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;
}
// 遞歸無限級菜單,使其轉換為二級菜單
/*
** 創(chuàng)建一個空數(shù)組 當傳進的數(shù)組 沒有children下標這一數(shù)據(jù) 存進res空數(shù)組中
** 當某個數(shù)據(jù)有children下標時 將下標中里的數(shù)據(jù)存進 tem新的數(shù)組中
** 銷毀下標后的數(shù)據(jù)存進res空數(shù)組中 tem中的數(shù)組在檢測是否有children
** 有的話按157 158行文字處理 沒有的話按156行文字處理 然后返回res數(shù)組
*/
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;
}
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號