5.0 KiB
5.0 KiB
前端重构续办说明(next_steps_4)
承接
next_steps_3,本阶段工作完成了“第二阶段:业务面板与个性化”的全部目标,并准备进入“第三阶段:全局壳层与 Socket/Overlay 拆解”。下文总结当前状态、仍需处理的事项及建议顺序,供下一位开发者参考。若与legacy_ui_spec.md有冲突,请以规范文档为准。
阶段成果回顾
-
文件/待办/右键菜单
- 新增
useFileStore托管fileTree/expandedFolders/todoList与右键菜单;文件树更新、右键定位、下载入口、TODO Socket 事件均通过 store 维护,LeftPanel与FileNode直接消费 store 状态。 - 上传/下载触发链路保留在
app.ts,但右键显示/隐藏、目录展开逻辑已与模板解耦。
- 新增
-
聚焦面板
- 新增
useFocusStore负责/api/focused拉取与focused_files_updateSocket 事件,FocusPanel直接订阅 Pinia 状态;聚焦变化时的 Token 刷新仍由resourceStore完成。
- 新增
-
子智能体
- 新增
useSubAgentStore托管列表数据与轮询;LeftPanel切换到 store action,App 仅在 mounted/unmounted 时启动/停止 Polling,并在切换到子智能体面板时触发拉取。
- 新增
-
个性化/个人空间
- 新增
usePersonalizationStore,封装整个 Drawer 的状态、表单、拖拽、保存/启停与登出逻辑;PersonalizationDrawer由 store 驱动,App 只负责打开入口和上传/Socket 相关联动。
- 新增
-
App.vue/App.ts 解耦
- 删除了原有的
fileTree/focusedFiles/todoList/subAgents/personalizationdata 字段、方法与 watchers,将布局中对应 props/事件精简为 store 驱动。
- 删除了原有的
当前状态
- 第一阶段(聊天/输入域):全部子任务已完成(状态迁移、Action 组件化、动作按钮 store 化、append/modify payload 渲染),请以
doc/frontend/next_steps_3.md为参考。 - 第二阶段(业务面板/个性化):三个模块均完成 Pinia 化;
app.ts中已无业务状态,仅保留连接、聊天和工具相关逻辑。 - 第三阶段(待启动):App 仍承载 Socket 管理、Toast/Confirm/Overlay/EasterEgg 等壳层逻辑;
app.ts依旧超出推荐体量,需要继续拆解。
下一步建议(第三阶段)
-
Socket 与跨模块事件
- 抽象
useLegacySocket()或类似 composable,将所有socket.on/emit管理集中到独立模块,通过事件总线或 store action 分发。目标:app.ts仅负责初始化 & 注入依赖。 - 结合
useResourceStore/useChatStore/useFileStore等 store,统一处理token_update、todo_updated、focused_files_update等事件,避免重复逻辑。
- 抽象
-
全局壳层
- 拆分 ToastStack、ConfirmDialog、QuotaToast、EasterEggOverlay、ContextMenu 等通用 UI,创建
AppShell.vue或多个全局组件,使用 store/composable 提供状态(如useUiStore新增 toast/confirm/easterEgg slice)。 - 移除
app.ts中的 DOM 事件监听(click/scroll/keydown)与手动document.body操作,改为组件级的事件绑定或onMountedcomposable。
- 拆分 ToastStack、ConfirmDialog、QuotaToast、EasterEggOverlay、ContextMenu 等通用 UI,创建
-
输入/上传/工具联动
- 虽已存在
useUploadStore,但上传流程、Quick Menu 与工具禁用仍在app.ts;推荐将上传动作(uploadSelectedFile、toast 管理、错误文案)迁至新 composable/stores,并为 Quick Menu 建立独立模块。
- 虽已存在
-
样式与可维护性
- 当前仍使用旧版 CSS,大量样式依赖
static/style.css。第三阶段完成后,可按组件拆分 SCSS 或 CSS Modules(长期目标),确保legacy风格可控。
- 当前仍使用旧版 CSS,大量样式依赖
风险与注意事项
- Socket 兼容:拆分过程中确保所有
socket.emit与socket.on名称、顺序保持与后端契约一致;必要时在 composable 中集中打印日志便于调试。 - Store 循环依赖:多个 store 之间会互相引用(如子智能体依赖 UI store 的
panelMode);拆分时注意封装结构,避免在 store 初始化阶段互相 import 产生循环。 - 右键菜单/下载:现阶段下载操作仍在
app.ts中调用downloadResource,但 contextMenu 状态来自useFileStore;迁移时要保留legacy_ui_spec里要求的按钮标题与行为。 - 个性化:
usePersonalizationStore目前直接调用fetch;后续若新增 API 校验或需要与其他 store 联动,可考虑抽象 API 层,保持请求可 Mock。
推荐实施顺序
- 重构 Socket 管理(建立 composable + 事件分发)。
- 拆出 AppShell/Toast/Confirm/EasterEgg 组件,与
useUiStore整合。 - 将上传/Quick Menu/工具禁用逻辑移入专用 store/composable。
- 在 store/composable 稳定后,继续拆分
style.css,并补充端到端验证脚本或自动化测试(例如聚焦文件/子智能体/Todo socket 事件回放)。
完成第三阶段后,
app.ts应仅承担框架级入口(createApp、Pinia 注册、Shell 布局),所有业务状态通过 store + 组件组合而成。请持续参考legacy_ui_spec.md,确保视觉与交互严格一致。