Forráskód Böngészése

Merge branch 'master' into feature_longhu

longhu 1 hete
szülő
commit
88881f30ab

+ 6 - 0
pom.xml

@@ -349,6 +349,12 @@
 
         <!-- E签宝  end -->
 
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+            <version>3.1.10</version>
+        </dependency>
+
     </dependencies>
 
 

+ 61 - 9
src/main/java/com/hr/repository/service/impl/FontManager.java

@@ -2,12 +2,19 @@ package com.hr.repository.service.impl;
 
 import jakarta.annotation.PostConstruct;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StreamUtils;
 
 import java.awt.*;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
 
 /**
  * @author yaoy
@@ -17,7 +24,8 @@ import java.io.InputStream;
 @Component
 @Slf4j
 public class FontManager {
-
+    @Autowired
+    private ResourceLoader resourceLoader;
     private volatile Font cachedFont;
     private final Object lock = new Object();
 
@@ -46,15 +54,59 @@ public class FontManager {
      */
     private Font loadBaseFont() {
 
-        ClassPathResource resource = new ClassPathResource("fonts/simsun.ttf");
+//        ClassPathResource resource = new ClassPathResource("fonts/simsun.ttf");
+//        try {
+//            InputStream fontStream = resource.getInputStream();
+//            Font f= Font.createFont(Font.TRUETYPE_FONT, fontStream);
+//            log.info("字体加载成功");
+//            return f;
+//        }catch (Exception e) {
+//            log.error("加载字体失败:{}",e.getMessage(),e);
+//            return new Font("SansSerif", Font.PLAIN, 12);
+//        }
         try {
-            InputStream fontStream = resource.getInputStream();
-            Font f= Font.createFont(Font.TRUETYPE_FONT, fontStream);
-            log.info("字体加载成功");
-            return f;
-        }catch (Exception e) {
-            log.error("加载字体失败:{}",e.getMessage(),e);
-            return new Font("SansSerif", Font.PLAIN, 12);
+            ClassPathResource resource = new ClassPathResource("fonts/simsun.ttf");
+            log.info("尝试加载字体文件: {}", resource.getPath());
+            log.info("资源存在: {}", resource.exists());
+
+            if (!resource.exists()) {
+                log.error("字体文件不存在: fonts/simsun.ttf");
+                return new Font("SansSerif", Font.PLAIN, 12);
+            }
+
+            try (InputStream is = resource.getInputStream()) {
+                if (is == null) {
+                    log.error("字体文件输入流为 null");
+                    return new Font("SansSerif", Font.PLAIN, 12);
+                }
+
+                byte[] fontData = StreamUtils.copyToByteArray(is);
+                log.info("字体文件大小: {} bytes", fontData.length);
+
+                if (fontData.length == 0) {
+                    log.error("字体文件为空");
+                    return new Font("SansSerif", Font.PLAIN, 12);
+                }
+
+                Font font = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(fontData));
+                Font derivedFont = font.deriveFont(12f);
+
+                log.info("字体加载成功: {} (family: {}, name: {})",
+                        derivedFont.getFontName(), derivedFont.getFamily(), derivedFont.getName());
+
+                return derivedFont;
+
+            }
+        } catch (Exception e) {
+            log.error("加载字体失败", e);
+            try {
+                Font defaultFont = new Font("Dialog", Font.PLAIN, 12);
+                log.info("使用默认字体: {}", defaultFont.getName());
+                return defaultFont;
+            } catch (Exception ex) {
+                log.error("创建默认字体也失败", ex);
+                return Font.decode(null);
+            }
         }
 
     }

+ 4 - 2
src/main/resources/bootstrap.yml

@@ -8,8 +8,10 @@ spring:
   application:
     # 应用名称
     name: InterfacePlatform
-
   cloud:
     nacos:
       config:
-        namespace: Auth
+        namespace: Auth
+      discovery:
+        # 自动获取本机 IP(优先 IPv4)
+        ip: ${spring.cloud.client.ip-address}

+ 54 - 69
src/main/resources/logback.xml

@@ -1,92 +1,77 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<configuration scan="true" scanPeriod="60 seconds" debug="false" >
-    <!--为了防止进程退出时,内存中的数据丢失,请加上此选项-->
+<configuration scan="false"  debug="true" >
+
+    <!-- 关闭时的配置 -->
+    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
+        <resetJUL>true</resetJUL>
+    </contextListener>
+
+    <!-- 禁用关闭钩子 -->
     <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
