首页 > 其他分享 >SSM综合案例之角色管理实战

SSM综合案例之角色管理实战

时间:2022-10-24 12:02:35浏览次数:82  
标签:实战 users int id SSM 案例 role rid public

一、课程目标

1. 【掌握】角色管理功能
2. 【掌握】用户管理功能

二、角色管理

2.1 查询角色

编写RoleMapper接口

//查询所有角色
@Select("select * from role")
public List<Role> selectAll();

编写RoleService

public interface RoleService {
//查询所有角色
public List<Role> findAll();
}
@Service("roleService")
public class RoleServiceImpl implements RoleService {
@Autowired
RoleMapper roleMapper;
@Override
public List<Role> findAll() {
return roleMapper.selectAll();
}
}

编写RoleController

@Controller
@RequestMapping("/role")
public class RoleController {
@Autowired
RoleService roleService;

/*
* 查询所有数据
* param request page limit
* */
@RequestMapping("/findAll")
public String findAll(HttpServletRequest request, @RequestParam(value = "page",required = false,defaultValue = "1") int page, @RequestParam(value = "limit",required = false,defaultValue = "5")int limit){
PageHelper.startPage(page,limit);
List<Role> all = roleService.findAll();
PageInfo<Role> pageInfo=new PageInfo<>(all);
request.setAttribute("pageInfo",pageInfo);
return "/role/role-list";
}
}

测试

2.2 角色添加

编写RoleMapper接口

//添加角色信息
@Insert("insert into role(roleName,roleDesc)values(#{roleName},#{roleDesc})")
public int insert(Role role);

编写RoleService

//添加角色信息
public int add(Role role);
@Override
public int add(Role role) {
return roleMapper.insert(role);
}

编写RoleController

@RequestMapping(value = "/add",method = RequestMethod.GET)
public String toAdd(){
return "/role/role-add";
}
@RequestMapping(value = "/add",method = RequestMethod.POST)
public String add(Role role){
roleService.add(role);
return "redirect:/role/findAll";
}

测试

2.3 角色修改

编写RoleMapper接口

//根据角色id查询角色信息
@Select("select * from role where id=#{id}")
public Role selectById(int id);

//修改角色信息
@Update("update role set roleName=#{roleName},roleDesc=#{roleDesc} where id=#{id}")
public int update(Role role);

//查询角色权限管理表中当前角色拥有的权限id集合
@Select("select permissionId from role_permission where roleId=#{rid}")
public List<Integer> selectAllPermissionId(int rid);


//删除关联表中当前账号信息
@Delete("delete from role_permission where roleId=#{rid}")
public int deletePermissionByRId(int rid);

