# 工作区子页面 ## 页面行为 需要持续阅读、填写或确认的内容统一在工作区子页面中打开,不再使用带遮罩的居中弹框或侧边抽屉。子页面保留左侧导航和顶部工作区栏,正文使用稳定宽度、独立滚动区、固定标题与底部操作区;手机端沿用 52px 图标侧栏,正文占满剩余宽度。 标题左侧的返回按钮关闭当前子页面。`Esc` 只关闭最上层子页面;存在未保存内容时先打开“未保存的更改”确认页,选择继续编辑后保留草稿。嵌套流程按打开顺序叠放,例如从编辑页新建资产、查看影响范围后确认删除、从历史差异页确认恢复。关闭后焦点返回原入口。 确认和输入请求按队列逐页处理,当前页完成关闭后才显示下一页,重复点击不会操作下一项。确认页未处理完时忽略新的侧栏导航意图;退出登录或页面宿主卸载会取消尚未完成的请求。保存、导出或连接测试进行中时,相关编辑页禁止返回和取消,避免迟到结果写入已关闭的草稿。 以下交互均使用子页面: - 目标、网关、文件资产和连接资产的新建或编辑; - 连接示例、启动检查、连接测试、命令详情、版本信息和账号密码; - 资源搜索、菜单搜索、完整资源树、项目与环境维护、表格列设置; - 配置导出、导入预览、历史差异、模板内容和 Token 密钥; - 目标切换、测试账号选择、资产影响范围和所属项目; - 删除、停止、断开、同步冲突、SSH 指纹、未保存更改及密码输入等确认流程。 选择器下拉、操作菜单和悬停提示仍属于控件本身,不作为独立页面。成功、失败和进度消息仍使用短暂通知,不占用工作区导航层级。浏览器刷新或关闭时的未保存提醒继续使用浏览器原生机制。 ## 安全与兼容 页面迁移不改变 API、请求顺序、权限判断、校验、资源 ID、数据库结构或配置文件格式,不需要数据迁移。秘密查看仍按原定时器自动清理,关闭密码或 Token 页面立即清空内存值;确认页不持久化输入。运行中的网关、引用关系、历史恢复和同步冲突保护保持不变。 本次沿用应用现有的内存工作区导航,没有引入 Vue Router 或可持久化的页面历史。刷新浏览器仍回到应用原有默认工作区,未保存草稿不会写入地址或本地存储。 ## 验证 - `vue-tsc --noEmit` 通过。 - `node tests/page-dialogs.test.mjs` 的 2 项队列、输入校验和批量取消测试通过;`node tests/workspace-pages.test.mjs` 的源码禁止项检查通过。 - 静态检查确认 `web/src` 不再使用 `el-dialog`、`el-drawer`、`el-popover` 或 `ElMessageBox` 实现独立弹层。 - `npm.cmd --prefix web run build` 的类型检查阶段通过;Vite 在当前 Windows 沙箱启动 esbuild 时被 `spawn EPERM` 阻止,因此未生成新的前端产物。 - Vite 开发服务器同样在加载配置时被 `spawn EPERM` 阻止,本轮没有可用的本地预览 URL。 - Go 1.25.0、工作区内缓存/临时目录及串行编译下,`go vet ./...` 通过。`go test -p=1 ./... -count=1 -timeout=120s` 的其余包通过,但仍有 6 项既有 Windows 文件权限或 SQLite 快照环境失败,分布于 `cmd/linkport`、`internal/api`、`internal/desktop`、`internal/security` 和 `internal/store`;全量测试不记为通过。 - Playwright 在工作区临时目录下成功发现 56 个文件、125 项用例。因无法生成新前端和新嵌入式可执行文件,未运行浏览器套件,也未把发现测试或旧程序结果作为本次验收。 - 变更只涉及前端与文档,没有部署迁移、停止本地服务或修改 `data`。