Spring Boot + Mybatis Plus实现登录注册

Spring Boot 实现登录注册

1. 注册

业务逻辑

  1. 客户端输入注册时需要的用户参数,比如:账户名、密码、确认密码、其他
  2. 服务端接收到客户端的请求参数进行校验,然后判断是否有误,有误的地方就将错误信息抛出
  3. 将密码进行加密之后存储到数据库中,切记不能以明文的方式存入
  4. 返回用户的id作为注册成功之后的返回信息

具体实现 + 代码

  1. controller 层

    • 封装请求参数 UserRegisterRequest
    • 判断请求参数是否为空
    • 调用service的注册方法将请求参数传递给注册方法
    @PostMapping("/register")
        public BaseResponse<Long> userRegister(@RequestBody UserRegisterRequest userLoginRequest) {
            if(userLoginRequest == null) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR);
            }
            String userAccount = userLoginRequest.getUserAccount();
            String userPassword = userLoginRequest.getUserPassword();
            String checkPassword = userLoginRequest.getCheckPassword();
            if(StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR);
            }
            long result = userService.userRegister(userAccount, userPassword, checkPassword);
            return ResultUtils.success(result);
        }
    
  2. service 层

    • 判断请求参数对象是否为空 使用 StringUtils工具进行判断[需要下载org.apache.commons-lang3依赖]
    • 校验参数:
      • 账户名长度 < 3
      • 密码长度 < 4
      • 密码和确认密码是否相等
      • 用户名、密码、确认密码是否为空
    • 创建一个查询对象来确保账户是唯一的不能重复注册
    • 密码加密
    • 创建一个user对象,将用户信息存储到数据库中
    @Override
        public long userRegister(String userAccount, String userPassword, String checkPassword) {
            if(StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR);
            }
            if(userAccount.length() < 3) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "账户名长度太短");
            }
            if(userPassword.length() < 4) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码长度太短");
            }
            if(!userPassword.equals(checkPassword)) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "校验密码不相等");
            }
            // 加锁防止恶意注册操作
            synchronized (userAccount.intern()) {
                QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("userAccount", userAccount);
                Long count = this.baseMapper.selectCount(queryWrapper);
                if (count > 0) {
                    throw new BusinessException(ErrorCode.PARAMS_ERROR, "该账号已注册");
                }
                String newUserPassword = DigestUtils.md5DigestAsHex((SLAT + userPassword).getBytes());
                User user = new User();
                user.setUserAccount(userAccount);
                user.setUserPassword(newUserPassword);
                boolean save = this.save(user);
                if (!save) {
                    throw new BusinessException(ErrorCode.OPERATION_ERROR, "用户注册失败");
                }
                return user.getId();
            }
        }
    
  3. 测试

    image-20240606111153586

    通过观察服务器的响应,可以看到当前用户信息注册成功

    image-20240606111300500

    数据库中也能查询到该条用户数据

2. 登录

业务逻辑

  1. 用户输入登录时需要传递的参数:用户名、密码
  2. 服务器收到参数之后取出进行校验
  3. 创建一个queryWrapper进行查询,查询当前账户是否是唯一的,不允许未被注册就能登录的情况
  4. 将用户的登录信息存储到登录态中
  5. 返回脱敏后的用户信息

具体实现 + 代码

  1. controller层

    • 封装一个用户登录请求的类,里面用于存入用户登陆时的请求参数

    • 取出所有参数判断是否为空

    • 调用service层中用户登录的方法

      @PostMapping("/login")
      public BaseResponse<UserLoginVO> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {
          if(userLoginRequest == null) {
              throw new BusinessException(ErrorCode.PARAMS_ERROR);
          }
          String userAccount = userLoginRequest.getUserAccount();
          String userPassword = userLoginRequest.getUserPassword();
          if(StringUtils.isAnyBlank(userAccount, userPassword)) {
              throw new BusinessException(ErrorCode.PARAMS_ERROR);
          }
          UserLoginVO result = userService.userLogin(userAccount, userPassword, request);
          return ResultUtils.success(result);
      }
      
  2. service层

    • 校验参数是否为空

    • 创建一个queryWrapper进行查询,是否有和当前账户和密码一致的数据库信息(注意这里的密码必须是加密之后的密码进行查询,否则会查不到)

    • 不存在的话就说明当前用户未注册

    • 将用户信息存储到登录态中

    • 返回脱敏之后的用户信息

      @Override
      public UserLoginVO userLogin(String userAccount, String userPassword, HttpServletRequest request) {
          // 1. 对参数进行校验 账户和密码是否为空
          if(StringUtils.isAnyBlank(userAccount, userPassword)) {
              throw new BusinessException(ErrorCode.PARAMS_ERROR);
          }
          // 2. 将用户的密码进行加密 有的话就登录成功    查询数据库中的账户是否存在   不存在就报错
          String md_userPassword = DigestUtils.md5DigestAsHex((SLAT + userPassword).getBytes());
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          queryWrapper.eq("userAccount", userAccount);
          queryWrapper.eq("userPassword", md_userPassword);
          User user = this.baseMapper.selectOne(queryWrapper);
          if(user == null) {
              throw new BusinessException(ErrorCode.PARAMS_ERROR, "当前用户未注册");
          }
          // 3. 将用户信息存储到登录态中
          request.getSession().setAttribute(USER_LOGIN_STATE, user);
          // 3. 返回当前用户的所有信息(脱敏返回)
          return this.getUserLoginVO(user);
      }
      
  3. 测试

    输入前面我们注册的用户信息进行登录测试

    image-20240612185837959

    可以看出我们的登录功能是没有问题的,并且我们的request中也存储了用户的登录态信息

    image-20240612190111775

