From 1aceceb38f01694f162f65585c6d803349ef34d8 Mon Sep 17 00:00:00 2001 From: zhangzijienbplus <17738440858@163.com> Date: Tue, 28 Oct 2025 09:39:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(electron):=E4=BC=98=E5=8C=96=E8=B7=9F?= =?UTF-8?q?=E5=8D=96=E7=B2=BE=E7=81=B5=E5=90=AF=E5=8A=A8=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=92=8CUI=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除启动时的固定延时,改为即时反馈启动状态- 更新跟卖精灵描述文案,移除初始化时间说明 - 统一spinner样式类名,优化加载动画显示逻辑 - 调整菜单激活背景色,增强视觉层次感- 引入平台图标图片替代文字标识- 修改VIP状态栏背景及文字颜色,提升可读性 - 配置ChromeDriver国内镜像源并实现后台预加载 - 添加WebDriverManager依赖以自动管理浏览器驱动 -优化electron-builder资源打包配置 --- electron-vue-template/electron-builder.json | 8 ++- electron-vue-template/public/icon/amazon.png | Bin 0 -> 1413 bytes electron-vue-template/public/icon/rakuten.png | Bin 0 -> 804 bytes electron-vue-template/public/icon/zebra.png | Bin 0 -> 3294 bytes electron-vue-template/src/main/main.ts | 4 +- electron-vue-template/src/renderer/App.vue | 49 +++++++-------- .../components/amazon/AmazonDashboard.vue | 14 ++--- .../src/renderer/public/icon/amazon.png | Bin 0 -> 1413 bytes .../src/renderer/public/icon/icon.png | Bin 2399 -> 4666 bytes .../src/renderer/public/icon/rakuten.png | Bin 0 -> 804 bytes .../src/renderer/public/icon/zebra.png | Bin 0 -> 3294 bytes erp_client_sb/pom.xml | 5 ++ .../com/tashow/erp/config/AsyncConfig.java | 9 --- .../erp/config/ChromeDriverPreloader.java | 58 ++++++++++++++++++ .../erp/controller/SystemController.java | 11 +++- .../service/impl/ChromeDriverPreloader.java | 21 ------- .../erp/service/impl/GenmaiServiceImpl.java | 47 +++++++------- .../com/ruoyi/system/domain/RefreshToken.java | 1 + .../system/mapper/RefreshTokenMapper.java | 1 + .../mapper/system/RefreshTokenMapper.xml | 1 + 20 files changed, 138 insertions(+), 91 deletions(-) create mode 100644 electron-vue-template/public/icon/amazon.png create mode 100644 electron-vue-template/public/icon/rakuten.png create mode 100644 electron-vue-template/public/icon/zebra.png create mode 100644 electron-vue-template/src/renderer/public/icon/amazon.png create mode 100644 electron-vue-template/src/renderer/public/icon/rakuten.png create mode 100644 electron-vue-template/src/renderer/public/icon/zebra.png delete mode 100644 erp_client_sb/src/main/java/com/tashow/erp/config/AsyncConfig.java create mode 100644 erp_client_sb/src/main/java/com/tashow/erp/config/ChromeDriverPreloader.java delete mode 100644 erp_client_sb/src/main/java/com/tashow/erp/service/impl/ChromeDriverPreloader.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/RefreshToken.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/RefreshTokenMapper.java create mode 100644 ruoyi-system/src/main/resources/mapper/system/RefreshTokenMapper.xml diff --git a/electron-vue-template/electron-builder.json b/electron-vue-template/electron-builder.json index dc8013d..5c02c99 100644 --- a/electron-vue-template/electron-builder.json +++ b/electron-vue-template/electron-builder.json @@ -7,7 +7,9 @@ "compression": "maximum", "asarUnpack": [ "public/jre/**/*", - "public/icon/**/*", + "public/icon/icon.png", + "public/icon/image.png", + "public/icon/img.png", "public/image/**/*", "public/splash.html", "public/config/**/*" @@ -48,7 +50,9 @@ "to": "public", "filter": [ "jre/**/*", - "icon/**/*", + "icon/icon.png", + "icon/image.png", + "icon/img.png", "image/**/*", "splash.html", "config/**/*", diff --git a/electron-vue-template/public/icon/amazon.png b/electron-vue-template/public/icon/amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5100c243901c6d3731c19f2d0681f18994d5ed7 GIT binary patch literal 1413 zcmV;01$z34P)N5z{|?NYdF&3*tN?Z}VgKRzV}*^l>mG8?5U9iaX27*VC=s6e^9U)6Js}IpUB2! z7uaDW*^um-OnKU+DMMg~c#OPbDzJ54C_$DXyf9^tdW;Ujd4(IV8nQ!l2o`6XJmYH; z9YCO2&nbu70RnOd;WaXff>Kt{uwAULyB8VN8;Z;2)|I zEkwe-BQH0UDc~p4rgEe32K978!2OOmL<>2GTUfc^D!yy^E9oH|!r|DraKm+iDiDZ} z0&%BrERP+-jc7CYx|TbHv4g_vd*=N|_XJ#GU5Ft$&bvg}@$-MExs^MRU31MMa`nVLBzyYcwxR zCj{a=lOdisK?SNKNwYZHtSItyWrBQq@x{Dn(O+N(=)>=d^K!-jtA!Pa>p^4?fqWW2fgAT7j}PW?Ap{br9|xe$y1=(6ij4oueiA?k4M3l*Rce;MK9&tv6I;7<}ENCkp zJ{I8yg-*1Cih2ec&T-v6(m1X=!d8Wc^r&Nij=*!F41T#LwX9=MI@k6*YbrNTsbf4y z{tLFNOW^nOcz#{Z3;bAz>-r48?}MeL>=Ufnxu!mlH%{rIC3@*ZEPR+yoeH0+&!h5r zO9HVtbTH?UGb->^@~qn%p{PInJT0X@+05==CI2txucg_%_M9n>z*oJ8OH#g%j-uYv zG(%AsD)QQdyelCOnHf94^1|KHU2o+cMfHvf>CL}lG@&Dps$8(^kcVX?pfqncd(aFD zt&}|J#Jm+$$dIncISD7QODJ5;Ur(3w-^N|8B*=hd?3d0O;g&qAL-|P!DSUoXK2nrA z{=mcJX})E-=t1N?OL}ZvQ6v!tCMOkYBk$t;bWC1#9Pf#P4Se?^&p*X?n#WD^d^8g$ zKfttK>Fvo&SnrdjO88dIYb&CnlrjB1X-kgM-twI;VuDA7{KDLj7d=d#=b>b7{h9tG z!BeZ-{Mw2+|McdQ#wsR8thWKjQC4VCe&~yMSQ6!T+kWE7OdNda^tzz zPW#HdRMnuKzLkDV{;lU5fZ79ikjR3lHPaHlXt(4crJPAo!P6N*_JjmFt3K7Yahttq zxsiz;V_ngC7r2Xyg=NZxZl>!;(9)D3+R+C*Z>hubCImcduJq>EX=UVgg~pjt7P1%I( T2d@je00000NkvXXu0mjf6B46L literal 0 HcmV?d00001 diff --git a/electron-vue-template/public/icon/rakuten.png b/electron-vue-template/public/icon/rakuten.png new file mode 100644 index 0000000000000000000000000000000000000000..3271000c1ce8213039e9544734524779fdb631d1 GIT binary patch literal 804 zcmV+<1Ka$GP)&*fEw7)ze zJ09ufK#^2J5z_+oY&AXU90UrF+ZsxogFt~&%d|frE##|MzVi11ou^zP{;^rn`UPQ< z3Pfr9U3t88*n}Sx5esyQ;S4;AVA#^7Nw$v|{iEOM@&$3_g?Of&wFmXJ7hQHmEQgDl zA8{RTm}Bo&BW!Sf?c_5$Pi z0R>V=&wcLlHG?%EA5tRPIz<1Y>3&37R^ zX_ou=OX%@5h+{43M-~#rllqZ``Jj{fk(Ke61|$4PViMm>EjGrF9_gN`eq^m!9py(; z<`zu}G}ezWVfxivyJJFrw7>{V_Jc;|M>k{qNUGg2d>Qvugom4gABEOPjK74hPtBzV i9301S9LI5-H^?*G4~u_X(doMY0000cK literal 0 HcmV?d00001 diff --git a/electron-vue-template/public/icon/zebra.png b/electron-vue-template/public/icon/zebra.png new file mode 100644 index 0000000000000000000000000000000000000000..53f0cd44819582d128258ad37b010acc577bd98b GIT binary patch literal 3294 zcmV<43?cK0P)lD00&@g1Zcg64LImBh&BPb_iDCu8?)LNHR0>_F5*T(B~&q-oSe)pTegfc za@c-dQIRR+cycP;vSl1}b6k{txNV=VL$cwmee^&k&P}U|dUA2^L1Qn28ziZEz0uLp z1niYd_ibJs$@Y5;9N3f}^Up`fvkP}n?4ab!1NGGbHFW(({PCOELE5=ya`;#C&opIk zc%lP2E*peuAEk%h+Y2Xl#2gs1Vt8U=Vy%3PQUP`>+CsOio=O9;vu-PZJ3!aB*a@fC z1H8E5k7V$i#lw+UizNhaw)TL0Lp)!*Di($tTqktY}JAXo1!Nvw}l z&{1e?5{&;?v=+4zg-KbLG)Yoqk}!He*6#kX)oXGO@7)_JA4ih%BR*l8v;)j{Sd%cJ z1wRhx(X1g*cjPzF-gPI?EQ^yvgP)Gl1G@%1SebHY|Ni}9?D&Wg#0Jw+W^hj}+sfRwEG&F7I{E$&q3Gx!;C)&^4SbAt zT6i*q6l9O05)#FuwlMcm3KVRq#;hMdD=ZfGPC9Gu0fPQ3+#HK;iNK=ULvcw-bulq9 zR{VJpXaMVpt+V-0=lmT+3(p?f709idD+ViW>j~Tx-D=k!+PQvx7-$In$myHtxOv-% zO@*kjF=GAYK5R_stf@zb+H!cs$N@((2bx+gP6X{ByOg!>fMT$NI#^o#K*95OO)WyN zgN9a{4YY%t=ouTzhl0sZ6fruI8>mMXEJ;yGnRx32TVY|eQ}gqP2HgVeFXt$YXa#f+ zvcEZU(LK*?_w6_IuDc<3XRLU1OA=pv?moC~CDfObhZ&@^yn>bX{DbSaZJX}2$k#Ol zc>qWdd-4j$ZV_(jnA5%eB=$2fsh!Rkc2Xz@i zqG*-BS&5ctV@|eX__lNaEs8VXzJKItP=GEY z==}Mjwgv4Ms8!0NDC|2}Swy;rOSMXdrt| zPz@$8Y#SHeLxiC4O8V{Q&DU;(uMZxUQ08btNaUlRQCfdQ{KJEpT*<`@ZAOR zlV=qJ%yxQ@E~=;#uu4?+G1BXa5RO9Hn&eU2VTUPEh3Sl%T^J3>M(=$4;)0EUe!kglM&J@fV^rEcCe7G$$SRPWI4 zjy()$0as9q5`e~Mlf0Zk)WlPF+>Kx+O zxKR40gc{I|D$0#Lb}i1V&PyBX=pYFS3NphpX>l+rt^gXevm{0m!I!8D#z$QL-c)Jp zOB*P4-Hp`~)KG(J=gJ8VlFCbcd+vHUy{-dEBrp)&ZFf8w9e0kAL_x!>o4Gg}5AOVU z4is;Ht^KId)729swVH@s?tlvqgCrSclKet;y_8;eG&3H4j5GmPkfa1MChjcPsG%k? zpokMAey?A+ye#Km!=Ouw_9LEME&BP{iPcr@XeX)6FC^pn^y)U@X6MV%4PMSkKutQQ zrEtr`49uj(idtht@y5-irKLvjum%y*Ejj~M9GyZrUmKP|)sa+D;oCEFL1xwAABEd< z(GB&7GqH(<^r+rVr=C`Nnp%Qn6Xin(XGkj!KSp^UBuRxO$--UX(`(Pdyd+{^FNo=5 zu-v7jy}OBGo4_)XmS;Z(g2@UNSKY!%bep?-9GU#o5i;VJ#U%b$d8B_#mDt!evw<13 z>x;G+L08Q_QNjBAlr-0B{e?U&Myrn{NlVA45?hl12Hv&V1~xozMRFthU9V4C^JtGT zld{{dn~{-WsMpo=#s;G;I5^lRad>E)edUz3d~I2{tYt3dH&T-bx<6;WPWnt*<*cpd z3smS2rzS~DV$(SBI*-|`N|GXO)J$5F)a${d9JtML720ww(*9;tKHpRmM0wX7fi$C= zzPWxS89eVTXKghfi;>X#Gr9NW=w??R-O4*gx6X1FLVSWs$b{#=1iMQ8mh6hsTu%&E zF$IvL+Z46YO)_ABaYVO{!rieE`;hL5ISFc)j!J@}`4CSK)FHYZn*w^1g@tN@5lHFA zv1r8}yr|sR^ULS5YQA3k6m*){=~YRD%&Ez@K}lOr)q@<-ZE&Wov1I&>BirH$Z?u4` zK#wCg%zoXXqC&H>HX0KWo@sUbBI}ZnpONVLD{fna3qF0Tl(hC_!AySRLO^6Le&vF8 zkjXLUZ68ZF&wbowBSQ1xLW0E1U0IivGy)13lpti9YkKydmM6W*(by5T@$G(Z zC4jO8@s;)L=JQ132DHOgfW17v%xSlrZ7#yp;#x{ILPR z>(s6uycs%lt7~S#e!a=S@w(fFcbOOw2fD2k^@gL|q*>`O^Ya%_klQ0xTQe7-DM6H0 z4iz8kb6UqlTdRK?wih~_T#x;c4@@{99+{L&X1=o${Gty!rkGvQoS#Btf+z>|C+E@A znTb>oESgUK*(Dt%OxHRF1PLF2t?VF@u3yX<2pPGH1cVoLXy6t(UU=b!7hZVbg%@6U c;e}fK2N=AluQ#=4NdN!<07*qoM6N<$g6kDPnE(I) literal 0 HcmV?d00001 diff --git a/electron-vue-template/src/main/main.ts b/electron-vue-template/src/main/main.ts index b77ad9d..84f627a 100644 --- a/electron-vue-template/src/main/main.ts +++ b/electron-vue-template/src/main/main.ts @@ -217,12 +217,12 @@ function startSpringBoot() { openAppIfNotOpened(); } }, 15000); - } catch (error) { dialog.showErrorBox('启动异常', `无法启动应用: ${error}`); app.quit(); } } + startSpringBoot(); function stopSpringBoot() { if (!springProcess) return; @@ -362,7 +362,7 @@ app.whenReady().then(() => { // setTimeout(() => { // openAppIfNotOpened(); - // }, 2000); + // }, 100); app.on('activate', () => { if (mainWindow && !mainWindow.isDestroyed()) { diff --git a/electron-vue-template/src/renderer/App.vue b/electron-vue-template/src/renderer/App.vue index 4ceb0ac..3675586 100644 --- a/electron-vue-template/src/renderer/App.vue +++ b/electron-vue-template/src/renderer/App.vue @@ -19,6 +19,10 @@ import UpdateDialog from './components/common/UpdateDialog.vue' import SettingsDialog from './components/common/SettingsDialog.vue' import TrialExpiredDialog from './components/common/TrialExpiredDialog.vue' import AccountManager from './components/common/AccountManager.vue' +// 导入平台图标 +import rakutenIcon from '/icon/rakuten.png' +import amazonIcon from '/icon/amazon.png' +import zebraIcon from '/icon/zebra.png' const dashboardsMap: Record = { rakuten: RakutenDashboard, @@ -116,9 +120,9 @@ const currentVersion = ref('') // 菜单配置 - 复刻ERP客户端格式 const menuConfig = [ - {key: 'rakuten', name: 'Rakuten', index: 'rakuten', icon: 'R'}, - {key: 'amazon', name: 'Amazon', index: 'amazon', icon: 'A'}, - {key: 'zebra', name: 'Zebra', index: 'zebra', icon: 'Z'}, + {key: 'rakuten', name: 'Rakuten', index: 'rakuten', icon: 'R', iconImage: rakutenIcon}, + {key: 'amazon', name: 'Amazon', index: 'amazon', icon: 'A', iconImage: amazonIcon}, + {key: 'zebra', name: 'Zebra', index: 'zebra', icon: 'Z', iconImage: zebraIcon}, {key: 'shopee', name: 'Shopee', index: 'shopee', icon: 'S'}, ] @@ -589,9 +593,13 @@ onUnmounted(() => { :class="{ active: activeMenu === item.key }" @click="handleMenuSelect(item.key)" > - {{ item.icon }}{{ - item.name - }} + + + + + + {{ item.name }} + @@ -812,7 +820,6 @@ onUnmounted(() => { width: 90px; object-fit: contain; - background: #ffffff; } .menu-group-title { @@ -843,8 +850,8 @@ onUnmounted(() => { } .menu-item.active { - background: #ecf5ff !important; - color: #409EFF !important; + background: rgba(0, 0, 0, 0.1) !important; + /* color: #409EFF !important; */ } .menu-text { @@ -868,17 +875,10 @@ onUnmounted(() => { color: #fff; } -.menu-icon[data-k="rakuten"] { - background: #BF0000; -} - -.menu-icon[data-k="amazon"] { - background: #FF9900; - color: #1A1A1A; -} - -.menu-icon[data-k="zebra"] { - background: #34495e; +.menu-icon-img { + width: 100%; + height: 100%; + object-fit: contain; } .menu-icon[data-k="shopee"] { @@ -1003,7 +1003,7 @@ onUnmounted(() => { justify-content: space-between; padding: 10px 12px; box-sizing: border-box; - background: linear-gradient(90deg, #FFF7CC 0%, #FFEB80 100%); + background: #BAE0FF; box-shadow: 0 2px 8px rgba(255, 215, 0, 0.15); transition: all 0.3s ease; position: relative; @@ -1024,7 +1024,7 @@ onUnmounted(() => { .vip-status-card.vip-active, .vip-status-card.vip-normal, .vip-status-card.vip-warning { - background: linear-gradient(90deg, #FFF7CC 0%, #FFEB80 100%); + background: #BAE0FF; box-shadow: 0 2px 8px rgba(255, 215, 0, 0.15); } @@ -1046,15 +1046,16 @@ onUnmounted(() => { .vip-status-text { font-size: 13px; font-weight: 600; - color: #8B6914; + color: #001D66; text-align: left; letter-spacing: 0.3px; } .vip-expire-date { font-size: 10px; - color: #A67C00; + color: #001D66; line-height: 1.3; + text-align: left; opacity: 0.9; } diff --git a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue index 4e29a76..cd03b1b 100644 --- a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue +++ b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue @@ -270,10 +270,8 @@ async function openGenmaiSpirit() { genmaiLoading.value = true try { await systemApi.openGenmaiSpirit(selectedGenmaiAccountId.value) - showMessage('跟卖精灵正在启动,请稍候...', 'success') - setTimeout(() => { genmaiLoading.value = false }, 3000) - } catch (error: any) { - showMessage(error.message || '启动失败', 'error') + showMessage('跟卖精灵已打开', 'success') + } finally { genmaiLoading.value = false } } @@ -390,7 +388,7 @@ onMounted(async () => {
2
启动服务
-
请确保设备已安装Chrome浏览器,否则服务将无法启动。打开跟卖精灵将关闭Chrome浏览器进程。首次启动需初始化浏览器驱动,可能需要1-3分钟。
+
请确保设备已安装Chrome浏览器,否则服务将无法启动。打开跟卖精灵将关闭Chrome浏览器进程。
{ @click="openGenmaiSpirit" > 启动服务 - 启动中... + 启动中...
@@ -679,7 +677,7 @@ onMounted(async () => { .price { color: #e6a23c; font-weight: 600; } .table-loading { position: absolute; inset: 0; background: rgba(255, 255, 255, 0.95); display: flex; flex-direction: column; justify-content: center; align-items: center; font-size: 14px; color: #606266; } .spinner { font-size: 24px; animation: spin 1s linear infinite; margin-bottom: 8px; } -.action-buttons .spinner { font-size: 14px; margin-bottom: 0; display: inline-block; } +.inline-spinner { display: inline-block; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .pagination-fixed { flex-shrink: 0; padding: 8px 12px 0 12px; background: #fff; display: flex; justify-content: flex-end; } .pagination-fixed :deep(.el-pager li.is-active) { border: 1px solid #1677FF; border-radius: 4px; color: #1677FF; background: #fff; } @@ -696,4 +694,4 @@ onMounted(async () => { export default { name: 'AmazonDashboard', } - \ No newline at end of file + diff --git a/electron-vue-template/src/renderer/public/icon/amazon.png b/electron-vue-template/src/renderer/public/icon/amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5100c243901c6d3731c19f2d0681f18994d5ed7 GIT binary patch literal 1413 zcmV;01$z34P)N5z{|?NYdF&3*tN?Z}VgKRzV}*^l>mG8?5U9iaX27*VC=s6e^9U)6Js}IpUB2! z7uaDW*^um-OnKU+DMMg~c#OPbDzJ54C_$DXyf9^tdW;Ujd4(IV8nQ!l2o`6XJmYH; z9YCO2&nbu70RnOd;WaXff>Kt{uwAULyB8VN8;Z;2)|I zEkwe-BQH0UDc~p4rgEe32K978!2OOmL<>2GTUfc^D!yy^E9oH|!r|DraKm+iDiDZ} z0&%BrERP+-jc7CYx|TbHv4g_vd*=N|_XJ#GU5Ft$&bvg}@$-MExs^MRU31MMa`nVLBzyYcwxR zCj{a=lOdisK?SNKNwYZHtSItyWrBQq@x{Dn(O+N(=)>=d^K!-jtA!Pa>p^4?fqWW2fgAT7j}PW?Ap{br9|xe$y1=(6ij4oueiA?k4M3l*Rce;MK9&tv6I;7<}ENCkp zJ{I8yg-*1Cih2ec&T-v6(m1X=!d8Wc^r&Nij=*!F41T#LwX9=MI@k6*YbrNTsbf4y z{tLFNOW^nOcz#{Z3;bAz>-r48?}MeL>=Ufnxu!mlH%{rIC3@*ZEPR+yoeH0+&!h5r zO9HVtbTH?UGb->^@~qn%p{PInJT0X@+05==CI2txucg_%_M9n>z*oJ8OH#g%j-uYv zG(%AsD)QQdyelCOnHf94^1|KHU2o+cMfHvf>CL}lG@&Dps$8(^kcVX?pfqncd(aFD zt&}|J#Jm+$$dIncISD7QODJ5;Ur(3w-^N|8B*=hd?3d0O;g&qAL-|P!DSUoXK2nrA z{=mcJX})E-=t1N?OL}ZvQ6v!tCMOkYBk$t;bWC1#9Pf#P4Se?^&p*X?n#WD^d^8g$ zKfttK>Fvo&SnrdjO88dIYb&CnlrjB1X-kgM-twI;VuDA7{KDLj7d=d#=b>b7{h9tG z!BeZ-{Mw2+|McdQ#wsR8thWKjQC4VCe&~yMSQ6!T+kWE7OdNda^tzz zPW#HdRMnuKzLkDV{;lU5fZ79ikjR3lHPaHlXt(4crJPAo!P6N*_JjmFt3K7Yahttq zxsiz;V_ngC7r2Xyg=NZxZl>!;(9)D3+R+C*Z>hubCImcduJq>EX=UVgg~pjt7P1%I( T2d@je00000NkvXXu0mjf6B46L literal 0 HcmV?d00001 diff --git a/electron-vue-template/src/renderer/public/icon/icon.png b/electron-vue-template/src/renderer/public/icon/icon.png index c756ed46f6d8356de7c114bdea87c9cc76c13886..f94b10ce2817d46bbfaa37a1822fb4365a19ad29 100644 GIT binary patch literal 4666 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 literal 2399 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 Rt1AEi002ovPDHLkV1j(vY6$=U diff --git a/electron-vue-template/src/renderer/public/icon/rakuten.png b/electron-vue-template/src/renderer/public/icon/rakuten.png new file mode 100644 index 0000000000000000000000000000000000000000..3271000c1ce8213039e9544734524779fdb631d1 GIT binary patch literal 804 zcmV+<1Ka$GP)&*fEw7)ze zJ09ufK#^2J5z_+oY&AXU90UrF+ZsxogFt~&%d|frE##|MzVi11ou^zP{;^rn`UPQ< z3Pfr9U3t88*n}Sx5esyQ;S4;AVA#^7Nw$v|{iEOM@&$3_g?Of&wFmXJ7hQHmEQgDl zA8{RTm}Bo&BW!Sf?c_5$Pi z0R>V=&wcLlHG?%EA5tRPIz<1Y>3&37R^ zX_ou=OX%@5h+{43M-~#rllqZ``Jj{fk(Ke61|$4PViMm>EjGrF9_gN`eq^m!9py(; z<`zu}G}ezWVfxivyJJFrw7>{V_Jc;|M>k{qNUGg2d>Qvugom4gABEOPjK74hPtBzV i9301S9LI5-H^?*G4~u_X(doMY0000cK literal 0 HcmV?d00001 diff --git a/electron-vue-template/src/renderer/public/icon/zebra.png b/electron-vue-template/src/renderer/public/icon/zebra.png new file mode 100644 index 0000000000000000000000000000000000000000..53f0cd44819582d128258ad37b010acc577bd98b GIT binary patch literal 3294 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 literal 0 HcmV?d00001 diff --git a/erp_client_sb/pom.xml b/erp_client_sb/pom.xml index ffdaa17..b23a600 100644 --- a/erp_client_sb/pom.xml +++ b/erp_client_sb/pom.xml @@ -95,6 +95,11 @@ selenium-java 4.23.0 + + io.github.bonigarcia + webdrivermanager + 5.9.2 + diff --git a/erp_client_sb/src/main/java/com/tashow/erp/config/AsyncConfig.java b/erp_client_sb/src/main/java/com/tashow/erp/config/AsyncConfig.java deleted file mode 100644 index c6b5b9c..0000000 --- a/erp_client_sb/src/main/java/com/tashow/erp/config/AsyncConfig.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tashow.erp.config; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableAsync; - -@Configuration -@EnableAsync -public class AsyncConfig { -} - diff --git a/erp_client_sb/src/main/java/com/tashow/erp/config/ChromeDriverPreloader.java b/erp_client_sb/src/main/java/com/tashow/erp/config/ChromeDriverPreloader.java new file mode 100644 index 0000000..5d8b2a1 --- /dev/null +++ b/erp_client_sb/src/main/java/com/tashow/erp/config/ChromeDriverPreloader.java @@ -0,0 +1,58 @@ +package com.tashow.erp.config; + +import io.github.bonigarcia.wdm.WebDriverManager; +import lombok.extern.slf4j.Slf4j; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import java.net.URL; + +/** + * ChromeDriver预加载器 + * 在应用启动时后台下载ChromeDriver,避免用户首次使用时等待 + * 使用国内镜像源加速下载 + */ +@Slf4j +@Component +@Order(2) // 在DatabaseConfig之后运行 +public class ChromeDriverPreloader implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) { + // 使用后台线程执行,不阻塞应用启动 + Thread preloadThread = new Thread(() -> { + try { + log.info("开始预加载ChromeDriver驱动(使用国内镜像加速)..."); + + // 配置WebDriverManager使用国内镜像源 + WebDriverManager.chromedriver() + .driverRepositoryUrl(new URL("https://registry.npmmirror.com/-/binary/chromedriver/")) + .setup(); + + log.info("ChromeDriver驱动下载完成,开始验证..."); + + // 快速验证驱动可用性 + ChromeOptions options = new ChromeOptions(); + options.addArguments("--headless"); // 无头模式,不显示浏览器 + options.addArguments("--disable-gpu"); + options.addArguments("--no-sandbox"); + + ChromeDriver driver = new ChromeDriver(options); + driver.quit(); // 立即关闭 + + log.info("ChromeDriver驱动预加载成功"); + + } catch (Exception e) { + // 预加载失败不影响应用启动,第一次使用时会自动下载 + log.warn("ChromeDriver驱动预加载失败(不影响使用): {}", e.getMessage()); + } + }, "ChromeDriver-Preloader"); + + preloadThread.setDaemon(true); // 设置为守护线程 + preloadThread.start(); + } +} + diff --git a/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java b/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java index f3cc18a..c0d7d8f 100644 --- a/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java +++ b/erp_client_sb/src/main/java/com/tashow/erp/controller/SystemController.java @@ -84,9 +84,14 @@ public class SystemController { @PostMapping("/genmai/open") public JsonData openGenmaiWebsite(@RequestParam(required = false) Long accountId, HttpServletRequest request) { - String username = com.tashow.erp.utils.JwtUtil.getUsernameFromRequest(request); - genmaiService.openGenmaiWebsite(accountId, username); - return JsonData.buildSuccess("跟卖精灵正在启动"); + try { + String username = com.tashow.erp.utils.JwtUtil.getUsernameFromRequest(request); + genmaiService.openGenmaiWebsite(accountId, username); + return JsonData.buildSuccess("跟卖精灵已打开"); + } catch (Exception e) { + logger.error("打开跟卖精灵失败", e); + return JsonData.buildError(e.getMessage() != null ? e.getMessage() : "打开跟卖精灵失败"); + } } @GetMapping("/proxy/image") diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/ChromeDriverPreloader.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/ChromeDriverPreloader.java deleted file mode 100644 index 1eb9f7f..0000000 --- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/ChromeDriverPreloader.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tashow.erp.service.impl; -import jakarta.annotation.PostConstruct; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.chrome.ChromeOptions; -import org.springframework.stereotype.Component; - -@Component -public class ChromeDriverPreloader { - @PostConstruct - public void preloadDriver() { - new Thread(() -> { - try { - ChromeOptions options = new ChromeOptions(); - options.addArguments("--headless", "--disable-gpu"); - ChromeDriver driver = new ChromeDriver(options); - driver.quit(); - } catch (Exception ignored) {} - }).start(); - } -} - diff --git a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java index 5154ced..74a1c96 100644 --- a/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java +++ b/erp_client_sb/src/main/java/com/tashow/erp/service/impl/GenmaiServiceImpl.java @@ -2,14 +2,15 @@ package com.tashow.erp.service.impl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.qiniu.util.UrlUtils; +import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.net.URL; import java.util.List; import java.util.Map; @@ -20,27 +21,29 @@ public class GenmaiServiceImpl { private final RestTemplate restTemplate = new RestTemplate(); private final ObjectMapper objectMapper = new ObjectMapper(); - @Async - public void openGenmaiWebsite(Long accountId, String username) { - try { - String token = getAndValidateToken(accountId, username); - Runtime.getRuntime().exec("taskkill /f /im chrome.exe"); - Thread.sleep(1000); - - ChromeOptions options = new ChromeOptions(); - String systemUser = System.getProperty("user.name"); - char firstChar = systemUser.charAt(0); - char flipped = Character.isUpperCase(firstChar) ? Character.toLowerCase(firstChar) : Character.toUpperCase(firstChar); - String chromeUserData = System.getProperty("user.home") - .replace(systemUser, UrlUtils.urlEncode(flipped + systemUser.substring(1))) - + "\\AppData\\Local\\Google\\Chrome\\User Data"; - options.addArguments("user-data-dir=" + chromeUserData.toLowerCase(), "profile-directory=Default"); - - ChromeDriver driver = new ChromeDriver(options); - driver.get("https://www.genmaijl.com/#/profile"); - ((JavascriptExecutor) driver).executeScript("localStorage.setItem('token','" + token + "')"); - driver.navigate().refresh(); - } catch (Exception ignored) {} + public void openGenmaiWebsite(Long accountId, String username) throws Exception { + WebDriverManager.chromedriver() + .driverRepositoryUrl(new URL("https://registry.npmmirror.com/-/binary/chromedriver/")) + .setup(); + + String token = getAndValidateToken(accountId, username); + Runtime.getRuntime().exec("taskkill /f /im chrome.exe"); + Thread.sleep(1000); + + + ChromeOptions options = new ChromeOptions(); + String systemUser = System.getProperty("user.name"); + char firstChar = systemUser.charAt(0); + char flipped = Character.isUpperCase(firstChar) ? Character.toLowerCase(firstChar) : Character.toUpperCase(firstChar); + String chromeUserData = System.getProperty("user.home") + .replace(systemUser, UrlUtils.urlEncode(flipped + systemUser.substring(1))) + + "\\AppData\\Local\\Google\\Chrome\\User Data"; + options.addArguments("user-data-dir=" + chromeUserData.toLowerCase(), "profile-directory=Default"); + + ChromeDriver driver = new ChromeDriver(options); + driver.get("https://www.genmaijl.com/#/profile"); + ((JavascriptExecutor) driver).executeScript("localStorage.setItem('token','" + token + "')"); + driver.navigate().refresh(); } @SuppressWarnings("unchecked") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/RefreshToken.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RefreshToken.java new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RefreshToken.java @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RefreshTokenMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RefreshTokenMapper.java new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RefreshTokenMapper.java @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/RefreshTokenMapper.xml b/ruoyi-system/src/main/resources/mapper/system/RefreshTokenMapper.xml new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/RefreshTokenMapper.xml @@ -0,0 +1 @@ + \ No newline at end of file