后台菜单和权限管理

2021年11月21日 阅读数:11
这篇文章主要向大家介绍后台菜单和权限管理,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

主要php文件:

1,admin/includes/inc_menu.php ECSHOP管理中心菜单数组--配置菜单组及URLphp

2,languages/zh_cn/admin/common.php ECSHOP管理中心共用语言文件--配置菜单显示名sql

3,admin/includes/inc_priv.php ECSHOP权限对照表--将菜单action与权限绑定  json

4,languages/zh_cn/admin/priv_action.php ECSHOP权限名称语言文件---配置权限显示的中文名数组

主要数据表:ecs_admin_actionide

 

这里用后台商品管理来讲明这几个配置文件:

权限:

1.ecs_admin_action 管理员权限表。权限以分组的形式存储,首先要添加一个权限管理的一级分组节点(此权限分组节点仅做为分组归类,没有实际权限控制做用),再添加所属的权限名。函数

配置摘要:测试

复制代码
+-----------+-----------+------------------+------------+
| action_id | parent_id | action_code      | relevance  |
+-----------+-----------+------------------+------------+
|         1 |         0 | goods            |            |
|        21 |         1 | goods_manage     |            |
|        22 |         1 | remove_back      |            |
|        23 |         1 | cat_manage       |            |
|        24 |         1 | cat_drop         | cat_manage |
|        25 |         1 | attr_manage      |            |
|        26 |         1 | brand_manage     |            |
|        27 |         1 | comment_priv     |            |
|        84 |         1 | tag_manage       |            |
|        70 |         1 | goods_type       |            |
|        94 |         1 | goods_auto       |            |
|       103 |         1 | virualcard       |            |
|       105 |         1 | picture_batch    |            |
|       106 |         1 | goods_export     |            |
|       107 |         1 | goods_batch      |            |
|       108 |         1 | gen_goods_script |            |
+-----------+-----------+------------------+------------+

#第一条goods就是下面权限的父权限
复制代码

 

2.priv_action.php 权限名称语言文件。设置权限的中文名称,通常用于在修改角色权限时显示中文权限名称。ui

配置摘要:加密

复制代码
/* 权限管理的一级分组 */
$_LANG['goods'] = '商品管理';

//商品管理部分的权限
$_LANG['goods_manage'] = '商品添加/编辑';
$_LANG['remove_back'] = '商品删除/恢复';
$_LANG['cat_manage'] = '分类添加/编辑';
$_LANG['cat_drop'] = '分类转移/删除';
$_LANG['attr_manage'] = '商品属性管理';
$_LANG['brand_manage'] = '商品品牌管理';
$_LANG['comment_priv'] = '用户评论管理';
$_LANG['goods_type'] = '商品类型';
$_LANG['tag_manage'] = '标签管理';
$_LANG['goods_auto'] = '商品自动上下架';
$_LANG['topic_manage'] = '专题管理';
$_LANG['virualcard'] = '虚拟卡管理';
$_LANG['picture_batch'] = '图片批量处理';
$_LANG['goods_export'] = '商品批量导出';
$_LANG['goods_batch'] = '商品批量上传/修改';
$_LANG['gen_goods_script'] = '生成商品代码';
$_LANG['suppliers_goods'] = '供货商商品管理';
复制代码

 

 

菜单:

3.inc_menu.php 管理中心菜单数组。显示在后台左侧的菜单项。以多维数组形式来表示菜单的分级,第一维便是顶级菜单。url

配置摘要:

复制代码
$modules['02_cat_and_goods']['01_goods_list']       = 'goods.php?act=list';         // 商品列表
$modules['02_cat_and_goods']['02_goods_add']        = 'goods.php?act=add';          // 添加商品
$modules['02_cat_and_goods']['03_category_list']    = 'category.php?act=list';
$modules['02_cat_and_goods']['05_comment_manage']   = 'comment_manage.php?act=list';
$modules['02_cat_and_goods']['06_goods_brand_list'] = 'brand.php?act=list';
$modules['02_cat_and_goods']['08_goods_type']       = 'goods_type.php?act=manage';
$modules['02_cat_and_goods']['11_goods_trash']      = 'goods.php?act=trash';        // 商品回收站
$modules['02_cat_and_goods']['12_batch_pic']        = 'picture_batch.php';
$modules['02_cat_and_goods']['13_batch_add']        = 'goods_batch.php?act=add';    // 商品批量上传
$modules['02_cat_and_goods']['14_goods_export']     = 'goods_export.php?act=goods_export';
$modules['02_cat_and_goods']['15_batch_edit']       = 'goods_batch.php?act=select'; // 商品批量修改
$modules['02_cat_and_goods']['16_goods_script']     = 'gen_goods_script.php?act=setup';
$modules['02_cat_and_goods']['17_tag_manage']       = 'tag_manage.php?act=list';
$modules['02_cat_and_goods']['50_virtual_card_list']   = 'goods.php?act=list&extension_code=virtual_card';
$modules['02_cat_and_goods']['51_virtual_card_add']    = 'goods.php?act=add&extension_code=virtual_card';
$modules['02_cat_and_goods']['52_virtual_card_change'] = 'virtual_card.php?act=change';
$modules['02_cat_and_goods']['goods_auto']             = 'goods_auto.php?act=list';
复制代码

 

4.common.php 管理中心共用语言文件。设置inc_menu中设置的菜单的中文名称,每一维都要设置名称。

配置摘要:

复制代码
/* 菜单分类部分 */
$_LANG['02_cat_and_goods'] = '商品管理';

/* 商品管理 */
$_LANG['01_goods_list'] = '商品列表';
$_LANG['02_goods_add'] = '添加新商品';
$_LANG['03_category_list'] = '商品分类';
$_LANG['04_category_add'] = '添加分类';
$_LANG['05_comment_manage'] = '用户评论';
$_LANG['06_goods_brand_list'] = '商品品牌';
$_LANG['07_brand_add'] = '添加品牌';
$_LANG['08_goods_type'] = '商品类型';
$_LANG['09_attribute_list'] = '商品属性';
$_LANG['10_attribute_add'] = '添加属性';
$_LANG['11_goods_trash'] = '商品回收站';
$_LANG['12_batch_pic'] = '图片批量处理';
$_LANG['13_batch_add'] = '商品批量上传';
$_LANG['15_batch_edit'] = '商品批量修改';
$_LANG['16_goods_script'] = '生成商品代码';
$_LANG['17_tag_manage'] = '标签管理';
$_LANG['18_product_list'] = '货品列表';
$_LANG['52_attribute_add'] = '编辑属性';
$_LANG['53_suppliers_goods'] = '供货商商品管理';

$_LANG['14_goods_export'] = '商品批量导出';

$_LANG['50_virtual_card_list'] = '虚拟商品列表';
$_LANG['51_virtual_card_add'] = '添加虚拟商品';
$_LANG['52_virtual_card_change'] = '更改加密串';
$_LANG['goods_auto'] = '商品自动上下架';
复制代码

 

 

 

将菜单连接的Action与权限关联:

5.inc_priv.php 权限对照表。一个菜单指向的Action页可能只使用一个权限,也可能使用多个权限,Action对应多个权限时,使用数组来表示。

如代号02_goods_add的商品添加Action只调用了goods_manage权限,所以配置为:$purview['02_goods_add'] = 'goods_manage';  而代号01_goods_list的商品列表页包含的操做多,所以调用多个权限:$purview['01_goods_list']= array('goods_manage', 'remove_back');

配置摘要:

复制代码
//商品管理权限
    $purview['01_goods_list']        = array('goods_manage', 'remove_back');
    $purview['02_goods_add']         = 'goods_manage';
    $purview['03_category_list']     = array('cat_manage', 'cat_drop');   //分类添加、分类转移和删除
    $purview['05_comment_manage']    = 'comment_priv';
    $purview['06_goods_brand_list']  = 'brand_manage';
    $purview['08_goods_type']        = 'attr_manage';   //商品属性
    $purview['11_goods_trash']       = array('goods_manage', 'remove_back');
    $purview['12_batch_pic']         = 'picture_batch';
    $purview['13_batch_add']         = 'goods_batch';
    $purview['14_goods_export']      = 'goods_export';
    $purview['15_batch_edit']        = 'goods_batch';
    $purview['16_goods_script']      = 'gen_goods_script';
    $purview['17_tag_manage']        = 'tag_manage';
    $purview['50_virtual_card_list'] = 'virualcard';
    $purview['51_virtual_card_add']  = 'virualcard';
    $purview['52_virtual_card_change'] = 'virualcard';
    $purview['goods_auto']           = 'goods_auto';
