小熊家务帮day15-day17 预约下单模块(预约下单,熔断降级,支付功能,退款功能)

目录

  • 1 预约下单
    • 1.1 需求分析
      • 1.1.1 业务流程
      • 1.1.2 订单状态
    • 1.2 系统设计
      • 1.2.1 订单表设计
      • 1.2.2 表结构的设置
    • 1.3 开发远程调用接口
      • 1.3.0 复习下远程调用的开发
      • 1.3.1 查询地址簿远程接口
        • jzo2o-api工程定义接口
        • Customer服务实现接口
      • 1.3.2 查询服务&服务项远程接口
        • jzo2o-api工程定义接口
        • foundations服务实现接口
          • Mapper开发
          • Service层开发
          • Controller开发
    • 1.4 熔断降级
      • 1.4.1 复习
      • 1.4.2 使用sentinel实现熔断降级
      • 1.4.3 客户端集成sentinel
      • 1.4.4 sentinel实现熔断降级代码
      • 1.4.5 测试
    • 1.5 接口设计
      • 1.5.1 接口分析
      • 1.5.1 接口开发
        • Controller层开发
        • Service层开发

1 预约下单

1.1 需求分析

1.1.1 业务流程

首先明确本模块在核心业务流程的位置,下图是项目的核心业务流程:
在这里插入图片描述
大概界面原型如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1.2 订单状态

本项目订单状态共有7种,如下图:
在这里插入图片描述
待支付:订单的初始状态。
派单中:用户支付成功后订单的状态由待支付变为派单中。
待服务:服务人员或机构抢单成功订单的状态由派单中变为待服务。
服务中:服务人员开始服务,订单状态变为服务中。
订单完成:服务人员完成服务订单状态变为订单完成。
已取消:订单是待支付状态时用户取消订单,订单状态变为已取消。
已关闭:订单已支付状态下取消订单后订单状态变为已关闭。

1.2 系统设计

1.2.1 订单表设计

在设计订单表时通常采用的结构是订单主表与订单明细表一对多关系结构,比如:在电商系统中,一个订单购买的多件不同的商品,设计订单表和订单明细表:
订单表:记录订单号、订单金额、下单人、订单状态等信息。
订单明细表:记录该订单购买商品的信息,包括:商品名称、商品价格、交易价格、购买商品数量等。

如下图:
在这里插入图片描述

1.2.2 表结构的设置

除了订单号、订单金额、订单状态、下单人ID等字段外,订单表还存储哪些信息?
根据需求梳理预约下单提交的数据如下:
在这里插入图片描述
通过分析,订单表包括以下几部分:
订单基础信息:订单号、订单状态、排序字段、是否显示标记等。
价格信息:单价、购买数量、优惠金额、订单总金额等。
下单人信息:下单人ID、联系方式、位置信息(相当于收货地址)等。
服务(商品)相关信息:服务类型名称、服务项名称、服务单价、价格单位、购买数量等。
服务信息相当于商品,如果有订单明细表要在订单明细表中存储,本项目将服务相关信息存储在订单表。

Mysql表结构如下:

