预扣库存情况下,怎么归还库存,什么时候归还,谁来触发归还库存的操作。
什么时候:订单过期时,归还库存。
谁来触发:
主动轮询,不够精确。定时器,检查数据库所有到期订单,并且归还.
延迟消息队列:Redis\RocketMQ
Redis:键名通知—不能保证100%
1.TokenGetDTO:
package com.zhqx.missyou.dto;
import com.zhqx.missyou.core.enumeration.LoginType;
import com.zhqx.missyou.dto.validators.TokenPassword;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* 通用用户登录dto
* 在不同登录方式中
* account和password代表的内容不同
*/
@Getter
@Setter
public class TokenGetDTO {
@NotBlank(message = "account不允许为空")
private String account;
@TokenPassword(max=30, message = "{token.password}")
private String password;
private LoginType type;
}
观察数据库表sku,字段specs的格式为json类型,值格式为如下内容:
[{"key": "颜色", "value": "青蓝色", "key_id": 1, "value_id": 1}, {"key": "尺寸", "value": "7英寸", "key_id": 2, "value_id": 5}]
我们可以观察得出,其值为json格式数组,并且每个元素应该代表一个json对象。我们在Sku实体中是以private String specs;形式去接收的。
当我们访问请求localhost:8080/v1/spu/id/28/detail,因为我们在Spu中设置了关联关系,所以得到如下有关skuList结果片段:
{
"id": 43,
"price": 999.00,
"discount_price": null,
"online": true,
"img": "http://xxx.xxx.xxx/7c462cf2-3874-4ecc-85f9-6b4a0fde4623.png",
"title": "Ins复古金色落地灯(落地灯)",
"spu_id": 28,
"specs": "[{\"key\": \"颜色\", \"value\": \"金色\", \"key_id\": 1, \"value_id\": 27}, {\"key\": \"台灯高低\", \"value\": \"落地灯\", \"key_id\": 8, \"value_id\": 38}]",
"code": "28$1-27#8-38",
"stock": 19,
"category_id": 23,
"root_category_id": 4
}
通过前面的步骤,我们可以通过PostMan发送请求,拿回数据。通过访问:localhost:8080/v1/banner/name/b-1,拿回以下数据。
{
"createTime": null,
"updateTime": null,
"deleteTime": null,
"id": 1,
"name": "b-1",
"description": "首页顶部主banner",
"title": null,
"img": "http://xxx.xxx.xxx/d87e180f-0f8a-480c-966a-f2f487b801cc.png",
"items": [
{
"createTime": null,
"updateTime": null,
"deleteTime": null,
"id": 12,
"img": "http://xxx.xxx.xxx/m1.png",
"keyword": "t-2",
"type": 3,
"bannerId": 1,
"name": null
},
{
"createTime": null,
"updateTime": null,
"deleteTime": null,
"id": 13,
"img": "http://xxx.xxx.xxx/assets/702f2ce9-5729-4aa4-aeb3-921513327747.pn",
"keyword": "23",
"type": 1,
"bannerId": 1,
"name": null
},
{
"createTime": null,
"updateTime": null,
"deleteTime": null,
"id": 14,
"img": "http://xxx.xxx.xxx/assets/b8e510a1-8340-43c2-a4b0-0e56a40256f9.png",
"keyword": "24",
"type": 1,
"bannerId": 1,
"name": null
}
]
}
假设在resources目录下新建一个配置文件夹config。在config文件夹下新建2个配置类。application-dev.yml和application-prod.yml。
这里需要注意的时,配置文件可以放在resources目录下任意位置,但是命名的规范必须是以application-开头。
application-dev.yml内容如下:
server:
port: 8081
application-prod.yml内容如下:
server:
port: 8080
将公共的环境配置放在application.yml中,并且配置需要运行dev还是prod配置,内容如下:
spring:
profiles:
#读取dev配置,如果需要读取prod配置,则将dev改成prod
active: dev
zhqx:
api-package: com.zhqx.missyou.api
idea中新建的.yml文件没有提示解决
1.点击File->2.点击Project Structure->3.点击Facets->4.点击中间栏目的Spring(项目名)->5.点击右边栏的小树叶(Customize spring boot)
当前请求为http://localhost:8080/v1/banner/test/1?name=tom。如何在控制器中获取路径的参数值1,以及参数name的值
使用@PathVariable注解来获取请求地址中参数值,使用@RequestParam来获请求地址取携带的参数值。当携带的参数名与方法参数名一致时,可以省略
package com.zhqx.missyou.api.v1;
import com.zhqx.missyou.exception.http.ForbiddenException;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/banner")
public class BannerController {
@GetMapping("/test/{id}")
public String test(@PathVariable Integer id,@RequestParam String name) throws Exception {
throw new ForbiddenException(10001);
}
}
package com.zhqx.missyou.core;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler(value = Exception.class)
public void handleException(HttpServletRequest request, Exception e) {
//处理逻辑
}
}
Error:错误,通常是系统级别的。Exception:异常
CheckedException:必须进行处理的异常,编译阶段不处理就会报错—通常是我们可以处理的异常
RuntimeException:运行时异常—通常是我们不可以处理的异常