From efa049c827282a392ad9e79b54e132088e2a925b Mon Sep 17 00:00:00 2001 From: AskaEth Date: Tue, 15 Sep 2026 00:53:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(platform):=20Console=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=20Linux(arm64)=EF=BC=8CWindows=20=E8=A1=8C=E4=B8=BA=E9=80=90?= =?UTF-8?q?=E5=AD=97=E4=B8=8D=E5=8F=98=EF=BC=9B=E7=89=88=E6=9C=AC=20dev=5F?= =?UTF-8?q?0.5.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 需求:让积分榜能在飞腾 D2000(ARM64)的 Linux 上跑起来,**同时不破坏 Windows**。 ## 一、Go 服务端:交叉编译即可(**已实测**) - SQLite 用的是 `modernc.org/sqlite`(纯 Go 驱动),全项目**没有一处 `import "C"`** → `CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build` 直接出; - 产物是**静态链接**(`ELF 64-bit LSB executable, ARM aarch64, statically linked`)→ **不依赖 glibc 版本**,对国产系统友好; - 本机(arm64)**实际启动验证**:数据目录、局域网地址探测、数据库迁移(0001/0002/0003)全部正常; - 产物:`debug/服务端-arm64/scoreboard`(29 MB,`-s -w`)。 ## 二、Console(Electron 宿主):平台差异收口到一个新文件 - **新增 `console/main/platform.js`**:平台差异集中在这 45 行里,其余代码不写平台判断。 ⚠️ **`platform` 参数缺省按 Windows 解析** —— 漏传参数走的就是改动前那条老路(这比"改了再小心"更保守:**默认行为不变,新行为必须显式传参**)。 - `userpaths.js` / `datadir.js`:Windows 分支 `%LOCALAPPDATA%\ScoreboardConsole\` **逐字保留**;Linux 分支按 XDG(`$XDG_DATA_HOME`,缺省 `~/.local/share`)。两平台各自的"拿不到用户目录"提示文案分开写(免得现场去设一个本平台不存在的环境变量)。 - `config.js`:服务端文件名按平台取(Windows `scoreboard.exe` / Linux `scoreboard`)。 - **新增 `console/main/autostart.js`**:Linux 用 `~/.config/autostart/*.desktop`(开=写文件、关=删文件;Linux 没有"已注册但未启用"这个中间态)。 - 托盘与窗口行为:Linux 的通知区多数不派发 double-click,因此按平台分支成单击。 ## 三、怎么保证没弄坏 Windows 1. **设计上**:平台差异集中 + 缺省值就是 Windows(见上); 2. **逐行核对 diff**:Windows 分支那几行原样未动; 3. **测试**:Console 由 **68 → 96 例**,新增全是平台分支用例,**既有断言一条没改**; 4. **真机验证**:构建机重打 Windows 包并跑(这一道才算收口)。 ## 四、自检 全量自检两轮**全绿、`EXIT=0`**:服务端 14 包 / 前端 **944 例** / Console **96 例**。 ## 版本 `dev_0.5.9` → **`dev_0.5.10`**;安装器素材同步重生成(照例只动 `brand.bmp` 两张)。 --- VERSION | 2 +- console/installer/art/1x/brand.bmp | Bin 316854 -> 316854 bytes console/installer/art/2x/brand.bmp | Bin 1267254 -> 1267254 bytes console/installer/art/version.txt | 2 +- console/main/autostart.js | 85 +++++++++++++++++++++++ console/main/autostart.test.js | 107 +++++++++++++++++++++++++++++ console/main/config.js | 32 +++++++-- console/main/config.test.js | 33 ++++++++- console/main/datadir.js | 43 ++++++++---- console/main/datadir.test.js | 81 ++++++++++++++++++++++ console/main/displays.js | 2 + console/main/index.js | 103 ++++++++++++++++++++++----- console/main/platform.js | 45 ++++++++++++ console/main/platform.test.js | 49 +++++++++++++ console/main/service.js | 3 +- console/main/tray-icon.js | 10 ++- console/main/userpaths.js | 56 ++++++++++----- console/main/userpaths.test.js | 68 ++++++++++++++++++ console/package.json | 2 +- 19 files changed, 665 insertions(+), 58 deletions(-) create mode 100644 console/main/autostart.js create mode 100644 console/main/autostart.test.js create mode 100644 console/main/platform.js create mode 100644 console/main/platform.test.js diff --git a/VERSION b/VERSION index d7e8679..a48bb21 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -dev_0.5.9 +dev_0.5.10 diff --git a/console/installer/art/1x/brand.bmp b/console/installer/art/1x/brand.bmp index e6105b1fb8f68bdd6e752ccc8669932e5405320b..8dd9d3ee3e2b683c7df17db2b1ceb92bf7200dd0 100644 GIT binary patch delta 682 zcmdnCT6o)P;SCZw(!N^!K;);5f&z2|fM~OE&Uz*lKWzaYO+GJm9&Zg^A59Q~EA~|7 z^j7B%&=uGm#wf-#S*CENa*)1AgsD`Bp;)+yM3}KSP^qsLACSy+(~7rN@Ydk=*WDb! zD8e-PP4P4>M>*!A0Mn_(5p%2JXO_pbrFi)32>5FA_vHliW&2MrjVcZ>@lxjs1X>Wo zD8Mv%PuUb5a~YsJ{B;C9)wrh=h39(dd#Q7KsB#wi8&56>b&_L@v5=ip6(4LM?61uS z)FsR`xxaFKOz_d+cLIuLFdHf@GbZSf#C zGBx!Y_<&;qXs44r%f$Q;Bxm}R2AM&e2{bX?73R$TR-n#HEfchW@e^zyn&PN7yD~1@ zLl@$^q5zXg`5}(7jM3)Opb#+>@dJiPPwO%!Eno-&W2iORV@YFLnzK4kJuuvXk<^zR z*pulytt7G}&=eZ(J*|>VlS{jLReq! delta 437 zcmdnCT6o)P;SCZwY<}7TK(yJ8(S&JoP~HR{UoCzh@=)b+SK$PT>M>20DV)gInf=Y<6cJeH ztd}}ZxQQf?w3lJ*NcC!nb#hZ-_tz2F>;+QOUpZM6Xg1KUKt16geUV5rsj0;g5F>y# z#Mexa@zW6mx&~jICtY1G_(nphTc13Kqhpvkf zd!fI{qK4EELs6&_b*9NoO})}y8oXg9k~7O={B;DqHF$uw0Zk0j7Y5k|cFg&f$r3=v z%&Le@v{Sa0V5kVS>dEqVSK)v=cYgb137}(gy$xoRMztim0o@v9E)6sct|Gq+>>*Dz z?q~~HpmTucL#5prwV5V6^-czbB``REUItnW(&xfx$TV4W!em5Lm@_p$oz(tx5+e{Z O0WtITr;}JNIspLv;C;ma diff --git a/console/installer/art/2x/brand.bmp b/console/installer/art/2x/brand.bmp index 95d5c5b0f0a6d960fb9af349ff810f56f2952aa3..e5a03f5166a9b8300982d1e417a9c9385d67b987 100644 GIT binary patch delta 1742 zcma)+OHfl+7{})x19=c2H=tGv)k2O zZ8;W`RNc?cz;6CRl~T2KZH`$f z;g>~~#Vs{<36@ozm4blaD8ZXzTz6OGgJw~R!KoLp%v0(#WwdFsf$~(n6`gQzggRrv zj`e^iGTx3o7WBj?FW&GO?GUi95Qnz%yz4#ZAI|r0-nx8$+I!V?#;%nnu5!Zud`1;h zHdC<(zz)NSFX#HczCQSH!T;^@=;Mz=o6DmQ=KCMr9JzbNWz$GG*K|29J^g8@GZ~w{ z7w-OO(2Dny>*0m&Myp!l(#sMvq*B1H{RS*!RZAHie93i|(k{Imj!(8%C!h<{~pcJ@NuZfyEizuB&lniV2X<#$=gHr1GTf9+NaOKG=T=S2t^7A zRVjtYk-t&(g+Ecve?84s^WYT{f3grU1=xstm#_biT8eS%Lt4h4$ zx4`vbqn3A_gSKTb@S0z5Rw{$<%l+n^$ked01m_eKA3$9t*281Aa*Imbs+X~+6y%J6 zb^k-1q~bqPBB}Aeu`2_drlDr-Ygm*Me3*a_Y1rKtmLCy-;YsY!#CCxevG#VW`<*wnoDMjVy625SMrswHSWz1nxK_?x96e5|{s5CL!^06aQbMELo4@od4;rRLAV-9N03?QP5~^%~Qm zyktzQn?6$_I`!SkmCrxyMNqca0;s8jM4eEOu8bzg#5hIQV;^WzFL;{<&TC%Ix>ti8 zQw0w%oAqe_jbH~#ther6o0^+T>@fv5nqTNiF(n5Mal~#>N{}PW_n4C$l|vAU5phGo zV8_LH#3%A5ekIS3u+b`_rD6>vQ;2}!HWQC%Nq(${2;+Tz;c-mV4+JZQ8Ui~4t66eW1xbFE8Ia_ug~w`QF}^ZEwpqxclp^B+Sq^c-&hnlL33Zx)?z*A^Z^BJQw?4~_D z*6@weQA+T^iArLOGW2p~o_sOd1WE4fBvRi^*YMbb?}QB5$Kl9GG^^qVy+x?p$z*et zy@cHPgVIFEC=2~%Y4K=b(Fpv->W}l?(}9X|jeyAT5*dHy_@9+*d~y649{zo6HCS5ZUi8d_UdsX`$!sWc!ENyU&Jv{$kbIKm(Lx?<6Hs z-2Mj(*CPe>TgwdKgV}UViy6JSXD9rYHxq5I?l;4N>MR8rmSpW7($OUJfj^KOC`m6( ziGjHos8ku-Ta}NV>m!Z-C9(6dBnvmgVUpw1`mi4xBDchVkdha@NwaE&|IA4y^2o~7oO^5cZo;VO zeHp4N-dPU8Pc9|uQYx*9_=!8aJ=cXrJq^|4Hieh_7lSTtb{Dze_H@FGnscitb=+rO z>GaIB*n-wf><4ZT84>1T2Cbt`6B!yIq+$d-@n>PTgu~E29=ntc&T9TXC8m%6OAl`{ nr+@}d0OUOehy~(+cz_QG03jd(#DD}y0HlBnNMv&g