create table `jzo2o-orders`.orders
(id               bigint                             not null comment '订单id'constraint `PRIMARY`primary key,user_id          bigint                             not null comment '订单所属人',serve_type_id    bigint                             null comment '服务类型id',serve_type_name  varchar(50)                        null comment '服务类型名称',serve_item_id    bigint                             not null comment '服务项id',serve_item_name  varchar(50)                        null comment '服务项名称',serve_item_img   varchar(255)                       null comment '服务项图片',unit             int                                null comment '服务单位',serve_id         bigint                             not null comment '服务id',orders_status    int                                not null comment '订单状态,0:待支付,100:派单中,200:待服务,300:服务中,400:待评价,500:订单完成,600:已取消,700:已关闭',pay_status       int                                null comment '支付状态,2:待支付,4:支付成功',refund_status    int                                null comment '退款状态 1退款中 2退款成功 3退款失败',price            decimal(10, 2)                     not null comment '单价',pur_num          int      default 1                 not null comment '购买数量',total_amount     decimal(10, 2)                     not null comment '订单总金额',real_pay_amount  decimal(10, 2)                     not null comment '实际支付金额',discount_amount  decimal(10, 2)                     not null comment '优惠金额',city_code        varchar(20)                        not null comment '城市编码',serve_address    varchar(255)                       not null comment '服务详细地址',contacts_phone   varchar(20)                        not null comment '联系人手机号',contacts_name    varchar(255)                       not null comment '联系人姓名',serve_start_time datetime                           not null comment '服务开始时间',lon              double(10, 5)                      null comment '经度',lat              double(10, 5)                      null comment '纬度',pay_time         datetime                           null comment '支付时间',evaluation_time  datetime                           null comment '评价时间',trading_order_no bigint                             null comment '支付服务交易单号',transaction_id   varchar(50)                        null comment '第三方支付的交易号',refund_no        bigint                             null comment '支付服务退款单号',refund_id        varchar(50)                        null comment '第三方支付的退款单号',trading_channel  varchar(50)                        null comment '支付渠道',display          int      default 1                 null comment '用户端是否展示,1:展示,0:隐藏',sort_by          bigint                             null comment '排序字段,serve_start_time毫秒级时间戳+订单id后六位',create_time      datetime default CURRENT_TIMESTAMP not null,update_time      datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP
)

数据来源分析:
其中serve_id,pur_num ,serve_start_time 是前端传过来的

1.3 开发远程调用接口

下单接口保存的数据较多,有一些数据需要远程调用来获取:

  1. 根据地址簿Id远程调用客户中心,查询我的地址簿信息。
  2. 根据服务Id远程调用运营基础服务,查询服务相关的信息。

1.3.0 复习下远程调用的开发

由于远程调用接口会被大量微服务所用,因此可以把接口抽取复用到一个API工程
之后,例如查询用户的远程调用,我们需要在API工程写一个接口,而在Customer微服务(远程调用中的服务端)进行实现接口即可,因此在开发中,一般先开发服务端,再开发远程调用的客户端,最后把API工程打包放入依赖仓库即可使用。

1.3.1 查询地址簿远程接口

微服务之间远程调用的接口统一定义在jzo2o-api工程。
查询地址簿远程接口是根据地址簿ID查询地址簿信息,接口定义如下:
接口路径:GET/customer/inner/address-book/{id}
请求数据类型 application/x-www-form-urlencoded

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jzo2o-api工程定义接口
/*** 地址薄相关的远程调用接口*/
//contextId 指定FeignClient实例的上下文id,如果不设置默认为类名,value指定微服务的名称,path:指定接口地址
@FeignClient(contextId = "jzo2o-customer", value = "jzo2o-customer", path = "/customer/inner/address-book")
public interface AddressBookApi {@GetMapping("/{id}")AddressBookResDTO detail(@PathVariable("id") Long id);
}
Customer服务实现接口
/*** 地址薄远程调用*/
@RestController
@RequestMapping("inner/address-book")
@Api(tags = "内部接口 - 地址薄相关接口")
public class InnerAddressBookController implements AddressBookApi {private IAddressBookService addressBookService;@Override@GetMapping("/{id}")@ApiOperation("地址薄详情")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "地址薄id", required = true, dataTypeClass = Long.class)})public AddressBookResDTO detail(@PathVariable("id") Long id) {AddressBook addressBook = addressBookService.getById(id);return BeanUtil.toBean(addressBook, AddressBookResDTO.class);}

1.3.2 查询服务&服务项远程接口

jzo2o-api工程定义接口
@FeignClient(contextId = "jzo2o-foundations", value = "jzo2o-foundations", path = "/foundations/inner/serve")
public interface ServeApi {@GetMapping("/{id}")ServeAggregationResDTO findById(@PathVariable("id") Long id);}
foundations服务实现接口

