记一次k8s下容器启动失败,容器无日志问题排查

问题

背景

本地开发时,某应用增加logback-spring.xml配置文件,加入必要的依赖:

<dependency>
	<groupId>net.logstash.logback</groupId>
	<artifactId>logstash-logback-encoder</artifactId>
	<version>8.0</version>
</dependency>

本地可以正常启动。

但是发布到测试环境后,容器启动失败
在这里插入图片描述
其状态CrashLoopBackOff,不管是通过执行kubectl logs <pod> -n <ns>命令查看日志,还是在KubeSphere查看容器日志,都没有任何日志输出。

排查

KubeSphere看到容器的状态为
在这里插入图片描述
容器的事件:
在这里插入图片描述
信息如下:

Warning  Unhealthy  75s (x10 over 5m15s)  kubelet            Startup probe failed: Get "http://172.20.0.95:8012/health": dial tcp 172.20.0.95:8012: connect: connection refused
Back-off restarting failed container fileview in pod 

使用k9s查看日志:
在这里插入图片描述
各种无头苍蝇乱排查:

  • 删除容器,自动重启,不行;
  • 修改探针时间,不行;
  • kubectl describe pod <pod_name> -n <ns>,没看出问题。

总之,看不到任何有效信息,无法定位问题。

workaround

通过KubeSphere,打开【应用负载】-【工作负载】,搜索【fileview】,【编辑YAML】,使用一个有效的之前的镜像版本,即回滚:
在这里插入图片描述
版本号,在Harbor镜像仓库里,根据代码提交和流水线构建日期,选择一个变更前的版本。然后删除容器组里的现有容器,会自动重启。

然后重启成功!!

说明还是由于代码提交导致测试环境里的容器启动失败。

Git Commit

代码提交记录如下:
在这里插入图片描述
新增的配置文件logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位毫秒。当scan为true时,此才能属性生效。默认时间间隔为30s。 -->
<configuration scan="true" scanPeriod="30 seconds">
    <!--  彩色日志依赖  -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!-- 线上日志文件路径-->
    <property name="JSON_FILE_PATH" value="/logs/service/fileview"/>

    <!--  控制台彩色日志格式  -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %green([traceId=%X{traceId} spanId=%X{spanId} sampled=%X{sampled}]) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--  日志文件日志格式  -->
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} [%X{traceId}] ${PID:- } --- [%15t] %-40.40logger{39}:[%5.5line] - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--  json日志格式  -->
    <property name="JSON_LOG_PATTERN"
              value='{"localtime": "%date{yyyy-MM-dd HH:mm:ss.SSS}","level": "%level","pid": "${PID:-}","thread": "%thread","traceId": "%X{traceId}","class": "%logger","method": "%method","line": "%line","message": "%message","stack":"%wEx"}'/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 以JSON格式写入log文件 -->
    <appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${JSON_FILE_PATH}/log_%d{yyyyMMdd}_%i.log</FileNamePattern>
            <!--日志文件最大大小-->
            <maxFileSize>200MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>5</maxHistory>
            <!-- 每个日志文件到200MB的时候开始切分,最多保留5天,但最大到5GB,哪怕没到5天也要删除多余的日志 -->
            <totalSizeCap>5GB</totalSizeCap>
            <!--启动项目触发删除检测  -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <pattern>
                    <pattern>${JSON_LOG_PATTERN}</pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!--本地调试打印控制台彩色日志-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>

    <springProfile name="dev,uat,test,pre,gray,future,prd,prod">
        <root level="INFO">
            <appender-ref ref="JSON_FILE"/>
        </root>
    </springProfile>
</configuration>

在本地开发环境Debug模式启动应用时,可以正常启动。

另外,上面这个配置文件,引入一个LoggingEventCompositeJsonEncoder,因此需要引入logstash-logback-encoder依赖。

但没有注意到:Spring Boot并没有加载此文件logback-spring.xml,也没有重视这一点。

事实上,针对这次提交涉及的4个文件,到底是哪个改动引发问题,定位时,也耗费掉不少时间。

只是这里直接将问题定位为logback配置文件。

Docker

既然本地启动成功,测试环境启动失败。能不能在本地模拟测试环境?

于是花费一点时间,在Windows开发环境下安装Docker Desktop。

