当前位置: 首页 > news >正文

深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用

文章背景

在现代软件开发中,我们经常会接触到各种数据结构的概念,比如 Entity、VO(Value Object)、QO(Query Object)、DTO(Data Transfer Object)等。这些概念尽管看似相似,但它们在职责和使用场景上却有着显著的差别。如果能够正确理解和合理使用这些数据结构,将极大地提升代码的可维护性和清晰度。本文将详细分析这些数据结构的特点,并探讨它们在 MVC 三层架构中的应用场景。

 

一、Entity、VO、QO、DTO 的定义与区别

1. Entity(实体)
  • 定义:Entity 是与数据库表一一对应的对象,通常由 ORM 框架(如 Hibernate、MyBatis)生成,用于直接操作数据库。

  • 特点

    • 包含持久化相关的注解(如 @Table@Column)。

    • 映射数据库表的结构。

    • 应该保持简单,避免引入复杂的业务逻辑。

  • 适用场景:持久化层,负责与数据库交互。

2. VO(Value Object,值对象)
  • 定义:VO 是用于在前端和后端之间传递数据的对象,通常表示一组业务相关的展示数据。

  • 特点

    • 通常是只读的,表示某类数据的聚合结果。

    • 反映业务逻辑输出,不直接映射到数据库表。

  • 适用场景:视图层,将后端的数据展示给用户。

3. QO(Query Object,查询对象)
  • 定义:QO 是用于封装查询条件的对象,通常包含分页信息、筛选条件等。

  • 特点

    • 专注于查询参数的传递,避免服务层接收散乱的参数。

    • 简化查询条件的构造和管理。

  • 适用场景:在服务层或数据访问层,用于传递复杂的查询条件。

4. DTO(Data Transfer Object,数据传输对象)
  • 定义:DTO 是用于模块间数据传递的对象,通常对 Entity 进行裁剪或组合,以适应具体业务需求。

  • 特点

    • 仅包含数据属性,不应包含业务逻辑。

    • 减少不必要的传输数据,优化性能。

  • 适用场景:服务层之间、服务与控制层之间的数据传递。


二、MVC 三层架构中的数据结构使用

MVC 架构将应用程序分为三个部分:模型层(Model)、视图层(View)和控制层(Controller),每层的职责明确,数据结构的选择也各有侧重。

1. Model(模型层)
  • 职责

    • 负责业务逻辑的处理和数据操作。

    • 与数据库交互。

  • 推荐数据结构:Entity。

    • Entity 是持久化层的核心。

    • 通过 DAO(Data Access Object)或 Repository 对象操作数据库。

2. View(视图层)
  • 职责

    • 负责数据展示和用户交互。

    • 接收后端的数据,进行页面渲染。

  • 推荐数据结构:VO。

    • VO 将复杂的业务数据封装为适合前端显示的格式。

    • 避免前端直接接触 Entity,确保数据安全。

3. Controller(控制层)
  • 职责

    • 处理用户请求,调用服务层,返回响应结果。

    • 扮演连接视图层和模型层的角色。

  • 推荐数据结构

    • 接收 QO:将前端传递的查询条件封装为 QO,并传递给服务层。

    • 返回 VO:将服务层返回的结果转换为 VO,供前端使用。

    • 使用 DTO:在复杂业务中,从服务层获取或生成 DTO。


三、应用实例:用户管理模块

为了更加直观地说明这些概念,我们以一个用户管理模块为例,展示 Entity、VO、QO、DTO 的具体使用场景。

1. Entity 示例:UserEntity
@Entity
@Table(name = "users")
public class UserEntity {@Idprivate Long id;@Column(name = "username")private String username;@Column(name = "email")private String email;// Getters and Setters
}
2. QO 示例:UserQueryQO
public class UserQueryQO {private String username;private String email;private int page;private int size;// Getters and Setters
}
3. DTO 示例:UserDTO
public class UserDTO {private String username;private String email;// Getters and Setters
}
4. VO 示例:UserVO
public class UserVO {private String username;private String email;public UserVO(String username, String email) {this.username = username;this.email = email;}// Getters and Setters
}
5. Controller 示例
@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic List<UserVO> getUsers(UserQueryQO query) {List<UserDTO> userDTOs = userService.queryUsers(query);return userDTOs.stream().map(dto -> new UserVO(dto.getUsername(), dto.getEmail())).collect(Collectors.toList());}
}

