篇章八 论坛系统——业务开发——登录

目录

1.登录

[1.1 顺序图](#1.1 顺序图)

[1.2 参数要求](#1.2 参数要求)

[1.3 接口规范](#1.3 接口规范)

[1.4 实现流程](#1.4 实现流程)

1.编写SQL

2.dao层接口

3.定义Service接口

4.实现Service接口

5.单元测试

[6. Controller实现方法对外提供API接口](#6. Controller实现方法对外提供API接口)

7.测试API接口

8.实现前端逻辑,完成前后端交互

​编辑


1.登录

1.1 顺序图

1.2 参数要求

1.3 接口规范

1.4 实现流程

1.编写SQL

2.dao层接口

3.定义Service接口

复制代码
/**
     * 根据用户名查询用户信息
     * @param username 用户名
     * @return 用户信息
     */
    User selectByUserName(String username);

    /**
     * 处理用户登录
     * @param username 用户名
     * @param password 密码
     * @return 用户信息
     */
    User login(String username,String password);

4.实现Service接口

复制代码
 /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    @Override
    public User selectByUserName(String username) {
        // 1.非空校验
        if(StringUtils.isEmpty(username)) {
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常, 统一抛出 ApplicationException
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }

        // 返回查询结果
        return userMapper.selectByUserName(username);
    }

    /**
     * 处理用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 用户信息
     */
    @Override
    public User login(String username, String password) {
        // 1.非空校验
        if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常, 统一抛出 ApplicationException
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
        }
        // 2.按用户名查询用户信息
        User user = selectByUserName(username);
        // 3.对查询结果进行非空校验
        if (user == null) {
            // 打印日志
            log.warn(ResultCode.FAILED_LOGIN.toString() + ", username = " + username);
            // 抛出异常, 统一抛出 ApplicationException
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
        }
        // 4.对密码校验
        String encryptPassword = MD5Util.md5Salt(password, user.getSalt());
        // 5.用密文和数据库中存的用户密码进行比较
        if(!encryptPassword.equals(user.getPassword())) {
            // 打印日志
            log.warn(ResultCode.FAILED_LOGIN.toString() + ", 密码错误, username = " + username);
            // 抛出异常, 统一抛出 ApplicationException
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
        }
        // 打印登录成功的日志
        log.info("[UserServiceImpl.login()]: " + username + " 登录成功");
        return user;
    }

5.单元测试

复制代码
  @Test
    void selectByUserName() {
        System.out.println(userService.selectByUserName("boy"));
    }

    @Test
    void login() {
        System.out.println(userService.login("wj", "123456"));
    }

6. Controller实现方法对外提供API接口

7.测试API接口

8.实现前端逻辑,完成前后端交互

相关推荐
user205855615181319 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode19 小时前
Redis 在生产项目的使用
前端·后端
LiaCode19 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战19 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
风骏时光牛马19 小时前
# Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例
前端
weedsfly19 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
xiaodaoluanzha19 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn19 小时前
Fetch 请求竞态终结者:AbortController 不只是用来"取消"的
前端
阡陌Jony19 小时前
关于前端路由中的参数问题的学习(一): params,query, hash(#)
前端
阡陌Jony19 小时前
缓存相关学习笔记(一):Service Worker 缓存
前端