SSH系列:(18)用户-角色管理

之前,在做用户管理的时候,并未处理“用户”与“角色”的关系,因为那个时候,还没有涉及到角色的实现。我们在做角色-权限管理的时候,也并没有处理 角色 和 用户 之间的关系。如今,再回过头来实现“用户”和 “角色”之间的联系。

“用户”和“角色”之间的关系是多对多的关系,这个关系可以分成两个:(1)“用户”与“用户角色”的一对多的关系、(2)“角色”与“用户角色”的一对多的关系。此刻,我们只实现“用户”与“用户角色”的一对多关系,而不去实现“角色”与“用户角色”。因此,我们需要在用户的添加和编辑页面能够对当前处理的用户的角色进行选择。

1、entity层

UserRole.java

package com.rk.tax.entity;

import java.io.Serializable;

public class UserRole implements Serializable {
	private UserRoleId id;

	public UserRole() {
	}

	public UserRole(UserRoleId id) {
		this.id = id;
	}

	public UserRoleId getId() {
		return id;
	}

	public void setId(UserRoleId id) {
		this.id = id;
	}

}

UserRoleId.java

package com.rk.tax.entity;

import java.io.Serializable;

import org.apache.commons.lang3.StringUtils;

public class UserRoleId implements Serializable {
	private Role role;
	private String userId;

	public UserRoleId() {
	}

	public UserRoleId(Role role, String userId) {
		this.role = role;
		this.userId = userId;
	}

	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((userId == null) ? 0 : userId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (this.getClass() != obj.getClass()) return false;

		UserRoleId other = (UserRoleId) obj;
		if(!StringUtils.equals(this.userId, other.userId)) return false;

		if (this.role == null && other.role != null) {
			return false;
		} else if (!this.role.equals(other.role)){
			return false;
		}

		return true;
	}

}

UserRole.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.tax.entity" auto-import="true">
	<class name="UserRole" table="R_User_Role">
		<composite-id name="id" class="UserRoleId">
			<key-many-to-one name="role" column="role_id" class="Role" lazy="false"></key-many-to-one>
			<key-property name="userId" column="user_id" type="string" length="32"></key-property>
		</composite-id>
	</class>
</hibernate-mapping>

User.java 添加一个userRoles变量,用来维护 用户 和 用户角色 之间的关系,但不需要对User.hbm.xml(User类的映射文件)进行修改。

	private List<UserRole> userRoles;
	public List<UserRole> getUserRoles() {
		return userRoles;
	}
	public void setUserRoles(List<UserRole> userRoles) {
		this.userRoles = userRoles;
	}	

2、action层

这个时候,我们不是从entity->dao->service->action->config的方式去写,因此我们已经拥有了User、Role相关的dao、service、action层的代码,只需要对现有的代码进行修改就可以了。修改,应该从action层开始修改,再向service修改,最后向dao层修改。

在UserAction.java中主要修改的代码有:

//添加
	//用户角色
	private String[] userRoleIds;
	@Resource
	private RoleService roleService;
//修改
	//跳转到新增页面
	public String addUI()
	//保存新增
	public String add()
	//跳转到编辑页面
	public String editUI()
	//保存编辑
	public String edit()	

UserAction.java

package com.rk.tax.action;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.rk.core.action.BaseAction;
import com.rk.core.exception.ActionException;
import com.rk.tax.entity.Role;
import com.rk.tax.entity.User;
import com.rk.tax.entity.UserRole;
import com.rk.tax.entity.UserRoleId;
import com.rk.tax.service.RoleService;
import com.rk.tax.service.UserService;

@Controller("userAction")
@Scope("prototype")
public class UserAction extends BaseAction {
	/***** 1、业务数据 *****/
	private List<User> userList;	//用于显示用户列表
	private User user;				//用于添加、修改和删除单个用户

	//用户头像
	private File headImg;
	private String headImgContentType;
	private String headImgFileName;

	//导入Excel
	private File userExcel;
	private String userExcelContentType;
	private String userExcelFileName;

	//用户角色
	private String[] userRoleIds;

	/***** 2、业务实现类 *****/
	@Resource
	private UserService userService;
	@Resource
	private RoleService roleService;

	/***** 3、页面响应操作 *****/

