权限学习(spring+springMVC+mybatis)
2016-07-05 16:49
441 查看
权限学习(spring+springMVC+mybatis):
第一步:建表(oracle)
create table role(
rid VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
name VARCHAR2(30),
description VARCHAR2(300),
checked number(1),
PRIMARY KEY ( rid )
);
create table sys_user_role(
id VARCHAR2(40)
NOT NULL,
userid VARCHAR2(40),
rid VARCHAR2(40),
PRIMARY KEY (
id )
);
create table privilege(
id VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
Name VARCHAR2(40),
flag VARCHAR2(20),
checked number(1),
isParent number(1),
url VARCHAR2(300),
target VARCHAR2(100),
icon VARCHAR2(300),
PRIMARY KEY (
id )
);
create table sys_privilege_role(
id VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
rid VARCHAR2(40),
PRIMARY KEY (
id )
);
create table AUTH_USER_P (
AUTH_USER_ID VARCHAR2(40) not null,
USERNAME VARCHAR2(50),
PASSWORD VARCHAR2(20),
REMARK VARCHAR2(600),
CREATE_TIME TIMESTAMP(6),
STATE integer,
c_online integer,
primary key (AUTH_USER_ID)
);
声明一个数组类型:
create or replace type id_string_array as varray(500) of varchar2(500);
写存储过程,用于建立多对多的关系,就是往sys_user_role和sys_privilege_role两张表插入数据实现用户添加角色,角色添加菜单的功能,由于我是新手,所以不知道怎么去处理这个关系,只能这样写存储过程了,如果有好的解决方案希望大神能告诉我!也许能自动建立关系,但是我还没弄懂。只能继续学习了。
存储过程一,sys_privilege_role:
create or replace procedure sys_privilege_role_insert(roleid in varchar2,privilegeid in
id_string_array) is
begin
delete from sys_privilege_role where rid=roleid;
for x in 1..privilegeid.count loop
Insert into sys_privilege_role(id,rid,pid) values (sys_guid(),roleid,to_char(privilegeid(x)));
end loop;
commit;
end sys_privilege_role_insert;
存储过程二,sys_user_role:
create or replace procedure sys_user_role_insert(user_id
in varchar2,roleid
in id_string_array)
is
begin
delete from sys_user_role
where userid=user_id;
for x
in 1..roleid.count
loop
insert into sys_user_role(id,userid,rid)
values (sys_guid(),user_id,to_char(roleid(x)));
end loop;
commit;
end sys_user_role_insert;
第二步:建实体类(省略get,set方法):
Privilege:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.List;
public class Privilege implements Serializable{
private String
id;//主键
private String
pid;//父节点ID
private String
name;//节点的名称
private String
flag;//"1"为菜单 "2"为功能
private Integer
checked;
private String
url;//跳转到的链接
private String
target;//跳转到的frame的名字
private Integer
isParent;
private String
icon;//图片的路径
private List<Role>
roles;
Role:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.List;
public class Role implements Serializable{
private String
rid;
private String
name;
private String
pid;//父节点的id
private String
description;
private List<User>
users;
private List<Privilege>
privileges;
private Integer checked;
User:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import cn.itcast.jk.util.LoginTypeEnum;
public class User implements Serializable{
private String id;
private String username;//姓名
private String password;//密码
private String remark;//备注
private Date createTime;//创建日期
private Integer state;//状态 1:启用 2:停用
private Integer online;// 1:在线 2:不在线
private List<Role> roleList;
第三步:写xml文件
RoleMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.jk.mapper.RoleMapper">
<resultMap type="cn.itcast.jk.domain.Role" id="roleRM">
<id column="rid" property="rid" />
<result column="name" property="name" />
<result column="pid" property="pid" />
<result column="description" property="description" />
<result column="checked" property="checked" />
</resultMap>
<select id="getRoleByUid" resultMap="roleRM">
select * from role where rid in (select rid from sys_user_role where userid=#{uid})
</select>
<select id="getRoles" resultMap="roleRM">
select * from role
</select>
</mapper>
PrivilegeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.jk.mapper.PrivilegeMapper">
<resultMap type="cn.itcast.jk.domain.Privilege" id="privilegeRM">
<id column="id" property="id" />
<result column="pid" property="pid"/>
<result column="name" property="name"/>
<result column="flag" property="flag"/>
<result column="checked" property="checked"/>
<result column="url" property="url"/>
<result column="target" property="target"/>
<result column="isParent" property="isParent"/>
<result column="icon" property="icon"/>
</resultMap>
<!-- 根据flag查询菜单 -->
<select id="getMenuitems" resultMap="privilegeRM">
select * from Privilege
</select>
<!-- 根据rid查询菜单 -->
<select id="getMenuitemsByUid" resultMap="privilegeRM">
select * from Privilege where flag='1' and id in(select pid from sys_privilege_role where (
<foreach collection="array" item="rid" open="(" close=")" separator="or">
rid=#{rid}
</foreach>
) )
</select>
<!-- 根据rid查询功能 -->
<select id="getFunctionByRid" resultMap="privilegeRM">
select * from Privilege where flag='2' and id in(select pid from sys_privilege_role where (
<foreach collection="array" item="rid" open="(" close=")" separator="or">
rid=#{rid}
</foreach>
) )
</select>
</mapper>
第四步:写dao
BaseDaoImpl:
package cn.itcast.jk.dao.impl;
import java.io.Serializable;
import java.util.List;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import cn.itcast.jk.dao.BaseDao;
public class BaseDaoImpl<T>extends SqlSessionDaoSupport implements BaseDao<T> {
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
private String ns; //命名空间
public String getNs() {
return ns;
}
public void setNs(String ns) {
this.ns = ns;
}
public void insert(T t) {
this.getSqlSession().insert(ns+".insert", t);
}
public void deleteById(Serializable id) {
this.getSqlSession().delete(ns+".deleteById", id);
}
public void update(T t) {
this.getSqlSession().update(ns+".update", t);
}
public List<T> find(T t) {
return this.getSqlSession().selectList(ns+".find", t);
}
public void delete(Serializable[] ids) {
this.getSqlSession().delete(ns+".delete", ids);
}
public T get(Serializable id) {
return this.getSqlSession().selectOne(ns+".get", id);
}
}
PrivilegeDaoImpl:
package cn.itcast.jk.dao.impl;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import cn.itcast.jk.dao.PrivilegeDao;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.dao.UserDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
import cn.itcast.jk.domain.User;
@Repository
public class PrivilegeDaoImpl
extends BaseDaoImpl<Privilege>
implements PrivilegeDao {
public PrivilegeDaoImpl(){
this.setNs("cn.itcast.jk.mapper.PrivilegeMapper");
//设置命名空间
}
@Resource
private RoleDao
roleDao;
@Resource
private UserDao
userDao;
@Resource
private JdbcTemplate
jdbcTemplate;
@Resource
private HttpServletRequest
request;
/**
* 获得菜单
*/
@Override
public Collection<Privilege> getMenuitemsByUid(String uid, String username) {
List<Privilege> privileges = null;
if("admin".equals(username)){
privileges = this.getSqlSession().selectList(getNs()+".getMenuitems");
request.getSession().setAttribute("privileges",privileges);
}else{
List<Role> list=this.roleDao.getRoleByUid2(uid,username);
StringBuffer sb=new StringBuffer();
for(int i=0;i<list.size();i++){
String id=list.get(i).getRid();
if(i<list.size()-1){
sb.append(id+",");
}else{
sb.append(id);
}
}
String s=sb.toString();
String[] rid=s.split(",");
privileges = this.getSqlSession().selectList(getNs()+".getMenuitemsByRid",rid);
request.getSession().setAttribute("privileges",privileges);
}
return new HashSet<Privilege>(privileges);
}
/**
* 获得功能
*/
@Override
public Collection<Privilege> getFunctionByUid(String uid) {
List<Privilege> privileges = null;
User u=this.userDao.get(uid);
String username=u.getUsername();
List<Role> list=(List<Role>)this.roleDao.getRoleByUid(uid,username);
StringBuffer sb=new StringBuffer();
for(int i=0;i<list.size();i++){
String id=list.get(i).getRid();
if(i<list.size()-1){
sb.append(id+",");
}else{
sb.append(id);
}
}
String s=sb.toString();
String[] rid=s.split(",");
privileges = this.getSqlSession().selectList(getNs()+".getFunctionByRid",rid);
return new HashSet<Privilege>(privileges);
}
/**
* 根据ids获取资源
*/
/*@Override
public Set<Privilege> getPrivilegeByIds(String[]
ids){
List<Privilege> list=this.getSqlSession().selectList(getNs()+".getPrivilegeByIds",
ids);
return new HashSet<Privilege>(list);
}*/
/**
* 为角色添加菜单
* 参数:rid:角色id;ids:权限id的数组集合
*/
@Override
public void insertPrivilege(String rid,String[] ids){
StringBuffer sb=new StringBuffer();
sb.append("call sys_privilege_role_insert('");
sb.append(rid+"',id_string_array(");
for(int i=0;i<ids.length;i++){
sb.append("'");
String id=ids[i];
sb.append(id);
if(i!=ids.length-1){
sb.append("',");
}else{
sb.append("'");
}
}
String sql=sb.toString();
this.jdbcTemplate.execute(sql+"))");
}
}
RoleDaoImpl:
package cn.itcast.jk.dao.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
@Repository
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao {
public RoleDaoImpl() {
this.setNs("cn.itcast.jk.mapper.RoleMapper"); // 设置命名空间
}
@Resource
private JdbcTemplate jdbcTemplate;
/**
* 根据UID获取角色
*/
@Override
public Collection<Role> getRoleByUid(String uid, String username) {
List<Role> lists=null;
if ("admin".equals(username)) {
lists = this.getSqlSession().selectList(
getNs() + ".getRoles");
} else {
lists = this.getSqlSession().selectList(
getNs() + ".getRoleByUid", uid);
}
return new HashSet<Role>(lists);
}
@Override
public List<Role> getRoleByUid2(String uid, String username) {
List<Role> lists=null;
if ("admin".equals(username)) {
lists = this.getSqlSession().selectList(
getNs() + ".getRoles");
} else {
lists = this.getSqlSession().selectList(
getNs() + ".getRoleByUid", uid);
}
return lists;
}
/**
* 根据rids获取角色
*/
/*
* @Override public Set<Role> getRolesByIds(String[] ids){ List<Role>
* list=this.getSqlSession().selectList(getNs()+".getRolesByIds", ids);
* return new HashSet<Role>(list); }
*/
/**
* 为用户添加角色 参数:uid:用户id;ids:角色id的数组集合
*/
@Override
public void insertRole(String uid, String[] ids) {
StringBuffer sb = new StringBuffer();
sb.append("call sys_user_role_insert('");
sb.append(uid + "',id_string_array(");
for (int i = 0; i < ids.length; i++) {
sb.append("'");
String id = ids[i];
sb.append(id);
if (i != ids.length - 1) {
sb.append("',");
} else {
sb.append("'");
}
}
String sql = sb.toString();
this.jdbcTemplate.execute(sql + "))");
}
}
第五步:写service
RoleServiceImpl:
package cn.itcast.jk.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.service.RoleService;
@Service
public class RoleServiceImpl implements RoleService {
@Resource
private RoleDao roleDao;
@Override
public void insertRole(String uid, String[] ids) {
this.roleDao.insertRole(uid, ids);
}
@Override
public Collection<Role> getRoles(String id, String username) {
return this.roleDao.getRoleByUid(id,username);
}
}
PrivilegeServiceImpl:
package cn.itcast.jk.service.impl;
import java.util.Collection;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.itcast.jk.dao.PrivilegeDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.service.PrivilegeService;
@Service
public class PrivilegeServiceImpl implements PrivilegeService {
@Resource
private PrivilegeDao privilegeDao;
@Override
public Collection<Privilege> PrivilegesByUid(String id, String username) {
return this.privilegeDao.getMenuitemsByUid(id,username);
}
@Override
public void insertPrivilege(String rid, String[] ids) {
this.privilegeDao.insertPrivilege(rid, ids);
}
@Override
public Collection<Privilege> getFunctionByUid(String uid) {
return this.privilegeDao.getFunctionByUid(uid);
}
}
第六步:controller
RoleController:
package cn.itcast.jk.controller;
import java.util.Collection;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
import cn.itcast.jk.domain.User;
import cn.itcast.jk.service.RoleService;
@Controller
public class RoleController extends BaseController{
@Resource
private RoleService roleService;
@RequestMapping("/role/list.action")
public String list(){
return "/system_admin/role/list.jsp";
}
@RequestMapping("/role/insertUI.action")
public String insertUI(){
return "/system_admin/role/roleCreate.jsp";
}
/**
* 加载角色树
*/
@RequestMapping("/showRole.action")
@ResponseBody
public Collection<Role> showMenuitemTreeByUid(HttpServletRequest request){
User user=(User) request.getSession().getAttribute("user");
Collection<Role> roles=this.roleService.getRoles(user.getId(),user.getUsername());
return roles;
}
/**
* 保存
*/
@RequestMapping("/saveRole.action")
@ResponseBody
public void saveRole(String uid,String roleStr){
String[] checkedNodes=roleStr.split(",");
this.roleService.insertRole(uid, checkedNodes);
}
}
PrivilegeController:
package cn.itcast.jk.controller;
import java.util.Collection;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.User;
import cn.itcast.jk.service.PrivilegeService;
@Controller
public class PrivilegeController extends BaseController{
@Resource
private PrivilegeService privilegeService;
/**
* 加载菜单树
*/
@RequestMapping("/showMenuitemTreeByUid.action")
@ResponseBody
public Collection<Privilege> showMenuitemTreeByUid(HttpServletRequest request){
User user=(User) request.getSession().getAttribute("user");
Collection<Privilege> privileges=this.privilegeService.PrivilegesByUid(user.getId(),user.getUsername());
return privileges;
}
/**
* 保存
*/
@RequestMapping("/savePrivilege.action")
@ResponseBody
public void savePrivilege(String rid,String privilegeStr){
String[] privilegeStrs=privilegeStr.split(",");
this.privilegeService.insertPrivilege(rid, privilegeStrs);
}
}
第六步:jsp(树控件为zTree)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-ztree-2.5.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/menuitem2.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/role-privilege.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/user-role.js"></script>
<html>
<head>
<title>导航菜单</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css">
</head>
<body style="margin:
0">
<TABLE border=0 width="700">
<TR>
<TD width=340px align=center valign=top>
<div class="zTreeDemoBackground">
<ul id="menuTree" class="tree"></ul>
</div>
</TD>
</TR>
</TABLE>
<div>
<!-- 之所以保存的时候rid没值是因为这个隐藏域没值,即没勾选哪个角色。因为只是做权限,没做增删改查的基本操作-->
<input type="hidden" name="rid">
<a href="#" id="hehe">设置权限</a>
</div>
<div class="ItemBlockBorder" style="display:
none;"
id="privilegeContent">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表头-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle">
<td width="300px" style="padding-left:
7px;">
<!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。因为有一种用法:可以直接用id引用元素 -->
<input type="checkbox" id="allchecked" />
<label for="cbSelectAll">全选</label>
</td>
</tr>
</thead>
<!--显示数据列表-->
<tbody id="TableData">
<tr class="TableDetail1">
<!-- 显示权限树 -->
<td>
<ul id='privilegeTree' class="tree"></ul>
<img id="loading" src="css/images/loading.gif">
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表单操作 -->
<div id="InputDetailBar">
<a id="savePrivilege" href="#">保存</a>
</div>
<div>
<input type="hidden" name="uid">
<a href="#" id="haha">设置角色</a>
</div>
<div class="ItemBlockBorder" style="display:
none;"
id="privilegeContent2">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表头-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle2">
<td width="300px" style="padding-left:
7px;">
<!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。因为有一种用法:可以直接用id引用元素 -->
<input type="checkbox" id="allchecked2"/>
<label for="cbSelectAll">全选</label>
</td>
</tr>
</thead>
<!--显示数据列表-->
<tbody id="TableData2">
<tr class="TableDetail1">
<!-- 显示角色树 -->
<td>
<ul id='roleTree2' class="tree"></ul>
<img id="loading2" src="css/images/loading.gif"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表单操作 -->
<div id="InputDetailBar">
<a id="savePrivilege2" href="#">保存</a>
</div>
</body>
</html>
第六步:JS
menuitem2.js:
var menu={
init:{
initEvent:function(){
menu.op.saveTree();
}
},
op:{
setting: {
isSimpleData: true,
treeNodeKey: "id",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
}
},
saveTree:function(){
$.post("showMenuitemTreeByUid.action",null,function(data){
$("#menuTree").zTree(menu.op.setting,data);
});
}
}
};
$().ready(function(){
menu.init.initEvent();
});
role-privilege.js:
var privilege={
data:{
role:{
name:'',
rid:''
}
},
init:{
initData:function(){
privilege.data.role.name=$(this).parent().siblings("td:first").text();
privilege.data.role.rid=$(this).parent().siblings("input[type='hidden']").val();
},
initEvent:function(){
$("#hehe").each(function(){
if($(this).text()=="设置权限"){
$(this).unbind("click");
$(this).bind("click",function(){
privilege.option.divOpt.showDiv();//显示DIV
privilege.init.initData.call(this);//获取数据
privilege.option.privilegeName.showName();//显示角色名称
privilege.option.privilegeTree.checkedState("disabled");//设置全选复选框为不可用,等到加载权限树完成后才可用
privilege.option.privilegeTree.showLoadingOrPrivilege({privilegeTree:false});//显示等待图标
privilege.option.privilegeTree.savePrivilegeTree();//加载树
return false;
});
$("#allchecked").unbind("change");
$("#allchecked").bind("change",function(){
privilege.option.privilegeTree.allChecked.call(this);
});
$("#savePrivilege").unbind("click");
$("#savePrivilege").bind("click",function(){
privilege.option.privilegeTree.savePrivilege();
});
}
});
}
},
option:{
divOpt:{
showDiv:function(){
$("#privilegeContent").show();
}
},
privilegeName:{
showName:function(){
$("#roleImage").text("角色:"+privilege.data.role.name);
}
},
privilegeTree:{
returnValues:'',
setting: {
isSimpleData: true,
treeNodeKey: "id",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
},
//显示树上的复选框
checkable:true,
//给权限树添加事件
callback:{
change:function(){
//调用setAllChecked方法设置全选复选框的状态
privilege.option.privilegeTree.setAllChecked();
}
}
},
savePrivilegeTree:function(){
$.post("showMenuitemTreeByUid.action",{
rid:privilege.data.role.rid
},function(data){
privilege.option.privilegeTree.returnValues=$("#privilegeTree").zTree(privilege.option.privilegeTree.setting,data);
privilege.option.privilegeTree.checkedState("");
privilege.option.privilegeTree.showLoadingOrPrivilege({privilegeTree:true});
privilege.option.privilegeTree.setAllChecked();
});
},
checkedState:function(data){
$("#allchecked").attr("disabled",data);
},
showLoadingOrPrivilege:function(json){
if(json.privilegeTree){
$("#privilegeTree").show();
$("#loading").hide();
}else{
$("#privilegeTree").hide();
$("#loading").show();
}
},
allChecked:function(){
if($(this).attr("checked")){
privilege.option.privilegeTree.returnValues.checkAllNodes(true);
}else{
privilege.option.privilegeTree.returnValues.checkAllNodes(false);
}
},
setAllChecked:function(){
var arr= privilege.option.privilegeTree.returnValues.getCheckedNodes(false);
for(var i=0;i<arr.length;i++){
if(arr.length==0){
$("#allchecked").attr("checked",true);
}else{
$("#allchecked").attr("checked",false);
}
}
},
savePrivilege:function(){
var array= privilege.option.privilegeTree.returnValues.getCheckedNodes(true);
var privilegeStr="";
for(var i=0;i<array.length;i++){
if(i==array.length-1){
privilegeStr=privilegeStr+array[i].id;
}else{
privilegeStr=privilegeStr+array[i].id+",";
}
}
var p={
rid:privilege.data.role.rid,
privilegeStr:privilegeStr
//privilegeStr:array
};
$.post("savePrivilege.action",p,function(data){
alert("保存成功");
});
}
}
}
};
$().ready(function(){
privilege.init.initEvent();
});
user-role.js:
var role={
//专门用来存放数据的
data:{
user:{
username:'',
uid:''
}
},
init:{
//初始化数据的方法
initData:function(){
//给username和uid赋值-----this代表超链接
role.data.user.username = $(this).parent().siblings("td:first").text();
role.data.user.uid = $(this).parent().siblings("input[type='hidden']").val();
},
//初始化事件的方法-------有3个事件
initEvent:function(){
//第一个事件,给设置角色声明click事件
//$("#haha").each(function(){//遍历每一个超链接
//if($(this).text()=="设置角色"){//如果a的文本为设置角色,则绑定事件
$("#haha").unbind("click");
$("#haha").bind("click",function(){
//触发后执行以下的事情
//第一步:会显示出 div
role.option.divOpt.showDiv();
//第二步:给username和uid赋值
role.init.initData.call(this);//相当于this调用initData方法
//第三步:动态显示出名称
role.option.usernameOpt.showUsername();
//设置全选复选框的初始化状态值为不可用
role.option.roleTree.changeCheckBoxStatus("disabled");
//显示loading,隐藏roleTree
role.option.roleTree.changeLoadingAndRoleTree({
roleTree:false
});
//第四步:加载角色树
role.option.roleTree.loadRoleTree();
return false;
});
//}
//});
//第二个事件,给全选框添加change事件
$("#allchecked2").unbind("change");
$("#allchecked2").bind("change",function(){
//触发后执行以下的事情
role.option.roleTree.allChecked.call(this);
});
//第三个事件,点击<保存>触发的click事件
$("#savePrivilege2").unbind("click");
$("#savePrivilege2").bind("click",function(){
//触发后执行以下的事情
role.option.roleTree.saveRole();
});
}
},
//页面的控制操作
option:{
// 1.涉及到div的操作
divOpt:{
showDiv:function(){
$("#privilegeContent2").show();
}
},
//2.涉及到username的操作
usernameOpt:{
//显示用户名称
showUsername:function(){
$("#userImage2").text("用户:"+role.data.user.username);
}
},
//3.涉及到权限树的操作
roleTree:{
//接受zTree函数的返回值-----
//当树加载完成后会有一个返回值,
//用zTreePlugin此变量接收,此返回值对全选复选框的功能有用,参考zTree API
zTreePlugin:'',
//zTree插件里的配置
setting: {
isSimpleData: true,
treeNodeKey: "rid",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
},
//显示树上的复选框
checkable:true,
//给角色树添加事件
callback:{
change:function(){
//调用setAllChecked方法设置全选复选框的状态
role.option.roleTree.setAllChecked();
}
}
},
//加载角色树
loadRoleTree:function(){
$.post("showRole.action",{
uid:role.data.user.uid
},function(data){
role.option.roleTree.zTreePlugin= $("#roleTree2").zTree(role.option.roleTree.setting,data);
//加载完角色树后把全选复选框变为可用状态,此行代码必须写在此回调函数中
role.option.roleTree.changeCheckBoxStatus("");
// 当整个角色树被加载出来以后,显示角色树,隐藏loading
role.option.roleTree.changeLoadingAndRoleTree({
roleTree:true
});
//设置全选复选框初始化状态的值
role.option.roleTree.setAllChecked();
});
},
//变换全选复选框的选中状态
changeCheckBoxStatus:function(status){
$("#allchecked2").attr("disabled",status);//把disabled这个属性变换成status
},
//要么显示树,要么显示出转的图标
changeLoadingAndRoleTree:function(json){
if(json.roleTree){
$("#roleTree2").show();
$("#loading2").hide();
}else{
$("#roleTree2").hide();
$("#loading2").show();
}
},
//全选复选框的功能
allChecked:function(){
if($(this).attr("checked")){
role.option.roleTree.zTreePlugin.checkAllNodes(true);
}else{
role.option.roleTree.zTreePlugin.checkAllNodes(false);
}
},
// 设置全选复选框被选中的状态
setAllChecked:function(){
var uncheckedNodes = role.option.roleTree.zTreePlugin.getCheckedNodes(false);
if(uncheckedNodes.length==0){//为0说明被选中
$("#allchecked2").attr("checked",true);
}else{
$("#allchecked2").attr("checked",false);
}
},
//保存,相当建立用户和角色的关系
saveRole:function(){
//获取被选中的所有的角色
var checkedNodes=role.option.roleTree.zTreePlugin.getCheckedNodes(true);
var roleStr="";
//遍历checkedNodes数组
for(var i=0;i<checkedNodes.length;i++){
if(i==checkedNodes.length-1){//如果为最后一个
roleStr=roleStr+checkedNodes[i].rid;
}else{
roleStr=roleStr+checkedNodes[i].rid+",";
}
}
//ajax向后台传递的参数
var p={
uid:role.data.user.uid,
roleStr:roleStr
//checkedNodes:checkedNodes
};
$.post("saveRole.action",p,function(data){
alert("保存成功");
});
}
}
}
};
$().ready(function(){
role.init.initEvent();
//$("div:hidden").show();
});
第七步:编写标签类(控制动作按钮)
package cn.itcast.jk.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import cn.itcast.jk.domain.Privilege;
public class PermissionTag extends TagSupport {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
// 模块中具体权限
private String
privilege;
public String getPrivilege() {
return privilege;
}
public void setPrivilege(String privilege) {
this.privilege = privilege;
}
@Override
@SuppressWarnings("unchecked")
public int doStartTag()
throws JspException {
boolean result =
false;
List<Privilege> privileges =(List<Privilege>)
request.getSession().getAttribute("privileges");
for(int i=0;i<privileges.size();i++){
if(privileges.get(i).getName().equals(privilege)){
result=true;
break;
}
}
return result ?
EVAL_BODY_INCLUDE : SKIP_BODY;// 真:返回EVAL_BODY_INCLUDE(执行标签);假:返回SKIP_BODY(跳过标签不执行)
}
}
为了能获取到request和标签,必须在xml文件中加上:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<jsp-config>
<taglib>
<taglib-uri>/http://www.wuxipolice.cn/huangyeheng</taglib-uri>
<taglib-location>/WEB-INF/classes/privilege.tld</taglib-location>
</taglib>
</jsp-config>
第八步:写测试JSP(必须先打开菜单页面再打开这个页面,否则放在session里面的privilege没值,会报空指针异常):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.wuxipolice.cn/huangyeheng" prefix="yg" %>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<html>
<head>
<title>动作测试</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body style="margin:
0">
<yg:permission privilege="update">
<a href="#">测试</a>
</yg:permission>
</body>
</html>
权限练习到此,新手一个,勿喷!
下面为网上找的权限管理,供参考
http://blog.chinaunix.net/uid-24343152-id-3673026.html
第一步:建表(oracle)
create table role(
rid VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
name VARCHAR2(30),
description VARCHAR2(300),
checked number(1),
PRIMARY KEY ( rid )
);
create table sys_user_role(
id VARCHAR2(40)
NOT NULL,
userid VARCHAR2(40),
rid VARCHAR2(40),
PRIMARY KEY (
id )
);
create table privilege(
id VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
Name VARCHAR2(40),
flag VARCHAR2(20),
checked number(1),
isParent number(1),
url VARCHAR2(300),
target VARCHAR2(100),
icon VARCHAR2(300),
PRIMARY KEY (
id )
);
create table sys_privilege_role(
id VARCHAR2(40)
NOT NULL,
pid VARCHAR2(40),
rid VARCHAR2(40),
PRIMARY KEY (
id )
);
create table AUTH_USER_P (
AUTH_USER_ID VARCHAR2(40) not null,
USERNAME VARCHAR2(50),
PASSWORD VARCHAR2(20),
REMARK VARCHAR2(600),
CREATE_TIME TIMESTAMP(6),
STATE integer,
c_online integer,
primary key (AUTH_USER_ID)
);
声明一个数组类型:
create or replace type id_string_array as varray(500) of varchar2(500);
写存储过程,用于建立多对多的关系,就是往sys_user_role和sys_privilege_role两张表插入数据实现用户添加角色,角色添加菜单的功能,由于我是新手,所以不知道怎么去处理这个关系,只能这样写存储过程了,如果有好的解决方案希望大神能告诉我!也许能自动建立关系,但是我还没弄懂。只能继续学习了。
存储过程一,sys_privilege_role:
create or replace procedure sys_privilege_role_insert(roleid in varchar2,privilegeid in
id_string_array) is
begin
delete from sys_privilege_role where rid=roleid;
for x in 1..privilegeid.count loop
Insert into sys_privilege_role(id,rid,pid) values (sys_guid(),roleid,to_char(privilegeid(x)));
end loop;
commit;
end sys_privilege_role_insert;
存储过程二,sys_user_role:
create or replace procedure sys_user_role_insert(user_id
in varchar2,roleid
in id_string_array)
is
begin
delete from sys_user_role
where userid=user_id;
for x
in 1..roleid.count
loop
insert into sys_user_role(id,userid,rid)
values (sys_guid(),user_id,to_char(roleid(x)));
end loop;
commit;
end sys_user_role_insert;
第二步:建实体类(省略get,set方法):
Privilege:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.List;
public class Privilege implements Serializable{
private String
id;//主键
private String
pid;//父节点ID
private String
name;//节点的名称
private String
flag;//"1"为菜单 "2"为功能
private Integer
checked;
private String
url;//跳转到的链接
private String
target;//跳转到的frame的名字
private Integer
isParent;
private String
icon;//图片的路径
private List<Role>
roles;
Role:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.List;
public class Role implements Serializable{
private String
rid;
private String
name;
private String
pid;//父节点的id
private String
description;
private List<User>
users;
private List<Privilege>
privileges;
private Integer checked;
User:
package cn.itcast.jk.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import cn.itcast.jk.util.LoginTypeEnum;
public class User implements Serializable{
private String id;
private String username;//姓名
private String password;//密码
private String remark;//备注
private Date createTime;//创建日期
private Integer state;//状态 1:启用 2:停用
private Integer online;// 1:在线 2:不在线
private List<Role> roleList;
第三步:写xml文件
RoleMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.jk.mapper.RoleMapper">
<resultMap type="cn.itcast.jk.domain.Role" id="roleRM">
<id column="rid" property="rid" />
<result column="name" property="name" />
<result column="pid" property="pid" />
<result column="description" property="description" />
<result column="checked" property="checked" />
</resultMap>
<select id="getRoleByUid" resultMap="roleRM">
select * from role where rid in (select rid from sys_user_role where userid=#{uid})
</select>
<select id="getRoles" resultMap="roleRM">
select * from role
</select>
</mapper>
PrivilegeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.jk.mapper.PrivilegeMapper">
<resultMap type="cn.itcast.jk.domain.Privilege" id="privilegeRM">
<id column="id" property="id" />
<result column="pid" property="pid"/>
<result column="name" property="name"/>
<result column="flag" property="flag"/>
<result column="checked" property="checked"/>
<result column="url" property="url"/>
<result column="target" property="target"/>
<result column="isParent" property="isParent"/>
<result column="icon" property="icon"/>
</resultMap>
<!-- 根据flag查询菜单 -->
<select id="getMenuitems" resultMap="privilegeRM">
select * from Privilege
</select>
<!-- 根据rid查询菜单 -->
<select id="getMenuitemsByUid" resultMap="privilegeRM">
select * from Privilege where flag='1' and id in(select pid from sys_privilege_role where (
<foreach collection="array" item="rid" open="(" close=")" separator="or">
rid=#{rid}
</foreach>
) )
</select>
<!-- 根据rid查询功能 -->
<select id="getFunctionByRid" resultMap="privilegeRM">
select * from Privilege where flag='2' and id in(select pid from sys_privilege_role where (
<foreach collection="array" item="rid" open="(" close=")" separator="or">
rid=#{rid}
</foreach>
) )
</select>
</mapper>
第四步:写dao
BaseDaoImpl:
package cn.itcast.jk.dao.impl;
import java.io.Serializable;
import java.util.List;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import cn.itcast.jk.dao.BaseDao;
public class BaseDaoImpl<T>extends SqlSessionDaoSupport implements BaseDao<T> {
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
super.setSqlSessionFactory(sqlSessionFactory);
}
private String ns; //命名空间
public String getNs() {
return ns;
}
public void setNs(String ns) {
this.ns = ns;
}
public void insert(T t) {
this.getSqlSession().insert(ns+".insert", t);
}
public void deleteById(Serializable id) {
this.getSqlSession().delete(ns+".deleteById", id);
}
public void update(T t) {
this.getSqlSession().update(ns+".update", t);
}
public List<T> find(T t) {
return this.getSqlSession().selectList(ns+".find", t);
}
public void delete(Serializable[] ids) {
this.getSqlSession().delete(ns+".delete", ids);
}
public T get(Serializable id) {
return this.getSqlSession().selectOne(ns+".get", id);
}
}
PrivilegeDaoImpl:
package cn.itcast.jk.dao.impl;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import cn.itcast.jk.dao.PrivilegeDao;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.dao.UserDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
import cn.itcast.jk.domain.User;
@Repository
public class PrivilegeDaoImpl
extends BaseDaoImpl<Privilege>
implements PrivilegeDao {
public PrivilegeDaoImpl(){
this.setNs("cn.itcast.jk.mapper.PrivilegeMapper");
//设置命名空间
}
@Resource
private RoleDao
roleDao;
@Resource
private UserDao
userDao;
@Resource
private JdbcTemplate
jdbcTemplate;
@Resource
private HttpServletRequest
request;
/**
* 获得菜单
*/
@Override
public Collection<Privilege> getMenuitemsByUid(String uid, String username) {
List<Privilege> privileges = null;
if("admin".equals(username)){
privileges = this.getSqlSession().selectList(getNs()+".getMenuitems");
request.getSession().setAttribute("privileges",privileges);
}else{
List<Role> list=this.roleDao.getRoleByUid2(uid,username);
StringBuffer sb=new StringBuffer();
for(int i=0;i<list.size();i++){
String id=list.get(i).getRid();
if(i<list.size()-1){
sb.append(id+",");
}else{
sb.append(id);
}
}
String s=sb.toString();
String[] rid=s.split(",");
privileges = this.getSqlSession().selectList(getNs()+".getMenuitemsByRid",rid);
request.getSession().setAttribute("privileges",privileges);
}
return new HashSet<Privilege>(privileges);
}
/**
* 获得功能
*/
@Override
public Collection<Privilege> getFunctionByUid(String uid) {
List<Privilege> privileges = null;
User u=this.userDao.get(uid);
String username=u.getUsername();
List<Role> list=(List<Role>)this.roleDao.getRoleByUid(uid,username);
StringBuffer sb=new StringBuffer();
for(int i=0;i<list.size();i++){
String id=list.get(i).getRid();
if(i<list.size()-1){
sb.append(id+",");
}else{
sb.append(id);
}
}
String s=sb.toString();
String[] rid=s.split(",");
privileges = this.getSqlSession().selectList(getNs()+".getFunctionByRid",rid);
return new HashSet<Privilege>(privileges);
}
/**
* 根据ids获取资源
*/
/*@Override
public Set<Privilege> getPrivilegeByIds(String[]
ids){
List<Privilege> list=this.getSqlSession().selectList(getNs()+".getPrivilegeByIds",
ids);
return new HashSet<Privilege>(list);
}*/
/**
* 为角色添加菜单
* 参数:rid:角色id;ids:权限id的数组集合
*/
@Override
public void insertPrivilege(String rid,String[] ids){
StringBuffer sb=new StringBuffer();
sb.append("call sys_privilege_role_insert('");
sb.append(rid+"',id_string_array(");
for(int i=0;i<ids.length;i++){
sb.append("'");
String id=ids[i];
sb.append(id);
if(i!=ids.length-1){
sb.append("',");
}else{
sb.append("'");
}
}
String sql=sb.toString();
this.jdbcTemplate.execute(sql+"))");
}
}
RoleDaoImpl:
package cn.itcast.jk.dao.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
@Repository
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao {
public RoleDaoImpl() {
this.setNs("cn.itcast.jk.mapper.RoleMapper"); // 设置命名空间
}
@Resource
private JdbcTemplate jdbcTemplate;
/**
* 根据UID获取角色
*/
@Override
public Collection<Role> getRoleByUid(String uid, String username) {
List<Role> lists=null;
if ("admin".equals(username)) {
lists = this.getSqlSession().selectList(
getNs() + ".getRoles");
} else {
lists = this.getSqlSession().selectList(
getNs() + ".getRoleByUid", uid);
}
return new HashSet<Role>(lists);
}
@Override
public List<Role> getRoleByUid2(String uid, String username) {
List<Role> lists=null;
if ("admin".equals(username)) {
lists = this.getSqlSession().selectList(
getNs() + ".getRoles");
} else {
lists = this.getSqlSession().selectList(
getNs() + ".getRoleByUid", uid);
}
return lists;
}
/**
* 根据rids获取角色
*/
/*
* @Override public Set<Role> getRolesByIds(String[] ids){ List<Role>
* list=this.getSqlSession().selectList(getNs()+".getRolesByIds", ids);
* return new HashSet<Role>(list); }
*/
/**
* 为用户添加角色 参数:uid:用户id;ids:角色id的数组集合
*/
@Override
public void insertRole(String uid, String[] ids) {
StringBuffer sb = new StringBuffer();
sb.append("call sys_user_role_insert('");
sb.append(uid + "',id_string_array(");
for (int i = 0; i < ids.length; i++) {
sb.append("'");
String id = ids[i];
sb.append(id);
if (i != ids.length - 1) {
sb.append("',");
} else {
sb.append("'");
}
}
String sql = sb.toString();
this.jdbcTemplate.execute(sql + "))");
}
}
第五步:写service
RoleServiceImpl:
package cn.itcast.jk.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.itcast.jk.dao.RoleDao;
import cn.itcast.jk.service.RoleService;
@Service
public class RoleServiceImpl implements RoleService {
@Resource
private RoleDao roleDao;
@Override
public void insertRole(String uid, String[] ids) {
this.roleDao.insertRole(uid, ids);
}
@Override
public Collection<Role> getRoles(String id, String username) {
return this.roleDao.getRoleByUid(id,username);
}
}
PrivilegeServiceImpl:
package cn.itcast.jk.service.impl;
import java.util.Collection;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.itcast.jk.dao.PrivilegeDao;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.service.PrivilegeService;
@Service
public class PrivilegeServiceImpl implements PrivilegeService {
@Resource
private PrivilegeDao privilegeDao;
@Override
public Collection<Privilege> PrivilegesByUid(String id, String username) {
return this.privilegeDao.getMenuitemsByUid(id,username);
}
@Override
public void insertPrivilege(String rid, String[] ids) {
this.privilegeDao.insertPrivilege(rid, ids);
}
@Override
public Collection<Privilege> getFunctionByUid(String uid) {
return this.privilegeDao.getFunctionByUid(uid);
}
}
第六步:controller
RoleController:
package cn.itcast.jk.controller;
import java.util.Collection;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.Role;
import cn.itcast.jk.domain.User;
import cn.itcast.jk.service.RoleService;
@Controller
public class RoleController extends BaseController{
@Resource
private RoleService roleService;
@RequestMapping("/role/list.action")
public String list(){
return "/system_admin/role/list.jsp";
}
@RequestMapping("/role/insertUI.action")
public String insertUI(){
return "/system_admin/role/roleCreate.jsp";
}
/**
* 加载角色树
*/
@RequestMapping("/showRole.action")
@ResponseBody
public Collection<Role> showMenuitemTreeByUid(HttpServletRequest request){
User user=(User) request.getSession().getAttribute("user");
Collection<Role> roles=this.roleService.getRoles(user.getId(),user.getUsername());
return roles;
}
/**
* 保存
*/
@RequestMapping("/saveRole.action")
@ResponseBody
public void saveRole(String uid,String roleStr){
String[] checkedNodes=roleStr.split(",");
this.roleService.insertRole(uid, checkedNodes);
}
}
PrivilegeController:
package cn.itcast.jk.controller;
import java.util.Collection;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.itcast.jk.domain.Privilege;
import cn.itcast.jk.domain.User;
import cn.itcast.jk.service.PrivilegeService;
@Controller
public class PrivilegeController extends BaseController{
@Resource
private PrivilegeService privilegeService;
/**
* 加载菜单树
*/
@RequestMapping("/showMenuitemTreeByUid.action")
@ResponseBody
public Collection<Privilege> showMenuitemTreeByUid(HttpServletRequest request){
User user=(User) request.getSession().getAttribute("user");
Collection<Privilege> privileges=this.privilegeService.PrivilegesByUid(user.getId(),user.getUsername());
return privileges;
}
/**
* 保存
*/
@RequestMapping("/savePrivilege.action")
@ResponseBody
public void savePrivilege(String rid,String privilegeStr){
String[] privilegeStrs=privilegeStr.split(",");
this.privilegeService.insertPrivilege(rid, privilegeStrs);
}
}
第六步:jsp(树控件为zTree)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-ztree-2.5.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/menuitem2.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/role-privilege.js"></script>
<script language="javascript" src="${pageContext.request.contextPath}/js/user-role.js"></script>
<html>
<head>
<title>导航菜单</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css">
</head>
<body style="margin:
0">
<TABLE border=0 width="700">
<TR>
<TD width=340px align=center valign=top>
<div class="zTreeDemoBackground">
<ul id="menuTree" class="tree"></ul>
</div>
</TD>
</TR>
</TABLE>
<div>
<!-- 之所以保存的时候rid没值是因为这个隐藏域没值,即没勾选哪个角色。因为只是做权限,没做增删改查的基本操作-->
<input type="hidden" name="rid">
<a href="#" id="hehe">设置权限</a>
</div>
<div class="ItemBlockBorder" style="display:
none;"
id="privilegeContent">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表头-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle">
<td width="300px" style="padding-left:
7px;">
<!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。因为有一种用法:可以直接用id引用元素 -->
<input type="checkbox" id="allchecked" />
<label for="cbSelectAll">全选</label>
</td>
</tr>
</thead>
<!--显示数据列表-->
<tbody id="TableData">
<tr class="TableDetail1">
<!-- 显示权限树 -->
<td>
<ul id='privilegeTree' class="tree"></ul>
<img id="loading" src="css/images/loading.gif">
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表单操作 -->
<div id="InputDetailBar">
<a id="savePrivilege" href="#">保存</a>
</div>
<div>
<input type="hidden" name="uid">
<a href="#" id="haha">设置角色</a>
</div>
<div class="ItemBlockBorder" style="display:
none;"
id="privilegeContent2">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表头-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle2">
<td width="300px" style="padding-left:
7px;">
<!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。因为有一种用法:可以直接用id引用元素 -->
<input type="checkbox" id="allchecked2"/>
<label for="cbSelectAll">全选</label>
</td>
</tr>
</thead>
<!--显示数据列表-->
<tbody id="TableData2">
<tr class="TableDetail1">
<!-- 显示角色树 -->
<td>
<ul id='roleTree2' class="tree"></ul>
<img id="loading2" src="css/images/loading.gif"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表单操作 -->
<div id="InputDetailBar">
<a id="savePrivilege2" href="#">保存</a>
</div>
</body>
</html>
第六步:JS
menuitem2.js:
var menu={
init:{
initEvent:function(){
menu.op.saveTree();
}
},
op:{
setting: {
isSimpleData: true,
treeNodeKey: "id",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
}
},
saveTree:function(){
$.post("showMenuitemTreeByUid.action",null,function(data){
$("#menuTree").zTree(menu.op.setting,data);
});
}
}
};
$().ready(function(){
menu.init.initEvent();
});
role-privilege.js:
var privilege={
data:{
role:{
name:'',
rid:''
}
},
init:{
initData:function(){
privilege.data.role.name=$(this).parent().siblings("td:first").text();
privilege.data.role.rid=$(this).parent().siblings("input[type='hidden']").val();
},
initEvent:function(){
$("#hehe").each(function(){
if($(this).text()=="设置权限"){
$(this).unbind("click");
$(this).bind("click",function(){
privilege.option.divOpt.showDiv();//显示DIV
privilege.init.initData.call(this);//获取数据
privilege.option.privilegeName.showName();//显示角色名称
privilege.option.privilegeTree.checkedState("disabled");//设置全选复选框为不可用,等到加载权限树完成后才可用
privilege.option.privilegeTree.showLoadingOrPrivilege({privilegeTree:false});//显示等待图标
privilege.option.privilegeTree.savePrivilegeTree();//加载树
return false;
});
$("#allchecked").unbind("change");
$("#allchecked").bind("change",function(){
privilege.option.privilegeTree.allChecked.call(this);
});
$("#savePrivilege").unbind("click");
$("#savePrivilege").bind("click",function(){
privilege.option.privilegeTree.savePrivilege();
});
}
});
}
},
option:{
divOpt:{
showDiv:function(){
$("#privilegeContent").show();
}
},
privilegeName:{
showName:function(){
$("#roleImage").text("角色:"+privilege.data.role.name);
}
},
privilegeTree:{
returnValues:'',
setting: {
isSimpleData: true,
treeNodeKey: "id",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
},
//显示树上的复选框
checkable:true,
//给权限树添加事件
callback:{
change:function(){
//调用setAllChecked方法设置全选复选框的状态
privilege.option.privilegeTree.setAllChecked();
}
}
},
savePrivilegeTree:function(){
$.post("showMenuitemTreeByUid.action",{
rid:privilege.data.role.rid
},function(data){
privilege.option.privilegeTree.returnValues=$("#privilegeTree").zTree(privilege.option.privilegeTree.setting,data);
privilege.option.privilegeTree.checkedState("");
privilege.option.privilegeTree.showLoadingOrPrivilege({privilegeTree:true});
privilege.option.privilegeTree.setAllChecked();
});
},
checkedState:function(data){
$("#allchecked").attr("disabled",data);
},
showLoadingOrPrivilege:function(json){
if(json.privilegeTree){
$("#privilegeTree").show();
$("#loading").hide();
}else{
$("#privilegeTree").hide();
$("#loading").show();
}
},
allChecked:function(){
if($(this).attr("checked")){
privilege.option.privilegeTree.returnValues.checkAllNodes(true);
}else{
privilege.option.privilegeTree.returnValues.checkAllNodes(false);
}
},
setAllChecked:function(){
var arr= privilege.option.privilegeTree.returnValues.getCheckedNodes(false);
for(var i=0;i<arr.length;i++){
if(arr.length==0){
$("#allchecked").attr("checked",true);
}else{
$("#allchecked").attr("checked",false);
}
}
},
savePrivilege:function(){
var array= privilege.option.privilegeTree.returnValues.getCheckedNodes(true);
var privilegeStr="";
for(var i=0;i<array.length;i++){
if(i==array.length-1){
privilegeStr=privilegeStr+array[i].id;
}else{
privilegeStr=privilegeStr+array[i].id+",";
}
}
var p={
rid:privilege.data.role.rid,
privilegeStr:privilegeStr
//privilegeStr:array
};
$.post("savePrivilege.action",p,function(data){
alert("保存成功");
});
}
}
}
};
$().ready(function(){
privilege.init.initEvent();
});
user-role.js:
var role={
//专门用来存放数据的
data:{
user:{
username:'',
uid:''
}
},
init:{
//初始化数据的方法
initData:function(){
//给username和uid赋值-----this代表超链接
role.data.user.username = $(this).parent().siblings("td:first").text();
role.data.user.uid = $(this).parent().siblings("input[type='hidden']").val();
},
//初始化事件的方法-------有3个事件
initEvent:function(){
//第一个事件,给设置角色声明click事件
//$("#haha").each(function(){//遍历每一个超链接
//if($(this).text()=="设置角色"){//如果a的文本为设置角色,则绑定事件
$("#haha").unbind("click");
$("#haha").bind("click",function(){
//触发后执行以下的事情
//第一步:会显示出 div
role.option.divOpt.showDiv();
//第二步:给username和uid赋值
role.init.initData.call(this);//相当于this调用initData方法
//第三步:动态显示出名称
role.option.usernameOpt.showUsername();
//设置全选复选框的初始化状态值为不可用
role.option.roleTree.changeCheckBoxStatus("disabled");
//显示loading,隐藏roleTree
role.option.roleTree.changeLoadingAndRoleTree({
roleTree:false
});
//第四步:加载角色树
role.option.roleTree.loadRoleTree();
return false;
});
//}
//});
//第二个事件,给全选框添加change事件
$("#allchecked2").unbind("change");
$("#allchecked2").bind("change",function(){
//触发后执行以下的事情
role.option.roleTree.allChecked.call(this);
});
//第三个事件,点击<保存>触发的click事件
$("#savePrivilege2").unbind("click");
$("#savePrivilege2").bind("click",function(){
//触发后执行以下的事情
role.option.roleTree.saveRole();
});
}
},
//页面的控制操作
option:{
// 1.涉及到div的操作
divOpt:{
showDiv:function(){
$("#privilegeContent2").show();
}
},
//2.涉及到username的操作
usernameOpt:{
//显示用户名称
showUsername:function(){
$("#userImage2").text("用户:"+role.data.user.username);
}
},
//3.涉及到权限树的操作
roleTree:{
//接受zTree函数的返回值-----
//当树加载完成后会有一个返回值,
//用zTreePlugin此变量接收,此返回值对全选复选框的功能有用,参考zTree API
zTreePlugin:'',
//zTree插件里的配置
setting: {
isSimpleData: true,
treeNodeKey: "rid",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
},
//显示树上的复选框
checkable:true,
//给角色树添加事件
callback:{
change:function(){
//调用setAllChecked方法设置全选复选框的状态
role.option.roleTree.setAllChecked();
}
}
},
//加载角色树
loadRoleTree:function(){
$.post("showRole.action",{
uid:role.data.user.uid
},function(data){
role.option.roleTree.zTreePlugin= $("#roleTree2").zTree(role.option.roleTree.setting,data);
//加载完角色树后把全选复选框变为可用状态,此行代码必须写在此回调函数中
role.option.roleTree.changeCheckBoxStatus("");
// 当整个角色树被加载出来以后,显示角色树,隐藏loading
role.option.roleTree.changeLoadingAndRoleTree({
roleTree:true
});
//设置全选复选框初始化状态的值
role.option.roleTree.setAllChecked();
});
},
//变换全选复选框的选中状态
changeCheckBoxStatus:function(status){
$("#allchecked2").attr("disabled",status);//把disabled这个属性变换成status
},
//要么显示树,要么显示出转的图标
changeLoadingAndRoleTree:function(json){
if(json.roleTree){
$("#roleTree2").show();
$("#loading2").hide();
}else{
$("#roleTree2").hide();
$("#loading2").show();
}
},
//全选复选框的功能
allChecked:function(){
if($(this).attr("checked")){
role.option.roleTree.zTreePlugin.checkAllNodes(true);
}else{
role.option.roleTree.zTreePlugin.checkAllNodes(false);
}
},
// 设置全选复选框被选中的状态
setAllChecked:function(){
var uncheckedNodes = role.option.roleTree.zTreePlugin.getCheckedNodes(false);
if(uncheckedNodes.length==0){//为0说明被选中
$("#allchecked2").attr("checked",true);
}else{
$("#allchecked2").attr("checked",false);
}
},
//保存,相当建立用户和角色的关系
saveRole:function(){
//获取被选中的所有的角色
var checkedNodes=role.option.roleTree.zTreePlugin.getCheckedNodes(true);
var roleStr="";
//遍历checkedNodes数组
for(var i=0;i<checkedNodes.length;i++){
if(i==checkedNodes.length-1){//如果为最后一个
roleStr=roleStr+checkedNodes[i].rid;
}else{
roleStr=roleStr+checkedNodes[i].rid+",";
}
}
//ajax向后台传递的参数
var p={
uid:role.data.user.uid,
roleStr:roleStr
//checkedNodes:checkedNodes
};
$.post("saveRole.action",p,function(data){
alert("保存成功");
});
}
}
}
};
$().ready(function(){
role.init.initEvent();
//$("div:hidden").show();
});
第七步:编写标签类(控制动作按钮)
package cn.itcast.jk.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import cn.itcast.jk.domain.Privilege;
public class PermissionTag extends TagSupport {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
// 模块中具体权限
private String
privilege;
public String getPrivilege() {
return privilege;
}
public void setPrivilege(String privilege) {
this.privilege = privilege;
}
@Override
@SuppressWarnings("unchecked")
public int doStartTag()
throws JspException {
boolean result =
false;
List<Privilege> privileges =(List<Privilege>)
request.getSession().getAttribute("privileges");
for(int i=0;i<privileges.size();i++){
if(privileges.get(i).getName().equals(privilege)){
result=true;
break;
}
}
return result ?
EVAL_BODY_INCLUDE : SKIP_BODY;// 真:返回EVAL_BODY_INCLUDE(执行标签);假:返回SKIP_BODY(跳过标签不执行)
}
}
为了能获取到request和标签,必须在xml文件中加上:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<jsp-config>
<taglib>
<taglib-uri>/http://www.wuxipolice.cn/huangyeheng</taglib-uri>
<taglib-location>/WEB-INF/classes/privilege.tld</taglib-location>
</taglib>
</jsp-config>
第八步:写测试JSP(必须先打开菜单页面再打开这个页面,否则放在session里面的privilege没值,会报空指针异常):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.wuxipolice.cn/huangyeheng" prefix="yg" %>
<script language="javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<html>
<head>
<title>动作测试</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body style="margin:
0">
<yg:permission privilege="update">
<a href="#">测试</a>
</yg:permission>
</body>
</html>
权限练习到此,新手一个,勿喷!
下面为网上找的权限管理,供参考
http://blog.chinaunix.net/uid-24343152-id-3673026.html
相关文章推荐
- Windows7下获得System权限问题解决方法
- 用一整天的时间安装postgreSQL NTFS权限
- 星外系统关于权限的综合说明
- MAC上Mysql忘记Root密码或权限错误的快速解决方案
- 用vbs检查注册表项的访问权限的代码
- sqlserver附加.mdf权限问题解决
- MongoDB系列教程(四):设置用户访问权限
- cacls命令设置文件及其文件夹权限的方法
- “SQL2000数据库”运行在普通用户下所需的权限
- 批处理设置文件访问权限的方法分享
- C#枚举中的位运算权限分配浅谈
- WordPress中创建用户角色的相关PHP函数使用详解
- ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法(附demo源码下载)
- 如何实现只授予用户查看存储过程定义的权限
- Oracle Scott创建视图权限不足解决办法
- windows 权限之拒绝运行应用程序
- windows IIS权限经典设置教程
- Android用代码获取手机root之后的最高权限
- IIS6.0的默认权限和用户权限设置小结
- VC判断进程是否具有administrator权限的方法