ssm订单管理系统3-用户管理操作

java通关整理汇总-Java基础、计算机网络、数据库、设计模式、框架、算法模板、笔试


ssm订单管理系统1-数据库表结构和mysql语句
ssm订单管理系统2-订单详情操作
ssm订单管理系统3-用户管理操作
ssm订单管理系统4-角色管理操作


3. 用户管理

3.1 用户登录
3.1.1 spring security

Spring Security快速入门、自定义页面、退出-配置篇

3.2 用户退出
  • spring-security.xml配置中添加配置
  • 指定退出请求的路径/logout.do
  • 指定退出成功后返回的页面/login.jsp
        <!-- 退出 -->
        <security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />
  • 在(自定义页面)退出/注销的按钮上添加路径:绝对路径+/logout.do

在这里插入图片描述

  • 然后在自定义页面中点击注销按钮,就完成退出操作
  • 返回登录页面
    在这里插入图片描述
3.3 查询所有用户
  • 需要在webapp/pages下添加user-list.jsp页面~~(在我的资料里面)~~
    在这里插入图片描述
3.3.1 Controller
  • UserController
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @RequestMapping("/findAll.do")
    public ModelAndView findAll() throws Exception {
        ModelAndView mv = new ModelAndView();
        List<UserInfo> userList = userService.findAll();
        //在user-list.jsp中找到使用到userList的名字
        mv.addObject("userList",userList);
        //表示跳转的user-list.jsp页面,需要添加
        mv.setViewName("user-list");

        return mv;
    }
}
3.3.2 Service
  • 需要在Service中实现findAll()方法

  • IUserService

public interface IUserService extends UserDetailsService {
    List<UserInfo> findAll() throws  Exception;
}
  • UserServiceImpl
  • 自动注入userDao
    @Override
    public List<UserInfo> findAll() throws Exception {
        return userDao.findAll() ;
    }
3.3.3 Dao
  • 需要在Dao中实现findAll()方法
  • IUserDao
    @Select("select * from users")
    List<UserInfo> findAll() throws Exception;
3.3.4 处理状态信息
  • 点击订单管理,页面展示

在这里插入图片描述

  • 这是因为我们在数据库中只有status的信息,在展示时,我们希望用statusStr展示,所以需要根据status的值设置statusStr
    private int status;
    private String statusStr;
  • user-list.jsp展示页面

在这里插入图片描述

  • domain中的UserInfo的get方法
    public String getStatusStr() {
        // 0-未开启    1-已开启
        if (status == 0) {
            statusStr = "未开启";
        } else if (status == 1) {
            statusStr = "开启";
        }
        return statusStr;
    }
3.3.5 启动服务器
  • 点击订单管理,页面展示

在这里插入图片描述

3.4 用户添加
  • 需要在webapp/pages下添加user-add.jsp页面~~(在我的资料里面)~~
    在这里插入图片描述
  • user-add.jsp页面表单
  • 所以需要在controller中创建一个/user/save.do
<form action="${pageContext.request.contextPath}/user/save.do"
3.4.1 Controller
  • UserController
    //用户添加
    @RequestMapping("/save.do")
    public String  save(UserInfo userInfo){
        userService.save(userInfo);
        return "redirect:findAll.do";
    }
3.4.2 Service
  • 需要在Service中实现save()方法

  • IUserService

void save(UserInfo userInfo) throws Exception;
  • UserServiceImpl
  • 自动注入userDao
    @Override
    public void save(UserInfo userInfo)  throws Exception{
        userDao.save(userInfo);
    }
3.4.3 Dao
  • 需要在Dao中实现save(userInfo)方法
  • IUserDao
  • value(REPLACE(UUID(),"-","")表示的是自动生成uuid值0主键,因为在表设计的时候我没有设计为自动生成,需要非空
    @Insert("insert into user(id, email,username,password,phoneNum,status) " +
            "value(REPLACE(UUID(),\"-\",\"\"),#{email},# {username},#{password},#{phoneNum},#{status})")
    void save(UserInfo userInfo) throws Exception;
3.4.4 往数据库添加的密码需要加密

spring-security.xml中声明加密的类

    <!-- 配置加密类 -->
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
- `BCryptPasswordEncoder`可以作为一个类直接使用

第一种加密方法:

  • UserServiceImpl
	@Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private IUserDao userDao;

    @Override
    public void save(UserInfo userInfo)  throws Exception{
        //对密码进行加密处理
        userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
        userDao.save(userInfo);
    }

第二种加密方法:工具类

 @Override
    public void save(UserInfo userInfo)  throws Exception{
        //对密码进行加密处理
        userInfo.setPassword(BCryptPasswordEncoderUtils.encodePassword(userInfo.getPassword()));
        userDao.save(userInfo);
    }
  • BCryptPasswordEncoderUtils工具类

public class BCryptPasswordEncoderUtils {
    private static BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
    public static String encodePassword(String password){
        return bCryptPasswordEncoder.encode(password);
    }

    public static void main(String[] args) {
        String password="123";
        String pwd = encodePassword(password);
        //$2a$10$tJHudmJh6MRPdiL7mv0yfe0nZJbDHuhl7sSTnqNC4DauMik9ppi4K
        //$2a$10$Ce8LB3jdYDZ2f6HB281zA.4eC7v6ziJdK8MMWg0Yu8ETMg5ToMpIe
        System.out.print(pwd.length());
    }
}

3.4.5 启动服务器
  • 点击订单管理,新建用户,页面展示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
3.4.6 密码加密后,如何处理用户登录问题
  • 因为此时的密码时加密存储在数据库中,所以直接用新建的用户密码登录是不成功的。

1.打开spring-security.xml中的加密方式配置

        <security:authentication-provider user-service-ref="userService">
            <!-- 配置加密的方式 -->
            <security:password-encoder ref="passwordEncoder"/>
        </security:authentication-provider>

2.在UserServiceImpl中密码设置中删除"{noop}"

  • 加上表示明文方式

对比修改前后

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

3.然后就可以根据新建的用户密码登录了

  • 原来在数据库中直接添加的用户密码无法登录,因为没有加密,也就不能解密
  • 可以用加密工具类BCryptPasswordEncoderUtils将密码手动更新加密
3.5 用户详情查询

在这里插入图片描述

  • 在用户管理user-list.jsp的页面,点击用户后的详情,就可以查询到用户的详情信息
  • 给详情添加链接-------/user/findById.do所以我们要在Controller编写中编写/user/findById.do
  • 注意:这里传入的id名需要和方法中的命名相同
<a href="${pageContext.request.contextPath}/user/findById.do?id=${user.id}" class="btn bg-olive btn-xs">详情</a>
3.5.1 Controller
  • UserController
    1、mv.setViewName("user-show1")表示跳转的页面
    2、mv.addObject("user",userInfo)表示将查询到的userInfo信息封装到user中,具体的命名需要查看跳转页面
    //根据用户Id查询用户的详情信息
    @RequestMapping("/findById.do")
    public ModelAndView findById(String id) throws  Exception{
        ModelAndView mv = new ModelAndView();
        UserInfo userInfo = userService.findById(id);
        mv.addObject("user",userInfo);
        mv.setViewName("user-show1");

        return mv;
    }
3.5.2 Service
  • 需要在Service中实现findAll()方法

  • IUserService

UserInfo findById(String id) throws Exception;
  • UserServiceImpl
    @Override
    public UserInfo findById(String id) throws Exception {

        return userDao.findById(id);
    }
3.5.3 Dao
  • 需要在Dao中实现findById()方法
  • IUserDao
    1、因为用户的详情需要包括用户的角色(USER/ADMIN),还有权限(可以访问那些页面),所以需要将查询数据处理一下
    2、中间表:用户_角色表、角色_权限表
    3、到IRoleDao中寻找findRoleByUserId方法,通过用户查找用户角色
    @Select("select * from users where id=#{userId}")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "username", column = "username"),
            @Result(property = "email", column = "email"),
            @Result(property = "password", column = "password"),
            @Result(property = "phoneNum", column = "phoneNum"),
            @Result(property = "status", column = "status"),
            @Result(property = "roles", column = "id", javaType = java.util.List.class, many = @Many(select = "com.itheima.ssm.dao.IRoleDao.findRoleByUserId"))
    })
    UserInfo findById(String userId) throws Exception;
  • IRoleDao
public interface IRoleDao {
    //根据用户id查找对应的角色
    @Select("select * from role where id in (select roleId from users_role where userId = #{userId})")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "roleName",column = "roleName"),
            @Result(property = "roleDesc",column = "roleDesc"),
            @Result(property = "permissions",column = "id",javaType = java.util.List.class,many = @Many(select = "com.itheima.ssm.dao.IPermissionDao.findPermissionByRoleId"))
    })
    public List<Role> findRoleByUserId(String userId) throws Exception;
}

4、到IPermissionDao中寻找findPermissionByRoleId方法,通过角色查找权限

    @Select("select * from permission where id in (select permissionId from role_permission where roleId=#{id})")
    public List<Permission> findPermissionByRoleId(String id) throws Exception;
3.5.4 编写uesr-show用户详情展示页面
3.5.5 启动服务器
  • 点击详情,页面展示
    在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45773603/article/details/108430974