From a62d7b614786ea82e981b9c3a00a1f508ae7eea8 Mon Sep 17 00:00:00 2001 From: zhangzijienbplus <17738440858@163.com> Date: Tue, 4 Nov 2025 15:39:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(trademark):=20=E5=AE=9E=E7=8E=B0=E5=95=86?= =?UTF-8?q?=E6=A0=87=E7=AD=9B=E6=9F=A5=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增商标筛查进度展示界面与交互逻辑 - 实现产品、品牌及平台跟卖许可的分项任务进度追踪 - 添加商标数据导出与任务重试、取消功能 - 调整Redis连接池配置以提升并发性能 - 禁用ChromeDriver预加载,改为按需启动以节省资源- 支持品牌商标远程筛查接口调用与结果解析 - 增加Hutool工具库依赖用于简化IO与Excel处理- 更新USPTO商标查询脚本实现自动化检测 - 修改Ruoyi后台Redis依赖版本并添加集群心跳配置- 切换本地开发环境API地址指向内网测试服务器 --- electron-vue-template/src/main/main.ts | 8 +- .../src/renderer/api/http.ts | 8 +- .../src/renderer/api/mark.ts | 21 + .../components/amazon/AmazonDashboard.vue | 500 ++++++++++++++++-- .../components/amazon/TrademarkCheckPanel.vue | 434 ++++++++++++--- .../src/renderer/public/icon/acquisition.png | Bin 0 -> 533 bytes .../src/renderer/public/icon/done1.png | Bin 0 -> 894 bytes erp_client_sb/pom.xml | 6 + .../erp/config/ChromeDriverPreloader.java | 19 +- .../erp/controller/TrademarkController.java | 90 ++++ .../com/tashow/erp/test/UsptoApiTest.java | 160 ++++++ .../src/main/java/com/tashow/erp/test/aa.java | 50 +- .../java/com/tashow/erp/utils/ProxyPool.java | 32 ++ .../com/tashow/erp/utils/SeleniumUtil.java | 16 + .../tashow/erp/utils/TrademarkCheckUtil.java | 142 ++++- .../web/controller/tool/MarkController.java | 134 ++++- .../src/main/resources/application.yml | 22 +- ruoyi-common/pom.xml | 2 + .../common/core/redis/RedisHealthCheck.java | 52 ++ .../framework/config/RedisPoolConfig.java | 79 +++ test_brand_data.json | 44 ++ test_response.json | 412 +++++++++++++++ 22 files changed, 2063 insertions(+), 168 deletions(-) create mode 100644 electron-vue-template/src/renderer/api/mark.ts create mode 100644 electron-vue-template/src/renderer/public/icon/acquisition.png create mode 100644 electron-vue-template/src/renderer/public/icon/done1.png create mode 100644 erp_client_sb/src/main/java/com/tashow/erp/controller/TrademarkController.java create mode 100644 erp_client_sb/src/main/java/com/tashow/erp/test/UsptoApiTest.java create mode 100644 erp_client_sb/src/main/java/com/tashow/erp/utils/ProxyPool.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisHealthCheck.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisPoolConfig.java create mode 100644 test_brand_data.json create mode 100644 test_response.json diff --git a/electron-vue-template/src/main/main.ts b/electron-vue-template/src/main/main.ts index 1f6d175..18356b8 100644 --- a/electron-vue-template/src/main/main.ts +++ b/electron-vue-template/src/main/main.ts @@ -211,7 +211,7 @@ function startSpringBoot() { } } - startSpringBoot(); + // startSpringBoot(); function stopSpringBoot() { if (!springProcess) return; try { @@ -348,9 +348,9 @@ app.whenReady().then(() => { } } - // setTimeout(() => { - // openAppIfNotOpened(); - // }, 100); + setTimeout(() => { + openAppIfNotOpened(); + }, 100); app.on('activate', () => { if (mainWindow && !mainWindow.isDestroyed()) { diff --git a/electron-vue-template/src/renderer/api/http.ts b/electron-vue-template/src/renderer/api/http.ts index a80d284..9893c66 100644 --- a/electron-vue-template/src/renderer/api/http.ts +++ b/electron-vue-template/src/renderer/api/http.ts @@ -1,13 +1,13 @@ export type HttpMethod = 'GET' | 'POST' | 'DELETE'; export const CONFIG = { CLIENT_BASE: 'http://localhost:8081', - RUOYI_BASE: 'http://8.138.23.49:8085', - //RUOYI_BASE: 'http://192.168.1.89:8085', - SSE_URL: 'http://8.138.23.49:8085/monitor/account/events' + // RUOYI_BASE: 'http://8.138.23.49:8085', + RUOYI_BASE: 'http://192.168.1.89:8085', + SSE_URL: 'http://192.168.1.89:8085/monitor/account/events' } as const; function resolveBase(path: string): string { - if (path.startsWith('/monitor/') || path.startsWith('/system/') || path.startsWith('/tool/banma') || path.startsWith('/tool/genmai')) { + if (path.startsWith('/monitor/') || path.startsWith('/system/') || path.startsWith('/tool/banma') || path.startsWith('/tool/genmai') || path.startsWith('/tool/mark')) { return CONFIG.RUOYI_BASE; } return CONFIG.CLIENT_BASE; diff --git a/electron-vue-template/src/renderer/api/mark.ts b/electron-vue-template/src/renderer/api/mark.ts new file mode 100644 index 0000000..ecfbc0e --- /dev/null +++ b/electron-vue-template/src/renderer/api/mark.ts @@ -0,0 +1,21 @@ +import { http } from './http' + +export const markApi = { + // 新建任务 + newTask(file: File) { + const formData = new FormData() + formData.append('file', file) + return http.upload<{ code: number, data: any, msg: string }>('/tool/mark/newTask', formData) + }, + + // 获取任务列表及筛选数据 + getTask() { + return http.get<{ code: number, data: { original: any, filtered: any[] }, msg: string }>('/tool/mark/task') + }, + + // 品牌商标筛查 + brandCheck(brands: string[]) { + return http.post<{ code: number, data: { total: number, filtered: number, passed: number, data: any[] }, msg: string }>('/tool/mark/brandCheck', brands) + } +} + diff --git a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue index 32fb5cb..ffcc44e 100644 --- a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue +++ b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue @@ -62,6 +62,26 @@ function handleSizeChange(size: number) { function handleCurrentChange(page: number) { currentPage.value = page } + +function handleNewTask() { + if (trademarkPanelRef.value && trademarkPanelRef.value.resetToIdle) { + trademarkPanelRef.value.resetToIdle() + } + trademarkData.value = [] + currentPage.value = 1 +} + +function handleCancelTask() { + if (trademarkPanelRef.value && typeof trademarkPanelRef.value.stopTrademarkQuery === 'function') { + trademarkPanelRef.value.stopTrademarkQuery() + } +} + +function handleRetryTask() { + if (trademarkPanelRef.value && typeof trademarkPanelRef.value.startTrademarkQuery === 'function') { + trademarkPanelRef.value.startTrademarkQuery() + } +}