package com.cmcc.magent.config; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import java.net.InetAddress; import java.util.Locale; /** * 通用配置类。 *

* 该配置类主要用于加载项目的公共配置属性,并初始化全局变量。 *

* * 主要功能包括: * * *

* 属性值通过 {@code application.yml} 文件中的 `common` 配置前缀加载。 *

* * 示例: *
 * common:
 *   tokenExpiredOfSeconds: 3600
 *   allowPasswdRetryTimes: 5
 *   locale: zh_CN
 *   showSqlCommand: true
 * 
* * @author huangxin@cmhi.chinamobile.com * @version 1.0.0 * @since 2025-01-07 */ @Data @ConfigurationProperties(prefix = "common") @Configuration @Slf4j @SuppressWarnings({"java:S3008", "java:S1444", "java:S1104"}) public class CommonConfigure { /** * 项目的基础 URL。 *

* 由服务器的 IP 地址、端口号和上下文路径动态生成。 *

*/ public static String BASEURL; /** * 项目的前缀 URL。 *

* 该值通常对应于项目的上下文路径(Context Path)。 *

*/ public static String PROJECT_PREFIX_URL; /** * 服务配置属性。 *

* 用于获取服务器的上下文路径、端口号等信息。 *

*/ @Resource private ServerProperties serverProperties; /** * Token 的过期时间(单位:秒)。 *

* 表示用户登录的 Token 在多少秒后失效。 *

*/ private Integer tokenExpiredOfSeconds; /** * 允许的密码重试次数。 *

* 如果用户登录失败,则累计失败次数超过该值时,将触发账户锁定或其他安全策略。 *

*/ private Integer allowPasswdRetryTimes; /** * 默认的国际化语言区域。 *

* 格式为 {@code language_country},例如 {@code zh_CN} 表示简体中文。 * 默认值为 {@code Locale.CHINA}。 *

*/ private String locale; /** * 是否显示 SQL 命令。 *

* 用于控制是否在日志中显示执行的 SQL 语句,仅在调试模式下使用。 *

*/ private boolean showSqlCommand; /** * 数据文件保存目录。 *

* 用于创建本地数据文件。 *

*/ private String dataRootDirectory; /** * 中间件部署任务执行模式。 *

* 是否异步部署中间件,接收到部署任务后尽快返回。 *

*/ private boolean asyncDeployment; /** * 设置全局静态变量的值。 * * @param prefixUrl 项目上下文路径(Context Path) * @param baseUrl 项目的基础 URL,包括协议、主机地址和端口号 */ private static void setGlobalVars(String prefixUrl, String baseUrl) { PROJECT_PREFIX_URL = prefixUrl; BASEURL = baseUrl; } /** * 获取默认的语言区域(Locale)。 *

* 如果配置的语言格式不正确,则返回系统默认的 {@link Locale#CHINA}。 *

* * @return 默认的语言区域 {@link Locale} */ public Locale getDefaultLocale() { final int localSegment = 2; // 按下划线分割 String[] parts = locale.split("_"); if (localSegment == parts.length) { return new Locale(parts[0], parts[1]); } // 如果格式不正确,则返回系统默认 Locale.CHINA return Locale.CHINA; } /** * 初始化全局变量的值。 *

* 该方法在 Bean 初始化完成后通过 {@link PostConstruct} 注解自动调用: *

*/ @PostConstruct private void initGlobalValue() { log.info("Current: tokenExpiredOfSeconds = {}, allowPasswdRetryTimes = {}, showSqlCommand = {}", tokenExpiredOfSeconds, allowPasswdRetryTimes, showSqlCommand); String addr = "localhost"; try { addr = InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { log.error("Unable get local ip address: {}", e.getMessage()); } finally { setGlobalVars(serverProperties.getServlet().getContextPath(), "http://" + addr + ":" + serverProperties.getPort() + serverProperties.getServlet().getContextPath()); log.info("baseUrl: {}", BASEURL); } Locale.setDefault(getDefaultLocale()); } }