本博客是以我的上一篇博客为基础的。
首先要在数据库新建两张表。其中一张表存储不同角色的用户,另一张表建立用户和用户角色之间的关系。首先是用户角色表tb_role,目前有两种类型分别为admin和user,表结构如下。
另一张表为user_role,该表建立用户和角色之间关系,表结构如下。
然后建立如下关系,显然userId 和roleId都是作为外键的存在。
然后在本地项目中的bean层中新建实体类Role和UserRole。
Role包含id和rolename属性,UserRole包含id、username、password属性(get、set方法、构造方法省略)。
package com.zr.bean;
public class Role {
private int id;
private String rolename;
}
package com.zr.bean;
public class User {
private int id;
private String username;
private String password;
}
首先是登录界面要进行修改,先要根据用户的id查询的用户的角色,不同的角色可以操作的界面是不同的,将用户的角色列表(一个用户可以包含多个角色)添加到session属性roleIds中,前端根据roleIds显示对不同类型的用户,显示该用户角色所能够使用的功能。
@RequestMapping("login.do")
public ModelAndView login(User user,HttpSession session){
int id = userService.login(user.getUsername(), user.getPassword());
ModelAndView modelAndView = new ModelAndView();
if(id !=-1){
List<Integer> roleIds = roleServive.findRoleByUserId(id);
session.setAttribute("roleIds",roleIds);
session.setAttribute("user",user);
modelAndView.setViewName("main");
}else {
modelAndView.setViewName("../failer");
}
return modelAndView;
}
添加用户权限请求发出,首先要查询到用户目前没有的权限,通过调用业务层roleServive,根据用户id查询用户还没有的权限(角色),由于有多个角色,所以需要用列表来存储返回的角色列表,然后利用setObject和setViewName将角色列表和用户id数据传递到前端界面。
当用户添加角色时,需要两个参数一个是角色的id(前端传多个id用,分隔),另个是用户的id,将添加的信息插入到url中,首先要将角色id字符串进行切分处理成,由于原来是字符串类型所以需要进行遍历并将转化成的int类型,并存储在新的List中(这是因为数据库中也是int类型),同时也要将用户id转化成int类型,接着调用业务层的roleService的addRole方法,将数据存储处理,最后回到用户管理界面。
@RequestMapping("toAddRole.do")
public ModelAndView toAddRole(int id){
List<Role> roleList = roleServive.findNotRoleByUserId(id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("roles",roleList);
modelAndView.setViewName("user-role-add");
modelAndView.addObject("id",id);
return modelAndView;
}
@RequestMapping("addRole.do")
public String addRole(String roleIds,String userId){
String[] strs = roleIds.split(",");
List<Integer> ids = new ArrayList<>();
for(String s:strs){
ids.add(Integer.parseInt(s));
}
roleServive.addRole(ids,Integer.parseInt(userId));
return "redirect:findAll.do";
}
业务层新增接口IRoleService用来处理用户角色,接口实现类RoleSeriveImpl,其中通过用户id获取用户角色列表,通过用户id查询用户未获得角色的列表,最后是添加用户角色,由于数据是列表的形式,这里通过遍历,进行添加。
package com.zr.service.impl;
import com.zr.bean.Role;
import com.zr.bean.UserRole;
import com.zr.dao.IRoleDao;
import com.zr.service.IRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RoleSeriveImpl implements IRoleService {
@Autowired
private IRoleDao roleDao;
@Override
public List<Integer> findRoleByUserId(int id) {
return roleDao.findRoleIdsByUserId(id);
}
@Override
public List<Role> findNotRoleByUserId(int id) {
return roleDao.findNotRoleByUserId(id);
}
@Override
public void addRole(List<Integer> ids,int userId) {
for(int i:ids){
UserRole userRole = new UserRole();
userRole.setRoleId(i);
userRole.setUserId(userId);
roleDao.addRole(userRole);
}
}
}
随后是dao层IRoleDao的实现,这里也只是接口,需要利用RoleMapper.xml执行sql语句。
package com.zr.dao;
import com.zr.bean.Role;
import com.zr.bean.UserRole;
import java.util.List;
public interface IRoleDao {
List<Integer> findRoleIdsByUserId(int id);
List<Role> findNotRoleByUserId(int id);
void addRole(UserRole userRole);
}
在mapper文件夹下,新增RoleMapper.xml文件,该文件是服务IRoleDao接口的,具体内容如下。
<?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="com.zr.dao.IRoleDao">
<select id="findRoleIdsByUserId" parameterType="int" resultType="int">
select roleId from user_role where userId = #{userId}
</select>
<select id="findNotRoleByUserId" parameterType="int" resultType="role">
select * from tb_role where id not in (select roleId from user_role where userId =#{id})
</select>
<insert id="addRole" parameterType="role">
insert into user_role(userId,roleId) value (#{userId},#{roleId})
</insert>
</mapper>
最后是前端的修改
在侧边工具栏,当用户角色中包含id 1即,admin角色,才能进行角色管理功能。
<%
List<Integer> roleIds = (List<Integer>) session.getAttribute("roleIds");
if(roleIds.contains(1)){
%>
<li id="system-setting1"><a
href="#"> <i
class="fa fa-circle-o"></i> 角色管理
</a></li>
<%
}
%>
添加用户角色时,将用户id传入。
最后是获取用户前端的参数,并将新增的信息通过href传递到后端。
function addRoles() {
var checkNum=$("input[name='roleId']:checked").length;
if(checkNum==0){
alert("请至少选择1个角色添加");
return;
}
if(confirm("你确认要添加这些角色吗?")){
var roleList=new Array();
$("input[name='roleId']:checked").each(
function () {
roleList.push($(this).val())
}
);
var userId=$("input[name='userId']").val()
location.href="/user/addRole.do?roleIds="+roleList.toString()+"&userId="+userId;
}
}
代码已上传GitHub,由于git使用还不是很熟,一些文件没有上传的都补上了。