很明显这是个多表关联查询,不能用MP,因此先开发Mapper

Mapper开发
    /*** 根据id查询详情** @param id 服务id* @return 服务详情*/ServeAggregationResDTO findServeDetailById(@Param("id") Long id);
    <select id="findServeDetailById" resultType="com.jzo2o.api.foundations.dto.response.ServeAggregationResDTO">SELECTserve.id,serve.city_code,serve.price,serve.is_hot,serve.hot_time_stamp,serve.sale_status,item.id AS serve_item_id,item.`name` AS serve_item_name,item.img AS serve_item_img,item.detail_img,item.serve_item_icon,item.unit,item.sort_num AS serve_item_sort_num,item.serve_type_id AS serve_type_id,type.`name` AS serve_type_name,type.img AS serve_type_img,type.serve_type_icon,type.sort_num AS serve_type_sort_numFROMserveinner JOIN serve_item AS item ON item.id = serve.serve_item_idinner JOIN serve_type AS type ON type.id = item.serve_type_idWHEREserve.id = #{id}</select>
Service层开发
    /*** 根据id查询详情** @param id 服务id* @return 服务详情*/@Overridepublic ServeAggregationResDTO findServeDetailById(Long id) {return baseMapper.findServeDetailById(id);}
Controller开发
@RestController
@RequestMapping("/inner/serve")
@Api(tags = "内部接口 - 服务相关接口")
public class InnerServeController implements ServeApi {@Resourceprivate IServeService serveService;@Override@GetMapping("/{id}")@ApiOperation("根据id查询服务")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "服务项id", required = true, dataTypeClass = Long.class)})public ServeAggregationResDTO findById(@NotNull(message = "id不能为空") @PathVariable("id") Long id) {return serveService.findServeDetailById(id);}
}

1.4 熔断降级

1.4.1 复习

什么是熔断降级?
在微服务架构一定要去预防微服务雪崩问题,微服务雪崩问题是指在微服务架构中,当一个服务出现故障时,由于服务之间的依赖关系,故障可能会传播到其他服务,导致大规模的服务失败,系统无法正常运行。这种情况就像雪崩一样,最初一个小问题最终引发了整个系统的崩溃。简单理解微服务雪崩就是微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。

常用的预防微服务雪崩的的方法:
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
熔断降级:当服务的异常数或异常比例超过了预设的阈值时,熔断器会进入开启状态,暂时中断对该服务的请求,此时走降级方法,能够快速响应,确保系统的基本功能能够继续运行。
限流:限制对服务的请求速率,避免短时间内大量的请求导致系统崩溃。
线程池隔离:给要请求的资源分配一个线程池,线程池去控制请求数量

1.4.2 使用sentinel实现熔断降级

本项目使用Sentinel实现限流、熔断等机制预防微服务雪崩。
熔断降级是微服务保护的一种方法,当使用Feign进行远程调用,在客户端通过熔断降级措施进行微服务保护。
如下图:
在这里插入图片描述
orders-manager订单服务请求customer查询地址簿,在进行feign远程调用过程出现异常将走降级方法,当异常比例或异常数达到一定的阈值将触发熔断,熔断期间将直接走降级逻辑快速响应。
当customer服务恢复后,熔断时间结束此时会再次尝试请求customer,如果成功请求将关闭熔断,恢复原来的链路。

根据上图可知,熔断、降级发生在客户端,下边在订单管理服务(调用customer的客户端)定义CustomerClient类用于请求customer服务。

1.4.3 客户端集成sentinel

这里是以服务提供者为单独定义远程调用Client类,如果要远程调用jzo2o-foundations服务则定义CustomerClient 类。

