• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 3年前 (2022-01-25) 17次浏览 已收录 0个评论

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

# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,
# 请大家给出出主意,给个大体思路,谢谢!要求如下:
# 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),
6本文来源gao@dai!ma.com搞$代^码!网7

搞gaodaima代码

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<$ar[$i][level]-1;$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<=count($ar);$i++) {
if($ar[$i][id_u] == $value) {
echo ” [$value]
“;
tree($ar,$i,$value,$ar[$i][level]);
}
}
}
?>


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:我对权限控制系统的看法_PHP

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址