我对权限控制系统的看法
作者:leban | 来源:互联网 | 2014-07-17 11:58
请大家给个思路!----刁馋#我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,#请大家给出出主意,给个大体思路,谢谢!要求如下:#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]."
";
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]);
}
}
}
?>
推荐阅读
-
本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ...
[详细]
蜡笔小新 2024-12-27 22:54:11
-
本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ...
[详细]
蜡笔小新 2024-12-27 21:29:35
-
-
题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ...
[详细]
蜡笔小新 2024-12-27 18:14:31
-
本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ...
[详细]
蜡笔小新 2024-12-27 14:45:30
-
探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ...
[详细]
蜡笔小新 2024-12-27 14:34:44
-
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
-
本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ...
[详细]
蜡笔小新 2024-12-27 13:49:45
-
本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ...
[详细]
蜡笔小新 2024-12-27 13:44:59
-
在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ...
[详细]
蜡笔小新 2024-12-27 12:39:06
-
在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ...
[详细]
蜡笔小新 2024-12-27 12:19:16
-
本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ...
[详细]
蜡笔小新 2024-12-27 12:03:44
-
本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ...
[详细]
蜡笔小新 2024-12-27 11:34:50
-
本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ...
[详细]
蜡笔小新 2024-12-27 10:18:13
-
本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ...
[详细]
蜡笔小新 2024-12-26 19:26:18
-
梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ...
[详细]
蜡笔小新 2024-12-26 18:23:11
-