refactor(asl): ASL frontend architecture refactoring with left navigation
- feat: Create ASLLayout component with 7-module left navigation - feat: Implement Title Screening Settings page with optimized PICOS layout - feat: Add placeholder pages for Workbench and Results - fix: Fix nested routing structure for React Router v6 - fix: Resolve Spin component warning in MainLayout - fix: Add QueryClientProvider to App.tsx - style: Optimize PICOS form layout (P+I left, C+O+S right) - style: Align Inclusion/Exclusion criteria side-by-side - docs: Add architecture refactoring and routing fix reports Ref: Week 2 Frontend Development Scope: ASL module MVP - Title Abstract Screening
This commit is contained in:
193
backend/scripts/test-asl-api.ts
Normal file
193
backend/scripts/test-asl-api.ts
Normal file
@@ -0,0 +1,193 @@
|
||||
/**
|
||||
* ASL模块API测试脚本
|
||||
* 测试所有ASL API端点
|
||||
*/
|
||||
|
||||
const BASE_URL = 'http://localhost:3001';
|
||||
const API_PREFIX = '/api/v1/asl';
|
||||
|
||||
// 测试用的userId (需要先创建用户或使用已有用户)
|
||||
const TEST_USER_ID = '00000000-0000-0000-0000-000000000001';
|
||||
|
||||
async function testAPI() {
|
||||
console.log('🚀 开始测试 ASL 模块 API...\n');
|
||||
|
||||
let projectId = '';
|
||||
let literatureIds: string[] = [];
|
||||
|
||||
try {
|
||||
// ==================== 测试1: 健康检查 ====================
|
||||
console.log('📍 测试 1/7: 健康检查');
|
||||
const healthRes = await fetch(`${BASE_URL}/health`);
|
||||
const health = await healthRes.json();
|
||||
console.log('✅ 健康检查成功:', health.status);
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试2: 创建筛选项目 ====================
|
||||
console.log('📍 测试 2/7: 创建筛选项目');
|
||||
const createProjectRes = await fetch(`${BASE_URL}${API_PREFIX}/projects`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
projectName: 'SGLT2抑制剂系统综述测试',
|
||||
picoCriteria: {
|
||||
population: '2型糖尿病成人患者',
|
||||
intervention: 'SGLT2抑制剂',
|
||||
comparison: '安慰剂或常规降糖疗法',
|
||||
outcome: '心血管结局',
|
||||
studyDesign: '随机对照试验 (RCT)',
|
||||
},
|
||||
inclusionCriteria: '英文文献,RCT研究,2010年后发表',
|
||||
exclusionCriteria: '病例报告,综述,动物实验',
|
||||
screeningConfig: {
|
||||
models: ['deepseek-chat', 'qwen-max'],
|
||||
temperature: 0,
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
||||
if (!createProjectRes.ok) {
|
||||
console.log('⚠️ 创建项目失败,状态码:', createProjectRes.status);
|
||||
const error = await createProjectRes.text();
|
||||
console.log('错误信息:', error);
|
||||
console.log('💡 提示: 需要添加JWT认证中间件,或暂时跳过userId验证\n');
|
||||
return;
|
||||
}
|
||||
|
||||
const createResult = await createProjectRes.json();
|
||||
projectId = createResult.data.id;
|
||||
console.log('✅ 项目创建成功');
|
||||
console.log(' 项目ID:', projectId);
|
||||
console.log(' 项目名称:', createResult.data.projectName);
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试3: 获取项目列表 ====================
|
||||
console.log('📍 测试 3/7: 获取项目列表');
|
||||
const listRes = await fetch(`${BASE_URL}${API_PREFIX}/projects`);
|
||||
const listResult = await listRes.json();
|
||||
console.log('✅ 获取项目列表成功');
|
||||
console.log(' 项目数量:', listResult.data.length);
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试4: 获取项目详情 ====================
|
||||
console.log('📍 测试 4/7: 获取项目详情');
|
||||
const detailRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}`);
|
||||
const detailResult = await detailRes.json();
|
||||
console.log('✅ 获取项目详情成功');
|
||||
console.log(' 项目名称:', detailResult.data.projectName);
|
||||
console.log(' PICO标准:', JSON.stringify(detailResult.data.picoCriteria, null, 2));
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试5: 导入文献(JSON) ====================
|
||||
console.log('📍 测试 5/7: 导入文献(JSON)');
|
||||
const importRes = await fetch(`${BASE_URL}${API_PREFIX}/literatures/import`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
projectId: projectId,
|
||||
literatures: [
|
||||
{
|
||||
pmid: '12345678',
|
||||
title: 'Efficacy of SGLT2 inhibitors in type 2 diabetes: a randomized controlled trial',
|
||||
abstract: 'Background: SGLT2 inhibitors are a new class of glucose-lowering drugs. Methods: We conducted a randomized, double-blind, placebo-controlled trial. Results: SGLT2 inhibitors significantly reduced HbA1c and body weight. Conclusions: SGLT2 inhibitors are effective for type 2 diabetes.',
|
||||
authors: 'Smith J, Jones A, Brown B',
|
||||
journal: 'New England Journal of Medicine',
|
||||
publicationYear: 2020,
|
||||
doi: '10.1056/NEJMoa1234567',
|
||||
},
|
||||
{
|
||||
pmid: '87654321',
|
||||
title: 'Cardiovascular outcomes with SGLT2 inhibitors in patients with type 2 diabetes',
|
||||
abstract: 'Objective: To evaluate cardiovascular safety of SGLT2 inhibitors. Design: Multicenter randomized controlled trial. Participants: Adults with type 2 diabetes and high cardiovascular risk. Results: SGLT2 inhibitors reduced major adverse cardiovascular events by 25%.',
|
||||
authors: 'Johnson M, Williams C, Davis R',
|
||||
journal: 'The Lancet',
|
||||
publicationYear: 2019,
|
||||
doi: '10.1016/S0140-6736(19)12345-6',
|
||||
},
|
||||
{
|
||||
title: 'A meta-analysis of SGLT2 inhibitor studies',
|
||||
abstract: 'This meta-analysis reviewed 20 studies on SGLT2 inhibitors. We found consistent benefits across different populations. However, results were heterogeneous.',
|
||||
authors: 'Lee K, Park S',
|
||||
journal: 'Diabetes Care',
|
||||
publicationYear: 2021,
|
||||
},
|
||||
],
|
||||
}),
|
||||
});
|
||||
|
||||
const importResult = await importRes.json();
|
||||
console.log('✅ 文献导入成功');
|
||||
console.log(' 导入数量:', importResult.data.importedCount);
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试6: 获取文献列表 ====================
|
||||
console.log('📍 测试 6/7: 获取文献列表');
|
||||
const litListRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}/literatures`);
|
||||
const litListResult = await litListRes.json();
|
||||
console.log('✅ 获取文献列表成功');
|
||||
console.log(' 文献数量:', litListResult.data.literatures.length);
|
||||
console.log(' 分页信息:', litListResult.data.pagination);
|
||||
|
||||
if (litListResult.data.literatures.length > 0) {
|
||||
console.log(' 第一篇文献:');
|
||||
console.log(' - 标题:', litListResult.data.literatures[0].title.substring(0, 50) + '...');
|
||||
console.log(' - PMID:', litListResult.data.literatures[0].pmid);
|
||||
literatureIds = litListResult.data.literatures.map((lit: any) => lit.id);
|
||||
}
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试7: 更新项目 ====================
|
||||
console.log('📍 测试 7/7: 更新项目');
|
||||
const updateRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
status: 'screening',
|
||||
}),
|
||||
});
|
||||
|
||||
const updateResult = await updateRes.json();
|
||||
console.log('✅ 项目更新成功');
|
||||
console.log(' 新状态:', updateResult.data.status);
|
||||
console.log('');
|
||||
|
||||
// ==================== 测试总结 ====================
|
||||
console.log('═'.repeat(60));
|
||||
console.log('🎉 所有测试通过!');
|
||||
console.log('═'.repeat(60));
|
||||
console.log('📊 测试总结:');
|
||||
console.log(' ✅ 健康检查');
|
||||
console.log(' ✅ 创建筛选项目');
|
||||
console.log(' ✅ 获取项目列表');
|
||||
console.log(' ✅ 获取项目详情');
|
||||
console.log(' ✅ 导入文献');
|
||||
console.log(' ✅ 获取文献列表');
|
||||
console.log(' ✅ 更新项目状态');
|
||||
console.log('');
|
||||
console.log('📝 创建的测试数据:');
|
||||
console.log(` - 项目ID: ${projectId}`);
|
||||
console.log(` - 文献数量: ${literatureIds.length}`);
|
||||
console.log('');
|
||||
console.log('🧹 清理提示: 如需删除测试数据,请执行:');
|
||||
console.log(` DELETE http://localhost:3001/api/v1/asl/projects/${projectId}`);
|
||||
console.log('');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 测试失败:', error);
|
||||
if (error instanceof Error) {
|
||||
console.error('错误详情:', error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 执行测试
|
||||
testAPI();
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user