四、总结

在不同的场景中,合理选择数据结构能够显著提升系统的健壮性和维护性:

  • Entity:与数据库直接交互,体现数据的持久化特性。

  • VO:面向前端,聚合数据用于展示。

  • QO:封装查询条件,简化服务层和数据层的参数管理。

  • DTO:模块之间数据传递的核心,避免直接暴露 Entity。

通过明确每种数据结构的职责,并结合 MVC 三层架构的分层设计,我们可以构建更加清晰、高效和可维护的系统。如果您对本文内容有任何建议或疑问,欢迎在评论区交流!

相关文章:

深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用

文章背景 在现代软件开发中&#xff0c;我们经常会接触到各种数据结构的概念&#xff0c;比如 Entity、VO&#xff08;Value Object&#xff09;、QO&#xff08;Query Object&#xff09;、DTO&#xff08;Data Transfer Object&#xff09;等。这些概念尽管看似相似&#xff…...

角色认知培训

课程记录 需求传达的时候先强调重点&#xff0c;理清需求的过程中&#xff0c;大家一起分析 一开始单线程&#xff0c;总结复盘&#xff0c;提升效率&#xff0c;变成多线程 心态 2、复盘能力&#xff0c;每次优化策略 优化 团结、执行、 3、 头马的理解&#xff1f; 小…...

记录一次微信小程序使用云能力开发的过程

对于开发微信小程序云开发不知从何起的同学们&#xff0c;可以当作一次参考。虽说官方有文档&#xff0c;有模板示例&#xff0c;但是这些都是片段或者完整的结果展示。对于初学或者开发经验较少的同学们&#xff0c;可能不知先从那里入手进行第一步的开发。下面解析下构建微信…...

vim将一行行尾倒数第三个字符替换成1

%s/\v(.)(.)(.)(.)$/1\2\3\4\v:very magic模式&#xff0c;可以省略转义符 &#xff08;.&#xff09;:圆括号的分组功能&#xff0c;将括号匹配内容放到第一个寄存器里面&#xff0c;第二个括号匹配内容放到第二个寄存器里面。 $:匹配行尾字符 \2:第二个括号匹配内容 \3:第三个…...

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息异步发送消息 生产者配置client.idacks消息传递时间max.block.msdelivery.timeout.msrequest.timeout.msretries 和retry.backoff.…...

Yolov8 目标检测剪枝学习记录

最近在进行YOLOv8系列的轻量化&#xff0c;目前在网络结构方面的优化已经接近极限了&#xff0c;所以想要学习一下模型剪枝是否能够进一步优化模型的性能 这里主要参考了torch-pruning的基本使用&#xff0c;v8模型剪枝&#xff0c;Jetson nano部署剪枝YOLOv8 下面只是记录一个…...

5G+工业互联网迈入规模化发展新阶段

百度安全验证 https://blog.csdn.net/qq_25467441/article/details/145036191?sharetypeblogdetail&sharerId145036191&sharereferPC&sharesourceqq_25467441&spm1011.2480.3001.8118 好看视频-轻松有收获 产业供给加速提升。国内主流模组厂商引领全球5G模组…...

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09; 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…...

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了&#xff0c;欢迎广大GISer朋友关注&#xff0c;一起探索GIS奥秘&#xff0c;分享GIS价值&#xff01; 本专栏以实战案例的形式&#xff0c;深入浅出地介绍了GRASS GIS的基本使用方法&#xff0c;用一个个实例讲…...

Spring boot面试题---- Spring boot项目运行原理

1.启动流程概述 Spring Boot 的启动是从一个带有main方法的主类开始的。这个主类通常会有一个@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan。@Configuration注解表明这个类是一个配置类,它可以定义…...

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …...

