苍穹外卖源码
自己的学习笔记,记录学到什么。
可以通过注解读取配置的属性,再注入就ok
反向代理
负载均衡
之前一直用postman测试接口,Swagger相比postman,可以自动
扫描,不用手动输路径去测试,还可以通过注解标注每个方法,属性。
postman是可以记忆测试的参数,Swagger毕竟是网页打开,很多参数无法保存。
Swagger与Yapi
ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程*,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
项目通过鉴权后用ThreadLocal存储用户的身份信息,后续需要获取用户身份信息就可以直接获取。
其他应用场景拓展:线程安全、日志上下文存储、traceld存储、数据库Session、PageHelper分页
**两个作用:**1.解决并发问题。2.在线程中传递数据
PageHelper也是基于ThreadLocal来保存分页的页数。
新学到,两种格式化时间方式
用lombok注解@Builder在实体类上就可以用了
使用方式如下图
每个表的公共字段如创建时间,修改时间,创建人等,利用注解和aop实现统一管理
代码
拓展:
aop还可以用作日志的记录
AccessKey ID
LTAI5tCYmsLqkrvHxPHKmcfS
AccessKey Secret
e7McOFAnDEnWXdrcyO80PUqSXq2nBj
day04是自己练习,我只写了新增套餐,
学到了在修改的时候可以
redis 5大基本类型:
缓存击穿:是指当某一key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。
缓存穿透:是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。
缓存雪崩:是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。
在记忆这几个概念的时候,不要死记硬背,你可以尝试这样记忆:
首先,雪崩的概念比较容易记,就是很多个Key同时过期才会雪崩,"缓存雪崩的时候没有一个Key是无辜的"。至于穿透和击穿,区别在于穿透是"透",什么叫透呢,那就是不仅缓存被击穿了,数据库也被击穿了,这种才叫透。所以,这种缓存和数据库中都没有的情况叫做"缓存穿透"
用户查到接口的内容时候,可以把接口返回的结果放在redis中,防止多个用户频繁查询数据库,优化查询时间
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderVO extends Orders implements Serializable {
//订单菜品信息
private String orderDishes;
//订单详情
private List<OrderDetail> orderDetailList;
}
{
"code":1, "msg":null, "data":{
"id":11, "number":"1713256492556", "status":6, "userId":4, "addressBookId":2, "orderTime":
"2024-04-16 16:34", "checkoutTime":null, "payMethod":1, "payStatus":0, "amount":169.00, "remark":"", "userName":
null, "phone":"15502877777", "address":null, "consignee":"大笨狗", "cancelReason":"用户取消", "rejectionReason":
null, "cancelTime":"2024-04-17 00:40", "estimatedDeliveryTime":"2024-04-16 17:34", "deliveryStatus":
0, "deliveryTime":null, "packAmount":2, "tablewareNumber":0, "tablewareStatus":0, "orderDishes":
null, "orderDetailList":[{
"id":6, "name":"鮰鱼2斤", "orderId":11, "dishId":67, "setmealId":null, "dishFlavor":"微辣", "number":
1, "amount":72.00, "image":
"https://sky-itcast.oss-cn-beijing.aliyuncs.com/8cfcc576-4b66-4a09-ac68-ad5b273c2590.png"
},{
"id":7, "name":"馋嘴牛蛙", "orderId":11, "dishId":64, "setmealId":null, "dishFlavor":null, "number":
1, "amount":89.00, "image":
"https://take-out-heima.oss-cn-beijing.aliyuncs.com/3d8b7c33-eafb-4494-ad6c-a4313eb09d2c.png"
}]}
}
再来一单接口
/**
* 处理超时订单的方法
*/
@Scheduled(cron = "0 * * * * ? ") //每分钟触发一次
public void processTimeoutOrder(){
log.info("定时处理超时订单:{}", LocalDateTime.now());
//当前时间减15分钟
LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
//查找超过15分钟的订单
List<Orders> ordersList= orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT,time);
//修改订单状态
if (ordersList !=null && ordersList.size()>0) {
for (Orders orders : ordersList) {
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("订单超时,自动取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
}
}
websocket实现来单提醒和用户催单
Map map = new HashMap();
map.put("begin",beginTime);
map.put("end",endTime);
map.put("status", Orders.COMPLETED);
Double turnover = orderMapper.sumByMap(map);
Double sumByMap(Map map);
<select id="sumByMap" resultType="java.lang.Double">
select sum(amount) from orders
<where>
<if test="begin !=null">and order_time > #{begin}</if>
<if test="end !=null">and order_time < #{end}</if>
<if test="status !=null">and status = #{status}</if>
</where>
</select>
stream流可用于操作集合或者数组的数据
优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
与静态方法引用差不多
这里compareToIgnoreCase是String提供的方法
处理office的开源项目
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。