Java EE 突击 9 - Spring Boot 日志文件
Spring Boot 日志文件
- 学习目标
- 一 . 日志有什么用
- 1.1 日志格式说明
- 二 . 自定义日志打印
- 2.1 得到日志对象
- 2.2 使用日志对象提供的方法 , 输出自定义的日志内容
- 2.3 日志的级别
- 三 . 日志持久化
- 3.1 在配置文件里面设置日志名称
- 3.2 设置日志的保存目录
- 四 . 日志级别的设置
- 五 . 简化日志的小技巧 - lombok
- 5.1 lombok 的使用
- 5.2 lombok 的原理
- 5.3 lombok 更多注解说明
- 总结
这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架
JavaEE 进阶专栏Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在
接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点
并且带领大家进行环境的配置 , 让大家真正用好框架、学懂框架
来上一篇文章复习一下吧
点击即可跳转到我的小秘密
学习目标
- 输出自定义日志信息
- 将日志持久化
- 通过设置日志的级别来筛选和控制日志的内容
一 . 日志有什么用
日志只有一个作用 : 发现问题 定位问题
我们之前已经使用了很多次的日志
除了发现和定位问题之外,我们还可以通过日志实现以下功能:
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
- 记录系统的操作 , 方便数据恢复和定位操作。
- 记录程序的执行时间 , 方便为以后优化程序提供数据支持。
1.1 日志格式说明
日志打印级别 : 用来筛选有效信息
在日常调试和开发过程中 , 我们需要看的日志通常会比较多 , 在生产环境的时候 , 我们并不需要看调试日志以及开发日志 , 我们就可以把他屏蔽掉 , 也可以把 Spring Boot 展示给我们的日志(INFO) 也关闭掉 , 只展示报错以及警告信息 , 那么我们就可以通过日志的级别来进行筛选关键信息 . 而且打印日志也是会消耗一定资源的 , 所以在线上环境就尽量别弄出什么幺蛾子了 .
通过目前我们了解到的日志 , 我们发现三个问题 :
- 这是 Spring Boot 默认的日志格式 , 目前我们打印出的都是系统自己的日志 , 那么我们怎么样能让控制台打印我们自己的日志 ?
- 我们的日志是保存在我们的内存上的 , 那么假如我们的线上环境出现了问题 , 我们也不能说让人一直去看着 , 出现问题赶紧把开发人员叫过来查看日志 , 所以日志的持久化保存也是非常有必要的
- 我们需要通过日志的级别来筛选我们需要的信息
二 . 自定义日志打印
自定义日止的实现步骤 :
- 在程序中得到日志对象
- 使用日志对象的相关语法输出要打印的内容
我们思考一个问题 : 使用 sout 语句能否替代日志呢 ?
TestController.java
package com.example.demo.aa.bb;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;// 这个注解什么意思先不用管
@RestController
public class TestController {// 这个注解什么意思先不用管@RequestMapping("/sayhi")public String sayHi() {System.out.println("这里正在测试日志");return "日志";}
}
我们这不也打印出相关信息了吗 ?
但是感觉跟正常的日志差得有点多 , 感觉不太靠谱
- 只有打印的内容 , 没有其他的相关信息 , 比如打印的时间、打印的类(出处)
- 不能实现不同环境下的行为控制
比如我们的日志能够通过日志级别筛选 , 让线上环境或者开发环境展示出不同的信息 , 而 sout 语句不行 , 他会在哪里都打印的
所以使用 sout 语句是不能替代日志的 , 还是需要专业的人干专业的事的
2.1 得到日志对象
导入 Logger 对象
注意 : 一定要选择 org.slf4j (飒楼否四节)
然后使用 Logger 的 LoggerFactory 里面的 getLogger 方法, 参数填写当前类.class
2.2 使用日志对象提供的方法 , 输出自定义的日志内容
使用 log.
的方式 , 接下来我们就可以打印日志了
package com.example.demo.aa.bb;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {// 1. 得到日志对象private static Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/sayhi")public String sayHi() {// 2. 打印日志log.info("Hi,Spring Boot Log.");//使用日志对象的方法输出日志return "日志";}
}
那么我们上面告诉大家一定要用 slf4j , 那么 slf4j 是个什么东西 ?
我们的 slf4j 与 Spring Boot 是密切相关的 , slf4j 也是目前行业中的日志标杆了 , 他的日志以我们目前对于 Spring Boot 的理解来说 , 还算是比较复杂的 . 但看似很简单的日志 , 其实是由两部分实现的
我们可以这样理解 : 日志门面就是前端 , 日志实现就是后端
为什么一个简简单单的日志还要分解为日志门面还有日志实现呢 ?
最刚开始 , 其实日志是不分类的 , 后来发现了一个问题 : 我们的代码通用性问题 , 假如我们最开始用 log4j 1/2 , 但是后来他就出现漏洞了 , 所以大家又转战到了 logback , 但是使用 logback 就出现了问题 : 我们之前所有调用日志代码的地方就需要去更改 , 这样日志就没有通用性了 , 所以我们就再抽象一层 , 我们是从 slf4j 使用的 , slf4j 会自己帮我们解决好适配性问题 , 提高代码的移植性
其实和我们 JDBC 的问题是一样的 , 大家都是为了能够提高代码的通用性
2.3 日志的级别
我们不光可以打印普通日志 , 还可以打印其他等级的日志
package com.example.demo.aa.bb;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {// 1. 得到日志对象private static Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/sayhi")public String sayHi() {// 2. 打印日志// 级别从上到下逐个提升的log.trace("Hi,I am trace.");//痕迹日志log.debug("Hi,I am debug.");//调试日志log.info("Hi,I am info.");//普通日志log.warn("Hi,I am warn.");//警告日志log.error("Hi,I am error");//报错return "日志";}
}
那为什么剩下两个没被打印呢 ?
这是因为默认情况下日志级别是 info , 所以就把 trace debug 筛选下去了
那么我们都有哪些级别的日志呢 ?
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
那么我们上面只打印出来五种啊 , 咋没打印第六种 .
可以看到 , 我们是调用不出来 fatal 的 . 这种致命的错误不是你说调就调出来的 , 当发生异常情况导致终止的时候才能看到 fatal , 甚至说严重点 , 还没有多少人见过他的芳容 .
三 . 日志持久化
3.1 在配置文件里面设置日志名称
我们在 application.yml 里面添加这句配置项
# 设置日志文件的文件名
logging:file:name: springboot.log
接下来运行查看一下效果
还可以这样去看
如果有的同学没看见日志在哪里 , 可以把 target 文件夹删除 , 重新运行再来看
接下来 , 我们就可以把项目停掉 , 来看一下咱们的日志
那么我们重新运行 , 新的日志是追加在后面还是覆盖掉 ?
肯定是追加在后面 , 不然还是有日志丢失的风险 .
重新运行后的日志就变多了
那么日志一直追加 , 越来越大 , 打开的速度就会变得非常慢 , 寻找日志就比较麻烦 , 那怎么办呢 ?
当日志比较大的时候 , 会自动分割成多个文件 , 所以不用去担心
3.2 设置日志的保存目录
# 设置日志文件的目录
logging:file:path: D:\study\JavaCode
我们打开这个目录看一下是否真的生成了 ?
那么我们把程序停止 , 看看日志里面有什么 ?
那么这种方式能不能追加日志呢 ?
也是可以追加的
四 . 日志级别的设置
日志级别的设置非常的精细化 , 可以针对于某个目录设置日志级别 , 还可以设置一个全局的日志级别
日志级别配置只需要在配置文件中设置 “logging level” 配置项即可
logging:level:root: debug
注意 : 我们之前写过 logging , 要是再写一个 logging 的话就会报错
所以我们可以在一个 logging 标签底下写多个配置项
logging:file:path: D:\study\JavaCodelevel:root: warn # 根路径
那么有的人只想看到自己的 DEBUG 日志 , 不想看到 Spring 的 DEBUG 日志 , 因为 Spring 的 DEBUG 日志实在是太多了 , 那么我们就可以把系统日志设置的级别高一些 , 可以让 Spring 的日志级别设置成 warn , 我们自己的代码的日志级别设置成 debug
logging:file:path: D:\study\JavaCodelevel:root: warn # 根路径com:example:demo: debug # com.example.demo 下面的所有类,日志级别都是 debug
那么我们想要自己的日志级别为 trace , 系统日志为 warn 怎么处理呢 , 同样很简单
logging:file:path: D:\study\JavaCodelevel:root: warn # 根路径com:example:demo: trace
接下来 , 我们模拟一下真实的开发环境
上节课我们学过多平台的配置文件设置 , 那么我们就可以根据不同的环境打印出不同等级的日志了
首先 , 我们创建出三个不同的环境的配置文件
开发环境的配置文件 : application-dev.yml
测试环境的配置文件 : application-test.yml
生产环境的配置文件 : application-prod.yml
然后我们分别在每个配置文件中设置不一样的端口 , 方便我们后续测试效果
然后接下来设置每个环境的日志等级
开发环境设置成系统日志为 warn , 自己的日志为 debug
测试环境设置成系统日志为 warn , 自己的日志为 info
生产环境设置成系统日志为 warn , 自己的日志为 warn
接下来在我们总的配置文件中调用每个单独的配置文件
# 运行环境设置
spring:profiles:active: dev
记得这里要去浏览器访问 127.0.0.1:8888/sayhi
, 因为我们的开发环境配置文件端口号是 8888
这次访问 127.0.0.1:9999/sayhi
# 运行环境设置
spring:profiles:active: test
这次访问 127.0.0.1:11111/sayhi
# 运行环境设置
spring:profiles:active: prod
五 . 简化日志的小技巧 - lombok
我们在 com.example.demo 包底下新建一个 StudentController 类
然后编写代码
package com.example.demo;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class StudentController {// 1. 得到日志对象private static Logger logger = LoggerFactory.getLogger(StudentController.class);@RequestMapping("/hi")public String sayHi() {// 2. 使用日志对象提供的方法进行日志打印logger.trace("Hi,I am trace.");logger.debug("Hi,I am debug.");return "Hi,Spring Boot.";}
}
但是每次这样写 , 我们还觉得怪麻烦的
那我们的 Spring Boot 还是可以解决这个问题的
这就需要我们使用额外的库 - lombok
我们之前不想写 Getter Setter 方法 , 只要在上面加上 @Getter @Setter 注解 , 甚至直接加一个 @Data 注解即可
等到日志这里 , 我们发现唯一不同的 ,就是图片里圈出来那部分 , lombok 发现了 , 只有类型不同 , 那么我们只需要拿到当前类的类型呗 , 那我就通过一个注解帮你完成 , 注解内部就是我们图片里的这句代码 , lombok 自动帮我们获取类型了
那怎么使用 lombok 来更简单的输出呢 ?
5.1 lombok 的使用
- 添加 lombok 框架支持。
- 使用 @slf4j 注解输出日志。
package com.example.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;// 1. 引入 lombok 依赖
@Slf4j
@RestController
public class StudentController {@RequestMapping("/hi")public String sayHi() {// 2. 使用日志对象提供的方法进行日志打印log.debug("Hi,I am debug.");return "Hi,Spring Boot.";}
}
有的同学可能调用不出来 lombok , 比如这样
只需要添加 lombok 的依赖即可
右键 -> Generate
选择 Dependency
搜索 lombok , 选择第二个
这样 lombok 依赖就自己添加进去了
前提是 IDEA 版本是 2021.3.2+ , 其他版本我们也可以选择装一个插件 : EditStarters 实现依赖引入
这个页面似曾相识
这样依赖就添加进去了 , 记得手动刷新一下
5.2 lombok 的原理
实际上 , 原理就是这样
lombok 在编译期间就开始干活了 , 这样对于 JVM 来说是感知不到的 , 他就知道我们传过来的代码里面已经有日志对象了
5.3 lombok 更多注解说明
基本注解 :
注解 | 作用 |
---|---|
@Getter | 自动添加 getter 方法 |
@Setter | 自动添加 setter 方法 |
@ToString | 自动添加 toString 方法 |
@EqualsAndHashCode | 自动添加 equals 和 hashCode 方法 |
@NoArgsConstructor | 自动添加 无参构造 方法 |
@AllArgsConstructor | 自动添加 全属性的构造方法 方法 , 顺序按照属性的定义顺序 |
@NonNull | 属性设置成不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造方法 , final + @NonNull 的属性为必需 |
组合注解 :
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + |
@EqualsAndHashCode + | |
@RequiredArgsConstructor + | |
@NoArgsConstructor |
日志注解 :
注解 | 作用 |
---|---|
@Slf4j | 添加⼀个名为 log 的日志,使用 slf4j |
总结
日志是程序中的重要组成部分,试用日志可以快速的发现和定位问题,Spring Boot 提供了日志框架 , 默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印自定义日志,⽇日志包含 6 个级别:
- trace:微量,少许的意思,级别最低;
- info:普通的打印信息;
- debug:需要调试时候的关键信息打印;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
日志级别依次提升 , 而日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。
至此 , Spring Boot 的日志文件就分享完毕 , 给个三连来救救小猫
相关文章:

Java EE 突击 9 - Spring Boot 日志文件
Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…...
篇十六:命令模式:封装请求
篇十六:"命令模式:封装请求" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料&#x…...
Android 系统框架
启动流程 init 进程启动过程 Android系统启动流程 Zygote启动流程及源码分析 APP启动流程 init进程是Android用户空间第一个进程,主要做以下3件事情: 创建和挂载启动所需的文件目录。初始化和启动关键服务,守护关键服务。解析init.rc配…...
【Hystrix技术指南】(3)超时机制的原理和实现
[每日一句] 也许你度过了很糟糕的一天,但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使…...

MySQL: Failed to Connect to MySQL at XXXX:3306 with user root
客户端连接MySQL服务器,报错: 解决方案: 没有让root用户远程登录,需要设置; 进入MySQL服务器,修改一下 # mysql -h localhost -uroot -P3306 -p12345678 mysql: [Warning] Using a password on the comm…...

《大型网站技术架构设计》第二篇 架构-性能
不同视角下的网站性能 1、用户 从用户角度,网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢。用户感受到的时间。 2、开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定…...

谷歌推出AI模型机器人RT2 将文本和图像输出为机器人动作
去年年底,ChatGPT火遍全球,全世界都见识了大语言模型的强大力量。人们对大模型不再陌生,开始使用基于大模型的应用绘画、作图、搜索资料、设计剧情等,而妙用不止于此。谷歌推出了Robotics Transformer 2(RT2),这是一个…...
常见的服务器安全管理漏洞
常见的服务器安全管理漏洞 企业信息化技术的应用,以不可逆转。随着文件服务器、ERP管理软件等等在企业中生根发芽,应用服务器也逐渐在企业中普及起来。以前在企业中有一台应用服务器已经是了不起的事情,现在有两台、三台的,也不为…...
JavaScript高级:探索作用域链的神秘面纱
在 JavaScript 的编程世界中,作用域是一种控制变量可访问性和生命周期的机制。而作用域链则是闭包的关键所在,它使得函数在创建时捕获并保存了外部作用域的变量,为 JavaScript 增添了更多的魔力。本文将深入探讨作用域链的概念和作用…...

mysql数据库如何转移到oracle
mysql数据库转移到oracle 在研发过程中,可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中, 比如说从mysql中迁移到oracle中, 常用的方法有好些,如下 1、使用powerdesigner,先连接mysql然后生成mysql的p…...

nnU-Net 终极指南
一、说明 了解最先进的nnU-Net以及如何将其应用于您自己的数据集所需的一切。使用nnU-Net,这是语义图像分割中非常强大的基线。在本指南中,您将: 对nnU-Net的主要贡献进行简要概述。了解如何将 nnU-Net 应用于您自己的数据集。 但是ÿ…...

ubuntu 安装 python
ubuntu 安装 python 初环境与设备查询是否安装安装python 本篇文章将介绍ubuntu 安装 python 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统:ubuntu 查询是否安装 因为系统也许会自带一个python,所以验证一下,如果自…...

【腾讯云 Cloud studio 实战训练营】云端 IDE 构建移动端H5
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…...
Kubernetes 之 Kubeadm 搭建
Kubeadm 搭建 一、搭建准备1.1 环境准备1.2 所有节点安装docker1.3 所有主机安装 cri-dockerd1.4 所有节点安装kubeadm,kubelet和kubectl1.5 部署K8S集群1.6 设定kubectl1.7 部署 Dashboard 一、搭建准备 master(2C/4G,cpu核心数要求大于2&a…...

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget
一、前言 QStackedWidget继承于QFrame,QFrame继承于QWidget,是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口,根据下标切换,一次显示一个小部件,常用于应用界面切换、图片轮询播放等场景。 二、QSt…...
浅谈测试开发岗位
一、测试开发的概念与需求 测试开发,通常也被称为自动化测试,是一个涵盖了从测试设计、开发、执行和结果分析等一系列活动的职位。在软件开发的生命周期中,测试开发起着至关重要的作用,其主要目标是确保软件的质量和性能达到预期…...
典型移动APP安全风险提醒
研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备,各式各样的App更是丰富了人们的生活:从社交到出行、从网购到外卖,从办公到娱乐等,App已成为大众生活必需品。然而,App的流行使人们对App…...

多平台发布文章-项目总结
做个最近的AIGC内容创作技术要点的总结吧😼 流程图 时序图...
什么是IoC?什么是Spring IoC?什么是DI?
首先说明 IoC 是一种思想,IoC的全称是Inversion of Control,翻译成中文叫做“控制反转” 用人话来说,IoC的思想就是将一个对象对另一个对象的控制权交出去(不必关心交给谁),从而让对象之间的依赖关系降低&…...

分布式任务调度平台XXL-JOB学习笔记-helloworld运行
环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot&#x…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...