码编译安装httpd 2.4,测试

下载链接&#xff1a;https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.gz [rootopenEuler-1 ~]# yum install gcc gcc-c make -y [rootopenEuler-1 ~]# ll /root total 9648 -rw-------. 1 root root 920 Jan 10 17:15 anaconda-ks.cfg -rw-r--r-- 1 root root 9872432…...

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义&#xff1a;DHCP是一种网络协议&#xf…...

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…...

【计算机体系结构、微架构性能分析】core 与 uncore 分别是哪一些部分?区分 core 和 uncore

在计算机体系结构中&#xff0c;Core 和 Uncore 是描述处理器内部架构的两个重要概念&#xff0c;尤其在多核处理器中更为常见。 1. Core&#xff08;核心&#xff09; Core 指的是处理器中的计算核心&#xff0c;是执行指令和处理数据的基本单元。每个核心都包含独立的执行单…...

基于 K-Means 聚类分析实现人脸照片的快速分类

注:本文在创作过程中得到了 ChatGPT、DeepSeek、Kimi 的智能辅助支持,由作者本人完成最终审阅。 在 “视频是不能 P 的” 系列文章中,博主曾先后分享过人脸检测、人脸识别等相关主题的内容。今天,博主想和大家讨论的是人脸分类问题。你是否曾在人群中认错人,或是盯着熟人的…...

Ubuntu更改apache的服务端口

1.介绍 承接上文&#xff0c;上文介绍了如何利用apache快速部署自己的网页&#xff0c;直接访问localhost就能打开网页的界面&#xff0c;这里其实是直接用了Ubuntu的80端口访问&#xff0c;如果我想换一个端口访问呢&#xff1f;应该怎么实现&#xff1f; 这一篇文章就来教你&…...

9.7 visual studio 搭建yolov10的onnx的预测(c++)

1.环境配置 在进行onnx预测前&#xff0c;需要搭建的环境如下: 1.opencv环境的配置&#xff0c;可参考博客:9.2 c搭建opencv环境-CSDN博客 2.libtorch环境的配置&#xff0c;可参考博客&#xff1a;9.4 visualStudio 2022 配置 cuda 和 torch (c)-CSDN博客 3.cuda环境的配置…...

“飞的”点外卖,科技新潮流来袭

一、开篇引入 上个周末&#xff0c;阳光正好&#xff0c;我带着孩子去公园游玩。公园里绿草如茵&#xff0c;花朵绽放&#xff0c;孩子们在草地上嬉笑奔跑&#xff0c;好不快活。玩累了&#xff0c;我们便在草坪上的帐篷里休息。 就在这时&#xff0c;天空中突然传来一阵嗡嗡…...

kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试

序言&#xff1a; 在大型电商、购物、直播活动期间&#xff0c;对于火爆流量的激增&#xff0c;如何保障业务稳定并且做到资源不浪费&#xff0c;自动回收。 场景&#xff1a;kubernetes 原生容器化承载业务流量&#xff08;非云环境&#xff09; 方案&#xff1a;kubernetes自…...

java使用poi-tl自定义word模板导出

文章目录 概要整体架构流程创建word模板核心代码导出结果 概要 在软件开发领域&#xff0c;自定义Word模板的使用是导出格式化数据的一种常见做法。poi-tl&#xff08;Apache POI Template Language&#xff09;作为一款基于广受认可的Apache POI库的Word模板引擎&#xff0c;…...

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…...

本地部署Web-Check网站检测与分析利器并实现远程访问实时监测

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本文我们将详细介绍如何在Ubuntu系统上使用Docker部署Web-Check&#xf…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

doris:本地文件导入

Doris 提供多种方式从本地数据导入&#xff1a; Stream Load Stream Load 是通过 HTTP 协议将本地文件或数据流导入到 Doris 中。Stream Load 是一个同步导入方式&#xff0c;执行导入后返回导入结果&#xff0c;可以通过请求的返回判断导入是否成功。支持导入 CSV、JSON、Pa…...

【网络安全】FortiOS Authentication bypass in Node.js websocket module

