php 权限 管理
权限的思考:
https://www.jianshu.com/p/cf9077a7d38a
权限例子,用户 角色 功能 用户角色关联表 角色功能关联表
http://www.cnblogs.com/nuanai/p/6293344.html
1.想好权限管理的作用?
2.有什么权限内容?
3.既然有权限管理那么就会有管理员?
4.登录后每个人员的界面会是不一样的?
一、想好这个权限是什么?
就做一个就像是vip的功能,普通用户和vip用户的功能是不一样的,先来考虑一下数据库怎么设计
肯定要有用户表、还有用户所用的角色、然后就是权限功能表;可是在这里面有关联也就 是会另外有两张相互关联的表,这样也就是5张表
在数据库中建好这五张表:
(1)用户表、角色表、功能表

(2)主表中的外键关系得两个表:用户与角色表、角色与功能表

二、建好表之后就是开始写代码了,首先是管理员的页面
注意:这里只写了用户和角色的管理界面,没有写角色和功能的管理页面,但是它们都是一样的,会其一就会其二了
可以选择用户,然后根据选择复选框来给他们添加说是删除一些功能
(1)先可以显示出想要的效果:比如用户的选择可以用下拉列表
|
1
2
3
|
<div>请选择用户: <select id="uid"> //给这个起个名字,可以在下面的操作中加事件<br> //这里是遍历数据库中的用户表<br> </select></div> |
看下效果:

下拉列表中还没有值,是因为还没有进行数据库操作
(2)链接数据库操作,遍历出数据库中的用户(遍历数据库前面的随笔中已经写过很多遍了)
|
1
2
3
4
5
6
7
|
//只是遍历数据库就可以,不用传值的话,就不用写传值数据和传值方式了<br>$.ajax({ url:"admain_cl.php", //用户的处理界面 dataType:"TEXT", //返回的数据类型 success: function(data){<br> //处理页面执行成功后将要执行的代码处 } })}); |
(3)用户的处理界面
|
1
2
3
4
5
6
7
|
<?phpinclude("DBDA.class.php"); //调用封装好的数据库类$db = new DBDA(); //造新对象$sql = "select * from users"; //查询语句,查询用户表中的所有信息echo $db->StrQuery($sql); //执行封装类中的字符串转换方法?> |
封装类中的字符串转化方法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?phpclass DBDA{ public $host="localhost"; //使用的什么连接,这里是本地连接方式 public $uid="root"; //数据库用户 public $password="123"; //用户的密码 public $dbname="test1"; //使用的数据库名 //返回字符串的方法 public function StrQuery($sql,$type=1) { $db = new MySQLi($this->host,$this->uid,$this->password,$this->dbname); $r = $db->query($sql); //执行查询语句 if($type==1) { $attr = $r->fetch_all(); $str = ""; foreach($attr as $v) { $str .= implode("^",$v)."|"; //拼接数组为字符串 } return substr($str,0,strlen($str)-1); //截取字符串:最后的拼接符不显示 } else { return $r; }}?> |
(4)处理页面写好了之后,就可以写主页面中,执行处理页面成功后的代码了
|
1
2
3
4
5
6
7
8
9
10
|
success: function(data){ var hang = data.split("|"); //分割行 var str = ""; for(var i=0;i<hang.length;i++) //循环 { var lie = hang[i].split("^"); //分割列 str +="<option value='"+lie[0]+"'>"+lie[2]+"</option>"; //拼接下拉列表项:想要显示的是用户名,所以表中索引是2代表了name,给这个项的值是代号,下面将会用到 } $("#uid").html(str); //将值写入下拉列表中} |
经过这4步后看下结果:数据库中用户表中的数据就可以遍历出来了

(5)用户写好之后,就是角色了,可以使用复选框的方式显示,这里还是可以用ajax,和上面一样的方法,不多说直接上代码
还是先要写个div放这个复选框
|
1
2
3
4
5
|
<div>请选择角色: <div id="juese"> //遍历放值的地方 </div></div> |
然后就是遍历数据库了
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$.ajax({ url:"admain_cl1.php", //功能的处理页面 dataType:"TEXT", //返回的数据类型 success: function(d){ var hang = d.split("|"); //拆分行 var str = ""; for(var i=0;i<hang.length;i++) { var lie = hang[i].split("^"); //拆分列 str+="<input class='ck' type='checkbox' value='"+lie[0]+"' />"+lie[1]; //显示的复选框,索引1就是数据库中的name列 } $("#juese").html(str); //将值写入div中 }}); |
角色的处理页面的代码
|
1
2
3
4
5
6
7
|
<?phpinclude("DBDA.class.php"); //调用封装好的数据库类$db = new DBDA(); //造新对象$sql = "select * from juese"; //查询语句,查询角色表中的所有信息echo $db->StrQuery($sql); //执行封装类中的字符串转换方法?> |
写完之后就是运行查看下有没有错误

(6)修改完成后就是要保存了,在页面中写一个保存按钮
|
1
|
<input type="button" value="保存" id="save" /> //给这个按钮起个名字,因为要有点击事件 |
至此,页面的显示都可以完成了

(7)这样,在就是怎么让数据库中用户本有的角色显示出来,那就是要用到下拉列表和复选框的值了
可以把他写入方法里,然后调用这个方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
function Xuan(){ var uid = $("#uid").val(); //找到下拉类表的值 $.ajax({ url:"admain_cl2.php", //项的处理页面 data:{uid:uid}, type:"POST", dataType:"TEXT", success: function(b){ var hang = b.split("|"); //分割行 var ck = $(".ck"); //找到复选项的值 ck.prop("checked",false); //清理选中 for(var i=0;i<ck.length;i++) { var zhi = ck.eq(i).val(); //取出选项的值 if(hang.indexOf(zhi)>=0) { ck.eq(i).prop("checked",true); //是的话就让这一项的值选中 } } } })} |
(8)项值的处理页面
|
1
2
3
4
5
6
7
8
|
<?phpinclude("DBDA.class.php"); //调用封装好的数据库类$db = new DBDA(); //造新对象$uid = $_POST["uid"]; //传过来的值$sql = "select jueseid from userinjuese where userid='{$uid}'"; //传过来的值和表中的用户值相等echo $db->StrQuery($sql); //执行封装类中的字符串转换方法?> |
这样,每个用户的默认角色就选中了

(9)最后就是保存修改后的值了
可以直接用全部删除在重新写入的方法来进行值的选择;对保存按钮添加单击事件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
$("#save").click(function(){ var uid = $("#uid").val(); //找到用户的值 var ck = $(".ck"); //选项的值 var str = ""; for(var i=0;i<ck.length;i++) { if(ck.eq(i).prop("checked")) //选项的选中状态 { str = str+ck.eq(i).val()+"|"; } } str = str.substr(0,str.length-1); //截取字符串 $.ajax({ url:"admain_cl3.php", //保存的处理页面 data:{uid:uid,js:str}, //将用户和项的值传过去 type:"POST", //传值方式 dataType:"TEXT", success: function(data){ if(data.trim()=="OK") { alert("保存成功!"); //保存成功后,弹出框 } } }); }) |
保存的处理页面
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?phpinclude("DBDA.class.php"); //调用的封装类$db = new DBDA(); //造新对象//传过来的用户和选项的值$uid = $_POST["uid"];$js = $_POST["js"];$sdelete = "delete from userinjuese where userid='{$uid}'"; //全部删除将用户代号和用户相等的$db->Query($sdelete,0); //执行语句$attr = explode("|",$js); foreach($attr as $v){ $sql = "insert into userinjuese values('','{$uid}','{$v}')"; //修改表中的值 $db->Query($sql,0); //执行语句}echo "OK"; |
这个管理员的页面到这也就结束了,整体的看下结果:
1.默认还没有进行修改的这个用户

2.进行修改之后的这个用户,单击保存后弹出保存成功对话框

二、管理员页面弄好之后,就是登陆页面了,用户的登录页面很简单,不多说了,直接上代码
(1)登录的基本显示:都是些基本语句
|
1
2
3
4
|
<h1>用户登录</h1><div>账号:<input type="text" id="uid" /></div> <div>密码:<input type="password" id="pwd" /></div><div><input type="button" value="登录" id="btn" /></div> |
(2)这里登录,我们也用ajax进行登录吧
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$("#btn").click(function(){ //对登录按钮添加单击事件 var uid=$("#uid").val(); //获取用户的值 var pwd=$("#pwd").val(); //获取密码的值 $.ajax({ url:"logincl.php", //编写登录的处理页面 data:{uid:uid,pwd:pwd}, //将用户和密码传到处理页面 type:"POST", dataType:"text", success: function(data) { if(data.trim()=="OK") { window.location.href="main.php"; //处理页面执行成功后,跳转到主页面 } else { alert("用户名密码输入错误"); //否则就提示错误 } } }) }) |
(3)看下处理页面的编写
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?phpsession_start(); //开启sessioninclude("DBDA.class.php"); //调用封装的类$db = new DBDA(); //造新对象//传过来的值$uid = $_POST["uid"];$pwd = $_POST["pwd"];<br>//查询语句$sql = " select pwd from users where uid='{$uid}' and pwd='{$pwd}' ";//执行语句$attr = $db->Query($sql);if(!empty($pwd) && !empty($attr) && $attr[0][0]==$pwd){ $_SESSION["uid"] = $uid; //session接收用户值 echo "OK"; }else{ echo "ON"; }?> |
最后,我们看下最后结果,登录成功就会进入主页,登录失败会提示错误

三、登录成功的主页面:每个用户的主页面应该是不一样的
(1)既然后session,那就先将session开启
|
1
2
3
4
5
6
7
8
9
10
11
|
<?phpsession_start(); //开启session if(empty($_SESSION["uid"])) //判断session是否为空{ header("location:login.php"); //空的话就返回登录页面 }else{ echo $_SESSION["uid"]; //否则就输出用户名}?> |

(2)我这里是写了个表用来装遍历出来的功能表:可以给这个表加点样式
|
1
2
3
|
<table id="t" width="7%" cellpadding="0" cellspacing="0" border="1"> </table> |
(3)ajax传值了:下面的语句代表什么意思上面用的时候都将了很多遍了,就不重复说明了
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$.ajax({ url:"main_cl.php", //主页面的处理页面 dataType:"TEXT", success: function(data){ var hang = data.split("|"); var str = ""; for(var i=0;i<hang.length;i++) { var lie = hang[i].split("^"); str +="<tr><td>"+lie[0]+"</td></tr>"; //因为处理页面中只找了name,所以索引就是0 } $("#t").html(str); //将值写入表中 }}) |
主页面的处理页面
|
1
2
3
4
5
6
7
8
9
10
|
<?phpsession_start(); //开启session$uid = $_SESSION["uid"]; //接收session传过来的值include("DBDA.class.php");$db = new DBDA();//这个是用到的相关子查询方法$sql = "select name from rules where code in (select ruleid from juesewithrules where jueseid in (select code from juese where code in (select jueseid from userinjuese where userid='{$uid}')))";//执行语句echo $db->StrQuery($sql);?> |
最后就是可以登录显示不一样用户权限功能的页面了,看下整体结果:
(1)登录一个用户,进入主页

(2)看下这个用户的管理界面是不是有这些功能

下面是数据库中的该用户的信息表:用户和角色的表、角色表、功能表、角色和功能表

不难看出,该用户的登录成功后的主页面显示的是对的
不同用户登录的页面是不一样的

至此,这个人员权限的管理就结束了~~~
php 权限 管理的更多相关文章
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- SpringMVC+Shiro权限管理【转】
1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...
- Android6.0运行时权限管理
自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...
- Oracle 表空间和用户权限管理
一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...
- [Django]用户权限学习系列之权限管理界面实现
本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...
- [Django]用户权限学习系列之设计自有权限管理系统设计思路
若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...
- 我的MYSQL学习心得(十三) 权限管理
我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布
距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...
随机推荐
- java中Hashtable集合的常用方法
实现Map集合的方法这里就不在讲了 https://www.cnblogs.com/xiaostudy/p/9510763.html public Object clone() 返回Hashtable ...
- DevExpress组件之——TreeList组件
由于是第一次接触到第三方控件DevExpress中的TreeList,对其进行了进一步的研究,采用递归算法实现.做下自己熟悉第三方控件的整个过程,为和我一样处理于起步阶段的同仁们提供个参考,以下为最终 ...
- BZOJ3669/UOJ3 魔法森林(LCT)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- JNI_Z_01_获取Clazz
1. 为了能够在C/C++中使用Java类,jni.h头文件中专门定义了jclass类型来表示Java中的Class类(ZC: 就是Clazz) 2. 2.1.JNIEXPORT void JNICA ...
- java PreparedStatement和statement的区别
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.2.作为 St ...
- js 格式化时间日期函数小结3
function DateUtil(){}/***功能:格式化时间*示例:DateUtil.Format("yyyy/MM/dd","Thu Nov 9 20:30:37 ...
- spring3: schema的aop与Aspectj的aop的区别
schema的aop如下: 接口: package chapter6.service; public interface IHelloAroundService { public void sayAr ...
- 【OpenGL ES】关于VBO(Vertex Buffer Object)的一些坑——解析一些关于glBuffer的函数
最近在写毕设的时候用到OpenGL ES中的VBO,由于对一些接口用到的变量不了解被坑得很惨,在此记录一下防止以后再被坑. 本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cn ...
- iOS自动化探索(二)WDA API的使用
前面我们已经安装好了WebdriverAgent, 现在可以用Facebook官方提供的API来进行一些操作 WDA API官方页面: https://github.com/facebook/WebD ...
- ARM汇编指令集1
(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行. (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译 ...