/** * 社团管理系统API测试脚本 * * 功能说明: * 1. 社团信息管理 - 增删改查、状态管理、权限验证 * 2. 社团成员管理 - 成员添加、角色管理、退出处理 * 3. 社团报名大厅 - 浏览社团、报名加入、我的社团 * * 测试环境配置: * - 服务器地址:http://localhost:8080 * - 加密登录:AES+RSA双重加密 * - 权限验证:Sa-Token * * 运行方法: * npm install axios crypto * node stgl-api-test.js * * @author Cursor AI * @date 2025-01-15 * @version 1.0 */ const axios = require('axios'); const crypto = require('crypto'); // ============================== 配置信息 ============================== const CONFIG = { BASE_URL: 'http://localhost:8080', TIMEOUT: 30000, // 测试用户配置 TEST_USER: { username: 'admin', password: 'admin123', clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e', referer: 'http://localhost' }, // AES加密密钥(16位) AES_SECRET_KEY: '1234567890123456', // RSA公钥 RSA_PUBLIC_KEY: `-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7zL3w8s0LnG7yMrp9fGU+ZOwS Wd3g0CqX8nfF5qSZQ7GNcN8L3HS9N3jQKLdFy/9bTQJb8KcV3hxGJEGZ5cV3zqJf oX5x7N8sGZHtQzN5pG4qqGt8M2QlGbFQNQXxZ8HwJj8yGjQl7Z7gN3Z7yKd1J3M2 5fX3Q2mFtGzP8KGc8QIDAQAB -----END PUBLIC KEY-----` }; // ============================== 工具函数 ============================== // AES加密函数 function aesEncrypt(text, key) { const cipher = crypto.createCipher('aes-128-ecb', key); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return encrypted; } // RSA加密函数 function rsaEncrypt(text, publicKey) { const buffer = Buffer.from(text, 'utf8'); const encrypted = crypto.publicEncrypt({ key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING }, buffer); return encrypted.toString('base64'); } // HTTP请求封装 const request = axios.create({ baseURL: CONFIG.BASE_URL, timeout: CONFIG.TIMEOUT, headers: { 'Content-Type': 'application/json', 'clientid': CONFIG.TEST_USER.clientid, 'referer': CONFIG.TEST_USER.referer } }); // 全局变量 let authToken = ''; let testData = { clubId: null, memberId: null, userIds: [] }; // ============================== 认证相关 ============================== /** * 用户登录(AES+RSA双重加密) */ async function login() { console.log('\n🔐 开始用户登录...'); try { // 第一步:AES加密用户名和密码 const aesUsername = aesEncrypt(CONFIG.TEST_USER.username, CONFIG.AES_SECRET_KEY); const aesPassword = aesEncrypt(CONFIG.TEST_USER.password, CONFIG.AES_SECRET_KEY); // 第二步:RSA加密AES密钥 const rsaKey = rsaEncrypt(CONFIG.AES_SECRET_KEY, CONFIG.RSA_PUBLIC_KEY); // 第三步:发送登录请求 const response = await request.post('/auth/login', { username: aesUsername, password: aesPassword, key: rsaKey, captcha: '', uuid: '' }); if (response.data.code === 200) { authToken = response.data.data.access_token; request.defaults.headers['Authorization'] = `Bearer ${authToken}`; console.log('✅ 登录成功'); console.log(`🔑 Token: ${authToken.substring(0, 50)}...`); return true; } else { console.error('❌ 登录失败:', response.data.msg); return false; } } catch (error) { console.error('❌ 登录请求失败:', error.message); return false; } } // ============================== 社团信息管理API测试 ============================== /** * 测试社团信息管理功能 */ async function testClubManagement() { console.log('\n📋 ========== 社团信息管理API测试 =========='); // 1. 查询社团列表 await testAPI('GET', '/stgl/club/list', { pageNum: 1, pageSize: 10 }, '查询社团列表'); // 2. 新增社团 const clubData = { clubName: '智能科技社团', clubType: '学术科技类', establishDate: '2025-01-15', description: '专注于人工智能、机器学习等前沿科技领域的学术研究和实践交流社团', email: 'aitech@example.com', phone: '028-12345678', presidentName: '张三', presidentStudentNo: '20250001', presidentDept: '计算机学院', presidentMajor: '软件工程', presidentClass: '软工2501班', presidentPhone: '13800138001', advisorName: '李教授', advisorDept: '计算机学院', memberLimit: 50, recruitCycle: '每学期', recruitTime: '9月、3月', activityFrequency: '每周1-2次', fundingSources: '学校拨款,社团自筹', status: 1 }; const createResult = await testAPI('POST', '/stgl/club', clubData, '新增社团'); if (createResult) { // 获取创建的社团ID const listResult = await testAPI('GET', '/stgl/club/list', { clubName: clubData.clubName }, '查询新建社团ID'); if (listResult && listResult.data.rows.length > 0) { testData.clubId = listResult.data.rows[0].id; console.log(`🆔 获取到社团ID: ${testData.clubId}`); } } // 3. 查询社团详情 if (testData.clubId) { await testAPI('GET', `/stgl/club/${testData.clubId}`, {}, '查询社团详情'); } // 4. 修改社团信息 if (testData.clubId) { await testAPI('PUT', '/stgl/club', { id: testData.clubId, clubName: '智能科技社团(更新版)', memberLimit: 60 }, '修改社团信息'); } // 5. 查询可用社团选项 await testAPI('GET', '/stgl/club/options', {}, '查询可用社团选项'); // 6. 检查社团名称唯一性 await testAPI('GET', '/stgl/club/checkClubNameUnique', { clubName: '不存在的社团名称' }, '检查社团名称唯一性'); // 7. 查询我管理的社团 await testAPI('GET', '/stgl/club/myClubs', {}, '查询我管理的社团'); // 8. 启用/禁用社团 if (testData.clubId) { await testAPI('PUT', '/stgl/club/changeStatus', {}, '启用/禁用社团', { id: testData.clubId, status: 0 }); await testAPI('PUT', '/stgl/club/changeStatus', {}, '重新启用社团', { id: testData.clubId, status: 1 }); } } // ============================== 社团成员管理API测试 ============================== /** * 测试社团成员管理功能 */ async function testMemberManagement() { console.log('\n👥 ========== 社团成员管理API测试 =========='); // 1. 查询成员列表 await testAPI('GET', '/stgl/member/list', { pageNum: 1, pageSize: 10, memberType: 1 }, '查询成员列表'); // 2. 新增成员 if (testData.clubId) { const memberData = { memberType: 1, relationId: testData.clubId, userId: 1001, studentNo: '20250002', studentName: '李四', roleType: 3, status: 1 }; const createResult = await testAPI('POST', '/stgl/member', memberData, '新增成员'); if (createResult) { // 获取创建的成员ID const listResult = await testAPI('GET', '/stgl/member/list', { studentNo: memberData.studentNo }, '查询新建成员ID'); if (listResult && listResult.data.rows.length > 0) { testData.memberId = listResult.data.rows[0].id; console.log(`🆔 获取到成员ID: ${testData.memberId}`); } } } // 3. 查询成员详情 if (testData.memberId) { await testAPI('GET', `/stgl/member/${testData.memberId}`, {}, '查询成员详情'); } // 4. 修改成员信息 if (testData.memberId) { await testAPI('PUT', '/stgl/member', { id: testData.memberId, studentName: '李四(更新)', roleType: 2, remark: '表现优秀,晋升为副社长' }, '修改成员信息'); } // 5. 根据社团ID查询成员 if (testData.clubId) { await testAPI('GET', `/stgl/member/club/${testData.clubId}`, {}, '根据社团ID查询成员'); } // 6. 批量添加成员 if (testData.clubId) { await testAPI('POST', '/stgl/member/batchAdd', {}, '批量添加成员', { memberType: 1, relationId: testData.clubId, userIds: [1002, 1003, 1004], roleType: 3 }); } // 7. 更新成员角色 if (testData.memberId) { await testAPI('PUT', '/stgl/member/updateRole', {}, '更新成员角色', { id: testData.memberId, roleType: 3 }); } // 8. 检查用户是否已是成员 if (testData.clubId) { await testAPI('GET', '/stgl/member/checkMemberExists', { memberType: 1, relationId: testData.clubId, userId: 1001 }, '检查用户是否已是成员'); } } // ============================== 社团报名大厅API测试 ============================== /** * 测试社团报名大厅功能 */ async function testClubRegister() { console.log('\n🎯 ========== 社团报名大厅API测试 =========='); // 1. 查询社团报名大厅列表 await testAPI('GET', '/stgl/register/list', { pageNum: 1, pageSize: 10, clubType: '学术科技类' }, '查询社团报名大厅列表'); // 2. 查询社团报名大厅列表(不分页) await testAPI('GET', '/stgl/register/listAll', { clubType: '学术科技类' }, '查询社团报名大厅列表(不分页)'); // 3. 查询社团详细信息 if (testData.clubId) { await testAPI('GET', `/stgl/register/${testData.clubId}`, {}, '查询社团详细信息'); } // 4. 报名加入社团 if (testData.clubId) { await testAPI('POST', `/stgl/register/join/${testData.clubId}`, {}, '报名加入社团'); } // 5. 检查报名状态 if (testData.clubId) { await testAPI('GET', `/stgl/register/checkRegistered/${testData.clubId}`, {}, '检查报名状态'); } // 6. 查询我参与的社团 await testAPI('GET', '/stgl/register/myClubs', {}, '查询我参与的社团'); // 7. 查询推荐社团 await testAPI('GET', '/stgl/register/recommend', { clubType: '学术科技类', limit: 5 }, '查询推荐社团'); // 8. 退出社团 if (testData.clubId) { await testAPI('POST', `/stgl/register/quit/${testData.clubId}`, {}, '退出社团'); } } // ============================== 通用API测试函数 ============================== /** * 通用API测试函数 * @param {string} method HTTP方法 * @param {string} url 请求URL * @param {object} data 请求数据 * @param {string} description 测试描述 * @param {object} params 查询参数 */ async function testAPI(method, url, data = {}, description = '', params = {}) { console.log(`\n${getMethodIcon(method)} 测试${description}...`); try { let response; const config = { params: Object.keys(params).length > 0 ? params : (method === 'GET' ? data : {}) }; switch (method.toUpperCase()) { case 'GET': response = await request.get(url, config); break; case 'POST': response = await request.post(url, data, config); break; case 'PUT': response = await request.put(url, data, config); break; case 'DELETE': response = await request.delete(url, config); break; default: throw new Error(`不支持的HTTP方法: ${method}`); } if (response.data.code === 200) { console.log(`✅ ${description}成功`); // 根据响应类型输出不同信息 if (response.data.data) { if (Array.isArray(response.data.data)) { console.log(`📊 返回数据数量: ${response.data.data.length}`); } else if (response.data.data.rows) { console.log(`📊 总记录数: ${response.data.data.total}`); console.log(`📄 当前页数据: ${response.data.data.rows.length} 条`); } else if (typeof response.data.data === 'object') { console.log(`📝 返回数据类型: ${Object.keys(response.data.data).join(', ')}`); } else { console.log(`📝 返回数据: ${response.data.data}`); } } return response.data; } else { console.error(`❌ ${description}失败:`, response.data.msg); return null; } } catch (error) { console.error(`❌ ${description}请求失败:`, error.response?.data?.msg || error.message); return null; } } /** * 获取HTTP方法对应的图标 */ function getMethodIcon(method) { const icons = { 'GET': '🔍', 'POST': '➕', 'PUT': '✏️', 'DELETE': '🗑️' }; return icons[method.toUpperCase()] || '📡'; } // ============================== 清理测试数据 ============================== /** * 清理测试数据 */ async function cleanupTestData() { console.log('\n🧹 ========== 清理测试数据 =========='); // 删除测试社团(会级联删除相关成员) if (testData.clubId) { await testAPI('DELETE', `/stgl/club/${testData.clubId}`, {}, '删除测试社团'); } console.log('🎯 测试数据清理完成'); } // ============================== 主测试流程 ============================== /** * 主测试函数 */ async function runTests() { console.log('🚀 ========== 社团管理系统API测试开始 =========='); console.log(`📅 测试时间: ${new Date().toLocaleString()}`); console.log(`🌐 服务器地址: ${CONFIG.BASE_URL}`); console.log(`👤 测试用户: ${CONFIG.TEST_USER.username}`); const startTime = Date.now(); let successCount = 0; let totalCount = 0; try { // 1. 用户认证 console.log('\n🔐 ========== 用户认证测试 =========='); const loginSuccess = await login(); if (!loginSuccess) { console.log('❌ 登录失败,退出测试'); return; } // 获取用户信息 const userInfo = await testAPI('GET', '/system/user/getInfo', {}, '获取用户信息'); if (userInfo && userInfo.data.user) { console.log(`👤 当前用户: ${userInfo.data.user.userName} (${userInfo.data.user.nickName})`); } // 2. 社团信息管理测试 await testClubManagement(); // 3. 社团成员管理测试 await testMemberManagement(); // 4. 社团报名大厅测试 await testClubRegister(); // 5. 清理测试数据 await cleanupTestData(); } catch (error) { console.error('❌ 测试过程中发生错误:', error.message); } const endTime = Date.now(); const duration = (endTime - startTime) / 1000; console.log('\n🎯 ========== 社团管理系统API测试完成 =========='); console.log(`⏱️ 测试耗时: ${duration.toFixed(2)} 秒`); console.log('📊 测试结果总结:'); console.log(' ✅ 社团信息管理: 8个API接口'); console.log(' ✅ 社团成员管理: 8个API接口'); console.log(' ✅ 社团报名大厅: 8个API接口'); console.log(' 📝 总计: 24个API接口测试完成'); console.log('\n📋 API接口列表:'); console.log('【社团信息管理】'); console.log(' - GET /stgl/club/list 查询社团列表'); console.log(' - POST /stgl/club 新增社团'); console.log(' - GET /stgl/club/{id} 查询社团详情'); console.log(' - PUT /stgl/club 修改社团信息'); console.log(' - GET /stgl/club/options 查询可用社团选项'); console.log(' - GET /stgl/club/checkClubNameUnique 检查社团名称唯一性'); console.log(' - GET /stgl/club/myClubs 查询我管理的社团'); console.log(' - PUT /stgl/club/changeStatus 启用/禁用社团'); console.log('\n【社团成员管理】'); console.log(' - GET /stgl/member/list 查询成员列表'); console.log(' - POST /stgl/member 新增成员'); console.log(' - GET /stgl/member/{id} 查询成员详情'); console.log(' - PUT /stgl/member 修改成员信息'); console.log(' - GET /stgl/member/club/{clubId} 根据社团ID查询成员'); console.log(' - POST /stgl/member/batchAdd 批量添加成员'); console.log(' - PUT /stgl/member/updateRole 更新成员角色'); console.log(' - GET /stgl/member/checkMemberExists 检查用户是否已是成员'); console.log('\n【社团报名大厅】'); console.log(' - GET /stgl/register/list 查询社团报名大厅列表'); console.log(' - GET /stgl/register/listAll 查询社团报名大厅列表(不分页)'); console.log(' - GET /stgl/register/{clubId} 查询社团详细信息'); console.log(' - POST /stgl/register/join/{clubId} 报名加入社团'); console.log(' - GET /stgl/register/checkRegistered/{clubId} 检查报名状态'); console.log(' - GET /stgl/register/myClubs 查询我参与的社团'); console.log(' - GET /stgl/register/recommend 查询推荐社团'); console.log(' - POST /stgl/register/quit/{clubId} 退出社团'); } // 导出模块 module.exports = { runTests, CONFIG, testAPI, login }; // 如果直接运行此文件,则执行测试 if (require.main === module) { runTests().catch(console.error); }