主要更新: - 🎯 新增综合分析仪表板,包含关键指标卡片、预算对比、智能洞察等组件 - 📊 增强数据可视化能力,新增标签云分析、时间维度分析等图表 - 📱 优化移动端响应式设计,改进触控交互体验 - 🔧 新增多个API模块(base、budget、tag),完善数据管理 - 🗂️ 重构路由结构,新增贷款、快速添加、设置、统计等独立模块 - 🔄 优化数据导入导出功能,增强数据迁移能力 - 🐛 修复多个已知问题,提升系统稳定性 技术改进: - 使用IndexedDB提升本地存储性能 - 实现模拟API服务,支持离线开发 - 增加自动化测试脚本,确保功能稳定 - 优化打包配置,提升构建效率 文件变更: - 新增42个文件 - 修改55个文件 - 包含测试脚本、配置文件、组件和API模块 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
187 lines
7.2 KiB
JavaScript
187 lines
7.2 KiB
JavaScript
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();
|
||
}
|
||
})(); |