前面已经做了数据库的操作。
http://www.fungj.com/information/rbac-thinkphp323-foundation-to-establish-database-permissions.html
然后就是要根据不同的权限,对后台的相关菜单进行显示。
这个操作主要有以下几个步骤:
1、用户登录系统显示权限信息 $_SESSION['userid']
2、根据session信息获得角色role_id信息
3、根据角色id信息获得权限列表ids信息
4、根据权限ids信息查询具体权限信息进而显示
我学习的后台是个品字形框架,所以我的菜单是在左边。顺带就有个方法和视图了
left和left.html
先看方法left
//后台左边页面
public function left() {
$sql = "select * from manager where mg_id=".$_SESSION['userid'];
$minfo = M()->query($sql);
$role_id = $minfo[0]['mg_role_id'];
//根据角色信息获得权限ids的信息
$sql = "select * from role where role_id=".$role_id;
$rinfo = M()->query($sql);
$auth_ids = $rinfo[0]['role_auth_ids'];
//根据$auth_ids查询全部拥有的权限信息
//① 获得顶级权限
$sql = "select * from auth where auth_level=0 ";
//如果是admin管理员要现实全部权限
if($_SESSION['userid'] != 1){
$sql .= " and auth_id in ($auth_ids)";
}
$p_info = M()->query($sql);
//② 获得次顶级权限
$sql = "select * from auth where auth_level=1";
//如果是admin管理员要现实全部权限
if($_SESSION['userid'] != 1){
$sql .= " and auth_id in ($auth_ids)";
}
$s_info = M()->query($sql);
//输出模板
$this -> assign('pauth_info',$p_info);
$this -> assign('sauth_info',$s_info);
$this -> display();
}
其实代码还是很好看的,就是根据SESSION里面的用户ID来一层一层的获取相关信息,到最后得到auth_ids。
但最复杂的应该是判断是否是管理员权限了,特别是.= 来连接上面的SQL语句。
但这个判断里面最崩溃的还是模板部分,TP的模板标签简直是无敌了。
先看代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8" />
<link href="__PUBLIC__/Admin/css/admin.css" type="text/css" rel="stylesheet" />
<script language=javascript>
function expand(el)
{
childobj = document.getElementById("child" + el);
if (childobj.style.display == 'none')
{
childobj.style.display = 'block';
}
else
{
childobj.style.display = 'none';
}
return;
}
</script>
</head>
<body>
<table height="100%" cellspacing=0 cellpadding=0 width=170
background=__PUBLIC__/Admin/img/menu_bg.jpg border=0>
<tr>
<td valign=top align=middle>
<table cellspacing=0 cellpadding=0 width="100%" border=0>
<tr>
<td height=10></td>
</tr>
</table>
<foreach name="pauth_info" item="v">
<table cellspacing=0 cellpadding=0 width=150 border=0>
<tr height=22>
<td style="padding-left: 30px" background=__PUBLIC__/Admin/img/menu_bt.jpg>
<a
class=menuparent onclick=expand({$v.auth_id})
href="javascript:void(0);">{$v.auth_name}</a>
</td>
</tr>
<tr height=4>
<td></td>
</tr>
</table>
<table id=child{$v.auth_id} style="display: none" cellspacing=0 cellpadding=0
width=150 border=0>
<foreach name="sauth_info" item="sinfo">
<eq name="sinfo.auth_pid" value="$v.auth_id">
<tr height=20>
<td align=middle width=30>
<img height=9
src="__PUBLIC__/Admin/img/menu_icon.gif" width=9></td>
<td>
<a class=menuchild
href="__MODULE__/{$sinfo.auth_c}/{$sinfo.auth_a}"
target="right">{$sinfo.auth_name}</a>
</td>
</tr>
</eq>
</foreach>
</table>
</foreach>
</td>
<td width=1 bgcolor=#d1e6f7></td>
</tr>
</table>
</body>
</html>
这里也可以记下相关模板里面的常量,废话不说。
这里是foreach套用foreach,然后在第二个foreach里再用if判断。突然发现TP模板标签的套用居然会出问题。
特别是第二个foreach应该是用IF标签,但IF标签用了就出错,百度了下,TP可以用EQ标签代替IF标签。
注意,name="sinfo.auth_pid" value="$v.auth_id",比较的变量里面可以直接写foreach的内容,但比较直,特别是上一个foreach里的话,就要带个$。
可能这个问题,其他高手会觉得很简单,但为这个问题我被折磨了两天才搞出来。