/** * ================================================================ * 批量发布五维维度文章 E2E 测试 * ================================================================ * 目标:通过管理后台 API 批量创建并发布 15 篇文章 * 五个维度(身/心/智/行/富)各 3 篇 * 部署地址:http://cfc.iwintrue.com * * 流程: * 1. 登录管理后台获取 token * 2. 调用 /api/admin/articles/create 创建文章 * 3. 调用 /api/admin/articles/publish 发布 * 4. 验证每篇文章创建成功 * * 前置条件:admin 账号已存在(admin / admin123) * ================================================================ */ const { test, expect } = require('@playwright/test'); const BASE_URL = 'http://cfc.iwintrue.com'; // ============ 15 篇文章数据 ============ const DIMENSION_ARTICLES = [ // ===== 身 (Body) ===== { title: '孩子过敏反复不好,根源可能在肠道', summary: '很多家长不知道,反复的过敏症状根源很可能不在皮肤或鼻子,而在肠道。本文从肠道菌群角度解析过敏根源,提供从"对症治疗"到"对因调理"的科学方案。', content: `

一、为什么过敏和肠道有关系?

人体约70%的免疫细胞分布在肠道,肠道是人体最大的免疫器官。肠道内生活着数以万亿计的微生物——肠道菌群,它们与免疫系统形成了精密的对话机制。

当肠道菌群处于健康平衡状态时,免疫系统能够准确区分"朋友"和"敌人"。但当菌群失衡——有益菌减少、有害菌过度繁殖——肠道屏障功能就会受损,出现俗称的"肠漏"(Leaky Gut)

🔬 科学事实:发表在《Nature Communications》上的研究显示,过敏儿童与健康儿童的肠道菌群组成存在显著差异,过敏儿童的菌群多样性明显偏低。

二、儿童过敏的常见表现

婴幼儿期(0-3岁):湿疹、反复尿布疹、皮肤干燥瘙痒;频繁吐奶、腹泻、便秘;反复喘息、咳嗽。

学龄前期(3-6岁):过敏性鼻炎、哮喘或咳嗽变异性哮喘、皮肤湿疹持续或反复。

学龄期(6岁以上):过敏性鼻炎加重、支气管哮喘、食物过敏。

三、从"对症治疗"到"对因调理"

传统过敏治疗以"对症"为主——湿疹抹药膏、鼻炎喷激素。这些方法可以暂时控制症状,但无法解决根本问题。基于肠道菌群-免疫-过敏三角关系,现代过敏管理思路正在转向"对因调理"

四、科学调理四步走

第一步:消除破坏因素 — 减少精制糖和加工食品,避免不必要的抗生素。

第二步:重建菌群平衡 — 增加膳食纤维摄入,针对性补充益生菌。

第三步:修复肠道屏障 — 谷氨酰胺、锌、维生素D、Omega-3脂肪酸。

第四步:维持健康生活方式 — 规律作息、适度运动、减少压力。

💡 关键提示:每个孩子的菌群状况都是独特的。这正是菌群检测的核心价值——为每个孩子提供真正个性化的精准方案。

`, tags: '过敏,肠道菌群,免疫力,儿童健康', readTime: 8, categoryId: 1, dimension: 'body', difficultyLevel: 2 }, { title: '儿童免疫力提升3大关键步骤', summary: '免疫力是孩子最好的"医生"。本文从营养、睡眠、运动三个维度,为家长提供科学可操作的儿童免疫力提升方案。', content: `

一、营养——免疫系统的"燃料"

均衡的营养是免疫系统正常运作的基础。蛋白质、维生素A、维生素C、维生素D、锌、铁等营养素的充足摄入,直接关系到免疫细胞的活性和数量。

关键营养素清单:

二、睡眠——免疫系统的"修复时间"

睡眠不足会直接影响免疫细胞的活性。深度睡眠时,人体会分泌更多的细胞因子,这些蛋白质是免疫系统对抗感染的"武器"。

不同年龄段推荐睡眠时间:3-5岁:10-13小时;6-13岁:9-11小时;14-17岁:8-10小时。

三、运动——免疫系统的"激活开关"

适度的运动可以促进免疫细胞的循环,提高免疫系统的"巡逻"效率。每天至少60分钟的户外活动,不仅能增强免疫力,还能促进维生素D的合成。

💡 温馨提示:免疫力不是越强越好。平衡才是关键。过度保护的环境反而可能让免疫系统"训练不足"。

