php - 根据用户职级关系展示数据如何设计更合理?
PHPz
PHPz 2017-04-11 10:19:34
[PHP讨论组]

概述

现有客户管理系统需要根据用户所在职级展示不同数据。

职级

  • A 品牌品牌经理

    • A店店长

      • 销售A

      • 销售B

    • B店店长

      • 销售A

      • ...

  • B 品牌品牌经理

    • A店店长

      • 销售A

      • 销售B

    • ...

      • ...

分析

  • 三个角色 品牌经理、店长、销售 都有权限访问一个 客户管理 节点;

  • 客户是由销售增加的,所以客户信息表里绑定 销售 的user_id

  • 当销售访问客户管理节点只能看自己的客户,而店长则看整个店面的,品牌经理则看整个品牌的

  • 多品牌、多店面

问题

如何更好的设计这个需求呢?求大神们指教。

PHPz
PHPz

学习是最好的投资!

全部回复(4)
阿神

一般都用parent_id

高洛峰

设计三张表,用户表,职级表,关联表即可。关联表存用户id和职位id的对应关系

PHP中文网

权限管理 RBAC

--管理员表
CREATE TABLE `mango16_manager` (
  `mg_id` int(11) NOT NULL AUTO_INCREMENT,
  `mg_name` varchar(32) NOT NULL,
  `mg_pwd` varchar(32) NOT NULL,
  `mg_time` int(10) unsigned NOT NULL COMMENT '时间',
  `mg_role_id` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '角色id',
  PRIMARY KEY (`mg_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
 
--权限表
CREATE TABLE `mango16_auth` (
  `auth_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `auth_name` varchar(20) NOT NULL COMMENT '权限名称',
  `auth_pid` smallint(6) unsigned NOT NULL COMMENT '父id',
  `auth_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
  `auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
  `auth_path` varchar(32) NOT NULL COMMENT '全路径',
  `auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '权限级别,从0开始计数',
  PRIMARY KEY (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
 
--角色表
CREATE TABLE `mango16_role` (
  `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(20) NOT NULL COMMENT '角色名称',
  `role_auth_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '权限ids,1,2,5',
  `role_auth_ac` text COMMENT '控制器-操作,控制器-操作,控制器-操作',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
 
 
角色:
    品牌经理
    店长
    销售
黄舟

数据库的表设计:

节点 或叫 权限名(节点编号, 节点名)
(1, '客户管理')

权限 或叫 权限值(权限编号, 权限值, 节点编号, 说明)
(1, '/admin/customer_list.php',    1, '访问客户管理节点')
(2, 'p_admin_customer_list_self',  1, '查看自己的客户信息')
(3, 'p_admin_customer_list_shop',  1, '查看店面的客户信息')
(4, 'p_admin_customer_list_brand', 1, '查看品牌的客户信息')
(5, 'p_admin_customer_list_all',   1, '查看所有的客户信息')

角色(角色编号, 角色值)
(1, '销售员')
(2, '店长')
(3, '品牌经理')

角色和权限关系表(角色编号, 权限编号)
(1, 1) 销售 能够 访问客户管理节点
(1, 2) 销售 能够 查看自己的客户信息
(2, 1) 店长 能够 访问客户管理节点
(2, 3) 店长 能够 查看店面的客户信息
(3, 1) 经理 能够 访问客户管理节点
(3, 4) 经理 能够 查看品牌的客户信息

客户表(客户编号, 客户所属销售员的编号)
销售员表(销售员编号, 销售员所属店面编号)
店长表(店长编号, 店长所属店面编号)
店面表(店面编号, 店面所属品牌编号)
品牌经理表(经理编号, 经理所属品牌编号)

权限判断和显示逻辑:

//$app['user']['rbac']['perm']保存的是当前用户具有的所有权限

//客户管理节点的链接
$app['customer_list_link'] = array();
if(in_array('p_admin_customer_list_self', $app['user']['rbac']['perm'], true)) 
    $app['customer_list_link'][] = '/admin/customer_list.php?section=self';
if(in_array('p_admin_customer_list_shop', $app['user']['rbac']['perm'], true)) 
    $app['customer_list_link'][] = '/admin/customer_list.php?section=shop';
if(in_array('p_admin_customer_list_brand', $app['user']['rbac']['perm'], true)) 
    $app['customer_list_link'][] = '/admin/customer_list.php?section=brand';

//客户管理节点的数据列表
$app['customer_list'] = array();
$app['customer_list'] = app_customer_list();
echo app_render('customer_list.php', 'admin');
function app_customer_list() {
    global $app;
    if(!isset($_GET['section'])) return false;
    switch($_GET['section']) {
        case 'self':
            if(!in_array('p_admin_customer_list_self', $app['user']['rbac']['perm'], true)) return false;
            //根据销售员编号查询客户信息
            $sql = 'select * from customer where 销售员编号 = 1024 order by id desc limit 10 offset 0';
            break;
        case 'shop':
            if(!in_array('p_admin_customer_list_shop', $app['user']['rbac']['perm'], true)) return false;
            //查出店长管理的店面下的所有销售员的编号
            $sql = 'select * from customer where 销售员编号 in (销售员编号集合) order by id desc limit 10 offset 0';
            break;
        case 'brand':
            if(!in_array('p_admin_customer_list_brand', $app['user']['rbac']['perm'], true)) return false;
            //查出经理管理的品牌的所有店面下的所有销售员的编号
            $sql = 'select * from customer where 销售员编号 in (销售员编号集合) order by id desc limit 10 offset 0';
            break;
        default:
            return false;
    }
    $db = app_db();
    return $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号