银行产品秒杀系统——项目笔记
-
-
- 1.如何让值为null的字段不返回给前端?
- 2.Mybatis-plus怎么接收前端返回的一个数组,然后以JSON形式存入MySQL,并且可以从MySQL中正常取出这个JSON数据返回给前端?
- 3.如何完全解决跨域问题?
- 4.如何在Springboot项目中添加一个全局变量?
- 5.如何往redis中快速插入大批量数据?
- 6.如何在Springboot项目启动后直接执行一段代码?
- 7.如何直接返回给前端一个合理的时间格式?
- 8.Springboot跨域访问为什么会出现OPTION请求呢?
- 9.登录时判断用户输入的是用户名还是手机号
- 10.如何将MultipartFile类型的文件转换为InputStream流,并且把图片转换为Base64
- 11.后端限流——Guava令牌桶
- 12.Mybatis-plus在关联表与实体类时,必须要在自增主键上加上以下注解
- 13.Druid连接池配置
- 14.Sm4国密加密
- 15.如何把fastJSON中的列表字段转换为Java实体类链表
-
1.如何让值为null的字段不返回给前端?
字段为null的值同样会返回给前端,会让交互变得很奇怪,效率也变低。
在application.yml文件中添加以下配置:
jackson:
default-property-inclusion: non_null
2.Mybatis-plus怎么接收前端返回的一个数组,然后以JSON形式存入MySQL,并且可以从MySQL中正常取出这个JSON数据返回给前端?
在Java实体类用于接收该数组的字段上添加@TableField(typeHandler = JacksonTypeHandler.class)
注解,这一注解可以解决第问题,然后在整个实体类上添加@TableName(value = "deposit_good", autoResultMap = true)
注解(主要是autoResultMap = true
),可以解决第二个问题。
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value="deposit_result",autoResultMap = true)
public class DepositResult implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id; //结果id
private Integer userId;
private Integer goodId;
private Integer result;
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Rule> reason;
private String username;
private String avatar;
@TableField(exist = false)
private String phone;
private String reasonStr;
private Date createTime;
}
3.如何完全解决跨域问题?
在项目中添加以下文件:
/**
* 解决跨域问题,不能再在Controller上添加@CrossOrigin注解
*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "CorsFilter")
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
重点是在响应头中添加以下四项:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
4.如何在Springboot项目中添加一个全局变量?
一个全局变量可以用来控制两个文件的执行顺序等,非常方便。因为Springboot项目中可以自动创建对象,并且这个对象默认是单例的,所以我们可以创建一个Bean来解决这个问题。
@Component
@Data
public class GlobalVariable {
private Boolean variable = false;
}
public class ScheduledTaskConfig{
private final GlobalVariable globalVariable;
@Autowired
ScheduledTaskConfig(GlobalVariable globalVariable){
this.globalVariable = globalVariable;
}
globalVariable.setVariable(true); // 这样就成功的设置了全局变量
...
}
5.如何往redis中快速插入大批量数据?
在本次项目中有从MySQL中将大批量数据插入到redis中,仅用jedis遍历插入会非常慢,这里可以使用Pipeline来解决这个问题
Jedis jedis = new Jedis();
Pipeline pipeline = jedis.pipelined;
//下面开始进行管道操作
pipeline.hset(...);
pipeline.hset(...);
pipeline.sync(); // 这个必须要加,否则数据会有丢失!
pipeline.close(); // 关闭管道
jedis.close(); // 回收redis资源
注意,在同一线程中,不能在使用pipeline的同时使用jedis操作redis,否则会报以下错误:
redis.clients.jedis.exceptions.JedisDataException: Cannot use Jedis when in Pipeline. Please use Pipeline or reset jedis state
6.如何在Springboot项目启动后直接执行一段代码?
这种需求可以用于数据的初始化
@Component
public class initialConfig implements ApplicationRunner {
//do something
}
7.如何直接返回给前端一个合理的时间格式?
json默认格式化时间都是时间戳,这样看起来很不明显,前端可能还需要再度格式化。使用@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
注解就可以解决。
public class ClientOrder extends PageSize implements Serializable {
private Integer isLoans;
private Integer orderId;
private String goodName;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
private Integer status;
private Integer userId;
private Double totalPrice;
private String name