动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   PHP → 阅读文章

 我对权限控制系统的看法

作者来源: 
阅读 数 397 人次 , 2006-3-29 4:10:00 


# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,
# 请大家给出出主意,给个大体思路,谢谢!要求如下:
# 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<$ar[$i][level]-1;$j++)
echo " ";
echo "+--";
echo $ar[$i][id_u]."<br>";
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<br>";
for($i=1;$i<=count($ar);$i++) {
if($ar[$i][id_u] == $value) {
echo " [$value]<br>";
tree($ar,$i,$value,$ar[$i][level]);
}
}
}
?>

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:判断在线用户的方法
· 下一篇:一个访问ACCESS的类
· php编写大型网站问题集
· 解决部分环境不能操作系统对话框的问题
· 用PHP发送MIME邮件(四)
· PHP中的类
· 截取指定长度的文字(包含对汉字的处理)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077