fix: 数据目录移出安装目录,修掉「覆盖安装/卸载即丢数据」

根因:数据目录是 <安装目录>\data(config.yaml 的 dataDir 相对服务端工作目录),
而 electron-builder 的卸载器结尾执行 RMDir /r $INSTDIR,且覆盖安装会先跑旧卸载器
(installSection.nsh:52 的 uninstallOldVersion)→ 赛事库/规则/用户/审计/上传图片
连同安装目录被整个删除,再装新版。卸载一次同样如此。

- 服务端新增 -data <dir>(主命令、backup、passwd 三处),非空时覆盖 config.yaml 的
  dataDir;不传时行为完全不变(兼容便携/手工运行)
- Console 把数据指到当前用户目录 %LOCALAPPDATA%\ScoreboardConsole\data(卸载器不会碰
  这里;没有用 app.getPath('userData'),因为 %APPDATA%\<AppName> 正是被删的那个)
- 一次性迁移:目标为空且 <安装目录>\data 有数据时整体改名过去;两边都有数据时不动作
  只记警告;任何失败都保留原地数据、绝不删除
- passwd 也带 -data(否则重置的是安装目录下那个空库里的账号)
- deploy/backup.bat 指向同一数据目录
- 文档:部署指南新增「数据放在哪里(升级/卸载都不会删)」+ 备份/恢复/迁移路径改写,
  上线检查清单与使用手册同步

自检:服务端 12 包全绿;console 语法 14 文件 + datadir 单测 11/11;backup.bat 保持纯 ASCII。
This commit is contained in:
AskaEth committed 2026-09-10 09:17:56 +08:00
1 parent 6483acf9ad
commit 005b51b2ec
18 files changed
+626 -64

No files matched your search

+9 -9
View File
@@ -18,14 +18,13 @@ function validateAccountField(value, label, required) {
}
// 空的新用户名 / 空密码直接传空串:passwd 的语义就是「留空则不改 / 随机生成」
function buildPasswdArgs({ configArg, currentUsername, newUsername, password }) {
return [
'passwd',
'-config', configArg,
'-user', currentUsername,
'-new-username', newUsername,
'-password', password
]
// dataDir 非空时带上 -data,否则 passwd 会用 config.yaml 的默认目录、
// 改到另一个库里的账号上
function buildPasswdArgs({ configArg, dataDir, currentUsername, newUsername, password }) {
const args = ['passwd', '-config', configArg]
if (typeof dataDir === 'string' && dataDir !== '') args.push('-data', dataDir)
args.push('-user', currentUsername, '-new-username', newUsername, '-password', password)
return args
}
// passwd 正常是秒级完成;卡住(等待输入等)时必须自己收尾,否则 UI 重置按钮永久禁用
@@ -36,7 +35,8 @@ function runPasswd({ exePath, args, onOutput, timeoutMs = DEFAULT_TIMEOUT_MS })
return new Promise((resolve) => {
let child
try {
// cwd 取 exe 所在目录:config.yaml 与 data/ 都跟 exe 平级
// cwd 取 exe 所在目录:config.yaml 与 rules/ 都跟 exe 平级
// (数据目录由 -data 显式指定,不依赖 cwd)
child = spawn(exePath, args, {
cwd: path.dirname(exePath),
windowsHide: true,