`, tags: '免疫力,营养,睡眠,运动,儿童健康', readTime: 6, categoryId: 1, dimension: 'body', difficultyLevel: 2 }, { title: '肠道菌群与营养吸收的奥秘', summary: '肠道菌群被称为人体的"第二基因组",它们不仅影响消化吸收,更深刻影响着孩子的生长发育、免疫力和甚至情绪。', content: `

一、肠道菌群——看不见的"器官"

人体肠道内居住着超过100万亿个微生物,种类超过1000种,总重量约1.5公斤。它们共同构成了肠道菌群,被称为人体的"第二基因组"

二、菌群如何影响营养吸收

肠道菌群在营养吸收中扮演着至关重要的角色:

三、菌群失衡的信号

当孩子出现以下情况时,可能是肠道菌群失衡的信号:消化不良、便秘或腹泻、反复过敏、免疫力低下、睡眠不安、情绪波动。

四、如何维护健康的肠道菌群

1. 多样化的饮食:摄入多种类食物,为不同菌群提供丰富的营养来源。

2. 富含膳食纤维的食物:全谷物、豆类、蔬菜、水果。

3. 发酵食品:无糖酸奶、酸菜、纳豆等天然富含益生菌的食物。

4. 减少不必要的抗生素使用:抗生素会无差别杀伤肠道菌群。

🌟 核心观点:健康的肠道菌群是孩子健康成长的基础。从小维护肠道健康,就是在为孩子的未来健康"投资"。

`, tags: '肠道菌群,营养吸收,消化,益生菌', readTime: 7, categoryId: 1, dimension: 'body', difficultyLevel: 3 }, // ===== 心 (Mind) ===== { title: '儿童情绪管理:从认知到调节', summary: '情绪管理能力是孩子未来幸福力的基石。本文帮助家长理解儿童情绪发展的规律,掌握科学的情绪引导方法。', content: `

一、认识儿童的情绪世界

孩子的情绪不是"无理取闹",而是他们表达需求和感受的自然方式。3-6岁的孩子正处于情绪认知的关键期,他们需要成人的帮助来识别、命名和调节自己的情绪。

二、情绪管理三步法

第一步:识别情绪 — 帮助孩子给自己的情绪"贴标签"。"你现在很生气,因为积木倒了,对吗?"

第二步:接纳情绪 — 让孩子知道所有情绪都是正常的。"生气是可以的,每个人都有生气的时候。"

第三步:调节情绪 — 教给孩子具体的情绪调节策略。深呼吸、数到十、画画、运动、寻求拥抱。

三、家长的"情绪教练"角色

家长是孩子最好的情绪教练。当家长能够冷静面对自己的情绪,用温和而坚定的方式引导孩子时,孩子就在潜移默化中学习情绪管理。

💡 实用技巧:创建"冷静角"——在家里的一个角落放上柔软的靠垫、绘本和减压玩具,当孩子情绪激动时,可以邀请TA去冷静角"休息一下"。

`, tags: '情绪管理,儿童心理,情商,亲子沟通', readTime: 6, categoryId: 2, dimension: 'mind', difficultyLevel: 2 }, { title: '如何培养孩子的安全感', summary: '安全感是儿童心理健康发展的基石。有安全感的孩子更勇于探索世界,更能建立健康的人际关系。', content: `

一、什么是安全感?

安全感是儿童对环境和人际关系的基本信任感。有安全感的孩子相信:我是被爱的、我是有价值的、这个世界是安全的。这种感觉来源于早期与主要照顾者之间的稳定、可预测的互动。

二、安全感的形成关键期

0-1岁:信任 vs 不信任。当孩子的需求(饥饿、不适、害怕)得到及时、一致的回应时,信任感就开始建立。

1-3岁:自主 vs 羞怯。在安全的环境中适度探索,孩子发展出自主感和自信心。

3-6岁:主动 vs 内疚。被鼓励尝试新事物、被允许犯错的孩子,更勇于主动探索。

三、培养安全感的日常实践

1. 高质量的陪伴:每天15-20分钟的"专属时间",放下手机,全身心关注孩子。

2. 一致性的回应:对孩子的情绪和需求保持一致的回应方式,建立可预测的环境。

3. 温和而坚定的界限:安全不是无原则的放纵,而是在明确的界限内给予自由。

4. 接纳不完美:允许孩子犯错,也允许自己做"足够好"的父母。

🌟 关键认识:安全感不是"宠"出来的,而是在充满爱和规则的环境中自然生长的。

`, tags: '安全感,儿童心理,亲子关系,依恋', readTime: 7, categoryId: 2, dimension: 'mind', difficultyLevel: 2 }, { title: '家庭氛围对孩子心理健康的影响', summary: '家庭是孩子心理成长的第一环境。良好的家庭氛围是孩子心理健康最有力的保护因素。', content: `

一、家庭氛围的"隐形力量"

家庭氛围就像空气——看不见、摸不着,却无时无刻不在影响着孩子的心理发展。研究表明,家庭氛围对儿童心理健康的影响甚至大于物质条件和教育资源。

二、三种家庭氛围类型

温暖型家庭:成员之间相互尊重、支持、沟通顺畅。孩子在这种环境中更容易形成积极、自信、友善的性格。

冲突型家庭:频繁的争吵、冷战、指责。孩子容易产生焦虑、抑郁、行为问题。

冷漠型家庭:成员之间缺乏情感交流,各自为政。孩子可能感到孤独、不被关注。

三、营造积极家庭氛围的实践

1. 定期的家庭仪式:每周一次家庭游戏夜、每月一次家庭会议,创造共同的积极体验。

2. 积极的沟通模式:多使用"我感受"句式("我感到开心当你……"),少用"你总是"指责句式。

3. 夫妻关系优先:和谐的夫妻关系是给孩子最好的心理礼物。

4. 允许表达负面情绪:家庭成员可以安全地表达愤怒、悲伤、失望,而不被评判。

💡 记住:完美的家庭不存在,但"足够好"的家庭氛围足以滋养孩子健康成长。

`, tags: '家庭氛围,心理健康,亲子关系,家庭教育', readTime: 6, categoryId: 2, dimension: 'mind', difficultyLevel: 2 }, // ===== 智 (Wisdom) ===== { title: '培养孩子成长型思维的5个方法', summary: '成长型思维是孩子面对挑战、持续进步的核心心理素质。本文提供5个实用方法,帮助家长在日常教育中培养孩子的成长型思维。', content: `

什么是成长型思维?

斯坦福大学心理学教授卡罗尔·德韦克提出的成长型思维(Growth Mindset)认为:智力不是固定不变的,而是可以通过努力和学习不断发展的。与之相对的是固定型思维——认为自己的能力是天生注定的。

5个培养方法

方法1:表扬努力而非聪明

不要说"你真聪明",而要说"我看到你很努力,这个方法很好"。表扬过程而非结果,让孩子明白努力比天赋更重要。

方法2:把"我不会"改成"我还不会"

简单的语言改变,传递的是"能力可以增长"的信念。"我还不会"暗示着通过学习就可以掌握。

方法3:拥抱失败,把它当"学习的机会"

当孩子失败时,不是批评或安慰"没关系",而是一起分析:"这次我们学到了什么?下次可以怎么做?"

方法4:设立"挑战目标"而非"表现目标"

鼓励孩子设立挑战自己的目标("我要比上次进步"),而不是和别人比较的目标("我要考第一")。

方法5:示范成长型思维

家长自己面对困难时的态度,是孩子最好的教材。在孩子面前说"这个有点难,但我可以试试看",而不是"这个我不行"。

`, tags: '成长型思维,教育方法,学习力,自信心', readTime: 7, categoryId: 4, dimension: 'wisdom', difficultyLevel: 2 }, { title: '注意力不集中,先查肠道再谈训练', summary: '孩子上课走神、做作业拖拉,很多家长第一时间想到"专注力训练"。但你知道吗?注意力问题和肠道健康密切相关。', content: `

一、一个常被忽视的视角

"老师反映孩子上课总是走神"、"写作业10分钟就坐不住了"——面对这些问题,家长的第一反应往往是"专注力训练"或者"是不是有多动症"。

但你可能不知道,肠道菌群失衡也可能是注意力问题的"幕后推手"。

二、脑肠轴:肠道和大脑的"秘密通道"

肠道和大脑之间通过"脑肠轴"(Gut-Brain Axis)紧密相连。肠道菌群通过以下途径影响大脑功能:

三、综合调理方案

1. 排查肠道健康:如果孩子有消化不良、便秘、过敏等问题,建议先关注肠道健康。

2. 优化饮食习惯:减少精制糖和添加剂,增加富含膳食纤维的食物。

3. 保证充足睡眠:睡眠不足会严重影响前额叶功能,降低注意力水平。

4. 科学进行专注力训练:在肠道健康的基础上,结合专业的专注力训练方法。

🌟 整体视角:注意力是一个系统工程——身体、情绪、环境、营养都会影响它。从肠道入手,找到根源,才是真正的解决之道。

`, tags: '注意力,脑肠轴,肠道菌群,专注力,学习', readTime: 6, categoryId: 5, dimension: 'wisdom', difficultyLevel: 3 }, { title: '高效学习的科学方法', summary: '不是孩子不努力,而是方法没用对。本文从认知科学角度,分享经过验证的高效学习方法,帮助孩子学得更轻松、更有效。', content: `

一、为什么有些孩子学得快?

学习效率的差异,很大程度上源于学习方法的差异。认知科学研究发现,高效学习并非依靠"天赋",而是遵循大脑的学习规律。

二、4个科学学习方法

方法1:间隔重复(Spaced Repetition)

与其一次性长时间学习,不如把学习分散到不同时间段。大脑在"遗忘-回忆"的过程中,记忆会更加牢固。推荐使用"1-3-7"法则:学习后1天、3天、7天各复习一次。

方法2:主动回忆(Active Recall)

阅读不是最好的学习方式。合上书,尝试回忆刚才学过的内容——这个过程才是真正的学习。研究表明,主动回忆的效果远超被动阅读。

方法3:费曼学习法

尝试用最简单的语言,把学到的知识讲给别人听。如果你能用通俗的语言解释清楚,说明你是真的理解了。

方法4:交错练习(Interleaving)

不要长时间练习同一类题目,而是混合不同类型的问题。虽然感觉更难,但学习效果更好。

💡 给家长的建议:帮助孩子建立"学习日志",记录每天学到的新知识和疑问。这既是主动回忆的过程,也是培养元认知能力的有效工具。

`, tags: '学习方法,认知科学,高效学习,记忆力', readTime: 7, categoryId: 4, dimension: 'wisdom', difficultyLevel: 3 }, // ===== 行 (Action) ===== { title: '如何帮助孩子建立良好习惯', summary: '习惯决定命运。本文从行为心理学角度,提供一套系统的方法论,帮助家长科学地培养孩子的良好习惯。', content: `

一、习惯的形成机制

习惯的形成遵循"提示→渴求→回应→奖赏"的四步循环。理解这个循环,就能科学地设计习惯培养方案。

二、培养习惯的4个法则

法则1:让习惯显而易见

将新习惯与已有的日常活动绑定。例如:"刷牙之后就读10分钟书"——利用已有习惯作为新习惯的"触发器"。

法则2:让习惯有吸引力

将"应该做的事"与"喜欢做的事"结合。例如:一边听喜欢的音频故事,一边整理房间。

法则3:让习惯简单易行

从"微习惯"开始——每天只做2分钟。想要培养阅读习惯?先从"每天读一页书"开始。一个行动一旦开始,继续下去就会容易得多。

法则4:让习惯令人愉悦

即时奖励是习惯养成的关键。完成一个小习惯后,给自己一个即时的正面反馈。使用浠艾福的任务积分系统就是一个很好的方式。

三、21天养成习惯?

研究表明,习惯养成的时间不是固定的21天,而是因人而异、因习惯而异。简单的习惯可能在18天左右形成,复杂的习惯可能需要254天。重要的是坚持,而不是追求速度。

`, tags: '习惯养成,行为心理学,自律,微习惯', readTime: 6, categoryId: 3, dimension: 'action', difficultyLevel: 2 }, { title: '亲子沟通的艺术——从"说话"到"对话"', summary: '很多亲子冲突源于沟通方式的问题。本文分享实用的沟通技巧,帮助家长从"说教"转向真正的"对话"。', content: `

一、为什么沟通这么难?

"我跟孩子说了多少遍了,他就是不听!"这是很多家长的困扰。但问题往往不在于"说了多少遍",而在于"怎么说"。

二、从"说教"到"对话"的转变

传统说教模式:家长说→孩子听→孩子服从或者反抗

对话模式:家长倾听→理解孩子的视角→共同寻找解决方案

三、实用沟通技巧

1. 积极倾听:放下手中的事情,眼神接触,点头回应。不要急着给建议,先让孩子把话说完。

2. "我信息"表达法:用"我感到……因为……"代替"你总是……"。例如:"我感到有点着急,因为我们约定的时间快到了"而不是"你总是这么拖拉"。

3. 选择权:给孩子有限的选择。"你想先做数学作业还是先背单词?"——这比"赶紧去做作业"有效得多。

4. 描述而非评价:说"我看到地上有玩具"而不是"你怎么又把玩具扔得到处都是"。

💡 日常练习:每天找一个"黄金10分钟"——在孩子睡前或放学路上,用开放式的提问开启对话:"今天有什么想和我分享的吗?"

`, tags: '亲子沟通,家庭教育,倾听,对话技巧', readTime: 6, categoryId: 3, dimension: 'action', difficultyLevel: 2 }, { title: '从"要我学"到"我要学"——自驱力培养指南', summary: '内在驱动力是孩子持续学习成长的真正动力。本文从自我决定理论出发,解析如何培养孩子的自主感和内在动机。', content: `

一、什么是自驱力?

自驱力(Intrinsic Motivation)是指个体出于兴趣和内在满足感而从事某项活动的动力,而非因为外部奖励或压力。有自驱力的孩子学习是因为"我想学",而不是"爸妈让我学"。

二、自驱力的3个核心要素

根据自我决定理论(Self-Determination Theory),内在动机的养成需要满足三个基本心理需求:

自主感(Autonomy):孩子感觉自己有选择权和主动权。即使是有限的选择,也能显著提升内在动机。

胜任感(Competence):孩子相信自己有能力完成某件事。适度的挑战和正向的反馈是建立胜任感的关键。

归属感(Relatedness):孩子感觉到被接纳、被理解。良好的亲子关系和师生关系是自驱力的"安全基地"。

三、培养自驱力的实践

1. 减少外部控制:减少"如果你做……就给你……"的交换式激励。过多外部奖励会削弱内在动力。

2. 提供有意义的理由:当必须做某件事时,解释为什么这件事是重要的、有意义。

3. 关注过程而非结果:问"今天学到了什么?"而不是"考了多少分?"

4. 允许自主安排:在合理范围内,让孩子自己安排学习时间和顺序。

🌟 关键词:自驱力不是培养出来的,而是被保护出来的。每个孩子天生都有探索和学习的内在动力,家长的责任是不要用外部的压力扼杀了它。

`, tags: '自驱力,内在动机,自主学习,教育理念', readTime: 7, categoryId: 4, dimension: 'action', difficultyLevel: 2 }, // ===== 富 (Wealth) ===== { title: '儿童财商教育从几岁开始?', summary: '财商教育不是让孩子"认识钱",而是帮他们建立正确的金钱观和价值观。不同年龄段的孩子适合不同的财商启蒙方式。', content: `

一、为什么要进行财商教育?

财商(Financial Quotient)与智商、情商并列为现代社会三大素质。从小进行财商教育,帮助孩子建立正确的金钱观、消费观和价值观,是送给孩子受益终身的礼物。

二、分龄财商教育指南

3-5岁:认识钱的概念

认识不同面额的硬币和纸币,理解"钱是用来买东西的"。通过"过家家"游戏模拟购物场景。

6-8岁:学习"等待"和"选择"

理解"想要"和"需要"的区别。学会为了更大的目标而放弃眼前的满足。零花钱制度可以开始引入。

9-12岁:钱的管理与计划

学习记账,了解收入、支出、储蓄的概念。可以设立"三个罐子"——消费罐、储蓄罐、分享罐。

13岁以上:探索"创造价值"

通过打工、创业等实践理解"钱是通过创造价值获得的"。学习基本的投资概念。

三、家庭财商教育的基本原则

1. 用生活教,不说教:去超市购物、交水电费、计划旅行预算——日常生活是最好的财商教室。

2. 给零花钱,更要教管理:零花钱是教育的工具,不是奖励或惩罚的手段。

3. 谈钱不避讳:让孩子参与家庭财务话题的讨论(适龄范围内),理解金钱在生活中的角色。

`, tags: '财商教育,零花钱,金钱观,儿童理财', readTime: 6, categoryId: 1, dimension: 'wealth', difficultyLevel: 2 }, { title: '压岁钱怎么管——孩子的第一堂理财课', summary: '每年春节后的压岁钱,是进行财商教育的绝佳机会。本文提供实用的压岁钱管理方案,让压岁钱成为孩子学习理财的第一课。', content: `

一、压岁钱——被忽视的教育资源

春节过后,孩子们往往会收到一笔不小的压岁钱。很多家长选择"代为保管"或者直接存入银行。但压岁钱其实是绝佳的财商教育素材——它真实、及时、有情感连接。

二、"四罐法"压岁钱管理

将压岁钱分为四个"罐子",每个罐子有明确的用途和比例:

1. 消费罐(30%):可以自由支配的钱——买喜欢的玩具、零食、文具。让孩子体验自主消费的乐趣和后果。

2. 储蓄罐(40%):存起来实现较大目标的钱——买一件较贵的物品、为未来准备。让孩子体会"等待"的价值。

3. 投资罐(20%):让钱"工作"的钱——可以存入银行或货币基金,和孩子一起观察利息的增长。

4. 分享罐(10%):帮助他人的钱——给家人买礼物、捐赠给需要帮助的人。培养孩子的同理心和社会责任感。

三、家长的角色

家长不是"管理者",而是"指导者"。和孩子一起制定压岁钱计划,定期回顾执行情况,在必要时给予建议而不是命令。

💡 关键原则:允许孩子犯错。10块钱买了一个"后悔"的玩具,损失很小但教训很深刻。小时候犯错成本低,是为了长大后不犯大错。

`, tags: '压岁钱,理财教育,财商,储蓄,消费', readTime: 5, categoryId: 1, dimension: 'wealth', difficultyLevel: 1 }, { title: '如何跟孩子谈钱——家庭财商教育指南', summary: '很多家长觉得和孩子"谈钱"很尴尬。本文提供系统的家庭财商教育框架,帮助家长自然、科学地开展金钱教育。', content: `

一、为什么要和孩子谈钱?

金钱是生活中不可或缺的一部分。回避"谈钱"并不会让孩子对金钱有正确的认识,反而可能让他们从其他不可靠的渠道获取信息。在家庭中开放、健康地讨论金钱,是财商教育的基础。

二、家庭财商教育的三根支柱

1. 劳动创造价值

让孩子理解钱不是从"取款机"里冒出来的,而是通过劳动和创造价值获得的。鼓励孩子参与家务并获得零花钱,或者通过自己的创意(如手工艺品)创造价值。

2. 预算和计划

教孩子做简单的预算。例如:去超市前列出购物清单,预算总金额。这帮助孩子理解"资源有限,需要合理分配"。

3. 延迟满足

"今天的一颗糖 vs 明天的一盒糖"——通过具体的场景让孩子理解延迟满足的概念。研究表明,能够延迟满足的孩子在未来更容易成功。

三、不同场景的"谈钱"技巧

逛超市时:"我们今天有100元的预算,你来帮妈妈算算怎么买最合理?"

收到礼物时:"送礼物是表达爱的方式,比花钱多少更重要。"

遇到广告时:"广告说这个玩具最好玩,你觉得是真的吗?为什么?"——培养批判性消费思维。

🌟 核心理念:财商教育不是教孩子"省钱"或"赚钱",而是教他们做一个有责任感、有判断力、有规划能力的"金钱管理者"。

`, tags: '财商,金钱观,家庭教育,价值观', readTime: 6, categoryId: 1, dimension: 'wealth', difficultyLevel: 2 } ]; // ============ 工具函数 ============ /** * 通过 API 登录 admin 并注入 localStorage * 绕过滑块验证码,直接调用 POST /api/admin-auth/login-by-password * 默认管理员: 手机号 13800138000, 密码 admin123 (DatabaseInitializer 创建) */ async function loginAdminViaAPI(page) { const res = await page.evaluate(async ({ apiBase }) => { try { const resp = await fetch(apiBase + '/api/admin-auth/login-by-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: '13800138000', password: 'admin123' }) }); return await resp.json(); } catch (e) { return { code: 500, message: e.message }; } }, { apiBase: BASE_URL }); if (res && res.code === 200 && res.data && res.data.token) { // 注入 localStorage await page.evaluate((data) => { localStorage.setItem('token', data.token); localStorage.setItem('adminId', data.adminId || ''); localStorage.setItem('adminName', data.realName || 'admin'); localStorage.setItem('role', data.role || 'admin'); localStorage.setItem('roles', JSON.stringify(data.roles || [data.role || 'admin'])); }, res.data); return res.data.token; } // API 失败时回退到 UI 登录 return await loginAdminViaUI(page); } /** * 通过 UI 登录(回退方案) * Login.vue 路由: /login,默认管理员手机号 13800138000 */ async function loginAdminViaUI(page) { await page.goto('/login', { waitUntil: 'networkidle', timeout: 30000 }); await page.waitForTimeout(2000); // 绕过滑块验证码: Vue 组件设置 captchaPassed await page.evaluate(() => { const sliderCaptcha = document.querySelector('.slider-captcha'); const loginForm = document.querySelector('.login-form'); if (sliderCaptcha) { // 尝试触发 captcha 验证通过 const captchaComponent = sliderCaptcha.__vue__; if (captchaComponent && captchaComponent.onSuccess) { captchaComponent.onSuccess(); } } // 直接移除 el-button disabled document.querySelectorAll('.el-button').forEach(btn => { if (btn.textContent.includes('登')) { btn.disabled = false; } }); }); await page.waitForTimeout(500); // 账号输入框(填手机号 13800138000) const inputs = page.locator('input'); const count = await inputs.count(); if (count > 0) { await inputs.first().fill('13800138000'); if (count > 1) { await inputs.nth(1).fill('admin123'); } } // 密码输入框 const pwdInputs = page.locator('input[type="password"]'); if (await pwdInputs.count() > 0) { await pwdInputs.first().fill('admin123'); } await page.waitForTimeout(500); // 触发 captchaPassed(Vue2 组件注入) await page.evaluate(() => { const app = document.querySelector('#app'); if (app && app.__vue__) { function findCaptcha(vm) { if (vm.captchaPassed !== undefined) { vm.captchaPassed = true; return true; } if (vm.$children) { return vm.$children.some(findCaptcha); } return false; } findCaptcha(app.__vue__); } }); await page.waitForTimeout(300); // 点击登录 const loginBtn = page.locator('.login-btn, .el-button--primary, button[type="submit"]'); if (await loginBtn.first().isVisible({ timeout: 3000 }).catch(() => false)) { await loginBtn.first().click(); } // 等待登录完成 await page.waitForTimeout(5000); const token = await page.evaluate(() => localStorage.getItem('token')); return token; } /** * 通过 API 创建文章 */ async function createArticle(page, token, article) { const { title, summary, content, tags, readTime, categoryId, dimension, difficultyLevel } = article; const payload = { title, content, summary, tags, categoryId, contentType: 'article', visibility: 'public', author: '亿图腾·浠艾福', readTime: readTime || 6, difficultyLevel: difficultyLevel || 2, relatedDimensions: [dimension], status: 'published' }; const res = await page.evaluate(async ({ apiBase, token, payload }) => { try { const resp = await fetch(apiBase + '/api/admin/articles/create', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify(payload) }); return await resp.json(); } catch (e) { return { code: 500, message: e.message }; } }, { apiBase: BASE_URL, token, payload }); return res; } // ============ 测试 ============ test.describe('【批量发布】五维维度文章', () => { test('登录admin并批量发布15篇五维文章', async ({ page }) => { test.setTimeout(300000); // 先打开一个页面,确保 page context 可用 await page.goto('/login', { waitUntil: 'domcontentloaded', timeout: 30000 }); const token = await loginAdminViaAPI(page); expect(token).toBeTruthy(); console.log('✅ 已通过API登录获取JWT token'); // 3. 批量创建文章 const results = []; for (let i = 0; i < DIMENSION_ARTICLES.length; i++) { const article = DIMENSION_ARTICLES[i]; const dimLabel = { body: '身', mind: '心', wisdom: '智', action: '行', wealth: '富' }[article.dimension] || article.dimension; const res = await createArticle(page, token, article); const success = res && res.code === 200; const articleId = res?.data?.id || '-'; results.push({ index: i + 1, dim: dimLabel, title: article.title, success, articleId }); console.log(` [${i + 1}/15] [${dimLabel}] ${success ? '✅' : '❌'} ${article.title} → ID=${articleId}`); expect(success).toBeTruthy(); } // 4. 输出汇总 const successCount = results.filter(r => r.success).length; console.log(`\n📊 汇总: ${successCount}/${results.length} 篇文章发布成功`); // 全部成功则通过 expect(successCount).toBe(15); }); });