在 foodie-dev-service 模块下的 UserService 类添加 queryUserForLogin 接口
package com.imooc.service;import com.imooc.pojo.Users;import com.imooc.pojo.bo.UserBO;/*** @author 92578* @since 1.0*/public interface UserService {/*** 判断用户名是否存在** @param username 用户名* @return 是否存在*/public boolean queryUsernameIsExist(String username);/*** 创建用户** @param userBO* @return*/public Users createUser(UserBO userBO);// 检索用户名和密码是否匹配,用于登录public Users queryUserForLogin(String username, String password);}
在 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 多了一个用户登录接口
调试用户登录接口,用户名填“test”,密码填“123123”,点击“发送”,返回成功
