• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 我對權限控制系統的看法

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    # 我曾經做了一個權限控制系統,由于需要修改,而我沒有找到有效的解決方法, # 請大家給出出主意,給個大體思路,謝謝!要求如下: # 1.每個父親節點下邊有多個孩子 # 2.每個孩子可能有一個父親,還可能有多個父親(多個父親的級別可能不同,也 #就是有交叉
    # 我曾經做了一個權限控制系統,由于需要修改,而我沒有找到有效的解決方法,
    # 請大家給出出主意,給個大體思路,謝謝!要求如下:
    # 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]);
        }
      }
    }
    ?>

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>