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
+910
View File
@@ -0,0 +1,910 @@
{
"schemaVersion": 1,
"id": "A1-U17",
"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": "16",
"use": "active"
},
{
"id": "59-2",
"use": "active"
},
{
"id": "123",
"use": "active"
},
{
"id": "250",
"use": "active",
"reason": "CEFR-J 未标级别,Could you ...? 是向酒店提要求时最礼貌的说法"
},
{
"id": "117",
"use": "active"
}
],
"coreItems": [
{
"id": "A1-U17-P01",
"type": "phrase",
"en": "There's no hot water.",
"zh": "没有热水。",
"sceneWord": false,
"match": [
[
"no hot water"
]
],
"example": {
"en": "There's no hot water in the shower.",
"zh": "淋浴没有热水。"
},
"review": {
"prompt": "告诉前台房间没有热水。"
}
},
{
"id": "A1-U17-P02",
"type": "phrase",
"en": "The TV doesn't work.",
"zh": "电视坏了。",
"sceneWord": false,
"match": [
[
"doesn't work",
"don't work"
]
],
"example": {
"en": "The light doesn't work.",
"zh": "灯不亮。"
},
"review": {
"prompt": "说房间的灯不亮。"
}
},
{
"id": "A1-U17-W01",
"type": "word",
"en": "broken",
"zh": "坏的",
"sceneWord": false,
"match": [
[
"broken"
]
],
"example": {
"en": "The chair is broken.",
"zh": "椅子坏了。"
},
"review": {
"prompt": "说房间的椅子坏了。"
}
},
{
"id": "A1-U17-W02",
"type": "word",
"en": "dirty",
"zh": "脏的",
"sceneWord": false,
"match": [
[
"dirty"
]
],
"example": {
"en": "The towels are dirty.",
"zh": "毛巾是脏的。"
},
"review": {
"prompt": "说床单是脏的。"
}
},
{
"id": "A1-U17-P03",
"type": "phrase",
"en": "Can I have another towel?",
"zh": "可以再给我一条毛巾吗?",
"sceneWord": false,
"match": [
[
"another towel",
"more towels"
]
],
"example": {
"en": "Can I have two more towels?",
"zh": "可以再给我两条毛巾吗?"
},
"review": {
"prompt": "再要一条毛巾。"
}
},
{
"id": "A1-U17-P04",
"type": "phrase",
"en": "It's too noisy.",
"zh": "太吵了。",
"sceneWord": true,
"sceneReason": "noisy 为 A2,投诉房间时离不开这个词",
"match": [
[
"noisy"
]
],
"example": {
"en": "My room is too noisy.",
"zh": "我的房间太吵了。"
},
"review": {
"prompt": "说房间太吵,睡不着。"
}
},
{
"id": "A1-U17-P05",
"type": "phrase",
"en": "Can you send someone?",
"zh": "能派个人来吗?",
"sceneWord": true,
"sceneReason": "send 为 A2,请酒店派人处理问题时必需",
"match": [
[
"send someone"
]
],
"example": {
"en": "Can you send someone to my room?",
"zh": "能派个人来我房间吗?"
},
"review": {
"prompt": "请前台派人来修。"
}
},
{
"id": "A1-U17-P06",
"type": "phrase",
"en": "Can I change rooms?",
"zh": "我能换个房间吗?",
"sceneWord": false,
"match": [
[
"change rooms",
"another room"
]
],
"example": {
"en": "Can I have another room?",
"zh": "能给我换一间房吗?"
},
"review": {
"prompt": "问能不能换房间。"
}
},
{
"id": "A1-U17-P07",
"type": "phrase",
"en": "Could you bring me some water?",
"zh": "能给我拿点水吗?",
"sceneWord": false,
"match": [
[
"bring me"
]
],
"example": {
"en": "Could you bring me a blanket?",
"zh": "能给我拿条毛毯吗?"
},
"review": {
"prompt": "请服务员给你拿点水。"
}
},
{
"id": "A1-U17-P08",
"type": "phrase",
"en": "My room number is 1206.",
"zh": "我的房间号是 1206。",
"sceneWord": false,
"match": [
[
"room number"
]
],
"example": {
"en": "What's your room number?",
"zh": "你的房间号是多少?"
},
"review": {
"prompt": "打电话给前台时先说房间号。"
}
},
{
"id": "A1-U17-P09",
"type": "phrase",
"en": "I can't open the door.",
"zh": "我打不开门。",
"sceneWord": false,
"match": [
[
"can't open"
]
],
"example": {
"en": "I can't open the window.",
"zh": "我打不开窗。"
},
"review": {
"prompt": "说你打不开房门。"
}
},
{
"id": "A1-U17-P10",
"type": "phrase",
"en": "Please clean my room.",
"zh": "请打扫我的房间。",
"sceneWord": false,
"match": [
[
"clean my room",
"clean the room"
]
],
"example": {
"en": "Please clean the room at ten.",
"zh": "请十点打扫房间。"
},
"review": {
"prompt": "请酒店打扫你的房间。"
}
},
{
"id": "A1-U17-P11",
"type": "phrase",
"en": "Thank you for your help.",
"zh": "谢谢你的帮助。",
"sceneWord": false,
"match": [
[
"thank you for",
"thanks for"
]
],
"example": {
"en": "Thanks for the towels.",
"zh": "谢谢你送的毛巾。"
},
"review": {
"prompt": "问题解决后道谢。"
}
}
],
"receptiveWords": [
{
"id": "A1-U17-R01",
"en": "noise",
"zh": "噪音"
},
{
"id": "A1-U17-R02",
"en": "paper",
"zh": "纸"
},
{
"id": "A1-U17-R03",
"en": "wall",
"zh": "墙"
},
{
"id": "A1-U17-R04",
"en": "desk",
"zh": "书桌"
},
{
"id": "A1-U17-R05",
"en": "chair",
"zh": "椅子"
},
{
"id": "A1-U17-R06",
"en": "couch",
"zh": "沙发"
},
{
"id": "A1-U17-R07",
"en": "blanket",
"zh": "毛毯"
},
{
"id": "A1-U17-R08",
"en": "shampoo",
"zh": "洗发水"
},
{
"id": "A1-U17-R09",
"en": "lamp",
"zh": "台灯"
},
{
"id": "A1-U17-R10",
"en": "repair",
"zh": "修理"
},
{
"id": "A1-U17-R11",
"en": "moment",
"zh": "片刻"
},
{
"id": "A1-U17-R12",
"en": "give",
"zh": "给"
},
{
"id": "A1-U17-R13",
"en": "break",
"zh": "弄坏"
},
{
"id": "A1-U17-R14",
"en": "hole",
"zh": "洞"
},
{
"id": "A1-U17-R15",
"en": "hear",
"zh": "听见"
},
{
"id": "A1-U17-R16",
"en": "matter",
"zh": "事情(What's the matter?)"
},
{
"id": "A1-U17-R17",
"en": "happen",
"zh": "发生"
},
{
"id": "A1-U17-R18",
"en": "lock",
"zh": "锁"
},
{
"id": "A1-U17-R19",
"en": "extra",
"zh": "额外的"
},
{
"id": "A1-U17-R20",
"en": "rude",
"zh": "粗鲁的"
},
{
"id": "A1-U17-R21",
"en": "strange",
"zh": "奇怪的"
},
{
"id": "A1-U17-R22",
"en": "awake",
"zh": "醒着的"
},
{
"id": "A1-U17-R23",
"en": "hard",
"zh": "硬的"
},
{
"id": "A1-U17-R24",
"en": "bad",
"zh": "坏的;糟糕的"
},
{
"id": "A1-U17-R25",
"en": "call",
"zh": "打电话"
}
],
"segments": [
{
"id": "A1-U17-S1",
"title": "房间里的问题",
"minutes": 13,
"itemIds": [
"A1-U17-P01",
"A1-U17-P02",
"A1-U17-W01",
"A1-U17-W02",
"A1-U17-P08"
],
"listening": {
"text": "Hello, this is room 1206. There's no hot water. And the TV doesn't work. OK, sir. What's your room number again? My room number is 1206.",
"question": "客人房间有什么问题?",
"options": [
"没有热水,电视坏了",
"太吵,门打不开",
"毛巾脏了"
]
},
"speaking": [
{
"text": "There's no hot water."
},
{
"text": "The TV doesn't work."
},
{
"text": "The chair is broken.",
"tip": "broken 读 /ˈbrəʊkən/"
},
{
"text": "The towels are dirty."
},
{
"text": "My room number is 1206."
}
],
"reading": {
"text": "Room problems\nThe lamp on the desk doesn't work.\nThe couch is dirty.\nThere's a hole in the wall.\nThe shower has no hot water.\nThere's no toilet paper and no shampoo.\nCall 0 and give us your room number. We can repair everything soon!",
"question": "客人发现问题时应该怎么做?",
"options": [
"拨 0 并说房间号",
"自己修理",
"去前台排队"
]
},
"writing": {
"prompt": "写两句话:说出房间号,再说没有热水。",
"example": "My room number is 1206. There's no hot water.",
"itemIds": [
"A1-U17-P08",
"A1-U17-P01"
]
},
"independent": {
"prompt": "用英语打电话给前台,说你房间的两个问题。",
"itemIds": [
"A1-U17-P08",
"A1-U17-P02",
"A1-U17-W01",
"A1-U17-W02"
]
}
},
{
"id": "A1-U17-S2",
"title": "请求帮助",
"minutes": 12,
"itemIds": [
"A1-U17-P03",
"A1-U17-P05",
"A1-U17-P07",
"A1-U17-P10",
"A1-U17-P11"
],
"listening": {
"text": "Hi, can I have another towel? And could you bring me some water? Sure. Anything else? Can you send someone? The light is broken. Yes, in a moment. Thank you for your help.",
"question": "客人要了哪两样东西?",
"options": [
"毛巾和水",
"毛毯和水",
"毛巾和洗发水"
]
},
"speaking": [
{
"text": "Can I have another towel?"
},
{
"text": "Can you send someone?"
},
{
"text": "Could you bring me some water?",
"tip": "Could you 常连读成 /kʊdʒu/"
},
{
"text": "Please clean my room."
},
{
"text": "Thank you for your help."
}
],
"reading": {
"text": "Hotel help\nNeed something extra? Call 0.\n· Towels, blankets and shampoo: we can bring them to your room.\n· Something is broken? We can send someone.\n· Please clean my room: put this card on your door.\n· Don't break the lock! If you can't open the door, call us.",
"question": "想让酒店打扫房间,应该怎么做?",
"options": [
"把卡挂在门上",
"拨 0",
"去前台"
]
},
"writing": {
"prompt": "写两句话:再要一条毛巾,再请人拿点水。",
"example": "Can I have another towel? Could you bring me some water?",
"itemIds": [
"A1-U17-P03",
"A1-U17-P07"
]
},
"independent": {
"prompt": "用英语请酒店派人来修电视,最后道谢。",
"itemIds": [
"A1-U17-P05",
"A1-U17-P02",
"A1-U17-P11"
]
}
},
{
"id": "A1-U17-S3",
"title": "换房间",
"minutes": 12,
"itemIds": [
"A1-U17-P04",
"A1-U17-P06",
"A1-U17-P09"
],
"listening": {
"text": "What's the matter? It's too noisy. I can hear music from the next room. Can I change rooms? Sure. Here is the key to room 1508. ... Hello? I can't open the door.",
"question": "客人为什么要换房间?",
"options": [
"太吵了",
"门打不开",
"房间太脏"
]
},
"speaking": [
{
"text": "It's too noisy."
},
{
"text": "Can I change rooms?"
},
{
"text": "I can't open the door."
}
],
"reading": {
"text": "A bad night\nWhat happened? I can't sleep. My room is too noisy. There's a strange noise from the wall, and I'm awake at 3 am. The bed is very hard too. I call the front desk, but the man is rude. He says, \"No, you can't change rooms.\" Tomorrow I can ask again.",
"question": "写这段话的人为什么睡不着?",
"options": [
"房间太吵,床也太硬",
"房间太冷",
"灯坏了"
]
},
"writing": {
"prompt": "写两句话:说太吵了,问能不能换房间。",
"example": "It's too noisy. Can I change rooms?",
"itemIds": [
"A1-U17-P04",
"A1-U17-P06"
]
},
"independent": {
"prompt": "你拿到新房卡却打不开门,用英语向前台说明。",
"itemIds": [
"A1-U17-P09",
"A1-U17-P08",
"A1-U17-P05"
]
}
}
],
"scenes": [
{
"id": "A1-U17-C1",
"kind": "main",
"title": "打电话给前台",
"learnerRole": "客人",
"aiRole": "前台",
"setting": "你刚入住,发现房间有几个问题,打电话给前台。",
"turns": [
{
"ai": "Front desk. How can I help you?",
"goal": "先说房间号",
"model": "Hello. My room number is 1206.",
"zh": "你好,我的房间号是 1206。",
"itemIds": [
"A1-U17-P08"
]
},
{
"ai": "Yes, Mr Chen. What's the matter?",
"goal": "说没有热水",
"model": "There's no hot water.",
"zh": "没有热水。",
"itemIds": [
"A1-U17-P01"
]
},
{
"ai": "I'm sorry. Anything else?",
"goal": "说电视也坏了",
"model": "And the TV doesn't work.",
"zh": "电视也坏了。",
"itemIds": [
"A1-U17-P02"
]
},
{
"ai": "OK. What can we do for you?",
"goal": "请前台派人来",
"model": "Can you send someone?",
"zh": "能派个人来吗?",
"itemIds": [
"A1-U17-P05"
]
},
{
"ai": "Yes, in ten minutes.",
"goal": "道谢",
"model": "Thank you for your help.",
"zh": "谢谢你的帮助。",
"itemIds": [
"A1-U17-P11"
]
}
]
},
{
"id": "A1-U17-C2",
"kind": "variant",
"title": "房间太吵要换房",
"learnerRole": "客人",
"aiRole": "前台",
"setting": "半夜房间很吵,你到前台要求换房间。",
"turns": [
{
"ai": "Good evening. Can I help you?",
"goal": "说房间太吵",
"model": "Yes. My room is too noisy.",
"zh": "是的,我的房间太吵了。",
"itemIds": [
"A1-U17-P04"
]
},
{
"ai": "Oh, I'm sorry. Is it the music?",
"goal": "问能不能换房间",
"model": "Yes. Can I change rooms?",
"zh": "是的。我能换个房间吗?",
"itemIds": [
"A1-U17-P06"
]
},
{
"ai": "Sure. Here is the key to room 815.",
"goal": "说房间也有点脏",
"model": "Thank you. And my room is a little dirty.",
"zh": "谢谢。我的房间也有点脏。",
"itemIds": [
"A1-U17-W02"
]
},
{
"ai": "Sorry about that. We can clean it tomorrow.",
"goal": "请明天早上打扫房间",
"model": "OK. Please clean my room in the morning.",
"zh": "好的。请早上打扫我的房间。",
"itemIds": [
"A1-U17-P10"
]
},
{
"ai": "Yes. Anything else?",
"goal": "请给你拿点水",
"model": "Could you bring me some water?",
"zh": "能给我拿点水吗?",
"itemIds": [
"A1-U17-P07"
]
}
]
},
{
"id": "A1-U17-C3",
"kind": "variant",
"title": "进不去房间",
"learnerRole": "客人",
"aiRole": "前台",
"setting": "你回到酒店,房门打不开,房间里的东西也有问题。",
"turns": [
{
"ai": "Hello again! Is everything OK?",
"goal": "说你打不开门",
"model": "No. I can't open the door.",
"zh": "不好。我打不开门。",
"itemIds": [
"A1-U17-P09"
]
},
{
"ai": "Oh, the key card is broken. Here is a new one.",
"goal": "再要一条毛巾",
"model": "Thanks. Can I have another towel?",
"zh": "谢谢。可以再给我一条毛巾吗?",
"itemIds": [
"A1-U17-P03"
]
},
{
"ai": "Yes. Anything else?",
"goal": "说椅子坏了",
"model": "The chair in my room is broken.",
"zh": "我房间的椅子坏了。",
"itemIds": [
"A1-U17-W01"
]
},
{
"ai": "I can send someone. What's your room number?",
"goal": "说房间号",
"model": "My room number is 815.",
"zh": "我的房间号是 815。",
"itemIds": [
"A1-U17-P08"
]
},
{
"ai": "OK, in a moment.",
"goal": "道谢",
"model": "Thank you for your help.",
"zh": "谢谢你的帮助。",
"itemIds": [
"A1-U17-P11"
]
}
]
}
],
"tasks": [
{
"id": "A1-U17-T1",
"sceneId": "A1-U17-C1",
"goal": "打电话给前台说明房间问题并请人来修",
"itemIds": [
"A1-U17-P08",
"A1-U17-P01",
"A1-U17-P02",
"A1-U17-P05",
"A1-U17-P11"
],
"slots": [
"房间号",
"问题",
"派人"
]
},
{
"id": "A1-U17-T2",
"sceneId": "A1-U17-C2",
"goal": "当面投诉房间太吵并换房",
"itemIds": [
"A1-U17-P04",
"A1-U17-P06",
"A1-U17-W02",
"A1-U17-P10",
"A1-U17-P07"
],
"slots": [
"问题",
"换房",
"其他请求"
]
},
{
"id": "A1-U17-T3",
"sceneId": "A1-U17-C3",
"goal": "进不去房间时处理多个小问题",
"itemIds": [
"A1-U17-P09",
"A1-U17-P03",
"A1-U17-W01",
"A1-U17-P08",
"A1-U17-P11"
],
"slots": [
"房门",
"毛巾",
"损坏"
]
}
],
"materials": [
{
"id": "A1-U17-M1",
"mode": "listening",
"title": "打给前台报房间问题",
"text": "Hello, front desk? This is room 1206. I'm sorry, but there are some problems, and I can't sleep. There's no hot water, and the TV is broken; it doesn't work. The lamp on the desk is broken too. The room is a little dirty, and there is a hole in the wall. It's also very noisy — I can hear a strange noise all night, so I'm still awake. Can you send someone to repair these things and clean the room? Could you bring me another blanket, some shampoo and a new chair? Can I change rooms? One moment — sorry, that's a lot. Thank you for your help.",
"glosses": {
"send": "派(人)",
"still": "仍然",
"things": "东西"
},
"questions": [
{
"type": "gist",
"question": "客人打电话主要是为了什么?",
"options": [
"报告房间的问题",
"订早餐",
"问路"
]
},
{
"type": "detail",
"question": "下面哪个是客人说的问题?",
"options": [
"没有热水,电视坏了",
"床太小",
"房间太贵"
]
}
]
},
{
"id": "A1-U17-M2",
"mode": "reading",
"title": "读一段对话:报修",
"text": "Guest: Hi, my room number is 305. The TV doesn't work, and there's no hot water.\nAnna: I'm so sorry. What's the matter? I'll send someone to repair it now.\nGuest: Thank you. There's also a strange noise in the wall. What happened? I can't sleep; I'm still awake.\nAnna: Sorry for the trouble. Can I bring you anything?\nGuest: Yes, please. Can I have another blanket, some shampoo, and paper? And the lamp is broken.\nAnna: Of course. We'll give you a new lamp and repair the door lock too.\nGuest: Thank you. The couch has a hole in it, and the chair is broken. Sorry, that's a lot!\nAnna: No problem. Some guests are rude, but you are very kind. I'll fix everything today.\nGuest: One moment — could you bring an extra towel too?\nAnna: Sure, I'll bring it now.\nGuest: Thank you for your help.",
"glosses": {
"fix": "修理,解决",
"trouble": "麻烦",
"course": "of course 当然",
"still": "仍然"
},
"questions": [
{
"type": "detail",
"question": "客人房间里什么坏了?",
"options": [
"电视和台灯",
"空调",
"窗户"
]
},
{
"type": "detail",
"question": "客人还额外要了什么?",
"options": [
"一条毛巾",
"一双鞋",
"一份报纸"
]
}
]
}
],
"excluded": [
{
"en": "pillow",
"reason": "B1;A1 用 blanket、towel 这类词"
},
{
"en": "heater",
"reason": "B1;A1 用 no hot water / it's cold 表达"
}
]
}