PHP:【商城后台管理系统】部署角色管理,角色添加,菜单权限,删除角色功能

35 篇文章 1 订阅
31 篇文章 1 订阅
本文介绍了使用ThinkPHP6.0框架实现商城后台的角色管理功能,包括角色列表、添加、编辑和删除。重点讲解了如何处理菜单权限,特别是如何构建无限级菜单并转化为二级菜单以供视图渲染。前端采用Layui框架,提供了编辑和删除角色的交互功能。代码示例详细展示了PHP和HTML实现过程。
摘要由CSDN通过智能技术生成

PHP:【商城后台管理系统】部署角色管理,角色添加,菜单权限,删除角色功能
一.角色管理界面
①首页

②角色添加

③角色编辑

④角色删除

二.部署流程

  • 部署流程

  • 后端采用thinkphp6.0框架,角色管理看似简单,但是在菜单权限这一块是很难得,为什么难呢?因为要设计菜单无限级构造树,还要将无限极菜单构造树递归遍历成二级菜单,这样才好将菜单渲染到视图层,在代码块注释中将有这些问题的解决方案。

  • 前端采用Layui框架

    HTML 代码块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>管理员账号列表</title>
    <link rel="stylesheet" href="/static/layui-v2.6.8/layui/css/layui.css" />
    <script src="/static/layui-v2.6.8/layui/layui.js"></script>
    
</head>
<body style="padding: 10px;min-width:737px">
    <div class="layui-item" >
        <span style="color: 777;font-size:20px;height:30px;line-height:30px">首页/</span>
        <span style="color: ccc">角色列表</span>
        <button class="layui-btn layui-btn-sm" style="float:right;margin:5px" onclick="add()">添加</button>
    </div>
    <table class="layui-table" >
        <thead>
            <tr>
                <th>ID</th>
                <th>角色编号</th>
                <th>角色名称</th>
                <th>编辑</th>
            </tr>
        </thead>
        <tbody>
        {foreach $data as $v}
            <tr>
               
                <td>{$v['id']}</td>
                <td>{$v['gid']}</td>
                <td>{$v['title']}</td>
                <td>
                    <button class="layui-btn layui-btn-sm " onclick="edit({$v['id']})">编辑</button>
                    <button class="layui-btn layui-btn-sm layui-btn-danger" onclick="dle({$v['id']})">删除</button>
                </td>
               
            </tr>
        {/foreach}
        </tbody>
    </table>
</body>
<script>
            $ = layui.jquery;
            //编辑角色
            function edit(id) {
                
                layer.open({
                type:2,
                title: '编辑角色',
                shadeClose: true,
                shade: 0.8,
                area: ['500px', '500px'],
                content: '/admin/Group/edit?id='+id
                }); 
            }
            //删除
            function dle(id) {
                layer.confirm('确定删除吗?', {
                btn: ['确定','取消'],
                },
                function(){
                  let date = {};
                  $.post('/admin/Group/dle?id='+id,date,function(res){
                    if (res.id == 1) {
                        layer.alert(res.msg,{icon:1});
                        setTimeout(() => {
                            window.location.reload();
                        }, 1000);
                    }else{
                        layer.alert(res.msg,{icon:2});
                    }
                  },'json')
                });
            }
            //添加角色
            function add()
            {
                 
                 layer.open({
                type:2,
                title: '添加角色',
                shadeClose: true,
                shade: 0.8,
                area: ['500px', '500px'],
                content: '/admin/Group/add'
                }); 
            }
</script>
</html>
PHP 代码块
<?php
namespace app\admin\controller;
use app\admin\controller\Base;
use think\facade\Request;
use think\facade\Db;
use think\facade\View;
use think\facade\Session;
/**
 * 角色管理
 */
class Group extends Base
{
    //角色列表
    public function index()
    {   
        //角色渲染
        $data['group'] = Db::table('admin_group')->select()->toArray();

        View::assign([
            'data' => $data['group']
        ]);
        return View('/group/index');
    }