IDEA在某个版本后自带Docker开发插件:
在这里插入图片描述
稍微摸索一下,就知道如何使用Docker插件,填写镜像地址,点击Pull接口
在这里插入图片描述
镜像拉取成功后,点击右侧的Create Container:
在这里插入图片描述
容器启动失败,报错日志:

Logging system failed to initialize using configuration from 'null'
2024-12-29T08:31:31.991172257Z java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [encoder] of type [net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder] java.lang.ClassNotFoundException: net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder
2024-12-29T08:31:31.991194340Z ERROR in ch.qos.logback.core.joran.spi.Interpreter@36:24 - no applicable action for [providers], current ElementPath  is [[configuration][appender][encoder][providers]]
2024-12-29T08:31:31.991197106Z ERROR in ch.qos.logback.core.joran.spi.Interpreter@37:26 - no applicable action for [pattern], current ElementPath  is [[configuration][appender][encoder][providers][pattern]]
2024-12-29T08:31:31.991199506Z ERROR in ch.qos.logback.core.joran.spi.Interpreter@38:30 - no applicable action for [pattern], current ElementPath  is [[configuration][appender][encoder][providers][pattern][pattern]]
2024-12-29T08:31:31.991201798Z ERROR in ch.qos.logback.core.ConsoleAppender[JSON] - No encoder set for the appender named "JSON".

这说明什么??

说明在以容器方式启动应用时,应用加载logback配置文件失败。

此时,才开始重视前文提到的:应用启动时,Spring Boot并没有加载logback-spring.xml文件。

logback

现在来解决,为啥本地开发环境Debug模式启动应用,Spring Boot为啥没有加载logback-spring.xml文件。

应用的目录结构如下:
在这里插入图片描述
因为application.properties文件在config目录下,于是不带思考地,把logback-spring.xml文件也放在config目录下。

logback-spring.xml文件移到resources目录下,Spring Boot还是不能加载logback-spring.xml文件。

把文件重命名为为logback.xml,终于可以加载。

JDK版本

本地启动,应用不再报错,发布到测试环境,容器启动还是失败。

不过,终于可以看到容器日志!!!具体的报错信息(经过换行处理,方便阅读):

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
net/logstash/logback/encoder/LoggingEventCompositeJsonEncoder has been compiled by a more recent version of the Java Runtime (class file version 55.0), 
this version of the Java Runtime only recognizes class file versions up to 52.0

很熟悉的报错,是不是:

  • 52.0对应于JDK 8版本
  • 55.0对应于JDK 11版本

此应用的Dockerfile如下:

FROM harbor.aaaa.com/library/fileview:4.4.0-beta

ADD target/kkFileView-*.tar.gz /opt/
ENV KKFILEVIEW_BIN_FOLDER /opt/kkFileView-4.4.0-beta/bin
ENTRYPOINT ["java", "-Dfile.encoding=UTF-8", "-Dspring.config.location=/opt/kkFileView-4.4.0-beta/config/application.properties", "-jar", "/opt/kkFileView-4.4.0-beta/bin/kkFileView-4.4.0-beta.jar"]

基础镜像是fileview:4.4.0-beta,看不出Java版本,默认应该就是JDK 8。

登录到Harbor镜像仓库,查看镜像信息,果然是JDK8:

{
    "ArgsEscaped": true,
    "Cmd": [
        "/bin/bash"
    ],
    "Env": [
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_251/bin",
        "JAVA_HOME=/usr/local/jdk1.8.0_251",
        "CLASSPATH=/usr/local/jdk1.8.0_251/lib/dt.jar:/usr/local/jdk1.8.0_251/lib/tools.jar",
        "LANG=zh_CN.UTF-8",
        "LC_ALL=zh_CN.UTF-8"
    ],
    "Labels": {
        "org.opencontainers.image.ref.name": "ubuntu",
        "org.opencontainers.image.version": "20.04"
    }
}

其构建历史(无关信息)为:

ARG RELEASE
ARG LAUNCHPAD_BUILD_ARCH
LABEL org.opencontainers.image.ref.name=ubuntu
LABEL org.opencontainers.image.version=20.04
ADD file:e7cff353f027ecf0a2cb1cdd51714de3b083a11a0d965f104489f9a7e6925056 in /
CMD ["/bin/bash"]
COPY fonts/* /usr/share/fonts/chinese/ # buildkit
COPY server-jre-8u251-linux-x64.tar.gz /tmp/server-jre-8u251-linux-x64.tar.gz # buildkit
COPY LibreOffice_7.5.3.2_Linux_x86-64_deb.tar.gz /tmp/libreoffice_deb.tar.gz # buildkit
RUN RUN apt-get clean && apt-get update && sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list && sed -i 's/# deb/deb/g' /etc/apt/sources.list && apt-get install -y --reinstall ca-certificates && apt-get clean && apt-get update && apt-get install -y locales language-pack-zh-hans && localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && locale-gen zh_CN.UTF-8 && export DEBIAN_FRONTEND=noninteractive && apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && apt-get install -y fontconfig ttf-mscorefonts-installer ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy && apt-get install -y wget && cd /tmp && tar -zxf /tmp/server-jre-8u251-linux-x64.tar.gz && mv /tmp/jdk1.8.0_251 /usr/local/ && apt-get install -y libxrender1 libxinerama1 libxt6 libxext-dev libfreetype6-dev libcairo2 libcups2 libx11-xcb1 libnss3 && tar -zxf /tmp/libreoffice_deb.tar.gz && cd /tmp/LibreOffice_7.5.3.2_Linux_x86-64_deb/DEBS && dpkg -i *.deb && rm -rf /tmp/* && rm -rf /var/lib/apt/lists/* && cd /usr/share/fonts/chinese && mkfontscale && mkfontdir && fc-cache -fv # buildkit
ENV JAVA_HOME=/usr/local/jdk1.8.0_251
ENV CLASSPATH=/usr/local/jdk1.8.0_251/lib/dt.jar:/usr/local/jdk1.8.0_251/lib/tools.jar
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_251/bin
ENV LANG=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
CMD ["/bin/bash"]

本地开发环境切换到JDK 8,debug模式启动应用,果然启动报错:
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.StaticLoggerBinder

但是,为啥和测试环境的报错信息不一样呢??

org.slf4j.impl.StaticLoggerBinder这个类是在logback-classic-1.2.3.jar里引入的:
在这里插入图片描述
不管了,开发任务太重了。没有时间去仔细探究。

降低logstash-logback-encoder版本8.0到6.6:

<dependency>
	<groupId>net.logstash.logback</groupId>
	<artifactId>logstash-logback-encoder</artifactId>
	<version>6.6</version>
</dependency>

不再报错:Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.StaticLoggerBinder

提交代码,触发流水线构建,发布到测试环境,启动成功。

logback.xml还是logback-spring.xml

问题虽然解决。

但是还留有不少疑问,此应用分明是一个Spring-Boot应用啊,为啥不能加载logback-spring.xml
在这里插入图片描述
可以加载logback.xml
在这里插入图片描述
另外,虽然可以加载文件,但是应用启动时会打印出一些ERROR日志:
在这里插入图片描述
报错日志如下:

13:09:22,777 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@72:65 - no applicable action for [springProfile], current ElementPath  is [[configuration][springProfile]]
13:09:22,777 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@73:28 - no applicable action for [root], current ElementPath  is [[configuration][springProfile][root]]
13:09:22,777 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@74:39 - no applicable action for [appender-ref], current ElementPath  is [[configuration][springProfile][root][appender-ref]]
13:09:22,777 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@75:44 - no applicable action for [appender-ref], current ElementPath  is [[configuration][springProfile][root][appender-ref]]

请教DeepSeek,给出的一个比较靠谱的解释是这样的:
在这里插入图片描述

反思

  1. Q:为啥本地可以启动成功,测试环境不行?
    A:使用的JDK版本不一样。只有这一个服务最特殊,使用JDK 8版本,其他应用都是使用OpenJDK 11版本。
  2. Q:为啥测试环境的报错信息是UnsupportedClassVersionError,也就是使用的JDK版本引入一个更高JDK版本编译的依赖;而本地开发环境的报错是:NoClassDefFoundError?
    A:不知道。
  3. Q:为啥不能加载logback-spring.xml文件?可以加载logback.xml文件,但是有报错信息:no applicable action for [springProfile]
    A:唯一(有可能的)合理的解释,这依旧是一个Spring应用,虽然放在根目录下面的启动类,有@SpringBootApplication注解。

    Spring应用默认加载logback.xml文件,Spring Boot应用默认加载logback-spring.xml文件?让Spring去加载logback-spring.xml文件(经过重命名处理后可以加载logback.xml,但是文件里依旧有一些springProfile配置项),于是会报错no applicable action for [springProfile]。好像可以自圆其说。
  4. Q:Spring应用和Spring Boot应用的区别是什么?分界线是什么?@SpringBootApplication注解吗?
    A:不知道,此问题并不是没有意义的。
    在这里插入图片描述

参考

  • ChatGPT
  • DeepSeek

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

vscode通过ssh连接服务器实现免密登录

一、通过ssh连接服务器 1、打开vscode&#xff0c;进入拓展&#xff08;CtrlShiftX&#xff09;&#xff0c;下载拓展Remote - SSH。 2、点击远程资源管理器选项卡&#xff0c;选择远程&#xff08;隧道/SSH&#xff09;类别。 3、点击SSH配置。 4、在中间上部分弹出的配置文件…

在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b

目录 背景&#xff1a;步骤 1.获取模型权重第 2 步&#xff1a;准备第 3 步&#xff1a;构建 TensorRT-LLM 引擎 背景&#xff1a; 大型语言模型 &#xff08;LLM&#xff09; 推理的关键瓶颈在于 GPU 内存资源短缺。因此&#xff0c;各种加速框架主要强调减少峰值 GPU 内存使…

Unity Shader学习日记 part4 Shader 基础结构

其实在这一篇之前&#xff0c;应该还有一个关于坐标空间转换的内容&#xff0c;但是内容囤积的有些多&#xff0c;就先把Shader的基础结构先记录一下。 笔记主要记录在代码中&#xff0c;所以知识点主要是图和代码的展示。 Unity Shader分类 在Unity中&#xff0c;Shader的种…

特征点检测与匹配——MATLAB R2022b

特征点检测与匹配在计算机视觉中的作用至关重要,它为图像处理、物体识别、增强现实等领域提供了坚实的基础。 目录 Harris角点检测 SIFT(尺度不变特征变换) SURF(加速稳健特征) ORB(Oriented FAST and Rotated BRIEF) 总结 特征点检测与匹配是计算机视觉中的一项基…

Airflow:HttpSensor实现API驱动数据流程

数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景&#xff0c;Apache Airflow提供了HttpSensor&#xff0c;这是一个内置的Sensor&#xff0c;用于监视HTTP请求的状态&#xff0c;并在满足指定条件时触发后续任务。在这篇博文中&#xff0c…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

JAVA学习记录1

文章为个人学习记录&#xff0c;仅供参考&#xff0c;如有错误请指出。 什么是JAVA&#xff1f; JAVA是一种高级的编程语言&#xff0c;可以用于开发大部分场景的软件&#xff0c;但主要用于服务器的开发。 什么是JDK&#xff1f; 类似于python使用PyCharm来编写代码&#…

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性&#xff0c;后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排&#xff0c;到底部再换第二排&#xff0c;文字与文字之间从…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”&#xff0c;经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形

1. 题目描述 用C语言在屏幕上输出以下图案&#xff1a; 2. 思路 我是先上手&#xff0c;先把上半部分打印出来&#xff0c;然后慢慢再来分析&#xff0c;下面这是我先把整个上半部分打印出来&#xff0c;因为空格不方便看是几个&#xff0c;这里先用&代替空格了 然后这里…

C# 整型、浮点型 数值范围原理分析

总目录 前言 一、整型、浮点型 数值范围列表 二、什么是大小、范围 在上面的列表中&#xff0c;每个数据类型都有自己的Range (范围) 和 Size (大小)。 1. 范围 范围好理解&#xff0c;就是对应数据类型的数据范围&#xff0c;如 sbtyte 的数据范围是 -128~127&#xff0c;超…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后&#xff0c;除了用户做的界面&#xff0c;最上面还有一个框&#xff0c;这就是window frame框。对于界面的元素&#xff0c;它们的原点是Qt界面的左上角或win…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

springboot参数注解

在Spring Boot中&#xff0c;创建RESTful API时&#xff0c;通常会使用Spring MVC提供的注解来声明请求参数。以下是一些常用的注解及其用途&#xff1a; 1. RequestBody 用途&#xff1a;用于将HTTP请求的body部分绑定到方法参数上&#xff0c;通常用于接收JSON或XML格式的数…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…