Home > Backend Development > PHP Tutorial > 我对权限控制系统的看法_PHP

我对权限控制系统的看法_PHP

WBOY
Release: 2016-06-01 12:36:02
Original
824 people have browsed it

请大家给个思路! ---- 刁馋

# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,
# 请大家给出出主意,给个大体思路,谢谢!要求如下:
# 1.每个父亲节点下边有多个孩子
# 2.每个孩子可能有一个父亲,还可能有多个父亲(多个父亲的级别可能不同,也
#   就是有交叉现象)
# 3.每个父亲可能管理相同的孩子或者不同的孩子
# 4.每个父亲登陆的时候,只能看到自己的孩子(如果管理的孩子不同,则登陆的
#   父亲只能看到自己下边的孩子,如果相同,那么他们看到的孩子都一样)
# 5.每个父亲可以添加自己的父亲(孩子?)

由问题的提出,可得到如下树状结构。关键在于如何保存这个树和怎样检索。

--0--                          000 (虚拟的根)
                                |
            +-------------------+---------------+
--1--      001                 002             003
            |                   |               |
         +--+--+           +----+----+       +--+--+
--2--   003   004         004  006  007     007   008
               |           |                 |
               |        +--+--+           +--+--+
--3--         007      003   008         001   002
                        |
                   +----+----+
--4--             005  007  006

其中004登录后,应看到(1,001)-[2,004]-(3,007)和(1,002)-[2,004]-(3,003)-(4,007)等
而不应看到(1,003)-(2,007)。
即所有用户在登录后向下搜索孩子,可能在多个分支上进行。

设有两张表
表一保存所有成员的信息(以下简称U),主键id_u
表二为成员间的关系(以下简称K),主键id
U
  id_u | name | ...
-------+------+----
  001  |      |    
  002  |      |    
  003  |      |    
  004  |      |    
  005  |      |    
  006  |      |    
  ...  |      |    

K
id  | id_u | level | next | previons | right
-----+------+-------+------+----------+-------
  1  |  001 |     1 |    2 |          |    5
  2  |  003 |     2 |      |        1 |    3
  3  |  004 |     2 |    4 |        1 |
  4  |  007 |     3 |      |        3 |
  5  |  002 |     1 |    6 |          |   14
  6  |  004 |     2 |    7 |        5 |   12
  7  |  003 |     3 |    9 |        6 |    8
  8  |  008 |     3 |      |        6 |
  9  |  005 |     4 |      |        7 |   10
10  |  006 |     4 |      |        7 |   11
11  |  007 |     4 |      |        7 |
12  |  006 |     2 |      |        5 |   13
13  |  007 |     2 |      |        5 |
14  |  003 |     1 |   15 |          |
15  |  007 |     2 |   16 |       14 |   18
16  |  001 |     3 |      |       15 |   17
17  |  002 |     3 |      |       15 |
18  |  008 |     2 |      |       14 |
    
其中:level 保存级别, next 保存下级的id, previons 保存上级的id, right 保存右邻的id
关于具体的数据组织视算法而定。
数的遍历算法,是很经典的了!
建议用数组计算,即一次性读入到数组,效率可能高一点

测试例,previons项未用

$ar = array(
0,
array(id=> 1,id_u=>"001", level=>1, next=> 2, previons=> 0, right=> 5),
array(id=> 2,id_u=>"003", level=>2, next=> 0, previons=> 1, right=> 3),
array(id=> 3,id_u=>"004", level=>2, next=> 4, previons=> 1, right=> 0),
array(id=> 4,id_u=>"007", level=>3, next=> 0, previons=> 3, right=> 0),
array(id=> 5,id_u=>"002", level=>1, next=> 6, previons=> 0, right=>14),
array(id=> 6,id_u=>"004", level=>2, next=> 7, previons=> 5, right=>12),
array(id=> 7,id_u=>"003", level=>3, next=> 9, previons=> 6, right=> 8),
array(id=> 8,id_u=>"008", level=>3, next=> 0, previons=> 6, right=> 0),
array(id=> 9,id_u=>"005", level=>4, next=> 0, previons=> 7, right=>10),
array(id=>10,id_u=>"006", level=>4, next=> 0, previons=> 7, right=>11),
array(id=>11,id_u=>"007", level=>4, next=> 0, previons=> 7, right=> 0),
array(id=>12,id_u=>"006", level=>2, next=> 0, previons=> 5, right=>13),
array(id=>13,id_u=>"007", level=>2, next=> 0, previons=> 5, right=> 0),
array(id=>14,id_u=>"003", level=>1, next=>15, previons=> 0, right=> 0),
array(id=>15,id_u=>"007", level=>2, next=>16, previons=>14, right=>18),
array(id=>16,id_u=>"001", level=>3, next=> 0, previons=>15, right=>17),
array(id=>17,id_u=>"002", level=>3, next=> 0, previons=>15, right=> 0),
array(id=>18,id_u=>"008", level=>2, next=> 0, previons=>14, right=> 0)
);
//print_r($ar);

function tree($ar,$i,$key,$level) {
  if($ar[$i][id_u] == $key || $ar[$i][level] > $level) {
    for($j=0;$j       echo "    ";
    echo "+--";
    echo $ar[$i][id_u]."
";
    if($ar[$i][next] > 0)
      tree($ar,$ar[$i][next],$key,$level);
  }
  if($ar[$i][right] > 0)
    tree($ar,$ar[$i][right],$key,$level);
}

$keys = array("001","002","003","004","005","006","007","008");

while(list($key,$value) = each($keys)) {
  echo "===> $value
";
  for($i=1;$i     if($ar[$i][id_u] == $value) {
      echo "    [$value]
";
      tree($ar,$i,$value,$ar[$i][level]);
    }
  }
}
?>

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template