    //角色添加
    public function add()
    {   
        if (Request::isPost()) {
            $data['gid'] = Request::post('gid');
            $data['title'] = Request::post('title');
            $data['rights'] = array_keys(Request::post('rights'));
            $data['rights'] = json_encode($data['rights']);

            if (empty($data['gid'])) {
                exit(json_encode(['id' => 0 ,'msg' => '角色编号不能为空']));
            }
            if (empty($data['title'])) {
                exit(json_encode(['id' => 0 ,'msg' => '角色名称不能为空']));
            }

            $insert = Db::table('admin_group')->insert($data);
            if (!empty($insert)) {
                echo json_encode(['id' => 1 ,'msg' => '角色添加成功']);
            }else {
                echo json_encode(['id' => 0 ,'msg' => '角色添加失败']);
            }
        }else {
            //角色权限菜单视图层渲染
            $tmp_menu_list = Db::table('admin_menu')->where('status',0)->select()->toArray();
            
            //将角色权限菜单数组下标换成角色的mid
            $menu_list = $this->SetKey($tmp_menu_list,array());
           
            //构造树菜单(无限级)
            $menus = $this->buildMenuTree($menu_list);
           
            //递归 构造树菜单(无限级)变成二级菜单
            $result = $this->SetMenu($menus,array());
           
            

            View::assign([
                'data' => $result,
            ]);
            return View('/group/add');
        }
        
    }

    //角色编辑
    public function edit()
    {   
        if (Request::isPost()) {
            $id = Request::post('id');
            $data['title'] = Request::post('title');
            $data['rights'] = array_keys(Request::post('rights'));
            $data['rights'] = json_encode($data['rights']);

            if (empty($data['title'])) {
                exit(json_encode(['id' => 0 ,'msg' => '角色名称不能为空']));
            }

            $update = Db::table('admin_group')->where('id',$id)->update($data);
            if (!empty($update)) {
                echo json_encode(['id' => 1,'msg' => '保存成功']);
            }else {
                echo json_encode(['id' => 0,'msg' => '保存失败']);
            }
        }else {
            $id = Request::get('id');

            $data['group'] = Db::table('admin_group')->where('id',$id)->find();
            $data['group']['rights'] = json_decode($data['group']['rights'],true);
           
            //角色权限菜单视图层渲染
            $tmp_menu_list = Db::table('admin_menu')->where('status',0)->select()->toArray();
            
            //将角色权限菜单数组下标换成角色的mid
            $menu_list = $this->SetKey($tmp_menu_list,array());
           
            //构造树菜单(无限级)
            $menus = $this->buildMenuTree($menu_list);
           
            //递归 构造树菜单(无限级)变成二级菜单
            $result = $this->SetMenu($menus,array());

            View::assign([
                'result' => $result,
                'id' => $id,
                'group' => $data['group'],
                'rights' =>  $data['group']['rights']
            ]);
            return View('/group/edit');
        }
        
    }

    //角色删除
    public function dle()
    {
        $id =  Request::param("id");

        if (!empty($id)) {
            $delete = Db::table("admin_group")->where('id',$id)->delete();
        }

        if (!empty($delete)) {
           echo json_encode(['id' => 1 ,'msg'=>'删除成功']);
        }else {
            echo json_encode(['id' => 0 ,'msg'=>'删除失败']);
        }
    }
    
    //将数组下标换成角色的mid
    private function SetKey($item,$array)
    {
        foreach ($item as $v) {
            $array[$v['mid']] = $v;
        }
        return $array;
    }

    //遍历递归menu菜单
    private function SetMenu($item,$array)
    {
        foreach ($item as $value) {
            //如果构造树菜单的子菜单有children 则进行递归 如果没有则定位空数组
            $value['children'] = isset($value['children']) ?$this->formatMenus($value['children']) : [];
            //剩余则赋值给$result
            $array[] = $value;
        }

        return $array;
    }

    //构造树菜单(无限级)
    private function buildMenuTree($items)
    {
        $tree = [];

        foreach ($items as $item) {
            //如果items 的 下标 是$item pid 则 创建新的children子数组存放 $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=[])
    {
        foreach ($items as $item) {
            if (!isset($item['children'])) {
               //如果没有children 则存放在 $res
               $res[] = $item;
            }else {
                //如果有children 则进行递归处理
                $temp = $item['children'];
                //释放$item['children']
                unset($item['children']);
                $res[] = $item;
                $this->formatMenus($temp,$res);
            }
        }

        return $res;
    }
}
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值