261 lines
8.6 KiB
JavaScript
261 lines
8.6 KiB
JavaScript
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,
|
|
};
|
|
|