复制代码

 

 

在Action中判断管理员是否有改访问操做权限:

ec内置两个函数:

  1. admin_priv(权限名); 权限不经过时跳转的方式提示;
  2. check_authz_json(权限名);权限不经过时返回json提示数据,通常与make_json_result 或 make_json_error 配合返回数据/错误信息使用。

6.admin/goods.php 

代码摘要:

复制代码
/*------------------------------------------------------ */
//-- 商品列表,商品回收站
/*------------------------------------------------------ */

if ($_REQUEST['act'] == 'list' || $_REQUEST['act'] == 'trash')
{
    admin_priv('goods_manage');

........................................

/*------------------------------------------------------ */
//-- 修改商品货号
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'edit_goods_sn')
{
    check_authz_json('goods_manage');

    $goods_id = intval($_POST['id']);
    $goods_sn = json_str_iconv(trim($_POST['val']));

    /* 检查是否重复 */
    if (!$exc->is_only('goods_sn', $goods_sn, $goods_id))
    {
        make_json_error($_LANG['goods_sn_exists']);
    }
    $sql="SELECT goods_id FROM ". $ecs->table('products')."WHERE product_sn='$goods_sn'";
    if($db->getOne($sql))
    {
        make_json_error($_LANG['goods_sn_exists']);
    }
    if ($exc->edit("goods_sn = '$goods_sn', last_update=" .gmtime(), $goods_id))
    {
        clear_cache_files();
        make_json_result(stripslashes($goods_sn));
    }
}

......................
复制代码

 

 

 

经验分割线


 

【注意】

1,菜单组的权限控制不必定要与权限绑定,能够直接使用admin_priv(action_code)控制菜单指向的action的访问权限。

2,action_code就是权限名。

 

添加一个新后台菜单权限的流程:

1.在ecs_admin_action表中添加action信息;

action_id parent_id action_code
222 0 test_action
223 222 test_child

 

 

 

2.inc_menu.php中添加菜单action和url

#[菜单组名][自定义菜单的action名]=action的url
$modules
['17_action_test']['a_test_action'] = 'test_action.php?act=list'; $modules['17_action_test']['a_test_child'] = 'test_action.php?act=test_child';

3.在common.php中添加菜单中文名

#对应上述菜单的配置名
$_LANG
['17_action_test'] = '测试菜单';  #顶级菜单(菜单组名) $_LANG['a_test_action'] = '测试父权限 '; #子菜单 $_LANG['a_test_child'] = '测试子权限 ';

*此时刷新能够看到管理列表多出了测试菜单组。

4.在inc_priv.php新增对应 该action的权限对照名

#权限对照名=权限名(action_code),权限对照名要对应菜单action名
$purview
['a_test_action'] = 'test_action'; $purview['a_test_child'] = 'test_child';

5.在priv_action.php为action权限配置一个中文名。

#权限名(action_code)=权限中文名
$_LANG
['test_action'] = '测试父权限 '; $_LANG['test_child'] = '测试子权限 ';

 

*此时在角色管理能够看到多出了这两个权限中文名。

 

6.编辑新增admin/test_action.php,代码以下:

复制代码
 1 <?php
 2 
 3 /**
 4  * ECSHOP 权限管理测试页
 5  * $Author: GaZeon
 6 */
 7 define('IN_ECS', true);
 8 
 9 require(dirname(__FILE__) . '/includes/init.php');
10 
11 
12 if ($_REQUEST['act'] == 'list')
13 {
14     /* 检查权限 */
15     admin_priv('test_action');
16     
17     echo '访问权限经过,欢迎来到父权限测试';
18 }
19 else if ($_REQUEST['act'] == 'test_child')
20 {
21     /* 检查权限 */
22     admin_priv('test_child');
23     
24     echo '访问权限经过,欢迎来到子权限测试';
25 }
复制代码

 

