前面虽然省略了几个模块,今天要说的这个模块我觉得不能省略,角色功能授权是该系统的关键模块,这个模块难度也不大主要操作的表为m_menu,m_roleanth和m_role.简单来说就是给角色分配对应的一级菜单,例如系统管理员可以看到所有的一级菜单普通管理员只能看到部分的一级菜单。估计真正的开发比这个还要复杂一点但是原理应该是一样的,来看看我怎么弄的吧
1.点击角色列表里的授权进入角色授权页面
2.点击授权后的控制器处理代码
function assignModuleUI(){
$smart=new Smarty();
$smart->left_delimiter="<{";
$smart->right_delimiter="}>";
$menuManager=new TopMenuManagerImpl();
//查询未授权菜单
$allMenu=$menuManager->getNoPowerMenu($_GET["id"]);
//查询已授权的一级菜单
$powerMenu=$menuManager->getPowerMenu($_GET["id"]);
$smart->assign("noPowerMenu",$allMenu);
$smart->assign("powerMenu",$powerMenu);
$smart->assign("roleId",$_GET["id"]);
$smart->display("assignModule.tpl");
}
这里查询了2次数据库,因为授权也像修改操作一样可以进行多次授权所以要显示出已经授权的模块和未授权的模块,已授权的为选中状态
下面是getNoPowerMenu方法和getPowerMenu方法
//查询全部一级菜单用于功能授权
public function getNoPowerMenu($id){
$db=new DBUtil();
$conn=$db->getConnection();
$base=new BaseDBOperate();
$sql="select A.* from m_menu A where A.parentmenu='-1' and A.id not in(select menu from m_roleauth where role=$id)";
$arr=$base->query($sql, $conn);
$db->close($conn);
return $arr;
}
//查询角色已授权的模块
public function getPowerMenu($id){
$db=new DBUtil();
$conn=$db->getConnection();
$base=new BaseDBOperate();
$sql="select A.* from m_menu A,m_roleauth B,m_role C where B.menu=A.id and B.role=C.id and C.id=$id";
$arr=$base->query($sql, $conn);
$db->close($conn);
return $arr;
}
这个参数ID就是角色表对应角色的主键id
3.功能授权页面模板代码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="../../js/jquery.js"></script>
<script type="text/javascript" src="../../js/SubmitFun.js"></script>
<script type="text/javascript" src="../../js/jiaoyan.js"></script>
<script type="text/javascript">
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>功能授权</title>
<link rel="stylesheet" href="../../css/EditPage.css" type="text/css"></link>
</head>
<body>
<h1>功能授权</h1>
<form action="TopMenuController.php" name="forms" method="post" >
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#ebebeb" class="black">
<{foreach from=$powerMenu item=message}>
<tr>
<td align="left">
<input type="checkBox" name="selectIDs[]" id="news<{$message.id}>" value="<{$message.id}>" checked/><{$message.name}>
</td>
</tr>
<{/foreach}>
<{foreach from=$noPowerMenu item=message2}>
<tr>
<td align="left">
<input type="checkBox" name="selectIDs[]" id="news<{$message2.id}>" value="<{$message2.id}>"/><{$message2.name}>
</td>
</tr>
<{/foreach}>
<tr>
<td colspan="2" align="center">
<input type="hidden" name="roleId" value="<{$roleId}>"/>
<input type="hidden" name="type" value="addPower"/>
<input type="button" onClick="javaScript:history.back(-1);" value="返回"/>
<input type="submit" value="[授权]" οnclick="javascrip:return assignCheck();"/>
</td>
</tr>
</table>
</form>
</body>
</html>
页面效果如下
点击“授权”就ok了,授权操作就是向m_roleauth插入数据,我的处理每次授权都要删除前面授权过的记录这样可以防止数据库出现冗余数据
4.授权功能控制器代码
function addPower(){
$roleId=$_POST["roleId"];
if(!empty($_POST ["selectIDs"])){
$ids = $_POST ["selectIDs"];
$param = "";
for($i = 0; $i < count ( $ids ); $i ++) {
$param .= "$ids[$i],";
}
$menuManager=new TopMenuManagerImpl();
//echo substr($param, 0, strrpos ($param, ","));
$result=$menuManager->addPower($roleId, substr($param, 0, strrpos ($param, ",")));
if("1"==$result){
header("Location:RoleController.php?type=roleList");
}
}
}
最后来看看这个addPower方法
//角色功能授权(先删除对应角色权限表信息,之后添加数据)
public function addPower($role,$ids){
//删除先前的角色权限信息
$allId=explode(",", $ids);
$db=new DBUtil();
$conn=$db->getConnection();
$base=new BaseDBOperate();
$sqlDel="delete from m_roleauth where role=$role";
$flag=$base->otherOperate($sqlDel, $conn);
for($i=0;$i<count($allId);$i++){
$sql="insert into m_roleauth(role,menu) values($role,$allId[$i])";
$base->otherOperate($sql, $conn);
}
$db->close($conn);
return "1";
}
这个模块完了,是不是很简单呢。下次要和大家分享的是smarty缓存和使用smarty自定义函数实现表格隔行变色、抓取网络资源