项目运行
- 代码源文件修改数据库密码,修改redis地址
- 后端代码启动后找到对应的前端打包的代码,启动此nginx
- 后端访问:http://localhost:8081/shop-type/list
- 前端访问:http://localhost:8080

短信登录功能
发送短信验证码:
java
@Slf4j //自动化的日志开关。它通过在类头部声明,为类自动注入一个名为 log 的日志对象
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Override
public Result sendCode(String phone, HttpSession session) {
//1.校验手机号是否符合(String phone是否符合规范,一般用正则表达式判断,此处可以直接使用工具类RegexUtils)
if (RegexUtils.isPhoneInvalid(phone)){
return Result.fail("手机号格式错误");
}
//2.不符合:返回错误信息
RandomUtil.randomNumbers(6);
//3.符合:生成验证码
String code = RandomUtil.randomNumbers(6);
//4.保存验证码到session
session.setAttribute("code", code);
//5.发送验证码(需要调用第三方短信平台,此处暂不设置,假设成功)
log.debug("短信发送成功,验证码{}",code);
//返回ok,用定义的Result方法
return Result.ok();
}
}

实现短信验证码登录+注册:

由于前端提交的是一个json格式,此处要用@RequestBody注解,并且要有一个实体类LoginFormDTO
java
@PostMapping("/login")
public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
// TODO 实现登录功能
return userService.login(loginForm,session);
}
java
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
//1.校验手机号
String phone = loginForm.getPhone();
if(RegexUtils.isPhoneInvalid(phone)) {
return Result.fail("手机号格式错误");
}
//2.校验验证码
Object cacheCode = session.getAttribute("code");
String code = loginForm.getCode();
if (cacheCode == null || !cacheCode.toString().equals(code)) {
//3.不一致,报错
return Result.fail("验证码错误");
}
//4.一致,则根据手机号查询用户是否存在
User user = query().eq("phone", phone).one();
//5.用户不存在--创建新用户并保存
if (user == null) {
user = createUserWithPhone(phone);
//保存用户信息到session中
session.setAttribute("user", user);
return Result.ok(); // session基于cookie,有唯一id,不需要像JWT一样返回登录凭证
}
//6.
return null;
}
private User createUserWithPhone(String phone) {
//创建用户
User user = new User();
user.setPhone(phone);
user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomNumbers(10)); //生成前缀统一的默认用户名,此处用工具类定义好的常量
save(user); //mybatis-plus功能
return user;
}
