心理健康测评完成
This commit is contained in:
1 parent
79a96a7dfd
commit
461396c77f
26 files changed
+4276
-16
No files matched your search
@@ -0,0 +1,550 @@
|
||||
/**
|
||||
* 社团管理系统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);
|
||||
}
|
||||
Reference in new issue
Block a user