feat(puzzle): 添加拼图边缘渲染功能

- 集成 PuzzleEdgeWorkerIpInterceptor 拦截器进行 IP 校验
- 添加 PuzzleEdgeWorkerSecurityProperties 配置类
- 创建 PuzzleEdgeRenderTaskController 提供边缘渲染接口
- 添加多种 DTO 类用于边缘渲染任务数据传输
- 创建 PuzzleEdgeRenderTaskEntity 实体和 Mapper 接口
- 实现 PuzzleEdgeRenderTaskService 核心服务逻辑
- 重构 PuzzleGenerateServiceImpl 使用边缘渲染服务
- 移除原有的线程池执行器和同步渲染逻辑
- 添加定时任务处理渲染超时和重试机制
- 实现自动打印队列添加功能
This commit is contained in:
2026-01-03 23:47:37 +08:00
parent 32297dc29c
commit 52ce26e630
19 changed files with 1207 additions and 33 deletions

View File

@@ -0,0 +1,91 @@
package com.ycwl.basic.utils;
import org.apache.commons.lang3.StringUtils;
/**
* IPv4 CIDR 匹配工具
*/
public final class Ipv4CidrMatcher {
private Ipv4CidrMatcher() {
}
/**
* 判断 IPv4 是否命中 CIDR(如:100.64.0.0/24)。
* - 若 cidr 不包含 '/',则按“完全相等”处理。
* - 仅支持 IPv4;IPv6 返回 false。
*/
public static boolean matches(String ip, String cidr) {
if (StringUtils.isBlank(ip) || StringUtils.isBlank(cidr)) {
return false;
}
String cleanedIp = ip.trim();
if (cleanedIp.contains(":")) {
return false;
}
String cleanedCidr = cidr.trim();
int slashIndex = cleanedCidr.indexOf('/');
if (slashIndex < 0) {
return cleanedIp.equals(cleanedCidr);
}
String networkPart = cleanedCidr.substring(0, slashIndex).trim();
String prefixPart = cleanedCidr.substring(slashIndex + 1).trim();
Integer ipInt = parseIpv4ToInt(cleanedIp);
Integer networkInt = parseIpv4ToInt(networkPart);
if (ipInt == null || networkInt == null) {
return false;
}
Integer prefixLength = parsePrefixLength(prefixPart);
if (prefixLength == null) {
return false;
}
int mask = prefixLength == 0 ? 0 : (-1 << (32 - prefixLength));
return (ipInt & mask) == (networkInt & mask);
}
private static Integer parsePrefixLength(String prefixPart) {
try {
int prefixLength = Integer.parseInt(prefixPart);
if (prefixLength < 0 || prefixLength > 32) {
return null;
}
return prefixLength;
} catch (Exception e) {
return null;
}
}
private static Integer parseIpv4ToInt(String ip) {
if (StringUtils.isBlank(ip)) {
return null;
}
String[] parts = ip.trim().split("\\.");
if (parts.length != 4) {
return null;
}
long result = 0;
for (String part : parts) {
int value;
try {
value = Integer.parseInt(part);
} catch (Exception e) {
return null;
}
if (value < 0 || value > 255) {
return null;
}
result = (result << 8) | value;
}
return (int) result;
}
}