活动介绍
file-type

Spring-console-1.0b:简易Bean配置文件编写指南

1星 | 下载需积分: 3 | 857KB | 更新于2025-07-27 | 184 浏览量 | 12 下载量 举报 收藏
download 立即下载
Spring框架是Java平台上一个流行的开源应用程序框架。在Java EE开发领域,Spring框架被广泛应用于各种应用程序的开发中,特别是在企业级应用中,Spring已经成为了首选的技术解决方案。Spring框架的核心特性之一是依赖注入(Dependency Injection,简称DI),它能够帮助开发人员实现松耦合的软件组件。Spring-console-1.0b作为一个版本标识,可以理解为是Spring框架控制台应用的一个早期的beta版本。 ### Spring框架基础知识点: #### 1. 依赖注入(DI) 依赖注入是Spring的核心原则之一。通过依赖注入,Spring容器负责创建应用程序中的对象,以及它们之间的依赖关系。当一个对象需要使用另一个对象时,Spring容器将通过注入的方式(如构造器注入、setter注入等)把需要的对象传递给它。这种方法的好处是提高了代码的解耦程度,使得单元测试更加容易进行,也便于程序的维护和扩展。 #### 2. 控制反转(IoC) 控制反转是依赖注入的一种实现方式。在Spring框架中,控制反转是通过Bean容器实现的。传统的程序设计中,对象的创建和依赖关系的维护是编码时完成的。而在IoC模式下,这些工作由容器在运行期完成。对象间的依赖关系由容器负责,程序员仅负责使用对象。这样做的好处是大大减少了代码的耦合度,提高了组件的复用性。 #### 3. Spring Bean配置文件 在Spring框架中,所有的Java对象都被视为Bean。Spring通过配置文件来管理这些Bean的创建、配置以及生命周期等信息。配置文件通常是一个XML文件,也可以是基于Java注解的方式或者Java配置类。在早期的Spring版本中,XML配置文件是配置Bean的主要方式。通过XML配置文件,开发者可以声明Bean的各种属性,如类路径、作用域、依赖关系等。 #### 4. Spring轻量级容器和轻量级应用 Spring-console-1.0b所指的“轻量级”是指Spring框架与传统的EJB(Enterprise JavaBeans)容器相比,它不需要依赖重量级的容器服务器即可运行。Spring通过自身的轻量级容器来实现依赖注入和面向切面编程(AOP)等特性,允许开发者在任何Java环境中运行Spring应用,而不是仅限于某些特定的服务器环境中。 ### Spring-console-1.0b具体知识点: #### 1. Bean配置简化 Spring-console-1.0b版本可能关注的是对Bean配置文件的简化处理。在早期的版本中,开发者可能需要编写较为复杂的XML配置文件来定义和配置各种Bean,而这个版本可能通过提供一些新的配置方式或者优化原有的配置方式来简化配置过程。 #### 2. 配置文件的管理 对于Spring框架来说,配置文件是应用程序运行的核心。管理好配置文件对于整个应用的性能和可维护性至关重要。Spring-console-1.0b可能提供了更好的工具或方法来组织和管理这些配置文件,比如分离不同的配置文件、配置文件的继承或者条件化配置等。 #### 3. 控制台操作 作为控制台应用版本,Spring-console-1.0b可能提供了命令行工具,使得开发者可以在控制台环境中操作Spring应用,如创建Bean实例、运行特定的Bean方法、查看Bean的依赖关系等。这样的工具极大地提高了开发效率,并且对自动化脚本操作提供了便利。 ### 总结 Spring-console-1.0b作为早期版本的Spring控制台应用,集中体现了Spring框架在依赖注入和控制反转方面的优势。它通过简化Bean的配置,优化配置文件管理,以及提供控制台操作工具等方式,降低了应用程序开发的复杂度。尽管后期Spring有了大量的更新和改进,增加了对注解的支持,引入了Spring Boot等简化配置的新项目,但Spring-console-1.0b作为Spring早期应用的典型代表,对于理解Spring框架的基本概念和原理仍具有一定的学习价值。随着Spring技术的不断发展,我们应当关注最新的Spring版本,以获得最佳的开发体验和性能表现。

相关推荐

filetype

