first commit

This commit is contained in:
douboer
2025-10-14 14:18:20 +08:00
commit d93bc02772
66 changed files with 21393 additions and 0 deletions

198
web/debug-ui.md Normal file
View File

@@ -0,0 +1,198 @@
# 调试指南
## 已实施的修复
### 修复1: 连接状态管理
- **问题**: 添加服务器时自动尝试连接并失败,导致状态为'error',无法再次连接
- **修复**: 修改 `newServer.ts``addServer` 函数,默认状态改为 'disconnected'
- **位置**: `web/src/stores/newServer.ts` 第 99 行
### 修复2: 连接失败处理
- **问题**: 连接失败后状态设置为'error',无法重试
- **修复**: 修改 `connectServer` 函数,失败时设置为 'disconnected' 而不是 'error'
- **位置**: `web/src/stores/newServer.ts` 第 170-174 行
### 修复3: 断开连接时保存状态
- **问题**: 断开连接后状态没有持久化
- **修复**: 在 `disconnectServer` 函数中添加 `saveServers()` 调用
- **位置**: `web/src/stores/newServer.ts` 第 190 行
### 修复4: 编辑按钮调试
- **问题**: 编辑按钮点击没有响应
- **修复**: 添加了详细的 console.log 调试信息
- **位置**: `web/src/components/MCPSettings.vue` 第 490-495 行
## 测试步骤
### 1. 测试编辑按钮功能
1. 打开浏览器: http://localhost:5173
2. 打开开发者工具 (F12 或 Cmd+Option+I)
3. 切换到 Console 标签
4. 点击任意服务器的"编辑"按钮
5. **预期输出**:
```
🔍 打开服务器详情: {id: "...", name: "...", ...}
✅ 详情页状态: true {id: "...", name: "...", ...}
```
6. **预期行为**: 应该弹出服务器详情对话框
**如果没有输出**:
- 检查按钮是否正确绑定了 `@click="openServerDetail(server)"`
- 检查是否有 JavaScript 错误
**如果有输出但没有弹窗**:
- 检查 `showServerDetail` 是否正确控制 modal 显示
- 检查 `MCPServerDetail` 组件的 props 绑定
### 2. 测试连接功能
#### 2.1 确保MCP服务器运行
```bash
# 在新终端运行HTTP服务器
cd /Users/gavin/xhs/mcp_client/xhsLoginMCP
node server.js
# 应该看到: HTTP MCP 服务器运行在 http://0.0.0.0:3100
```
#### 2.2 添加新服务器
1. 点击"添加服务器"按钮
2. 填写配置:
- **名称**: Test HTTP Server
- **URL**: http://localhost:3100/mcp
- **传输类型**: HTTP
3. 点击"确定"
4. **预期**: 服务器添加成功,状态为 "disconnected"(灰色点)
5. **检查控制台**: 应该看到 `🎯 服务器添加成功,状态: disconnected`
#### 2.3 测试连接
1. 找到刚添加的服务器卡片
2. 点击"连接"按钮
3. **检查控制台输出**:
```
🔌 开始连接服务器: server-id-xxx
📡 正在连接 Test HTTP Server (HTTP)...
✅ 连接成功: server-id-xxx
```
4. **预期行为**:
- 服务器状态变为 "connected"(绿色点)
- "连接"按钮变为"断开"按钮
- 可以看到服务器提供的工具列表
#### 2.4 测试断开连接
1. 点击"断开"按钮
2. **检查控制台输出**:
```
🔌 断开服务器连接: server-id-xxx
```
3. **预期行为**:
- 服务器状态变为 "disconnected"
- "断开"按钮变回"连接"按钮
#### 2.5 测试重新连接
1. 再次点击"连接"按钮
2. **预期**: 应该能够成功连接之前因为error状态无法重连
## 常见问题排查
### Q1: 点击编辑按钮完全没有反应
**排查步骤**:
1. 打开 Console看是否有任何错误
2. 检查是否有 `🔍 打开服务器详情` 日志
3. 如果没有日志,检查 Vue 组件是否正确渲染
4. 检查按钮的 `@click` 事件是否被其他元素遮挡
**可能原因**:
- JavaScript 错误导致事件处理器失效
- 按钮 DOM 事件被父元素阻止
- Vue 响应式系统问题
### Q2: 有日志输出但modal不显示
**排查步骤**:
1. 检查 `showServerDetail.value` 是否确实设置为 `true`
2. 在 Elements 标签中查找 `<n-modal>` 元素
3. 检查 modal 的 CSS 是否被覆盖z-index等
**解决方案**:
```vue
<!-- 检查 MCPServerDetail 组件的 v-model 绑定 -->
<MCPServerDetail
v-model:show="showServerDetail"
:server="editingServer"
/>
```
### Q3: 连接按钮始终不可用
**排查步骤**:
1. 检查服务器的 `status` 值
2. 查看连接按钮的条件渲染逻辑:
```vue
v-if="server.status !== 'connected' && server.status !== 'connecting'"
```
3. 如果状态是 'error',应该已经被修复为 'disconnected'
**验证修复**:
```javascript
// 在Console中执行
const store = useServerStore()
console.log(store.servers.map(s => ({ id: s.id, name: s.name, status: s.status })))
```
### Q4: 连接一直失败
**排查步骤**:
1. 确认MCP服务器确实在运行:
```bash
curl -X POST http://localhost:3100/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","clientInfo":{"name":"test","version":"1.0.0"}}}'
```
预期响应包含 `"result"` 字段
2. 检查浏览器控制台的Network标签
- 查看请求是否发送
- 查看响应状态码和内容
- 检查是否有CORS错误
3. 查看详细的连接日志:
```
📡 正在连接 xxx...
❌ 连接失败: Error message
```
## 验证清单
- [ ] 开发服务器运行在 http://localhost:5173
- [ ] MCP服务器运行在 http://localhost:3100
- [ ] 浏览器控制台打开并切换到 Console 标签
- [ ] 点击"编辑"按钮能看到调试日志
- [ ] 编辑按钮能正常打开详情对话框
- [ ] 添加服务器后状态为 "disconnected"
- [ ] 点击"连接"按钮能成功连接
- [ ] 连接后能看到工具列表
- [ ] 点击"断开"按钮能断开连接
- [ ] 断开后能再次连接
## 下一步调试
如果以上修复仍然不能解决问题,请在控制台执行以下代码并提供输出:
```javascript
// 检查Vue应用状态
const app = document.querySelector('#app').__vueParentComponent
console.log('Vue应用:', app)
// 检查服务器store状态
const { useServerStore } = await import('/src/stores/newServer.ts')
const store = useServerStore()
console.log('服务器列表:', store.servers)
console.log('连接状态:', store.servers.map(s => ({ name: s.name, status: s.status })))
// 检查响应式状态
console.log('showServerDetail:', showServerDetail?.value)
console.log('editingServer:', editingServer?.value)
```