学习内容
今天是用户管理系统的最后一天的学习。今天主要是实现角色管理功能。角色分为管理员和用户。点击用户列表右边的添加角色,可以进入到user-update.jsp页面,从而给用户添加角色。
首先,在数据库中新建表tb_role和表user_role。表tb_role中有三个字段:(int) id、 (varchar) rolename、(rvarchar) roledesc。id为1角色为管理员admin,id为2角色为用户user。表user_role中只有两个字段,分别为userId和roleId,分别对象表tb_user和tb_role的id字段。
创建了数据库表之后,建立对应的实体类
package com.zr.bean;
public class Role {
private int id;
private String rolename;
private String roledesc;
public Role(){}
public Role(int id, String rolename, String roledesc) {
this.id = id;
this.rolename = rolename;
this.roledesc = roledesc;
}
public void setId(int id) {
this.id = id;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public void setRoledesc(String roledesc) {
this.roledesc = roledesc;
}
public int getId() {
return id;
}
public String getRolename() {
return rolename;
}
public String getRoledesc() {
return roledesc;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", rolename='" + rolename + '\'' +
", roledesc='" + roledesc + '\'' +`
'}';
}
}
package com.zr.bean;
public class UserRole {
private int userId;
private int roleId;
public void setUserId(int userId) {
this.userId = userId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public int getUserId() {
return userId;
}
public int getRoleId() {
return roleId;
}
@Override
public String toString() {
return "UserRole{" +
"userId=" + userId +
", roleId=" + roleId +
'}';
}
}
先来改写登录,期望得到的结果是,管理员登陆进去之后能显示角色管理,但是普通用户登录就不显示角色管理。则需要在登陆的时候通过id来确定角色。通过userServiceImpl的login()方法来得到id,再通过该id在user_role里查找roleId,来确定角色。
@RequestMapping("login.do")
public ModelAndView login(User user,HttpSession session){
//调用service层
//视图解析器
//得到id.判断角色
int id= userService.login(user.getUsername(),user.getPassword());
ModelAndView modelAndView = new ModelAndView();
if(id!=-1){
//跳转到成功页面
//根据id去user_role表里边查角色,得到id的集合
List<Integer> roleIds=roleService.findRoleByUserId(id);
//放置用户信息
session.setAttribute("user",user);
session.setAttribute("roleIds",roleIds);
modelAndView.setViewName("main");
}else{
modelAndView.setViewName("../failer");
}
return modelAndView;
}
userServiceImpl的login()方法改写为:
@Override
public int login(String username, String password) {
User user = userDao.findUserByname(username);
if(user!=null&&user.getPassword().equals(password)){
return user.getId();
}
return -1; //表示用户不存在
}
同时在dao层新建IRoleDao,在service层新建IRoleService接口和相对应的实现类。其他实现和之前的类似。
在登录部分添加了权限之后,接下来实现给添加角色功能。
在主页面点击“添加角色”进入到user-role-add.jsp页面,首先在controller层实现这个页面跳转。
@RequestMapping("toAddRole.do")
public ModelAndView toAddRole(int id){
//根据id把没有的角色查出来
//查询出来一个集合
List<Role> roleList= roleService.findNotRoleByUserId(id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("roles",roleList);
modelAndView.setViewName("user-role-add");
modelAndView.addObject("id",id);
return modelAndView;
}
service层调用的是dao层,IRoleDao中的接口List findNotRoleByUserId(int id);在RoleMapper.xml中的SQL语句:
<select id="findNotRoleByUserId" parameterType="int" resultType="role">
select * from tb_role where id not in (select roleId from user_role where userId = #{id})
</select>
添加角色页面如下所示,页面上显示的是不存在的角色,可以自行添加。
这一部分显示出来之后,接下来做的就是添加角色。勾选了角色之后,点击保存,则成功地给该用户添加了一个角色。在user-role-add.jsp文件中找到“保存”按钮,发现此按钮点击事件对应的是addRole()方法。
<div class="box-tools text-center">
<button type="button" class="btn bg-maroon" onclick="addRoles()">保存</button>
<button type="button" class="btn bg-default"
onclick="history.back(-1);">返回</button>
</div>
在下边的js代码中找到该方法,通过location.href="/user/addRole.do?roleIds="+roleList.toString()+"&userId="+userId;来获得用需要添加的角色的id(存在List集合中)和用户id,在controller层调用service层的addRole,将roleId,userId封装到UserRole的对象中
以下是controller层的代码,因为可能会同时添加多个角色,则就会有多个roleId,通过逗号分隔。
@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));//强转
}
roleService.addRole(ids,Integer.parseInt(userId));
return "redirect:findAll.do";
}
以下是service层的代码:
@Override
public void addRole(List<Integer> ids,int userId) {
///需要一条一条的添加
for(int i:ids){
UserRole userRole = new UserRole();
//把值塞进去给对象
userRole.setRoleId(i);
userRole.setUserId(userId);
//调用dao层插入到数据库
//应该插入到表user_role里边
roleDao.insertRole(userRole);
}
}
最后一步,就是将添加的角色保存到数据库表user_role中,在RoleMapper.xml中SQL语句:
<insert id="insertRole" parameterType="com.zr.bean.UserRole">
insert into user_role(userId,roleId) values (#{userId},#{roleId})
</insert>
上边的页面:用户wawa的角色是user,所以点击添加角色之后出现的只有admin,现在将admin角色添加给wawa用户。
确认添加之后,再次回到用户列表页面,点击wawa后边对应的“添加角色”,这个时候,添加啊角色这里已经不显示任何角色了。因为wawa有两个角色:user和admin.
此时数据库表user_role中也可以看到,userId为3的用户有两个角色,roleId有1和2
今天的学习就结束了~
总结
今天把小组项目的注册、登录和订单管理实现了。在实现的过程中也出现了一些问题,但是几乎都是之前上课的时候出现过的问题,所以也能知道是错在哪里了,知道怎么去解决。也有平时没有遇到的问题,就去搜了一下,实在解决不了的去问了老师,老师也非常有耐心的帮我解答。今天的任务还是比较多了,除了要消化上课讲的,看上课写的代码还要写小组项目,虽然任务很多,但是很充实,改bug的过程是很烦躁的,但是改出来之后的那种成就感超级棒!