permission-verification-test.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. const axios = require('axios');
  2. const colors = require('colors');
  3. // 测试配置
  4. const BASE_URL = 'http://localhost/dev-api';
  5. // 获取Token
  6. async function getToken() {
  7. try {
  8. const { getToken } = require('./quick-token-getter');
  9. return await getToken();
  10. } catch (error) {
  11. console.log('获取Token失败'.red, error.message);
  12. return null;
  13. }
  14. }
  15. // 通用API测试方法
  16. async function testAPI(endpoint, method = 'GET', data = null, token = null, description = '') {
  17. try {
  18. const config = {
  19. method: method.toLowerCase(),
  20. url: `${BASE_URL}${endpoint}`,
  21. headers: {
  22. 'Content-Type': 'application/json;charset=utf-8',
  23. clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e',
  24. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  25. referer: 'http://localhost/login?redirect=%252Findex',
  26. },
  27. timeout: 10000,
  28. };
  29. if (token) {
  30. config.headers['Authorization'] = `Bearer ${token}`;
  31. }
  32. if (data && (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT')) {
  33. config.data = data;
  34. } else if (data && method.toUpperCase() === 'GET') {
  35. config.params = data;
  36. }
  37. const response = await axios(config);
  38. return {
  39. success: true,
  40. data: response.data,
  41. status: response.status,
  42. description: description,
  43. };
  44. } catch (error) {
  45. return {
  46. success: false,
  47. error: error.response?.data || error.message,
  48. status: error.response?.status,
  49. description: description,
  50. };
  51. }
  52. }
  53. // 测试所有权限接口
  54. async function testAllPermissionAPIs(token) {
  55. console.log('\n🧪 测试物业报修管理权限接口'.blue.bold);
  56. console.log('='.repeat(80).blue);
  57. // 定义所有需要测试的接口
  58. const apiTests = [
  59. // 报修管理接口
  60. {
  61. endpoint: '/pm/repairOrder/list',
  62. method: 'GET',
  63. permission: 'pm:repairOrder:list',
  64. description: '报修工单列表查询',
  65. data: { pageNum: 1, pageSize: 10 },
  66. },
  67. {
  68. endpoint: '/pm/repairOrder/statistics',
  69. method: 'GET',
  70. permission: 'pm:repairOrder:statistics',
  71. description: '报修统计数据',
  72. },
  73. {
  74. endpoint: '/pm/repairOrder/generateOrderNo',
  75. method: 'GET',
  76. permission: 'pm:repairOrder:generateOrderNo',
  77. description: '生成工单编号',
  78. },
  79. // 维修分类接口
  80. {
  81. endpoint: '/pm/repairCategory/list',
  82. method: 'GET',
  83. permission: 'pm:category:list',
  84. description: '维修分类列表查询',
  85. data: { pageNum: 1, pageSize: 10 },
  86. },
  87. {
  88. endpoint: '/pm/repairCategory/tree',
  89. method: 'GET',
  90. permission: 'pm:category:tree',
  91. description: '维修分类树形结构',
  92. },
  93. {
  94. endpoint: '/pm/repairCategory/options',
  95. method: 'GET',
  96. permission: 'pm:category:options',
  97. description: '维修分类下拉选项',
  98. },
  99. ];
  100. const results = [];
  101. for (let i = 0; i < apiTests.length; i++) {
  102. const test = apiTests[i];
  103. console.log(`\n${i + 1}. 测试接口: ${test.endpoint}`.cyan);
  104. console.log(` 权限要求: ${test.permission}`.gray);
  105. console.log(` 功能描述: ${test.description}`.gray);
  106. const result = await testAPI(
  107. test.endpoint,
  108. test.method,
  109. test.data,
  110. token,
  111. test.description,
  112. );
  113. if (result.success) {
  114. console.log(` ✅ 成功 - 状态: ${result.status}`.green);
  115. if (result.data?.data) {
  116. if (Array.isArray(result.data.data)) {
  117. console.log(` 📊 数据: ${result.data.data.length}条记录`.yellow);
  118. } else if (result.data.data.rows) {
  119. console.log(
  120. ` 📊 数据: 共${result.data.data.total}条,当前页${result.data.data.rows.length}条`
  121. .yellow,
  122. );
  123. } else if (typeof result.data.data === 'string') {
  124. console.log(` 📊 数据: ${result.data.data}`.yellow);
  125. } else {
  126. console.log(` 📊 数据: 返回对象`.yellow);
  127. }
  128. }
  129. } else {
  130. const errorMsg =
  131. result.error?.msg || result.error?.message || JSON.stringify(result.error);
  132. console.log(` ❌ 失败 - 状态: ${result.status}`.red);
  133. console.log(` 📝 错误: ${errorMsg}`.red);
  134. }
  135. results.push({
  136. ...test,
  137. success: result.success,
  138. status: result.status,
  139. error: result.error,
  140. });
  141. }
  142. return results;
  143. }
  144. // 生成测试报告
  145. function generateReport(results, token) {
  146. console.log('\n📊 权限测试报告'.rainbow.bold);
  147. console.log('='.repeat(80).rainbow);
  148. const totalTests = results.length;
  149. const successfulTests = results.filter((r) => r.success).length;
  150. const failedTests = totalTests - successfulTests;
  151. const successRate = ((successfulTests / totalTests) * 100).toFixed(2);
  152. console.log(`\n📈 测试统计:`);
  153. console.log(` 总测试数: ${totalTests}`);
  154. console.log(` 成功数: ${successfulTests}`.green);
  155. console.log(` 失败数: ${failedTests}`.red);
  156. console.log(` 成功率: ${successRate}%`.yellow);
  157. if (failedTests > 0) {
  158. console.log(`\n❌ 失败的接口:`);
  159. results
  160. .filter((r) => !r.success)
  161. .forEach((test, index) => {
  162. const errorMsg = test.error?.msg || test.error?.message || '未知错误';
  163. console.log(` ${index + 1}. ${test.endpoint} - ${errorMsg}`.red);
  164. });
  165. console.log(`\n💡 可能的解决方案:`);
  166. console.log(` 1. 🗄️ 执行权限配置SQL脚本: source test/complete-permission-config.sql`);
  167. console.log(` 2. 🔄 重新登录系统刷新权限缓存`);
  168. console.log(` 3. 🏗️ 重启后端服务重新加载权限配置`);
  169. console.log(` 4. 🗄️ 检查数据库中sys_menu和sys_role_menu表的数据`);
  170. } else {
  171. console.log(`\n🎉 所有接口测试通过!权限配置正确!`.green.bold);
  172. }
  173. // 详细结果
  174. console.log(`\n📋 详细测试结果:`);
  175. results.forEach((test, index) => {
  176. const status = test.success ? '✅' : '❌';
  177. const statusText = test.success ? '成功' : '失败';
  178. console.log(` ${index + 1}. ${status} ${test.endpoint} - ${statusText}`);
  179. if (!test.success) {
  180. const errorMsg = test.error?.msg || test.error?.message || '未知错误';
  181. console.log(` 错误: ${errorMsg}`.gray);
  182. }
  183. });
  184. }
  185. // 主测试函数
  186. async function runPermissionTest() {
  187. console.log('🔐 物业报修管理权限验证测试'.rainbow.bold);
  188. console.log('='.repeat(80).rainbow);
  189. const startTime = new Date();
  190. try {
  191. // 1. 获取Token
  192. console.log('\n🔑 步骤1: 获取认证Token'.magenta.bold);
  193. const token = await getToken();
  194. if (!token || token.length < 50) {
  195. console.log('❌ Token获取失败,无法进行权限测试'.red.bold);
  196. return;
  197. }
  198. console.log('✅ Token获取成功'.green);
  199. // 2. 测试所有权限接口
  200. console.log('\n🧪 步骤2: 测试权限接口'.magenta.bold);
  201. const results = await testAllPermissionAPIs(token);
  202. // 3. 生成测试报告
  203. console.log('\n📊 步骤3: 生成测试报告'.magenta.bold);
  204. generateReport(results, token);
  205. // 4. 性能统计
  206. const endTime = new Date();
  207. const duration = endTime - startTime;
  208. console.log(`\n⏱️ 测试耗时: ${duration}ms`.cyan);
  209. } catch (error) {
  210. console.error('\n💥 权限测试过程出错:'.red.bold, error.message);
  211. }
  212. }
  213. // 如果直接运行此脚本
  214. if (require.main === module) {
  215. runPermissionTest()
  216. .then(() => {
  217. console.log('\n👋 权限测试完成'.cyan);
  218. })
  219. .catch((error) => {
  220. console.error('权限测试脚本执行失败:', error);
  221. process.exit(1);
  222. });
  223. }
  224. module.exports = {
  225. runPermissionTest,
  226. testAllPermissionAPIs,
  227. generateReport,
  228. };