	//跳转到新增页面
	public String addUI()
	{
		//加载角色列表
		ActionContext.getContext().getContextMap().put("roleList", roleService.findAll());
		return "addUI";
	}
	//保存新增
	public String add()
	{
		try {
			if(user != null)
			{
				if(headImg != null)
				{
					//1、保存头像到upload/user
					String filePath = ServletActionContext.getServletContext().getRealPath("upload/user/");
					String fileName = UUID.randomUUID().toString().replaceAll("-", "") + headImgFileName.substring(headImgFileName.lastIndexOf("."));

					FileUtils.copyFile(headImg, new File(filePath,fileName));
					//2、设置用户头像路径
					user.setHeadImg("user/" + fileName); 
				}
//				userService.save(user);
				userService.saveUserAndRole(user,userRoleIds);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "list";
	}

	//跳转到编辑页面
	public String editUI()
	{
		//加载角色列表
		ActionContext.getContext().getContextMap().put("roleList", roleService.findAll());
		if(user != null && user.getId() != null)
		{
			user = userService.findById(user.getId());
			//处理角色回显
			List<UserRole> list = userService.findUserRolesByUserId(user.getId());
			if(list != null && list.size()>0){
				userRoleIds = new String[list.size()];
				for(int i=0;i<list.size();i++){
					userRoleIds[i] = list.get(i).getId().getRole().getRoleId();
				}
			}
		}
		return "editUI";
	}

	//保存编辑
	public String edit()
	{
		try {
			if(user != null)
			{
				//更新用户头像信息
				if(headImg != null)
				{
					//1、保存头像到upload/user
					String filePath = ServletActionContext.getServletContext().getRealPath("upload/user/");
					String fileName = UUID.randomUUID().toString().replaceAll("-", "") + headImgFileName.substring(headImgFileName.lastIndexOf("."));

					FileUtils.copyFile(headImg, new File(filePath,fileName));
					//2、设置用户头像路径
					user.setHeadImg("user/" + fileName); 
				}
				userService.updateUserAndUserRole(user,userRoleIds);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "list";
	}

	// {{ Properties
	public List<User> getUserList() {
		return userList;
	}
	public void setUserList(List<User> userList) {
		this.userList = userList;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}

	public File getHeadImg() {
		return headImg;
	}

	public void setHeadImg(File headImg) {
		this.headImg = headImg;
	}

	public String getHeadImgContentType() {
		return headImgContentType;
	}

	public void setHeadImgContentType(String headImgContentType) {
		this.headImgContentType = headImgContentType;
	}

	public String getHeadImgFileName() {
		return headImgFileName;
	}

	public void setHeadImgFileName(String headImgFileName) {
		this.headImgFileName = headImgFileName;
	}

	public File getUserExcel() {
		return userExcel;
	}

	public void setUserExcel(File userExcel) {
		this.userExcel = userExcel;
	}

	public String getUserExcelContentType() {
		return userExcelContentType;
	}

	public void setUserExcelContentType(String userExcelContentType) {
		this.userExcelContentType = userExcelContentType;
	}

	public String getUserExcelFileName() {
		return userExcelFileName;
	}

	public void setUserExcelFileName(String userExcelFileName) {
		this.userExcelFileName = userExcelFileName;
	}
	public String[] getUserRoleIds() {
		return userRoleIds;
	}
	public void setUserRoleIds(String[] userRoleIds) {
		this.userRoleIds = userRoleIds;
	}

	// }}
}

addUI.jsp页面中的角色部分

<s:checkboxlist name="userRoleIds" list="#roleList" listKey="roleId" listValue="name"></s:checkboxlist>

editUI.jsp页面中的角色部分

<s:checkboxlist name="userRoleIds" list="#roleList" listKey="roleId" listValue="name"></s:checkboxlist>

3、service层

UserService.java

	void saveUserAndRole(User user, String... userRoleIds);
	List<UserRole> findUserRolesByUserId(Serializable userId);
	void updateUserAndUserRole(User user, String... roleIds);	

UserServiceImpl.java

	public void saveUserAndRole(User user, String... roleIds) {
		userDao.save(user);
		if(roleIds != null && roleIds.length>0){
			for(String roleId : roleIds){
				Role role = new Role(roleId);
				UserRole userRole = new UserRole(new UserRoleId(role, user.getId()));
				userDao.saveUserRole(userRole);
			}
		}
	}

	public List<UserRole> findUserRolesByUserId(Serializable userId) {
		return userDao.findUserRolesByUserId(userId);
	}

	public void updateUserAndUserRole(User user, String... roleIds) {
		//1、更新用户信息
		update(user);
		//2、更新用户角色信息
		//2.1、删除用户原有的角色
		userDao.deleteUserRoleByUserId(user.getId());
		//2.2、为用户添加新的角色
		if(roleIds != null && roleIds.length>0){
			for(String roleId : roleIds){
				Role role = new Role(roleId);
				UserRole userRole = new UserRole(new UserRoleId(role, user.getId()));
				userDao.saveUserRole(userRole);
			}
		}
	}	

4、dao层

UserDao.java

	void saveUserRole(UserRole userRole);
	List<UserRole> findUserRolesByUserId(Serializable userId);
	void deleteUserRoleByUserId(Serializable userId);

UserDaoImpl.java

	public void saveUserRole(UserRole userRole) {
		getHibernateTemplate().save(userRole);
	}

	@SuppressWarnings("unchecked")
	public List<UserRole> findUserRolesByUserId(Serializable userId) {
		Query query = getSession().createQuery("from UserRole where id.userId=?");
		query.setParameter(0, userId);
		return query.list();
	}

	public void deleteUserRoleByUserId(Serializable userId) {
		Query query = getSession().createQuery("delete from UserRole where id.userId=?");
		query.setParameter(0, userId);
		query.executeUpdate();
	}
时间: 2024-12-13 11:22:57

SSH系列:(18)用户-角色管理的相关文章

七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理

注:本文为学习摘录,原文地址为:http://www.cnblogs.com/powertoolsteam/p/MVC_five.html 目录 实验22——添加页脚 实验23——实现用户角色管理 实验24——实现项目外观一致性 实验25——使用Action  过滤器让页眉和页脚代码更有效 总结 实验22——添加页脚 在本实验中,我们会在Employee 页面添加页脚,通过本实验理解分部视图. 什么是“分部视图”? 从逻辑上看,分部视图是一种可重用的视图,不会直接显示,包含于其他视图中,作为其视

扩展吉日嘎拉的用户角色管理,让用户角色编码和名称在一个组织里面唯一

吉日嘎拉的权限管理系统原功能中只是控制用户角色名称唯一,但实际使用中我更需要角色编码唯一不重复! 直接上代码,在Role的Add和Update方法中,增加如下代码: //检查角色Code是否重复 Troy.Cui 2016-08-17 List<KeyValuePair<string, object>> parametersCode = new List<KeyValuePair<string, object>>(); if (!string.IsNullO

(图解)用户表-角色表-用户角色关联表

 用户表/角色表 : 多对多关系         一个用户记录 可以 有多个角色/职位记录        一个角色/职位记录 可以 有多个用户记录    用户表 / 用户角色管理表 : 一对多关系  用户角色关联表 / 角色表: 多对一关系        一个用户记录 对应 多个关联记录, 一个关联记录 对应 一个角色记录(一个用户记录 对应 多个角色记录);        一个角色记录 对应 多个关联记录, 一个关联记录 对应 一个用户记录(一个角色记录 对应 多个 用户记录)     两个表

SSH系列:(17)角色-权限管理(前台JSP)

1.listUI.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head>     <%@include file="/common/header.jsp"%&

Oracle学习(四)之用户、权限、角色管理

Oracle 权限设置一.权限分类:系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言).实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图等数据库对象而言的). 二.系统权限管理:1.系统权限分类: DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构. RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构. CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构

Yii2系列教程五:简单的用户权限管理

上一篇文章讲了用户的注册,验证和登录,这一篇文章按照约定来说说Yii2之中的用户和权限控制. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步一步按照这个教程来做. 鉴于本教材基于Yii2 Basic,所以对RBAC的详细讲解我后面再单独出文章来说说吧,这里主要是简单地说一说权限控制 上一篇文章所实现的功能还比较简单,可以发一条状态,但是不知道你注意到没有,如果是没有注册的用户也可以使用我们的应用(类似小微博)来发状态,这是不符合情理的.正确的做法是在用户没有注册,登录

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理6

接下来先做角色这一板块的(增删改查),首先要新建一个Role控制器,在添加一个RoleList的视图.表格打算采用的是bootstrap的表格. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace AuthorDesign.Web.Areas.Admin.Controllers { public class Role

Oracle用户、授权、角色管理

创建和删除用户是Oracle用户管理中的常见操作,但这其中隐含了Oracle数据库系统的系统权限与对象权限方面的知识.掌握还Oracle用户的授权操作和原理,可以有效提升我们的工作效率. Oracle数据库的权限系统分为系统权限与对象权限.系统权限( Database System Privilege )可以让用户执行特定的命令集.例如,CREATE TABLE权限允许用户创建表,GRANT ANY PRIVILEGE 权限允许用户授予任何系统权限.对象权限( Database Object P

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求为一个具体的功能页面 /// </summary> public class AdminActionMethod : Attribute { /// <summary> /// 页面请求路径 /// </summary> public string ActionUrl {