总结:

​ 注册登录是一个软件的基本功能,主要需要注意里面service层中的校验逻辑,我这里的校验比较的简单,只是实现了基础的东西,如果更复杂的应用可能会有更加严格细致的校验。后续大家也可以考虑进行扩展,比如:将用户的登录信息存储存储到session中实现多个客户端共享一个用户的信息,不用重复登录;另外也可以考虑将用户的登录改为单设备登录,这适用于一些用户充值了vip之后只能在单设备登录的场景。

  • 32
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 基于 Spring BootMyBatis Plus和Vue的开发框架是现代Web应用开发的主要选择之一。Spring Boot是一个轻量级的Java开发框架,提供了快速构建独立应用程序所需的所有功能。它简化了传统的Spring应用程序开发过程,让开发者能够更专注于业务逻辑。 MyBatis Plus是一个对MyBatis进行封装的工具,提供了更简单、更方便的方式来操作数据库。它使用注解和代码生成器来减少开发时间,使得数据库操作更加高效和可维护。 Vue是一个流行的JavaScript框架,用于构建用户界面。它的特点是轻量级、易于学习和使用,并且具有非常高的性能。Vue可以与服务器端的后端框架(如Spring Boot)无缝集成,在前后端分离的项目中,提供了极佳的开发体验。 使用基于Spring BootMyBatis Plus和Vue的开发框架,开发者可以快速搭建一个完整的Web应用。首先,使用Spring Boot来创建后端应用,配置数据源和集成MyBatis Plus以简化数据库操作。然后,使用Vue来创建用户界面,通过REST API与后端进行通信。 这个开发框架的优点是集成了强大的Java后端和灵活的JavaScript前端,开发者可以使用多种技术栈来完成各种功能。同时,Spring Boot提供了很好的项目结构和配置管理,MyBatis Plus简化了数据库操作,Vue提供了丰富的界面组件和开发工具,整合后的开发框架提供了高效、可维护和可扩展的开发环境。 总之,基于Spring BootMyBatis Plus和Vue的开发框架提供了一种现代化、高效和灵活的Web应用开发方式。它适用于各种规模的项目,可以提高开发效率,降低维护成本,并且提供良好的开发体验。 ### 回答2: 基于Spring BootMyBatis Plus和Vue框架的开发可以实现一个完整的前后端分离的应用。以下是具体方面的解释: 1. Spring Boot是一个快速开发的Java框架,可以轻松搭建后端服务器。它提供了自动配置、快速开发等功能,大大简化了Java后端开发的步骤。 2. MyBatis Plus是一个基于MyBatis的增强工具,可以简化与数据库的交互。它提供了更简单的API、更强大的查询功能和代码生成等特性,可以极大提高后端开发的效率。 3. Vue是一个流行的前端框架,用于构建用户界面。它具有简单易学、灵活和高性能等特点,可以帮助我们编写交互式、响应式的前端应用。 基于这三个框架的组合,可以实现前后端完全分离的开发模式。后端使用Spring Boot搭建服务器,处理业务逻辑,并与数据库进行交互。MyBatis Plus可以简化与数据库的交互,提供了更简单的CRUD操作和强大的查询功能。 前端使用Vue进行开发,可以实现灵活的用户界面。通过Restful API与后端进行通信,实现数据的交互。 总而言之,基于Spring BootMyBatis Plus和Vue的开发模式,可以高效地实现前后端分离的应用。后端使用Spring Boot提供服务,MyBatis Plus简化数据库交互,前端使用Vue构建用户界面。这种组合可以提高开发效率,让开发人员更专注于业务逻辑的实现。 ### 回答3: 基于Spring BootMyBatis Plus和Vue的开发,可以实现一个全栈的Web应用程序。 Spring Boot是一个基于Spring框架的快速开发工具,它简化了Spring项目的配置,提供了一套约定大于配置的开发模式。使用Spring Boot可以快速搭建一个Web应用程序的后端,处理数据层和业务逻辑。 MyBatis Plus是基于MyBatis框架之上的增强工具,它进一步简化了在Java应用程序中操作数据库的流程。MyBatis Plus提供了很多常用的功能和特性,如代码生成器、自动填充、分页插件等,可以极大地提高开发效率。 Vue是一种现代化的JavaScript框架,用于构建用户界面。它提供了一套响应式组件系统和强大的工具集,可以帮助开发者快速构建单页应用程序。Vue可以与其他后端技术,如Spring BootMyBatis Plus一起使用,实现前后端分离的开发模式。 在基于这些技术的开发过程中,可以将后端的数据处理和业务逻辑实现放在Spring Boot中,使用MyBatis Plus进行数据库操作。前端使用Vue构建用户界面,并通过异步请求与后端进行数据交互。通过这种方式,可以实现一个功能完善的全栈Web应用程序。 使用Spring BootMyBatis Plus可以快速搭建后端框架,并提供强大的数据库操作能力。而Vue作为前端框架,可以提供友好的用户界面和交互体验。通过这些技术的结合,可以实现高效、灵活的全栈开发,为用户提供优质的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值