① 全屏作业看板自适应(用户反馈:全屏模式没有自适应,卡片挤在左上角) - 全屏看板按「可用宽 × 可用高」枚举 1..N 列,取**单卡面积最大且宽高比最接近 1.15** 的方案, 注入 `--board-cols`(不再靠 CSS auto-fit 猜);列数变了再量一次缩放系数, `transform-origin: top center` 保证整体居中、不溢出屏幕 - 两个全屏弹窗各自持有 ref(原来共用同名 ref,后挂载的会覆盖前一个,量到的是另一个弹窗); 列表型「单个科目全屏」补上 `transform: scale()`(该规则原先只作用于 `.board`,列表全屏从未缩放) - 弹窗 `@opened` 后轮询等待布局就绪(最多 20×60ms)再计算;窗口 resize 时自动重算; 另加一条全局 `.board-fullscreen .el-dialog__body` 兜底,保证内容区铺满整屏 - 实测:6 个科目 → 3 列、排版宽 1155px(视口 1187px)、可视底 678px(视口高 765px) ② 「灵动岛设置没办法生效」的真正原因:用户机器上的副本一直没被更新 - 学生端实际运行的是安装目录 `D:\class\@classhelperdesktop-client` 里的 `resources/app.asar`, 而 `pnpm dist:win` 只更新 `release/`;只发新版 release 不动安装目录,用户看到的还是旧界面 - 已就地覆盖升级该目录,并用同一套冒烟实测**那个副本**:`packaged: true`、76/76 全绿 - README 补充「把修复交付到已安装的客户端」步骤(robocopy 覆盖 + verify:packaged 实测) ③ 新增/加固自动化验证 - `verify:desktop` 新增「作业看板全屏自适应(铺满屏幕、内容不溢出)」:进作业页 → 切看板 → 打开全屏 → 断言排版宽铺满视口、可视底不超出屏幕;再把卡片补到 6 张触发 resize, 要求列数自动变多(1 → 3)且仍不溢出 - 点击/命中这类异步链路由"固定 sleep 后读一次"改为**轮询等待**(曾偶发误判为"点不开"), 失败时把渲染进程当前类名、窗口可见性、岛体矩形写进结论,便于区分真 bug 与竞态 - 新增 `pnpm verify:packaged`:对**打包后/已安装**的 EXE 跑同一套冒烟(含二次启动校验文件锁), 避免"开发产物全绿但交付给学生的 EXE 是旧的"这类问题 - 实测:`verify:desktop` 76/76(离线复跑 68/68);`verify:packaged` 对 `release/win-unpacked` 与 `D:\class\@classhelperdesktop-client` 均 76/76、`packaged: true`; `verify:e2e` 149/149(安装实例);`typecheck` / `lint` / `format:check` 全绿
50 lines
2.7 KiB
JSON
50 lines
2.7 KiB
JSON
{
|
|
"name": "class-helper",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "班级小助手 - 班级信息管理系统(Web 管理端 + 后端服务 + 桌面客户端)",
|
|
"packageManager": "pnpm@11.8.0",
|
|
"engines": {
|
|
"node": ">=20.19.0"
|
|
},
|
|
"scripts": {
|
|
"build:shared": "pnpm --filter @classhelper/shared build",
|
|
"dev": "pnpm build:shared && concurrently -k -n shared,server,web -c cyan,green,magenta \"pnpm --filter @classhelper/shared dev\" \"pnpm --filter @classhelper/server dev\" \"pnpm --filter @classhelper/web-admin dev\"",
|
|
"dev:server": "pnpm build:shared && pnpm --filter @classhelper/server dev",
|
|
"dev:web": "pnpm build:shared && pnpm --filter @classhelper/web-admin dev",
|
|
"dev:desktop": "pnpm build:shared && pnpm --filter @classhelper/desktop-client dev",
|
|
"build": "pnpm build:shared && pnpm --filter @classhelper/server build && pnpm --filter @classhelper/web-admin build && pnpm --filter @classhelper/desktop-client build",
|
|
"build:desktop": "pnpm build:shared && pnpm --filter @classhelper/desktop-client build",
|
|
"typecheck": "pnpm build:shared && pnpm -r --no-bail typecheck",
|
|
"lint": "eslint .",
|
|
"lint:fix": "eslint . --fix",
|
|
"format": "prettier --write \"**/*.{ts,js,mjs,cjs,vue,json,md,yaml,yml,css,scss,html}\"",
|
|
"format:check": "prettier --check \"**/*.{ts,js,mjs,cjs,vue,json,md,yaml,yml,css,scss,html}\"",
|
|
"db:generate": "pnpm --filter @classhelper/server db:generate",
|
|
"db:migrate": "pnpm --filter @classhelper/server db:migrate",
|
|
"db:seed": "pnpm --filter @classhelper/server db:seed",
|
|
"db:reset": "pnpm --filter @classhelper/server db:reset",
|
|
"db:studio": "pnpm --filter @classhelper/server db:studio",
|
|
"db:switch:mysql": "node scripts/use-database.mjs mysql",
|
|
"db:switch:sqlite": "node scripts/use-database.mjs sqlite",
|
|
"verify:e2e": "pnpm --filter @classhelper/server verify:e2e",
|
|
"verify:desktop": "pnpm --filter @classhelper/desktop-client smoke",
|
|
"verify:web": "node scripts/ui-smoke/run.mjs",
|
|
"verify:packaged": "node scripts/verify-packaged.mjs",
|
|
"icons": "node scripts/generate-icons.mjs",
|
|
"dist:win": "pnpm --filter @classhelper/desktop-client dist:win",
|
|
"dist:dir": "pnpm --filter @classhelper/desktop-client dist:dir",
|
|
"dist:server": "pnpm build:shared && pnpm --filter @classhelper/server build && pnpm --filter @classhelper/web-admin build && node scripts/dist-server.mjs",
|
|
"dist:all": "pnpm dist:server && pnpm dist:win"
|
|
},
|
|
"devDependencies": {
|
|
"concurrently": "^10.0.5",
|
|
"eslint": "^10.10.0",
|
|
"eslint-plugin-vue": "^10.11.0",
|
|
"prettier": "^3.9.6",
|
|
"typescript": "~5.9.3",
|
|
"typescript-eslint": "^8.70.0",
|
|
"vue-eslint-parser": "^10.4.1"
|
|
}
|
|
}
|