6.6 KiB
6.6 KiB
总览
- 目标:将当前单文件
static/js/script.js的所有逻辑拆分为职责清晰的 ES Modules,并在不改变既有后端接口的前提下,优化交互与视觉表现,使界面更专业、易用。 - 范围:仅前端(HTML/CSS/JS),保持与后端
train_web_ui.py的 REST 接口兼容;可选提供后端小幅辅助(如 SSE)但不作为本次必须项。
现状拆解
- 导航与标签:
openTab、页面切换与进程/日志刷新(script.js:2–29, 23–29)。 - 训练类型联动与默认值:
train_type变更、分区显隐与各类型默认填充(script.js:32–154)。 - 轮询与请求:带超时/重试的
fetchWithTimeoutAndRetry(script.js:200–248),进程状态轮询startProcessPolling/checkProcessStatusChanges(script.js:182–199, 251–279)。 - 进程列表与项更新:
loadProcesses/updateProcessItem/addProcessItemToGroup(script.js:467–667, 357–465)。 - SwanLab:链接检测/打开(script.js:282–355)。
- 日志查看:进程日志自动刷新与容器滚动(script.js:669–788),日志文件列表/查看/删除(script.js:1126–1462)。
- 全局通知与确认:
showNotification/showConfirmDialog(script.js:790–885)。 - 训练表单提交:数据整形、模式分支、启动训练后切到“训练进程”(script.js:1052–1124)。
拆分方案(ES Modules)
- 采用原生 ES Modules,无需打包器;在
index.html将单一脚本替换为入口app.js(type="module"),其余模块按需 import。 - 目录结构(
static/js/):app.js:应用入口,初始化标签、轮询、首屏加载。services/apiClient.js:fetchWithTimeoutAndRetry与接口封装(getProcesses/getLogs/startTrain/stop/deleteProcess/getLogFiles/getLogFileContent/deleteLogFile)。ui/tabs.js:openTab与标签选中态管理、切换后触发对应加载。ui/notify.js:showNotification(success/error/info)。ui/dialog.js:showConfirmDialog/closeDialog。train/form.js:训练类型显隐与默认值、submit整形与发起训练;合并现有index.html内联 GPU 选择器联动。processes/list.js:loadProcesses、分组折叠/展开、updateProcessItem、状态 chip 与操作按钮逻辑(含 SwanLab)。processes/logs.js:进程日志区域展开/关闭、自动刷新定时器管理(logTimers)、refreshLog/loadLogContent。logfiles/list.js:日志文件分组、查看全文、删除项与分组高度更新。utils/dom.js:通用 dom/help 方法(qs/qsa/el/setVisible/setText等)。
- 现有函数到模块的映射:
openTab→ ui/tabs.js(script.js:2–29)。- 类型联动与默认值 → train/form.js(script.js:32–154, 1052–1124)。
fetchWithTimeoutAndRetry→ services/apiClient.js(script.js:200–248)。- 轮询相关 → processes/list.js(script.js:182–199, 251–279)。
- 进程项增/改/组折叠 → processes/list.js(script.js:357–667, 467–602)。
- SwanLab → processes/list.js + services(script.js:282–355)。
- 进程日志 → processes/logs.js(script.js:669–788)。
- 通知/确认 → ui/notify.js, ui/dialog.js(script.js:790–885)。
- 进程停止/删除 → processes/list.js + services(script.js:887–1050)。
- 日志文件列表/操作 → logfiles/list.js(script.js:1126–1462)。
加载与初始化
- 在
app.js:- 绑定 tab 切换,首屏激活“开始训练”。
- 初始化训练表单默认值与 GPU 选择器显隐。
- 启动进程状态轮询,只在“训练进程”栏激活;离开时清理定时器与日志定时器。
- 首次进入“训练进程”时触发
loadProcesses,进入“日志文件”触发loadLogFiles。
交互优化
- 表单
- 必填项校验与错误提示;失焦即时校验;数值范围与格式(学习率、小数、正整数)。
- 将“强化学习参数”块 Default 折叠,仅在选择 DPO/PPO 展开;提供字段级 tooltip(问号提示)。
- 训练命令预览:在提交前显示将要执行的命令(只读文本),便于核对。
- 记忆最近一次配置(localStorage),一键恢复。
- 进程列表
- 顶部筛选:按训练类型/状态过滤;关键字搜索(按时间/类型)。
- 操作区对齐与悬停提示;SwanLab 按钮仅在链接可用时亮显,否则显示“生成中”。
- 进程项采用更明显的层次:标题(时间)、副标题(类型),右侧状态 chip;按钮组固定顺序。
- 自适应展开动画与内容高度回流优化,减少抖动。
- 日志查看
- 自动滚动可开关(“跟随最新”开/关);复制按钮;加载失败重试入口。
- 大文件懒加载:初次只读尾部 N 行,支持“加载更多历史”。
视觉美化
- 主题变量:在
style.css顶部引入 CSS 变量(背景、主色、强调色、阴影、圆角),统一渐变与阴影。 - 表单栅格:更稳定的两列到单列响应式断点;标签与控件对齐;hint 文案灰度提升。
- 状态 chip:统一尺寸/色阶,添加图标(运行/停止/错误/完成)。
- 按钮规范:主次区分、禁用态与加载态;滚动条与日志容器对比度优化。
- Header 与 Tabs:粘性头部、Tab 选中态对比更明显;移动端竖排布局间距优化。
兼容性与无后端改动原则
- 保持与现有接口一致:
/train、/processes、/logs/:id、/stop/:id、/delete/:id、/logfiles、/logfile-content/:filename、/delete-logfile/:filename(见 train_web_ui.py)。 - 轮询频率保持 5s,可配置;进程日志刷新 1s,仅在“运行中”且展开时。
可选增强(后端协作,非必须)
- SSE/WS 实时日志:新增
/logs/stream/:id,前端以 EventSource/WS 订阅;减少轮询负载与延迟。 - 进程持久化与重启恢复优化:后端提供简易查询缓存 API,前端减少初始闪烁。
交付内容
- 新的 JS 模块文件(上述结构),
index.html改为type="module"入口加载;移除旧script.js引用。 - 更新后的
style.css(保留既有风格,加入变量与状态样式优化)。 - 无后端接口变更;提供 README 片段说明模块职责与使用(如需要)。
验收与回滚
- 功能对比清单:
- 单卡/多卡 Pretrain/SFT/LoRA/DPO/PPO 启动
- 进程列表与状态变更、SwanLab 链接打开
- 进程日志展开/自动刷新、日志文件列表/查看/删除
- 若出现问题,可通过
index.html切回旧script.js引用完成快速回滚。