feat: 配置开发环境和清理项目结构

- 修改默认路由重定向到首页 (/home)
- 配置开发服务器使用5667端口
- 整理测试文件到temp-tests目录
- 优化项目结构便于开发和部署

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
woshiqp465
2025-09-15 21:35:49 +08:00
parent 9be0b9788f
commit 9683b940bf
37 changed files with 3 additions and 223 deletions

View File

@@ -0,0 +1,187 @@
import { chromium } from 'playwright';
(async () => {
const browser = await chromium.launch({
headless: false,
});
const context = await browser.newContext();
const page = await context.newPage();
// 监听控制台错误
page.on('console', msg => {
if (msg.type() === 'error') {
console.error('浏览器控制台错误:', msg.text());
}
});
try {
console.log('🚀 开始完整测试分析功能...\n');
// 1. 访问首页并登录
console.log('1. 登录系统...');
await page.goto('http://localhost:5669/', { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);
// 检查是否需要登录
const needLogin = await page.locator('button:has-text("登录")').isVisible();
if (needLogin) {
await page.fill('input[placeholder*="账号"]', 'vben');
await page.fill('input[placeholder*="密码"]', '123456');
await page.locator('button:has-text("登录")').click();
await page.waitForTimeout(3000);
console.log(' ✅ 登录成功');
}
// 2. 刷新页面让菜单重新加载
console.log('\n2. 刷新页面重新加载菜单...');
await page.reload({ waitUntil: 'networkidle' });
await page.waitForTimeout(3000);
// 3. 查找并点击数据分析菜单
console.log('\n3. 导航到分析页面...');
// 尝试查找数据分析菜单
const analyticsMenu = await page.locator('span:has-text("数据分析")').first();
if (await analyticsMenu.isVisible()) {
console.log(' ✅ 找到"数据分析"菜单');
await analyticsMenu.click();
await page.waitForTimeout(1500);
// 查找数据概览子菜单
const overviewMenu = await page.locator('span:has-text("数据概览")').first();
if (await overviewMenu.isVisible()) {
console.log(' ✅ 找到"数据概览"子菜单');
await overviewMenu.click();
await page.waitForTimeout(3000);
} else {
console.log(' ❌ 未找到"数据概览"子菜单尝试直接访问URL');
await page.goto('http://localhost:5669/analytics/overview', { waitUntil: 'networkidle' });
await page.waitForTimeout(3000);
}
} else {
console.log(' ❌ 未找到"数据分析"菜单尝试直接访问URL');
await page.goto('http://localhost:5668/analytics/overview', { waitUntil: 'networkidle' });
await page.waitForTimeout(3000);
}
// 4. 检查页面是否正确加载
console.log('\n4. 检查页面加载状态...');
const currentUrl = page.url();
console.log(' 当前URL:', currentUrl);
// 检查是否还是404
const is404 = await page.locator('text="404"').isVisible();
if (is404) {
console.log(' ❌ 页面仍然显示404错误');
console.log('\n 尝试访问财务管理页面作为备选...');
// 访问财务管理
await page.goto('http://localhost:5669/finance/dashboard', { waitUntil: 'networkidle' });
await page.waitForTimeout(3000);
const financeLoaded = !await page.locator('text="404"').isVisible();
if (financeLoaded) {
console.log(' ✅ 财务管理页面加载成功');
}
} else {
console.log(' ✅ 分析页面加载成功!');
// 5. 详细检查功能组件
console.log('\n5. 检查关键功能组件...');
// 等待组件加载
await page.waitForTimeout(2000);
// 检查关键指标卡片
const hasMetricsCards = await page.locator('.key-metrics-cards').isVisible();
console.log(` 关键指标卡片: ${hasMetricsCards ? '✅' : '❌'}`);
if (hasMetricsCards) {
const metricsCount = await page.locator('.metric-card').count();
console.log(` - 发现 ${metricsCount} 个指标卡片`);
// 检查具体指标
const indicators = [
{ selector: '.ant-statistic-title:has-text("总收入")', name: '总收入' },
{ selector: '.ant-statistic-title:has-text("总支出")', name: '总支出' },
{ selector: '.ant-statistic-title:has-text("净收益")', name: '净收益' },
{ selector: '.ant-statistic-title:has-text("日均收支")', name: '日均收支' },
];
for (const ind of indicators) {
const visible = await page.locator(ind.selector).isVisible();
console.log(` - ${ind.name}: ${visible ? '✅' : '❌'}`);
}
}
// 检查标签页
const hasTabs = await page.locator('.ant-tabs').isVisible();
console.log(`\n 标签页导航: ${hasTabs ? '✅' : '❌'}`);
if (hasTabs) {
const tabs = [
{ name: '核心指标', selector: '.trend-chart' },
{ name: '预算分析', selector: '.budget-comparison' },
{ name: '智能洞察', selector: '.smart-insights' },
{ name: '标签分析', selector: '.tag-cloud-analysis' },
{ name: '时间维度', selector: '.time-dimension-analysis' },
];
for (const tab of tabs) {
console.log(`\n 测试"${tab.name}"标签页...`);
const tabElement = await page.locator(`.ant-tabs-tab:has-text("${tab.name}")`);
if (await tabElement.isVisible()) {
await tabElement.click();
await page.waitForTimeout(2000);
// 检查对应组件是否加载
const componentVisible = await page.locator(tab.selector).isVisible();
console.log(` 组件加载: ${componentVisible ? '✅' : '❌'}`);
// 截取每个标签页的截图
await page.screenshot({
path: `analytics-tab-${tab.name.replace(/[^a-z0-9]/gi, '-')}.png`,
fullPage: false
});
} else {
console.log(` 标签不可见 ❌`);
}
}
}
// 6. 测试交互功能
console.log('\n6. 测试交互功能...');
// 测试日期选择器
const dateRangePicker = await page.locator('.ant-picker-range');
if (await dateRangePicker.isVisible()) {
console.log(' 日期范围选择器: ✅');
}
// 测试刷新按钮
const refreshButton = await page.locator('button:has-text("刷新数据")');
if (await refreshButton.isVisible()) {
console.log(' 刷新数据按钮: ✅');
await refreshButton.click();
await page.waitForTimeout(2000);
console.log(' 数据刷新完成');
}
// 最终成功截图
await page.screenshot({ path: 'analytics-complete-success.png', fullPage: true });
console.log('\n📸 完整功能测试截图已保存: analytics-complete-success.png');
console.log('\n✅ 🎉 分析功能测试完全成功!所有组件正常工作!');
}
} catch (error) {
console.error('\n❌ 测试过程中出错:', error);
await page.screenshot({ path: 'analytics-complete-error.png' });
console.log('错误截图已保存: analytics-complete-error.png');
} finally {
console.log('\n测试完成5秒后关闭浏览器...');
await page.waitForTimeout(5000);
await browser.close();
}
})();