在 foodie-dev-service 模块下的 UserService 类添加 queryUserForLogin 接口

    1. package com.imooc.service;
    2. import com.imooc.pojo.Users;
    3. import com.imooc.pojo.bo.UserBO;
    4. /**
    5. * @author 92578
    6. * @since 1.0
    7. */
    8. public interface UserService {
    9. /**
    10. * 判断用户名是否存在
    11. *
    12. * @param username 用户名
    13. * @return 是否存在
    14. */
    15. public boolean queryUsernameIsExist(String username);
    16. /**
    17. * 创建用户
    18. *
    19. * @param userBO
    20. * @return
    21. */
    22. public Users createUser(UserBO userBO);
    23. // 检索用户名和密码是否匹配,用于登录
    24. public Users queryUserForLogin(String username, String password);
    25. }

    在 foodie-dev-service 模块下的 UserServiceImpl 类实现 queryUserForLogin 接口

    package com.imooc.service.impl;
    
    import com.imooc.enums.Sex;
    import com.imooc.mapper.UsersMapper;
    import com.imooc.pojo.Users;
    import com.imooc.pojo.bo.UserBO;
    import com.imooc.service.UserService;
    import com.imooc.utils.DateUtil;
    import com.imooc.utils.MD5Utils;
    import org.n3r.idworker.Sid;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import tk.mybatis.mapper.entity.Example;
    
    import java.util.Date;
    
    /**
     * @author 92578
     * @since 1.0
     */
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UsersMapper usersMapper;
    
        @Autowired
        private Sid sid;
    
        private static final String USER_FACE = "http://dp.gtimg.cn/discuzpic/0/discuz_x5_gamebbs_qq_com_forum_201306_19_1256219xc797y90heepdbh.jpg/0";
    
        /**
         * 判断用户名是否存在
         *
         * @param username 用户名
         * @return 是否存在
         */
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public boolean queryUsernameIsExist(String username) {
            Example userExample = new Example(Users.class);
            Example.Criteria userCriteria = userExample.createCriteria();
    
            userCriteria.andEqualTo("username", username);
    
            Users result = usersMapper.selectOneByExample(userExample);
    
            return result == null ? false : true;
        }
    
        /**
         * 创建用户
         *
         * @param userBO
         * @return
         */
        @Transactional(propagation = Propagation.REQUIRED)
        @Override
        public Users createUser(UserBO userBO) {
            String userId = sid.nextShort();
            Users user = new Users();
            user.setId(userId);
            user.setUsername(userBO.getUsername());
            try {
                user.setPassword(MD5Utils.getMD5Str(userBO.getPassword()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 默认用户昵称同用户名
            user.setNickname(userBO.getUsername());
            // 默认头像
            user.setFace(USER_FACE);
            // 默认生日
            user.setBirthday(DateUtil.stringToDate("1900-01-01"));
            // 默认性别为 保密
            user.setSex(Sex.secret.type);
            user.setCreatedTime(new Date());
            user.setUpdatedTime(new Date());
    
            usersMapper.insert(user);
    
            return user;
        }
    
        @Transactional(propagation = Propagation.SUPPORTS)
        @Override
        public Users queryUserForLogin(String username, String password) {
            Example userExample = new Example(Users.class);
            Example.Criteria userCriteria = userExample.createCriteria();
    
            userCriteria.andEqualTo("username", username);
            userCriteria.andEqualTo("password", password);
    
            Users result = usersMapper.selectOneByExample(userExample);
    
            return result;
        }
    }
    

    在 foodie-dev-api 模块下的 PassportController 类实现 login 接口,因为登录的时候不需要传确认密码

    package com.imooc.controller;
    
    import com.imooc.pojo.Users;
    import com.imooc.pojo.bo.UserBO;
    import com.imooc.service.UserService;
    import com.imooc.utils.IMOOCJSONResult;
    import com.imooc.utils.MD5Utils;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * @author 92578
     * @since 1.0
     */
    @Api(value = "注册登录", tags = {"用于注册登录的相关接口"})
    @RestController
    @RequestMapping("passport")
    public class PassportController {
    
        @Autowired
        private UserService userService;
    
        @ApiOperation(value = "用户名是否存在", notes = "用户名是否存在", httpMethod = "GET")
        @GetMapping("/usernameIsExist")
        public IMOOCJSONResult usernameIsExist(@RequestParam String username) {
            // 1. 判断用户名不能为空
            if (StringUtils.isBlank(username)) {
                return IMOOCJSONResult.errorMsg("用户名不能为空");
            }
    
            // 2. 查找注册的用户名是否存在
            boolean isExist = userService.queryUsernameIsExist(username);
            if (isExist) {
                return IMOOCJSONResult.errorMsg("用户名已经存在");
            }
    
            // 3. 请求成功,用户名没有重复
            return IMOOCJSONResult.ok();
        }
    
        @ApiOperation(value = "用户注册", notes = "用户注册", httpMethod = "POST")
        @PostMapping("/regist")
        public IMOOCJSONResult regist(@RequestBody UserBO userBO) {
            String username = userBO.getUsername();
            String password = userBO.getPassword();
            String confirmPwd = userBO.getConfirmPassword();
    
            // 0. 判断用户名和密码不为空
            if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(confirmPwd)) {
                return IMOOCJSONResult.errorMsg("用户名或密码不能为空");
            }
    
            // 1. 查询用户名是否存在
            boolean isExist = userService.queryUsernameIsExist(username);
            if (isExist) {
                return IMOOCJSONResult.errorMsg("用户名已经存在");
            }
    
            // 2. 密码长度不能少于 6 位
            if (password.length() < 6) {
                return IMOOCJSONResult.errorMsg("密码长度不能少于6");
            }
    
            // 3. 判断两次密码是否一致
            if (!password.equals(confirmPwd)) {
                return IMOOCJSONResult.errorMsg("两次密码输入不一致");
            }
    
            // 4. 实现注册
            userService.createUser(userBO);
    
            return IMOOCJSONResult.ok();
        }
    
        @ApiOperation(value = "用户登录", notes = "用户登录", httpMethod = "POST")
        @PostMapping("/login")
        public IMOOCJSONResult login(@RequestBody UserBO userBO) throws Exception {
            String username = userBO.getUsername();
            String password = userBO.getPassword();
    
            // 0. 判断用户名和密码不为空
            if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
                return IMOOCJSONResult.errorMsg("用户名或密码不能为空");
            }
    
            // 1. 实现登录
            Users userResult = userService.queryUserForLogin(username, MD5Utils.getMD5Str(password));
    
            if (userResult == null){
                return IMOOCJSONResult.errorMsg("用户名或密码不正确");
            }
    
            return IMOOCJSONResult.ok(userResult);
        }
    }
    

    修改 foodie-dev-pojo 模块下的 UserBO 类,将 confirmPassword 设置为非必填

    package com.imooc.pojo.bo;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    
    /**
     * Created by 92578 on 2020/8/16 13:57
     **/
    @ApiModel(value = "用户对象BO", description = "从客户端,由用户传入的数据封装在此 entity 中")
    public class UserBO {
    
        @ApiModelProperty(value = "用户名", name = "用户名", example = "imooc", required = true)
        private String username;
        @ApiModelProperty(value = "密码", name = "密码", example = "123456", required = true)
        private String password;
        @ApiModelProperty(value = "确认密码", name = "确认密码", example = "123456", required = false)
        private String confirmPassword;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getConfirmPassword() {
            return confirmPassword;
        }
    
        public void setConfirmPassword(String confirmPassword) {
            this.confirmPassword = confirmPassword;
        }
    }
    

    启动项目,进入 http://localhost:8088/doc.html 多了一个用户登录接口
    image.png
    调试用户登录接口,用户名填“test”,密码填“123123”,点击“发送”,返回成功
    image.png