主应用:Task 任务页 UI/UX
1. 页面定义
| 项目 |
内容 |
| 页面名称 |
Task 任务管理 |
| 普通任务路由 |
/tasks |
| 定时任务子页 |
/tasks?tab=scheduled |
| 任务详情路由 |
/tasks/[taskId] |
| 页面实现 |
app-instance/frontend/app/(app)/tasks/page.tsx、app-instance/frontend/app/(app)/tasks/[taskId]/page.tsx |
| 关键组件 |
TaskManagementTabs、TaskLiveHeader、TaskTimeline、TaskTimelineCard、TaskSideRail、TaskAcceptanceControls |
| 核心任务 |
查看任务列表、进入任务详情、删除任务、管理定时任务、查看任务时间线、提交验收反馈 |
| 测试状态 |
已修复并复测通过;普通任务、定时任务、任务详情和缺省态在实测视口均无横向越界 |
2. 信息架构与组件层级
3. 布局与响应式规则
普通任务列表
- 页面外层使用
max-w-7xl 和响应式内边距。
< xl 视口显示任务卡片,不再显示宽表格;状态、来源、运行数、技能数、更新时间和操作全部在卡片内可见。
>= xl 视口显示完整表格,适合批量扫描和横向比较。
- 加载状态显示独立 loading card,不会在接口返回前误显示“暂无普通任务”。
- 删除任务前使用浏览器确认,取消后不改变列表,确认后从列表移除。
定时任务子页
< xl 视口显示定时任务卡片,避免将“历史、状态、操作”藏在内部横向滚动表格右侧。
>= xl 视口显示表格。
- 新建表单以内联卡片展示,包含任务名称、调度类型、调度参数、任务消息、来源会话说明、取消和创建。
- 定时任务删除前需要确认,降低误删风险。
- Switch、运行、删除、历史、刷新、新建等入口均有可访问名称和 44px 触控目标。
任务详情
TaskLiveHeader 为 sticky,固定在全局头部下方 65px,避免与全局 header 的边框重叠。
- 主内容在
xl 以下单列排列:时间线在前,侧栏在后。
xl 及以上使用 minmax(0,1fr) + 360px 双栏:左侧时间线,右侧状态和产物。
- 主列、侧栏、卡片和 JSON 区均使用
min-w-0、max-w-full 和受控换行,防止长 run id、session id、JSON 或产物标题撑破页面。
Details JSON 的 summary 命中高度为 44px,支持触控展开。
4. 操作与 UX 逻辑
| 操作 |
触发方式 |
状态变化与反馈 |
UX 目的 |
当前结果 |
| 切换普通/定时任务 |
点击 TaskManagementTabs |
URL 在 /tasks 与 /tasks?tab=scheduled 间切换,当前 tab 高亮 |
区分用户任务和自动触发任务 |
正常 |
| 普通任务进入详情 |
点击“进入任务 / Open task” |
跳转 /tasks/[taskId] |
查看时间线、运行过程和验收 |
正常 |
| 删除普通任务 |
点击删除按钮后确认 |
取消不变;确认后调用 DELETE /api/tasks/[id] 并移除行/卡片 |
防止误删,保持列表干净 |
正常 |
| 刷新定时任务 |
点击刷新 |
重新调用定时任务列表接口 |
获取最新调度状态 |
正常 |
| 新建定时任务 |
点击新建,填写表单并创建 |
提交 POST /api/cron/jobs,成功后收起表单并刷新列表 |
创建自动提醒入口 |
正常 |
| 切换定时任务启用 |
点击 Switch |
调用 toggle 接口,刷新列表 |
快速暂停/恢复自动任务 |
正常 |
| 立即运行定时任务 |
点击播放按钮 |
调用 run 接口,刷新列表 |
手动触发一次计划任务 |
正常 |
| 删除定时任务 |
点击删除按钮后确认 |
取消不变;确认后调用删除接口并刷新列表 |
防止误删自动任务 |
正常 |
| 返回任务列表 |
详情页点击 Back to tasks |
返回 /tasks |
提供明确退出路径 |
正常 |
| 返回对话 |
详情页点击 Chat |
返回 / |
回到任务来源工作台 |
正常 |
| 跳到验收区 |
点击 Review |
定位到当前结果验收卡片 |
减少长时间线中的查找成本 |
正常 |
| 展开 Details JSON |
点击 summary |
展开或收起 JSON 明细 |
为调试和审计保留细节 |
正常 |
| 提交修改意见 |
填写验收说明,点击 Needs revision |
调用 /api/chat/acceptance,提交 revise 和 comment |
将验收反馈记录到当前 run |
正常 |
| 下载产物 |
点击 Download |
对内联产物生成下载 |
获取任务输出 |
正常 |
| 任务不存在 |
访问缺失 task id |
显示“任务不存在”和返回任务列表 |
明确异常恢复路径 |
正常 |
5. 响应式测试矩阵
测试日期:2026-06-04。浏览器:Playwright Chromium。环境:本地生产构建 next build + next start 以及实际 terminaltest 实例;API 使用模拟数据,所有布局和交互在真实浏览器中执行。
| 页面 |
视口 |
横向越界 |
小触控目标 |
关键结论 |
| 普通任务 |
320×568 |
无 |
0 |
卡片信息完整,操作可见 |
| 普通任务 |
390×844 |
无 |
0 |
手机竖屏可直接进入和删除 |
| 普通任务 |
844×390 横屏 |
无 |
0 |
横屏不需要页面横向滚动 |
| 普通任务 |
768×1024 |
无 |
0 |
平板单列卡片正常 |
| 普通任务 |
1024×768 |
无 |
0 |
窄桌面单列卡片正常 |
| 普通任务 |
1365×900 |
无 |
0 |
宽屏表格正常 |
| 定时任务 |
390×844 |
无 |
0 |
定时任务卡片完整显示历史、状态和操作 |
| 任务详情 |
320×568 |
无 |
0 |
长 session id、JSON、验收区均未撑破页面 |
| 任务详情 |
390×844 |
无 |
0 |
sticky 头部避让全局头部 |
| 任务详情 |
768×1024 |
无 |
0 |
单列详情和侧栏顺序正常 |
| 任务详情 |
1365×900 |
无 |
0 |
双栏详情正常,侧栏产物可下载 |
关键量化证据
- 普通任务所有实测视口
scrollWidth === clientWidth。
- 定时任务
390×844 视口 scrollWidth === clientWidth。
- 任务详情
320×568、390×844、768×1024、1365×900 均无页面级横向越界。
- 任务详情 sticky 头部实测
globalBottom=65、taskTop=65、overlapsGlobal=false。
- 最终复测中所有检查视口可见小触控目标数为
0。
- 部署到
terminaltest 后,同一套 Task QA 自动化用例 14 passed。
6. 已修复问题
| 等级 |
问题 |
修复 |
| P1 |
普通任务和定时任务在手机端只露出表格左侧,核心操作藏在内部横向滚动区 |
< xl 改为卡片布局,宽屏保留表格 |
| P1 |
任务详情在 320px 和 390px 被时间线内容撑到约 626px,产生页面级横向越界 |
主列、卡片、侧栏加入 min-w-0/max-w-full,控制长文本和 JSON |
| P1 |
任务详情 sticky 头部滚动后与全局固定头部重叠 |
sticky top 改为 65px,避让全局 header 和边框 |
| P1 |
React Strict Mode 下任务详情 mountedRef 清理后不恢复,详情可能停留在“任务不存在/加载中” |
effect 挂载时重置 mountedRef.current = true |
| P2 |
定时任务删除无确认 |
删除前增加确认弹窗 |
| P2 |
定时任务播放/删除图标按钮无可访问名称且目标偏小 |
补充 aria-label/title,扩大到 44px |
| P2 |
tabs、summary、switch 等控件命中高度不足 44px |
统一提高到 44px 触控目标 |
| P2 |
普通任务首次加载可能误显示空状态 |
增加 loading 状态 |
7. 剩余观察项
- 本轮自动化使用模拟 API 数据验证布局和交互;真实后端数据的极端状态仍需在后续页面联测中持续观察。
- Playwright 报告中存在一次 404 控制台日志,来源为浏览器资源请求,不影响 Task 页面核心 API 与交互。