7.3 KiB
7.3 KiB
前端专业化重构作业计划(持续进行中)
目标:在保持
static/old_version_backup/前端备份视觉与交互 100% 还原的前提下,完成基于 Vite + Vue 3 + Pinia 的组件化重写。本文为后续接手者提供当前进度与下一步任务拆解。
当前进展(2025‑11)
- 模板与逻辑彻底迁移:原
index.html + app.jsDOM/方法已全部拆到static/src/App.vue及 Pinia store/composables,static/src/app.ts仅保留少数兼容辅助。根 HTML 只负责挂载点、复制脚本与安全脚本。 - 全量 Pinia + 组合式 API:连接、会话、聊天、文件/聚焦、资源、工具、个性化、子智能体、UI 等状态均落在
static/src/stores/**,useLegacySocket、useMarkdownRenderer、useUploadStore、useEasterEgg等组合式函数负责跨模块逻辑。 - 全局壳层完成组件化:
AppShell.vue托管 ToastStack、ConfirmDialog、QuotaToast、EasterEggOverlay、ContextMenu;聊天区、输入区、Quick Menu、TokenDrawer、RightFocusPanel、PersonalizationDrawer、ActionBlock 系列全为独立组件。 - 样式模块化完结:
static/src/styles/以 base/layout/components/utilities 分层,npm run build输出static/dist/assets/main.css,static/style.css退化为对该文件的@import,旧版真值迁至static/old_version_backup/前端备份。 - 构建/依赖稳定:Vite 5 + Vue 3 + Pinia + Sass 作为唯一真值,
npm run build、npm run dev可直接产出最新 UI;KaTeX/Prism/Socket.IO 通过 npm/ESM 管理。
架构索引(按模块划分)
1. Store 分层(Pinia,已落地)
| Store | 数据来源(原 data 字段) | 关键方法/事件 |
|---|---|---|
useConnectionStore |
isConnected, socket, stopRequested |
initSocket, disconnect, Stop 按钮/事件处理 |
useSystemStore |
projectPath, agentVersion, thinkingMode |
fetchStatus, toggleThinkingMode |
useConversationStore |
conversations*, currentConversationId, currentConversationTitle, searchQuery, hasMoreConversations |
对话 CRUD、搜索、加载更多、路由同步 |
useChatStore |
messages, streamingMessage, expandedBlocks, thinkingScrollLocks, autoScrollEnabled, userScrolling |
消息渲染、滚动锁、append/modify/system 块渲染、socket 事件映射 |
useFileStore |
fileTree, expandedFolders, focusedFiles, contextMenu |
文件树加载、右键菜单、聚焦/下载等 |
useResourceStore |
tokenPanelCollapsed, currentContextTokens, currentConversationTokens, usageQuota, projectStorage, containerStatus, polling timer |
Token/Quota/Storage/容器轮询与渲染 |
useToolStore |
preparingTools, activeTools, toolActionIndex, toolStacks, toolSettings*, toolMenuOpen |
Quick Menu、工具禁用面板、流式工具卡片 |
useUiStore |
sidebarCollapsed, leftWidth, rightWidth, rightCollapsed, isResizing, panelMode, panelMenuOpen, settingsOpen, quickMenuOpen, toastQueue, confirmDialog, easterEgg |
面板布局、Toast/Confirm、彩蛋生命周期 |
usePersonalizationStore |
personalPageVisible, personalization*, tonePresets, newConsideration, draggedConsiderationIndex |
个人空间表单/拖拽/保存 |
useSubAgentStore |
subAgents, subAgentPollTimer |
子智能体轮询 |
源码位于
static/src/stores/,组合式函数位于static/src/composables/,如useLegacySocket.ts、useMarkdownRenderer.ts、useUploadStore.ts。
2. 组件切分(全部完成,可按需继续细分)
- 全局壳层:
AppShell.vue负责 ToastStack、ConfirmDialog、EasterEggOverlay、ContextMenu,内部 slot 负责主布局。 - 侧边栏:
ConversationSidebar.vue(对话列表 + 搜索 + 按钮)、ConversationList.vue、ConversationItem.vue。 - 三合一面板:
LeftPanel.vue(Logo 卡、模式切换)、PanelSwitcher.vue、FileTreePanel.vue(内含FileNode)、TodoPanel.vue、SubAgentPanel.vue。 - 聊天区域:
ChatArea.vue、MessageList.vue、MessageItem.vue、ActionBlock系列(thinking/text/tool/append/modify/system)。 - 输入区:
InputComposer.vue、QuickMenu.vue、ToolToggleMenu.vue、SettingsMenu.vue、UploadButton.vue。 - 右侧聚焦:
RightFocusPanel.vue、FocusedFileCard.vue、ScrollLockButton.vue。 - 资源/统计:
TokenDrawer.vue、ResourceStats.vue、UsageDashboard.vue。 - 个人空间:
PersonalizationDrawer.vue、TonePresetList.vue等。
所有组件均在 static/src/components/ 下维护。若新增模块,沿用同一拆分策略:先从壳层/侧栏等低耦合区域着手,再处理聊天与输入区,最终迁移全局遮罩和抽屉。
3. 逻辑剥离 & Composable(已落地)
- Socket 管理:
useLegacySocket()负责事件绑定/解绑并分发至 Pinia。 - 滚动/尺寸:
useAutoScroll()、useResizeHandles()等组合式函数维护滚动锁、面板拖拽。 - 彩蛋系统:
useEasterEgg()封装handleEasterEggPayload、startEasterEggEffect。 - 工具/Markdown:
useToolActions()、useMarkdownRenderer()解析工具栈、思考文本、代码块复制。
4. 样式模块化(已落地)
static/src/styles/以base/、layout/、components/、utilities/四层维护 SCSS,main.ts统一导入./styles/index.scss。npm run build输出static/dist/assets/main.css;static/style.css仅@import该文件以兼容旧 URL。- 旧版 CSS 仍保存在
static/old_version_backup/前端备份/style.css供视觉对照。
5. 验证清单
npm run build- 手动测试:
- 对话切换、搜索、加载更多
- Token/Quota 更新、Stop 按钮、思考块折叠
- Quick Menu:上传文件、工具禁用、模式切换、设置子菜单动作
- 聚焦面板联动、锁定滚动按钮
- 个人空间开启/保存/拖动
- 子智能体轮询与卡片展示
- 彩蛋触发与结束
- Append/Modify/System 块渲染 & 复制代码按钮
注意事项
- 保持与旧版一致的 API/Socket contract,不要修改后端接口。
- 所有按钮的
title/aria-label均需保留。 window.ensureCsrfToken、window.requestSocketToken、EasterEggRegistry等全局对象仍由后端注入,前端需防御其缺失。- 在组件化过程中,务必维持
state -> UI的单向数据流,避免在多个组件中直接 mutate 同一对象,可通过 store action 统一更改。
如需快速定位旧逻辑,可在
static/src/app.ts搜索原方法名称;拆分完成后再逐步删除未使用的段落,直至app.ts不再作为兼容入口。
后续关注
- 卫星页面重写:登录/注册/终端/资源忙碌等页面仍在
static/old_version_backup/,后续若需要统一体验,可按本文架构另建轻量 Vue 入口。 - 文件管理器现代化:
static/file_manager/仍为独立 HTML/JS,可先迁移 API 调用,再视情况接入 Pinia。 - 自动化验证:目前主要依靠手测,建议补充组件单测或端到端脚本覆盖 Quick Menu、上传、彩蛋等关键链路。
- 性能与可 observability:随着样式模块化完成,可继续引入 bundle 分析、监控指标,确保未来扩展更易诊断。