添加nacos配置文件shared-sentinel.yaml,如下:
在这里插入图片描述
在order项目中引入shared-sentinel.yaml配置文件:

  cloud:nacos:config:file-extension: yamlshared-configs: # 共享配置- data-id: shared-redis-cluster.yaml # 共享redis集群配置refresh: false- data-id: shared-xxl-job.yaml # xxl-job配置refresh: false- data-id: shared-rabbitmq.yaml # rabbitmq配置refresh: false- data-id: shared-es.yaml # esrefresh: false- data-id: shared-mysql.yaml # mysql配置refresh: false- data-id: shared-sentinel.yaml # msentinel配置refresh: false  

项目代码中添加依赖

<dependency><groupId>com.jzo2o</groupId><artifactId>jzo2o-sentinel</artifactId>
</dependency>

问:为什么这样呢?
答:我在fremwork中定义了全部依赖,只需要在需要这个sentinel的地方导入这一个依赖就可以全部导入所有相关依赖

1.4.4 sentinel实现熔断降级代码

问:为什么不在api定义这个熔断处理器
答:因为每个客户端的业务需求不一样

@SentinelResource注解的属性说明:
value: 用于定义资源的名称,即 Sentinel 会对该资源进行流量控制和熔断降级。
fallback :非限流、熔断等导致的异常执行的降级方法
blockHandler :触发限流、熔断时执行的降级方法

测试:

/*** 调用customer的客户端类*/
@Component
@Slf4j
public class CustomerClient {@Resourceprivate AddressBookApi addressBookApi;/*** 客户端定义自己的降级逻辑* @param id* @return*///value 资源名称 将来在sentinel可以查到//fallback   定义降级逻辑//blockHandler 定义降级逻辑@SentinelResource(value = "getAddressBookDetail", fallback = "detailFallback", blockHandler = "detailBlockHandler")public AddressBookResDTO getDetail(Long id){AddressBookResDTO detail = addressBookApi.detail(id);return detail;}//getDetail执行异常走这个方法public AddressBookResDTO detailFallback(Long id, Throwable throwable) {log.error("非限流、熔断等导致的异常执行的降级方法,id:{},throwable:", id, throwable);return null;}//熔断后的降级逻辑public AddressBookResDTO detailBlockHandler(Long id, BlockException blockException) {log.error("触发限流、熔断时执行的降级方法,id:{},blockException:", id, blockException);return null;}
}

下边在下单方法中通过CustomerClient 调用customer:

