权限的思考:

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
<?php
include("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
<?php
class 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
<?php
include("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
<?php
include("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
<?php
include("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
<?php
session_start();  //开启session
include("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
<?php
session_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
<?php
session_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 权限 管理的更多相关文章

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  3. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  4. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  5. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  6. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  7. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  8. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  9. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  10. 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

    距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...

随机推荐

  1. 通过代码来调用log4net写日志

    1.使用如下配置 http://www.cnblogs.com/chucklu/p/5404813.html 2.调用 string ConfigFile; private void LoadLogC ...

  2. 将 sql 数据库 编码 改成 Chinese_PRC_CS_AS

    use master go ) drop procedure [dbo].[p_killspid] GO create proc p_killspid ) --要关闭进程的数据库名 as ) ) de ...

  3. eclipse官网下载

    Provided by IBM Cloud Eclipse IDE for Java Developers http://eclipse.bluemix.net/packages/photon/dat ...

  4. Spring -- 如何为applicationContext.xml 添加 util 的 *.xsd文件

  5. 修改Tomcat默认端口号,避免与IDEA冲突

    修改Tomcat默认端口号,避免与IDEA冲突 APT安装默认位置如下 /var/lib/tomcat8/conf 修改server.xml中的8080端口为8088或其他. 重启服务,试试看效果. ...

  6. java加载jdbc驱动三种方式的比较

    一.引言 平时连接数据库的时候首先要加载jdbc驱动,这一步骤其实有三种方式,他们的区别?优劣? 二.快速了解三种加载方式 Class.forName(“com.mysql.jdbc.Driver”) ...

  7. Entity Framework 6 预热、启动优化

    虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...

  8. C# 集合类 Array,Arraylist,List,Hashtable,Dictionary...

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...

  9. CodeForces - 197D

    开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题 A题,判断能不能放第一个圆,能放的话,先手比赢 #include<map> #include<set> #inc ...

  10. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...