8.8 KiB
8.8 KiB
🔧 编辑按钮空白页面修复报告
问题描述
点击 MCP 服务器的"编辑"按钮后,弹出对话框但显示空白页面。
已实施的修复
修复 1: Modal 样式优化
文件: web/src/components/MCPSettings.vue (Line 289-308)
问题: Modal 和 Card 的尺寸设置不当,导致内容无法正常显示
修复内容:
<!-- 修复后 -->
<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
修复内容:
/* 修复前 */
.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
添加了详细的生命周期和数据更新日志:
// 组件加载时
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)
}
测试指南
环境准备
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. 观察结果
✅ 成功的表现:
- Modal 对话框弹出
- 可以看到服务器详情表单
- 有 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 弹出但空白
诊断步骤:
- 打开 Elements 标签
- 搜索
mcp-server-detail - 检查该元素是否存在
- 查看元素的 computed styles
在控制台执行诊断:
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 被覆盖
临时解决方案:
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 组件没有被实例化
检查项:
- editingServer 的值是否为 null/undefined
- v-if="editingServer" 条件是否满足
- 组件导入是否正确
- 是否有 Vue 编译错误
控制台检查:
// 查看 Vue 实例状态
const app = document.querySelector('#app').__vueParentComponent
console.log('editingServer:', app?.setupState?.editingServer)
console.log('showServerDetail:', app?.setupState?.showServerDetail)
场景 C: Modal 根本没弹出
检查步骤:
- 控制台是否有 "showServerDetail 设置为 true" 日志
- Elements 标签搜索
n-modal - 检查 modal 的 display 和 opacity
可能原因:
- showServerDetail 值没有变化
- Modal 组件渲染失败
- z-index 太低被遮挡
诊断工具
方法 1: 使用诊断页面
访问: http://localhost:5173/blank-page-debug.html
提供:
- 完整的测试步骤清单
- 常见问题解决方案
- 快速诊断脚本
- 问题报告模板
方法 2: 全面诊断脚本
在浏览器控制台执行:
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 注意事项
-
尺寸单位
- 推荐使用 vw/vh 而不是百分比
- 确保有 max-width/max-height 限制
-
内容容器
- 需要 n-card 或其他容器包装
- 容器需要明确的尺寸设置
-
高度问题
- 避免使用 height: 100% 除非父容器有明确高度
- 使用 min-height 确保最小可见高度
- 使用 max-height + overflow 处理内容过长
Vue 响应式调试
// 检查响应式状态
import { toRaw } from 'vue'
console.log('原始值:', toRaw(editingServer.value))
// 检查 ref 是否正确
console.log('是否为 ref:', typeof editingServer.value)
修复状态
✅ Modal 样式优化完成 ✅ 组件高度问题修复完成 ✅ 调试日志增强完成 ✅ 诊断工具创建完成 ✅ 开发服务器运行正常
🔄 待确认: 请按照测试指南验证修复效果
下一步
- 刷新页面 - 强制刷新加载最新代码
- 测试功能 - 点击编辑按钮
- 查看日志 - 确认控制台输出完整
- 报告结果 - 告诉我是否成功或提供诊断信息
祝测试顺利!🚀