//添加关联数据
public int addPermissionByList(@Param("rid") Integer rid, @Param("ids") List<Integer> ids);
<?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.yunhe.mapper.RoleMapper">
<insert id="addPermissionByList" >
insert into role_permission (roleId,permissionId) values
<foreach collection="ids" item="pid" separator=",">
(#{rid},#{pid})
</foreach>
</insert>
</mapper>

编写RoleService

//根据角色id查询角色信息
public Role findById(int id);

//修改角色信息
public int edit(Role role);

//查询指定角色响应的权限信息
public List<Integer> findPermissionByRid(int rid);


//为指定角色添加权限信息
public void permissionAdd(Integer rid,List<Integer> ids);
@Override
public Role findById(int id) {
return roleMapper.selectById(id);
}

@Override
public int edit(Role role) {
return roleMapper.update(role);
}

@Override
public List<Integer> findPermissionByRid(int rid) {
return roleMapper.selectAllPermissionId(rid);
}

@Override
@Transactional
public void permissionAdd(Integer rid, List<Integer> ids) {
//先删除关联表中当前角色对应的所有权限
roleMapper.deletePermissionByRId(rid);
//使用集合在权限管理表中添加数据
roleMapper.addPermissionByList(rid,ids);

}

编写RoleController

@RequestMapping(value = "/edit",method = RequestMethod.GET)
public String findById(HttpServletRequest request,int id){
Role role = roleService.findById(id);
request.setAttribute("role",role);
return "/role/role-edit";
}

@RequestMapping(value = "/edit",method = RequestMethod.POST)
public String edit(Role role){
roleService.edit(role);
return "redirect:/role/findAll";
}

@RequestMapping(value = "/permissionAdd",method = RequestMethod.GET)
public String toPermissionsAdd(HttpServletRequest request,int id){
//先查询当前角色拥有的权限
List<Integer> permissionIdList = roleService.findPermissionByRid(id);
//将当前角色拥有的权限发送
request.setAttribute("permissionIdList",permissionIdList);
//查询所有权限数据
List<Permission> permissionList = permissionService.findAll();
//将所有权限发送
request.setAttribute("permissionList",permissionList);

request.setAttribute("roleId",id);

return "/role/role-edit-permission";
}

@RequestMapping(value = "/permissionAdd",method = RequestMethod.POST)
@ResponseBody
public String toPermissionsAdd(@RequestBody Role_Pid ids){
roleService.permissionAdd(ids.getRid(),ids.getIds());
return "/role/findAll";
}

测试

2.4 角色详情

编写RoleMapper接口

//查询指定角色与权限信息
public Role selectRole(int rid);
<resultMap id="u_r" type="com.yunhe.javabean.Role" autoMapping="true">
<id column="id" property="id"></id>
<collection property="permissions" autoMapping="true" ofType="com.yunhe.javabean.Permission">
<id column="pid" property="id"></id>

</collection>
</resultMap>

<select id="selectRole" resultMap="u_r">
select r.*,p.id pid,p.permissionName,p.url from role r, role_permission rp, permission p where r.id=rp.roleId and p.id=rp.permissionId and r.id=#{id}
</select>

编写RoleService

//角色权限关联查询
public Role findRole(int id);
@Override
public Role findRole(int id) {
return roleMapper.selectRole(id);
}

编写RoleController

@RequestMapping(value = "/show")
public String show(HttpServletRequest request,int id){
Role role = roleService.findRole(id);
request.setAttribute("role",role);
return "/role/role-show";
}

测试

2.5 角色删除

编写RoleMapper接口

//删除角色信息
@Delete("delete from role where id=#{id}")
public int deleteById(int id);

编写RoleService

//删除角色信息
public int deleteById(int id);
@Override
public int deleteById(int id) {
return roleMapper.deleteById(id);
}

编写RoleController

@RequestMapping(value = "/delete")
public String delete(int id){
roleService.deleteById(id);
return "redirect:/role/findAll";
}

测试

三、用户管理

3.1 查询用户

编写UserMapper接口

public interface UserMapper {
//查询所有用户信息(包含权限)
public List<Users> selectAllUser();
}
<resultMap id="u_r" type="com.yunhe.javabean.Users" autoMapping="true">
<association property="role" javaType="com.yunhe.javabean.Role" autoMapping="true">
<id column="roleId" property="id"/>
</association>
</resultMap>

<select id="selectAllUser" resultMap="u_r">
select u.*,ur.roleId,r.roleName,r.roleDesc from users u,users_role ur, role r where u.id=ur.userId and r.id=ur.roleId
</select>

编写UserService

public interface UserService extends UserDetailsService {

/**
* 查询所有用户
* @return
*/
public List<Users> findAllUser();
}
@Service("userService")
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

/**
* 查询所有用户
* @return
*/
@Override
public List<Users> findAllUser() {
return userMapper.selectAllUser();
}
}

编写UserController

@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
UserService userService;
@Autowired
RoleService roleService;//之后查询角色信息使用

@RequestMapping("/findAll")
public String findAll(HttpServletRequest request, @RequestParam(value = "page",required = false,defaultValue = "1") int page, @RequestParam(value = "limit",required = false,defaultValue = "5")int limit){
PageHelper.startPage(page,limit);
List<Users> allUser = userService.findAllUser();
PageInfo<Users> pageInfo=new PageInfo<>(allUser);
request.setAttribute("pageInfo",pageInfo);
return "/users/users-list";
}
}

