根据用户职级关系展示数据如何设计更合理?

概述

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

职级

  • A 品牌品牌经理

    • A店店长

      • 销售A

      • 销售B

    • B店店长

      • 销售A

      • ...

  • B 品牌品牌经理

    • A店店长

      • 销售A

      • 销售B

    • ...

      • ...

分析

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

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

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

  • 多品牌、多店面

问题

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

阅读 3.2k
4 个回答

一般都用parent_id

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

权限管理 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);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