@Slf4j
@Service
public class OrdersCreateServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersCreateService {@Resourceprivate CustomerClient customerClient;/*** 下单服务* @param placeOrderReqDTO* @return*/@Overridepublic PlaceOrderResDTO placeOrder(PlaceOrderReqDTO placeOrderReqDTO) {//地址簿idLong addressBookId = placeOrderReqDTO.getAddressBookId();//下单人信息,获取地址簿,调用jzo2o-customer服务获取AddressBookResDTO detail = customerClient.getDetail(addressBookId);//服务相关信息,调用jzo2o-foundations获取//生成订单号//计算价格//组装订单信息,插入数据库订单表return null;}}

使用项目使用@EnableFeignClients扫描Feign接口,生成代理对象。
具体代码在jzo2o-api工程:

@Slf4j
@Configuration
@EnableFeignClients(basePackages = "com.jzo2o.api")
@Import({com.jzo2o.utils.MyQueryMapEncoder.class})
@ConditionalOnProperty(prefix = "feign", name = "enable", havingValue = "true")
public class ClientScanConfiguration {........

在CustomerClient 中注入了Feign接口的代理对象,通过Feign进行远程调用。

1.4.5 测试

1、通过接口文档测试下单接口,触发customerClient.getDetail(addressBookId);
五秒内俩异常就测完了,关闭customer服务发两次请求就行了
在这里插入图片描述
2、在sentinel中配置熔断规则
在这里插入图片描述
5秒以内最少请求2次,有1次异常则进行熔断。熔断时长为30秒。

3、测试:
一次异常后熔断:
在这里插入图片描述
后面再发请求就是熔断降级方法:
在这里插入图片描述

1.5 接口设计

整个订单模块包括:订单管理、抢单、派单、历史订单四个小模块,对应的工程如下:
在这里插入图片描述

1.5.1 接口分析

除了serve_id、pur_num、serve_start_time 由前端传入以外还需要传入以下参数:
优惠券ID:用户选择优惠券,系统根据优惠券的信息计算优惠金额,需要前端传入优惠券的Id。
我的地址簿ID:用户从我的地址簿中选择地址,前端传入我的地址簿Id,系统从我的地址簿中查询服务地址及具体的经纬度坐标。
其中服务和服务项的信息需要远程调用Foundations服务,而关于客户的信息需要远程调用Costumer服务
接口定义如下:
接口名称:下单接口
接口功能:普通用户创建订单
接口路径:POST/orders-manager/consumer/orders/place
请求数据类型 application/json
在这里插入图片描述
在这里插入图片描述

1.5.1 接口开发

Controller层开发
    @ApiOperation("下单接口")@PostMapping("/place")public PlaceOrderResDTO place(@RequestBody PlaceOrderReqDTO placeOrderReqDTO) {return ordersCreateService.placeOrder(placeOrderReqDTO);}
Service层开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/344699.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维 之 DNS域名解析

前言 我们每天打开的网站&#xff0c;他是如何来解析&#xff0c;并且我们怎么能得到网站的内容反馈的界面呢&#xff1f;那什么是DNS呢&#xff08;DNS&#xff08;DomainNameservice&#xff0c;域名服务&#xff0c;主要用于因特网上作为域名和IP地址相互映射&#xff09;那…

【iOS】MRC下的单例模式批量创建单例

单例模式的介绍和ARC下的单例请见这篇&#xff1a;【iOS】单例模式 目录 关闭ARC环境MRC下的单例ARC下的单例批量创建单例Demo 关闭ARC环境 首先关闭ARC环境&#xff0c;即打开MRC&#xff1a; 或是指定某特定目标文件为非ARC环境&#xff1a; 双击某个类文件&#xff0c;指定…

SpringBoot2+Vue3开发课程审核流程系统

SpringBoot2Vue3开发课程审核流程系统 简介 此系统实现了课程审核全流程功能并使用了Activiti7工作流技术&#xff0c;功能包含&#xff1a;课程管理、用户管理、流程定义、课程审核&#xff08;我的申请、我的代办、我的已办&#xff09; 功能介绍 课程管理 对课程信息的管…

C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)

目录 一、set 1.set的介绍 2.set的使用 2.1 set的模板参数列表 2.2 set的构造 2.3 set的迭代器 2.4 set的容量 2.5 set的修改操作 2.6 set的使用举例 二、map 1.map的介绍 2.map的使用 2.1 map的模板参数说明 2.2 map的构造 2.3 map的迭代器 2.4 map的容量与元…

API测试工具

apifox 微信扫描登录 不推荐&#xff1a; Download Postman

QT creator c动态链接库的创建与调用

QT creator c动态链接库的创建与调用 QT5.15.2 1.创建dll项目 确保两类型选择正确 2.选择MinGW 64-bit 3.点击完成 pro文件参考&#xff1a; QT - guiTEMPLATE lib DEFINES QT_DLL_DEMO_LIBRARYCONFIG c17# You can make your code fail to compile if it uses deprecat…

Flutter 使用ffigen生成ffmpeg的dart接口

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频 第七章 使用ff…

以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】

【Less-54】 与前面的题目不同是&#xff0c;这里只能提交10次&#xff0c;一旦提交超过十次&#xff0c;数据会重新刷新&#xff0c;所有的步骤需要重来一次。 解题步骤&#xff1a; 根据测试&#xff0c;使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …

.NET MAUI 了解MVVM

MVVM 模式中有三个核心组件&#xff1a;模型、视图和视图模型。 每个组件的用途不同。 下图显示了这三个组件之间的关系。 视图 视图负责定义用户在屏幕上看到的结构、布局和外观。 理想情况下&#xff0c;每个视图在 XAML 中定义&#xff0c;代码隐藏有限&#xff0c;不包含业…

(论文翻译)Coordinate Attention for Efficient Mobile Network Design(坐标注意力 CVPR2021)

Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09; 文章目录 Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09;摘要1.引言2.相关工作3.方法&#xff1a;Coordinate Attention3.1.Revisit …

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

C++ | Leetcode C++题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {auto wordDictSet unordered_set <string> ();for (auto word: wordDict) {wordDictSet.insert(word);}auto dp vector <bool> (s.…

【el-tooltips改造】Vue实现文本溢出才显示el-tooltip,否则不显示el-tooltips

实现原理&#xff1a; 使用disabled属性控制el-tooltip的content显示与隐藏&#xff1b; 目标&#xff1a; 1行省略、多行省略、可缩放页面内的文本省略都有效。 实现方式&#xff1a; 1、自定义全局指令&#xff0c;tooltipAutoShow.js代码如下&#xff08;参考的el-table中的…

04 架构核心技术之分布式消息队列

本课时的主题是分布式消息队列&#xff0c;分布式消息队列的知识结构如下图。 本课时主要介绍以下内容。 同步架构和异步架构的区别。异步架构的主要组成部分&#xff1a;消息生产者、消息消费者、分布式消息队列。异步架构的两种主要模型&#xff1a;点对点模型和发布订阅模型…

C# 异步方法async / await 任务超时处理

一、需求 如果调用一个异步方法后&#xff0c;一直不给返回值结果怎么办呢&#xff1f;这就涉及到怎么取消任务了。 二、Task取消任务 static CancellationTokenSource source new CancellationTokenSource();static void Main(string[] args){Task.Run(() >{for (int i …

【基于C++与OpenCV实现魔方图像识别和还原算法】施工总览图

文章目录 主要效果展示思维导图魔方还原算法 本系列博客长期更新&#xff0c;分为两大部分 OpenCV实现魔方六面识别 C编写科先巴二阶段还原算法实现三阶魔方的还原 主要效果展示 摄像头识别六面 3D图像构建&#xff0c;提供还原公式 动画演示还原过程 思维导图 魔方还原算法 参…

PowerDesigner导入Excel模板生成数据表

PowerDesigner导入Excel模板生成数据表 1.准备好需要导入的Excel表结构数据,模板内容如下图所示 2.打开PowerDesigner,新建一个physical data model文件,填入文件名称,选择数据库类型 3.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口…

免费开源图片转文字识别软件:Umi-OCR

目录 1.介绍 2.项目亮点 3.项目功能&#xff08;已实现&#xff09; 4.功能体验 5.项目集成&#xff08;调用接口&#xff09; 6.项目地址 1.介绍 Umi-OCR&#xff1a;免费&#xff0c;开源&#xff0c;可批量的离线OCR软件&#xff0c;目前适用于 Windows7 x64 及以上。…

【机器人和人工智能——自主巡航赛项】进阶篇

文章目录 案例要求创建地图rviz仿真 保存地图坐标点定位识别训练主逻辑理解语音播报模块匹配二维码识别多点导航讲解视频其余篇章 案例要求 创建地图 ./1-gmapping.sh 把多个launch文件融合在sh文件里面 rviz仿真 rviz是rose集成的可视化界面&#xff0c;查看机器人的各项数…

深度学习:如何静悄悄地改变我们的日常生活

深度学习 深度学习&#xff1a;如何静悄悄地改变我们的日常生活一、消费电子产品智能手机与个人助理娱乐与社交媒体 二、医疗健康三、汽车与交通四、公共安全五、总结 深度学习&#xff1a;如何静悄悄地改变我们的日常生活 在近年来&#xff0c;深度学习技术因其强大的数据处理…