我对权限控制系统的看法_PHP
作者:三十二号t娶我吧 | 来源:互联网 | 2017-05-14 02:18
请大家给个思路!----刁馋#我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,#请大家给出出主意,给个大体思路,谢谢!要求如下:#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]);
}
}
}
?>
推荐阅读
Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ...
[详细]
蜡笔小新 2024-11-13 09:49:14
本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ...
[详细]
蜡笔小新 2024-11-13 09:14:02
本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ...
[详细]
蜡笔小新 2024-11-12 18:13:16
基于二次预测的H.264分数像素运动估计算法在这项研究中,提出了一种基于二次预测的H.264分数像素运动估计(ME)算法。这里ÿ ...
[详细]
蜡笔小新 2024-11-12 17:53:48
在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ...
[详细]
蜡笔小新 2024-11-12 16:40:04
本文探讨了数据标注在自动驾驶领域的具体应用,包括多种标注类型及其重要性。 ...
[详细]
蜡笔小新 2024-11-12 15:39:05
数字中心的数据应用分析团队在“厦门大数据安全开放创新应用大赛·交通专题”中荣获算法赛一等奖。 ...
[详细]
蜡笔小新 2024-11-12 15:05:13
本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ...
[详细]
蜡笔小新 2024-11-12 15:02:28
重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ...
[详细]
蜡笔小新 2024-11-12 14:57:05
字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ...
[详细]
蜡笔小新 2024-11-12 14:07:25
本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ...
[详细]
蜡笔小新 2024-11-12 13:13:21
探讨如何在Go语言中高效地处理大规模切片的去重操作,特别是针对百万级数据量的场景。 ...
[详细]
蜡笔小新 2024-11-12 12:56:52
本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ...
[详细]
蜡笔小新 2024-11-12 12:37:08
本文介绍了家用计算机和计算器的基本功能和使用方法,通过具体的例子展示了如何利用计算器进行高效的数学计算。文章还探讨了计算工具的发展历史及其未来趋势。 ...
[详细]
蜡笔小新 2024-11-12 12:06:16
本文由 CM 创始人 Steve Klabnik 发表在其个人博客上,详细介绍了他在 GitHub 上为 Rails 开源项目所做的贡献和经验,特别强调了如何有效管理和筛选项目中的问题。 ...
[详细]
蜡笔小新 2024-11-12 11:29:56