Redis 学习笔记 3:黑马点评
准备工作
需要先导入项目相关资源:
- 数据库文件 hmdp.sql
- 后端代码 hm-dianping.zip
- 包括前端代码的 Nginx
启动后端代码和 Nginx。
短信登录
发送验证码
@PostMapping("code")
public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
// 发送短信验证码并保存验证码
return userService.sendCode(phone, session);
}
@Log4j2
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Override
public Result sendCode(String phone, HttpSession session) {
if (RegexUtils.isPhoneInvalid(phone)) {
return Result.fail("不是合法的手机号!");
}
String code = RandomUtil.randomNumbers(6);
session.setAttribute("code", code);
// 发送短信
log.debug("发送短信验证码:{}", code);
return Result.ok();
}
}
登录
@PostMapping("/login")
public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session) {
// 实现登录功能
return userService.login(loginForm, session);
}
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
// 验证手机号和验证码
if (RegexUtils.isPhoneInvalid(loginForm.getPhone())) {
return Result.fail("手机号不合法!");
}
String code = (String) session.getAttribute("code");
if (code == null || !code.equals(loginForm.getCode())) {
return Result.fail("验证码不正确!");
}
// 检查用户是否存在
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("phone", loginForm.getPhone());
User user = this.baseMapper.selectOne(qw);
if (user == null) {
user = this.createUserByPhone(loginForm.getPhone());
}
// 将用户信息保存到 session
session.setAttribute("user", user);
return Result.ok();
}
private User createUserByPhone(String phone) {
User user = new User();
user.setPhone(phone);
user.setNickName("user_" + RandomUtil.randomString(5));
this.baseMapper.insert(user);
return user;
}
统一身份校验
定义拦截器:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从 session 获取用户信息
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
response.setStatus(401);
return false;
}
// 将用户信息保存到 ThreadLocal
UserDTO userDTO = new UserDTO();
userDTO.setIcon(user.getIcon());
userDTO.setId(user.getId());
userDTO.setNickName(user.getNickName());
UserHolder.saveUser(userDTO);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.removeUser();
}
}
添加拦截器:
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.