php之 人員的權限管理(RBAC)

1.想好權限管理的做用?php

2.有什麼權限內容?html

3.既然有權限管理那麼就會有管理員?ajax

4.登陸後每一個人員的界面會是不同的?sql

1、想好這個權限是什麼?數據庫

就作一個就像是vip的功能,普通用戶和vip用戶的功能是不同的,先來考慮一下數據庫怎麼設計數組

確定要有用戶表、還有用戶所用的角色、而後就是權限功能表;但是在這裏面有關聯也就 是會另外有兩張相互關聯的表,這樣也就是5張表session

在數據庫中建好這五張表:fetch

(1)用戶表、角色表、功能表ui

     

(2)主表中的外鍵關係得兩個表:用戶與角色表、角色與功能表this

    

2、建好表以後就是開始寫代碼了,首先是管理員的頁面

注意:這裏只寫了用戶和角色的管理界面,沒有寫角色和功能的管理頁面,可是它們都是同樣的,會其一就會其二了

能夠選擇用戶,而後根據選擇複選框來給他們添加說是刪除一些功能

(1)先能夠顯示出想要的效果:好比用戶的選擇能夠用下拉列表

<div>請選擇用戶:
  <select id="uid">   //給這個起個名字,能夠在下面的操做中加事件
  //這裏是遍歷數據庫中的用戶表
  </select> </div>

看下效果:

下拉列表中尚未值,是由於尚未進行數據庫操做

(2)連接數據庫操做,遍歷出數據庫中的用戶(遍歷數據庫前面的隨筆中已經寫過不少遍了)

//只是遍歷數據庫就能夠,不用傳值的話,就不用寫傳值數據和傳值方式了
$.ajax({ url:"admain_cl.php", //用戶的處理界面 dataType:"TEXT", //返回的數據類型 success: function(data){
         //處理頁面執行成功後將要執行的代碼處 } }) });

(3)用戶的處理界面

<?php
include("DBDA.class.php");  //調用封裝好的數據庫類
$db = new DBDA();  //造新對象

$sql = "select * from users";  //查詢語句,查詢用戶表中的全部信息
echo $db->StrQuery($sql);  //執行封裝類中的字符串轉換方法
?>

封裝類中的字符串轉化方法:

<?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)處理頁面寫好了以後,就能夠寫主頁面中,執行處理頁面成功後的代碼了

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放這個複選框

<div>請選擇角色:
    <div id="juese">
         //遍歷放值的地方   
    </div>
</div>

而後就是遍歷數據庫了

$.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中
	}
});

角色的處理頁面的代碼

<?php
include("DBDA.class.php");  //調用封裝好的數據庫類
$db = new DBDA();  //造新對象

$sql = "select * from juese";  //查詢語句,查詢角色表中的全部信息
echo $db->StrQuery($sql);  //執行封裝類中的字符串轉換方法
?>

寫完以後就是運行查看下有沒有錯誤

(6)修改完成後就是要保存了,在頁面中寫一個保存按鈕

<input type="button" value="保存" id="save" />  //給這個按鈕起個名字,由於要有點擊事件

至此,頁面的顯示均可以完成了

 

(7)這樣,在就是怎麼讓數據庫中用戶本有的角色顯示出來,那就是要用到下拉列表和複選框的值了

能夠把他寫入方法裏,而後調用這個方法

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)項值的處理頁面

<?php
include("DBDA.class.php");  //調用封裝好的數據庫類
$db = new DBDA();  //造新對象

$uid = $_POST["uid"];  //傳過來的值
$sql = "select jueseid from userinjuese where userid='{$uid}'";  //傳過來的值和表中的用戶值相等
echo $db->StrQuery($sql);  //執行封裝類中的字符串轉換方法
?>

這樣,每一個用戶的默認角色就選中了

(9)最後就是保存修改後的值了

能夠直接用所有刪除在從新寫入的方法來進行值的選擇;對保存按鈕添加單擊事件

$("#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("保存成功!");  //保存成功後,彈出框
	  }
	}
    });		
})        

保存的處理頁面

<?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.進行修改以後的這個用戶,單擊保存後彈出保存成功對話框

   

2、管理員頁面弄好以後,就是登錄頁面了,用戶的登陸頁面很簡單,很少說了,直接上代碼

(1)登陸的基本顯示:都是些基本語句

<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進行登陸吧

$("#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)看下處理頁面的編寫

<?php
session_start();  //開啓session
include("DBDA.class.php");  //調用封裝的類
$db = new DBDA();  //造新對象
//傳過來的值
$uid = $_POST["uid"];
$pwd = $_POST["pwd"];
//查詢語句 $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"; } ?>

最後,咱們看下最後結果,登陸成功就會進入主頁,登陸失敗會提示錯誤

   

3、登陸成功的主頁面:每一個用戶的主頁面應該是不同的

(1)既而後session,那就先將session開啓

<?php
session_start(); //開啓session	
if(empty($_SESSION["uid"]))  //判斷session是否爲空
{
  header("location:login.php"); //空的話就返回登陸頁面			
}
else
{
  echo $_SESSION["uid"];  //不然就輸出用戶名
}
?>

(2)我這裏是寫了個表用來裝遍歷出來的功能表:能夠給這個表加點樣式

<table id="t" width="7%"  cellpadding="0" cellspacing="0" border="1">
        	
</table>

(3)ajax傳值了:下面的語句表明什麼意思上面用的時候都將了不少遍了,就不重複說明了

$.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);  //將值寫入表中				
  }
})

主頁面的處理頁面

<?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)看下這個用戶的管理界面是否是有這些功能

    

下面是數據庫中的該用戶的信息表:用戶和角色的表、角色表、功能表、角色和功能表

        

不難看出,該用戶的登陸成功後的主頁面顯示的是對的

不一樣用戶登陸的頁面是不同的

 

至此,這我的員權限的管理就結束了~~~

相關文章
相關標籤/搜索