排查结果如下: 1.使用mvn dependency:tree返回如下信息: [INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ zysygh --- [INFO] com.ghzy:zysygh:jar:0.1.196 [INFO] +- org.springframework.boot:spring-boot-starter-data-redis:jar:2.2.13.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.2.13.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot:jar:2.2.13.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.2.13.RELEASE:compile [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile [INFO] | | \- org.yaml:snakeyaml:jar:1.25:runtime [INFO] | +- org.springframework.data:spring-data-redis:jar:2.2.12.RELEASE:compile [INFO] | | +- org.springframework.data:spring-data-keyvalue:jar:2.2.12.RELEASE:compile [INFO] | | | \- org.springframework.data:spring-data-commons:jar:2.2.12.RELEASE:compile [INFO] | | +- org.springframework:spring-tx:jar:5.2.12.RELEASE:compile [INFO] | | +- org.springframework:spring-oxm:jar:5.2.12.RELEASE:compile [INFO] | | \- org.springframework:spring-aop:jar:5.2.12.RELEASE:compile [INFO] | \- io.lettuce:lettuce-core:jar:5.2.2.RELEASE:compile [INFO] | +- io.netty:netty-common:jar:4.1.58.Final:compile [INFO] | +- io.netty:netty-handler:jar:4.1.58.Final:compile [INFO] | | +- io.netty:netty-resolver:jar:4.1.58.Final:compile [INFO] | | +- io.netty:netty-buffer:jar:4.1.58.Final:compile [INFO] | | \- io.netty:netty-codec:jar:4.1.58.Final:compile [INFO] | +- io.netty:netty-transport:jar:4.1.58.Final:compile [INFO] | \- io.projectreactor:reactor-core:jar:3.3.13.RELEASE:compile [INFO] | \- org.reactivestreams:reactive-streams:jar:1.0.3:compile [INFO] +- org.springframework.boot:spring-boot-starter-mail:jar:2.2.13.RELEASE:compile [INFO] | +- org.springframework:spring-context-support:jar:5.2.12.RELEASE:compile [INFO] | | +- org.springframework:spring-beans:jar:5.2.12.RELEASE:compile [INFO] | | \- org.springframework:spring-context:jar:5.2.12.RELEASE:compile [INFO] | \- com.sun.mail:jakarta.mail:jar:1.6.5:compile [INFO] | \- com.sun.activation:jakarta.activation:jar:1.2.2:compile [INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:2.2.13.RELEASE:compile [INFO] | +- org.thymeleaf:thymeleaf-spring5:jar:3.0.12.RELEASE:compile [INFO] | | \- org.thymeleaf:thymeleaf:jar:3.0.12.RELEASE:compile [INFO] | | +- org.attoparser:attoparser:jar:2.0.5.RELEASE:compile [INFO] | | \- org.unbescape:unbescape:jar:1.1.6.RELEASE:compile [INFO] | \- org.thymeleaf.extras:thymeleaf-extras-java8time:jar:3.0.4.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.2.13.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:2.2.13.RELEASE:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.10.5:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.10.5:compile [INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.10.5:compile [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.2.13.RELEASE:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.41:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.41:compile [INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.41:compile [INFO] | +- org.springframework.boot:spring-boot-starter-validation:jar:2.2.13.RELEASE:compile [INFO] | | +- jakarta.validation:jakarta.validation-api:jar:2.0.2:compile [INFO] | | \- org.hibernate.validator:hibernate-validator:jar:6.0.22.Final:compile [INFO] | | +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile [INFO] | | \- com.fasterxml:classmate:jar:1.5.1:compile [INFO] | +- org.springframework:spring-web:jar:5.2.12.RELEASE:compile [INFO] | \- org.springframework:spring-webmvc:jar:5.2.12.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:5.2.12.RELEASE:compile [INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:2.3.2:compile [INFO] | +- org.springframework.boot:spring-boot-starter-jdbc:jar:2.2.13.RELEASE:compile [INFO] | | +- com.zaxxer:HikariCP:jar:3.4.5:compile [INFO] | | \- org.springframework:spring-jdbc:jar:5.2.12.RELEASE:compile [INFO] | +- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:2.3.2:compile [INFO] | \- org.mybatis:mybatis-spring:jar:2.1.2:compile [INFO] +- org.springframework.boot:spring-boot-starter-logging:jar:2.2.13.RELEASE:compile [INFO] | +- ch.qos.logback:logback-classic:jar:1.2.3:compile [INFO] | | \- ch.qos.logback:logback-core:jar:1.2.3:compile [INFO] | \- org.slf4j:jul-to-slf4j:jar:1.7.30:compile [INFO] +- mysql:mysql-connector-java:jar:8.0.26:runtime [INFO] +- org.projectlombok:lombok:jar:1.18.16:compile (optional) [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.2.13.RELEASE:test [INFO] | +- org.springframework.boot:spring-boot-test:jar:2.2.13.RELEASE:test [INFO] | +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.2.13.RELEASE:test [INFO] | +- com.jayway.jsonpath:json-path:jar:2.4.0:test [INFO] | | \- net.minidev:json-smart:jar:2.3:test [INFO] | | \- net.minidev:accessors-smart:jar:1.2:test [INFO] | | \- org.ow2.asm:asm:jar:5.0.4:test [INFO] | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:test [INFO] | | \- jakarta.activation:jakarta.activation-api:jar:1.2.2:test [INFO] | +- org.junit.jupiter:junit-jupiter:jar:5.5.2:test [INFO] | | +- org.junit.jupiter:junit-jupiter-api:jar:5.5.2:test [INFO] | | | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | | | \- org.junit.platform:junit-platform-commons:jar:1.5.2:test [INFO] | | +- org.junit.jupiter:junit-jupiter-params:jar:5.5.2:test [INFO] | | \- org.junit.jupiter:junit-jupiter-engine:jar:5.5.2:test [INFO] | +- org.junit.vintage:junit-vintage-engine:jar:5.5.2:test [INFO] | | +- org.apiguardian:apiguardian-api:jar:1.1.0:test [INFO] | | +- org.junit.platform:junit-platform-engine:jar:1.5.2:test [INFO] | | \- junit:junit:jar:4.12:test [INFO] | +- org.mockito:mockito-junit-jupiter:jar:3.1.0:test [INFO] | +- org.assertj:assertj-core:jar:3.13.2:test [INFO] | +- org.hamcrest:hamcrest:jar:2.1:test [INFO] | +- org.mockito:mockito-core:jar:3.1.0:test [INFO] | | +- net.bytebuddy:byte-buddy:jar:1.10.19:test [INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.10.19:test [INFO] | | \- org.objenesis:objenesis:jar:2.6:test [INFO] | +- org.skyscreamer:jsonassert:jar:1.5.0:test [INFO] | | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] | +- org.springframework:spring-core:jar:5.2.12.RELEASE:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.2.12.RELEASE:compile [INFO] | +- org.springframework:spring-test:jar:5.2.12.RELEASE:test [INFO] | \- org.xmlunit:xmlunit-core:jar:2.6.4:test [INFO] +- com.aliyun:aliyun-java-sdk-core:jar:4.5.3:compile [INFO] | +- com.google.code.gson:gson:jar:2.8.6:compile [INFO] | +- org.apache.httpcomponents:httpclient:jar:4.5.13:compile [INFO] | | \- commons-codec:commons-codec:jar:1.13:compile [INFO] | +- org.apache.httpcomponents:httpcore:jar:4.4.14:compile [INFO] | +- commons-logging:commons-logging:jar:1.2:compile [INFO] | +- javax.xml.bind:jaxb-api:jar:2.3.1:compile [INFO] | | \- javax.activation:javax.activation-api:jar:1.2.0:compile [INFO] | +- org.jacoco:org.jacoco.agent:jar:runtime:0.8.5:compile [INFO] | +- org.ini4j:ini4j:jar:0.5.4:compile [INFO] | +- org.slf4j:slf4j-api:jar:1.7.30:compile [INFO] | +- io.opentracing:opentracing-api:jar:0.33.0:compile [INFO] | \- io.opentracing:opentracing-util:jar:0.33.0:compile [INFO] | \- io.opentracing:opentracing-noop:jar:0.33.0:compile [INFO] +- com.aliyun:dysmsapi20170525:jar:4.1.0:compile [INFO] | +- com.aliyun:tea-util:jar:0.2.23:compile [INFO] | +- com.aliyun:endpoint-util:jar:0.0.7:compile [INFO] | +- com.aliyun:tea:jar:1.3.1:compile [INFO] | | \- com.squareup.okhttp3:okhttp:jar:3.14.9:compile [INFO] | | \- com.squareup.okio:okio:jar:1.17.2:compile [INFO] | +- com.aliyun:tea-openapi:jar:0.3.8:compile [INFO] | | +- com.aliyun:credentials-java:jar:1.0.1:compile [INFO] | | | \- com.aliyun:credentials-api:jar:1.0.0:compile [INFO] | | +- com.aliyun:alibabacloud-gateway-spi:jar:0.0.2:compile [INFO] | | \- com.aliyun:tea-xml:jar:0.1.6:compile [INFO] | | \- org.dom4j:dom4j:jar:2.0.3:compile [INFO] | \- com.aliyun:openapiutil:jar:0.2.2:compile [INFO] | \- org.bouncycastle:bcprov-jdk18on:jar:1.78.1:compile [INFO] +- com.alibaba:fastjson:jar:1.2.75:compile [INFO] +- org.mybatis:mybatis:jar:3.5.9:compile [INFO] +- org.jetbrains:annotations:jar:13.0:compile [INFO] +- org.springframework.boot:spring-boot-configuration-processor:jar:2.2.13.RELEASE:compile (optional) [INFO] +- redis.clients:jedis:jar:3.1.0:compile [INFO] | \- org.apache.commons:commons-pool2:jar:2.7.0:compile [INFO] +- io.jsonwebtoken:jjwt-api:jar:0.11.5:compile [INFO] +- io.jsonwebtoken:jjwt-impl:jar:0.11.5:runtime [INFO] \- io.jsonwebtoken:jjwt-jackson:jar:0.11.5:runtime [INFO] \- com.fasterxml.jackson.core:jackson-databind:jar:2.10.5.1:compile [INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.10.5:compile [INFO] \- com.fasterxml.jackson.core:jackson-core:jar:2.10.5:compile [INFO] ------------------------------------------------------------------------ 2.applicaion.properties中的配置内容为logging.config=classpath:logback-spring.xml 3.src/main/resources目录下存在logback-spring.xml文件,但之前里面没有那两行<include>配置项,现已添加。

filetype

F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\catalina.bat run [2025-06-17 12:51:53,585] Artifact Shopping-Web:war exploded: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b" Using CATALINA_HOME: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42" Using CATALINA_TMPDIR: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\temp" Using JRE_HOME: "F:\jdk-17.0.15_windows-x64_bin\jdk-17.0.15" Using CLASSPATH: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\bootstrap.jar;F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/10.1.42 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 5 2025 22:35:46 UTC 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 10.1.42.0 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 11 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: F:\jdk-17.0.15_windows-x64_bin\jdk-17.0.15 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 17.0.15+9-LTS-241 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\conf\logging.properties 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.port=1099 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.ssl=false 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.password.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\jmxremote.password 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.access.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\jmxremote.access 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.rmi.server.hostname=127.0.0.1 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang.reflect=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.io=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\temp 17-Jun-2025 12:51:54.443 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.6]加载了基于APR的Apache Tomcat本机库[2.0.9]。 17-Jun-2025 12:51:54.443 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.5.0 8 Apr 2025] 17-Jun-2025 12:51:54.551 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 17-Jun-2025 12:51:54.572 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[311]毫秒内初始化 17-Jun-2025 12:51:54.626 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 17-Jun-2025 12:51:54.626 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/10.1.42] 17-Jun-2025 12:51:54.651 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 17-Jun-2025 12:51:54.701 信息 [main] org.apache.catalina.startup.Catalina.start [126]毫秒后服务器启动 Connected to server [2025-06-17 12:51:54,777] Artifact Shopping-Web:war exploded: Artifact is being deployed, please wait... 17-Jun-2025 12:51:55.805 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/]中找不到TLD文件。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-beans-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-jcl-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/mysql-connector-java-8.0.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-expression-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-core-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.859 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在JAR[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/jstl-1.2.jar]中找到了TLD文件。 17-Jun-2025 12:51:55.859 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-context-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/protobuf-java-3.19.4.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-aop-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 17-Jun-2025 12:51:55.952 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 17-Jun-2025 12:51:55.952 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/Shopping_Web_war_exploded]启动失败 [2025-06-17 12:51:55,962] Artifact Shopping-Web:war exploded: Error during artifact deployment. See server log for details. 17-Jun-2025 12:52:04.663 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\webapps\manager] 17-Jun-2025 12:52:04.715 详细 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/jsp/]中找不到TLD文件。 17-Jun-2025 12:52:04.717 详细 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/]中找不到TLD文件。 17-Jun-2025 12:52:04.724 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\webapps\manager]的部署已在[61]毫秒内完成

filetype

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>拍拍印</title> <style> body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; } /* 新增滑动轮播关键样式 */ .container { overflow: hidden; position: relative; width: 100vw; height: 100vh; } .slide-track { display: flex; width: 100%; height: 100vh; transition: transform 1.5s cubic-bezier(0.4, 0, 0.2, 1); /* 平滑过渡效果 */ } .slide { flex: 1 0 100vw; /* 每张占满视口宽度 */ background-size: cover; background-position: center; } /* 无限循环关键技巧) */ .slide-track::before, .slide-track::after { content: ''; flex: 100vw; /* 复制首尾图片实现无缝 */ background-image: inherit; } .content { position: absolute; top: 35.5%; left: 4.2%; display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0 auto; } .box { display: grid; grid-template-columns: repeat(2, 1fr); /* 两列 */ gap: 36px; margin-left: 22px; margin-top: -20px; } .box.no-margin { margin-top: 0 !important; } .item { background-color: #B13627; border-radius: 50px; width: 455px; height: 512px; } .item2 { background-color: #B13627; border-radius: 40px; width: 455px; margin-top: 20px; } .topDiv { width: 100%; height: 172px; } .divP { width: 70%; height: 86px; background-color: #00000000; color: #ffffff; font-size: 64px; font-weight: 700; letter-spacing: 2px; margin-left: 25px; } .divP2 { width: 240px; height: 48px; background-color: #ffffff; color: #000; font-size: 24px; letter-spacing: 2px; margin-left: 30px; display: flex; align-items: center; justify-content: center; margin-top: -50px; border-radius: 25px } .bottomDiv { position: relative; /* 使子元素的绝对定位相对于此元素 */ height: 307px; /* 确保容器有确定的高度 */ } .butDiv, .butDiv2 { position: absolute; left: 20px; bottom: 20px; /* 放置在底部 */ width: calc(100% - 40px); /* 宽度减去左右边距 */ z-index: 10; /* 确保它在图片上方 */ margin-top: 0; /* 移除之前的margin-top */ } /* 调整报纸头条部分 */ .item .butDiv { margin-top: 0; top: auto; /* 重置顶部位置 */ bottom: 20px; /* 放置在底部 */ margin-left: 0; /* 移除左外边距 */ } /* 修改斑马日报和自助打印的按钮位置 */ .item2 .butDiv2 { position: absolute; width: calc(100% - 40px); bottom: 20px; top: -80px; margin-top: 0; margin-left: 0; } /* 调整按钮在卡片内的位置 */ .button, .button2 { margin-top: -13px; margin-left: 265px; position: static; /* 按钮使用默认定位 */ } /* 调整顶部区域避免重叠 */ .topDiv { margin-top: -30px; /* 适当上移 */ z-index: 5; /* 确保在butDiv之上 */ } /* 调整斑马日报和自助打印高度 */ .item2 { position: relative; /* 确保绝对定位元素有参考点 */ height: 236px; } .bottomDiv img { width: 100%; height: 100%; } .butDiv { width: 415px; height: 93px; background-color: #ffffff; border-radius: 47px; margin-top: 185px; margin-left: 20px; } .butDiv2 { width: 415px; height: 93px; background-color: #ffffff; border-radius: 47px; margin-top: 0px; margin-left: 20px; } .avaiDiv { width: 220px; height: 73px; margin-top: 16px; margin-left: 8px; } .available { font-size: 38px; margin-left: 30px; align-self: center; color: #303030; font-weight: 700; } .sizelabie { font-size: 20px; color: #606060; } .button { width: 140px; height: 73px; background-color: #000; border-radius: 50px; margin-top: -60px; margin-left: 255px; display: flex; align-items: center; justify-content: center; color: #ffffff; font-size: 25px; } .button2 { width: 140px; height: 73px; background-color: #000; border-radius: 50px; margin-top: -65px; margin-left: 255px; display: flex; align-items: center; justify-content: center; color: #ffffff; font-size: 25px; } /* 弹窗样式 */ #popup { display: none; } #popup-mask { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.6); z-index: 999; } #popup-content { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1000; background: white; border-radius: 10px; padding: 40px; text-align: center; width: 70%; } #popup-content img { width: 60%; height: 60%; padding: 40px 0; } .popup-header { display: flex; justify-content: space-between; align-items: center; } #popup-close { font-size: 40px; font-weight: bold; color: #000; cursor: pointer; user-select: none; } #countdown { font-size: 26px; color: #000; text-align: right; } .title { text-align: center; font-size: 40px; color: #000; } /* 新增小项目容器样式 */ .small-items-container { display: flex; flex-direction: column; gap: 10px; width: 100%; margin-top: 20px; } /* 修改小项目宽度为100% */ .item2 { background-color: #B13627; border-radius: 40px; width: 100%; /* 从固定宽度改为100% */ height: 236px; /* 移除原来的margin-bottom */ } </style> </head> <body>
×
倒计时:120 秒

微信扫码解锁自助打印

二维码

<script> let newspaperData = [] // 获取当前页面的URL参数值 function getQueryParam(paramName) { //(去掉开头的'?') const queryString = window.location.search.substring(1); const params = queryString.split('&'); for (const param of params) { const pair = param.split('='); // 对参数名和值进行URL解码 const name = decodeURIComponent(pair[0]); const value = pair.length > 1 ? decodeURIComponent(pair[1]) : ''; if (name === paramName) { return value; } } // 找不到目标参数返回 return 'C0GSLS'; } // 创建API请求函数 async function fetchNewsData() { const codeValue = getQueryParam('terminalCode'); return fetch(`http://192.168.8.117:5175/api/v1/Common/GetModules?terminalCode=${codeValue}`, { method: "get", headers: { "Content-Type": "application/json" }, }) .then(response => response.json()) .then(res => { if (res.code === 200) { // .slice(0, 4) 截取 return res.data.slice(0, 4).map(module => ({ id: module.id, title: module.moduleName, subtitle: module.moduleDesc, available: module.photoOriginalPrice, size: module.printType == 2 ? "A3报纸" : '6寸照片', image: module.coverImage || "./assets/group.png", moduleUrl: `${module.moduleUrl}?terminalCode=${codeValue}&moduleCode=${module.moduleCode}` })); } else { console.log("请求返回错误:", res.message); return []; } }) .catch(error => { console.error('API请求错误:', error); return []; }); } // 优化初始化函数 async function init() { try { // 等待API返回数据 newspaperData = await fetchNewsData(); console.log("获取到的数据:", newspaperData); // 确保在数据获取后再渲染 renderItems(newspaperData); setupEventListeners(); setupJumpLinks(); // 启动轮播图(新增) setupSlider(); } catch (error) { console.error('初始化失败:', error); // 使用空数组渲染结构 renderItems([]); } } document.addEventListener('touchstart', function (event) { if (event.touches.length > 1) { event.preventDefault(); } }, { passive: false }); let countdownTimer = null; function showPopup() { document.getElementById('popup').style.display = 'block'; let timeLeft = 120; const countdownEl = document.getElementById('countdown'); countdownEl.textContent = `倒计时:${timeLeft} 秒`; countdownTimer = setInterval(() => { timeLeft--; countdownEl.textContent = `倒计时:${timeLeft} 秒`; if (timeLeft <= 0) { hidePopup(); } }, 1000); } // 修改后的渲染函数--判断长度渲染逻辑 function renderItems(data) { const container = document.getElementById('newsContainer'); container.innerHTML = ''; // 获取box元素 const boxElement = container.closest('.box'); if (data.length === 0) { // 没有数据时显示提示 container.innerHTML = `
数据加载中,请稍后...
`; return; } // 原有布局渲染逻辑保持不变 if (data.length === 4) { // 当数组长度为4时,添加no-margin类 boxElement.classList.add('no-margin'); // 长度为4时的布局:全部为大盒子(.item) data.forEach(item => { container.appendChild(createItem(item)); }); } else if (data.length === 5) { // 其他情况下移除no-margin类 boxElement.classList.remove('no-margin'); // 长度为5时的布局:前3个大盒子,最后2个小盒子放在第三个大盒子位置上下排列 // 第一列(包含前2个大盒子) const leftCol = document.createElement('div'); leftCol.className = 'layout-column'; leftCol.appendChild(createItem(data[0])); leftCol.appendChild(createItem(data[1])); container.appendChild(leftCol); // 第二列(包含第三个大盒子和小盒子容器) const rightCol = document.createElement('div'); rightCol.className = 'layout-column'; // 添加第三个大项目 rightCol.appendChild(createItem(data[2])); // 创建小项目容器(包含第四和第五个项目) const smallContainer = document.createElement('div'); smallContainer.className = 'small-items-container'; smallContainer.appendChild(createItem2(data[3])); smallContainer.appendChild(createItem2(data[4])); // 添加小项目容器到第二列 rightCol.appendChild(smallContainer); // 将第二列添加到容器 container.appendChild(rightCol); } else { // 通用渲染方案 - 使用网格布局 const gridContainer = document.createElement('div'); gridContainer.className = 'box'; gridContainer.style.display = 'grid'; gridContainer.style.gridTemplateColumns = 'repeat(2, 1fr)'; gridContainer.style.gap = '36px'; data.forEach(item => { // 根据位置决定渲染大项目或小项目 if (gridContainer.childElementCount < 2) { gridContainer.appendChild(createItem(item)); } else { gridContainer.appendChild(createItem2(item)); } }); container.appendChild(gridContainer); } } function hidePopup() { document.getElementById('popup').style.display = 'none'; if (countdownTimer) clearInterval(countdownTimer); } // 为静态数据添加跳转功能 function setupJumpLinks() { // 为所有按钮添加点击事件 document.querySelectorAll('.print-button').forEach(button => { button.addEventListener('click', function (e) { e.stopPropagation(); // 获取所在项目的data-moduleUrl属性 const container = this.closest('[data-module-url]'); if (container) { const url = container.dataset.moduleUrl; if (url && url !== 'undefined') { window.location.href = url; } else { console.error('无效的跳转URL'); } } }); }); } // 创建大项目(报纸头条) function createItem(item) { const itemElement = document.createElement('div'); itemElement.className = 'item'; itemElement.dataset.id = item.id; itemElement.dataset.moduleUrl = item.moduleUrl; // 添加跳转URL itemElement.innerHTML = `

${item.title}

${item.subtitle}

${item.title}
${item.available} / ${item.size}
点击体验
`; return itemElement; } // 创建小项目(自助打印) function createItem2(item) { const itemElement = document.createElement('div'); itemElement.className = 'item2'; itemElement.dataset.id = item.id; itemElement.dataset.moduleUrl = item.moduleUrl; // 添加跳转URL itemElement.innerHTML = `

${item.title}

${item.available} / ${item.size}
点击体验
`; return itemElement; } // 事件监听处理 function setupEventListeners() { document.getElementById('newsContainer').addEventListener('click', function (e) { if (e.target.classList.contains('print-button')) { const itemContainer = e.target.closest('[data-id]'); if (itemContainer) { const itemId = itemContainer.dataset.id; showPopup(); } } }); document.getElementById('popup-mask').onclick = hidePopup; document.getElementById('popup-close').onclick = hidePopup; } // 新增轮播图设置函数 function setupSlider() { const track = document.querySelector('.slide-track'); const slides = document.querySelectorAll('.slide'); let currentIndex = 0; const intervalTime = 5000; // 确保至少有2张幻灯片 if (slides.length < 2) return; function nextSlide() { currentIndex = (currentIndex + 1) % slides.length; track.style.transform = `translateX(-${currentIndex * 100}%)`; if (currentIndex === slides.length - 1) { setTimeout(() => { track.style.transition = 'none'; currentIndex = 0; track.style.transform = 'translateX(0)'; setTimeout(() => { track.style.transition = 'transform 1.5s cubic-bezier(0.4, 0, 0.2, 1)'; }, 50); }, 1500); } } let slideInterval = setInterval(nextSlide, intervalTime); track.addEventListener('mouseenter', () => clearInterval(slideInterval)); track.addEventListener('mouseleave', () => { slideInterval = setInterval(nextSlide, intervalTime); }); } // 移除DOMContentLoaded中的测试按钮代码 document.addEventListener('DOMContentLoaded', init); </script> </body> </html> 把class="divP"的字体改为Alimama ShuHeiTi,其他包涵字体的class的样式字体改为 Alibaba PuHuiTi
filetype

将已打包的Springboot jar文件上传到宝塔系统并运行,项目无法启动,日志中也没有Springboot的启动符号直接展示了错误信息: Logging system failed to initialize using configuration from 'classpath:log4j-spring.xml' java.io.FileNotFoundException: class path resource [log4j-spring.xml] cannot be resolved to URL because it does not exist at org.springframework.util.ResourceUtils.getURL(ResourceUtils.java:137) at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:155) at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithSpecificConfig(AbstractLoggingSystem.java:66) at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:57) at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118) at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:317) at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:288) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:246) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:223) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.ghzy.zysygh.ZysyghApplication.main(ZysyghApplication.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) 已确认没有pom.xml中没有加载log4j依赖,并在springboot-starter-web和springboot-starter-logging中排除了log4j和slf4j相关,还有哪里出了问题?

filetype

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>生产计划排程表</title> <style> /* ======= 天空浅蓝主题 ======= */ :root{ --bg:#f5faff; --panel:#fff; --border:#cce7ff; --primary:#3ca9ff; --primary-dark:#0077e6; --primary-light:#e6f4ff; --text:#003366; --text-light:#0077e6; --shadow:rgba(60,169,255,.12); } body{margin:0;background:var(--bg);font-family:"Segoe UI",Arial,"PingFang SC","Microsoft YaHei",sans-serif} .status-container{max-width:98%;margin:22px auto;background:var(--panel);border:1px solid var(--border);padding:22px 18px 30px 18px;border-radius:12px;box-shadow:0 6px 30px var(--shadow);position:relative} .status-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px;background:var(--bg)} .status-header h3{color:var(--text-light);letter-spacing:2px} .status-header .btns{display:flex;gap:12px} .btn{padding:7px 18px;border:none;border-radius:4px;font-size:15px;cursor:pointer;background:var(--primary);color:#fff;transition:background .2s} .btn:hover{background:var(--primary-dark)} .btn.modify{background:var(--primary-light);color:var(--text)} .btn.modify:hover{background:var(--primary-dark);color:#fff} .search-box{display:flex;align-items:center;gap:8px} .search-box input{height:32px;border:1px solid var(--primary);border-radius:4px;padding:0 10px;font-size:14px;background:#fff;color:var(--text)} table{width:100%;border-collapse:collapse;font-size:14px;color:var(--text)} thead{background-color:var(--primary-light);color:var(--text)} th,td{border:1px solid var(--border);padding:9px 7px;text-align:center} th{background:var(--primary-light);color:var(--text)} .tag{border-radius:10px;padding:2px 10px;font-size:13px;display:inline-block} .tag-success{color:#21b97a}.tag-danger{color:#f56c6c} /* 弹窗共用 */ .modal-mask{position:fixed;inset:0;background:rgba(0,119,230,.2);z-index:999;display:none} .modal{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);background:#fff;color:var(--text);border-radius:8px;padding:22px;min-width:360px;z-index:1000;display:none} .modal-title{font-weight:bold;font-size:1.18rem;color:var(--primary-dark);margin-bottom:19px} .modal-form-row{display:flex;align-items:center;margin-bottom:13px} .modal-form-row label{width:86px;color:var(--text-light);font-size:14px} .modal-form-row input,.modal-form-row select{flex:1;height:28px;padding:0 7px;border:1px solid var(--primary);border-radius:4px;background:var(--bg);color:var(--text)} .modal-btns{text-align:right;margin-top:18px} .modal-btns .btn{margin-left:12px;background:var(--primary);color:#fff} /* 详情弹窗专属 */ .detail-modal{min-width:800px;max-width:95vw;max-height:90vh;overflow:auto} .detail-modal table th,.detail-modal table td{color:var(--text);border:1px solid var(--border);padding:6px 4px;min-width:90px;background:#fff} .detail-modal input[type=number]{width:100%;border:1px solid var(--border);border-radius:3px;padding:4px;background:#fff;color:var(--text)} .detail-btns{margin-top:15px;text-align:right} /* 分页 */ .pager-box{display:flex;align-items:center;gap:8px;position:absolute;right:22px;bottom:-80px;background:var(--primary-light);padding:6px 10px;border-radius:6px;box-shadow:0 2px 8px var(--shadow);font-size:14px;color:var(--text-light)} .pager-label input{width:46px;height:24px;text-align:center;border:1px solid var(--primary);border-radius:4px;margin:0 4px;background:#fff;color:var(--text-light)} </style> </head> <body>

生产计划排程表

<input type="text" id="searchInput" placeholder="工序、负责人、产品名称...关键词查询"> <button class="btn" onclick="searchPlans()">查询</button>
<button class="btn" onclick="openAddModal()">增加</button>
序号工序接单日期负责人订单跟踪号产品代码 产品名称订单量GTM出货日期工厂入库日期是否延误 累计交付待交付结单情况排程日期备注操作
加载中...
<button class="btn" id="btnPrev" onclick="prevPage()">上一页</button> <label class="pager-label"> 第<input type="number" id="pageInput" min="1" max="1" value="1" onkeydown="if(event.key==='Enter') jumpToPage()">页 / 共1页 </label> <button class="btn" id="btnNext" onclick="nextPage()">下一页</button> <button class="btn modify" onclick="jumpToPage()">跳转</button>
新增排程
<form id="modalForm">
<label>工序</label><input type="text" name="processName" required>
<label>接单日期</label><input type="date" name="startDate">
<label>负责人</label><input type="text" name="leader" required>
<label>订单跟踪号</label><input type="text" name="orderTrackingNo" required>
<label>产品代码</label><input type="text" name="productCode" required>
<label>产品名称</label><input type="text" name="productName" required>
<label>订单量</label><input type="number" name="orderQuantity" required>
<label>GTM出货日期</label><input type="date" name="shipmentDate">
<label>工厂入库日期</label><input type="date" name="finishDate">
<label>是否延误</label> <select name="isDelayed"><option value="1">是</option><option value="0">否</option></select>
<label>累计交付</label><input type="number" name="deliveredQty">
<label>待交付</label><input type="number" name="pendingQty">
<label>结单情况</label><input type="text" name="receiveStatus">
<label>排程日期</label><input type="date" name="scheduleDate">
<label>备注</label><input type="text" name="remark">
<button type="button" class="btn" onclick="closeModal()">取消</button> <button type="submit" class="btn modify" id="modalSubmitBtn">保存</button>
</form>
排程详情

订单跟踪号:    产品名称:

计划交付
实际交付
<button class="btn modify" onclick="saveDetail()">保存</button> <button class="btn" onclick="closeDetail()">关闭</button>
<script> let editingId=null,allPlans=[],currentPage=1,totalPages=1; async function loadPlans(k,p){const t=document.getElementById('planTableBody');t.innerHTML='加载中...';try{let u=`http://localhost:8080/api/production_plans?page=${p}&size=10`;if(k)u+=`&keyword=${encodeURIComponent(k)}`;const r=await fetch(u),d=await r.json();allPlans=d.records;renderPlans(d.records);toggleOperationColumn();currentPage=d.current;totalPages=d.pages;updatePager();}catch{t.innerHTML='加载失败'}} function renderPlans(d){const t=document.getElementById('planTableBody');if(!Array.isArray(d)||d.length===0){t.innerHTML='暂无数据';return;}t.innerHTML=d.map(r=>` ${r.id}${r.processName||'-'}${r.startDate||'-'}${r.leader||'-'}${r.orderTrackingNo||'-'} ${r.productCode||'-'}${r.productName||'-'}${r.orderQuantity??'-'}${r.shipmentDate||'-'} ${r.finishDate||'-'}${r.isDelayed>0?'是':'否'} ${r.deliveredQty??'-'}${r.pendingQty??'-'}${r.receiveStatus||'-'} <button class="btn modify" onclick="openDetail(${r.id})">查看详情</button> ${r.remark||'-'} <button class="btn modify" onclick="openEditModal(${r.id})">修改</button><button class="btn" style="margin-left:6px;background:#f56c6c" onclick="deletePlan(${r.id})">删除</button> `).join('')} function toggleOperationColumn(){const role=localStorage.getItem('role');const head=document.querySelector('th:last-child'),cells=document.querySelectorAll('td:last-child');if(role==='ADMIN'){head.style.display='';cells.forEach(c=>c.style.display='')}else{head.style.display='none';cells.forEach(c=>c.style.display='none')}} function searchPlans(){loadPlans(document.getElementById('searchInput').value.trim(),1)} function updatePager(){const i=document.getElementById('pageInput');i.max=totalPages;i.value=currentPage;document.getElementById('totalPages').textContent=totalPages;document.getElementById('btnPrev').disabled=currentPage<=1;document.getElementById('btnNext').disabled=currentPage>=totalPages} function prevPage(){if(currentPage>1)loadPlans(document.getElementById('searchInput').value.trim(),currentPage-1)} function nextPage(){if(currentPage<totalPages)loadPlans(document.getElementById('searchInput').value.trim(),currentPage+1)} function jumpToPage(){const v=parseInt(document.getElementById('pageInput').value,10);if(isNaN(v)||v<1||v>totalPages)return;loadPlans(document.getElementById('searchInput').value.trim(),v)} function openAddModal(){editingId=null;resetModal('新增排程')} function openEditModal(id){editingId=id;const r=allPlans.find(p=>p.id===id);if(!r)return;resetModal('修改排程',r)} function resetModal(title,data={}){document.getElementById('modalTitle').textContent=title;const f=document.getElementById('modalForm');f.reset();for(const k in data)if(f[k])f[k].value=data[k];document.getElementById('modalMask').style.display='block';document.getElementById('modalBox').style.display='block'} function closeModal(){document.getElementById('modalMask').style.display='none';document.getElementById('modalBox').style.display='none'} document.getElementById('modalMask').onclick=closeModal; document.getElementById('modalForm').onsubmit=async e=>{e.preventDefault();const fd=new FormData(e.target),data=Object.fromEntries(fd);data.isDelayed=data.isDelayed==='1';['orderQuantity','deliveredQty','pendingQty'].forEach(k=>{if(data[k])data[k]=Number(data[k])});try{const url=editingId?`/api/production_plans/${editingId}`:'/api/production_plans',meth=editingId?'PUT':'POST';const res=await fetch(url,{method:meth,headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});if(res.ok){closeModal();loadPlans('',currentPage)}else alert('保存失败')}catch{alert('网络异常')}} async function deletePlan(id){if(!confirm(`确定删除排程 ${id} 吗?`))return;try{const res=await fetch(`/api/production_plans/${id}`,{method:'DELETE'});if(res.ok){loadPlans(document.getElementById('searchInput').value.trim(),currentPage)}else alert('删除失败')}catch{alert('网络异常')}} /* ================= 新增详情弹窗逻辑 ================= */ let curDetailPlanId = null; /* ================= 新增详情弹窗逻辑(含星期几行) ================= */ async function openDetail(planId) { curDetailPlanId = planId; const plan = allPlans.find(p => p.id === planId); if (!plan) return; document.getElementById('detailOrderNo').textContent = plan.orderTrackingNo; document.getElementById('detailProductName').textContent = plan.productName; /* 1. 生成最近 30 天日期 */ const dates = []; const today = new Date(); for (let i = 0; i < 30; i++) { const d = new Date(today); d.setDate(today.getDate() + i); dates.push(d.toISOString().slice(0, 10)); } /* 2. 读取已保存数据 */ let saved = {}; try { const res = await fetch(`/api/production_plans/${planId}/details`); if (res.ok) (await res.json()).forEach(it => (saved[it.date] = it)); } catch (e) { /* ignore */ } /* 3. 计算星期几(0=周日 … 6=周六) */ const weekMap = ['日', '一', '二', '三', '四', '五', '六']; const weekRowHTML = dates .map(d => `周${weekMap[new Date(d + 'T00:00:00').getDay()]}`) .join(''); /* 4. 渲染表头 */ const headRow = document.getElementById('detailHeadRow'); headRow.innerHTML = '' + dates.map(d => `${d}`).join(''); /* 5. 渲染星期、计划、实际三行 */ const tbody = document.querySelector('#detailTable tbody'); tbody.innerHTML = `星期${weekRowHTML}` + `计划交付${dates .map( d => `<input type="number" min="0" value="${saved[d]?.plannedQty || 0}" data-date="${d}" data-type="planned">` ) .join('')}` + `实际交付${dates .map( d => `<input type="number" min="0" value="${saved[d]?.actualQty || 0}" data-date="${d}" data-type="actual">` ) .join('')}`; /* 6. 显示弹窗 */ document.getElementById('detailMask').style.display = 'block'; document.getElementById('detailWrap').style.display = 'block'; } function closeDetail(){ document.getElementById('detailMask').style.display='none'; document.getElementById('detailWrap').style.display='none'; } async function saveDetail(){ const inputs = document.querySelectorAll('#detailTable input'); const payload = {}; inputs.forEach(inp=>{ const date = inp.dataset.date; const type = inp.dataset.type; if(!payload[date]) payload[date] = {date, plannedQty:0, actualQty:0}; payload[date][type] = parseInt(inp.value) || 0; }); await fetch(`/api/production_plans/${curDetailPlanId}/details`,{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(Object.values(payload)) }); alert('已保存'); closeDetail(); } /* ================= 初始化 ================= */ loadPlans('',1); </script> </body> </html>这是我的前端界面,请帮我实现点击查看详情按钮后的后端接口,要求当录入数据并保存后上面的日期就不会随着时间变更

filetype

分析以下html 使用这个js 在Java中实现markdown转思维导图生成html: <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Markmap</title> <style> * { margin: 0; padding: 0; } html { font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; } #mindmap { display: block; width: 100vw; height: 100vh; } .markmap-dark { background: #27272a; color: white; } </style> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/style.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"> </head> <body> <svg id="mindmap"></svg> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/index.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/index.js"></script> <script>(e=>{window.WebFontConfig={custom:{families:["KaTeX_AMS","KaTeX_Caligraphic:n4,n7","KaTeX_Fraktur:n4,n7","KaTeX_Main:n4,n7,i4,i7","KaTeX_Math:i4,i7","KaTeX_Script","KaTeX_SansSerif:n4,n7,i4","KaTeX_Size1","KaTeX_Size2","KaTeX_Size3","KaTeX_Size4","KaTeX_Typewriter"]},active:()=>{e().refreshHook.call()}}})(()=>window.markmap)</script><script src="https://cdn.jsdelivr.net/npm/[email protected]/webfontloader.js" defer></script><script>(()=>{setTimeout(()=>{const{markmap:S,mm:Q}=window,$=new S.Toolbar;$.attach(Q);const I=$.render();I.setAttribute("style","position:absolute;bottom:20px;right:20px"),document.body.append(I)})})()</script> <script>((l,U,M,R)=>{const N=l();window.mm=N.Markmap.create("svg#mindmap",(U||N.deriveOptions)(R),M),window.matchMedia("(prefers-color-scheme: dark)").matches&&document.documentElement.classList.add("markmap-dark")})(()=>window.markmap,null,{"content":"markmap","children":[{"content":"Links","children":[{"content":"Website","children":[],"payload":{"tag":"li","lines":"8,9"}},{"content":"GitHub","children":[],"payload":{"tag":"li","lines":"9,11"}}],"payload":{"tag":"h2","lines":"6,7"}},{"content":"Related Projects","children":[{"content":"coc-markmap for Neovim","children":[],"payload":{"tag":"li","lines":"13,14"}},{"content":"markmap-vscode for VSCode","children":[],"payload":{"tag":"li","lines":"14,15"}},{"content":"eaf-markmap for Emacs","children":[],"payload":{"tag":"li","lines":"15,17"}}],"payload":{"tag":"h2","lines":"11,12"}},{"content":"Features","children":[{"content":"Lists","children":[{"content":"strong del italic highlight","children":[],"payload":{"tag":"li","lines":"23,24"}},{"content":"inline code","children":[],"payload":{"tag":"li","lines":"24,25"}},{"content":"<svg width=\"16\" height=\"16\" viewBox=\"0 -3 24 24\"><path d=\"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z\"/></svg> checkbox","children":[],"payload":{"tag":"li","lines":"25,26"}},{"content":"Katex: <math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}</annotation></semantics></math>x=2ab±b24ac<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"400em\" height=\"1.08em\" viewBox=\"0 0 400000 1080\" preserveAspectRatio=\"xMinYMin slice\"><path d=\"M95,702\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl0 -0\nc5.3,-9.3,12,-14,20,-14\nH400000v40H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM834 80h400000v40h-400000z\"/></svg>","children":[{"content":"More Katex Examples","children":[],"payload":{"tag":"li","lines":"27,28"}}],"payload":{"tag":"li","lines":"26,28","fold":1}},{"content":"Now we can wrap very very very very long text with the maxWidth option","children":[],"payload":{"tag":"li","lines":"28,29"}},{"content":"Ordered list","children":[{"content":"1. item 1","children":[],"payload":{"tag":"li","lines":"30,31","listIndex":1}},{"content":"2. item 2","children":[],"payload":{"tag":"li","lines":"31,33","listIndex":2}}],"payload":{"tag":"li","lines":"29,33"}}],"payload":{"tag":"h3","lines":"21,22"}},{"content":"Blocks","children":[{"content":"
console.log('hello, JavaScript')\n
","children":[],"payload":{"tag":"pre","lines":"35,38"}},{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ProductsPrice
Apple4
Banana2
","children":[],"payload":{"tag":"table","lines":"39,43"}},{"content":"","children":[],"payload":{"tag":"img","lines":"44,45"}}],"payload":{"tag":"h3","lines":"33,34"}}],"payload":{"tag":"h2","lines":"17,18"}}]},{"colorFreezeLevel":2})</script> </body> </html>

explorer_wgt
  • 粉丝: 4
上传资源 快速赚钱