文章目录 漏洞说明严重等级影响的产品和解决措施推荐阅读 漏洞说明 FortiOS存在一个使用替代路径或者信道进行身份验证绕过漏洞&#xff0c;可能允许未经身份验证的远程攻击者透过向Node.js WebSocket模块发送特别设计的请求&#xff0c;可能获得超级管理员权限。 Fortinet 官…...

原型与原型链

建议大家看的时候手动画图&#xff01;&#xff01;&#xff01;这点很重要&#xff01;&#xff01;&#xff01; 原型链在结构上很像链表&#xff0c;每个对象中都保存着一个地址&#xff0c;指向当前对象的原型&#xff0c;可以层层向上查找&#xff0c;起到继承的效果。 …...

TIM定时中断

TIM定时中断 文章目录 TIM定时中断1.TIM定时器1.1定时器的定义1.1.1基本定时器1.1.2通用定时器1.1.3高级定时器 2.计数器有预装时序3.定时器结构及涉及的函数解析3.1定时中断基本结构3.2实现步骤3.3TIM本小节的库函数解释说明3.4计数器计数频率和计数器溢出频率 4.定时器定时中…...

Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步

在 Windows 上的 MySQL 8.4.3 和 WSL&#xff08;Ubuntu&#xff09;的 MySQL 8.0.40 之间配置 主从同步&#xff08;Master-Slave Replication&#xff09; 的过程略有不同&#xff0c;因为两者的 MySQL 版本和环境存在差异。以下是详细步骤&#xff0c;帮助你完成跨平台的主从…...

中职网络建设与运维ansible服务

ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本&#xff0c;可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…...

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…...

win32汇编环境,窗口程序中对多行编辑框的操作

;运行效果 ;win32汇编环境,窗口程序中对多行编辑框的操作 ;比如生成多行编辑框&#xff0c;显示文本、获取文本、设置滚动条、捕获超出文本长度消息等。 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>&g…...

Java反射、静态代理、动态代理

往期推荐 Java io模型-CSDN博客 如何设计一个能根据任务优先级来执行的线程池-CSDN博客 Web实时消息推送的几种方案_setmessageinnerhtml is not defined-CSDN博客 yum、dnf、apt包管理工具-CSDN博客 概述 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够…...

在Android 15的设备上关闭edge-to-edge功能

Android 15在开发上有很多更新&#xff0c;当APP的targetSdk设置为35&#xff0c;且设备系统为Android 15时&#xff0c;APP会自动启动edge-to-edge功能。虽然可视面积变大了&#xff0c;但界面布局也会受影响。 如果要强制关闭edge-to-edge功能。可以在style.xml中将windowOp…...

GIS大模型:交通领域方面的应用

文章目录 1. 实时交通流量预测&#xff1a;2. 动态信号灯控制&#xff1a;3. 交通流模式识别&#xff1a;4. 交通事故预警&#xff1a;5. 路径推荐与导航优化&#xff1a;6. 长期交通规划&#xff1a;7. 事件影响分析&#xff1a;8. 智能停车管理&#xff1a; 大模型在交通流量…...

Vi 和 Vim 文本编辑器使用指南

目录 基本模式 查找与替换 Vi&#xff08;Visual&#xff09;和 Vim&#xff08;Vi Improved&#xff09;是两款在 Unix/Linux 系统中广泛使用的文本编辑器。Vim 是 Vi 的改进版本&#xff0c;继承了 Vi 的核心功能&#xff0c;并增加了许多新特性&#xff0c;如语法高亮、多…...

redis acl

redis acl redis 安全访问控制 官网 本文基于redis 6.2.17 版本进行测试验证 使用方式 redis 使用 acl 的配置有2种方式&#xff1a;使用 redis.conf 文件配置&#xff0c;和在 redis.conf 文件中配置 aclfile path 指定外部 aclfile 文件路径 使用 redis.conf 文件配置 …...

Linux Centos 安装Jenkins到服务

