diff --git a/MOBA_IMPLEMENTATION_STATUS.md b/MOBA_IMPLEMENTATION_STATUS.md new file mode 100644 index 0000000..4a3f577 --- /dev/null +++ b/MOBA_IMPLEMENTATION_STATUS.md @@ -0,0 +1,167 @@ +# MobaXterm 风格重构实施状态 + +## 已完成 ✅ + +### Phase 1: 基础架构 (100%) +- ✅ 安装依赖 @vueuse/core +- ✅ 创建类型定义 + - `frontend/src/types/sessionTree.ts` + - `frontend/src/types/workspace.ts` +- ✅ 实现 Pinia stores + - `frontend/src/stores/sessionTree.ts` + - `frontend/src/stores/workspace.ts` + +### Phase 2: 核心组件开发 (100%) +- ✅ `SplitPane.vue` - 可拖拽分割面板 +- ✅ `TopToolbar.vue` - 顶部工具栏(样式占位) +- ✅ `SessionTreeNode.vue` - 递归树节点组件 +- ✅ `SessionTree.vue` - 会话树主组件 +- ✅ `SftpPanel.vue` - SFTP 面板(props 驱动) +- ✅ `WorkspacePanel.vue` - 工作区面板 + +### Phase 4: 布局集成 (100%) +- ✅ `MobaLayout.vue` - 主布局 +- ✅ 路由配置更新 + - 新增 `/moba` 路由 + - 默认首页重定向到 `/moba` +- ✅ 构建测试通过 + +## 当前状态 + +### 可用功能 +1. **会话树管理** + - 创建文件夹 + - 展开/折叠文件夹 + - 点击连接打开工作区 + - localStorage 持久化 + +2. **工作区面板** + - 垂直分屏(终端 + SFTP) + - 可拖拽调整分割比例 + - 分割比例持久化 + +3. **终端集成** + - 复用现有 TerminalWidget + - 实时监控面板 + - WebSocket 连接 + +4. **SFTP 功能** + - 文件浏览 + - 上传/下载 + - 创建文件夹 + - 删除文件 + +### 访问方式 +- 新布局: http://localhost:5173/moba +- 旧布局: http://localhost:5173/connections (保留兼容) + +## 待实现 🚧 + +### Phase 3: 拖拽功能 (0%) +- ⏳ 实现 `useTreeDragDrop` composable +- ⏳ 在 SessionTreeNode 中集成拖拽 +- ⏳ 拖拽约束和验证 +- ⏳ 拖拽视觉反馈 + +### Phase 5: 数据迁移 (0%) +- ⏳ 从 connections 自动导入 +- ⏳ 迁移提示 UI +- ⏳ 新旧布局数据同步 + +### Phase 6: 优化完善 (0%) +- ⏳ 快捷键支持 +- ⏳ 右键菜单 +- ⏳ 搜索功能 +- ⏳ 响应式设计 +- ⏳ 性能优化 + +## 测试步骤 + +1. 启动后端服务 +```bash +cd backend +go run main.go +``` + +2. 启动前端服务 +```bash +cd frontend +npm run dev +``` + +3. 访问新布局 +``` +http://localhost:5173/moba +``` + +4. 测试功能 + - 点击"文件夹"按钮创建文件夹 + - 点击连接节点打开工作区 + - 拖拽分割条调整终端/SFTP 比例 + - 刷新页面验证状态持久化 + +## 已知问题 + +1. **拖拽功能未实现** + - 无法拖拽节点重新排序 + - 无法拖拽节点到文件夹 + +2. **会话树初始化** + - 首次使用时会自动从 connections 导入 + - 创建默认"我的连接"文件夹 + +3. **SFTP 功能简化** + - 移除了搜索和隐藏文件功能 + - 移除了远程传输功能 + - 上传进度显示简化 + +## 下一步计划 + +1. **立即实施 (Phase 3)** + - 实现拖拽功能,完成会话树的核心交互 + +2. **短期优化 (Phase 5-6)** + - 添加快捷键支持 + - 实现右键菜单 + - 添加搜索功能 + +3. **长期扩展** + - 多工作区支持 + - 会话模板 + - 云端同步 + +## 技术栈 + +- Vue 3.5.24 (Composition API) +- Pinia 3.0.4 (状态管理) +- Vue Router 5.0.2 (路由) +- Tailwind CSS 3.4.14 (样式) +- @vueuse/core (拖拽工具) +- xterm.js 5.3.0 (终端) +- lucide-vue-next (图标) + +## 文件结构 + +``` +frontend/src/ +├── types/ +│ ├── sessionTree.ts # 会话树类型定义 +│ └── workspace.ts # 工作区类型定义 +├── stores/ +│ ├── sessionTree.ts # 会话树状态管理 +│ └── workspace.ts # 工作区状态管理 +├── components/ +│ ├── SessionTree.vue # 会话树主组件 +│ ├── SessionTreeNode.vue # 树节点组件(递归) +│ ├── WorkspacePanel.vue # 工作区面板 +│ ├── SplitPane.vue # 分割面板 +│ ├── SftpPanel.vue # SFTP 面板 +│ └── TopToolbar.vue # 顶部工具栏 +└── layouts/ + └── MobaLayout.vue # MobaXterm 风格主布局 +``` + +--- + +**最后更新**: 2026-04-03 +**实施进度**: Phase 1-2 完成, Phase 4 完成, Phase 3/5/6 待实施 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e431ef8..9530bdf 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "@vueuse/core": "^14.2.1", "@xterm/addon-attach": "^0.12.0", "@xterm/addon-fit": "^0.10.0", "axios": "^1.13.4", @@ -1004,6 +1005,12 @@ "undici-types": "~7.16.0" } }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-vue": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.4.tgz", @@ -1245,6 +1252,44 @@ } } }, + "node_modules/@vueuse/core": { + "version": "14.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, "node_modules/@xterm/addon-attach": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@xterm/addon-attach/-/addon-attach-0.12.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5d5123c..c710fd6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ "preview": "vite preview" }, "dependencies": { + "@vueuse/core": "^14.2.1", "@xterm/addon-attach": "^0.12.0", "@xterm/addon-fit": "^0.10.0", "axios": "^1.13.4", diff --git a/frontend/src/components/SessionTree.vue b/frontend/src/components/SessionTree.vue new file mode 100644 index 0000000..2459504 --- /dev/null +++ b/frontend/src/components/SessionTree.vue @@ -0,0 +1,91 @@ + + + diff --git a/frontend/src/components/SessionTreeNode.vue b/frontend/src/components/SessionTreeNode.vue new file mode 100644 index 0000000..3d6b3e9 --- /dev/null +++ b/frontend/src/components/SessionTreeNode.vue @@ -0,0 +1,85 @@ + + + diff --git a/frontend/src/components/SftpPanel.vue b/frontend/src/components/SftpPanel.vue new file mode 100644 index 0000000..d98e5c5 --- /dev/null +++ b/frontend/src/components/SftpPanel.vue @@ -0,0 +1,315 @@ + + + diff --git a/frontend/src/components/SplitPane.vue b/frontend/src/components/SplitPane.vue new file mode 100644 index 0000000..f4ee57b --- /dev/null +++ b/frontend/src/components/SplitPane.vue @@ -0,0 +1,93 @@ + + + diff --git a/frontend/src/components/TerminalWidget.vue b/frontend/src/components/TerminalWidget.vue index d4515c2..fa42242 100644 --- a/frontend/src/components/TerminalWidget.vue +++ b/frontend/src/components/TerminalWidget.vue @@ -271,72 +271,59 @@ onUnmounted(() => { }) -