黑马点评项目启动

项目运行

  1. 代码源文件修改数据库密码,修改redis地址
  2. 后端代码启动后找到对应的前端打包的代码,启动此nginx
  3. 后端访问:http://localhost:8081/shop-type/list
  4. 前端访问: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;


    }
相关推荐
法欧特斯卡雷特9 小时前
Kotlin 新特性抢先看:伴生扩展与伴生块
后端·面试·开源
桃李醉春风9 小时前
被微信拒审那天,我才真正学会 Vibecoding:一个人 + AI,3 万行代码、1.8 万张素材的小程序全复盘
后端
CoderYanger9 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
她的男孩9 小时前
打印模板草稿能保存,一点发布就报主从关系:我们把校验拆成了两档
java·spring boot·后端
小鹿的周先生9 小时前
第19章-Agent
java·spring·ai
溪语流沙9 小时前
【Web全栈进阶】FastAPI工程化:APIRouter拆分 + 配置 + 依赖注入
java·前端·fastapi
Bazingga10 小时前
Embabel学习笔记:把Agent的决策权从LLM手里拿回来
后端
用户83145509803110 小时前
基于 Firecracker 自建 Agent 沙箱集群:状态机 + 文件管理 + 进程编排,附 E2B 生产经验校准
后端
写后端的胖头鱼10 小时前
Redis 的 RDB 和 AOF
java·数据库·redis
cxoptics10 小时前
LBO 激光损伤阈值 LIDT 典型数值?如何避免晶体打坏?
java