主要php文件:

1,admin/includes/inc_menu.php ECSHOP管理中心菜单数组--配置菜单组及URL

2,languages/zh_cn/admin/common.php ECSHOP管理中心共用语言文件--配置菜单显示名

3,admin/includes/inc_priv.php ECSHOP权限对照表--将菜单action与权限绑定  

4,languages/zh_cn/admin/priv_action.php ECSHOP权限名称语言文件---配置权限显示的中文名

主要数据表:ecs_admin_action

 

这里用后台商品管理来讲明这几个配置文件:

权限:

1.ecs_admin_action 管理员权限表。权限以分组的形式存储,首先要添加一个权限管理的一级分组节点(此权限分组节点仅做为分组归类,没有实际权限控制做用),再添加所属的权限名。

配置摘要:

复制代码
+-----------+-----------+------------------+------------+
| action_id | parent_id | action_code      | relevance  |
+-----------+-----------+------------------+------------+
|         1 |         0 | goods            |            |
|        21 |         1 | goods_manage     |            |
|        22 |         1 | remove_back      |            |
|        23 |         1 | cat_manage       |            |
|        24 |         1 | cat_drop         | cat_manage |
|        25 |         1 | attr_manage      |            |
|        26 |         1 | brand_manage     |            |
|        27 |         1 | comment_priv     |            |
|        84 |         1 | tag_manage       |            |
|        70 |         1 | goods_type       |            |
|        94 |         1 | goods_auto       |            |
|       103 |         1 | virualcard       |            |
|       105 |         1 | picture_batch    |            |
|       106 |         1 | goods_export     |            |
|       107 |         1 | goods_batch      |            |
|       108 |         1 | gen_goods_script |            |
+-----------+-----------+------------------+------------+

#第一条goods就是下面权限的父权限
复制代码

 

2.priv_action.php 权限名称语言文件。设置权限的中文名称,通常用于在修改角色权限时显示中文权限名称。

配置摘要:

复制代码
/* 权限管理的一级分组 */
$_LANG['goods'] = '商品管理';

//商品管理部分的权限
$_LANG['goods_manage'] = '商品添加/编辑';
$_LANG['remove_back'] = '商品删除/恢复';
$_LANG['cat_manage'] = '分类添加/编辑';
$_LANG['cat_drop'] = '分类转移/删除';
$_LANG['attr_manage'] = '商品属性管理';
$_LANG['brand_manage'] = '商品品牌管理';
$_LANG['comment_priv'] = '用户评论管理';
$_LANG['goods_type'] = '商品类型';
$_LANG['tag_manage'] = '标签管理';
$_LANG['goods_auto'] = '商品自动上下架';
$_LANG['topic_manage'] = '专题管理';
$_LANG['virualcard'] = '虚拟卡管理';
$_LANG['picture_batch'] = '图片批量处理';
$_LANG['goods_export'] = '商品批量导出';
$_LANG['goods_batch'] = '商品批量上传/修改';
$_LANG['gen_goods_script'] = '生成商品代码';
$_LANG['suppliers_goods'] = '供货商商品管理';
复制代码

 

 

菜单:

3.inc_menu.php 管理中心菜单数组。显示在后台左侧的菜单项。以多维数组形式来表示菜单的分级,第一维便是顶级菜单。

配置摘要:

复制代码
$modules['02_cat_and_goods']['01_goods_list']       = 'goods.php?act=list';         // 商品列表
$modules['02_cat_and_goods']['02_goods_add']        = 'goods.php?act=add';          // 添加商品
$modules['02_cat_and_goods']['03_category_list']    = 'category.php?act=list';
$modules['02_cat_and_goods']['05_comment_manage']   = 'comment_manage.php?act=list';
$modules['02_cat_and_goods']['06_goods_brand_list'] = 'brand.php?act=list';
$modules['02_cat_and_goods']['08_goods_type']       = 'goods_type.php?act=manage';
$modules['02_cat_and_goods']['11_goods_trash']      = 'goods.php?act=trash';        // 商品回收站
$modules['02_cat_and_goods']['12_batch_pic']        = 'picture_batch.php';
$modules['02_cat_and_goods']['13_batch_add']        = 'goods_batch.php?act=add';    // 商品批量上传
$modules['02_cat_and_goods']['14_goods_export']     = 'goods_export.php?act=goods_export';
$modules['02_cat_and_goods']['15_batch_edit']       = 'goods_batch.php?act=select'; // 商品批量修改
$modules['02_cat_and_goods']['16_goods_script']     = 'gen_goods_script.php?act=setup';
$modules['02_cat_and_goods']['17_tag_manage']       = 'tag_manage.php?act=list';
$modules['02_cat_and_goods']['50_virtual_card_list']   = 'goods.php?act=list&extension_code=virtual_card';
$modules['02_cat_and_goods']['51_virtual_card_add']    = 'goods.php?act=add&extension_code=virtual_card';
$modules['02_cat_and_goods']['52_virtual_card_change'] = 'virtual_card.php?act=change';
$modules['02_cat_and_goods']['goods_auto']             = 'goods_auto.php?act=list';
复制代码

 

4.common.php 管理中心共用语言文件。设置inc_menu中设置的菜单的中文名称,每一维都要设置名称。

配置摘要:

复制代码
/* 菜单分类部分 */
$_LANG['02_cat_and_goods'] = '商品管理';

/* 商品管理 */
$_LANG['01_goods_list'] = '商品列表';
$_LANG['02_goods_add'] = '添加新商品';
$_LANG['03_category_list'] = '商品分类';
$_LANG['04_category_add'] = '添加分类';
$_LANG['05_comment_manage'] = '用户评论';
$_LANG['06_goods_brand_list'] = '商品品牌';
$_LANG['07_brand_add'] = '添加品牌';
$_LANG['08_goods_type'] = '商品类型';
$_LANG['09_attribute_list'] = '商品属性';
$_LANG['10_attribute_add'] = '添加属性';
$_LANG['11_goods_trash'] = '商品回收站';
$_LANG['12_batch_pic'] = '图片批量处理';
$_LANG['13_batch_add'] = '商品批量上传';
$_LANG['15_batch_edit'] = '商品批量修改';
$_LANG['16_goods_script'] = '生成商品代码';
$_LANG['17_tag_manage'] = '标签管理';
$_LANG['18_product_list'] = '货品列表';
$_LANG['52_attribute_add'] = '编辑属性';
$_LANG['53_suppliers_goods'] = '供货商商品管理';

$_LANG['14_goods_export'] = '商品批量导出';

$_LANG['50_virtual_card_list'] = '虚拟商品列表';
$_LANG['51_virtual_card_add'] = '添加虚拟商品';
$_LANG['52_virtual_card_change'] = '更改加密串';
$_LANG['goods_auto'] = '商品自动上下架';
复制代码

 

 

 

将菜单连接的Action与权限关联:

5.inc_priv.php 权限对照表。一个菜单指向的Action页可能只使用一个权限,也可能使用多个权限,Action对应多个权限时,使用数组来表示。

如代号02_goods_add的商品添加Action只调用了goods_manage权限,所以配置为:$purview['02_goods_add'] = 'goods_manage';  而代号01_goods_list的商品列表页包含的操做多,所以调用多个权限:$purview['01_goods_list']= array('goods_manage', 'remove_back');

配置摘要:

复制代码
//商品管理权限
    $purview['01_goods_list']        = array('goods_manage', 'remove_back');
    $purview['02_goods_add']         = 'goods_manage';
    $purview['03_category_list']     = array('cat_manage', 'cat_drop');   //分类添加、分类转移和删除
    $purview['05_comment_manage']    = 'comment_priv';
    $purview['06_goods_brand_list']  = 'brand_manage';
    $purview['08_goods_type']        = 'attr_manage';   //商品属性
    $purview['11_goods_trash']       = array('goods_manage', 'remove_back');
    $purview['12_batch_pic']         = 'picture_batch';
    $purview['13_batch_add']         = 'goods_batch';
    $purview['14_goods_export']      = 'goods_export';
    $purview['15_batch_edit']        = 'goods_batch';
    $purview['16_goods_script']      = 'gen_goods_script';
    $purview['17_tag_manage']        = 'tag_manage';
    $purview['50_virtual_card_list'] = 'virualcard';
    $purview['51_virtual_card_add']  = 'virualcard';
    $purview['52_virtual_card_change'] = 'virualcard';
    $purview['goods_auto']           = 'goods_auto';
