学生、任课关系、周次口径三处长期靠约定维持的事情,改为由数据模型保证。 学生不是账号 - 拆出独立 Student 表,没有 passwordHash / role / 任何登录字段 - 「学生不能登录」由表结构保证,不再靠「登录前判 role 再 403」的代码分支 - 三张个人数据表外键 userId → studentId;删掉 Enrollment 与 ClassTeacher - 学生一律称「学号」、教师一律称「工号」,「学生账号」这个概念消失 任课关系唯一来源 = Course(班级 + 科目 + 教师) - 班主任 = Class.teacherId,科任 = Course.teacherId,同一人两处指向同一账号、不重复建号 - 作业与成绩按科目再收一道:挂科目只由该科任课老师改,没挂科目归班主任 / 管理员 - 新增「任课教师分配」与「班级教师批量导入」(带「使用工号匹配」开关) 成绩与名单 - 成绩等级:百分制 / 等级制 A·B·C·D / 自定义,支持单个与批量改等级 - 按学号查成绩明细(教师端 + 班级端 + 设备令牌),受按班开关控制 - 调班 / 转出(单个与批量)+ 可查历史;学号不变、历史作业成绩留原归属 - 毕业归档页(按年度记录毕业班级 / 毕业生 / 转出学生 / 该届通知与作业) - 学年升级(未毕业不归档、数据沿用);班级称呼改为「2026级1班」 ClassHelper 班级端在线状态 - Web 端显示 班级 / 设备名 / 设备号 / 在线离线 / 最后在线 / 最后心跳 - lastHeartbeatAt 驱动 60 秒在线窗口,与只表示「带状态上报」的 lastSeenAt 分开 学期周次 - 新增 TermWeek(classId 空串 = 全校默认),管理员可用日期范围选择器逐周配置 - 一键按开学日期生成整学期;联网拉取调休建议(只给建议、不改数据,无外网失败属正常) - 改周次后随课表下发给教室的 ClassHelper 班级端 课表方向反转 - 主方向改为「服务端 → 教室」自动下发;教室不再自动回传 - 取教室课表改为手动动作(点击前弹警告),插件按待办标记在下一次心跳补报 改名 - 班级小助手 → ClassHelper:界面、窗口标题、托盘、灵动岛、EXE、安装包、 安装目录、systemd 描述、插件清单与设置页、官网、文档站、README BREAKING CHANGE: 产品名与 EXE 名变更(班级小助手.exe → ClassHelper.exe), 安装目录随之改变,不支持覆盖安装,需先卸载旧版。 服务端首次启动会自动应用 6 个数据库迁移(学生行按 id 原样搬迁,历史数据不丢), 升级前请先备份。
65 lines
2.8 KiB
YAML
65 lines
2.8 KiB
YAML
appId: com.classhelper.desktop
|
||
productName: ClassHelper
|
||
copyright: Copyright © 2026 Class Helper
|
||
|
||
# 语言包:Electron 发行版自带 55 个 `locales/*.pak`(实测 48.3MB 未压缩 / 约 10MB 压缩后),
|
||
# 而本应用界面文案只有中文,其余 54 个语言包纯属白占体积(`win-unpacked` 372MB → 约 324MB)。
|
||
# 这是 electron-builder 的官方选项:`app-builder-lib` 的 removeUnusedLanguagesIfNeeded()
|
||
# 会对 `locales/*.pak` 做精确匹配删除,只留 `zh-CN.pak`(0.6MB)。
|
||
#
|
||
# 注意:**不要**为了继续压体积去删 dxcompiler/vk_swiftshader/d3dcompiler_47 这些 GPU 回退组件,
|
||
# 或 LICENSES.chromium.html —— 前者是教室老显卡/虚拟机上的 D3D12/D3D11/Vulkan 渲染回退,
|
||
# 后者是 Chromium 的许可证声明,合计只能再省约 12MB,风险不成比例。
|
||
# 另外安装包有硬底:`ClassHelper.exe`(就是 electron.exe)压缩后本身就有 85~90MB,别再指望压到 60MB。
|
||
electronLanguages:
|
||
- zh-CN
|
||
|
||
directories:
|
||
# 这里的 output 只是 electron-builder 的兜底值:scripts/dist-win.mjs 会把它覆盖成
|
||
# releases/client/<版本>/(与服务端、插件同一约定)。直接手敲 electron-builder 才会落到这里。
|
||
output: release
|
||
buildResources: build
|
||
|
||
# 注意:这里**不要**加 afterPack 去改 appOutDir 的完整性标签。
|
||
# 归档内部的载荷标签不会被还原(装到正常位置拿到的是默认 Medium 文件),
|
||
# 而在打包前把 appOutDir 改成 Medium 会让 7za(自身带 Low 标签、进程被降到 Low)
|
||
# 因"不能向上读"而无法生成归档。交付物的标签统一在 scripts/dist-win.mjs 收尾时修正。
|
||
|
||
# 渲染进程产物已由 Vite 打包、主进程/preload 已由 esbuild 打包,
|
||
# 运行时不需要任何 node_modules(electron 模块由 Electron 运行时提供)。
|
||
files:
|
||
- dist/**/*
|
||
- package.json
|
||
- '!node_modules/**/*'
|
||
- '!**/*.map'
|
||
|
||
asar: true
|
||
# 没有原生模块,跳过 rebuild,避免不必要的 node-gyp 依赖
|
||
npmRebuild: false
|
||
compression: normal
|
||
removePackageScripts: true
|
||
|
||
win:
|
||
target:
|
||
- target: nsis
|
||
arch: [x64]
|
||
- target: portable
|
||
arch: [x64]
|
||
# 应用/安装包图标。**显式指定**而不是靠 electron-builder 的默认约定(默认找 build/icon.ico):
|
||
# 现在生效的是仓库根 build/classhelper.{ico,png}(设计导出、手工放入),
|
||
# 而 `pnpm icons` 那条 SVG 流水线只会重写 icon.*,两者不打架。
|
||
icon: build/classhelper.ico
|
||
artifactName: ${productName}-${version}-${arch}.${ext}
|
||
|
||
nsis:
|
||
oneClick: false
|
||
perMachine: false
|
||
allowToChangeInstallationDirectory: true
|
||
createDesktopShortcut: true
|
||
createStartMenuShortcut: true
|
||
shortcutName: ClassHelper
|
||
artifactName: ${productName}-${version}-${arch}-setup.${ext}
|
||
|
||
portable:
|
||
artifactName: ${productName}-${version}-${arch}-portable.${ext}
|