人员与报名:
- 人员唯一标识改为「证件号 或 号码布」二选一(0013/0014 迁移 + 导入匹配/回填/冲突)
- 人员新增「年龄」(0015 迁移):表单/列表/导入模板表头 11 列;冲突比较只在两边
都有值且不同时才算差异,旧数据不误报
- 冲突决策键改为「证件号优先 → 号码布」(前端原先只用 idCard,号码布行会互相覆盖)
- 报名选择器支持无证件号但有号码布的运动员
大屏与 Console:
- 大屏控制新增「显示器」菜单:可给指定显示器重建全屏窗口;单屏/主显示器强制窗口化,
限制在 Console 侧判定,不信任页面传参
- Console 服务管理窗口改左右两栏,运行日志独占右栏满高;窗口默认尺寸 1280×860
- 大屏右上角时钟精确到秒(同时把刷新间隔 15s 改为 1s)
图片与配置:
- 新增图片上传 POST /api/uploads(recorder+,png/jpg/webp/gif,≤5MiB)与匿名静态
访问 GET /uploads/{name}(防目录穿越);文件落赛事项目目录 uploads/,随赛事包
一起导出/导入
- 「赛事信息」新增赛事会标 / 大屏会标 / 大屏背景图三个上传项
- 参赛单位 logo 输入框右侧加上传按钮
关于页与构建:
- 构建时间打通:version.BuildTime + /api/system/about 返回 + build.bat 注入
(用 PowerShell 取时间戳,避免本地化 %DATE% 的非 ASCII 星期)
安装包:
- 主程序改名 Scoreboard_Console.exe(win.executableName;productName/显示名不变)
- 记住上次安装目录:自定义 NSIS 宏优先沿用自存路径(卸载不清除),并在 customInit
里补写回 electron-builder 的键,避免安装模式页把 $INSTDIR 打回默认
自检:服务端 12 包全绿;前端 vue-tsc + build 通过、node --test 58/58;console 12 文件通过。
27 lines
1.3 KiB
JavaScript
27 lines
1.3 KiB
JavaScript
'use strict'
|
|
|
|
const { contextBridge, ipcRenderer } = require('electron')
|
|
|
|
// 服务端管理面板是 http://127.0.0.1 下的 Web 页面,只放行窗口与显示器控制这两组能力,
|
|
// 不把 ipcRenderer 交给页面,避免面板页面拿到主进程的任意通道
|
|
contextBridge.exposeInMainWorld('desktopShell', {
|
|
platform: process.platform,
|
|
minimize: () => ipcRenderer.invoke('window:minimize'),
|
|
maximize: () => ipcRenderer.invoke('window:maximize'),
|
|
close: () => ipcRenderer.invoke('window:close'),
|
|
isMaximized: () => ipcRenderer.invoke('window:is-maximized'),
|
|
onMaximizeChange: (callback) => {
|
|
const handler = (_event, maximized) => callback(maximized)
|
|
ipcRenderer.on('window:maximize-changed', handler)
|
|
return () => ipcRenderer.removeListener('window:maximize-changed', handler)
|
|
},
|
|
// 显示器菜单:列屏 / 按屏开窗 / 收窗 / 按设置重建。全屏放行与否由主进程判定,
|
|
// 这里只透传,页面拿不到 ipcRenderer 本身
|
|
displays: {
|
|
list: () => ipcRenderer.invoke('display:list'),
|
|
open: (displayId, options) => ipcRenderer.invoke('display:open', displayId, options),
|
|
close: (displayId) => ipcRenderer.invoke('display:close', displayId),
|
|
relayout: () => ipcRenderer.invoke('display:relayout')
|
|
}
|
|
})
|