feat(amazon): 实现商标筛查功能并优化用户体验

- 添加商标筛查面板和相关API接口- 实现Excel文件解析和数据过滤功能
- 添加文件上传进度跟踪和错误处理-优化空状态显示和操作引导- 实现tab状态持久化存储
- 添加订阅会员弹窗和付费入口
-优化文件选择和删除功能
- 改进UI样式和响应式布局
This commit is contained in:
2025-11-06 11:07:05 +08:00
parent 4e2ce48934
commit cfb70d5830
26 changed files with 1395 additions and 383 deletions

View File

@@ -0,0 +1,39 @@
package com.ruoyi.framework.config;
import io.lettuce.core.ClientOptions;
import io.lettuce.core.SocketOptions;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
/**
* Lettuce 连接配置
* 解决跨公网连接空闲后被中间设备关闭的问题
*
* @author ruoyi
*/
@Configuration
public class LettuceConfig {
/**
* 配置 Lettuce 客户端,双重保障防止连接失效
* 1. TCP Keepalive - 操作系统层维持连接活性
* 2. Ping Before Activate - 获取连接前验证有效性
*/
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() {
return clientConfigurationBuilder -> {
clientConfigurationBuilder.clientOptions(ClientOptions.builder()
.autoReconnect(true) // 自动重连
.pingBeforeActivateConnection(true) // 获取连接前 ping 验证(关键配置)
.socketOptions(SocketOptions.builder()
.keepAlive(true) // TCP Keepalive 辅助保持连接
.connectTimeout(Duration.ofSeconds(10)) // 连接超时 10 秒
.build())
.build());
};
}
}

View File

@@ -1,79 +0,0 @@
package com.ruoyi.framework.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import io.lettuce.core.ClientOptions;
import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.resource.DefaultClientResources;
import java.time.Duration;
/**
* Redis连接池优化配置
* 解决Lettuce连接超时问题
*
* @author ruoyi
*/
@Configuration
public class RedisPoolConfig {
/**
* 配置Lettuce客户端启用心跳检测和自动重连
*/
@Bean
public ClientResources clientResources() {
return DefaultClientResources.builder()
.ioThreadPoolSize(4) // IO线程数
.computationThreadPoolSize(4) // 计算线程数
.build();
}
/**
* 优化Redis连接池配置
*/
@Bean
public LettucePoolingClientConfiguration lettucePoolConfig(ClientResources clientResources) {
GenericObjectPoolConfig<?> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(50); // 最大连接数
poolConfig.setMaxIdle(20); // 最大空闲连接
poolConfig.setMinIdle(5); // 最小空闲连接
poolConfig.setMaxWaitMillis(10000); // 获取连接最大等待时间
return LettucePoolingClientConfiguration.builder()
.poolConfig(poolConfig)
.clientResources(clientResources)
.clientOptions(ClientOptions.builder()
.autoReconnect(true) // 自动重连
.pingBeforeActivateConnection(true) // 连接激活前ping检测
.build())
.commandTimeout(Duration.ofSeconds(10)) // 命令超时时间
.shutdownTimeout(Duration.ofMillis(100)) // 关闭超时时间
.build();
}
/**
* 定期检查Redis连接状态
*/
@Bean
public RedisTemplate<Object, Object> optimizedRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// 使用FastJson序列化器
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
// 设置序列化器
template.setKeySerializer(new org.springframework.data.redis.serializer.StringRedisSerializer());
template.setValueSerializer(serializer);
template.setHashKeySerializer(new org.springframework.data.redis.serializer.StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}