点评项目-2-完善注册登录业务

ops/2024/12/23 6:31:59/

业务一:向手机发送验证码

需要处理的业务:在网页发送 /user/code 路径下的 post 请求后,我们需要检验手机号后,向合法的手机号发送一个随机生成的电话号

第一步:UserController

java">@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/code")//向用户的手机号发送验证码public Result sendCode(@RequestParam("phone") String phone, HttpSession session){return userService.sendCode(phone,session);}}

第二步,UserService

java">public interface UserService {Result sendCode(String phone, HttpSession session);}

第三步,UserService 实现类 UserServiceImpl

java">@Service
public class UserServiceImpl implements UserService {@Overridepublic Result sendCode(String phone, HttpSession session) {//先用 hutool 工具校验手机号是否合法if (phone == null || !PhoneUtil.isPhone(phone)) {return Result.fail("请输入合法的手机号");//若不合法直接响应错误}//用 hutool 工具生成六位验证码String code = RandomUtil.randomNumbers(6);//将生成的验证码放入 sessionsession.setAttribute("code",code);//给手机号发送验证码,这里模拟发送验证码的操作,而不是真正的发送System.out.println("手机收到了一条验证码短信:"+code);return Result.ok();}
}

第四步,完善响应类,响应操作结果给页面

java">@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Boolean success;private String errorMsg;private Object data;private Long total;public static Result ok(){return new Result(true, null, null, null);}public static Result ok(Object data){return new Result(true, null, data, null);}public static Result ok(List<?> data, Long total){return new Result(true, null, data, total);}public static Result fail(String errorMsg){return new Result(false, errorMsg, null, null);}
}

业务二:完成验证码登录校验

需要处理的业务:在网页发送 /user/login路径下的 post 请求后,我们需要检验手机号后,判断数据库中是否存在该手机号用户,若有则直接登录,若没有,则创建新用户存入数据库后登录

第一步:UserController

java">@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/code")//向用户的手机号发送验证码public Result sendCode(@RequestParam("phone") String phone, HttpSession session){return userService.sendCode(phone,session);}@PostMapping("/login")//请求会传递过来一个 json,代表登录的信息public Result login(@RequestBody LoginFormDTO loginFormDTO, HttpSession session){return userService.login(loginFormDTO,session);}}

第二步,UserService

java">public interface UserService {Result login(LoginFormDTO loginFormDTO, HttpSession session);Result sendCode(String phone, HttpSession session);}

第三步,UserService 实现类 UserServiceImpl

java">    @Autowiredprivate UserMapper userMapper;@Overridepublic Result login(LoginFormDTO loginFormDTO, HttpSession session) {if(loginFormDTO == null){return Result.fail("无效操作");}//校验手机号String phone = loginFormDTO.getPhone();if (phone == null || !PhoneUtil.isPhone(phone)) {return Result.fail("请输入合法的手机号");//若不合法直接响应错误}//拿到 session 域中的验证码String code1 = loginFormDTO.getCode();Object code = session.getAttribute("code");System.out.println("请求发进来一个验证码,为:"+code1);System.out.println("session域中的验证码,为:"+code.toString());if(!code.toString().equals(code1)){return Result.fail("验证码输入错误,请重新输入");}//验证码正确,判断是否存在用户User user = userMapper.selectByPhone(phone);if(user == null){//若不存在就创建一个用户并存入 mysqluser = createUserByPhone(phone);userMapper.insert(user);}//保存用户登录信息session.setAttribute("user",user);return Result.ok();}private User createUserByPhone(String phone) {User user = new User();user.setPhone(phone);user.setNickName("user_"+RandomUtil.randomString(10));return user;}

第四步,完善 Mapper 中的 selectByPhone 接口方法

java">@Mapper
public interface UserMapper extends BaseMapper<User> {@Select("select * from tb_user where phone = #{phone}")User selectByPhone(@Param("phone") String phone);}

第五步,完善登录请求的 json 对应的封装类

登录请求 json 会发送:验证码,手机号,密码 

当前验证的是验证码和手机号组合的登录请求,此时密码为 null

java">@Data
public class LoginFormDTO {private String phone;private String code;private String password;
}

最后,使用前端或者 postman 完成发送验证码请求,以及登录请求,若本地数据库成功加入请求输入的手机号,则表示操作成功


http://www.ppmy.cn/ops/120153.html

相关文章

记录docker phpadmin 链接 docker mysql

1&#xff1a;正常使用docker 拉取mysql 镜像&#xff0c;容器名字为&#xff1a;mysql888 &#xff0c;配置好 【你的root密码】 2&#xff1a;正常使用docker 拉取phpadmin镜像 3 &#xff1a;执行&#xff1a;docker run --name myadmin -d --link mysql888:db -p 8898:80…

针对考研的C语言学习(2019链表大题)

题目解析&#xff1a; 【考】双指针算法&#xff0c;逆置法&#xff0c;归并法。 解析&#xff1a;因为题目要求空间复杂度为O(1)&#xff0c;即不能再开辟一条链表&#xff0c;因此我们只能用变量来整体挪动原链表。 第一步先找出中间节点 typedef NODE* Node; Node find_m…

[JavaEE] HTTP/HTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP发展史 1.3 HTTP工作过程 1.3.1 抓包工具的原理 1.4 HTTP请求格式 1.4.1认识URL 1.5 HTTP响应格式 1.6 认识HTTP"方法"(method) 1.6.1 GET方法 1.6.2 POST方法 1.6.3 其他方法 1.7 GET 与 POST 的区别 1.8 认识…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

中间件:SpringBoot集成Redis

一.Redis简介 Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务&#xff09;是一个开源的、使用ANSI C语言编写的、支持网络交互的、可基于内存亦可持久化的日志型Key-Value数据库&#xff0c;它提供了多种语言的API。Redis通常被称为数据结构服务器&#…

安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型

案例介绍 在全球制造业加速数字化的背景下&#xff0c;工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护&#xff0c;以及跨地域的管理协作等挑战&#xff0c;由于场地分散和突发状况的不可预知性&#xff0c;传统方式已无法…

木舟0基础学习Java的第三十一天(SpringMVC,xml式和注解式开发,携带数据,取值,视图解析)

SpringMVC Mybatis: 优化了dao层 降低了java与dao层的耦合 Spring:是大管家 整合和管理mybatis与springmve(是spring中子模块) SpringMVC:优化了servlet层 降低了java与servlet的耦合 为什么要使用 springMVC? SpringMVC 是一种基于 Java&#xff0c;实现了 Web MVC 设计模…