自己负责的模块
商品赠品互转的流程实现
-
定义商品赠品互转的数据模型,通常包括以下字段:
- 源商品ID
- 目标商品ID
- 转换条件(例如需要的商品数量和赠品数量)
- 转换时间段(例如开始时间和结束时间)
-
创建商品赠品互转的业务逻辑层,实现商品赠品互转的具体业务逻辑,例如根据用户选择的源商品ID和目标商品ID,查询对应的转换规则,并根据转换条件和转换时间段判断是否可以进行转换。
-
实现商品赠品互转的数据访问层,提供CRUD(创建、读取、更新、删除)操作,实现对转换规则的增删改查功能。
-
创建商品赠品互转的控制器层,提供RESTful API接口,用于接收用户的请求和返回响应数据。
-
实现商品赠品互转的前端界面,用于展示转换规则和操作转换。
-
对商品赠品互转功能进行测试和验证,确保功能的稳定性和安全性。
缓存
1.缓存穿透
当查询一个不存在的数据,缓存中是没有的,将会查询数据库,但是数据库也没有这个数据,并且没有把这次查询的null值存到缓存中,导致每次查询都会到数据层查询,失去了缓存的意义
风险:如果有人利用不存在的数据进行攻击,数据库瞬时压力增大,导致崩溃。
解决:null结果缓存,并加入短暂过期时间
2.缓存雪崩
设置缓存时key采用了相同的过期时间,导致在某一时间同时失效,请求全部到数据库,导致雪崩
解决:在原有的失效时间上增加一个时间随机值,这样每个缓存的过期时间重复率会降低。
3.缓存击穿
对一些设置了过期时间的key,如果此时的key被高频访问(为苹果手机的id),同时此key时间过期,那么所有的请求都会到数据库,导致数据库崩溃,称为缓存击穿
解决:加锁,大量并发只让一个去查,其他人等待,查到之后释放锁,存到缓存中,其他人获取锁,查到缓存中有数据,就不用到数据库中去查
认证服务
1.短信验证码
- 前端页面:用户在前端页面输入手机号码,点击获取验证码按钮发送请求获取验证码。
- 服务端逻辑:后端接收到获取验证码请求后,生成验证码并存储到缓存中(如 Redis)并返回给前端。同时,生成一个唯一标识符并存储到缓存中,用于后续验证验证码的请求。
- 前端页面:用户输入手机号码和收到的验证码后,点击登录按钮发送登录请求。
- 服务端逻辑:后端接收到登录请求后,从缓存中获取存储的验证码和唯一标识符,进行验证。如果验证通过,从数据库中查询该手机号对应的用户信息,生成登录态(如 token),并返回给前端。
- 前端逻辑:前端收到登录成功的响应后,将登录态保存到本地,下次请求时携带登录态进行身份验证。
下面是一份简单的 Java 示例代码,实现了手机验证码登录:
1 // 发送验证码 2 @GetMapping("/sendSmsCode") 3 public ResponseEntity<String> sendSmsCode(@RequestParam("phone") String phone) { 4 // 生成验证码 5 String code = generateSmsCode(); 6 // 存储验证码到 Redis,有效期为 5 分钟 7 redisTemplate.opsForValue().set("sms:code:" + phone, code, Duration.ofMinutes(5)); 8 // 生成并存储唯一标识符到 Redis,有效期为 5 分钟 9 String uuid = UUID.randomUUID().toString(); 10 redisTemplate.opsForValue().set("sms:uuid:" + uuid, phone, Duration.ofMinutes(5)); 11 // 发送验证码到手机 12 sendSms(phone, code); 13 // 返回唯一标识符给前端 14 return ResponseEntity.ok(uuid); 15 } 16 17 // 验证验证码并登录 18 @PostMapping("/loginBySmsCode") 19 public ResponseEntity<String> loginBySmsCode(@RequestParam("phone") String phone, 20 @RequestParam("code") String code, @RequestParam("uuid") String uuid) { 21 // 从 Redis 中获取存储的验证码 22 String storedCode = redisTemplate.opsForValue().get("sms:code:" + phone); 23 // 从 Redis 中获取存储的唯一标识符对应的手机号码 24 String storedPhone = redisTemplate.opsForValue().get("sms:uuid:" + uuid); 25 if (storedCode == null || storedPhone == null || !storedCode.equals(code) || !storedPhone.equals(phone)) { 26 // 验证失败 27 return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("验证码错误或已过期"); 28 } 29 // 验证成功,查询数据库获取用户信息 30 User user = userService.getUserByPhone(phone); 31 if (user == null) { 32 return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户不存在"); 33 } 34 // 生成登录态 35 String token = generateToken(user); 36 // 返回登录态 37 return ResponseEntity.ok(token); 38 }
购物车服务
订单服务
1.微信支付功能
- 注册微信商户平台账号,进行身份认证和商户信息设置。
- 在商户平台中创建支付应用,获得应用ID和应用密钥等必要信息。
- 在后端服务器上编写调用微信支付API的代码。可以使用官方提供的Java SDK,也可以使用第三方库或者自己实现。
- 前端页面集成微信支付组件,调用后端接口获取支付参数并完成支付。
- 支付成功后,微信服务器会通过回调通知商户后端服务器支付结果,商户后端需要对支付结果进行校验并更新订单状态。