Initial commit: Telegram Management System
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
177
debug-menu-content.js
Normal file
177
debug-menu-content.js
Normal file
@@ -0,0 +1,177 @@
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
let browser;
|
||||
|
||||
try {
|
||||
console.log('启动浏览器调试菜单内容...');
|
||||
browser = await chromium.launch({
|
||||
headless: false,
|
||||
slowMo: 100
|
||||
});
|
||||
|
||||
const context = await browser.newContext({
|
||||
viewport: { width: 1920, height: 1080 }
|
||||
});
|
||||
|
||||
const page = await context.newPage();
|
||||
|
||||
// 监听网络请求
|
||||
page.on('request', request => {
|
||||
if (request.url().includes('api') || request.url().includes('menu')) {
|
||||
console.log('[请求]', request.method(), request.url());
|
||||
}
|
||||
});
|
||||
|
||||
page.on('response', response => {
|
||||
if (response.url().includes('api') || response.url().includes('menu')) {
|
||||
console.log('[响应]', response.status(), response.url());
|
||||
}
|
||||
});
|
||||
|
||||
console.log('\n1. 访问登录页面...');
|
||||
await page.goto('http://localhost:5173/', { waitUntil: 'networkidle' });
|
||||
|
||||
console.log('\n2. 执行登录...');
|
||||
await page.fill('[name="username"]', 'admin');
|
||||
await page.fill('[name="password"]', '111111');
|
||||
await page.click('button:has-text("登录")');
|
||||
|
||||
await page.waitForURL('**/dashboard/**', { timeout: 10000 });
|
||||
console.log('登录成功');
|
||||
|
||||
// 等待一段时间让菜单加载
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
console.log('\n3. 检查菜单数据...');
|
||||
|
||||
// 获取菜单内容
|
||||
const menuData = await page.evaluate(() => {
|
||||
const result = {
|
||||
vbenMenus: [],
|
||||
antMenus: [],
|
||||
menuTexts: [],
|
||||
hiddenElements: []
|
||||
};
|
||||
|
||||
// 检查Vben菜单
|
||||
const vbenMenus = document.querySelectorAll('.vben-menu-item, .vben-sub-menu');
|
||||
vbenMenus.forEach(menu => {
|
||||
const text = menu.textContent?.trim();
|
||||
const isVisible = menu.offsetWidth > 0 && menu.offsetHeight > 0;
|
||||
result.vbenMenus.push({
|
||||
class: menu.className,
|
||||
text: text || '(无文本)',
|
||||
visible: isVisible,
|
||||
hasChildren: menu.children.length
|
||||
});
|
||||
|
||||
if (!isVisible) {
|
||||
result.hiddenElements.push(menu.className);
|
||||
}
|
||||
});
|
||||
|
||||
// 检查所有包含menu的元素
|
||||
const allMenuElements = document.querySelectorAll('[class*="menu"]:not([class*="icon"])');
|
||||
allMenuElements.forEach(el => {
|
||||
const text = el.textContent?.trim();
|
||||
if (text && text.length > 0 && text.length < 50) {
|
||||
result.menuTexts.push(text);
|
||||
}
|
||||
});
|
||||
|
||||
// 特别检查是否有文本但被隐藏
|
||||
const spans = document.querySelectorAll('.vben-menu span, .vben-menu-item span');
|
||||
spans.forEach(span => {
|
||||
const text = span.textContent?.trim();
|
||||
if (text) {
|
||||
result.menuTexts.push(`[span] ${text}`);
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
console.log('\nVben菜单详情:');
|
||||
menuData.vbenMenus.slice(0, 10).forEach((menu, i) => {
|
||||
console.log(`${i + 1}. ${menu.text} (${menu.class}) - 可见: ${menu.visible}`);
|
||||
});
|
||||
|
||||
console.log('\n发现的菜单文本:');
|
||||
console.log(menuData.menuTexts);
|
||||
|
||||
console.log('\n隐藏的元素数量:', menuData.hiddenElements.length);
|
||||
|
||||
// 检查是否加载了菜单数据
|
||||
const storeData = await page.evaluate(() => {
|
||||
try {
|
||||
// 尝试直接访问localStorage
|
||||
const coreAccess = localStorage.getItem('core-access');
|
||||
if (coreAccess) {
|
||||
const data = JSON.parse(coreAccess);
|
||||
return {
|
||||
hasLocalStorage: true,
|
||||
accessMenus: data.accessMenus,
|
||||
menuCount: data.accessMenus?.length || 0
|
||||
};
|
||||
}
|
||||
return { hasLocalStorage: false };
|
||||
} catch (err) {
|
||||
return { error: err.message };
|
||||
}
|
||||
});
|
||||
|
||||
console.log('\nLocalStorage数据:', storeData);
|
||||
|
||||
// 尝试手动触发菜单初始化
|
||||
console.log('\n4. 尝试手动初始化菜单...');
|
||||
const initResult = await page.evaluate(async () => {
|
||||
try {
|
||||
// 获取Vue Router实例
|
||||
const app = window.__VUE_APP__ || window.app || document.querySelector('#app')?.__vue_app__;
|
||||
if (!app) return { error: 'No app' };
|
||||
|
||||
const router = app._context.provides.$router;
|
||||
if (!router) return { error: 'No router' };
|
||||
|
||||
// 强制刷新当前路由
|
||||
await router.push('/');
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
await router.push('/dashboard/home');
|
||||
|
||||
return { success: true };
|
||||
} catch (err) {
|
||||
return { error: err.message };
|
||||
}
|
||||
});
|
||||
|
||||
console.log('初始化结果:', initResult);
|
||||
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// 再次检查菜单
|
||||
const finalCheck = await page.evaluate(() => {
|
||||
const menuItems = document.querySelectorAll('.vben-menu-item__content');
|
||||
const texts = [];
|
||||
menuItems.forEach(item => {
|
||||
const text = item.textContent?.trim();
|
||||
if (text) texts.push(text);
|
||||
});
|
||||
return texts;
|
||||
});
|
||||
|
||||
console.log('\n最终菜单文本:', finalCheck);
|
||||
|
||||
// 截图
|
||||
await page.screenshot({ path: 'test-screenshots/menu-debug.png', fullPage: true });
|
||||
|
||||
console.log('\n保持浏览器打开查看...');
|
||||
await new Promise(() => {});
|
||||
|
||||
} catch (error) {
|
||||
console.error('调试出错:', error);
|
||||
if (browser) {
|
||||
await browser.close();
|
||||
}
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user