news 2026/7/23 13:50:15

飞滴网约车项目Day01

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
飞滴网约车项目Day01

今日完成

乘客用户中心服务

验证码发送

首先我们需要开发用户注册和登录功能,其中重点是乘客发送验证码,以下是发送验证码的时序图

REST ful 风格

在设计rest fuk 风格的时候,我们需要考虑以下的事情:

  1. 协议(http,https)
  2. 域名 (www.xxx.com/aoi/courses,api.xxx.com/courses)
  3. 路径
  4. 版本(v1,v2等)
  5. 动作(post,put,patch, delete, get)

nacos下载和配置

下载地址:https://github.com/alibaba/nacos/releases/tag/2.0.3

添加maven依赖

<!-- nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.1</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.1</version> </dependency>
# 启动Nacos Server: 定位到bin目录,然后执行启动命令: ## cmd窗口 startup.cmd -m standalone ## powershell窗口 .\startup.cmd -m standalone 这将以单机模式启动Nacos服务器。

获取随机验证码

@RestController public class NumberCodeController { @GetMapping("/numberCode/{size}") public String numberCode(@PathVariable("size") int size) { System.out.println("生成验证码,验证码长度:" + size); JSONObject result = new JSONObject(); result.put("code", 1); result.put("message", "success"); JSONObject data = new JSONObject(); //获取随机数 String number = "0123456789"; StringBuilder numberCode = new StringBuilder(); for (int i = 0; i < size; i++) { int index = (int) (Math.random() * number.length()); char c = number.charAt(index); numberCode.append(c); } System.out.println(numberCode.toString()); data.put("numberCode", numberCode); result.put("data", data); return result.toString(); } }

统一返回类型

public enum CommonStatusEnum { SUCCESS(1, "success"), FAIL(0, "fail"); @Getter private int code; @Getter private String value; private CommonStatusEnum(int code, String value) { this.code = code; this.value = value; } }
@Data @Accessors(chain = true) public class ResponseResult<T> { private int code; private String message; private T data; /** * 成功返回结果 */ public static <T> ResponseResult<T> success(T data) { return new ResponseResult<T>().setCode(CommonStatusEnum.SUCCESS.getCode()) .setMessage(CommonStatusEnum.SUCCESS.getValue()) .setData(data); } /** * 失败返回结果 */ public static <T> ResponseResult<T> fail(int code , String message) { return new ResponseResult<T>().setCode(code) .setMessage(message); } /** * 失败返回结果,自定义失败 */ public static <T> ResponseResult<T> fail(int code, String message,T data) { return new ResponseResult<T>().setCode(code) .setMessage(message) .setData(data); } /** * 失败:统一失败 */ public static <T> ResponseResult<T> fail(T data) { return new ResponseResult<T>().setData(data); } }

改造后的为:

@RestController public class NumberCodeController { @GetMapping("/numberCode/{size}") public ResponseResult numberCode(@PathVariable("size") int size) { System.out.println("生成验证码,验证码长度:" + size); //获取随机数 String number = "0123456789"; StringBuilder numberCode = new StringBuilder(); for (int i = 0; i < size; i++) { int index = (int) (Math.random() * number.length()); char c = number.charAt(index); numberCode.append(c); } //定义返回值 NumberCodeResponse numberCodeResponse = new NumberCodeResponse(); numberCodeResponse.setNumberCode(Integer.parseInt(numberCode.toString())); return ResponseResult.success(numberCodeResponse); } }

api-passenger和service-verificationCode之间的调用

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
@FeignClient("service-verificationcode") public interface ServiceVerificationCodeClient { @GetMapping("/numberCode/{size}") ResponseResult<NumberCodeResponse> numberCode(@PathVariable("size") int size); }

验证码redis使用

maven依赖

<!--redis使用--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

yml编写

server: port: 8081 spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: api-passenger redis: host: 127.0.0.1 port: 6379

代码编写

@Service public class VerificationCodeService { // 验证码前缀 private String verificationCodePrefix = "passenger-verification-code-"; @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private ServiceVerificationCodeClient serviceVerificationCodeClient; public ResponseResult generateCode(String passengerPhone){ // 调用验证码服务 System.out.println("调用生成验证码服务"); ResponseResult<NumberCodeResponse> numberCode = serviceVerificationCodeClient.numberCode(6); System.out.println("获取验证码为:" + numberCode.getData().getNumberCode()); //存入redis System.out.println("将验证码存入redis"); String key = verificationCodePrefix + passengerPhone; stringRedisTemplate.opsForValue().set(key, numberCode.getData().toString(),1, TimeUnit.MINUTES); //通过第三发短信商务发送验证码 TODO //返回值 return ResponseResult.success(numberCode); } }

校验验证码

骨架

@PostMapping("/verification-code-check") public ResponseResult verificationCodeCheck(@RequestBody VerificationCodeDTO verificationCodeDTO){ String passengerPhone = verificationCodeDTO.getPassengerPhone(); String verificationCode = verificationCodeDTO.getVerificationCode(); return verificationCodeService.checkCode(passengerPhone, verificationCode); }
/** * 校验验证码 * @param passengerPhone * @param verificationCode * @return */ public ResponseResult checkCode(String passengerPhone, String verificationCode){ //1.根据手机号获取redis中的验证码 //2.校验验证码 //3.判断原来是否存在用户,如果不存在,则创建用户 //4.颁发令牌 TokenResponse tokenResponse = new TokenResponse(); tokenResponse.setToken("token value"); //5.返回结果 return ResponseResult.success(tokenResponse); }

校验redis验证码

/** * 校验验证码 * @param passengerPhone * @param verificationCode * @return */ public ResponseResult checkCode(String passengerPhone, String verificationCode){ //1.根据手机号获取redis中的验证码 String key = generatorKeyByPhone(passengerPhone); String codeRedis = stringRedisTemplate.opsForValue().get(key); System.out.println("redis中的key:"+codeRedis); if (codeRedis == null){ return ResponseResult.fail(CommonStatusEnum.VERIFICATION_CODE_ERROR.getCode(), CommonStatusEnum.VERIFICATION_CODE_ERROR.getValue()); } if (!codeRedis.equals(verificationCode)){ return ResponseResult.fail(CommonStatusEnum.VERIFICATION_CODE_ERROR.getCode(), CommonStatusEnum.VERIFICATION_CODE_ERROR.getValue()); } stringRedisTemplate.delete(key); //2.校验验证码 //3.判断原来是否存在用户,如果不存在,则创建用户 //4.颁发令牌 TokenResponse tokenResponse = new TokenResponse(); tokenResponse.setToken("token value"); //5.返回结果 return ResponseResult.success(tokenResponse); } private String generatorKeyByPhone(String phone){ return verificationCodePrefix + phone; } }

乘客用户服务

骨架

@RestController public class UserController { @Autowired private UserService userService; @PostMapping("/user") public ResponseResult loginOrRegister(@RequestBody VerificationCodeDTO verificationCodeDTO){ String passengerPhone = verificationCodeDTO.getPassengerPhone(); return userService.loginOrRegister(passengerPhone); } }
@Service public class UserService { public ResponseResult loginOrRegister(String passengerPhone){ System.out.println("注册手机号被调用,手机号为:"+passengerPhone); //根据手机号查询用户 //判断用户是否存在 return ResponseResult.success(passengerPhone); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 15:10:20

蒙特卡洛模拟电动汽车的有序充放电策略及其在优化调度、微电网与综合能源、储能、新能源方向的基础入...

蒙特卡洛模拟电动汽车有序充放电(matlab)&#xff0c;适合优化调度&#xff0c;微电网&#xff0c;综合能源、储能、新能源方向的基础入门学习 最近在折腾电动汽车充放电调度的问题&#xff0c;发现蒙特卡洛模拟真是个神器。今天咱们就用Matlab整点有意思的——模拟100辆电动汽…

作者头像 李华
网站建设 2026/7/20 2:04:02

​三拼域名chaojidao.com深度点评​

三拼域名chaojidao.com深度点评 核心结论&#xff1a;chaojidao.com是一枚含义明确、行业属性强、终端潜力巨大的优质三拼域名&#xff0c;尤其在农业科技与食品领域具备突出价值&#xff0c;同时存在 "小米超级岛" 概念的跨界联想空间&#xff0c;建议长期持有并重…

作者头像 李华
网站建设 2026/7/23 8:37:25

漏洞扫描十大工具

漏洞扫描十大工具 AwVS AwVS是一款知名的Web网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的网站安全&#xff0c;检测流行安全漏洞。 a)、自动的客户端脚本分析器&#xff0c;允许对Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试…

作者头像 李华
网站建设 2026/7/23 2:14:54

Redshift vs Octane 深度对比:哪款渲染器更适合 Cinema 4D 工作流程?

在 Cinema 4D 的世界里&#xff0c;选择合适的 GPU 渲染器能够显著提升你的创作效率和渲染质量。当前主流的两个选择是 Redshift 和 OctaneRender&#xff0c;它们各有特点&#xff0c;适合不同风格的项目需求。本文将从核心性能和工作流程体验角度&#xff0c;为你做一个清晰对…

作者头像 李华
网站建设 2026/7/22 23:55:37

【vtkPolyDataPointSampler 】——多边形数据点采样技术详解

VTK核心类解析:vtkPolyDataPointSampler 多边形数据点采样技术详解 简单说,vtkPolyDataPointSampler 就是 VTK里的 “点生成器”—— 专门给 3D 模型(比如三角形、多边形组成的物体)表面或内部,按需求打一堆采样点,生成的点云能直接用在后续的可视化、建模或计算里。 一…

作者头像 李华
网站建设 2026/7/22 13:41:09

电子签章选型指南:云巨头生态服务与垂直专业厂商的六大维度解析

随着电子签章应用在市场越来越普及和受追捧&#xff0c;超级大厂也相继推出了自己的电子签章产品&#xff0c;如华为的华为云电子签、阿里的阿里云电子签、腾讯的腾讯电子签服务。那这些大厂推出的电子签章产品和服务与传统第三方电子签公司北京安证通有什么相同和区别呢&#…

作者头像 李华