一、前言 假设你已经下载了jenkins.war 安装了对应的jdk&#xff0c;下面我们来安装jenkins&#xff0c;以服务的形式安装。 二、安装 1&#xff09;将jenkins.war拷贝到合适的位置&#xff0c;我的位置 /u01/jenkins/ &#xff0c;位置你自己选。 2&#xff09;创建系统用户…...

WINFORM - DevExpress -> gridcontrol ---->控件(ColumnEdit控件)

ImageComboBoxEdit--带图片的下拉菜单 DevExpress&#xff1a;带图片的下拉菜单ImageComboBoxEdit_weixin_34313182的博客-CSDN博客 ImageEdit--图片按钮 DevExpress控件中的gridcontrol表格控件&#xff0c;如何在属性中设置某一列显示为图片&#xff08;图片按钮&#xff…...

工作中redis常用的5种场景

在日常开发工作中&#xff0c;Redis作为一款高性能的内存数据库&#xff0c;凭借其强大的功能特性和卓越的性能表现&#xff0c;已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实际工作中最常见的5种应用场景&#xff0c;并附上具体的代码实现。 1. 缓存热点数据…...

得物App利用技术赋能,打造潮流消费“新玩法”

如今&#xff0c;技术的力量正在以前所未有的方式重塑着我们的消费体验。从线上购物到虚拟现实&#xff0c;技术的角色越来越重要&#xff0c;它不仅是推动商业发展的引擎&#xff0c;更是满足年轻消费者多元化、个性化需求的关键。得物App作为一个年轻人喜爱的潮流消费平台&am…...

tomcat状态一直是Exited (1)

docker run -di -p 80:8080 --nametomcat001 你的仓库地址/tomcat:9执行此命令后tomcat一直是Exited(1)状态 解决办法&#xff1a; 用以下命令创建运行 docker run -it --name tomcat001 -p 80:8080 -d 你的仓库地址/tomcat:9 /bin/bash最终结果 tomcat成功启动...

015: 深度学习之正向传播和反向传播

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节介绍了训练和推理的概念&#xff0c;这一节接着训练和推理的概念讲一下&#xff0c;神经网络的正向传播和反向传播。 正反向传播 其实单看正向传播和反向传播这两个…...

ubuntu下安装编译cmake,grpc与protobuf

文章目录 install cmakeinstall grpcinstall protobuf注 install cmake sudo apt-get install -y g make libssl-devcd third_party/cmake-3.17.2./configuresudo make && make installcmake --version install grpc $ sudo apt-get install -y build-essential auto…...

如何在Mac上使用Brew更新Cursor应用程序

在这篇博文中&#xff0c;我们将介绍如何在Mac上更新Cursor应用程序&#xff0c;以及一些相关的使用技巧和功能。 什么是Cursor&#xff1f; Cursor是一款强大的工具&#xff0c;旨在帮助用户更好地编写、编辑和讨论代码。它结合了AI技术&#xff0c;使得编程过程更加高效和便…...

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知识图谱初始化文件夹修改模型配置修改知识库生成配置创…...

LevelDB 源码阅读:如何优雅地合并写入和删除操作

LevelDB 支持写入单个键值对和批量写入多个键值对&#xff0c;这两种操作的处理流程本质上是相同的&#xff0c;都会被封装进一个 WriteBatch 对象中&#xff0c;这样就可以提高写操作的效率。 在 LevelDB 中&#xff0c;WriteBatch 是通过一个简单的数据结构实现的&#xff0…...

Vue.js 组件的生命周期钩子

Vue.js 组件的生命周期钩子 在 Vue.js 中&#xff0c;组件的生命周期是指组件从创建到销毁的整个过程。在这个过程中&#xff0c;Vue 提供了多个 生命周期钩子&#xff0c;让我们可以在不同的阶段执行特定的逻辑。掌握这些钩子非常重要&#xff0c;它们能帮助我们灵活控制组件…...

VD:生成a2l文件

目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了&#xff0c;这时的a2l文件还没有地址&#xff0c;所以紧接着会去通过elf文件更新地址&#xff0c;一直以为这是固定的流程和方法&#xff0c;今天无…...

【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…...