复制代码

 

 

在Action中判断管理员是否有改访问操做权限:

ec内置两个函数:

  1. admin_priv(权限名); 权限不经过时跳转的方式提示;
  2. check_authz_json(权限名);权限不经过时返回json提示数据,通常与make_json_result 或 make_json_error 配合返回数据/错误信息使用。

6.admin/goods.php 

代码摘要:

复制代码
/*------------------------------------------------------ */
//-- 商品列表,商品回收站
/*------------------------------------------------------ */

if ($_REQUEST['act'] == 'list' || $_REQUEST['act'] == 'trash')
{
    admin_priv('goods_manage');

........................................

/*------------------------------------------------------ */
//-- 修改商品货号
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'edit_goods_sn')
{
    check_authz_json('goods_manage');

    $goods_id = intval($_POST['id']);
    $goods_sn = json_str_iconv(trim($_POST['val']));

    /* 检查是否重复 */
    if (!$exc->is_only('goods_sn', $goods_sn, $goods_id))
    {
        make_json_error($_LANG['goods_sn_exists']);
    }
    $sql="SELECT goods_id FROM ". $ecs->table('products')."WHERE product_sn='$goods_sn'";
    if($db->getOne($sql))
    {
        make_json_error($_LANG['goods_sn_exists']);
    }
    if ($exc->edit("goods_sn = '$goods_sn', last_update=" .gmtime(), $goods_id))
    {
        clear_cache_files();
        make_json_result(stripslashes($goods_sn));
    }
}

......................
复制代码

 

 

 

经验分割线


 

【注意】

1,菜单组的权限控制不必定要与权限绑定,能够直接使用admin_priv(action_code)控制菜单指向的action的访问权限。

2,action_code就是权限名。

 

添加一个新后台菜单权限的流程:

1.在ecs_admin_action表中添加action信息;

action_id parent_id action_code
222 0 test_action
223 222 test_child

 

 

 

2.inc_menu.php中添加菜单action和url

#[菜单组名][自定义菜单的action名]=action的url
$modules
['17_action_test']['a_test_action'] = 'test_action.php?act=list'; $modules['17_action_test']['a_test_child'] = 'test_action.php?act=test_child';

3.在common.php中添加菜单中文名

#对应上述菜单的配置名
$_LANG
['17_action_test'] = '测试菜单';  #顶级菜单(菜单组名) $_LANG['a_test_action'] = '测试父权限 '; #子菜单 $_LANG['a_test_child'] = '测试子权限 ';

*此时刷新能够看到管理列表多出了测试菜单组。

4.在inc_priv.php新增对应 该action的权限对照名

#权限对照名=权限名(action_code),权限对照名要对应菜单action名
$purview
['a_test_action'] = 'test_action'; $purview['a_test_child'] = 'test_child';

5.在priv_action.php为action权限配置一个中文名。

#权限名(action_code)=权限中文名
$_LANG
['test_action'] = '测试父权限 '; $_LANG['test_child'] = '测试子权限 ';

 

*此时在角色管理能够看到多出了这两个权限中文名。

 

6.编辑新增admin/test_action.php,代码以下:

复制代码
 1 <?php
 2 
 3 /**
 4  * ECSHOP 权限管理测试页
 5  * $Author: GaZeon
 6 */
 7 define('IN_ECS', true);
 8 
 9 require(dirname(__FILE__) . '/includes/init.php');
10 
11 
12 if ($_REQUEST['act'] == 'list')
13 {
14     /* 检查权限 */
15     admin_priv('test_action');
16     
17     echo '访问权限经过,欢迎来到父权限测试';
18 }
19 else if ($_REQUEST['act'] == 'test_child')
20 {
21     /* 检查权限 */
22     admin_priv('test_child');
23     
24     echo '访问权限经过,欢迎来到子权限测试';
25 }
复制代码