项目训练营第二天

项目训练营第二天

用户登录逻辑

1、账户名不少于4位

2、密码不少于8位

3、数据库表中能够查询到账户、密码

4、密码查询时用同样加密脱敏处理手段处理后再和数据库中取出字段进行对比,如果账户名未查询到,直接返回null

5、后端设置相应的脱敏后用户的session值,方便下一次访问时能够更快的到用户数据。

代码如下:

java 复制代码
public User UserLogin(String userAccount, String password, HttpServletRequest request) {
        if (StringUtils.isAnyBlank(userAccount, password)) {
            return null;
        }
        if (userAccount.length() < 4) {
            return null;
        }
        if (password.length() < 8) {
            return null;
        }
        Pattern compile = Pattern.compile(".*[[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%......&*()------+|{}【】';:""'。,、?]|\\n|\\r|\\t].*");
        Matcher matcher = compile.matcher(userAccount);
        if (matcher.matches()) {
            return null;
        }
        String entryPassword = DigestUtils.md5Hex(SALT + password);
        QueryWrapper<User> mapperQuery = new QueryWrapper<>();
        mapperQuery.eq("userAccount", userAccount);
        mapperQuery.eq("password", entryPassword);
        User user = userMapper.selectOne(mapperQuery);
        if (user == null) {
            log.info("user Login error, userAccount cannot match password");
            return null;
        }
        User safetyUser = new User();
        safetyUser.setUsername(user.getUsername());
        safetyUser.setId(user.getId());
        safetyUser.setUserAccount(user.getUserAccount());
        safetyUser.setAvatarUrl(user.getAvatarUrl());
        safetyUser.setEmail(user.getEmail());
        safetyUser.setPhone(user.getPhone());
        safetyUser.setGender(user.getGender());
        safetyUser.setUserStatus(user.getUserStatus());
        safetyUser.setCreateTime(user.getCreateTime());
        request.getSession().setAttribute(USER_LOGIN_STATE, safetyUser);

        return safetyUser;
    }

}
Session和cookie
request请求(HttpServletRequest request)

前端请求后端一般使用ajax(Asynchronous Javascript And XML,即是异步的JavaScript和XML),它可以异步地向服务器发送请求,在等待响应的过程中,不会阻塞当前页面。

  • 简单来说,封装后都用request来请求后端,所以上面的参数中要加一个HttpServletRequest request,并且调用它的getSession函数取到Session类,再将它的Attribute类新增一个处于USER_LOGIN_STATE状态的具体用户类。
  • Attribute本质上是一个Map类型的数据结构,用于存储Session
  • USER_LOGIN_STATE是我们自定义的一个字符串,定义在UserService接口类中。

业务逻辑层构建

我们在项目中建一个名为service的文件夹,在该文件夹下面定义一个UserService.java存放如下的接口类。

用于实现注册逻辑、登录逻辑的函数->UserRegister、UserLogin函数都是这个接口的方法。

在service文件夹中再建一个impl文件夹,在里面建一个UserServiceImpl.java文件,用extends继承该接口,加上@Service注解表示这是业务逻辑层

我们要将之前生成的数据库操作类UserMapper作为一个成员放入到该类中,并加上@Resource注解,这样就可以自动调用连接上的数据库了。

tips

  • @Slf4j是一个日志注解
  • 密码加密的盐值SALT可自行定义
  • 数据库需要在applications.yml里面配置,具体可参照网上文章来,以自行实践为准。
  • 注解加上后报错需要在pom.xml中添加对应依赖,刷新maven后即可解决。

逻辑删除

Mybatis-plus配置时有一种逻辑删除的封装操作,该字段设置为1后即视为已被删除。

  • 在applications.yml中配置代码如下:
php 复制代码
  global-config:
    db-config:
      logic-delete-field: isDelete # 全局逻辑删除字段名
      logic-delete-value: 1 # 逻辑已删除值
      logic-not-delete-value: 0 # 逻辑未删除值
  • User实体类中设置为逻辑删除的字段前要加@TableLogic注解
    也可自行上官网配置查阅

控制层Controller封装

  • 按照SpringMVC控制层,视图层,处理层的封装逻辑,我们建一个名为Controller的文件夹,一个model.request文件夹。
  • 后者存放接收请求的我们自定义的request类,前者存放调用业务逻辑层函数对request请求进行处理并返回数据的总的一个控制类。
  • Model文件夹中还存放着User实体类,这个文件夹主要也就是用于存放些实体类
    登录请求UserLoginRequest可以这么定义
java 复制代码
@Data
public class UserLoginRequest implements Serializable {

    @Serial
    private static final long serialVersionUID = -543286974259314538L;

    private String userAccount;

    private String password;

    private String CheckPassword;
}

serrialVersionUID自动生成方法在昨天的笔记里。

注册请求UserRegisterRequest可以这么定义,两个request类定义分别放在一个和类名相同的java文件中

java 复制代码
@Data
public class UserRegisterRequest implements Serializable {

    @Serial
    private static final long serialVersionUID = 3253980956799016230L;

    private String userAccount;

    private String password;

    private String CheckPassword;
}
  • Data注解主要是放在一些实体类上,用于提供get、toString等方法。
相关推荐
qq_124987075333 分钟前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_39 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732061 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu4 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶4 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip6 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide6 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf7 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva7 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露7 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot