Files
hms/apps/miniprogram/audit-verify.cjs
iven 50eae8b809 feat(miniprogram): 温润东方风全面 UI 重设计
73 文件变更,覆盖全部 40 个页面 SCSS + TabBar 图标 + 组件样式。
统一赤陶主色 #C4623A + 暖米背景 + 衬线标题字体 + 12px 圆角体系。
2026-04-28 00:19:52 +08:00

110 lines
4.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 审计修复验证脚本
* 验证 F1: 今日体征概览 API 支持 patient_id 参数
*/
const http = require('http');
const BASE = 'http://localhost:3000/api/v1';
function request(method, path, body, token) {
return new Promise((resolve, reject) => {
const url = new URL(BASE + path);
const opts = {
hostname: url.hostname,
port: url.port,
path: url.pathname + url.search,
method,
headers: { 'Content-Type': 'application/json' },
timeout: 10000,
};
if (token) opts.headers['Authorization'] = `Bearer ${token}`;
const req = http.request(opts, (res) => {
const chunks = [];
res.on('data', (c) => chunks.push(c));
res.on('end', () => {
const raw = Buffer.concat(chunks).toString();
try {
resolve({ status: res.statusCode, data: JSON.parse(raw) });
} catch {
resolve({ status: res.statusCode, data: raw });
}
});
});
req.on('error', reject);
req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
if (body) req.write(JSON.stringify(body));
req.end();
});
}
async function main() {
console.log('=== 审计修复验证 ===\n');
// 1. 登录
console.log('1. 登录...');
const loginRes = await request('POST', '/auth/login', {
username: 'admin',
password: 'Admin@2026',
});
const token = loginRes.data?.data?.access_token;
if (!token) {
console.error(' FAIL: 登录失败', JSON.stringify(loginRes.data).substring(0, 200));
process.exit(1);
}
console.log(' OK: token 长度', token.length);
// 2. 获取患者列表(找第一个患者 ID
console.log('\n2. 获取患者列表...');
const patientsRes = await request('GET', '/health/patients?page=1&page_size=5', null, token);
const patients = patientsRes.data?.data?.data || [];
console.log(' 患者数量:', patients.length);
const patientId = patients[0]?.id;
if (!patientId) {
console.log(' WARN: 无患者数据,跳过后续测试');
return;
}
console.log(' 使用患者 ID:', patientId);
// 3. F1 验证:今日体征概览 - 不带 patient_id
console.log('\n3. F1 验证: 今日体征概览(不带 patient_id...');
const todayRes1 = await request('GET', '/health/vital-signs/today', null, token);
console.log(' 状态:', todayRes1.status, todayRes1.data?.success ? 'OK' : 'FAIL');
// 4. F1 验证:今日体征概览 - 带 patient_id 参数
console.log('\n4. F1 验证: 今日体征概览(带 patient_id 参数)...');
const todayRes2 = await request('GET', `/health/vital-signs/today?patient_id=${patientId}`, null, token);
console.log(' 状态:', todayRes2.status, todayRes2.data?.success ? 'OK' : 'FAIL');
if (todayRes2.status === 200 && todayRes2.data?.success) {
console.log(' 返回数据:', JSON.stringify(todayRes2.data.data || {}).substring(0, 200));
} else {
console.log(' 响应:', JSON.stringify(todayRes2.data).substring(0, 300));
}
// 5. 验证趋势 API
console.log('\n5. 趋势 API 验证...');
const trendRes = await request('GET', '/health/vital-signs/trend?indicator=weight&range=7d', null, token);
console.log(' 状态:', trendRes.status, trendRes.data?.success ? 'OK' : 'FAIL');
// 6. 日常监测 API 验证
console.log('\n6. 日常监测 API 验证...');
const dmRes = await request('POST', '/health/daily-monitoring', {
patient_id: patientId,
record_date: new Date().toISOString().slice(0, 10),
weight: 999, // 超出合理范围,验证后端校验
}, token);
console.log(' 状态:', dmRes.status);
// 后端应该接受或拒绝(取决于后端校验强度)
if (dmRes.status >= 400) {
console.log(' 后端拒绝了请求(预期:应有范围校验):', JSON.stringify(dmRes.data).substring(0, 200));
} else {
console.log(' 后端接受了请求:', dmRes.data?.success ? 'OK' : 'FAIL');
}
console.log('\n=== 验证完成 ===');
}
main().catch((e) => {
console.error('验证失败:', e.message);
process.exit(1);
});