const axios = require('axios'); const colors = require('colors'); // 测试配置 const BASE_URL = 'http://localhost/dev-api'; // 获取Token async function getToken() { try { const { getToken } = require('./quick-token-getter'); return await getToken(); } catch (error) { console.log('获取Token失败'.red, error.message); return null; } } // 通用API测试方法 async function testAPI(endpoint, method = 'GET', data = null, token = null, description = '') { try { const config = { method: method.toLowerCase(), url: `${BASE_URL}${endpoint}`, headers: { 'Content-Type': 'application/json;charset=utf-8', clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', referer: 'http://localhost/login?redirect=%252Findex', }, timeout: 10000, }; if (token) { config.headers['Authorization'] = `Bearer ${token}`; } if (data && (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT')) { config.data = data; } else if (data && method.toUpperCase() === 'GET') { config.params = data; } const response = await axios(config); return { success: true, data: response.data, status: response.status, description: description, }; } catch (error) { return { success: false, error: error.response?.data || error.message, status: error.response?.status, description: description, }; } } // 测试所有权限接口 async function testAllPermissionAPIs(token) { console.log('\n🧪 测试物业报修管理权限接口'.blue.bold); console.log('='.repeat(80).blue); // 定义所有需要测试的接口 const apiTests = [ // 报修管理接口 { endpoint: '/pm/repairOrder/list', method: 'GET', permission: 'pm:repairOrder:list', description: '报修工单列表查询', data: { pageNum: 1, pageSize: 10 }, }, { endpoint: '/pm/repairOrder/statistics', method: 'GET', permission: 'pm:repairOrder:statistics', description: '报修统计数据', }, { endpoint: '/pm/repairOrder/generateOrderNo', method: 'GET', permission: 'pm:repairOrder:generateOrderNo', description: '生成工单编号', }, // 维修分类接口 { endpoint: '/pm/repairCategory/list', method: 'GET', permission: 'pm:category:list', description: '维修分类列表查询', data: { pageNum: 1, pageSize: 10 }, }, { endpoint: '/pm/repairCategory/tree', method: 'GET', permission: 'pm:category:tree', description: '维修分类树形结构', }, { endpoint: '/pm/repairCategory/options', method: 'GET', permission: 'pm:category:options', description: '维修分类下拉选项', }, ]; const results = []; for (let i = 0; i < apiTests.length; i++) { const test = apiTests[i]; console.log(`\n${i + 1}. 测试接口: ${test.endpoint}`.cyan); console.log(` 权限要求: ${test.permission}`.gray); console.log(` 功能描述: ${test.description}`.gray); const result = await testAPI( test.endpoint, test.method, test.data, token, test.description, ); if (result.success) { console.log(` ✅ 成功 - 状态: ${result.status}`.green); if (result.data?.data) { if (Array.isArray(result.data.data)) { console.log(` 📊 数据: ${result.data.data.length}条记录`.yellow); } else if (result.data.data.rows) { console.log( ` 📊 数据: 共${result.data.data.total}条,当前页${result.data.data.rows.length}条` .yellow, ); } else if (typeof result.data.data === 'string') { console.log(` 📊 数据: ${result.data.data}`.yellow); } else { console.log(` 📊 数据: 返回对象`.yellow); } } } else { const errorMsg = result.error?.msg || result.error?.message || JSON.stringify(result.error); console.log(` ❌ 失败 - 状态: ${result.status}`.red); console.log(` 📝 错误: ${errorMsg}`.red); } results.push({ ...test, success: result.success, status: result.status, error: result.error, }); } return results; } // 生成测试报告 function generateReport(results, token) { console.log('\n📊 权限测试报告'.rainbow.bold); console.log('='.repeat(80).rainbow); const totalTests = results.length; const successfulTests = results.filter((r) => r.success).length; const failedTests = totalTests - successfulTests; const successRate = ((successfulTests / totalTests) * 100).toFixed(2); console.log(`\n📈 测试统计:`); console.log(` 总测试数: ${totalTests}`); console.log(` 成功数: ${successfulTests}`.green); console.log(` 失败数: ${failedTests}`.red); console.log(` 成功率: ${successRate}%`.yellow); if (failedTests > 0) { console.log(`\n❌ 失败的接口:`); results .filter((r) => !r.success) .forEach((test, index) => { const errorMsg = test.error?.msg || test.error?.message || '未知错误'; console.log(` ${index + 1}. ${test.endpoint} - ${errorMsg}`.red); }); console.log(`\n💡 可能的解决方案:`); console.log(` 1. 🗄️ 执行权限配置SQL脚本: source test/complete-permission-config.sql`); console.log(` 2. 🔄 重新登录系统刷新权限缓存`); console.log(` 3. 🏗️ 重启后端服务重新加载权限配置`); console.log(` 4. 🗄️ 检查数据库中sys_menu和sys_role_menu表的数据`); } else { console.log(`\n🎉 所有接口测试通过!权限配置正确!`.green.bold); } // 详细结果 console.log(`\n📋 详细测试结果:`); results.forEach((test, index) => { const status = test.success ? '✅' : '❌'; const statusText = test.success ? '成功' : '失败'; console.log(` ${index + 1}. ${status} ${test.endpoint} - ${statusText}`); if (!test.success) { const errorMsg = test.error?.msg || test.error?.message || '未知错误'; console.log(` 错误: ${errorMsg}`.gray); } }); } // 主测试函数 async function runPermissionTest() { console.log('🔐 物业报修管理权限验证测试'.rainbow.bold); console.log('='.repeat(80).rainbow); const startTime = new Date(); try { // 1. 获取Token console.log('\n🔑 步骤1: 获取认证Token'.magenta.bold); const token = await getToken(); if (!token || token.length < 50) { console.log('❌ Token获取失败,无法进行权限测试'.red.bold); return; } console.log('✅ Token获取成功'.green); // 2. 测试所有权限接口 console.log('\n🧪 步骤2: 测试权限接口'.magenta.bold); const results = await testAllPermissionAPIs(token); // 3. 生成测试报告 console.log('\n📊 步骤3: 生成测试报告'.magenta.bold); generateReport(results, token); // 4. 性能统计 const endTime = new Date(); const duration = endTime - startTime; console.log(`\n⏱️ 测试耗时: ${duration}ms`.cyan); } catch (error) { console.error('\n💥 权限测试过程出错:'.red.bold, error.message); } } // 如果直接运行此脚本 if (require.main === module) { runPermissionTest() .then(() => { console.log('\n👋 权限测试完成'.cyan); }) .catch((error) => { console.error('权限测试脚本执行失败:', error); process.exit(1); }); } module.exports = { runPermissionTest, testAllPermissionAPIs, generateReport, };