diff --git a/electron-vue-template/src/renderer/App.vue b/electron-vue-template/src/renderer/App.vue index e615ab0..195b56f 100644 --- a/electron-vue-template/src/renderer/App.vue +++ b/electron-vue-template/src/renderer/App.vue @@ -1012,13 +1012,12 @@ onUnmounted(() => { width: 100%; height: 60px; margin-bottom: 16px; - padding: 0 4px; box-sizing: border-box; } .brand-logo { - max-width: 100%; - max-height: 100%; + width: 100%; + height: 100%; object-fit: cover; border-radius: 12px; } diff --git a/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue b/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue index 3cc1831..ddb3e92 100644 --- a/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue +++ b/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue @@ -582,7 +582,7 @@ async function startTrademarkQuery() { if (!trademarkLoading.value) return await processBrandResult(brandResult) - brandData.completed = brandResult.data.unregistered || 0 + brandData.completed = trademarkFullData.value.length queryStatus.value = 'done' trademarkProgress.value = 100 @@ -1006,12 +1006,11 @@ defineExpose({ - -
+
3
-
选择需查询的(可多选)
+
商标筛查条件
商标筛查包含以下维度,后续将开放更 多维度的筛查条件与自定义条件组合功 diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/BrandTrademarkCacheServiceImpl.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/BrandTrademarkCacheServiceImpl.java index c4ffa2f..624c329 100644 --- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/BrandTrademarkCacheServiceImpl.java +++ b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/BrandTrademarkCacheServiceImpl.java @@ -30,11 +30,22 @@ public class BrandTrademarkCacheServiceImpl implements BrandTrademarkCacheServic @Override public void saveResults(Map results) { + LocalDateTime cutoffTime = LocalDateTime.now().minusDays(1); results.forEach((brand, registered) -> { - BrandTrademarkCacheEntity entity = new BrandTrademarkCacheEntity(); - entity.setBrand(brand); - entity.setRegistered(registered); - repository.save(entity); + repository.findByBrandAndCreatedAtAfter(brand, cutoffTime) + .ifPresentOrElse( + existing -> { + existing.setRegistered(registered); + existing.setCreatedAt(LocalDateTime.now()); + repository.save(existing); + }, + () -> { + BrandTrademarkCacheEntity entity = new BrandTrademarkCacheEntity(); + entity.setBrand(brand); + entity.setRegistered(registered); + repository.save(entity); + } + ); }); } diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/FangzhouApiServiceImpl.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/FangzhouApiServiceImpl.java index 9811d40..c9afaa8 100644 --- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/FangzhouApiServiceImpl.java +++ b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/FangzhouApiServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; @@ -97,10 +98,11 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService { String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class); JsonNode json = objectMapper.readTree(result); - // 处理 Token 过期,自动刷新重试 - if (json.get("S").asInt() == TOKEN_EXPIRED_CODE) { - logger.info("Token 过期,刷新后重试"); - String newToken = refreshToken(); + // 处理 Token 失效 + int statusCode = json.get("S").asInt(); + if (statusCode == TOKEN_EXPIRED_CODE || statusCode == -1002) { + String newToken = statusCode == -1002 ? getToken() : refreshToken(); + logger.info("Token 失效({}), {}后重试", statusCode, statusCode == -1002 ? "重新注册" : "刷新"); formData.set("t", newToken); formData.set("s", md5(ts + data + API_SECRET)); requestEntity = new HttpEntity<>(formData, headers); @@ -109,6 +111,27 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService { } return json; + } catch (ResourceAccessException e) { + logger.warn("证书验证失败,尝试重新注册: {}", e.getMessage()); + String newToken = refreshToken(); + long ts = System.currentTimeMillis(); + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("c", command); + formData.add("d", data); + formData.add("t", newToken); + formData.add("s", md5(ts + data + API_SECRET)); + formData.add("ts", String.valueOf(ts)); + formData.add("website", "1"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> requestEntity = new HttpEntity<>(formData, headers); + try { + String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class); + return objectMapper.readTree(result); + } catch (Exception ex) { + logger.error("重试失败", ex); + throw new RuntimeException("调用 API 失败: " + ex.getMessage()); + } } catch (Exception e) { logger.error("调用方舟精选 API 失败", e); throw new RuntimeException("调用 API 失败: " + e.getMessage()); @@ -137,10 +160,11 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService { String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class); JsonNode json = objectMapper.readTree(result); - // 处理 Token 过期 - if (json.get("S").asInt() == TOKEN_EXPIRED_CODE) { - logger.info("Token 过期,刷新后重试"); - String newToken = refreshToken(); + // 处理 Token 失效 + int statusCode = json.get("S").asInt(); + if (statusCode == TOKEN_EXPIRED_CODE || statusCode == -1002) { + String newToken = statusCode == -1002 ? getToken() : refreshToken(); + logger.info("Token 失效({}), {}后重试", statusCode, statusCode == -1002 ? "重新注册" : "刷新"); formData.set("t", newToken); formData.set("s", md5(ts + data + API_SECRET)); requestEntity = new HttpEntity<>(formData, headers); @@ -149,6 +173,29 @@ public class FangzhouApiServiceImpl implements IFangzhouApiService { } return json; + } catch (ResourceAccessException e) { + logger.warn("证书验证失败,尝试重新注册: {}", e.getMessage()); + String newToken = refreshToken(); + String data = String.format("{\"name\":\"%s\",\"type\":1}", file.getOriginalFilename()); + long ts = System.currentTimeMillis(); + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("c", "Create"); + formData.add("t", newToken); + formData.add("ts", ts); + formData.add("d", data); + formData.add("s", md5(ts + data + API_SECRET)); + formData.add("website", "1"); + formData.add("files", file.getResource()); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity> requestEntity = new HttpEntity<>(formData, headers); + try { + String result = restTemplate.postForObject(FANGZHOU_API_URL, requestEntity, String.class); + return objectMapper.readTree(result); + } catch (Exception ex) { + logger.error("重试失败", ex); + throw new RuntimeException("上传文件失败: " + ex.getMessage()); + } } catch (Exception e) { logger.error("上传文件失败", e); throw new RuntimeException("上传文件失败: " + e.getMessage()); diff --git a/erp_client_sb/src/main/java/com/tashow/erp/utils/ProxyPool.java b/erp_client_sb/src/main/java/com/tashow/erp/utils/ProxyPool.java index ba05d75..af810a5 100644 --- a/erp_client_sb/src/main/java/com/tashow/erp/utils/ProxyPool.java +++ b/erp_client_sb/src/main/java/com/tashow/erp/utils/ProxyPool.java @@ -11,7 +11,7 @@ import java.util.List; @Component public class ProxyPool { - private static final String API_URL = "http://api.tianqiip.com/getip?secret=y0thbcco1rgxn9e9&num=%d&type=txt&port=2&time=3&mr=1&sign=a8a42f3cd3f22a7fbf84530deb91c1d8"; + private static final String API_URL = "http://api.tianqiip.com/getip?secret=y0thbcco1rgxn9e9&num=%d&type=txt&port=2&time=3&mr=1&sign=9be780c7e27aea815f1e0874446b9e35"; /** * 获取一个代理IP diff --git a/erp_client_sb/src/main/resources/application.yml b/erp_client_sb/src/main/resources/application.yml index af643bb..9360247 100644 --- a/erp_client_sb/src/main/resources/application.yml +++ b/erp_client_sb/src/main/resources/application.yml @@ -48,7 +48,7 @@ api: server: # 主服务器API配置 base-url: "http://8.138.23.49:8085" - # base-url: "http://192.168.1.89:8085" + #base-url: "http://192.168.1.89:8085" paths: monitor: "/monitor/client/api" login: "/monitor/account/login" diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MarkController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MarkController.java index ec9422f..d8edb4c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MarkController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MarkController.java @@ -27,7 +27,7 @@ public class MarkController { /** * 获取 Token - * 如果 Redis 中不存在 Token,自动注册新账号 + * 如果 Redis 中不存在 Token 或 Token 不可用,自动注册新账号 * * @return Token 字符串 */ @@ -37,11 +37,12 @@ public class MarkController { // 先尝试从 Redis 获取现有 Token String token = redisCache.getCacheMapValue(CacheConstants.MARK_ACCOUNT_KEY, "token"); - if (token != null && !token.isEmpty()) { + // 验证 Token 是否可用 + if (token != null && !token.isEmpty() && markService.validateToken(token)) { return AjaxResult.success("获取成功", token); } - // Token 不存在,自动注册新账号 + // Token 不存在或不可用,重新注册新账号 token = markService.reg(); return AjaxResult.success("注册成功", token); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IMarkService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IMarkService.java index ab78991..0f82237 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IMarkService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IMarkService.java @@ -21,5 +21,12 @@ public interface IMarkService { * 登录 */ String login(); + + /** + * 验证Token是否可用 + * @param token 待验证的Token + * @return true=可用, false=不可用 + */ + boolean validateToken(String token); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MarkServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MarkServiceImpl.java index 63d1ce7..831ef15 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MarkServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MarkServiceImpl.java @@ -124,5 +124,29 @@ public class MarkServiceImpl implements IMarkService { throw new RuntimeException("MD5加密失败", e); } } + + @Override + public boolean validateToken(String token) { + try { + String data = "{\"name\":\"\",\"page_size\":1,\"current_page\":1}"; + long ts = System.currentTimeMillis(); + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("c", "TaskPageList"); + formData.add("d", data); + formData.add("t", token); + formData.add("s", md5(ts + data + API_SECRET)); + formData.add("ts", String.valueOf(ts)); + formData.add("website", "1"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> requestEntity = new HttpEntity<>(formData, headers); + String result = restTemplate.postForObject("https://api.fangzhoujingxuan.com/Task", requestEntity, String.class); + JsonNode json = objectMapper.readTree(result); + int statusCode = json.get("S").asInt(); + return statusCode == 1; + } catch (Exception e) { + return false; + } + } }