我對(duì)權(quán)限控制系統(tǒng)的看法
發(fā)表時(shí)間:2023-08-02 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]請(qǐng)大家給個(gè)思路! ---- 刁饞# 我曾經(jīng)做了一個(gè)權(quán)限控制系統(tǒng),由于需要修改,而我沒(méi)有找到有效的解決方法,# 請(qǐng)大家給出出主意,給個(gè)大體思路,謝謝!要求如下:# 1.每個(gè)父親節(jié)點(diǎn)下邊有多個(gè)孩子# 2...
請(qǐng)大家給個(gè)思路! ---- 刁饞
# 我曾經(jīng)做了一個(gè)權(quán)限控制系統(tǒng),由于需要修改,而我沒(méi)有找到有效的解決方法,
# 請(qǐng)大家給出出主意,給個(gè)大體思路,謝謝!要求如下:
# 1.每個(gè)父親節(jié)點(diǎn)下邊有多個(gè)孩子
# 2.每個(gè)孩子可能有一個(gè)父親,還可能有多個(gè)父親(多個(gè)父親的級(jí)別可能不同,也
# 就是有交叉現(xiàn)象)
# 3.每個(gè)父親可能管理相同的孩子或者不同的孩子
# 4.每個(gè)父親登陸的時(shí)候,只能看到自己的孩子(如果管理的孩子不同,則登陸的
# 父親只能看到自己下邊的孩子,如果相同,那么他們看到的孩子都一樣)
# 5.每個(gè)父親可以添加自己的父親(孩子?)
由問(wèn)題的提出,可得到如下樹(shù)狀結(jié)構(gòu)。關(guān)鍵在于如何保存這個(gè)樹(shù)和怎樣檢索。
--0--000 (虛擬的根)
+-------------------+---------------+
--1--001 002 003
+--+--+ +----+----+ +--+--+
--2-- 003 004 004006007 007 008
+--+--+ +--+--+
--3-- 007003 008 001 002
+----+----+
--4-- 005007006
其中004登錄后,應(yīng)看到(1,001)-[2,004]-(3,007)和(1,002)-[2,004]-(3,003)-(4,007)等
而不應(yīng)看到(1,003)-(2,007)。
即所有用戶在登錄后向下搜索孩子,可能在多個(gè)分支上進(jìn)行。
設(shè)有兩張表
表一保存所有成員的信息(以下簡(jiǎn)稱U),主鍵id_u
表二為成員間的關(guān)系(以下簡(jiǎn)稱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 保存級(jí)別, next 保存下級(jí)的id, previons 保存上級(jí)的id, right 保存右鄰的id
關(guān)于具體的數(shù)據(jù)組織視算法而定。
數(shù)的遍歷算法,是很經(jīng)典的了!
建議用數(shù)組計(jì)算,即一次性讀入到數(shù)組,效率可能高一點(diǎn)
測(cè)試?yán),previons項(xiàng)未用
<?
$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]);
}
}
}
?>