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
+952
View File
@@ -0,0 +1,952 @@
{
"schemaVersion": 1,
"id": "A1-U21",
"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": "61",
"use": "active",
"reason": "用 What are you doing this weekend? 说已经定好的安排"
},
{
"id": "142",
"use": "active",
"reason": "Would you like to ...? 是邀请别人时的固定句型"
},
{
"id": "120",
"use": "active"
},
{
"id": "123",
"use": "active"
},
{
"id": "150",
"use": "active"
}
],
"coreItems": [
{
"id": "A1-U21-P01",
"type": "phrase",
"en": "What are you doing this weekend?",
"zh": "你这个周末做什么?",
"sceneWord": false,
"match": [
[
"what are you doing"
]
],
"example": {
"en": "What are you doing on Saturday?",
"zh": "你周六做什么?"
},
"review": {
"prompt": "问朋友这个周末做什么。"
}
},
{
"id": "A1-U21-P02",
"type": "phrase",
"en": "I'm going to the beach.",
"zh": "我要去海滩。",
"sceneWord": false,
"match": [
[
"going to the"
]
],
"example": {
"en": "I'm going to the mountains with my family.",
"zh": "我要和家人去山里。"
},
"review": {
"prompt": "说你周六要去海滩。"
}
},
{
"id": "A1-U21-P03",
"type": "phrase",
"en": "Do you want to come?",
"zh": "你想一起来吗?",
"sceneWord": false,
"match": [
[
"want to come"
]
],
"example": {
"en": "We're going to a concert. Do you want to come?",
"zh": "我们要去听音乐会,你想来吗?"
},
"review": {
"prompt": "问朋友想不想一起来。"
}
},
{
"id": "A1-U21-P04",
"type": "phrase",
"en": "Would you like to join us?",
"zh": "你愿意和我们一起吗?",
"sceneWord": false,
"match": [
[
"would you like to"
]
],
"example": {
"en": "Would you like to play tennis?",
"zh": "你想打网球吗?"
},
"review": {
"prompt": "礼貌地邀请朋友加入你们。"
}
},
{
"id": "A1-U21-P05",
"type": "phrase",
"en": "That sounds great!",
"zh": "听起来很棒!",
"sceneWord": true,
"sceneReason": "sound 为 A2 动词,但回应邀请时最自然的说法就是它",
"match": [
[
"sounds great",
"sounds good",
"sounds fun"
]
],
"example": {
"en": "A picnic? That sounds good!",
"zh": "野餐?听起来不错!"
},
"review": {
"prompt": "朋友邀请你,你很高兴地回应。"
}
},
{
"id": "A1-U21-P06",
"type": "phrase",
"en": "I'd love to.",
"zh": "我很乐意。",
"sceneWord": false,
"match": [
[
"i'd love to"
]
],
"example": {
"en": "I'd love to come!",
"zh": "我很想来!"
},
"review": {
"prompt": "接受朋友的邀请。"
}
},
{
"id": "A1-U21-P07",
"type": "phrase",
"en": "Sorry, I can't.",
"zh": "抱歉,我去不了。",
"sceneWord": false,
"match": [
[
"sorry, i can't"
]
],
"example": {
"en": "Sorry, I can't. I'm busy on Sunday.",
"zh": "抱歉,我去不了,我周日没空。"
},
"review": {
"prompt": "礼貌地拒绝邀请。"
}
},
{
"id": "A1-U21-P08",
"type": "phrase",
"en": "Maybe next time.",
"zh": "下次吧。",
"sceneWord": false,
"match": [
[
"next time"
]
],
"example": {
"en": "OK, maybe next time.",
"zh": "好吧,下次吧。"
},
"review": {
"prompt": "拒绝邀请后说下次吧。"
}
},
{
"id": "A1-U21-P09",
"type": "phrase",
"en": "Let's go together.",
"zh": "我们一起去吧。",
"sceneWord": false,
"match": [
[
"go together"
]
],
"example": {
"en": "Let's go together on Sunday.",
"zh": "我们周日一起去吧。"
},
"review": {
"prompt": "提议和朋友一起去。"
}
},
{
"id": "A1-U21-P10",
"type": "phrase",
"en": "Let's play tennis.",
"zh": "我们打网球吧。",
"sceneWord": false,
"match": [
[
"play tennis",
"play football",
"play basketball",
"play the guitar",
"play the piano"
]
],
"example": {
"en": "I play football on Sundays.",
"zh": "我周日踢足球。"
},
"review": {
"prompt": "约朋友打篮球。"
}
},
{
"id": "A1-U21-P11",
"type": "phrase",
"en": "We can have a picnic.",
"zh": "我们可以去野餐。",
"sceneWord": false,
"match": [
[
"have a picnic"
]
],
"example": {
"en": "We can have a picnic in the park.",
"zh": "我们可以在公园野餐。"
},
"review": {
"prompt": "提议去野餐。"
}
},
{
"id": "A1-U21-P12",
"type": "phrase",
"en": "It's fun.",
"zh": "很好玩。",
"sceneWord": false,
"match": [
[
"fun"
]
],
"example": {
"en": "Dancing is really fun.",
"zh": "跳舞真的很好玩。"
},
"review": {
"prompt": "说爬山很好玩。"
}
},
{
"id": "A1-U21-W01",
"type": "word",
"en": "hobby",
"zh": "爱好",
"sceneWord": false,
"match": [
[
"hobby",
"hobbies"
]
],
"example": {
"en": "My hobby is taking photos.",
"zh": "我的爱好是拍照。"
},
"review": {
"prompt": "说说你的爱好。"
}
}
],
"receptiveWords": [
{
"id": "A1-U21-R01",
"en": "concert",
"zh": "音乐会"
},
{
"id": "A1-U21-R02",
"en": "football",
"zh": "足球"
},
{
"id": "A1-U21-R03",
"en": "basketball",
"zh": "篮球"
},
{
"id": "A1-U21-R04",
"en": "soccer",
"zh": "足球(美式说法)"
},
{
"id": "A1-U21-R05",
"en": "sport",
"zh": "运动"
},
{
"id": "A1-U21-R06",
"en": "game",
"zh": "比赛;游戏"
},
{
"id": "A1-U21-R07",
"en": "team",
"zh": "队"
},
{
"id": "A1-U21-R08",
"en": "player",
"zh": "选手"
},
{
"id": "A1-U21-R09",
"en": "ball",
"zh": "球"
},
{
"id": "A1-U21-R10",
"en": "fan",
"zh": "迷;粉丝"
},
{
"id": "A1-U21-R11",
"en": "activity",
"zh": "活动"
},
{
"id": "A1-U21-R12",
"en": "art",
"zh": "艺术"
},
{
"id": "A1-U21-R13",
"en": "drama",
"zh": "戏剧"
},
{
"id": "A1-U21-R14",
"en": "theater",
"zh": "剧院"
},
{
"id": "A1-U21-R15",
"en": "event",
"zh": "活动;项目"
},
{
"id": "A1-U21-R16",
"en": "painting",
"zh": "画;绘画"
},
{
"id": "A1-U21-R17",
"en": "photo",
"zh": "照片"
},
{
"id": "A1-U21-R18",
"en": "piano",
"zh": "钢琴"
},
{
"id": "A1-U21-R19",
"en": "guitar",
"zh": "吉他"
},
{
"id": "A1-U21-R20",
"en": "singer",
"zh": "歌手"
},
{
"id": "A1-U21-R21",
"en": "musician",
"zh": "音乐家"
},
{
"id": "A1-U21-R22",
"en": "actor",
"zh": "演员"
},
{
"id": "A1-U21-R23",
"en": "band",
"zh": "乐队"
},
{
"id": "A1-U21-R24",
"en": "camp",
"zh": "营地;露营"
},
{
"id": "A1-U21-R25",
"en": "magazine",
"zh": "杂志"
},
{
"id": "A1-U21-R26",
"en": "mountain",
"zh": "山"
},
{
"id": "A1-U21-R27",
"en": "climb",
"zh": "爬"
},
{
"id": "A1-U21-R28",
"en": "exciting",
"zh": "令人兴奋的"
},
{
"id": "A1-U21-R29",
"en": "excellent",
"zh": "极好的"
},
{
"id": "A1-U21-R30",
"en": "win",
"zh": "赢"
},
{
"id": "A1-U21-R31",
"en": "spend",
"zh": "度过;花"
},
{
"id": "A1-U21-R32",
"en": "choose",
"zh": "选择"
}
],
"segments": [
{
"id": "A1-U21-S1",
"title": "问周末安排",
"minutes": 12,
"itemIds": [
"A1-U21-P01",
"A1-U21-P02",
"A1-U21-P12",
"A1-U21-W01"
],
"listening": {
"text": "What are you doing this weekend? I'm going to the beach on Saturday. And on Sunday? I'm going to the mountains. I love climbing. It's fun!",
"question": "说话人周日去哪里?",
"options": [
"山里",
"海滩",
"公园"
]
},
"speaking": [
{
"text": "What are you doing this weekend?"
},
{
"text": "I'm going to the beach."
},
{
"text": "It's fun."
},
{
"text": "My hobby is taking photos.",
"tip": "hobby 读 /ˈhɒbi/"
}
],
"reading": {
"text": "My hobbies\nMia: I play the piano and the guitar. I'm in a band, and I love music. My favorite singer is from London.\nLeo: I like sports. I play football and basketball. My team wins most games! I'm a big fan of soccer too.\nNina: I'm interested in art. I go to the theater and look at paintings. I read an art magazine every month.\nBen: Fishing and taking photos. I spend both days of the weekend at the river.",
"question": "谁对艺术感兴趣?",
"options": [
"Nina",
"Mia",
"Leo"
]
},
"writing": {
"prompt": "写两句话:问朋友周末做什么,再说你要去海滩。",
"example": "What are you doing this weekend? I'm going to the beach.",
"itemIds": [
"A1-U21-P01",
"A1-U21-P02"
]
},
"independent": {
"prompt": "用英语说说你这个周末的安排和你的爱好。",
"itemIds": [
"A1-U21-P02",
"A1-U21-W01",
"A1-U21-P12"
]
}
},
{
"id": "A1-U21-S2",
"title": "邀请和回应",
"minutes": 13,
"itemIds": [
"A1-U21-P03",
"A1-U21-P04",
"A1-U21-P05",
"A1-U21-P06",
"A1-U21-P07",
"A1-U21-P08"
],
"listening": {
"text": "We're going to a concert on Friday. Would you like to join us? That sounds great! I'd love to. And you, Sam? Do you want to come? Sorry, I can't. I'm busy. Maybe next time.",
"question": "Sam 为什么不去?",
"options": [
"他没空",
"他不喜欢音乐会",
"他生病了"
]
},
"speaking": [
{
"text": "Do you want to come?"
},
{
"text": "Would you like to join us?",
"tip": "Would you 连读成 /wʊdʒu/"
},
{
"text": "That sounds great!"
},
{
"text": "I'd love to."
},
{
"text": "Sorry, I can't."
},
{
"text": "Maybe next time."
}
],
"reading": {
"text": "City events this weekend\nSaturday\n· Excellent music: a band and musicians from ten countries. 7 pm, City Park.\n· Kids' drama: a play by young actors. 3 pm, the theater.\nSunday\n· Football game: our city team and the Tokyo team. Come and watch the players! 2 pm.\n· Camp by the river: fishing and dancing activities. Choose one or do both!\nAn exciting weekend for everyone. Which event would you like to go to?",
"question": "周六下午有什么活动?",
"options": [
"儿童戏剧",
"足球比赛",
"音乐会"
]
},
"writing": {
"prompt": "写两句话:邀请朋友一起来,再替他说“我很乐意”。",
"example": "Would you like to join us? I'd love to.",
"itemIds": [
"A1-U21-P04",
"A1-U21-P06"
]
},
"independent": {
"prompt": "朋友邀请你周日去看足球,你没空,用英语礼貌拒绝。",
"itemIds": [
"A1-U21-P07",
"A1-U21-P08"
]
}
},
{
"id": "A1-U21-S3",
"title": "一起去吧",
"minutes": 12,
"itemIds": [
"A1-U21-P09",
"A1-U21-P10",
"A1-U21-P11"
],
"listening": {
"text": "Let's play tennis on Saturday. Hmm, it's going to be sunny. We can have a picnic too. Great idea! Let's go together.",
"question": "他们周六要做什么?",
"options": [
"打网球和野餐",
"去海滩",
"看音乐会"
]
},
"speaking": [
{
"text": "Let's go together."
},
{
"text": "Let's play tennis."
},
{
"text": "We can have a picnic."
},
{
"text": "Let's play the piano."
}
],
"reading": {
"text": "A note from Kate\nHi Lucy,\nAre you free on Sunday? Let's go to the river together. We can have a picnic and play ball. Bring your camera: you can take photos for your hobby. My brother is coming, and he's bringing his guitar. We can play the guitar and sing.\nIt's going to be fun! Text me.\nKate",
"question": "Kate 的哥哥要带什么?",
"options": [
"吉他",
"相机",
"球"
]
},
"writing": {
"prompt": "写两句话:提议一起去,并说可以去野餐。",
"example": "Let's go together. We can have a picnic.",
"itemIds": [
"A1-U21-P09",
"A1-U21-P11"
]
},
"independent": {
"prompt": "用英语约朋友周末做一项运动,并说一起去。",
"itemIds": [
"A1-U21-P10",
"A1-U21-P09"
]
}
}
],
"scenes": [
{
"id": "A1-U21-C1",
"kind": "main",
"title": "约朋友周末出去玩",
"learnerRole": "你",
"aiRole": "朋友",
"setting": "周五下班后,你和朋友聊周末的计划。",
"turns": [
{
"ai": "So, what are you doing this weekend?",
"goal": "说你要去海滩",
"model": "I'm going to the beach.",
"zh": "我要去海滩。",
"itemIds": [
"A1-U21-P02"
]
},
{
"ai": "The beach? That's nice.",
"goal": "邀请朋友一起来",
"model": "Do you want to come?",
"zh": "你想一起来吗?",
"itemIds": [
"A1-U21-P03"
]
},
{
"ai": "That sounds great! What can we do there?",
"goal": "说可以野餐,很好玩",
"model": "We can have a picnic. It's fun.",
"zh": "我们可以野餐,很好玩。",
"itemIds": [
"A1-U21-P11",
"A1-U21-P12"
]
},
{
"ai": "Can my sister come too?",
"goal": "说当然,一起去吧",
"model": "Sure. Let's go together.",
"zh": "当然。我们一起去吧。",
"itemIds": [
"A1-U21-P09"
]
},
{
"ai": "Great. And after the picnic?",
"goal": "提议打网球",
"model": "Let's play tennis.",
"zh": "我们打网球吧。",
"itemIds": [
"A1-U21-P10"
]
}
]
},
{
"id": "A1-U21-C2",
"kind": "variant",
"title": "接受和拒绝邀请",
"learnerRole": "你",
"aiRole": "同事",
"setting": "同事邀请你参加周末的活动。",
"turns": [
{
"ai": "Hi! What are you doing this weekend?",
"goal": "反问对方周末做什么",
"model": "Nothing. What are you doing this weekend?",
"zh": "没什么安排。你这个周末做什么?",
"itemIds": [
"A1-U21-P01"
]
},
{
"ai": "We're going to a concert on Saturday. Would you like to join us?",
"goal": "高兴地接受",
"model": "That sounds great! I'd love to.",
"zh": "听起来很棒!我很乐意。",
"itemIds": [
"A1-U21-P05",
"A1-U21-P06"
]
},
{
"ai": "And on Sunday, we're going to play football.",
"goal": "说抱歉周日去不了",
"model": "Sorry, I can't. I'm busy on Sunday.",
"zh": "抱歉,我周日去不了,我没空。",
"itemIds": [
"A1-U21-P07"
]
},
{
"ai": "Oh, OK.",
"goal": "说下次吧",
"model": "Maybe next time.",
"zh": "下次吧。",
"itemIds": [
"A1-U21-P08"
]
},
{
"ai": "What's your hobby, then?",
"goal": "说你的爱好",
"model": "My hobby is dancing.",
"zh": "我的爱好是跳舞。",
"itemIds": [
"A1-U21-W01"
]
}
]
},
{
"id": "A1-U21-C3",
"kind": "variant",
"title": "在青年旅舍认识新朋友",
"learnerRole": "游客",
"aiRole": "旅舍里的新朋友",
"setting": "你住在青年旅舍,和另一位游客聊明天的安排。",
"turns": [
{
"ai": "Hi! Are you here on holiday too?",
"goal": "说是的,问对方周末做什么",
"model": "Yes. What are you doing this weekend?",
"zh": "是的。你这个周末做什么?",
"itemIds": [
"A1-U21-P01"
]
},
{
"ai": "I'm going to the mountains. Would you like to join us?",
"goal": "高兴地接受",
"model": "I'd love to!",
"zh": "我很乐意!",
"itemIds": [
"A1-U21-P06"
]
},
{
"ai": "We can climb and have a picnic.",
"goal": "说听起来很好玩",
"model": "That sounds great! It's fun.",
"zh": "听起来很棒!很好玩。",
"itemIds": [
"A1-U21-P05",
"A1-U21-P12"
]
},
{
"ai": "Do you like sports?",
"goal": "说你的爱好是打网球",
"model": "Yes. My hobby is tennis. Let's play tennis later.",
"zh": "喜欢。我的爱好是网球。之后我们打网球吧。",
"itemIds": [
"A1-U21-W01",
"A1-U21-P10"
]
},
{
"ai": "OK! See you tomorrow at seven.",
"goal": "邀请对方晚上和你们吃饭,并说一起去",
"model": "Great. Would you like to join us for dinner too? Let's go together.",
"zh": "太好了。你也愿意和我们一起吃晚饭吗?我们一起去吧。",
"itemIds": [
"A1-U21-P04",
"A1-U21-P09"
]
}
]
}
],
"tasks": [
{
"id": "A1-U21-T1",
"sceneId": "A1-U21-C1",
"goal": "和朋友定下周末去海滩的计划",
"itemIds": [
"A1-U21-P02",
"A1-U21-P03",
"A1-U21-P11",
"A1-U21-P12",
"A1-U21-P09",
"A1-U21-P10"
],
"slots": [
"去哪里",
"做什么",
"谁一起"
]
},
{
"id": "A1-U21-T2",
"sceneId": "A1-U21-C2",
"goal": "接受一个邀请,礼貌拒绝另一个邀请",
"itemIds": [
"A1-U21-P01",
"A1-U21-P05",
"A1-U21-P06",
"A1-U21-P07",
"A1-U21-P08",
"A1-U21-W01"
],
"slots": [
"接受",
"拒绝",
"爱好"
]
},
{
"id": "A1-U21-T3",
"sceneId": "A1-U21-C3",
"goal": "和新朋友约好一起去山里",
"itemIds": [
"A1-U21-P01",
"A1-U21-P06",
"A1-U21-P05",
"A1-U21-P12",
"A1-U21-W01",
"A1-U21-P10",
"A1-U21-P09",
"A1-U21-P04"
],
"slots": [
"安排",
"爱好",
"约定"
]
}
],
"materials": [
{
"id": "A1-U21-M1",
"mode": "listening",
"title": "朋友发来周末邀请",
"text": "Hi everyone! What are you doing this weekend? There is a big sports event on Saturday. My favorite basketball team has a game, and their best player is excellent. I'm a big fan! We can watch the ball game, and it will be exciting. Do you want to come? On Sunday there is a concert with a band, a singer, a guitar and a piano — a real music activity. Or we can go to the theater for a drama, see some art and paintings, or climb a mountain and camp. Let's choose one and spend the day together. It's fun! Tell me if you'd like to join us.",
"glosses": {},
"questions": [
{
"type": "gist",
"question": "这段话主要在做什么?",
"options": [
"邀请朋友周末一起活动",
"问路",
"报告问题"
]
},
{
"type": "detail",
"question": "星期六有什么活动?",
"options": [
"篮球比赛",
"看电影",
"在家学习"
]
}
]
},
{
"id": "A1-U21-M2",
"mode": "reading",
"title": "读一段对话:约周末踢球",
"text": "Ben: What are you doing this weekend?\nMia: Nothing special. Why?\nBen: We're going to play soccer on Sunday. Our team needs one more player. Do you want to come?\nMia: That sounds great! I'd love to. I'm a big football fan. What time?\nBen: At two in the afternoon, in the park near the mountain.\nMia: I hope we win the game! Can I bring a friend? He plays the guitar in a band.\nBen: Sure! After the game, there's a concert and a drama at the theater. It's an exciting event.\nMia: Perfect. Let's spend the whole day together. I'll bring my camera for some photos.\nBen: Great idea. Choose good shoes — we can climb the hill too. It's an excellent activity!\nMia: Sounds fun. See you on Sunday!\nBen: See you!",
"glosses": {
"perfect": "完美的",
"needs": "需要",
"whole": "整个的"
},
"questions": [
{
"type": "detail",
"question": "他们周末打算做什么?",
"options": [
"踢足球",
"打网球",
"去海边"
]
},
{
"type": "inference",
"question": "从对话看,Mia 想不想去?",
"options": [
"想去,还想带朋友",
"不想去",
"还没决定"
]
}
]
}
],
"excluded": [
{
"en": "hiking",
"reason": "A2;A1 用 go to the mountains / climb 表达"
},
{
"en": "camping",
"reason": "A2;A1 只作为 camp 理解"
}
]
}