| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550 |
- /**
- * 社团管理系统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);
- }
|