测试

3.2 用户添加

编写UserMapper接口

//添加用户数据
public int insert(Users users);
//添加用户角色关联表数据
//将关联表中指定userid对应的roleid添加
@Insert("insert into users_role (userId,roleId)values(#{uid},#{rid})")
public int InsertUserRole(@Param("uid") int uid,@Param("rid") int rid);
<insert id="insert" parameterType="com.yunhe.javabean.Users" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert users (username,password,email,phoneNum,status)values(#{username},#{password},#{email},#{phoneNum},#{status})
</insert>

编写UserService

public interface UserService extends UserDetailsService {
/**
* 新增用户
* @param users rid
*/
public boolean add(Users users,int rid);
}
@Override
@Transactional
public boolean add(Users users,int rid) {
//添加数据前将密码加密
users.setPassword(passwordEncoder.encode(users.getPassword()));

//向用户表中添加数据
userMapper.insert(users);
//向用户角色关联表中添加数据
userMapper.InsertUserRole(users.getId(),rid);
return true;
}

注意事项:

在添加用户时,我们还要将用户的密码,进行加密操作,在SpringSecurity中已经帮我们提供了实现,直接使用即可!

在【spring-securiyt.xml】中我们配置​​BCryptPasswordEncoder​​;加密类

<!-- 在xml配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

编写UserController

@RequestMapping(value = "/add",method = RequestMethod.GET)
public String toAdd(HttpServletRequest request){
//查询角色列表数据
List<Role> roleList = roleService.findAll();
request.setAttribute("roleList",roleList);
return "/users/users-add";
}

@RequestMapping(value = "/add",method = RequestMethod.POST)
public String add(Users users,int roleId){
userService.add(users,roleId);
return "redirect:/users/findAll";
}

测试

3.3 用户删除

编写UserMapper接口

//添加用户数据
public int insert(Users users);
//添加用户角色关联表数据
//将关联表中指定userid对应的roleid添加
@Insert("insert into users_role (userId,roleId)values(#{uid},#{rid})")
public int InsertUserRole(@Param("uid") int uid,@Param("rid") int rid);
<insert id="insert" parameterType="com.yunhe.javabean.Users" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert users (username,password,email,phoneNum,status)values(#{username},#{password},#{email},#{phoneNum},#{status})
</insert>

编写UserService

public interface UserService extends UserDetailsService {
/**
* 新增用户
* @param users rid
*/
public boolean add(Users users,int rid);
}
@Override
@Transactional
public boolean add(Users users,int rid) {
//添加数据前将密码加密
users.setPassword(passwordEncoder.encode(users.getPassword()));

//向用户表中添加数据
userMapper.insert(users);
//向用户角色关联表中添加数据
userMapper.InsertUserRole(users.getId(),rid);
return true;
}

注意事项:

在添加用户时,我们还要将用户的密码,进行加密操作,在SpringSecurity中已经帮我们提供了实现,直接使用即可!

在【spring-securiyt.xml】中我们配置​​BCryptPasswordEncoder​​;加密类

<!-- 在xml配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

编写UserController

@RequestMapping(value = "/add",method = RequestMethod.GET)
public String toAdd(HttpServletRequest request){
//查询角色列表数据
List<Role> roleList = roleService.findAll();
request.setAttribute("roleList",roleList);
return "/users/users-add";
}

@RequestMapping(value = "/add",method = RequestMethod.POST)
public String add(Users users,int roleId){
userService.add(users,roleId);
return "redirect:/users/findAll";
}

测试

3.4 问题处理

问题一:之前账号不能登录

用户的添加功能已经实现,当我们使用新添加的用户名进行登录时发现没办法登录的。

原因是,我们的密码是进行加密的,要登录时要对密码进行解密,在UserService中将查询到的UserInfo封装到了User对象中,此处我们有一段代码也是要修改,将​​{noop}​​给删掉

User user = new User(userInfo.getUsername(),
// "{noop}"+userInfo.getPassword(),
userInfo.getPassword(),
userInfo.getStatus() == 0 ? false : true ,
true,true,true,
getAuthority(userInfo.getRoles()));

最后我们在spring-security.xml配置文件中也要进行配置

此时我们再进行测试,看是否能登录成功!!! 哈哈已经登录成功了

问题二:对jack密码进行加密

但是问题也就出现了,原来的jack用户名没办法登录了,原因是我们之间用的是明文进行登录的,密码没有进行加密,我们可以进行手动的进行加密把jack的密码给改一下即可!

编写​​BCryptPasswordEncoderUtil​​工具类

public class BCryptPasswordEncoderUtil {

private static BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

public static String encoderPassword(String password){
String encoderPasswordStr = bCryptPasswordEncoder.encode(password);
return encoderPasswordStr;
}


public static void main(String[] args) {
String s = encoderPassword("123");
System.out.println(s);
}
}

问题三:登录页面账号名称显示

可以修改配置文件中认证成功后转发地址,设置为自定义的请求

然后再响应位置书写代码获取主体中认证成功的账号信息,存入session跳转成功页面即可

//....一级目录/users
@RequestMapping("/name")
public String getUsername(HttpServletRequest request){
SecurityContext context = SecurityContextHolder.getContext();
UserDetails userDetails= (UserDetails)context.getAuthentication().getPrincipal();
request.getSession().setAttribute("username",userDetails.getUsername());
return "main";
}

标签:实战,users,int,id,SSM,案例,role,rid,public
From: https://blog.51cto.com/teayear/5784660

相关文章

  • 《技术管理实战36讲》学习总结
    前言对于互联网技术人来说,“带团队”不再是一个可选项,而是迟早都要面对的事儿。做技术和带团队,更像是职业发展的两条腿,而不是完全叉开的两条路。-----摘自技术管理实战......
  • 互联互通云设备检查案例
    一、背景当下,越来越多的企业选择业务数据上云。不可否认数据上云后,增强了扩展的便利性,但是同时也提高了运维管理的难度。如何实现云上业务管理,是运维工程师们面临的新问题。......
  • 在线问题反馈模块实战(十六)​:实现查详情功能
    ......
  • AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计
    AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理和区块链技术的乘客智能报警系统》案例的界面简介、功能介绍分......
  • 实战OpenGl绘制三角形
    片段着色器操作glClearColor(1.0f,1.0f,1.0f,1.0f);指定将颜色缓冲清空为什么颜色,参数为对应的RGBA值,该步骤只是设置属性glClear(GL_COLOR_BUFFER_BIT);真正将颜色缓冲......
  • 瑞吉外卖实战项目全攻略——第六天
    瑞吉外卖实战项目全攻略——第六天该系列将记录一份完整的实战项目的完成过程,该篇属于第六天案例来自B站黑马程序员Java项目实战《瑞吉外卖》,请结合课程资料阅读以下内容......
  • 瑞吉外卖实战项目全攻略——第六天
    瑞吉外卖实战项目全攻略——第六天该系列将记录一份完整的实战项目的完成过程,该篇属于第六天案例来自B站黑马程序员Java项目实战《瑞吉外卖》,请结合课程资料阅读以下内容......
  • 23、ssm整合回顾-spring层
    1、spring-dao.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XM......
  • CSS-属性2-盒子模型和CSS-案例-注册页面
    CSS-属性2-盒子模型盒子模型:控制布局margin:外边距pdding:内边距默认情况下内内边距会影响整个盒子的大小box-sizing:border-box;设置盒子的属性,让width和h......
  • JDBC练习_登录案例与第7节 JDBC事务管理
    JDBC练习_登录案例通过键盘录入用户名和密码判断用户是否登录成功select*fromuserwhereusername=“”andpassword=“”;如果这个sql有查询结果,则成功,......