控制人员权限用的最多的应该是OA办公自动化系统和像ERP,CRM,CMS这样的管理系统,就是通过控制用户的权限来控制其拥有的角色和功能,比如管理员可以拥有所有权限和功能,前台只能拥有登记和通报信息等。
一般标准的权限管理都会有5张数据表来控制,形成一个W型的连接关系,如下
看看表的结构
1.用户表 2.用户角色对应表 3.角色表 4.角色功能对应表 5.功能表
首先我们来做一个管理员的页面,这个页面能显示所有用户,并且能看到他们对应的角色,这里我们还能修改他们的角色,先看看效果
一步步来,先写出来选择用户的功能,当然,显示的用户都是从用户表里加载过来的
1 请选择用户: 2 <select id="sel"> 3 <option>请选择</option> 4 <?php 5 require "../DataBase.class.php"; 6 $db=new DataBase(); 7 $sql="select * from users"; 8 $arr=$db->Query($sql); 9 foreach($arr as $v){ 10 echo "<option value='{$v[0]}'>{$v[2]}</option>"; 11 12 } 13 ?> 14 </select>
再把角色的复选框写出来 ,附带那个保存按钮也写出来吧
请选择角色: <?php $sql2="select * from juese"; $arr2=$db->Query($sql2); foreach($arr2 as $k){ echo "<input type='checkbox' class='ck' value='{$k[0]}'>$k[1]"; } ?> <div><input type="button" id="save" value="保存"/></div>
界面写完了,下面实现功能代码
功能1.选择相应用户,默认显示他对应的角色(复选框的默认选中)
用jquery的函数实现(页面开头先引入Jquery)
1 $("#sel").change(function (){ 2 var uid=$("#sel").val(); //取到下拉选择的用户 3 $.ajax({ //调用ajax 4 url:"chuli.php", 5 data:{uid:uid}, 6 type:"POST", 7 dataType:"TEXT", 8 success: function(data){ 9 var js=data.trim().split("|"); //返回的字符串只有行,进行拆分和去空格,然后得到的是角色数组 10 var ck=$(".ck"); //获取所有复选框的值,交给了一个ck数组 11 ck.prop("checked",false); //先清空上次选择用户时留下的复选内容 12 for(var i=0;i<ck.length;i++) //遍历判断 13 { 14 var v=ck.eq(i).val(); //v代表的是每个复选框的值 15 if(js.indexOf(v)>=0){ //判断一下,返回的角色表中的数据是否存在,用的 indexOf方法,如果不存在则返回-1 16 ck.eq(i).prop("checked",true); //将数据库存在的角色对应的属性设置为选中 17 18 } 19 } 20 21 22 23 } 24 }) 25 26 });
下面是处理页面chuli.php
1 <?php 2 $uid=$_POST["uid"]; 3 require "../DataBase.class.php"; 4 $db=new DataBase(); 5 $sql="select jueseid from userinjuese where userid='{$uid}'"; 6 echo $db->StrQuery($sql); 7 8 9 10 ?>
如果看不明白的话,看看这个返回字符串的类怎么写的
1 <?php 2 class DataBase 3 { 4 public $host="localhost"; 5 public $uid = "root"; 6 public $pwd = ""; 7 public $dbname = "mydb"; 8 9 //成员方法 10 public function Query($sql,$type=1) 11 { 12 $db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname); 13 $r = $db->query($sql); 14 15 if($type==1) 16 { 17 return $r->fetch_all(); 18 } 19 else 20 { 21 return $r; 22 } 23 } 24 25 //返回字符串的方法 26 public function StrQuery($sql,$type=1) 27 { 28 $db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname); 29 $r = $db->query($sql); 30 31 if($type==1) 32 { 33 $attr = $r->fetch_all(); 34 $str = ""; 35 foreach($attr as $v) 36 { 37 $str .= implode("^",$v)."|"; 38 } 39 40 return substr($str,0,strlen($str)-1); 41 } 42 43 else 44 { 45 return $r; 46 } 47 } 48 49 //返回JSON 50 public function jsonquery($sql,$type=1) 51 { 52 $db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname); 53 $r = $db->query($sql); 54 55 if($type==1) 56 { 57 return json_encode($r->fetch_all(MYSQLI_ASSOC)); 58 } 59 else 60 { 61 return $r; 62 } 63 } 64 }
功能2.修改用户对应的角色,并且保存
1 $("#save").click(function (){ //'保存'按钮的点击事件 2 var uid=$("#sel").val(); //获取下拉选择的用户 3 var str=""; 4 var ck=$(".ck"); //获取所有复选框的值,放到ck数组 5 for(var i=0;i<ck.length;i++) 6 { 7 if(ck.eq(i).prop("checked")) //判断,如果复选框的值为选中 8 { 9 str+=ck.eq(i).val()+","; //将选中的复选框值用“,”拼接起来交给str 10 11 } 12 13 14 15 } 16 str=str.substr(0,str.length-1); //截取一下str,因为最后尾部会多余一个符号 17 $.ajax({ 18 url:"save.php", 19 data:{uid:uid,js:str}, //将用户和拼接好的已选择复选内容交给处理页面 20 dataType:"TEXT", 21 type:"POST", 22 success: function(data){ 23 24 alert("保存成功") 25 26 } 27 28 29 30 31 32 }) 33 34 35 36 37 })
处理页面
1 <?php 2 $uid=$_POST["uid"]; //获取到了传递的用户 3 $js=$_POST["js"]; //获取到了传递过来的已选择的复选框内容 4 require "../DataBase.class.php"; 5 $db=new DataBase(); 6 $sql="delete from userinjuese where userid='{$uid}'"; //先把数据库中原来用户的角色清空,不然修改起来会麻烦 7 $db->Query($sql,0); 8 $vv=explode(",",$js); //将复选框内容拆分,因为传来的是一个,隔开的长字符串,得到的vv是一个数组 9 foreach($vv as $v){ //遍历这个数组 10 $sql2="insert into userinjuese values('','{$uid}','{$v}')"; //依次写入数据库 11 $db->Query($sql2,0); 12 13 } 14 15 16 ?>
功能完成了。结束