feat: A1 短材料复现本单元理解词,并加入黑夜模式

课程内容
- 重写全部 21 个 A1 单元的听读材料,把本单元理解词织进听/读文本,
  单元内理解词复现率从约 20% 提升到约 77%(各单元 56–96%)。
- 修正 U01 房间号与机场大巴同为 thirty 的撞车(改为 17/30/40)。
- 校验器容差按级别读取(A1 为 8%),materials 覆盖率、字数、
  选项子串等校验全部通过;course_content_test 通过。

黑夜模式
- app_theme 拆分明/暗两套调色板,AppColors 随亮度切换;
  main 用 theme/darkTheme/themeMode + builder 镜像已解析亮度;
  主题偏好持久化到快照;进度页新增“外观主题”切换。

文档
- COURSE-PACK-JSON.md 更新 A1 词池覆盖(840/933)与材料复现约定。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-18 11:16:09 +09:00
co-authored by Claude Opus 4.8
parent 9ab08c25ef
commit febfd30f49
93 changed files with 72676 additions and 274 deletions
+935
View File
@@ -0,0 +1,935 @@
{
"schemaVersion": 1,
"id": "A1-U18",
"revision": 1,
"level": "A1",
"title": "药店与不舒服",
"categories": [
"日常",
"旅行"
],
"canDo": "说一个症状、听懂基本建议",
"status": "draft",
"meta": {
"draftedBy": "claude-opus-5",
"draftedAt": "2026-09-17",
"sources": [
"CEFR-J Vocabulary Profile 1.5",
"CEFR-J Grammar Profile 20180315"
],
"reviews": [],
"frozenAt": null
},
"names": [],
"grammar": [
{
"id": "59-2",
"use": "active"
},
{
"id": "60",
"use": "active",
"reason": "用 My head hurts 说哪里疼"
},
{
"id": "246",
"use": "active"
},
{
"id": "123",
"use": "active"
},
{
"id": "64",
"use": "receptive"
}
],
"coreItems": [
{
"id": "A1-U18-P01",
"type": "phrase",
"en": "I don't feel well.",
"zh": "我不舒服。",
"sceneWord": false,
"match": [
[
"don't feel well"
]
],
"example": {
"en": "I don't feel well today.",
"zh": "我今天不舒服。"
},
"review": {
"prompt": "告诉朋友你不舒服。"
}
},
{
"id": "A1-U18-P02",
"type": "phrase",
"en": "I have a headache.",
"zh": "我头疼。",
"sceneWord": false,
"match": [
[
"have a headache",
"have a fever",
"have a cold",
"have a stomachache",
"has a headache",
"has a fever",
"has a cold"
]
],
"example": {
"en": "I have a cold.",
"zh": "我感冒了。"
},
"review": {
"prompt": "说你发烧了。"
}
},
{
"id": "A1-U18-P03",
"type": "phrase",
"en": "My head hurts.",
"zh": "我头疼。",
"sceneWord": false,
"match": [
[
"hurts",
"hurt"
]
],
"example": {
"en": "My back hurts.",
"zh": "我背疼。"
},
"review": {
"prompt": "说你的腿疼。"
}
},
{
"id": "A1-U18-W01",
"type": "word",
"en": "sick",
"zh": "生病的",
"sceneWord": false,
"match": [
[
"sick"
]
],
"example": {
"en": "I feel sick.",
"zh": "我觉得恶心/不舒服。"
},
"review": {
"prompt": "说你的孩子生病了。"
}
},
{
"id": "A1-U18-W02",
"type": "word",
"en": "medicine",
"zh": "药",
"sceneWord": false,
"match": [
[
"medicine"
]
],
"example": {
"en": "I need some medicine.",
"zh": "我需要一些药。"
},
"review": {
"prompt": "说你需要买药。"
}
},
{
"id": "A1-U18-P04",
"type": "phrase",
"en": "Is there a pharmacy near here?",
"zh": "附近有药店吗?",
"sceneWord": true,
"sceneReason": "pharmacy 为 B1,但旅行中找药店时必需",
"match": [
[
"pharmacy"
]
],
"example": {
"en": "Where is the pharmacy?",
"zh": "药店在哪里?"
},
"review": {
"prompt": "在街上问附近有没有药店。"
}
},
{
"id": "A1-U18-P05",
"type": "phrase",
"en": "Do you have something for a headache?",
"zh": "有治头疼的药吗?",
"sceneWord": false,
"match": [
[
"something for"
]
],
"example": {
"en": "Do you have something for a cold?",
"zh": "有治感冒的药吗?"
},
"review": {
"prompt": "在药店问有没有治发烧的药。"
}
},
{
"id": "A1-U18-P06",
"type": "phrase",
"en": "How often do I take it?",
"zh": "这个药多久吃一次?",
"sceneWord": false,
"match": [
[
"how often"
]
],
"example": {
"en": "How often do I take this medicine?",
"zh": "这个药多久吃一次?"
},
"review": {
"prompt": "问药怎么吃。"
}
},
{
"id": "A1-U18-P07",
"type": "phrase",
"en": "Three times a day.",
"zh": "一天三次。",
"sceneWord": false,
"match": [
[
"times a day",
"once a day",
"twice a day"
]
],
"example": {
"en": "Take it two times a day.",
"zh": "一天吃两次。"
},
"review": {
"prompt": "说一天吃两次。"
}
},
{
"id": "A1-U18-P08",
"type": "phrase",
"en": "after meals",
"zh": "饭后",
"sceneWord": false,
"match": [
[
"after meals",
"before meals"
]
],
"example": {
"en": "Take it after meals.",
"zh": "饭后吃。"
},
"review": {
"prompt": "说这个药饭前吃。"
}
},
{
"id": "A1-U18-P09",
"type": "phrase",
"en": "I need to see a doctor.",
"zh": "我需要看医生。",
"sceneWord": false,
"match": [
[
"see a doctor"
]
],
"example": {
"en": "Can I see a doctor today?",
"zh": "我今天能看医生吗?"
},
"review": {
"prompt": "说你需要看医生。"
}
},
{
"id": "A1-U18-P10",
"type": "phrase",
"en": "I feel better now.",
"zh": "我现在好多了。",
"sceneWord": false,
"match": [
[
"feel better"
]
],
"example": {
"en": "Do you feel better?",
"zh": "你好点了吗?"
},
"review": {
"prompt": "告诉朋友你好多了。"
}
},
{
"id": "A1-U18-P11",
"type": "phrase",
"en": "Take care.",
"zh": "保重。",
"sceneWord": false,
"match": [
[
"take care"
]
],
"example": {
"en": "Take care and drink water.",
"zh": "保重,多喝水。"
},
"review": {
"prompt": "朋友生病了,跟他说保重。"
}
}
],
"receptiveWords": [
{
"id": "A1-U18-R01",
"en": "fever",
"zh": "发烧"
},
{
"id": "A1-U18-R02",
"en": "health",
"zh": "健康"
},
{
"id": "A1-U18-R03",
"en": "healthy",
"zh": "健康的"
},
{
"id": "A1-U18-R04",
"en": "body",
"zh": "身体"
},
{
"id": "A1-U18-R05",
"en": "arm",
"zh": "手臂"
},
{
"id": "A1-U18-R06",
"en": "leg",
"zh": "腿"
},
{
"id": "A1-U18-R07",
"en": "ear",
"zh": "耳朵"
},
{
"id": "A1-U18-R08",
"en": "nose",
"zh": "鼻子"
},
{
"id": "A1-U18-R09",
"en": "mouth",
"zh": "嘴"
},
{
"id": "A1-U18-R10",
"en": "neck",
"zh": "脖子"
},
{
"id": "A1-U18-R11",
"en": "shoulder",
"zh": "肩膀"
},
{
"id": "A1-U18-R12",
"en": "knee",
"zh": "膝盖"
},
{
"id": "A1-U18-R13",
"en": "heart",
"zh": "心脏"
},
{
"id": "A1-U18-R14",
"en": "nurse",
"zh": "护士"
},
{
"id": "A1-U18-R15",
"en": "breathe",
"zh": "呼吸"
},
{
"id": "A1-U18-R16",
"en": "once",
"zh": "一次"
},
{
"id": "A1-U18-R17",
"en": "stomach",
"zh": "胃"
},
{
"id": "A1-U18-R18",
"en": "pill",
"zh": "药片"
},
{
"id": "A1-U18-R19",
"en": "ill",
"zh": "生病的"
},
{
"id": "A1-U18-R20",
"en": "dentist",
"zh": "牙医"
},
{
"id": "A1-U18-R21",
"en": "toothache",
"zh": "牙疼"
},
{
"id": "A1-U18-R22",
"en": "blood",
"zh": "血"
},
{
"id": "A1-U18-R23",
"en": "twice",
"zh": "两次"
},
{
"id": "A1-U18-R24",
"en": "important",
"zh": "重要的"
},
{
"id": "A1-U18-R25",
"en": "yesterday",
"zh": "昨天"
},
{
"id": "A1-U18-R26",
"en": "still",
"zh": "仍然"
}
],
"segments": [
{
"id": "A1-U18-S1",
"title": "说哪里不舒服",
"minutes": 13,
"itemIds": [
"A1-U18-P01",
"A1-U18-P02",
"A1-U18-P03",
"A1-U18-W01",
"A1-U18-P09"
],
"listening": {
"text": "What's the matter? I don't feel well. I have a headache, and my neck hurts. I think I need to see a doctor.",
"question": "说话人哪里不舒服?",
"options": [
"头疼和脖子疼",
"发烧和胃疼",
"牙疼"
]
},
"speaking": [
{
"text": "I don't feel well."
},
{
"text": "I have a headache.",
"tip": "headache 读 /ˈhedeɪk/,ch 读 /k/"
},
{
"text": "My head hurts."
},
{
"text": "I feel sick."
},
{
"text": "I need to see a doctor."
}
],
"reading": {
"text": "Your body\nHead: eyes, ears, nose and mouth\nNeck and shoulders\nArms and hands\nLegs and knees\nIn your body, your heart is very important. When you run, you breathe fast.\nToothache? See a dentist. A fever or blood? See a doctor or a nurse.",
"question": "牙疼应该看谁?",
"options": [
"牙医",
"护士",
"医生"
]
},
"writing": {
"prompt": "写两句话:说你不舒服,头疼。",
"example": "I don't feel well. I have a headache.",
"itemIds": [
"A1-U18-P01",
"A1-U18-P02"
]
},
"independent": {
"prompt": "用英语说说你哪里疼,并说需要看医生。",
"itemIds": [
"A1-U18-P03",
"A1-U18-W01",
"A1-U18-P09"
]
}
},
{
"id": "A1-U18-S2",
"title": "在药店",
"minutes": 13,
"itemIds": [
"A1-U18-W02",
"A1-U18-P04",
"A1-U18-P05",
"A1-U18-P06",
"A1-U18-P07",
"A1-U18-P08"
],
"listening": {
"text": "Excuse me, is there a pharmacy near here? Yes, next to the bank. ... Hello. Do you have something for a headache? Yes, this medicine. How often do I take it? Three times a day, after meals.",
"question": "药怎么吃?",
"options": [
"一天三次,饭后",
"一天两次,饭前",
"一天一次,睡前"
]
},
"speaking": [
{
"text": "I need some medicine."
},
{
"text": "Is there a pharmacy near here?"
},
{
"text": "Do you have something for a headache?"
},
{
"text": "How often do I take it?"
},
{
"text": "Three times a day."
},
{
"text": "Take it after meals."
}
],
"reading": {
"text": "Medicine box\nFor headaches and fevers\nPeople over 12: take 2 pills three times a day, after meals.\nChildren: take 1 pill twice a day.\nDon't take more than 6 pills a day.\nIll for more than three days? See a doctor.\nFor stomach problems, take it once a day, before meals.",
"question": "大人一天最多吃几片?",
"options": [
"六片",
"三片",
"两片"
]
},
"writing": {
"prompt": "写两句话:问有没有治头疼的药,再问多久吃一次。",
"example": "Do you have something for a headache? How often do I take it?",
"itemIds": [
"A1-U18-P05",
"A1-U18-P06"
]
},
"independent": {
"prompt": "你在药店买感冒药,用英语问清楚怎么吃。",
"itemIds": [
"A1-U18-W02",
"A1-U18-P05",
"A1-U18-P06",
"A1-U18-P07",
"A1-U18-P08"
]
}
},
{
"id": "A1-U18-S3",
"title": "好些了",
"minutes": 11,
"itemIds": [
"A1-U18-P10",
"A1-U18-P11"
],
"listening": {
"text": "How are you today? I was sick yesterday, but I feel better now. Good! Take care.",
"question": "说话人今天怎么样?",
"options": [
"好多了",
"还在发烧",
"要去看医生"
]
},
"speaking": [
{
"text": "I feel better now."
},
{
"text": "Take care."
},
{
"text": "I was sick yesterday."
}
],
"reading": {
"text": "A note to my friend\nHi Sam,\nI was ill yesterday. I had a fever, and my body hurt. Today I feel better now. I drink a lot of water and sleep. Health is important! I want to be healthy, so I run every day.\nTake care,\nLily",
"question": "Lily 昨天怎么了?",
"options": [
"发烧,全身疼",
"牙疼",
"胃疼"
]
},
"writing": {
"prompt": "写两句话:说你昨天病了,现在好多了。",
"example": "I was sick yesterday. I feel better now.",
"itemIds": [
"A1-U18-P10",
"A1-U18-W01"
]
},
"independent": {
"prompt": "朋友生病了,用英语问他好点没有,并说保重。",
"itemIds": [
"A1-U18-P10",
"A1-U18-P11"
]
}
}
],
"scenes": [
{
"id": "A1-U18-C1",
"kind": "main",
"title": "在药店买药",
"learnerRole": "游客",
"aiRole": "药剂师",
"setting": "你旅行时头疼,走进一家药店。",
"turns": [
{
"ai": "Hello. How can I help you?",
"goal": "说你不舒服,头疼",
"model": "I don't feel well. I have a headache.",
"zh": "我不舒服,头疼。",
"itemIds": [
"A1-U18-P01",
"A1-U18-P02"
]
},
{
"ai": "Oh, I'm sorry. Do you have a fever?",
"goal": "说没有发烧,问有没有治头疼的药",
"model": "No. Do you have something for a headache?",
"zh": "没有。有治头疼的药吗?",
"itemIds": [
"A1-U18-P05"
]
},
{
"ai": "Yes. This medicine is good.",
"goal": "问多久吃一次",
"model": "How often do I take it?",
"zh": "这个药多久吃一次?",
"itemIds": [
"A1-U18-P06"
]
},
{
"ai": "Three times a day, after meals.",
"goal": "复述:一天三次,饭后",
"model": "Three times a day, after meals. OK.",
"zh": "一天三次,饭后。好的。",
"itemIds": [
"A1-U18-P07",
"A1-U18-P08"
]
},
{
"ai": "Is it very bad?",
"goal": "说如果还疼就去看医生",
"model": "If my head hurts tomorrow, I need to see a doctor.",
"zh": "如果明天头还疼,我需要看医生。",
"itemIds": [
"A1-U18-P03",
"A1-U18-P09"
]
}
]
},
{
"id": "A1-U18-C2",
"kind": "variant",
"title": "在街上找药店",
"learnerRole": "游客",
"aiRole": "路人",
"setting": "你的孩子生病了,你在街上找药店。",
"turns": [
{
"ai": "Are you OK?",
"goal": "说孩子生病了",
"model": "My son is sick.",
"zh": "我儿子病了。",
"itemIds": [
"A1-U18-W01"
]
},
{
"ai": "Oh no. What's the matter?",
"goal": "说他发烧了",
"model": "He has a fever.",
"zh": "他发烧了。",
"itemIds": [
"A1-U18-P02"
]
},
{
"ai": "He needs some medicine.",
"goal": "问附近有没有药店",
"model": "Yes, he needs medicine. Is there a pharmacy near here?",
"zh": "是的,他需要药。附近有药店吗?",
"itemIds": [
"A1-U18-P04",
"A1-U18-W02"
]
},
{
"ai": "Yes, it's on the next street.",
"goal": "说也许需要看医生",
"model": "Thank you. Maybe he needs to see a doctor too.",
"zh": "谢谢。也许他还需要看医生。",
"itemIds": [
"A1-U18-P09"
]
},
{
"ai": "There's a hospital near the pharmacy. Take care!",
"goal": "道谢",
"model": "Thanks. You take care too.",
"zh": "谢谢,你也保重。",
"itemIds": [
"A1-U18-P11"
]
}
]
},
{
"id": "A1-U18-C3",
"kind": "variant",
"title": "朋友来问候",
"learnerRole": "你",
"aiRole": "朋友",
"setting": "你昨天生病了,今天朋友打电话来问候。",
"turns": [
{
"ai": "Hi! How are you today?",
"goal": "说好多了",
"model": "I feel better now.",
"zh": "我现在好多了。",
"itemIds": [
"A1-U18-P10"
]
},
{
"ai": "Great! Do you still have a headache?",
"goal": "说还是不太舒服,背疼",
"model": "A little. I don't feel well, and my back hurts.",
"zh": "有一点。还是不太舒服,背也疼。",
"itemIds": [
"A1-U18-P01",
"A1-U18-P03"
]
},
{
"ai": "Do you have medicine?",
"goal": "说有药,一天吃两次",
"model": "Yes. I take the medicine two times a day.",
"zh": "有,这个药一天吃两次。",
"itemIds": [
"A1-U18-W02",
"A1-U18-P07"
]
},
{
"ai": "Before meals or after meals?",
"goal": "说饭后吃",
"model": "After meals.",
"zh": "饭后吃。",
"itemIds": [
"A1-U18-P08"
]
},
{
"ai": "OK. Take care!",
"goal": "道谢",
"model": "Thanks. Take care.",
"zh": "谢谢。保重。",
"itemIds": [
"A1-U18-P11"
]
}
]
}
],
"tasks": [
{
"id": "A1-U18-T1",
"sceneId": "A1-U18-C1",
"goal": "在药店说明症状并问清楚药怎么吃",
"itemIds": [
"A1-U18-P01",
"A1-U18-P02",
"A1-U18-P05",
"A1-U18-P06",
"A1-U18-P07",
"A1-U18-P08",
"A1-U18-P03",
"A1-U18-P09"
],
"slots": [
"症状",
"药",
"用法"
]
},
{
"id": "A1-U18-T2",
"sceneId": "A1-U18-C2",
"goal": "孩子生病时在街上找药店",
"itemIds": [
"A1-U18-W01",
"A1-U18-P02",
"A1-U18-P04",
"A1-U18-W02",
"A1-U18-P09",
"A1-U18-P11"
],
"slots": [
"症状",
"药店"
]
},
{
"id": "A1-U18-T3",
"sceneId": "A1-U18-C3",
"goal": "回答朋友的问候,说说病情",
"itemIds": [
"A1-U18-P10",
"A1-U18-P01",
"A1-U18-P03",
"A1-U18-W02",
"A1-U18-P07",
"A1-U18-P08",
"A1-U18-P11"
],
"slots": [
"现在怎么样",
"哪里疼",
"吃药"
]
}
],
"materials": [
{
"id": "A1-U18-M1",
"mode": "listening",
"title": "药店店员给建议",
"text": "Hello. What's the matter? You don't look well; you don't look healthy today. Do you have a fever? OK, you have a headache, your stomach hurts, and your neck and shoulder hurt too. Don't worry. Your health is important. Here is some medicine. Take one pill twice a day, after meals — not once, but two times. Please breathe slowly, drink a lot of water, and rest. If your ear, nose or leg still hurts tomorrow, or if you feel ill, you need to see a doctor. For a toothache, see a dentist. The nurse can help too. The pharmacy is open until ten. Take care!",
"glosses": {
"rest": "休息",
"hurts": "疼",
"hurt": "疼",
"slowly": "慢慢地"
},
"questions": [
{
"type": "gist",
"question": "说话人主要在做什么?",
"options": [
"给生病的人建议和药",
"卖衣服",
"介绍菜单"
]
},
{
"type": "detail",
"question": "这个药怎么吃?",
"options": [
"一天两次,饭后吃",
"一天三次,饭前吃",
"睡前吃"
]
}
]
},
{
"id": "A1-U18-M2",
"mode": "reading",
"title": "读一段对话:说不舒服",
"text": "Ben: I don't feel well. I have a bad headache, and my body hurts everywhere.\nMia: Oh no. Do you have a fever? You don't look healthy.\nBen: A little. My head and my stomach hurt, and my arm and leg are tired.\nMia: Yesterday you were fine. You should rest. It's important. Do you have any medicine?\nBen: No. Is there a pharmacy near here?\nMia: Yes, next to the bank. The nurse there can give you something for a headache.\nBen: Thanks. My tooth hurts too. Maybe I need a dentist for this toothache.\nMia: Take care. Breathe slowly and drink water. I hope you feel better soon.\nBen: Thank you, my friend. I still feel ill, but a little better now.",
"glosses": {
"rest": "休息",
"hurts": "疼",
"hurt": "疼",
"everywhere": "到处",
"slowly": "慢慢地"
},
"questions": [
{
"type": "detail",
"question": "Ben 哪里不舒服?",
"options": [
"头疼、发一点烧、浑身疼",
"只是牙疼",
"只是肚子疼"
]
},
{
"type": "detail",
"question": "药店在哪里?",
"options": [
"银行旁边",
"车站里",
"酒店对面"
]
}
]
}
],
"excluded": [
{
"en": "sore throat",
"reason": "sore 为 B1、throat 为 B2;A1 用 My throat hurts 以外的说法,先不教"
},
{
"en": "cough",
"reason": "B1–B2;留到 A2 看病单元"
}
]
}