/**
* 血透测试文章种子脚本
* 用法: node scripts/seed-dialysis-articles.mjs
* 删除现有文章,创建 4 篇血透相关的富文本文章(published 状态)
*/
const BASE = 'http://localhost:3000/api/v1';
const LOGIN = { username: 'admin', password: 'Admin@2026' };
const W = 'data-w-e-type="styled-block"';
const P = '#C4623A'; // primary
const PL = '#F0DDD4'; // primaryLight
function applyColor(html) {
return html.replaceAll('{{primary}}', P).replaceAll('{{primaryLight}}', PL);
}
const articles = [
{
title: '血透患者日常饮食管理指南',
summary: '科学的饮食管理是维持性血液透析患者保持良好营养状态、减少并发症的关键。本文详细介绍了血透患者的饮食原则、各类营养素的摄入建议以及实用的饮食搭配技巧。',
sort_order: 1,
content: [
`
血液透析患者在治疗过程中,合理的饮食管理不仅有助于维持良好的营养状态,还能有效减少透析并发症的发生。以下是一份全面的饮食管理指南,帮助您更好地控制饮食。
`,
applyColor(`一、蛋白质摄入管理
`),
`透析患者需要适量增加蛋白质摄入,以弥补透析过程中的蛋白质丢失。推荐每日蛋白质摄入量为 1.0-1.2 g/kg体重,其中优质蛋白质应占50%以上。
`,
applyColor(``),
applyColor(`✓ 推荐食物:鸡蛋清、鱼肉、瘦肉、牛奶、豆腐等优质蛋白来源。
`),
applyColor(`✕ 限制食物:减少植物蛋白(如豆类制品过量)摄入,避免高嘌呤食物。
`),
applyColor(``),
applyColor(`二、钾的控制
`),
`高钾血症是透析患者常见的危及生命的并发症。透析间期血钾应控制在 3.5-5.5 mmol/L。
`,
applyColor(``),
applyColor(`⚠ 注意事项:高钾水果(香蕉、橙子、猕猴桃)需严格控制摄入量。蔬菜可通过水煮去钾处理后再食用。
`),
applyColor(``),
applyColor(`三、水分控制
`),
`透析间期体重增长应控制在干体重的 3%-5% 以内。每日液体摄入量一般为前一日尿量加 500ml。
`,
applyColor(``),
applyColor(`"
透析间期体重增长不超过干体重的5%,是减少心血管并发症的重要措施。
—— KDIGO 指南建议
`),
applyColor(``),
applyColor(`四、磷的管理
`),
`高磷血症可导致继发性甲状旁腺功能亢进和血管钙化。每日磷摄入量应控制在 800-1000mg,并遵医嘱服用磷结合剂。
`,
applyColor(``),
applyColor(`★ 温馨提示:以上饮食建议仅供参考,具体饮食方案请遵医嘱。如有不适请及时联系您的主治医生。
`),
].join(''),
},
{
title: '血液透析治疗流程全解析',
summary: '了解血液透析的完整治疗流程,从透析前准备到透析后护理,帮助患者和家属全面认识透析治疗过程,减少焦虑,提高治疗依从性。',
sort_order: 2,
content: [
`血液透析(Hemodialysis, HD)是目前治疗急慢性肾衰竭最常用的肾脏替代治疗方法之一。本文将详细解析一次完整的血液透析治疗流程。
`,
applyColor(`透析治疗完整流程
`),
applyColor(`透析当天 · 到达前
穿宽松衣物,带好透析卡和药物,测量体重
透析进行中(4小时)
持续监测血压、心率,注意有无不适
透析后观察
休息15-30分钟,确认无头晕出血后再离开
`),
applyColor(``),
applyColor(`透析参数与监测
`),
`标准的血液透析治疗通常每次持续 4小时,每周进行 3次。治疗过程中需要持续监测多项参数。
`,
applyColor(`参数
标准值
说明
血流量
200-300 ml/min
因人而异
透析液流量
500 ml/min
标准设置
超滤量
个体化制定
根据体重增长
治疗时间
4 小时
每次标准
`),
applyColor(`ℹ 补充说明:透析充分性评估通常使用 Kt/V 值,目标值应 ≥ 1.2。您的医生会定期检查此项指标。
`),
applyColor(`Q:透析过程中可以进食吗?
A:可以少量进食,但建议选择易消化的食物。避免过饱进食,以防低血压。透析中进食还可以预防低血糖的发生。
`),
applyColor(`Q:透析后为什么会感到疲乏?
A:透析后疲乏是常见现象,主要与体液变化、电解质调整和代谢废物清除有关。建议透析后适当休息,保证充足睡眠。
`),
].join(''),
},
{
title: '血透患者血管通路的护理要点',
summary: '血管通路被称为血透患者的"生命线",正确的护理至关重要。本文介绍动静脉内瘘和中心静脉导管的日常护理方法,帮助您延长通路使用寿命。',
sort_order: 3,
content: [
`血管通路是血液透析治疗的基础,良好的血管通路是保证透析质量和患者安全的前提。保护好您的"生命线",从日常护理做起。
`,
applyColor(`动静脉内瘘(AVF)护理
`),
`动静脉内瘘是目前最理想的长期血管通路,平均使用寿命可达 5-10年。正确的日常护理能显著延长内瘘的使用寿命。
`,
applyColor(`1
每日自检
每天触摸内瘘部位,感受震颤("嗡嗡"感),如震颤消失需立即就医
2
避免压迫
不在内瘘侧手臂测量血压、抽血、输液或佩戴过紧饰品
4
保持清洁
透析前清洗内瘘侧手臂,保持穿刺部位清洁干燥
`),
applyColor(`✕ 严禁事项:内瘘侧手臂避免提重物(>5kg)、避免侧卧压迫、避免接触锐器。如发现震颤减弱或消失、局部红肿热痛,应立即就医。
`),
applyColor(``),
applyColor(`中心静脉导管(CVC)护理
`),
`中心静脉导管通常用于内瘘成熟前的过渡期或无法建立内瘘的患者。导管护理的核心是 预防感染 和 保持通畅。
`,
applyColor(``),
applyColor(`⚠ 注意事项:洗澡时必须用防水贴膜覆盖导管出口处。禁止在导管附近使用剪刀等锐器。如导管不慎脱出,立即压迫止血并急诊就医。
`),
applyColor(``),
applyColor(`★ 就医指征:以下情况需立即就医:① 震颤消失 ② 穿刺点持续出血 ③ 导管出口红肿渗液 ④ 内瘘部位出现搏动性包块 ⑤ 体温超过38°C
`),
].join(''),
},
{
title: '血液透析常见并发症及应对策略',
summary: '了解血液透析过程中可能出现的低血压、肌肉痉挛、失衡综合征等常见并发症的表现形式和应对方法,做到早识别、早处理。',
sort_order: 4,
content: [
`虽然血液透析是安全有效的治疗方式,但治疗过程中和治疗后可能出现一些并发症。了解这些并发症的表现和应对方法,有助于患者更好地配合治疗。
`,
applyColor(`1透析低血压
`),
`透析低血压是最常见的急性并发症,发生率约 20%-30%。表现为头晕、恶心、出冷汗、肌肉痉挛等。
`,
applyColor(``),
applyColor(`✓ 应对方法:立即降低超滤速度,采取头低脚高位,必要时补充生理盐水100-200ml。平时注意控制透析间期体重增长。
`),
applyColor(``),
applyColor(`2肌肉痉挛
`),
`多发生于透析后半程,以小腿和足部肌肉痉挛最常见,与超滤过快、低血压、低钠血症等因素有关。
`,
applyColor(`✓ 应对方法:减慢超滤速度,局部按摩热敷,补充高渗盐水或葡萄糖。日常补充维生素E和左旋卡尼汀可能有预防作用。
`),
applyColor(``),
applyColor(`3透析失衡综合征
`),
`主要见于首次透析或透析间隔过长的患者,由于血中尿素氮等溶质快速清除,导致脑组织与血液之间产生渗透压差。
`,
applyColor(`ℹ 临床表现:轻度表现为头痛、恶心、呕吐、烦躁不安;重度可出现意识障碍、抽搐甚至昏迷。预防关键是首次透析采用低血流量、短时间(2小时)的诱导透析方案。
`),
applyColor(``),
applyColor(`4透析相关发热
`),
`透析过程中或透析结束后出现的体温升高,需区分感染性和非感染性发热。
`,
applyColor(`类型
特点
处理
致热原反应
透析开始1-2h
对症处理
感染性
透析结束后
抗感染治疗
`),
applyColor(`Q:透析中出现不适应该怎么办?
A:立即告知医护人员,不要自行忍耐。医护人员会根据症状严重程度及时调整透析参数或给予对症处理。
`),
applyColor(`★ 紧急就医:如出现严重头痛伴呕吐、持续胸痛、呼吸困难、意识模糊、内瘘震颤消失、导管出口大量渗血渗液等严重情况,请立即拨打120或前往最近医院急诊。
`),
].join(''),
},
];
async function main() {
console.log('🔑 登录获取 Token...');
const loginRes = await fetch(`${BASE}/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(LOGIN),
});
const loginData = await loginRes.json();
const token = loginData.data.access_token;
if (!token) { console.error('登录失败:', loginData); process.exit(1); }
console.log('✅ 登录成功');
const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' };
// 删除现有文章
console.log('\n📋 获取现有文章...');
const listRes = await fetch(`${BASE}/health/articles?page=1&page_size=100`, { headers });
const listData = await listRes.json();
const existingArticles = listData.data?.items || [];
console.log(` 找到 ${existingArticles.length} 篇现有文章`);
for (const article of existingArticles) {
await fetch(`${BASE}/health/articles/${article.id}`, { method: 'DELETE', headers });
console.log(` 🗑 删除: ${article.title}`);
}
// 获取分类和标签
const [catsRes, tagsRes] = await Promise.all([
fetch(`${BASE}/health/article-categories`, { headers }),
fetch(`${BASE}/health/article-tags`, { headers }),
]);
const cats = (await catsRes.json()).data || [];
const tags = (await tagsRes.json()).data || [];
console.log(`\n📂 分类: ${cats.map((c) => c.name).join(', ') || '无'}`);
console.log(`🏷 标签: ${tags.map((t) => t.name).join(', ') || '无'}`);
// 创建文章
console.log('\n📝 创建血透测试文章...');
for (const article of articles) {
const createRes = await fetch(`${BASE}/health/articles`, {
method: 'POST',
headers,
body: JSON.stringify({
title: article.title,
summary: article.summary,
content: article.content,
content_type: 'rich_text',
sort_order: article.sort_order,
category_id: cats[0]?.id,
tag_ids: tags.slice(0, 2).map((t) => t.id),
}),
});
const created = await createRes.json();
if (!created.success) {
console.error(` ❌ 创建失败: ${article.title}`, created.message);
continue;
}
const articleId = created.data.id;
const version = created.data.version;
console.log(` ✅ 创建: ${article.title} (${articleId.slice(0, 8)}...)`);
// 提交审核
const submitRes = await fetch(`${BASE}/health/articles/${articleId}/submit`, {
method: 'POST',
headers,
body: JSON.stringify({ version }),
});
const submitted = await submitRes.json();
if (submitted.success) {
const newVersion = submitted.data.version;
console.log(` 📤 提交审核成功 (v${newVersion})`);
// 审核通过
const approveRes = await fetch(`${BASE}/health/articles/${articleId}/approve`, {
method: 'POST',
headers,
body: JSON.stringify({ version: newVersion }),
});
const approved = await approveRes.json();
if (approved.success) {
console.log(` ✅ 审核通过,已发布`);
} else {
console.error(` ❌ 审核失败:`, approved.message);
}
} else {
console.error(` ❌ 提交失败:`, submitted.message);
}
}
console.log('\n🎉 完成!4 篇血透测试文章已创建并发布。');
}
main().catch((e) => { console.error('脚本执行失败:', e); process.exit(1); });