Springboot基本结构——登录 业务层

同理,在这里我们需要规划在这一层我们要做什么。

首先当然是对异常的处理

例如用户名输入的密码错误,密码匹配失败,所以这里可以搞一个异常,就叫做PassWordNotMatchException,这属于运行时异常;

还有一种如用户名密码没有被找到,那么这个就是UsernameNotFoundException,也属于运行时异常。

以上两种都是业务异常。它俩都继承我们之前写好的ServiceException类。

public class UserNotFoundException extends ServiceException {
    public UserNotFoundException() {
    }

    public UserNotFoundException(String message) {
        super(message);
    }

    public UserNotFoundException(String message, Throwable cause) {
        super(message, cause);
    }

    public UserNotFoundException(Throwable cause) {
        super(cause);
    }

    public UserNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

 

public class PasswordNotMatchException extends ServiceException {
    public PasswordNotMatchException() {
        super();
    }

    public PasswordNotMatchException(String message) {
        super(message);
    }

    public PasswordNotMatchException(String message, Throwable cause) {
        super(message, cause);
    }

    public PasswordNotMatchException(Throwable cause) {
        super(cause);
    }

    public PasswordNotMatchException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

接下来是要设计业务层接口和抽象方法。业务层的接口我们其实已经设计好了,就在前面设计过的,就是那个IUserService。

这是一个接口,我们在里面定义一个login方法就可以了。

这个方法的返回值可以是一个User对象,因为一般来说用户登录以后会自动跳转到首页,一般在右上角会有比较详细的用户数据,这个显示是要得到User对象才能拿到的。

@Override
    public User login(String username, String password) {
        //根据用户名查询用户是否存在,如不存在则抛异常
        User result = userMapper.findByUsername(username);
        if (result == null) {
            throw new UserNotFoundException("用户不存在!");
        }

        //还要比较用户输入的密码是否正确
        //先从数据库中拿到加密后的密码,这里不能直接比较,所以要先处理一下
        //如何处理?拿到盐值再说。这是注册时生成的,所以直接从result对象那拿
        String salt = result.getSalt();
        //现在把用户输入的密码按照同样的方式加密,并与数据库中存储的密码比较
        String newMd5Password = getMD5Password(password, salt);
        //比较
        if (!newMd5Password.equals(result.getPassword())) {
            throw new PasswordNotMatchException("用户密码错误!");
        }

        //还有一种异常,用户可能把账号注销了,所以需要查看is_deleted值是否为1,为1说明被注销了,此时要抛出
        //用户Not found异常
        if (result.getIsDeleted() == 1) {
            throw new UserNotFoundException("用户不存在!");
        }

        //现在终于可以查询操作了,我们其实不需要result里面的全部属性,所以怎么办?
        //这么办:
        User user = new User();
        user.setUid(result.getUid());
        user.setUsername(result.getUsername());
        user.setAvatar(result.getAvatar());
        return user;
    }

数据量越小,在前后端间传递的效率也越高。

现在检测登录功能,在测试类中进行。

在test包下的测试类测试即可:

1 @Test
2     public void login() {
3         User user = userService.login("Esergrett", "66e4tw3e4378");
4         System.out.println(user.getUsername());
5     }

测试也是挺成功的,哟西!现在开始下一步!

 

posted @ 2022-09-07 21:30  EvanTheBoy  阅读(127)  评论(0)    收藏  举报