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

353
web/BLANK_PAGE_FIX.md Normal file
View File

@@ -0,0 +1,353 @@
# 🔧 编辑按钮空白页面修复报告
## 问题描述
点击 MCP 服务器的"编辑"按钮后,弹出对话框但显示空白页面。
## 已实施的修复
### 修复 1: Modal 样式优化
**文件**: `web/src/components/MCPSettings.vue` (Line 289-308)
**问题**: Modal 和 Card 的尺寸设置不当,导致内容无法正常显示
**修复内容**:
```vue
<!-- 修复后 -->
<n-modal
v-model:show="showServerDetail"
:style="{ padding: 0 }"
transform-origin="center"
>
<n-card
style="width: 90vw; max-width: 1200px; max-height: 90vh; overflow: auto;"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<MCPServerDetail ... />
</n-card>
</n-modal>
```
**关键改进**:
- 使用 `90vw``90vh` 确保响应式尺寸
- 添加 `max-height``overflow: auto` 处理内容溢出
- 移除了 modal 上的多余样式配置
### 修复 2: 组件高度调整
**文件**: `web/src/components/MCPServerDetail.vue` (Line 536)
**问题**: 组件使用 `height: 100%` 但父容器没有明确高度,导致高度为 0
**修复内容**:
```css
/* 修复前 */
.mcp-server-detail {
height: 100%; /* ❌ 父容器高度不确定 */
display: flex;
flex-direction: column;
}
/* 修复后 */
.mcp-server-detail {
min-height: 500px; /* ✅ 确保最小可见高度 */
display: flex;
flex-direction: column;
}
```
### 修复 3: 增强调试日志
**文件**: `web/src/components/MCPServerDetail.vue`
添加了详细的生命周期和数据更新日志:
```typescript
// 组件加载时
console.log('🎯 MCPServerDetail 组件加载')
console.log('📦 接收到的 server prop:', props.server)
// 数据监听时
watch(() => props.server, (newServer) => {
console.log('👀 MCPServerDetail watch 触发, newServer:', newServer)
if (newServer) {
updateFormData(newServer)
console.log('✅ 表单数据已更新:', formData)
}
})
// 更新表单数据时
const updateFormData = (server: MCPServerConfig) => {
console.log('📝 更新表单数据:', server)
// ... 数据更新
console.log('✅ formData 更新完成:', formData)
}
```
## 测试指南
### 环境准备
```bash
cd /Users/gavin/xhs/mcp_client/mcp-client-vue/web
npm run dev
```
确保开发服务器运行在 http://localhost:5173
### 测试步骤
#### 1. 刷新页面
强制刷新浏览器以加载最新代码:
- Mac: `Cmd + Shift + R`
- Windows/Linux: `Ctrl + Shift + R`
#### 2. 打开开发者工具
- Mac: `Cmd + Option + I`
- Windows/Linux: `F12`
- 切换到 **Console** 标签
#### 3. 点击编辑按钮
在 MCP 设置页面,找到任意服务器卡片,点击"编辑"按钮
#### 4. 观察结果
**✅ 成功的表现**:
1. Modal 对话框弹出
2. 可以看到服务器详情表单
3. 有 4 个标签页: 通用、工具、提示词、资源
4. 控制台显示完整日志序列
**📝 预期控制台日志**:
```
🔍 [1] 打开服务器详情被调用
🔍 [2] 服务器数据: {id: "xxx", name: "test", ...}
🔍 [3] 当前 showServerDetail 值: false
🔍 [4] editingServer 设置完成: {...}
✅ [5] showServerDetail 设置为 true
✅ [6] 最终状态检查 - showServerDetail: true editingServer: {...}
🎯 MCPServerDetail 组件加载
📦 接收到的 server prop: {...}
👀 MCPServerDetail watch 触发, newServer: {...}
📝 更新表单数据: {...}
✅ formData 更新完成: {...}
```
## 问题排查
### 场景 A: Modal 弹出但空白
**诊断步骤**:
1. 打开 Elements 标签
2. 搜索 `mcp-server-detail`
3. 检查该元素是否存在
4. 查看元素的 computed styles
**在控制台执行诊断**:
```javascript
const detail = document.querySelector('.mcp-server-detail')
if (detail) {
console.log('元素存在:', detail)
console.log('尺寸:', detail.getBoundingClientRect())
console.log('样式:', {
display: window.getComputedStyle(detail).display,
minHeight: window.getComputedStyle(detail).minHeight,
height: window.getComputedStyle(detail).height,
visibility: window.getComputedStyle(detail).visibility
})
} else {
console.error('元素不存在!')
}
```
**可能原因**:
- CSS 高度为 0
- display: none
- visibility: hidden
- z-index 被覆盖
**临时解决方案**:
```javascript
const detail = document.querySelector('.mcp-server-detail')
if (detail) {
detail.style.minHeight = '600px'
detail.style.display = 'flex'
detail.style.visibility = 'visible'
console.log('✅ 强制显示成功')
}
```
### 场景 B: 看不到组件加载日志
**意味着**: MCPServerDetail 组件没有被实例化
**检查项**:
1. editingServer 的值是否为 null/undefined
2. v-if="editingServer" 条件是否满足
3. 组件导入是否正确
4. 是否有 Vue 编译错误
**控制台检查**:
```javascript
// 查看 Vue 实例状态
const app = document.querySelector('#app').__vueParentComponent
console.log('editingServer:', app?.setupState?.editingServer)
console.log('showServerDetail:', app?.setupState?.showServerDetail)
```
### 场景 C: Modal 根本没弹出
**检查步骤**:
1. 控制台是否有 "showServerDetail 设置为 true" 日志
2. Elements 标签搜索 `n-modal`
3. 检查 modal 的 display 和 opacity
**可能原因**:
- showServerDetail 值没有变化
- Modal 组件渲染失败
- z-index 太低被遮挡
## 诊断工具
### 方法 1: 使用诊断页面
访问: http://localhost:5173/blank-page-debug.html
提供:
- 完整的测试步骤清单
- 常见问题解决方案
- 快速诊断脚本
- 问题报告模板
### 方法 2: 全面诊断脚本
在浏览器控制台执行:
```javascript
console.log('=== MCP Modal 诊断 ===')
// 1. Modal 元素
const modals = document.querySelectorAll('.n-modal')
console.log('1⃣ Modal 数量:', modals.length)
modals.forEach((m, i) => {
const styles = window.getComputedStyle(m)
console.log(` Modal ${i}:`, {
display: styles.display,
opacity: styles.opacity,
zIndex: styles.zIndex
})
})
// 2. Card 元素
const cards = document.querySelectorAll('.n-card')
console.log('2⃣ Card 数量:', cards.length)
// 3. MCPServerDetail
const detail = document.querySelector('.mcp-server-detail')
console.log('3⃣ Detail 组件:', detail ? '✅ 存在' : '❌ 不存在')
if (detail) {
const rect = detail.getBoundingClientRect()
const styles = window.getComputedStyle(detail)
console.log(' 尺寸:', rect)
console.log(' 样式:', {
display: styles.display,
minHeight: styles.minHeight,
height: styles.height,
visibility: styles.visibility
})
}
// 4. Tabs
const tabs = document.querySelectorAll('.n-tabs')
console.log('4⃣ Tabs 数量:', tabs.length)
console.log('=== 诊断完成 ===')
```
## 验证清单
在报告问题前,请确认:
- [ ] 开发服务器运行正常 (http://localhost:5173)
- [ ] 页面已强制刷新 (Cmd+Shift+R)
- [ ] 浏览器开发者工具已打开
- [ ] Console 标签已选中
- [ ] 点击编辑按钮能看到日志输出
- [ ] 运行了诊断脚本
- [ ] 检查了 Elements 标签中的 DOM 结构
- [ ] 确认没有 JavaScript 错误
## 如何报告问题
如果修复后仍有问题,请提供:
### 1. 控制台截图
包含:
- 所有相关日志(从 🔍 [1] 到最后)
- 任何红色错误信息
- 诊断脚本的输出
### 2. Elements 标签信息
- 搜索 "mcp-server-detail" 的结果截图
- 该元素的 Computed 样式截图
### 3. 环境信息
- 浏览器类型和版本
- 操作系统
- 是否使用了浏览器扩展
### 4. 具体现象
- Modal 是否弹出?
- 是否完全空白还是部分内容可见?
- 控制台有哪些日志?
## 相关文件
- `web/src/components/MCPSettings.vue` - Modal 配置
- `web/src/components/MCPServerDetail.vue` - 详情页面组件
- `web/public/blank-page-debug.html` - 调试辅助页面
- `web/MODAL_FIX_GUIDE.md` - 之前的修复指南
- `web/TYPESCRIPT_FIXES.md` - TypeScript 类型问题
## 技术细节
### Naive UI Modal 注意事项
1. **尺寸单位**
- 推荐使用 vw/vh 而不是百分比
- 确保有 max-width/max-height 限制
2. **内容容器**
- 需要 n-card 或其他容器包装
- 容器需要明确的尺寸设置
3. **高度问题**
- 避免使用 height: 100% 除非父容器有明确高度
- 使用 min-height 确保最小可见高度
- 使用 max-height + overflow 处理内容过长
### Vue 响应式调试
```javascript
// 检查响应式状态
import { toRaw } from 'vue'
console.log('原始值:', toRaw(editingServer.value))
// 检查 ref 是否正确
console.log('是否为 ref:', typeof editingServer.value)
```
## 修复状态
✅ Modal 样式优化完成
✅ 组件高度问题修复完成
✅ 调试日志增强完成
✅ 诊断工具创建完成
✅ 开发服务器运行正常
🔄 **待确认**: 请按照测试指南验证修复效果
## 下一步
1. **刷新页面** - 强制刷新加载最新代码
2. **测试功能** - 点击编辑按钮
3. **查看日志** - 确认控制台输出完整
4. **报告结果** - 告诉我是否成功或提供诊断信息
祝测试顺利!🚀