Appearance
模块:Workspace(工作台)
唯一职责:管理画布列表,提供画布的创建、删除、重命名和打开入口。
边界
属于本模块:
- 展示画布列表(按
updatedAt倒序) - 触发创建新画布,跳转到画布编辑器
- 触发删除画布(含确认对话框)
- 触发重命名画布
- 展示空状态提示
不属于本模块:
- 画布数据的持久化逻辑(由 State Management 模块负责)
- 画布内容的编辑(由 Canvas Editor 模块负责)
对外接口
Workspace 是顶层页面组件(路由 /),不对外暴露 API。仅通过 Vue Router 路由参数访问,无 props / emits。
消费的接口
| 依赖模块 | 调用的方法/属性 | 用途 |
|---|---|---|
| canvasStore | canvases | 读取画布列表 |
| canvasStore | loadAllCanvases() | 初始化加载 |
| canvasStore | createCanvas(name?) | 创建画布 |
| canvasStore | deleteCanvas(id) | 删除画布 |
| canvasStore | renameCanvas(id, name) | 重命名 |
| Vue Router | navigateTo('/canvas/:id') | 打开画布 |
不变量
- 画布列表始终按
updatedAt降序排列 - 删除操作必须经过用户确认
- 新建画布后立即跳转到编辑器页面
错误场景
| 场景 | 模块行为 | 调用方职责 |
|---|---|---|
loadAllCanvases() 读取 localStorage 失败(数据损坏/格式非法) | 返回空列表,不阻塞页面渲染 | 页面展示空状态 |
createCanvas() 时 localStorage 已满(QuotaExceededError) | 创建失败,抛出异常 | 页面捕获异常并显示 toast 提示用户清理空间 |
deleteCanvas(id) 传入不存在的 id | 静默忽略,不修改任何数据 | 无需处理 |
renameCanvas(id, name) 传入空字符串 | 不接受空名称,保持原名 | 输入层做前置校验 |
实现位置
| 角色 | 文件路径 |
|---|---|
| 页面 | apps/web/app/pages/index.vue |
| 卡片组件 | apps/web/app/components/CanvasCard.vue |
| 测试 | apps/web/test/nuxt/canvasStore.test.ts |