-    <!-- 日志存放路径 -->
+
     <property name="log.path" value="logs" />
-    <!-- 日志输出格式 -->
     <property name="log.pattern" value="%d{HH:mm:ss.SSS} [traceId:%X{traceId}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
     <springProperty scope="context" name="appName" source="spring.application.name" />
-    <!-- 控制台输出 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
 
-    <!--    <appender name="aliyun" class="com.aliyun.openservices.log.logback.LoghubAppender">-->
 
+    <!-- Info 日志文件 appender (仅在 appName 定义后启用) -->
+    <if condition='isDefined("appName")'>
+        <then>
+            <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <!--                <file>${log.path}/${appName}.log</file>-->
+                <encoder>
+                    <charset>UTF-8</charset>
+                    <pattern>${log.pattern}</pattern>
+                </encoder>
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <fileNamePattern>${log.path}/${appName}.log.%d{yyyy-MM-dd}.log</fileNamePattern>
+                    <maxHistory>30</maxHistory>
+                </rollingPolicy>
+            </appender>
+        </then>
+    </if>
 
-    <!-- 系统日志输出 -->
-    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
-<!--        <file>${log.path}/app.log</file>-->
-        <!-- 循环政策:基于时间创建日志文件 -->
-        <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [traceId:%X{traceId}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <!-- rollover daily and when the file reaches 100MB -->
-            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info.%i.log</fileNamePattern>
-            <maxFileSize>1MB</maxFileSize>
-            <maxHistory>30</maxHistory> <!-- keep 30 days' worth of history -->
-            <totalSizeCap>1GB</totalSizeCap> <!-- optional, limit the total size for all archive files -->
-        </rollingPolicy>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
-            <level>INFO</level>
-            <!-- 匹配时的操作:接收(记录) -->
-            <onMatch>ACCEPT</onMatch>
-            <!-- 不匹配时的操作:拒绝(不记录) -->
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
-<!--        <file>${log.path}/error.log</file>-->
-        <!-- 循环政策:基于时间创建日志文件 -->
-        <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [traceId:%X{traceId}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <!-- rollover daily and when the file reaches 100MB -->
-            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/err.%i.log</fileNamePattern>
-            <maxFileSize>1MB</maxFileSize>
-            <maxHistory>30</maxHistory> <!-- keep 30 days' worth of history -->
-            <totalSizeCap>1GB</totalSizeCap> <!-- optional, limit the total size for all archive files -->
-        </rollingPolicy>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
-            <level>ERROR</level>
-            <!-- 匹配时的操作:接收(记录) -->
-            <onMatch>ACCEPT</onMatch>
-            <!-- 不匹配时的操作:拒绝(不记录) -->
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
+    <!-- Error 日志文件 appender (仅在 appName 定义后启用) -->
+    <if condition='isDefined("appName")'>
+        <then>
+            <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <!--日志文件输出的文件名-->
+                    <fileNamePattern>${log.path}/${appName}.error.log.%d{yyyy-MM-dd}.log</fileNamePattern>
+                    <!--日志文件保留天数-->
+                    <MaxHistory>30</MaxHistory>
+                </rollingPolicy>
+                <!-- 所有error日志都在这里-->
+                <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                    <level>ERROR</level>
+                    <onMatch>ACCEPT</onMatch>
+                    <onMismatch>DENY</onMismatch>
+                </filter>
+                <encoder>
+                    <!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+                    <pattern>${log.pattern}</pattern>
+                    <!-- 记录日志的编码 -->
+                    <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+                    <!--                    <immediateFlush>true</immediateFlush>-->
+                </encoder>
+            </appender>
+        </then>
+    </if>
 
-    <!-- 系统模块日志级别控制  -->
     <logger name="com.hr" level="info" />
     <logger name="com.ruoyi" level="info" />
     <logger name="com.yy.basedevelop.common.config" level="info" />
-
-
-    <!-- Spring日志级别控制  -->
     <logger name="org.springframework" level="info" />
 
     <root level="info">
-        <appender-ref ref="console" />
+        <appender-ref ref="console"/>
+        <appender-ref ref="file_info"/>
+        <appender-ref ref="file_error"/>
     </root>
 
-    <!--系统操作日志-->
-    <root level="info">
-
-        <appender-ref ref="file_info" />
-        <appender-ref ref="file_error" />
-    </root>
-
-<!--    <logger name="com.hr" additivity="true">-->
-<!--        <appender-ref ref="aliyun"/>-->
-<!--    </logger>-->
-
 </configuration>