diff --git a/business_knowledge/新知识库初版/30-48_含重复标记.xlsx b/business_knowledge/新知识库初版/30-48_含重复标记.xlsx deleted file mode 100644 index 3539469..0000000 Binary files a/business_knowledge/新知识库初版/30-48_含重复标记.xlsx and /dev/null differ diff --git a/business_knowledge/新知识库初版/30-48中独有的非重复单词.xlsx b/business_knowledge/新知识库初版/30-48中独有的非重复单词.xlsx deleted file mode 100644 index 19a53f8..0000000 Binary files a/business_knowledge/新知识库初版/30-48中独有的非重复单词.xlsx and /dev/null differ diff --git a/business_knowledge/新知识库初版/LV2-教学大纲.xlsx b/business_knowledge/新知识库初版/LV2-教学大纲.xlsx deleted file mode 100644 index 6e97df4..0000000 Binary files a/business_knowledge/新知识库初版/LV2-教学大纲.xlsx and /dev/null differ diff --git a/business_knowledge/新知识库初版/中考_教学大纲重复标记.xlsx b/business_knowledge/新知识库初版/中考_教学大纲重复标记.xlsx deleted file mode 100644 index d6a41f9..0000000 Binary files a/business_knowledge/新知识库初版/中考_教学大纲重复标记.xlsx and /dev/null differ diff --git a/business_knowledge/新知识库初版/全包词汇/A2中独有的单词.xlsx b/business_knowledge/新知识库初版/全包词汇/A2中独有的单词.xlsx new file mode 100644 index 0000000..a095bb3 Binary files /dev/null and b/business_knowledge/新知识库初版/全包词汇/A2中独有的单词.xlsx differ diff --git a/business_knowledge/新知识库初版/全包词汇/CEFR - A2.xlsx b/business_knowledge/新知识库初版/全包词汇/CEFR - A2.xlsx new file mode 100644 index 0000000..967387f Binary files /dev/null and b/business_knowledge/新知识库初版/全包词汇/CEFR - A2.xlsx differ diff --git a/business_knowledge/新知识库初版/全包词汇/KET词汇表_完整版.xlsx b/business_knowledge/新知识库初版/全包词汇/KET词汇表_完整版.xlsx new file mode 100644 index 0000000..bc131c0 Binary files /dev/null and b/business_knowledge/新知识库初版/全包词汇/KET词汇表_完整版.xlsx differ diff --git a/business_knowledge/新知识库初版/全包词汇/三级单词表_已标注词性.xlsx b/business_knowledge/新知识库初版/全包词汇/三级单词表_已标注词性.xlsx new file mode 100644 index 0000000..6525ac1 Binary files /dev/null and b/business_knowledge/新知识库初版/全包词汇/三级单词表_已标注词性.xlsx differ diff --git a/business_knowledge/新知识库初版/L1完整.xlsx b/business_knowledge/新知识库初版/现状/L1完整.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L1完整.xlsx rename to business_knowledge/新知识库初版/现状/L1完整.xlsx diff --git a/business_knowledge/新知识库初版/L1完整中独有的非重复单词.xlsx b/business_knowledge/新知识库初版/现状/L1完整中独有的非重复单词.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L1完整中独有的非重复单词.xlsx rename to business_knowledge/新知识库初版/现状/L1完整中独有的非重复单词.xlsx diff --git a/business_knowledge/新知识库初版/L2 剩余.xlsx b/business_knowledge/新知识库初版/现状/L2 剩余.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2 剩余.xlsx rename to business_knowledge/新知识库初版/现状/L2 剩余.xlsx diff --git a/business_knowledge/新知识库初版/L2 剩余_含重复标记.xlsx b/business_knowledge/新知识库初版/现状/L2 剩余_含重复标记.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2 剩余_含重复标记.xlsx rename to business_knowledge/新知识库初版/现状/L2 剩余_含重复标记.xlsx diff --git a/business_knowledge/新知识库初版/L2 已使用.xlsx b/business_knowledge/新知识库初版/现状/L2 已使用.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2 已使用.xlsx rename to business_knowledge/新知识库初版/现状/L2 已使用.xlsx diff --git a/business_knowledge/新知识库初版/L2 已使用_中考重复标记.xlsx b/business_knowledge/新知识库初版/现状/L2 已使用_中考重复标记.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2 已使用_中考重复标记.xlsx rename to business_knowledge/新知识库初版/现状/L2 已使用_中考重复标记.xlsx diff --git a/business_knowledge/新知识库初版/L2 已使用_含重复标记.xlsx b/business_knowledge/新知识库初版/现状/L2 已使用_含重复标记.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2 已使用_含重复标记.xlsx rename to business_knowledge/新知识库初版/现状/L2 已使用_含重复标记.xlsx diff --git a/business_knowledge/新知识库初版/L2原版.xlsx b/business_knowledge/新知识库初版/现状/L2原版.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2原版.xlsx rename to business_knowledge/新知识库初版/现状/L2原版.xlsx diff --git a/business_knowledge/新知识库初版/L2原版_中考重复标记.xlsx b/business_knowledge/新知识库初版/现状/L2原版_中考重复标记.xlsx similarity index 100% rename from business_knowledge/新知识库初版/L2原版_中考重复标记.xlsx rename to business_knowledge/新知识库初版/现状/L2原版_中考重复标记.xlsx diff --git a/business_knowledge/新知识库初版/现状/L2新版.xlsx b/business_knowledge/新知识库初版/现状/L2新版.xlsx new file mode 100644 index 0000000..3325910 Binary files /dev/null and b/business_knowledge/新知识库初版/现状/L2新版.xlsx differ diff --git a/business_knowledge/新知识库初版/现状/L2新版_L1重复标记.xlsx b/business_knowledge/新知识库初版/现状/L2新版_L1重复标记.xlsx new file mode 100644 index 0000000..bec8df7 Binary files /dev/null and b/business_knowledge/新知识库初版/现状/L2新版_L1重复标记.xlsx differ diff --git a/business_knowledge/新知识库初版/中考.xlsx b/business_knowledge/新知识库初版/现状/中考.xlsx similarity index 100% rename from business_knowledge/新知识库初版/中考.xlsx rename to business_knowledge/新知识库初版/现状/中考.xlsx diff --git a/business_knowledge/新知识库初版/重复单词_单词+词性相同.xlsx b/business_knowledge/新知识库初版/重复单词_单词+词性相同.xlsx deleted file mode 100644 index 122d651..0000000 Binary files a/business_knowledge/新知识库初版/重复单词_单词+词性相同.xlsx and /dev/null differ diff --git a/business_production/组件配置/interactive-component-json/db/components.db b/business_production/组件配置/interactive-component-json/db/components.db index 5fae844..24b03ab 100644 Binary files a/business_production/组件配置/interactive-component-json/db/components.db and b/business_production/组件配置/interactive-component-json/db/components.db differ diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L2 登龙秘笈_20260528_102508.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L2 登龙秘笈_20260528_102508.html new file mode 100644 index 0000000..96e8153 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L2 登龙秘笈_20260528_102508.html @@ -0,0 +1,4789 @@ + + + + + +L1-S2-U18-L2 登龙秘笈 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U18-L2 登龙秘笈

+
+ 生成时间: 2026-05-28 10:25:08 + 模型: doubao-seed-2.0-pro + Wiki: KNAZwTYXsib2Ijk6BrGciRelnSf?from=from_copylink +
+
+ +
+
+
0
核心互动
+
17
中互动
+
+
17
总组件
+
16
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读1 + cId: 1218201 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读2 + cId: 1218202 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话挖空3 + cId: 1218203 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话朗读4 + cId: 1218204 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话挖空5 + cId: 1218205 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话朗读6 + cId: 1218206 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话组句7 + cId: 1218207 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话选读8 + cId: 1218208 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 图片单选9 + cId: 1218209 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话挖空10 + cId: 1218210 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
audioFile
itemName
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话朗读11 + cId: 1218211 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话挖空12 + cId: 1218212 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话选读13 + cId: 1218213 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话组句14 + cId: 1218214 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 对话选择15 + cId: 1218215 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 16 + 核心互动-听力选择16 + cId: 1218216 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '核心互动-听力选择16' (清理后: '核心互动-听力选择')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 17 + 对话表达17 + cId: 1218217 + mid_dialog_express + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
asrPrompt
resourceMapping
preDialog
imgShowTimingList
img
tip
corFeedback
errFeedback
question
example
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L3 赤龙之躯 副本_20260528_144800.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L3 赤龙之躯 副本_20260528_144800.html new file mode 100644 index 0000000..7ba82d5 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L3 赤龙之躯 副本_20260528_144800.html @@ -0,0 +1,5188 @@ + + + + + +L1-S2-U18-L3 赤龙之躯 副本 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U18-L3 赤龙之躯 副本

+
+ 生成时间: 2026-05-28 14:48:00 + 模型: doubao-seed-2.0-pro + Wiki: EACQwH3FQirKhFk74cKchwakn5c +
+
+ +
+
+
1
核心互动
+
16
中互动
+
+
17
总组件
+
17
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读1 + cId: 1218301 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读2 + cId: 1218302 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话选择3 + cId: 1218303 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话朗读4 + cId: 1218304 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话选读5 + cId: 1218305 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话朗读6 + cId: 1218306 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话朗读7 + cId: 1218307 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 图片单选8 + cId: 1218308 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话朗读9 + cId: 1218309 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话选择10 + cId: 1218310 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话挖空11 + cId: 1218311 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话朗读12 + cId: 1218312 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话挖空13 + cId: 1218313 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 图片单选14 + cId: 1218314 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 核心看图说话15 + cId: 1218315 + core_speaking_image + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
taskDesc
sceneDesc
key
resourceMapping
cDesc
+
+ +
+ +
+ +
+ + + +
config
+
+ +
+ +
+ +
+ + + + + + + +
learningPart
closing
+
+ +
+ +
+ +
+ + + +
questionImg
+
+ +
+ +
+ +
+
1234567891011121314151617181920212223
+ +
+
+ +
+ +
+
1234567891011
+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+ +
+ +
```
+# 中间回合1
+Sunny: Who helped make this head?
+Brainy: Sunny 问你都有谁帮忙制作了这个龙头,你需要告诉她参与制作的人是谁。
+用户选项:
+(选项 A)Vicky and Matt. [正确]
+  Brainy: 太棒了!你正确说出了帮忙制作龙头的人。请大声朗读这句话!
+(选项 B)An eraser.
+  Brainy: 这句话的意思是一块橡皮,但 Sunny 现在问的是参与制作的人,不是制作工具。请再仔细听清问题,告诉 Sunny 是谁帮忙做的龙头。
+(选项 C)They are perfect.
+  Brainy: 这句话的意思是它们很完美,但 Sunny 现在问的是帮忙的人,不是对龙头外观的评价。请再仔细听清问题,告诉 Sunny 是谁帮忙做的龙头。
+
+# 中间回合2
+Sunny: What tools did you use to make this head? A ruler or an eraser?
+Brainy: Sunny 问你制作龙头用了什么工具,是尺子还是橡皮,你需要告诉她正确的工具。
+用户选项:
+(选项 A)Vicky and Matt.
+  Brainy: 这句话的意思是维姬和马特,但 Sunny 现在问的是制作工具,不是参与的人。请再仔细听清问题,告诉 Sunny 你用了什么工具。
+(选项 B)An eraser. [正确]
+  Brainy: 太棒了!你正确说出了制作龙头用的工具是橡皮。请大声朗读这句话!
+(选项 C)They are perfect.
+  Brainy: 这句话的意思是它们很完美,但 Sunny 现在问的是制作工具,不是对龙头的评价。请再仔细听清问题,告诉 Sunny 你用了什么工具。
+
+# 中间回合3
+Sunny: Do you think the eyes and mouth are too big or too small?
+Brainy: Sunny 问你觉得龙头的眼睛和嘴巴是太大了还是太小了,你需要给出你的评价。
+用户选项:
+(选项 A)Vicky and Matt.
+  Brainy: 这句话的意思是维姬和马特,但 Sunny 现在问的是你对龙头五官大小的看法,不是参与制作的人。请再仔细听清问题,回答 Sunny 的问题。
+(选项 B)An eraser.
+  Brainy: 这句话的意思是一块橡皮,但 Sunny 现在问的是你对龙头五官的评价,不是制作工具。请再仔细听清问题,回答 Sunny 的问题。
+(选项 C)No. They are perfect. [正确]
+  Brainy: 太棒了!你正确表达了对龙头的评价,觉得它的五官很完美。请大声朗读这句话!
+
+# 结尾回合
+Brainy: 你已经完整回答了 Sunny 的所有问题,成功向她介绍了龙头的制作相关信息,任务完成啦!
+```
+
+ +
+ +
perfect,eraser,ruler,Vicky,Matt,head
+
+
+ + +
+
+ +
+
+ 16 + 对话组句16 + cId: 1218316 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 17 + 对话选择17 + cId: 1218317 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L4 龙的真名_20260528_190154.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L4 龙的真名_20260528_190154.html new file mode 100644 index 0000000..0c8f46d --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L4 龙的真名_20260528_190154.html @@ -0,0 +1,5383 @@ + + + + + +L1-S2-U18-L4 龙的真名 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U18-L4 龙的真名

+
+ 生成时间: 2026-05-28 19:01:54 + 模型: doubao-seed-2.0-pro + Wiki: AMZ9wD88ViMmFSkB9W3cEPm9nsh +
+
+ +
+
+
1
核心互动
+
16
中互动
+
+
17
总组件
+
17
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读1 + cId: 1218401 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读2 + cId: 1218402 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 图片单选3 + cId: 1218403 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话朗读4 + cId: 1218404 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话朗读5 + cId: 1218405 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话挖空6 + cId: 1218406 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话选择7 + cId: 1218407 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话组句8 + cId: 1218408 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话挖空9 + cId: 1218409 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 图片单选10 + cId: 1218410 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话朗读11 + cId: 1218411 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话挖空12 + cId: 1218412 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话选读13 + cId: 1218413 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话选择14 + cId: 1218414 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 对话选读15 + cId: 1218415 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 16 + 对话挖空16 + cId: 1218416 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 17 + 核心看图说话17 + cId: 1218417 + core_speaking_image + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
taskDesc
sceneDesc
key
resourceMapping
cDesc
+
+ +
+ +
+ +
+ + + +
config
+
+ +
+ +
+ +
+ + + + + + + +
learningPart
closing
+
+ +
+ +
+ +
+ + + +
questionImg
+
+ +
+ +
+ +
+
1234567891011121314151617181920212223
+ +
+
+ +
+ +
+
1234567891011
+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+ +
+ +
```
+# 中间回合1
+Kim:What do I need?
+Brainy:Kim 问你写“十一”需要准备什么物品,你需要告诉她要用到的文具。
+用户选项:
+(选项 A)A pencil and a rubber. [正确]
+  Brainy:太棒了!你正确说出了需要铅笔和橡皮。请大声朗读这句话!
+(选项 B)Rub it out.
+  Brainy:这句话的意思是把它擦掉,现在 Kim 问的是需要什么物品,不是问要做什么动作,和当前情境不符。请再仔细听清问题,告诉 Kim 需要的物品。
+(选项 C)Write a line.
+  Brainy:这句话的意思是画一条线,现在 Kim 问的是需要什么物品,不是问书写的动作,和当前情境不符。请再仔细听清问题,告诉 Kim 需要的物品。
+
+# 中间回合2
+Kim:What should I do to write "ten"?
+Brainy:Kim 问你要写“十”的话应该怎么做,你需要告诉她对应的操作。
+用户选项:
+(选项 A)A pencil and a rubber.
+  Brainy:这句话的意思是一支铅笔和一块橡皮,现在 Kim 问的是写“十”的操作,不是问需要的物品,和当前情境不符。请再仔细听清问题,告诉 Kim 写“十”的方法。
+(选项 B)Rub it out. [正确]
+  Brainy:太棒了!你正确说出了写“十”需要先擦掉多余的部分。请大声朗读这句话!
+(选项 C)Write a line.
+  Brainy:这句话的意思是画一条线,这是写“一”的操作,不是写“十”的步骤,和当前情境不符。请再仔细听清问题,告诉 Kim 写“十”的方法。
+
+# 中间回合3
+Kim:What should I do to write "one"?
+Brainy:Kim 问你要写“一”的话应该怎么做,你需要告诉她对应的操作。
+用户选项:
+(选项 A)A pencil and a rubber.
+  Brainy:这句话的意思是一支铅笔和一块橡皮,现在 Kim 问的是写“一”的操作,不是问需要的物品,和当前情境不符。请再仔细听清问题,告诉 Kim 写“一”的方法。
+(选项 B)Rub it out.
+  Brainy:这句话的意思是把它擦掉,这是写“十”的操作,不是写“一”的步骤,和当前情境不符。请再仔细听清问题,告诉 Kim 写“一”的方法。
+(选项 C)Write a line. [正确]
+  Brainy:太棒了!你正确说出了写“一”需要画一条线。请大声朗读这句话!
+
+# 结尾回合
+Brainy:你已经成功告诉 Kim 写“十一”需要的物品和具体步骤,顺利解开谜题,任务完成啦!
+```
+
+ +
+ +
Eleven,Justin,Loong,Kim,pencil,rubber,write,Chinese
+
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L5 双龙会_20260528_190534.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L5 双龙会_20260528_190534.html new file mode 100644 index 0000000..aeaf5b6 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U18-L5 双龙会_20260528_190534.html @@ -0,0 +1,4073 @@ + + + + + +L1-S2-U18-L5 双龙会 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U18-L5 双龙会

+
+ 生成时间: 2026-05-28 19:05:34 + 模型: doubao-seed-2.0-pro + Wiki: P9bvw6nXziqzWZkxDmMcOZN4ndc +
+
+ +
+
+
0
核心互动
+
15
中互动
+
+
15
总组件
+
14
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读1 + cId: 1218501 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读2 + cId: 1218502 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话朗读3 + cId: 1218503 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话挖空4 + cId: 1218504 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话朗读5 + cId: 1218505 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话挖空6 + cId: 1218506 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话选读7 + cId: 1218507 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 看图拼词 + cId: 1218508 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '看图拼词' (清理后: '看图拼词')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 9 + 对话选择9 + cId: 1218509 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话朗读10 + cId: 1218510 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 图片单选11 + cId: 1218511 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话组句12 + cId: 1218512 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话表达13 + cId: 1218513 + mid_dialog_express + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
asrPrompt
resourceMapping
preDialog
imgShowTimingList
tip
corFeedback
errFeedback
question
example
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话组句14 + cId: 1218514 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 对话选读15 + cId: 1218515 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L1 客厅游戏 Afternoon Adventure_20260528_142339.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L1 客厅游戏 Afternoon Adventure_20260528_142339.html new file mode 100644 index 0000000..d7138e9 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L1 客厅游戏 Afternoon Adventure_20260528_142339.html @@ -0,0 +1,4763 @@ + + + + + +L1-S2-U19-L1 客厅游戏 Afternoon Adventure — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U19-L1 客厅游戏 Afternoon Adventure

+
+ 生成时间: 2026-05-28 14:23:39 + 模型: doubao-seed-2.0-pro + Wiki: UvDWwW4LSi8bfGkVUshcoehWnGd +
+
+ +
+
+
1
核心互动
+
15
中互动
+
+
16
总组件
+
16
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读 + cId: 1219101 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话挖空 + cId: 1219102 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话朗读 + cId: 1219103 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话朗读 + cId: 1219104 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话挖空 + cId: 1219105 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话朗读 + cId: 1219106 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话选择 + cId: 1219107 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 图片单选 + cId: 1219108 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话挖空 + cId: 1219109 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话挖空 + cId: 1219110 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 图片单选 + cId: 1219111 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话组句 + cId: 1219112 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话选读 + cId: 1219113 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话挖空 + cId: 1219114 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 核心听力选择 + cId: 1219115 + core_listening_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
sceneDesc
key
resourceMapping
cDesc
+
+ +
+ +
+ +
+
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
+ +
+
+ +
+ +
+ + + + + + + +
learningPart
closing
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+ +
+ +
```
+# 重点句子 1
+音频文本:Our living room is the space.
+讲解文本:刚刚听到的音频中,包含了一个关键短语 living room,意思是客厅,是我们家里用来休闲待客的房间哦。
+1. 听音选句
+Brainy:仔细听音频哦,你能找出和听到的内容一致的句子吗?
+- Our bedroom is the space.
+  - Brainy:哎呀,这句话里说的是bedroom(卧室),不是我们听到的living room哦,再仔细听一遍试试吧~
+- Our living room is the space. [正确]
+  - Brainy:太棒啦!你准确听出了句子里的重点短语living room,太厉害了!
+
+2. 听音选意
+Brainy:现在听我读句子哦,“我们的厨房是太空”,这句话和刚刚的英文意思一致吗?
+- 对 / Yes
+  - Brainy:不对哦,句子里说的不是厨房,再想想单词的意思,再试一次吧~
+- 错 / No [正确]
+  - Brainy:完全正确!你已经掌握了living room的意思啦,这句话其实是说“我们的客厅是太空”哦,你太棒啦!
+---
+# 完成反馈
+Brainy:很好!你已经回答完了全部问题,相信你已经听懂了这个任务中所有的重点句子。现在让我们来查看结果吧!
+```
+
+ +
+ +
You listened to the chat between the kid and Dad, and learned they played a fun space game this afternoon, with Dad free from work the whole time. (你听了孩子和爸爸的对话,得知他们今天下午玩了个有趣的太空游戏,爸爸整个下午都不用上班。)
+You heard they turned the living room into space during the game, using the room as the whole outer space area for their little adventure. (你听到他们游戏时把客厅改造成了太空,把这个房间当成他们小冒险的整个外太空区域。)
+You found out the captain of their space game sits on the armchair, which is the special, comfortable seat for the game leader. (你得知他们太空游戏里的船长坐在扶手椅上,这是给游戏负责人准备的特别舒适的座位。)
+You learned the glowing "star" they got in the game is actually the lamp in the living room, which looks just like a bright shining star. (你知道了他们在游戏里拿到的发光“星星”其实是客厅里的灯,它看起来就像一颗明亮闪耀的星星。)
+
+
+ + +
+
+ +
+
+ 16 + 对话表达 + cId: 1219116 + mid_dialog_express + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
asrPrompt
resourceMapping
preDialog
imgShowTimingList
tip
corFeedback
errFeedback
question
example
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L2 太空任务_20260528_173258.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L2 太空任务_20260528_173258.html new file mode 100644 index 0000000..a2b965b --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U19-L2 太空任务_20260528_173258.html @@ -0,0 +1,4154 @@ + + + + + +L1-S2-U19-L2 太空任务 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U19-L2 太空任务

+
+ 生成时间: 2026-05-28 17:32:58 + 模型: doubao-seed-2.0-pro + Wiki: AD7twKUFpi4b6WkDRWPclLx3ndd +
+
+ +
+
+
0
核心互动
+
17
中互动
+
+
17
总组件
+
16
成功
+
0
失败
+ +
+ + +
+
+ 1 + 图片多选 + cId: 1219201 + mid_image_multiple + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读 + cId: 1219202 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 图片单选 + cId: 1219203 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话朗读 + cId: 1219204 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话挖空 + cId: 1219205 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话朗读 + cId: 1219206 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话挖空 + cId: 1219207 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话朗读 + cId: 1219208 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话组句 + cId: 1219209 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 看图拼词 + cId: 1219210 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '看图拼词' (清理后: '看图拼词')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 11 + 对话朗读 + cId: 1219211 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话组句 + cId: 1219212 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话组句 + cId: 1219213 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话选读 + cId: 1219214 + mid_dialog_select + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 对话朗读 + cId: 1219215 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 16 + 对话朗读 + cId: 1219216 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 17 + 对话表达 + cId: 1219217 + mid_dialog_express + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
asrPrompt
resourceMapping
preDialog
imgShowTimingList
img
tip
corFeedback
errFeedback
question
example
postDialog
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/memory/.dreams/events.jsonl b/memory/.dreams/events.jsonl index 83a523a..0423455 100644 --- a/memory/.dreams/events.jsonl +++ b/memory/.dreams/events.jsonl @@ -69,3 +69,10 @@ {"type":"memory.recall.recorded","timestamp":"2026-05-27T07:13:49.224Z","query":"lesson 421 17-1 知识点 推送 后台","resultCount":1,"results":[{"path":"memory/2026-05-21.md","startLine":65,"endLine":75,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-27T07:13:49.225Z","query":"pushRelationKp 知识点推送 接口 notify","resultCount":1,"results":[{"path":"memory/2026-05-21.md","startLine":65,"endLine":75,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-27T07:13:57.033Z","query":"U17 421 push 推送到后台 组件配置 知识点推送 知识↑","resultCount":4,"results":[{"path":"memory/2026-05-20.md","startLine":1,"endLine":31,"score":1},{"path":"memory/2026-05-18.md","startLine":740,"endLine":770,"score":1},{"path":"memory/2026-05-18.md","startLine":766,"endLine":797,"score":1},{"path":"memory/2026-05-21.md","startLine":39,"endLine":56,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T02:24:09.414Z","query":"武钰涵 组件配置 json","resultCount":2,"results":[{"path":"memory/2026-05-07.md","startLine":354,"endLine":368,"score":1},{"path":"memory/2026-04-22.md","startLine":1,"endLine":8,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T02:35:33.338Z","query":"单词题型 难度分级 word question type difficulty level","resultCount":1,"results":[{"path":"memory/2026-05-12.md","startLine":137,"endLine":149,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T02:35:41.380Z","query":"单词题型 word question types 词义选择 拼写判断 vocabulary grading classification","resultCount":1,"results":[{"path":"memory/2026-05-12.md","startLine":137,"endLine":149,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T03:07:41.725Z","query":"6题 文本 配置json 单元挑战","resultCount":1,"results":[{"path":"memory/2026-05-12.md","startLine":137,"endLine":149,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T03:07:46.098Z","query":"6题 刘彦江 看图拼词 imgMakeWord","resultCount":1,"results":[{"path":"memory/2026-05-12.md","startLine":137,"endLine":149,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T03:08:15.128Z","query":"看图拼词 imgMakeWord 样例 6题 刘彦江 2026-05-25","resultCount":1,"results":[{"path":"memory/2026-05-07.md","startLine":1,"endLine":20,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-28T10:04:34.024Z","query":"李若松 身份 user_id","resultCount":2,"results":[{"path":"memory/2026-04-30.md","startLine":50,"endLine":63,"score":1},{"path":"memory/2026-05-08.md","startLine":18,"endLine":38,"score":1}]} diff --git a/memory/.dreams/short-term-recall.json b/memory/.dreams/short-term-recall.json index de76884..ce68a16 100644 --- a/memory/.dreams/short-term-recall.json +++ b/memory/.dreams/short-term-recall.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-05-27T07:13:57.033Z", + "updatedAt": "2026-05-28T10:04:34.024Z", "entries": { "memory:memory/2026-05-07.md:57:74": { "key": "memory:memory/2026-05-07.md:57:74", @@ -117,13 +117,13 @@ "endLine": 20, "source": "memory", "snippet": "# 2026-05-07 工作日志 ## 会话记录 ### 刘彦江 (ou_5af74c1fb96042e33cc0f16b5ca02cf4) — 单元挑战新增3个题型 - **时间:** 11:19 ~ 11:28 - **需求:** 单元挑战新增3个题型:阅读看图回答题(reading_pic_qa)、阅读看图判断题(reading_pic_judge)、写作看图回答题(writing_pic_qa) - **状态:** ✅ 已完成题型规范落地 - **交付内容:** 1. 创建3个题型SKILL.md: - `reading/common/reading_pic_qa/SKILL.md` — 阅读看图回答题(共享大图+多题Yes/No判断) - `reading/common/reading_pic_judge/SKILL.md` — 阅读看图判断题(每题独立配图+Yes/No判断) - `writing/common/writing_pic_qa/SKILL.md` — 写作看图回答题(看图+提示答案开头+填空) 2. 更新 `MEMORY.md` 全题型阶段归属规则 3. 明确题型JSON结构、难度等级(A/B/C/D四级)、能力标签、校验规则 - **关键决策:** 3个题型均为 L1&L2 共用,通过难度参数区分阶段;reading_pic_qa 共享大图,reading_pic_judge 每题独立配图 ### 李应瑛 (ou_1bd7317ae2ccfeb57e1132028847279e) — 单词表对比请求", - "recallCount": 10, + "recallCount": 11, "dailyCount": 0, "groundedCount": 0, - "totalScore": 10, + "totalScore": 11, "maxScore": 1, "firstRecalledAt": "2026-05-08T01:18:18.412Z", - "lastRecalledAt": "2026-05-26T01:58:13.120Z", + "lastRecalledAt": "2026-05-28T03:08:15.128Z", "queryHashes": [ "390d35f8d143", "fd4c9b7de37b", @@ -134,7 +134,8 @@ "7ca0207f1308", "d592c9ed5e0a", "5f858a7d5e0b", - "ab90b7e9cde8" + "ab90b7e9cde8", + "fbf96ac9320e" ], "recallDays": [ "2026-05-08", @@ -143,7 +144,8 @@ "2026-05-12", "2026-05-14", "2026-05-17", - "2026-05-26" + "2026-05-26", + "2026-05-28" ], "conceptTags": [ "reading-pic-qa", @@ -435,18 +437,20 @@ "endLine": 63, "source": "memory", "snippet": "格式: 【任务标题】【情境引入】【互动内容】【互动反馈】【后置对话】。目标词用$...$包裹,选项为图片区域编号(00/01/02)。 #### 5. 对话选择 (1条) — 规则: 参考 teaching_config 示例格式 + mid_dialog_choose prompt | ID | 任务标题 | 选项 | 知识点 | |---|---------|------|--------| | 1115514 | 判断蕃茄的好坏 | It is a good one. / It is a bad one. | one | 格式: 【任务标题】【资源配置】【情境引入】【互动内容】【后置对话】。互动内容含要求+选项+反馈。 ### 关键经验 - **组件配置列位置变更**: 本轮操作中发现sheet新增了「配置信息」列(C列),导致组件配置从F列移至G列。后续操作需先确认列结构。 - **Bot身份操作**: 所有飞书 sheet 写入均使用 Bot 身份(App ID: cli_a931175d41799cc7),Feishu API Token: t-g1044ubUXXMPFXBW75RILL7YZKRGAKQGWWDV2R3D - **对话选择组件**: 无独立 SKILL.md,需参照 interactive-component-json 的 prompt_registry.py 中 mid_dialog_choose 模板 + bitable 中已有的 teaching_config 示例格式", - "recallCount": 1, + "recallCount": 2, "dailyCount": 0, "groundedCount": 0, - "totalScore": 1, + "totalScore": 2, "maxScore": 1, "firstRecalledAt": "2026-05-13T03:09:54.362Z", - "lastRecalledAt": "2026-05-13T03:09:54.362Z", + "lastRecalledAt": "2026-05-28T10:04:34.024Z", "queryHashes": [ - "f151bc633ad1" + "f151bc633ad1", + "71e44ea68b09" ], "recallDays": [ - "2026-05-13" + "2026-05-13", + "2026-05-28" ], "conceptTags": [ "00/01/02", @@ -864,13 +868,13 @@ "endLine": 368, "source": "memory", "snippet": "- **需求:** 将 020102(I am...)和 020103(I am ready / Thank you)两套题合并为一个 `{first:..., second:...}` JSON,统一 questionSetID=0000001 - **状态:** ✅ 已完成 - **核心考点分析(用户强调):** 需分析每个句型的核心考点(孩子最容易犯错的地方),挖空对准核心考点 - I am/from 组:am(系动词第一人称)、from(介词选择)、student(a+名词结构) - Thank you for 组:for(介词选择,非 you)、helping(for+动名词,非 help/to help) - **输出文件:** `output/writing_pic_qa_combined.json` ### 刘彦江 — 组件配置-json 请求(L1-S2-U13-L4 沙漠之花) - **时间:** 16:45 ~ 17:51 - **文档:** `https://makee-interactive.feishu.cn/wiki/K5E1wzwk7it9t7kXvcbc6Xugnhc` - **状态:** ⚠️ 未完成 — pipeline 识别到 0 组件 - **根因:** 剧本文档的13个组件数据存储在 markdown 内联表格中(lark-table,5列×36行),而非内嵌 Sheet。当前 pipeline 的 parse_script 只从内嵌 Sheet 读取组件数据,不支持 markdown 表格组件解析 - **已识别组件(ma", - "recallCount": 9, + "recallCount": 10, "dailyCount": 0, "groundedCount": 0, - "totalScore": 9, + "totalScore": 10, "maxScore": 1, "firstRecalledAt": "2026-05-15T07:13:08.147Z", - "lastRecalledAt": "2026-05-25T08:56:32.837Z", + "lastRecalledAt": "2026-05-28T02:24:09.414Z", "queryHashes": [ "08364c8746ab", "4f08741ab4fd", @@ -880,14 +884,16 @@ "47f8c15000b2", "612fa3b04b06", "d6a04b711fd9", - "8742c0bf4e2b" + "8742c0bf4e2b", + "eb0902db0156" ], "recallDays": [ "2026-05-15", "2026-05-17", "2026-05-18", "2026-05-21", - "2026-05-25" + "2026-05-25", + "2026-05-28" ], "conceptTags": [ "am/from", @@ -907,13 +913,13 @@ "endLine": 8, "source": "memory", "snippet": "[李应瑛 2026-04-22 提出要求] 所有需要包含对话的内容(如剧本、互动组件等)必须要有【后置对话】字段,无后置对话时填写“无”。 [李应瑛 2026-04-22 确认规则] 剧本内嵌表格组件填写位置规则:仅当表格第一列(A列)明确标注为对话类类型(对话朗读/对话挖空/对话选读/对话组句等)时,才在同一行的H列(【组件】列)填写对应的组件内容,其他类型行(TL/场景/角色/图片/非对话类等)无需填写。 [李应瑛 2026-04-22 确认格式规则] 对话类组件字段换行规则:每个结构单独占一行,格式为: 【任务标题】xxx 【情境引入】xxx 【互动内容】xxx 【后置对话】xxx 单元格内使用\\n作为换行符实现,后续所有组件均遵循此格式。", - "recallCount": 8, + "recallCount": 9, "dailyCount": 0, "groundedCount": 0, - "totalScore": 8, + "totalScore": 9, "maxScore": 1, "firstRecalledAt": "2026-05-15T07:13:08.147Z", - "lastRecalledAt": "2026-05-25T08:56:32.837Z", + "lastRecalledAt": "2026-05-28T02:24:09.414Z", "queryHashes": [ "08364c8746ab", "4f08741ab4fd", @@ -922,14 +928,16 @@ "47f8c15000b2", "612fa3b04b06", "d6a04b711fd9", - "8742c0bf4e2b" + "8742c0bf4e2b", + "eb0902db0156" ], "recallDays": [ "2026-05-15", "2026-05-17", "2026-05-18", "2026-05-21", - "2026-05-25" + "2026-05-25", + "2026-05-28" ], "conceptTags": [ "对话朗读/对话挖空/对话选读/对话组句等", @@ -980,25 +988,30 @@ "endLine": 149, "source": "memory", "snippet": "- **根因:** explanation 文本中的 ASCII `\"` (U+0022) 被当作中文双引号使用,JSON 解析器将其视为字符串终止符 - **修复策略:** 从「句意选择题」中文列提取英文原句和选项 → json.dumps 重建标准 JSON(只修格式,不修内容) - **1216007 特殊处理:** 原始 JSON 损坏严重,需从中文列完全重建 - **二次修复(Q2 丢失问题):** 首次不完全修复导致 9 条记录的 Q2 被覆盖丢失,且 Q1 被 JSON 垃圾污染 → 从中文列全面重建 Q1+Q2 - **最终结果:10/10 条记录 sentenceMeaningMeaning 均可 json.loads 正确解析,每条含 2 题,无残留垃圾数据** - **受影响记录:** 1213004, 1213006, 1213010, 1214008, 1215005, 1216001, 1216004, 1216007, 1216008, 1216010 - **审校结果同步更新:** 移除所有 10 条的 `❌ JSON 解析失败` 标记 - **注意:** Q1 explanation 在重建时词表述可能微调(内容含义一致),如需精确原始 wording 可从中文列恢复后人工微调 ## 经验教训 ### bitable 写入需严格流程管控(2026-05-12) - 批量更新 JSON 字段时必须:写入前完整提取原始数据 → 写入后逐字段 diff 验证 → 发现异常立即回滚", - "recallCount": 6, + "recallCount": 10, "dailyCount": 0, "groundedCount": 0, - "totalScore": 6, + "totalScore": 10, "maxScore": 1, "firstRecalledAt": "2026-05-18T02:42:25.325Z", - "lastRecalledAt": "2026-05-26T06:06:25.056Z", + "lastRecalledAt": "2026-05-28T03:07:46.098Z", "queryHashes": [ "6b577a0b3971", "3069a934195d", "68f309fb88a7", "d8cc1fcace47", "a17120169039", - "45858b28edec" + "45858b28edec", + "79988fa9a90d", + "eef3a2e282db", + "6e1ba3a5e963", + "cf60b3f6d17d" ], "recallDays": [ "2026-05-18", "2026-05-25", - "2026-05-26" + "2026-05-26", + "2026-05-28" ], "conceptTags": [ "json.dumps", @@ -1503,13 +1516,13 @@ "endLine": 38, "source": "memory", "snippet": "4. question与questionDesc人称必须一致(统一改为 What does [角色] say? → 第一人称直接引语) - **JSON wrapper格式:** `{\"first\": 题组1完整JSON, \"second\": 题组2完整JSON}` - **输出文件:** `output/writing_pic_qa_000001_sample.json` ### 刘彦江 (ou_5af74c1fb96042e33cc0f16b5ca02cf4) — writing_pic_qa 生产流程标准化 + SKILL 重写 - **时间:** 09:34 ~ 09:46 - **需求:** 将完整生产流程补充到 SKILL.md,强化核心规则 - **状态:** ✅ 已完成 **核心规则强化(用户明确):** 1. **挖空 = 考察句型结构本身**,不是复述图片信息(如 Thank you for → 挖 for 而非 you) 2. **考察多样化**:同句型覆盖多种搭配(for + 名词 / for + 动名词、be + 身份 / be + 状态词等) 3. **语言难度匹配欧标 A1-A2**(Starters/Movers) 4. **题干不千篇一律**:question 随语境微调(如 \"What does she say about herself?\" / \"Where does she say she is going?\" / \"What does she say to her friend?\") **图片资源新规:** - 每个题组共享一", - "recallCount": 7, + "recallCount": 8, "dailyCount": 0, "groundedCount": 0, - "totalScore": 7, + "totalScore": 8, "maxScore": 1, "firstRecalledAt": "2026-05-20T06:31:39.981Z", - "lastRecalledAt": "2026-05-26T06:03:16.405Z", + "lastRecalledAt": "2026-05-28T10:04:34.024Z", "queryHashes": [ "688d2dceca9d", "e637236fe74b", @@ -1517,12 +1530,14 @@ "240a6a5dca41", "a455c766229c", "ff8454ebcc30", - "9c790f74fc5b" + "9c790f74fc5b", + "71e44ea68b09" ], "recallDays": [ "2026-05-20", "2026-05-25", - "2026-05-26" + "2026-05-26", + "2026-05-28" ], "conceptTags": [ "writing-pic-qa", diff --git a/memory/2026-05-28.md b/memory/2026-05-28.md new file mode 100644 index 0000000..868bf9d --- /dev/null +++ b/memory/2026-05-28.md @@ -0,0 +1,65 @@ +# 2026-05-28 工作日志 + +## 武钰涵(user_id: 8ag94eff)— 组件配置-json +- 处理剧本「L1-S2-U18-L2 登龙秘笈」(https://makee-interactive.feishu.cn/wiki/KNAZwTYXsib2Ijk6BrGciRelnSf) +- 结果:17个组件,成功16个,跳过1个(1218216 核心互动-听力选择16,因类型名"核心互动-听力选择"未被 match_component 识别) +- HTML 报告已通过 Bot 发送给武钰涵 + +## 武钰涵 — 词汇知识点审校(批次1: 20词) +- 用户提交了20个 L1 词汇知识点(含释义、音标、例句)请求审校 +- 校验结果:12个超纲(motorbike, hold, show, ago, grandmother, grandfather, visit, closed, home, understand, point, a lot of) +- 内容问题: + - 🔴 get 格式错误:使用 ``` 包裹内容,中英文之间缺少空格 + - 🟡 hold:3个义项(容纳/举办/保持)偏离核心释义"抓住" + - 🟡 point:例句2(pointed his flashlight)不匹配核心释义"指向" + - 🟡 ago:两个义项区分度低 + - 🟡 a lot of → 建议改为 lots of(与L1词库一致) + +## 武钰涵 — 词汇知识点审校(批次2: 20词) +- 用户提交第二批 20 个 L1 词汇知识点审校 +- 校验结果:16个超纲(仅 read/ruler/write/pencil 4个在库) +- 内容问题: + - 🔴 10个词条格式不统一(``` 包裹 + 中英文无空格):read, line, Chinese(adj.), perfect, eraser, Chinese(n.), write, rubber, playground, English(adj.) + - 🔴 Chinese(n.) 例句语法错误:"My neighbour is Chinese who cooks" → 应改为 "My neighbour is Chinese and cooks" + - 🔴 China 例句冗余:"Chinese food from China" + - 🔴 read 释义与词库不一致:申报"阅读,读懂",词库仅"阅读" + - 🟡 eraser/rubber 双重申报,内容几乎一致,建议二选一 + +## 武钰涵 — 词汇巩固题审校(批次1: 20词×3题=60题) +- 仅发现1个错误:home (1217116) 释义题答案设为[2](家庭),应为[0](回家,在家),与用户申报的词性 adv. 一致 +- 其余59题通过 + +## 武钰涵 — 词汇巩固题审校(批次2: 20词×3题=60题) +- 🔴 English (1218118): + - 释义题解析为 LLM 兜底拒答占位文本:"请你提供具体的题目和对应正确答案内容..." + - 答案设为[2](英语的),与申报 adj. 英文的不符,应为[0] +- 🟡 rubber (1218116):释义题例句"an eraser made of rubber"解释的是橡胶材料,非橡皮擦工具 +- 🟡 Chinese(n.) (1218113):例句"Chinese food"中 Chinese 是形容词非名词,与题目义项"中文"不符 +- 🟢 fun (1218119):解析末尾多余一个 `"` +- 🟢 eraser (1218111):`"an eraser表示"` 缺少空格 + +## 武钰涵 — 听力-P1-图片选择题生产 +- 题目集合 ID: 121601,难度 B级(L1 第3-4阶段,Starters 3) +- 知识点验证:10个词中仅 run(v.) 在 L1 词库,feet(foot 的复数)可视为已有,其余 8 个(bus, taxi, trousers, shorts, winter, snow, cold, bee)不在 L1/L2 词库 +- 用户指示直接生产,已按 SKILL 规范生成 2 个题组(各5题),含听力文本、图片描述、正确答案、能力标签 +- 已按 bitable 配置格式输出完整 jsonData + 题目完整配置 + 图片描述 +- B级规则:听力句子 5-8 词(均 7 词),每组 3 张同类物品不同属性图片 +- 能力标签:显性事实理解|关键词识别 ×2 + 基础语境理解|场景/物品/动作识别 + +## 梁辰(user_id: ou_28f02dcada1193913cfbb6310f8daf07)— HTML 诊断页面教研规则 JS 文件 +- 用户有一个 L1 关卡诊断工作台 HTML 页面(部署在腾讯云空间),当前只做数量级统计,缺少教研规则校验 +- 需求:提供可嵌入 HTML 的前端 JS 校验规则文件,使诊断有据可依 +- 输出:`output/l1_pedagogy_rules.js`(42KB),包含 8 个校验维度: + 1. 词汇超纲检测(基于 L1/L2 词库) + 2. 英式拼写检测(color→colour 等 115 组映射) + 3. Markdown 标记检测(`**`/`#`/`>` 等) + 4. 标点规范检测(全角混入、`~`、`!!!`) + 5. 题型-阶段匹配校验(20 种题型对应的 L1/L2 阶段映射) + 6. 台词质量分析(句子长度、负面评价) + 7. 知识点曝光度 + 8. 句型合规检测 +- 接入方式:`` + 调用 `PedagogyRules.validate(summary, level)` +- 数据源:L1 词库 147 词(过滤 enabled=true)、L2 词库 52 词、L1 句型 8 个、L2 句型(从 437MB bitable 导出中提取唯一结构) +- 技术注意:L2_pattern_list.json 体积 437MB(1,082,450 条记录),直接嵌入前端不可行,已提取唯一句型结构后嵌入 +- 所有 6 个测试用例通过 +- 用户后续想尝试其他对接方式(API 模式 / 飞书 Bot 联动 / CI 集成) diff --git a/output/l1_pedagogy_rules.js b/output/l1_pedagogy_rules.js new file mode 100644 index 0000000..3d94004 --- /dev/null +++ b/output/l1_pedagogy_rules.js @@ -0,0 +1,352 @@ +/** + * L1 Pedagogy Rules v1.0 + * 教研内容校验规则模块 + * + * 用法: + * API: PedagogyRules.validate(componentContent, chapterPrefix) + */ +(function(global) { + "use strict"; + + var WORD_LISTS = { + L1: {"red": {"pos": "adj", "meaning": "红色的", "unit": "S0-U0-L1", "difficulty": 1}, "hat": {"pos": "n", "meaning": "帽子", "unit": "S0-U0-L1", "difficulty": 1}, "blue": {"pos": "adj", "meaning": "蓝的", "unit": "S0-U0-L1", "difficulty": 1}, "bag": {"pos": "n", "meaning": "袋,包", "unit": "S0-U0-L1", "difficulty": 1}, "orange": {"pos": "n", "meaning": "橙子", "unit": "S1-U10-L3", "difficulty": 1}, "green": {"pos": "adj", "meaning": "绿色的", "unit": "S0-U0-L2", "difficulty": 1}, "dress": {"pos": "n", "meaning": "连衣裙", "unit": "S0-U0-L2", "difficulty": 1}, "there": {"pos": "adv", "meaning": "那里", "unit": "S0-U0-L3", "difficulty": 1}, "put": {"pos": "v", "meaning": "放", "unit": "S0-U0-L3", "difficulty": 1}, "purple": {"pos": "adj", "meaning": "紫色的", "unit": "S0-U0-L5", "difficulty": 1}, "give": {"pos": "v", "meaning": "给", "unit": "S0-U0-L3", "difficulty": 1}, "water": {"pos": "n", "meaning": "水", "unit": "S0-U0-L4", "difficulty": 1}, "here": {"pos": "adv", "meaning": "在这里", "unit": "S0-U0-L4", "difficulty": 1}, "dirty": {"pos": "adj", "meaning": "肮脏的", "unit": "S0-U0-L4", "difficulty": 1}, "clean": {"pos": "v", "meaning": "清洁", "unit": "S0-U0-L4", "difficulty": 1}, "pink": {"pos": "adj", "meaning": "粉红色的", "unit": "S0-U0-L2", "difficulty": 1}, "get": {"pos": "v", "meaning": "收到", "unit": "", "difficulty": 1}, "wall": {"pos": "n", "meaning": "墙", "unit": "S1-U1-L1", "difficulty": 1}, "table": {"pos": "n", "meaning": "桌子", "unit": "S1-U1-L1", "difficulty": 1}, "floor": {"pos": "n", "meaning": "地板", "unit": "S1-U1-L1", "difficulty": 1}, "hand": {"pos": "n", "meaning": "手", "unit": "S1-U1-L2", "difficulty": 1}, "foot": {"pos": "n", "meaning": "脚", "unit": "S1-U1-L2", "difficulty": 1}, "black": {"pos": "adj", "meaning": "黑的", "unit": "S1-U1-L2", "difficulty": 1}, "tomato": {"pos": "n", "meaning": "西红柿", "unit": "S1-U1-L3", "difficulty": 1}, "fish": {"pos": "n", "meaning": "鱼", "unit": "S1-U1-L3", "difficulty": 1}, "chicken": {"pos": "n", "meaning": "鸡肉", "unit": "S1-U1-L3", "difficulty": 1}, "nose": {"pos": "n", "meaning": "鼻子", "unit": "S1-U1-L4", "difficulty": 1}, "eye": {"pos": "n", "meaning": "眼睛", "unit": "S1-U1-L4", "difficulty": 1}, "brown": {"pos": "adj", "meaning": "棕色的", "unit": "S1-U1-L4", "difficulty": 1}, "yellow": {"pos": "adj", "meaning": "黄色的", "unit": "S1-U1-L5", "difficulty": 1}, "white": {"pos": "adj", "meaning": "白色的", "unit": "S1-U1-L5", "difficulty": 1}, "go": {"pos": "v", "meaning": "去,走", "unit": "S1-U2-L1", "difficulty": 1}, "dog": {"pos": "n", "meaning": "狗", "unit": "S1-U2-L1", "difficulty": 1}, "come": {"pos": "v", "meaning": "来", "unit": "S1-U2-L1", "difficulty": 1}, "cat": {"pos": "n", "meaning": "猫", "unit": "S1-U2-L1", "difficulty": 1}, "pie": {"pos": "n", "meaning": "馅饼", "unit": "S1-U2-L2", "difficulty": 1}, "can": {"pos": "v", "meaning": "能,会", "unit": "S1-U2-L4", "difficulty": 1}, "open": {"pos": "adj", "meaning": "开着的", "unit": "", "difficulty": 1}, "happy": {"pos": "adj", "meaning": "快乐的", "unit": "S1-U2-L5", "difficulty": 1}, "see": {"pos": "v", "meaning": "看见", "unit": "S1-U3-L1", "difficulty": 1}, "1": {"pos": "num", "meaning": "1", "unit": "S1-U3-L1", "difficulty": 1}, "paper": {"pos": "adj", "meaning": "纸质的", "unit": "", "difficulty": 1}, "book": {"pos": "n", "meaning": "书", "unit": "S1-U3-L2", "difficulty": 1}, "3": {"pos": "num", "meaning": "3", "unit": "S1-U3-L2", "difficulty": 1}, "2": {"pos": "num", "meaning": "2", "unit": "S1-U3-L2", "difficulty": 1}, "pen": {"pos": "n", "meaning": "钢笔", "unit": "S1-U3-L3", "difficulty": 1}, "box": {"pos": "n", "meaning": "盒子", "unit": "S1-U3-L3", "difficulty": 1}, "4": {"pos": "num", "meaning": "4", "unit": "S1-U3-L3", "difficulty": 1}, "6": {"pos": "num", "meaning": "6", "unit": "S1-U3-L4", "difficulty": 1}, "5": {"pos": "num", "meaning": "5", "unit": "S1-U3-L4", "difficulty": 1}, "sing": {"pos": "v", "meaning": "唱", "unit": "S1-U4-L1", "difficulty": 1}, "eat": {"pos": "v", "meaning": "吃", "unit": "S1-U4-L2", "difficulty": 1}, "7": {"pos": "num", "meaning": "7", "unit": "S1-U4-L2", "difficulty": 1}, "rug": {"pos": "n", "meaning": "小地毯", "unit": "S1-U4-L3", "difficulty": 1}, "door": {"pos": "n", "meaning": " 门", "unit": "", "difficulty": 1}, "bed": {"pos": "n", "meaning": "床", "unit": "S1-U4-L3", "difficulty": 1}, "9": {"pos": "num", "meaning": "9", "unit": "S1-U4-L4", "difficulty": 1}, "8": {"pos": "num", "meaning": "8", "unit": "S1-U4-L4", "difficulty": 1}, "10": {"pos": "num", "meaning": "10", "unit": "S1-U4-L5", "difficulty": 1}, "zoo": {"pos": "n", "meaning": "动物园", "unit": "", "difficulty": 1}, "zebra": {"pos": "n", "meaning": "斑马", "unit": "S1-U7-L2", "difficulty": 1}, "young": {"pos": "adj", "meaning": "年轻的", "unit": "", "difficulty": 1}, "year": {"pos": "n", "meaning": "年", "unit": "", "difficulty": 1}, "write": {"pos": "v", "meaning": "写", "unit": "", "difficulty": 1}, "woman": {"pos": "n", "meaning": "女人", "unit": "S1-U5-L1", "difficulty": 1}, "window": {"pos": "n", "meaning": "窗户", "unit": "S1-U12-L4", "difficulty": 1}, "warm": {"pos": "adj", "meaning": "温暖的", "unit": "", "difficulty": 1}, "want": {"pos": "v", "meaning": "想要", "unit": "", "difficulty": 1}, "walk": {"pos": "v", "meaning": "走", "unit": "S1-U7-L2", "difficulty": 1}, "very": {"pos": "adv", "meaning": "非常", "unit": "", "difficulty": 1}, "under": {"pos": "prep", "meaning": "在...下面", "unit": "S2-U14-L5", "difficulty": 1}, "try": {"pos": "v", "meaning": "尝试", "unit": "S1-U12-L5", "difficulty": 1}, "tree": {"pos": "n", "meaning": "树", "unit": "S1-U7-L1", "difficulty": 1}, "train": {"pos": "n", "meaning": "火车", "unit": "S1-U8-L1", "difficulty": 1}, "too": {"pos": "adv", "meaning": "也", "unit": "S1-U12-L2", "difficulty": 1}, "tomorrow": {"pos": "n", "meaning": "明天", "unit": "", "difficulty": 1}, "today": {"pos": "n", "meaning": "今天", "unit": "", "difficulty": 1}, "tiger": {"pos": "n", "meaning": "老虎", "unit": "S1-U5-L3", "difficulty": 1}, "those": {"pos": "pron", "meaning": "那些", "unit": "S1-U12-L1", "difficulty": 1}, "this": {"pos": "pron", "meaning": "这个", "unit": "S1-U12-L1", "difficulty": 1}, "these": {"pos": "pron", "meaning": "这些", "unit": "S1-U12-L1", "difficulty": 1}, "that": {"pos": "pron", "meaning": "那个", "unit": "S1-U12-L1", "difficulty": 1}, "tell": {"pos": "v", "meaning": "告诉", "unit": "", "difficulty": 1}, "teacher": {"pos": "n", "meaning": "老师", "unit": "S2-U14-L2", "difficulty": 1}, "talk": {"pos": "v", "meaning": "说话", "unit": "", "difficulty": 1}, "swim": {"pos": "v", "meaning": "游泳", "unit": "S1-U11-L5", "difficulty": 1}, "sun": {"pos": "n", "meaning": "太阳", "unit": "S1-U8-L2", "difficulty": 1}, "study": {"pos": "v", "meaning": "学习", "unit": "S2-U14-L1", "difficulty": 1}, "student": {"pos": "n", "meaning": "学生", "unit": "S2-U14-L1", "difficulty": 1}, "speak": {"pos": "v", "meaning": "说", "unit": "", "difficulty": 1}, "some": {"pos": "det", "meaning": "一些", "unit": "", "difficulty": 1}, "sofa": {"pos": "n", "meaning": "沙发", "unit": "", "difficulty": 1}, "sock": {"pos": "n", "meaning": "袜子", "unit": "", "difficulty": 1}, "small": {"pos": "adj", "meaning": "小的", "unit": "S1-U9-L1", "difficulty": 1}, "sleep": {"pos": "v", "meaning": "睡觉", "unit": "S1-U7-L4", "difficulty": 1}, "skirt": {"pos": "n", "meaning": "裙子", "unit": "S1-U9-L4", "difficulty": 1}, "sit": {"pos": "v", "meaning": "坐下", "unit": "S1-U8-L1", "difficulty": 1}, "sister": {"pos": "n", "meaning": "姐姐、妹妹", "unit": "S1-U8-L1", "difficulty": 1}, "short": {"pos": "adj", "meaning": "短的", "unit": "", "difficulty": 1}, "shoe": {"pos": "n", "meaning": "鞋", "unit": "", "difficulty": 1}, "shirt": {"pos": "n", "meaning": "衬衫", "unit": "S1-U9-L1", "difficulty": 1}, "ship": {"pos": "n", "meaning": "船", "unit": "", "difficulty": 1}, "sheep": {"pos": "n", "meaning": "绵羊", "unit": "S1-U5-L3", "difficulty": 1}, "school": {"pos": "n", "meaning": "学校", "unit": "S2-U14-L1", "difficulty": 1}, "say": {"pos": "v", "meaning": "说", "unit": "", "difficulty": 1}, "sad": {"pos": "adj", "meaning": "悲伤的", "unit": "", "difficulty": 1}, "run": {"pos": "v", "meaning": "跑", "unit": "", "difficulty": 1}, "ruler": {"pos": "n", "meaning": "尺子", "unit": "", "difficulty": 1}, "room": {"pos": "n", "meaning": "房间", "unit": "", "difficulty": 1}, "rice": {"pos": "n", "meaning": "米饭", "unit": "S1-U6-L4", "difficulty": 1}, "read": {"pos": "v", "meaning": "阅读", "unit": "", "difficulty": 1}, "radio": {"pos": "n", "meaning": "收音机", "unit": "S1-U9-L2", "difficulty": 1}, "potato": {"pos": "n", "meaning": "土豆", "unit": "S1-U7-L3", "difficulty": 1}, "play": {"pos": "v", "meaning": "玩", "unit": "S2-U14-L1", "difficulty": 1}, "plane": {"pos": "n", "meaning": "飞机", "unit": "S1-U8-L3", "difficulty": 1}, "pig": {"pos": "n", "meaning": "猪", "unit": "S1-U7-L4", "difficulty": 1}, "phone": {"pos": "v", "meaning": "给…...打电话", "unit": "", "difficulty": 1}, "people": {"pos": "n", "meaning": "人", "unit": "", "difficulty": 1}, "pencil": {"pos": "n", "meaning": "铅笔", "unit": "", "difficulty": 1}, "pea": {"pos": "n", "meaning": "豌豆", "unit": "", "difficulty": 1}, "pe": {"pos": "n", "meaning": "体育", "unit": "S1-U10-L4", "difficulty": 1}, "paint": {"pos": "v", "meaning": "(用颜料)绘画", "unit": "", "difficulty": 1}, "one": {"pos": "pron", "meaning": "一个人(或物)", "unit": "", "difficulty": 1}, "old": {"pos": "adj", "meaning": "年老的", "unit": "", "difficulty": 1}, "now": {"pos": "adv", "meaning": "现在", "unit": "", "difficulty": 1}, "night": {"pos": "n", "meaning": "夜晚", "unit": "S1-U12-L5", "difficulty": 1}, "nice": {"pos": "adj", "meaning": "好的", "unit": "S1-U6-L3", "difficulty": 1}, "new": {"pos": "adj", "meaning": "新的", "unit": "S1-U9-L2", "difficulty": 1}, "mum": {"pos": "n", "meaning": "妈妈", "unit": "S1-U8-L4", "difficulty": 1}, "mouth": {"pos": "n", "meaning": "嘴巴", "unit": "", "difficulty": 1}, "mother": {"pos": "n", "meaning": "母亲", "unit": "", "difficulty": 1}, "morning": {"pos": "n", "meaning": "早上", "unit": "S1-U12-L5", "difficulty": 1}, "month": {"pos": "n", "meaning": "月", "unit": "", "difficulty": 1}, "monkey": {"pos": "n", "meaning": "猴子", "unit": "S1-U7-L1", "difficulty": 1}, "minute": {"pos": "n", "meaning": "分钟", "unit": "", "difficulty": 1}, "mine": {"pos": "pron", "meaning": "我的", "unit": "", "difficulty": 1}, "milk": {"pos": "n", "meaning": "牛奶", "unit": "S1-U5-L2", "difficulty": 1}, "men": {"pos": "n", "meaning": "男人(man 的复数)", "unit": "", "difficulty": 1}, "meat": {"pos": "n", "meaning": "肉类", "unit": "S1-U10-L3", "difficulty": 1}, "me": {"pos": "pron", "meaning": "我", "unit": "S1-U12-L2", "difficulty": 1}, "mat": {"pos": "n", "meaning": "地垫", "unit": "S2-U14-L4", "difficulty": 1}, "many": {"pos": "det", "meaning": "许多", "unit": "", "difficulty": 1}, "man": {"pos": "n", "meaning": "男人", "unit": "S1-U5-L1", "difficulty": 1}, "make": {"pos": "v", "meaning": "制造", "unit": "S1-U6-L3", "difficulty": 1}, "love": {"pos": "v", "meaning": "爱", "unit": "S1-U12-L2", "difficulty": 1}, "lots of": {"pos": "det", "meaning": "大量的", "unit": "", "difficulty": 1}, "long": {"pos": "adj", "meaning": "长的", "unit": "S1-U7-L5 ", "difficulty": 1}}, + L2: {"dentist": {"pos": "n", "meaning": "牙医", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "department": {"pos": "n", "meaning": "部门", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "department store": {"pos": "n", "meaning": "百货商店", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "describe": {"pos": "v", "meaning": "描述", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "desert": {"pos": "v", "meaning": "遗弃", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "design": {"pos": "v", "meaning": "设计", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dessert": {"pos": "n", "meaning": "甜点", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "detailed": {"pos": "adj", "meaning": "详细的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "diary": {"pos": "n", "meaning": "日记", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "dictionary": {"pos": "n", "meaning": "词典", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "die": {"pos": "v", "meaning": "消失;灭亡", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "difference": {"pos": "n", "meaning": "差别", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "different": {"pos": "adj", "meaning": "不同的", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "difficult": {"pos": "adj", "meaning": "困难的", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "digital": {"pos": "adj", "meaning": "数字的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "digital camera": {"pos": "n", "meaning": "数码相机", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dinosaur": {"pos": "n", "meaning": "恐龙", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "diploma": {"pos": "n", "meaning": "文凭", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "directions": {"pos": "n", "meaning": "方向", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dirty": {"pos": "adj", "meaning": "脏的", "cefr": "Pre-A1", "cambridge": "Starters", "difficulty": 2}, "disco": {"pos": "n", "meaning": "迪斯科", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discount": {"pos": "n", "meaning": "折扣", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discover": {"pos": "v", "meaning": "发现", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discuss": {"pos": "vt", "meaning": "讨论", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dish": {"pos": "n", "meaning": "菜肴", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "display": {"pos": "v", "meaning": "显示", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "dive": {"pos": "v", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "diving": {"pos": "n", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "doctor": {"pos": "n", "meaning": "医生", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "document": {"pos": "n", "meaning": "文件", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dollar": {"pos": "n", "meaning": "美元", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dot": {"pos": "n", "meaning": "点", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "double": {"pos": "v", "meaning": "使加倍", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "double room": {"pos": "phrase", "meaning": "双人间", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "doubt": {"pos": "v", "meaning": "怀疑", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "download": {"pos": "v", "meaning": "下载", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "downstairs": {"pos": "adj", "meaning": "楼下的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dozen": {"pos": "det", "meaning": "十二", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "draw": {"pos": "n", "meaning": "抽签", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drawer": {"pos": "n", "meaning": "抽屉", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dream": {"pos": "v", "meaning": "梦想", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dress": {"pos": "v", "meaning": "穿衣服", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dressed": {"pos": "adj", "meaning": "穿着衣服的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drive": {"pos": "v", "meaning": "驾车送(人)", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "driving licence": {"pos": "n", "meaning": "驾驶执照", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drop": {"pos": "n", "meaning": "滴", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drugstore": {"pos": "n", "meaning": "药店", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drum": {"pos": "n", "meaning": "鼓", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "dry": {"pos": "v", "meaning": "变干", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "during": {"pos": "prep", "meaning": "在……期间", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "duty-free": {"pos": "adj", "meaning": "免税的", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "dvd player": {"pos": "n", "meaning": "DVD播放机", "cefr": "A2", "cambridge": "KET", "difficulty": 2}} + }; + + var PATTERNS = { + L1: [{"structure": "be + adj", "module": "形容词结构", "module_id": "M1", "examples": ["I am happy today.", "I am sad today."], "meaning": ["今天我很开心。", "今天我很难过。"]}, {"structure": "feel + adj", "module": "系表结构", "module_id": "M1", "examples": ["I feel tired.", "I feel happy."], "meaning": ["我感到累。", "我感到开心。"]}, {"structure": "look + adj", "module": "系表结构", "module_id": "M1", "examples": ["You look happy.", "He looks tired."], "meaning": ["你看起来很高兴。", "他看起来累了。"]}, {"structure": "adj and adj", "module": "并列形容词", "module_id": "M1", "examples": ["The room is big and clean.", "The dog is small and cute."], "meaning": ["房间又大又干净。", "这只狗又小又可爱。"]}, {"structure": "S + V", "module": "动词与时态", "module_id": "M2", "examples": ["I read books.", "We go to school."], "meaning": ["我读书。", "我们去上学。"]}, {"structure": "S + be + V-ing", "module": "动词与时态", "module_id": "M2", "examples": ["I am reading now.", "She is cooking."], "meaning": ["我正在读书。", "她在做饭。"]}, {"structure": "do/does + V", "module": "动词与时态", "module_id": "M2", "examples": ["Do you like apples?", "Does he like milk?"], "meaning": ["你喜欢苹果吗?", "他喜欢牛奶吗?"]}, {"structure": "can + V", "module": "动词与时态", "module_id": "M2", "examples": ["I can swim.", "She can sing."], "meaning": ["我会游泳。", "她会唱歌。"]}], + L2: [{"structure": "be + adj", "module": "形容词结构", "module_id": "M1", "example": "I am happy today because the sun is shining.", "meaning": "今天我很开心,因为阳光灿烂。"}, {"structure": "feel/look + adj", "module": "系表结构", "module_id": "M1", "example": "I feel nervous before my first day of school.", "meaning": "开学第一天前,我感到有些紧张。"}, {"structure": "look + adj", "module": "系表结构", "module_id": "M1", "example": "He looks friendly, and he always says hello to everyone.", "meaning": "他看起来很友好,而且总是主动跟每个人打招呼。"}, {"structure": "adj and adj", "module": "并列形容词", "module_id": "M1", "example": "She has a nice and friendly dog.", "meaning": "她有一只温顺友好的狗。"}, {"structure": "Something doesn’t feel right.", "module": "感觉异常", "module_id": "M1", "example": "Something doesn’t feel right with my phone.", "meaning": "我的手机有点不太对劲。"}, {"structure": "This looks ..., but I’ll try my best.", "module": "状态对比", "module_id": "M1", "example": "This looks difficult, but I’ll try my best.", "meaning": "这看起来很难,但我会尽力而为。"}, {"structure": "You look ... now.", "module": "感觉状态", "module_id": "M1", "example": "You look happy now.", "meaning": "你现在看起来很开心。"}, {"structure": "The ice is too ... so we can’t ...", "module": "困难描述", "module_id": "M1", "example": "The ice is too thin so we can't skate on it.", "meaning": "冰面太薄了,我们不能在上面滑冰。"}, {"structure": "How are you feeling today?", "module": "be + adj 描述", "module_id": "M1", "example": "How are you feeling today? \nYou look happy!", "meaning": "你今天感觉怎么样? \n你看起来挺开心的!"}, {"structure": "I’m feeling ... today.", "module": "be + adj 描述", "module_id": "M1", "example": "I'm feeling tired today.", "meaning": "今天我感觉有点累。"}, {"structure": "It’s very ... outside today.", "module": "be + adj 描述", "module_id": "M1", "example": "It's very cold outside today.", "meaning": "今天外面非常冷。"}, {"structure": "You look ... in this picture.", "module": "be + adj 描述", "module_id": "M1", "example": "You look happy in this picture.", "meaning": "在这张照片里,你看起来很开心。"}, {"structure": "My room is always ... and ....", "module": "be + adj 描述", "module_id": "M1", "example": "My room is always warm and cozy.", "meaning": "我的房间总是温暖又舒适。"}, {"structure": "The movie was really ....", "module": "be + adj 描述", "module_id": "M1", "example": "The movie was really funny.", "meaning": "这部电影真是太好笑了。"}, {"structure": "Our teacher is very ....", "module": "be + adj 描述", "module_id": "M1", "example": "Our teacher is very patient.", "meaning": "我们的老师非常有耐心。"}, {"structure": "This bag is too ....", "module": "be + adj 描述", "module_id": "M1", "example": "This bag is too small for all my books.", "meaning": "这个包装不下我所有的书。"}, {"structure": "Are you sure this is ....?", "module": "be + adj 描述", "module_id": "M1", "example": "Are you sure this is warm enough?", "meaning": "你确定这够暖和吗?"}, {"structure": "I’m not sure if it’s ....", "module": "be + adj 描述", "module_id": "M1", "example": "I’m not sure if it’s warm enough to swim today.", "meaning": "今天不太确定水温是否适合游泳。"}, {"structure": "What colour is ...?", "module": "be + adj 描述", "module_id": "M1", "example": "What color is your new school uniform?", "meaning": "你的新校服是什么颜色的?"}, {"structure": "It’s ...", "module": "be + adj 描述", "module_id": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Are you tired?", "module": "be + adj 描述", "module_id": "M1", "example": "Are you hungry after playing?", "meaning": "玩完之后你饿了吗?"}, {"structure": "Yes, I’m a bit ....", "module": "be + adj 描述", "module_id": "M1", "example": "Yes, I’m a bit nervous about my first day at school.", "meaning": "是的,我对开学第一天有点紧张。"}, {"structure": "No, I’m not ....", "module": "be + adj 描述", "module_id": "M1", "example": "No, I'm not tired.", "meaning": "不,我不累。"}, {"structure": "It’s so ... today!", "module": "be + adj 描述", "module_id": "M1", "example": "It's so sunny today!", "meaning": "今天阳光真好啊!"}, {"structure": "This looks ....", "module": "be + adj 描述", "module_id": "M1", "example": "This looks delicious.", "meaning": "这看起来很好吃。"}, {"structure": "You’re very ....", "module": "be + adj 描述", "module_id": "M1", "example": "You're very kind.", "meaning": "你真是太好了。"}, {"structure": "How’s the weather today?", "module": "be + adj 描述", "module_id": "M1", "example": "How’s the weather today? \nIt's sunny and warm.", "meaning": "今天天气怎么样? \n阳光很好,也很暖和。"}, {"structure": "It’s ... today.", "module": "be + adj 描述", "module_id": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Is it hot or cold?", "module": "be + adj 描述", "module_id": "M1", "example": "Is it hot or cold?", "meaning": "是热还是冷?"}, {"structure": "It’s not very ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's not very expensive.", "meaning": "{中文翻译}\n这个不是很贵。"}, {"structure": "The sky is so ....", "module": "be + adj 描述", "module_id": "M1", "example": "The sky is so blue today.", "meaning": "今天天空真蓝。"}, {"structure": "Everything looks....", "module": "be + adj 描述", "module_id": "M1", "example": "Everything looks tidy.", "meaning": "一切看起来都井井有条。"}, {"structure": "The view is really ....", "module": "be + adj 描述", "module_id": "M1", "example": "The view is really beautiful.", "meaning": "景色真是太美了。"}, {"structure": "That was very ....", "module": "be + adj 描述", "module_id": "M1", "example": "That was very interesting.", "meaning": "那可真有意思。"}, {"structure": "You seem ....", "module": "be + adj 描述", "module_id": "M1", "example": "You seem tired this morning.", "meaning": "今天早上你看起来有点累。"}, {"structure": "That’s really ...!", "module": "be + adj 描述", "module_id": "M1", "example": "That’s really amazing!", "meaning": "这真是太棒了!"}, {"structure": "The story is very ....", "module": "be + adj 描述", "module_id": "M1", "example": "The story is very exciting.", "meaning": "这个故事非常扣人心弦。"}, {"structure": "My parents are both ....", "module": "be + adj 描述", "module_id": "M1", "example": "My parents are both very busy on weekdays.", "meaning": "我父母在工作日都非常忙。"}, {"structure": "I’m afraid it’s ....", "module": "be + adj 描述", "module_id": "M1", "example": "I’m afraid it’s too cold.", "meaning": "恐怕天气太冷了。"}, {"structure": "It’s difficult to ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's difficult to find a good restaurant.", "meaning": "很难找到一家好餐馆。"}, {"structure": "It’s strange that ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's strange that the cat is sleeping so much today.", "meaning": "今天这只猫睡得这么多,真是奇怪。"}, {"structure": "The food smells....", "module": "be + adj 描述", "module_id": "M1", "example": "The food smells wonderful.", "meaning": "这食物闻起来真香。"}, {"structure": "-er than", "module": "比较级", "module_id": "M2", "example": "He is taller than me, but I run faster than him.", "meaning": "他比我高,但我跑得比他快。"}, {"structure": "What did you do yesterday?", "module": "动词与时态", "module_id": "M2", "example": "What did you do yesterday? I watched a movie with my family.", "meaning": "你昨天干什么了?我和家人一起看了场电影。"}, {"structure": "I ... yesterday.", "module": "动词与时态", "module_id": "M2", "example": "I called my grandmother yesterday.", "meaning": "昨天我给奶奶打了个电话。"}, {"structure": "What are you doing now?", "module": "动词与时态", "module_id": "M2", "example": "What are you doing now? \nI am helping my mom cook dinner.", "meaning": "你现在在做什么? \n我正在帮我妈妈做晚饭。"}, {"structure": "I’m ... now.", "module": "动词与时态", "module_id": "M2", "example": "I'm eating lunch now.", "meaning": "我正在吃午饭。"}, {"structure": "What will you do tomorrow?", "module": "动词与时态", "module_id": "M2", "example": "What will you do tomorrow?", "meaning": "你明天打算做什么?"}] + }; + + var BRITISH_SPELLING_MAP = {"color": "colour", "colors": "colours", "colored": "coloured", "coloring": "colouring", "favorite": "favourite", "favorites": "favourites", "center": "centre", "centers": "centres", "centered": "centred", "meter": "metre", "meters": "metres", "theater": "theatre", "theaters": "theatres", "traveling": "travelling", "traveled": "travelled", "traveler": "traveller", "canceled": "cancelled", "canceling": "cancelling", "jewelry": "jewellery", "organize": "organise", "organizes": "organises", "organized": "organised", "organizing": "organising", "realize": "realise", "realizes": "realises", "realized": "realised", "realizing": "realising", "recognize": "recognise", "recognizes": "recognises", "recognized": "recognised", "recognizing": "recognising", "apologize": "apologise", "apologizes": "apologises", "apologized": "apologised", "license": "licence", "defense": "defence", "offense": "offence", "pretense": "pretence", "dialog": "dialogue", "catalog": "catalogue", "analog": "analogue", "neighbor": "neighbour", "neighbors": "neighbours", "neighborhood": "neighbourhood", "honor": "honour", "honors": "honours", "honored": "honoured", "humor": "humour", "labor": "labour", "flavor": "flavour", "flavors": "flavours", "behavior": "behaviour", "behaviors": "behaviours", "rumor": "rumour", "program": "programme", "check": "cheque", "gray": "grey", "tire": "tyre", "tires": "tyres", "mold": "mould", "plow": "plough", "aluminum": "aluminium", "sulfur": "sulphur", "mom": "mum", "mommy": "mummy", "soccer": "football", "vacation": "holiday", "vacations": "holidays", "elevator": "lift", "elevators": "lifts", "apartment": "flat", "apartments": "flats", "trash": "rubbish", "garbage": "rubbish", "cookie": "biscuit", "cookies": "biscuits", "candy": "sweet", "candies": "sweets", "faucet": "tap", "faucets": "taps", "sidewalk": "pavement", "sidewalks": "pavements", "sneakers": "trainers", "pants": "trousers", "eraser": "rubber", "erasers": "rubbers", "fall": "autumn", "pajamas": "pyjamas", "highway": "motorway", "highways": "motorways", "railroad": "railway", "airplane": "aeroplane", "airplanes": "aeroplanes", "movie": "film", "movies": "films", "schedule": "timetable", "schedules": "timetables", "yard": "garden", "yards": "gardens", "cell phone": "mobile phone", "cell phones": "mobile phones", "gas": "petrol", "gas station": "petrol station", "mail": "post", "mailbox": "postbox", "mailman": "postman", "intersection": "crossroads", "intersections": "crossroads", "popsicle": "ice lolly", "popsicles": "ice lollies", "french fries": "chips", "eggplant": "aubergine", "zucchini": "courgette", "cilantro": "coriander", "rutabaga": "swede"}; + + var NEGATIVE_SELF_REGEX = ["i\\s*(?:'m|am)\\s+not\\s+good\\s+at", "i\\s*(?:'m|am)\\s+(?:so\\s+)?(?:bad|terrible|awful|stupid|dumb|ugly|fat|useless|hopeless)", "i\\s+(?:can't|cannot)\\s+do\\s+(?:it|this|that|anything)", "i\\s+(?:hate|dislike)\\s+(?:myself|me)", "i\\s*(?:'m|am)\\s+(?:too|so)\\s+(?:slow|dumb|stupid|weak)", "nobody\\s+(?:likes|loves)\\s+me", "i\\s*(?:'m|am)\\s+(?:never|always)\\s+(?:wrong|bad)"]; + + var TYPE_STAGE_RULES = { + listening_drag: ['L1'], + listening_choicePic: ['L1'], + listening_tableCloze: ['L2'], + listening_choiceLong: ['L2'], + listening_choiceShort: ['L2'], + listening_matchInfo: ['L2'], + reading_pic_judge: ['L1','L2'], + reading_pic_qa: ['L1','L2'], + reading_matchInfo: ['L2'], + reading_matchPara: ['L2'], + reading_choiceLong: ['L2'], + reading_cloze: ['L2'], + reading_openCloze: ['L2'], + writing_pic_qa: ['L1','L2'], + writing_email: ['L2'], + writing_picWrite: ['L2'], + speaking_pic_qa: ['L1'], + speaking_pic_recognize: ['L1'], + speaking_qa: ['L1','L2'], + speaking_topic: ['L2'] + }; + + var TYPE_ALIASES = { + '核心听力选择': 'listening_choicePic', '核心听力拖拽': 'listening_drag', + '听力拖拽': 'listening_drag', '听力选择': 'listening_choicePic', '听力选图': 'listening_choicePic', + '听音选图': 'listening_choicePic', '听力长对话': 'listening_choiceLong', + '听力短对话': 'listening_choiceShort', '听力信息匹配': 'listening_matchInfo', + '听力表格填空': 'listening_tableCloze', '听力填空': 'listening_tableCloze', + '阅读单选': 'reading_choiceLong', '阅读判断': 'reading_pic_judge', + '看图判断': 'reading_pic_judge', '看图回答': 'reading_pic_qa', + '阅读信息匹配': 'reading_matchInfo', '阅读段落匹配': 'reading_matchPara', + '阅读完形': 'reading_cloze', '阅读开放填空': 'reading_openCloze', + '写作看图': 'writing_pic_qa', '写作邮件': 'writing_email', + '口语日常': 'speaking_qa', '口语看图': 'speaking_pic_qa', + '口语话题': 'speaking_topic', '口语识物': 'speaking_pic_recognize', + '中对话跟读': 'speaking_qa', '中对话朗读': 'speaking_qa', + '中对话选读': 'listening_choiceShort', '中对话选义': 'listening_choiceShort', + '中对话挖空': 'reading_cloze', '中对话组句': 'reading_cloze', + '中对话选图': 'listening_choicePic', '中对话练习': 'listening_choiceShort', + '中对话口语': 'speaking_qa', '中对话听选': 'listening_choiceShort', + '选词补句': 'reading_cloze', '选词填空': 'reading_cloze', + '图片单选': 'reading_pic_judge', '图片多选': 'reading_pic_judge', + '选词排序': 'reading_cloze', '跟读判断': 'speaking_qa', + '朗读练习': 'speaking_qa', '选图填空': 'listening_choicePic', + '中图片单选': 'reading_pic_judge', '中选图单选': 'listening_choicePic', + '中跟读': 'speaking_qa', '中跟读练习': 'speaking_qa' + }; + + var RULES = { + dialog: { maxWordsPerSentence: 8, maxWordsCoreSentence: 7, warnWordsPerSentence: 10 }, + textFormat: { allowMarkdown: false }, + vocabulary: { allowL2WordsInL1: false }, + spelling: { preferBritish: true } + }; + + // ── Utils ── + function extractWords(text) { + if (!text) return []; + return text.toLowerCase().replace(/[^a-z\s'-]/g, ' ').split(/\s+/).filter(function(w) { return w.length > 1; }); + } + + function normalizeType(name) { + if (!name) return ''; + var clean = name.trim(); + return TYPE_ALIASES[clean] || clean.toLowerCase().replace(/\s+/g, '_'); + } + + // ── 1. Vocabulary check ── + function checkVocabulary(content, prefix) { + var issues = []; + var words = (content && content.keyPreview) || []; + var level = (prefix || 'L1').toUpperCase(); + var allowed = level === 'L1' ? WORD_LISTS.L1 : Object.assign({}, WORD_LISTS.L1, WORD_LISTS.L2); + + words.forEach(function(raw) { + var w = (raw || '').toLowerCase().trim(); + if (!w) return; + if (allowed[w]) { + var info = allowed[w]; + issues.push({ level: 'good', word: w, message: '"' + w + '" 在' + level + '词库内 (' + info.pos + ' ' + info.meaning + ')', detail: info }); + } else { + issues.push({ level: 'danger', word: w, message: '"' + w + '" 不在' + level + '词库中,疑似超纲词汇', detail: null }); + } + }); + + var failCount = issues.filter(function(i) { return i.level === 'danger'; }).length; + return { + title: '词汇超纲检测', + issues: issues, + passCount: issues.length - failCount, + failCount: failCount, + summary: issues.length === 0 ? '未检测到目标词汇' + : failCount === 0 ? '全部 ' + issues.length + ' 个目标词汇均在词库范围内' + : failCount + ' 个词汇疑似超纲 / ' + issues.length + ' 个目标词汇' + }; + } + + // ── 2. British spelling ── + function checkBritishSpelling(texts) { + var issues = []; + var allText = (texts || []).filter(Boolean).join(' '); + var words = extractWords(allText); + var seen = {}; + + words.forEach(function(w) { + var lowered = w.toLowerCase(); + if (seen[lowered]) return; + if (BRITISH_SPELLING_MAP[lowered]) { + seen[lowered] = true; + issues.push({ level: 'warn', word: w, suggested: BRITISH_SPELLING_MAP[lowered], + message: '"' + w + '" 为美式拼写,建议改为英式 "' + BRITISH_SPELLING_MAP[lowered] + '"' }); + } + }); + + return { + title: '英式拼写检测', + issues: issues, passCount: 0, failCount: issues.length, + summary: issues.length === 0 ? '未检测到美式拼写' : '发现 ' + issues.length + ' 处美式拼写' + }; + } + + // ── 3. Markdown detection ── + function checkMarkdownUsage(texts) { + var issues = []; + var text = (texts || []).filter(Boolean).join('\n'); + var mdPat = /\*\*|__|`[^`]+`|^#{1,6}\s|^\s*[-*+]\s|^\s*\d+\.\s|\*[^*]+\*|_[^_]+_/gm; + var match; + while ((match = mdPat.exec(text)) !== null) { + var start = Math.max(0, match.index - 20); + var end = Math.min(text.length, match.index + 40); + issues.push({ level: 'warn', mark: match[0], + context: '...' + text.substring(start, end).replace(/\n/g, ' ') + '...', + message: '检测到 Markdown 标记 "' + match[0] + '",应移除(文本输出禁止 Markdown)', + position: match.index }); + } + return { title: 'Markdown格式检测', issues: issues, passCount: 0, failCount: issues.length, + summary: issues.length === 0 ? '未检测到 Markdown 标记' : '发现 ' + issues.length + ' 处 Markdown 标记' }; + } + + // ── 4. Punctuation ── + function checkPunctuation(texts) { + var issues = []; + (texts || []).filter(Boolean).forEach(function(text) { + var cnMatch = text.match(/[\u3001\u3002\uff0c\uff1b\uff1a\u201c\u201d\u2018\u2019\uff01\uff08\uff09\u300a\u300b]/g); + if (cnMatch) { + issues.push({ level: 'warn', text: text.substring(0, 60), found: cnMatch, + message: '文本包含中文标点(英文内容应使用半角标点)' }); + } + if (/~/.test(text)) issues.push({ level: 'warn', text: text, message: '检测到非标准标点 "~",应使用标准英文标点' }); + if (/!!!|\?\?\?|!!\?|\?!!/.test(text)) issues.push({ level: 'warn', text: text, message: '检测到连续感叹号/问号,应使用标准英文标点' }); + }); + return { title: '标点符号规范', issues: issues, passCount: 0, failCount: issues.length, + summary: issues.length === 0 ? '标点符号使用规范' : '发现 ' + issues.length + ' 处标点符号不规范' }; + } + + // ── 5. Type-stage match ── + function checkTypeMatch(name, prefix) { + var level = (prefix || 'L1').toUpperCase(); + var normalized = normalizeType(name); + var allowed = TYPE_STAGE_RULES[normalized]; + if (!allowed) { + return { title: '题型-阶段匹配', resolvedType: normalized, isUnknown: true, + message: '组件类型 "' + name + '" 未在已知题型表中匹配,无法校验阶段归属' }; + } + if (allowed.indexOf(level) >= 0) { + return { title: '题型-阶段匹配', resolvedType: normalized, allowedStages: allowed, isMatch: true, + message: '题型 "' + name + '" -> ' + normalized + ' 在 ' + level + ' 阶段允许' }; + } + return { title: '题型-阶段匹配', resolvedType: normalized, allowedStages: allowed, isMatch: false, + message: '题型 "' + name + '" -> ' + normalized + ' 仅允许 ' + allowed.join(', ') + ',' + level + ' 不允许!' }; + } + + // ── 6. Dialog quality ── + function checkDialogQuality(lines, prefix) { + var issues = []; + var isL1 = (prefix || 'L1').toUpperCase() === 'L1'; + var maxWords = isL1 ? 7 : RULES.dialog.maxWordsPerSentence; + var warnWords = RULES.dialog.warnWordsPerSentence; + + (lines || []).filter(Boolean).forEach(function(line) { + var text = (line.text || line.content || line.sentence || line.dialog || '').trim(); + if (!text) return; + var wc = text.split(/\s+/).length; + if (wc > warnWords) { + issues.push({ level: 'danger', text: text, wordCount: wc, + message: '台词 ' + wc + ' 词,超过 ' + warnWords + ' 词上限,建议拆分为 2-3 个短句' }); + } else if (wc > maxWords) { + issues.push({ level: 'warn', text: text, wordCount: wc, + message: '台词 ' + wc + ' 词,超过 ' + maxWords + ' 词建议上限' }); + } + for (var j = 0; j < NEGATIVE_SELF_REGEX.length; j++) { + if (new RegExp(NEGATIVE_SELF_REGEX[j], 'i').test(text)) { + issues.push({ level: 'danger', text: text, + message: '台词含负面自我评价,违反价值观导向规范,应替换为正向表达' }); + break; + } + } + }); + + return { title: '对话台词质量', issues: issues, passCount: lines.length - issues.length, failCount: issues.length, + summary: issues.length === 0 ? lines.length + ' 句台词均符合质量标准' : issues.length + ' 项质量问题' }; + } + + // ── 7. Key exposure ── + function checkKeyExposure(targets, allDialogText) { + var issues = []; + var dialogLower = (allDialogText || '').toLowerCase(); + (targets || []).filter(Boolean).forEach(function(w) { + var lowered = w.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + var count = (dialogLower.match(new RegExp('\\b' + lowered + '\\b', 'g')) || []).length; + if (count === 0) { + issues.push({ level: 'danger', word: w, message: '目标词 "' + w + '" 在台词中未出现,知识点零暴露' }); + } else if (count === 1) { + issues.push({ level: 'warn', word: w, count: count, message: '目标词 "' + w + '" 仅在台词中出现 1 次,暴露不充分' }); + } else { + issues.push({ level: 'good', word: w, count: count, message: '"' + w + '" 出现 ' + count + ' 次,曝光充分' }); + } + }); + var passCnt = issues.filter(function(i) { return i.level === 'good'; }).length; + return { title: '知识点曝光度', issues: issues, passCount: passCnt, failCount: issues.length - passCnt, + summary: passCnt === issues.length ? '全部 ' + issues.length + ' 个知识点曝光充分' : (issues.length - passCnt) + ' 个知识点曝光不足' }; + } + + // ── 8. Pattern compliance ── + function checkPatternCompliance(sentences, prefix) { + var issues = []; + var level = (prefix || 'L1').toUpperCase(); + var allPatterns = level === 'L1' ? PATTERNS.L1 : PATTERNS.L1.concat(PATTERNS.L2); + var toCheck = (sentences || []).filter(Boolean).slice(0, 10); + + toCheck.forEach(function(sentence) { + var lowered = sentence.toLowerCase(); + var matched = false; + for (var p = 0; p < allPatterns.length; p++) { + var pat = allPatterns[p]; + var struct = pat.structure.toLowerCase(); + var keywords = struct.replace(/[^a-z\s]/g, ' ').split(/\s+/).filter(function(k) { return k.length > 2; }); + var matchedKw = keywords.filter(function(kw) { return lowered.indexOf(kw) >= 0; }); + if (matchedKw.length >= Math.ceil(keywords.length * 0.5) && keywords.length >= 2) { + matched = true; + issues.push({ level: 'good', sentence: sentence.substring(0, 80), pattern: pat.structure, module: pat.module, + message: '句型近似匹配到 "' + pat.structure + '" (' + pat.module + ')' }); + break; + } + } + if (!matched) { + issues.push({ level: 'info', sentence: sentence.substring(0, 80), + message: '句子未在' + level + '句型库中匹配到已知结构' }); + } + }); + + return { title: '句型合规检测', issues: issues, passCount: issues.filter(function(i) { return i.level === 'good'; }).length, + failCount: issues.filter(function(i) { return i.level !== 'good'; }).length, + summary: issues.length === 0 ? '未检测到待校验句型' : '完成句型合规检查' }; + } + + // ── Main API ── + function validate(content, prefix) { + var level = (prefix || 'L1').toUpperCase(); + var allTexts = []; + var allDialogs = []; + + if (content.realContent) { + var rc = content.realContent; + [rc.dialogs, rc.targets, rc.questions, rc.learning, rc.feedback].forEach(function(arr) { + if (Array.isArray(arr)) { allDialogs.push.apply(allDialogs, arr); allTexts.push.apply(allTexts, arr); } + else if (arr) { allDialogs.push(arr); allTexts.push(arr); } + }); + } + + var dialogLines = allDialogs.map(function(text) { return { text: text, isPoint: false }; }); + var results = []; + + var vr = checkVocabulary(content, level); + if (vr.issues.length > 0) results.push(vr); + + var sr = checkBritishSpelling(allTexts); + if (sr.issues.length > 0) results.push(sr); + + var mr = checkMarkdownUsage(allTexts); + if (mr.issues.length > 0) results.push(mr); + + var pr = checkPunctuation(allTexts); + if (pr.issues.length > 0) results.push(pr); + + if (dialogLines.length > 0) { results.push(checkDialogQuality(dialogLines, level)); } + + var targets = content.keyPreview || []; + var dialogText = allDialogs.join(' '); + if (targets.length > 0 && dialogText) { results.push(checkKeyExposure(targets, dialogText)); } + + if (allDialogs.length > 0) { results.push(checkPatternCompliance(allDialogs, level)); } + + var totalIssues = results.reduce(function(sum, r) { return sum + r.issues.length; }, 0); + var dangerCount = results.reduce(function(sum, r) { return sum + r.issues.filter(function(i) { return i.level === 'danger'; }).length; }, 0); + var warnCount = results.reduce(function(sum, r) { return sum + r.issues.filter(function(i) { return i.level === 'warn'; }).length; }, 0); + + return { + level: level, timestamp: new Date().toISOString(), + totalChecks: results.length, totalIssues: totalIssues, dangerCount: dangerCount, warnCount: warnCount, + results: results, + summary: totalIssues === 0 ? '内容校验通过' : (dangerCount > 0 ? dangerCount + ' 项严重问题,' + warnCount + ' 项警告' : warnCount + ' 项可优化项') + }; + } + + // ── Export ── + global.PedagogyRules = { + VERSION: '1.0.0', + validate: validate, + checkTypeMatch: checkTypeMatch, + checkVocabulary: checkVocabulary, + checkBritishSpelling: checkBritishSpelling, + checkMarkdownUsage: checkMarkdownUsage, + checkPunctuation: checkPunctuation, + checkDialogQuality: checkDialogQuality, + checkKeyExposure: checkKeyExposure, + checkPatternCompliance: checkPatternCompliance, + WORD_LISTS: WORD_LISTS, PATTERNS: PATTERNS, TYPE_STAGE_RULES: TYPE_STAGE_RULES, + BRITISH_SPELLING_MAP: BRITISH_SPELLING_MAP, RULES: RULES + }; + + console.log('[PedagogyRules] v1.0.0 | L1 words:' + Object.keys(WORD_LISTS.L1).length + + ' L2 words:' + Object.keys(WORD_LISTS.L2).length + ' L1 patterns:' + PATTERNS.L1.length + + ' L2 patterns:' + PATTERNS.L2.length + ' Type rules:' + Object.keys(TYPE_STAGE_RULES).length + + ' British:' + Object.keys(BRITISH_SPELLING_MAP).length); + +})(typeof window !== 'undefined' ? window : this); diff --git a/output/l1_pedagogy_rules_v2.js b/output/l1_pedagogy_rules_v2.js new file mode 100644 index 0000000..2f08b6b --- /dev/null +++ b/output/l1_pedagogy_rules_v2.js @@ -0,0 +1,392 @@ +(function(g){"use strict"; +var W={L1:{"red": {"pos": "adj", "meaning": "红色的", "unit": "S0-U0-L1", "diff": 1}, "hat": {"pos": "n", "meaning": "帽子", "unit": "S0-U0-L1", "diff": 1}, "blue": {"pos": "adj", "meaning": "蓝的", "unit": "S0-U0-L1", "diff": 1}, "bag": {"pos": "n", "meaning": "袋,包", "unit": "S0-U0-L1", "diff": 1}, "orange": {"pos": "n", "meaning": "橙子", "unit": "S1-U10-L3", "diff": 1}, "green": {"pos": "adj", "meaning": "绿色的", "unit": "S0-U0-L2", "diff": 1}, "dress": {"pos": "n", "meaning": "连衣裙", "unit": "S0-U0-L2", "diff": 1}, "there": {"pos": "adv", "meaning": "那里", "unit": "S0-U0-L3", "diff": 1}, "put": {"pos": "v", "meaning": "放", "unit": "S0-U0-L3", "diff": 1}, "purple": {"pos": "adj", "meaning": "紫色的", "unit": "S0-U0-L5", "diff": 1}, "give": {"pos": "v", "meaning": "给", "unit": "S0-U0-L3", "diff": 1}, "water": {"pos": "n", "meaning": "水", "unit": "S0-U0-L4", "diff": 1}, "here": {"pos": "adv", "meaning": "在这里", "unit": "S0-U0-L4", "diff": 1}, "dirty": {"pos": "adj", "meaning": "肮脏的", "unit": "S0-U0-L4", "diff": 1}, "clean": {"pos": "v", "meaning": "清洁", "unit": "S0-U0-L4", "diff": 1}, "pink": {"pos": "adj", "meaning": "粉红色的", "unit": "S0-U0-L2", "diff": 1}, "get": {"pos": "v", "meaning": "收到", "unit": "", "diff": 1}, "wall": {"pos": "n", "meaning": "墙", "unit": "S1-U1-L1", "diff": 1}, "table": {"pos": "n", "meaning": "桌子", "unit": "S1-U1-L1", "diff": 1}, "floor": {"pos": "n", "meaning": "地板", "unit": "S1-U1-L1", "diff": 1}, "hand": {"pos": "n", "meaning": "手", "unit": "S1-U1-L2", "diff": 1}, "foot": {"pos": "n", "meaning": "脚", "unit": "S1-U1-L2", "diff": 1}, "black": {"pos": "adj", "meaning": "黑的", "unit": "S1-U1-L2", "diff": 1}, "tomato": {"pos": "n", "meaning": "西红柿", "unit": "S1-U1-L3", "diff": 1}, "fish": {"pos": "n", "meaning": "鱼", "unit": "S1-U1-L3", "diff": 1}, "chicken": {"pos": "n", "meaning": "鸡肉", "unit": "S1-U1-L3", "diff": 1}, "nose": {"pos": "n", "meaning": "鼻子", "unit": "S1-U1-L4", "diff": 1}, "eye": {"pos": "n", "meaning": "眼睛", "unit": "S1-U1-L4", "diff": 1}, "brown": {"pos": "adj", "meaning": "棕色的", "unit": "S1-U1-L4", "diff": 1}, "yellow": {"pos": "adj", "meaning": "黄色的", "unit": "S1-U1-L5", "diff": 1}, "white": {"pos": "adj", "meaning": "白色的", "unit": "S1-U1-L5", "diff": 1}, "go": {"pos": "v", "meaning": "去,走", "unit": "S1-U2-L1", "diff": 1}, "dog": {"pos": "n", "meaning": "狗", "unit": "S1-U2-L1", "diff": 1}, "come": {"pos": "v", "meaning": "来", "unit": "S1-U2-L1", "diff": 1}, "cat": {"pos": "n", "meaning": "猫", "unit": "S1-U2-L1", "diff": 1}, "pie": {"pos": "n", "meaning": "馅饼", "unit": "S1-U2-L2", "diff": 1}, "can": {"pos": "v", "meaning": "能,会", "unit": "S1-U2-L4", "diff": 1}, "open": {"pos": "adj", "meaning": "开着的", "unit": "", "diff": 1}, "happy": {"pos": "adj", "meaning": "快乐的", "unit": "S1-U2-L5", "diff": 1}, "see": {"pos": "v", "meaning": "看见", "unit": "S1-U3-L1", "diff": 1}, "1": {"pos": "num", "meaning": "1", "unit": "S1-U3-L1", "diff": 1}, "paper": {"pos": "adj", "meaning": "纸质的", "unit": "", "diff": 1}, "book": {"pos": "n", "meaning": "书", "unit": "S1-U3-L2", "diff": 1}, "3": {"pos": "num", "meaning": "3", "unit": "S1-U3-L2", "diff": 1}, "2": {"pos": "num", "meaning": "2", "unit": "S1-U3-L2", "diff": 1}, "pen": {"pos": "n", "meaning": "钢笔", "unit": "S1-U3-L3", "diff": 1}, "box": {"pos": "n", "meaning": "盒子", "unit": "S1-U3-L3", "diff": 1}, "4": {"pos": "num", "meaning": "4", "unit": "S1-U3-L3", "diff": 1}, "6": {"pos": "num", "meaning": "6", "unit": "S1-U3-L4", "diff": 1}, "5": {"pos": "num", "meaning": "5", "unit": "S1-U3-L4", "diff": 1}, "sing": {"pos": "v", "meaning": "唱", "unit": "S1-U4-L1", "diff": 1}, "eat": {"pos": "v", "meaning": "吃", "unit": "S1-U4-L2", "diff": 1}, "7": {"pos": "num", "meaning": "7", "unit": "S1-U4-L2", "diff": 1}, "rug": {"pos": "n", "meaning": "小地毯", "unit": "S1-U4-L3", "diff": 1}, "door": {"pos": "n", "meaning": " 门", "unit": "", "diff": 1}, "bed": {"pos": "n", "meaning": "床", "unit": "S1-U4-L3", "diff": 1}, "9": {"pos": "num", "meaning": "9", "unit": "S1-U4-L4", "diff": 1}, "8": {"pos": "num", "meaning": "8", "unit": "S1-U4-L4", "diff": 1}, "10": {"pos": "num", "meaning": "10", "unit": "S1-U4-L5", "diff": 1}, "zoo": {"pos": "n", "meaning": "动物园", "unit": "", "diff": 1}, "zebra": {"pos": "n", "meaning": "斑马", "unit": "S1-U7-L2", "diff": 1}, "young": {"pos": "adj", "meaning": "年轻的", "unit": "", "diff": 1}, "year": {"pos": "n", "meaning": "年", "unit": "", "diff": 1}, "write": {"pos": "v", "meaning": "写", "unit": "", "diff": 1}, "woman": {"pos": "n", "meaning": "女人", "unit": "S1-U5-L1", "diff": 1}, "window": {"pos": "n", "meaning": "窗户", "unit": "S1-U12-L4", "diff": 1}, "warm": {"pos": "adj", "meaning": "温暖的", "unit": "", "diff": 1}, "want": {"pos": "v", "meaning": "想要", "unit": "", "diff": 1}, "walk": {"pos": "v", "meaning": "走", "unit": "S1-U7-L2", "diff": 1}, "very": {"pos": "adv", "meaning": "非常", "unit": "", "diff": 1}, "under": {"pos": "prep", "meaning": "在...下面", "unit": "S2-U14-L5", "diff": 1}, "try": {"pos": "v", "meaning": "尝试", "unit": "S1-U12-L5", "diff": 1}, "tree": {"pos": "n", "meaning": "树", "unit": "S1-U7-L1", "diff": 1}, "train": {"pos": "n", "meaning": "火车", "unit": "S1-U8-L1", "diff": 1}, "too": {"pos": "adv", "meaning": "也", "unit": "S1-U12-L2", "diff": 1}, "tomorrow": {"pos": "n", "meaning": "明天", "unit": "", "diff": 1}, "today": {"pos": "n", "meaning": "今天", "unit": "", "diff": 1}, "tiger": {"pos": "n", "meaning": "老虎", "unit": "S1-U5-L3", "diff": 1}, "those": {"pos": "pron", "meaning": "那些", "unit": "S1-U12-L1", "diff": 1}, "this": {"pos": "pron", "meaning": "这个", "unit": "S1-U12-L1", "diff": 1}, "these": {"pos": "pron", "meaning": "这些", "unit": "S1-U12-L1", "diff": 1}, "that": {"pos": "pron", "meaning": "那个", "unit": "S1-U12-L1", "diff": 1}, "tell": {"pos": "v", "meaning": "告诉", "unit": "", "diff": 1}, "teacher": {"pos": "n", "meaning": "老师", "unit": "S2-U14-L2", "diff": 1}, "talk": {"pos": "v", "meaning": "说话", "unit": "", "diff": 1}, "swim": {"pos": "v", "meaning": "游泳", "unit": "S1-U11-L5", "diff": 1}, "sun": {"pos": "n", "meaning": "太阳", "unit": "S1-U8-L2", "diff": 1}, "study": {"pos": "v", "meaning": "学习", "unit": "S2-U14-L1", "diff": 1}, "student": {"pos": "n", "meaning": "学生", "unit": "S2-U14-L1", "diff": 1}, "speak": {"pos": "v", "meaning": "说", "unit": "", "diff": 1}, "some": {"pos": "det", "meaning": "一些", "unit": "", "diff": 1}, "sofa": {"pos": "n", "meaning": "沙发", "unit": "", "diff": 1}, "sock": {"pos": "n", "meaning": "袜子", "unit": "", "diff": 1}, "small": {"pos": "adj", "meaning": "小的", "unit": "S1-U9-L1", "diff": 1}, "sleep": {"pos": "v", "meaning": "睡觉", "unit": "S1-U7-L4", "diff": 1}, "skirt": {"pos": "n", "meaning": "裙子", "unit": "S1-U9-L4", "diff": 1}, "sit": {"pos": "v", "meaning": "坐下", "unit": "S1-U8-L1", "diff": 1}, "sister": {"pos": "n", "meaning": "姐姐、妹妹", "unit": "S1-U8-L1", "diff": 1}, "short": {"pos": "adj", "meaning": "短的", "unit": "", "diff": 1}, "shoe": {"pos": "n", "meaning": "鞋", "unit": "", "diff": 1}, "shirt": {"pos": "n", "meaning": "衬衫", "unit": "S1-U9-L1", "diff": 1}, "ship": {"pos": "n", "meaning": "船", "unit": "", "diff": 1}, "sheep": {"pos": "n", "meaning": "绵羊", "unit": "S1-U5-L3", "diff": 1}, "school": {"pos": "n", "meaning": "学校", "unit": "S2-U14-L1", "diff": 1}, "say": {"pos": "v", "meaning": "说", "unit": "", "diff": 1}, "sad": {"pos": "adj", "meaning": "悲伤的", "unit": "", "diff": 1}, "run": {"pos": "v", "meaning": "跑", "unit": "", "diff": 1}, "ruler": {"pos": "n", "meaning": "尺子", "unit": "", "diff": 1}, "room": {"pos": "n", "meaning": "房间", "unit": "", "diff": 1}, "rice": {"pos": "n", "meaning": "米饭", "unit": "S1-U6-L4", "diff": 1}, "read": {"pos": "v", "meaning": "阅读", "unit": "", "diff": 1}, "radio": {"pos": "n", "meaning": "收音机", "unit": "S1-U9-L2", "diff": 1}, "potato": {"pos": "n", "meaning": "土豆", "unit": "S1-U7-L3", "diff": 1}, "play": {"pos": "v", "meaning": "玩", "unit": "S2-U14-L1", "diff": 1}, "plane": {"pos": "n", "meaning": "飞机", "unit": "S1-U8-L3", "diff": 1}, "pig": {"pos": "n", "meaning": "猪", "unit": "S1-U7-L4", "diff": 1}, "phone": {"pos": "v", "meaning": "给…...打电话", "unit": "", "diff": 1}, "people": {"pos": "n", "meaning": "人", "unit": "", "diff": 1}, "pencil": {"pos": "n", "meaning": "铅笔", "unit": "", "diff": 1}, "pea": {"pos": "n", "meaning": "豌豆", "unit": "", "diff": 1}, "pe": {"pos": "n", "meaning": "体育", "unit": "S1-U10-L4", "diff": 1}, "paint": {"pos": "v", "meaning": "(用颜料)绘画", "unit": "", "diff": 1}, "one": {"pos": "pron", "meaning": "一个人(或物)", "unit": "", "diff": 1}, "old": {"pos": "adj", "meaning": "年老的", "unit": "", "diff": 1}, "now": {"pos": "adv", "meaning": "现在", "unit": "", "diff": 1}, "night": {"pos": "n", "meaning": "夜晚", "unit": "S1-U12-L5", "diff": 1}, "nice": {"pos": "adj", "meaning": "好的", "unit": "S1-U6-L3", "diff": 1}, "new": {"pos": "adj", "meaning": "新的", "unit": "S1-U9-L2", "diff": 1}, "mum": {"pos": "n", "meaning": "妈妈", "unit": "S1-U8-L4", "diff": 1}, "mouth": {"pos": "n", "meaning": "嘴巴", "unit": "", "diff": 1}, "mother": {"pos": "n", "meaning": "母亲", "unit": "", "diff": 1}, "morning": {"pos": "n", "meaning": "早上", "unit": "S1-U12-L5", "diff": 1}, "month": {"pos": "n", "meaning": "月", "unit": "", "diff": 1}, "monkey": {"pos": "n", "meaning": "猴子", "unit": "S1-U7-L1", "diff": 1}, "minute": {"pos": "n", "meaning": "分钟", "unit": "", "diff": 1}, "mine": {"pos": "pron", "meaning": "我的", "unit": "", "diff": 1}, "milk": {"pos": "n", "meaning": "牛奶", "unit": "S1-U5-L2", "diff": 1}, "men": {"pos": "n", "meaning": "男人(man 的复数)", "unit": "", "diff": 1}, "meat": {"pos": "n", "meaning": "肉类", "unit": "S1-U10-L3", "diff": 1}, "me": {"pos": "pron", "meaning": "我", "unit": "S1-U12-L2", "diff": 1}, "mat": {"pos": "n", "meaning": "地垫", "unit": "S2-U14-L4", "diff": 1}, "many": {"pos": "det", "meaning": "许多", "unit": "", "diff": 1}, "man": {"pos": "n", "meaning": "男人", "unit": "S1-U5-L1", "diff": 1}, "make": {"pos": "v", "meaning": "制造", "unit": "S1-U6-L3", "diff": 1}, "love": {"pos": "v", "meaning": "爱", "unit": "S1-U12-L2", "diff": 1}, "lots of": {"pos": "det", "meaning": "大量的", "unit": "", "diff": 1}, "long": {"pos": "adj", "meaning": "长的", "unit": "S1-U7-L5 ", "diff": 1}},L2:{"dentist": {"pos": "n", "meaning": "牙医", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "department": {"pos": "n", "meaning": "部门", "cefr": "A2", "cambridge": "KET", "diff": 2}, "department store": {"pos": "n", "meaning": "百货商店", "cefr": "A2", "cambridge": "KET", "diff": 2}, "describe": {"pos": "v", "meaning": "描述", "cefr": "A2", "cambridge": "KET", "diff": 2}, "desert": {"pos": "v", "meaning": "遗弃", "cefr": "A2", "cambridge": "KET", "diff": 2}, "design": {"pos": "v", "meaning": "设计", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dessert": {"pos": "n", "meaning": "甜点", "cefr": "A2", "cambridge": "KET", "diff": 2}, "detailed": {"pos": "adj", "meaning": "详细的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "diary": {"pos": "n", "meaning": "日记", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "dictionary": {"pos": "n", "meaning": "词典", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "die": {"pos": "v", "meaning": "消失;灭亡", "cefr": "A2", "cambridge": "KET", "diff": 2}, "difference": {"pos": "n", "meaning": "差别", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "different": {"pos": "adj", "meaning": "不同的", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "difficult": {"pos": "adj", "meaning": "困难的", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "digital": {"pos": "adj", "meaning": "数字的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "digital camera": {"pos": "n", "meaning": "数码相机", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dinosaur": {"pos": "n", "meaning": "恐龙", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "diploma": {"pos": "n", "meaning": "文凭", "cefr": "A2", "cambridge": "KET", "diff": 2}, "directions": {"pos": "n", "meaning": "方向", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dirty": {"pos": "adj", "meaning": "脏的", "cefr": "Pre-A1", "cambridge": "Starters", "diff": 2}, "disco": {"pos": "n", "meaning": "迪斯科", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discount": {"pos": "n", "meaning": "折扣", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discover": {"pos": "v", "meaning": "发现", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discuss": {"pos": "vt", "meaning": "讨论", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dish": {"pos": "n", "meaning": "菜肴", "cefr": "A2", "cambridge": "KET", "diff": 2}, "display": {"pos": "v", "meaning": "显示", "cefr": "B1", "cambridge": "PET", "diff": 2}, "dive": {"pos": "v", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "diff": 2}, "diving": {"pos": "n", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "diff": 2}, "doctor": {"pos": "n", "meaning": "医生", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "document": {"pos": "n", "meaning": "文件", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dollar": {"pos": "n", "meaning": "美元", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dot": {"pos": "n", "meaning": "点", "cefr": "A2", "cambridge": "KET", "diff": 2}, "double": {"pos": "v", "meaning": "使加倍", "cefr": "A2", "cambridge": "KET", "diff": 2}, "double room": {"pos": "phrase", "meaning": "双人间", "cefr": "A2", "cambridge": "KET", "diff": 2}, "doubt": {"pos": "v", "meaning": "怀疑", "cefr": "B1", "cambridge": "PET", "diff": 2}, "download": {"pos": "v", "meaning": "下载", "cefr": "A2", "cambridge": "KET", "diff": 2}, "downstairs": {"pos": "adj", "meaning": "楼下的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dozen": {"pos": "det", "meaning": "十二", "cefr": "B1", "cambridge": "PET", "diff": 2}, "draw": {"pos": "n", "meaning": "抽签", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drawer": {"pos": "n", "meaning": "抽屉", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dream": {"pos": "v", "meaning": "梦想", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dress": {"pos": "v", "meaning": "穿衣服", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dressed": {"pos": "adj", "meaning": "穿着衣服的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drive": {"pos": "v", "meaning": "驾车送(人)", "cefr": "A2", "cambridge": "KET", "diff": 2}, "driving licence": {"pos": "n", "meaning": "驾驶执照", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drop": {"pos": "n", "meaning": "滴", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drugstore": {"pos": "n", "meaning": "药店", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drum": {"pos": "n", "meaning": "鼓", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "dry": {"pos": "v", "meaning": "变干", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "during": {"pos": "prep", "meaning": "在……期间", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "duty-free": {"pos": "adj", "meaning": "免税的", "cefr": "B1", "cambridge": "PET", "diff": 2}, "dvd player": {"pos": "n", "meaning": "DVD播放机", "cefr": "A2", "cambridge": "KET", "diff": 2}}},P={L1:[{"structure": "be + adj", "module": "形容词结构", "mid": "M1", "examples": ["I am happy today.", "I am sad today."], "meaning": ["今天我很开心。", "今天我很难过。"]}, {"structure": "feel + adj", "module": "系表结构", "mid": "M1", "examples": ["I feel tired.", "I feel happy."], "meaning": ["我感到累。", "我感到开心。"]}, {"structure": "look + adj", "module": "系表结构", "mid": "M1", "examples": ["You look happy.", "He looks tired."], "meaning": ["你看起来很高兴。", "他看起来累了。"]}, {"structure": "adj and adj", "module": "并列形容词", "mid": "M1", "examples": ["The room is big and clean.", "The dog is small and cute."], "meaning": ["房间又大又干净。", "这只狗又小又可爱。"]}, {"structure": "S + V", "module": "动词与时态", "mid": "M2", "examples": ["I read books.", "We go to school."], "meaning": ["我读书。", "我们去上学。"]}, {"structure": "S + be + V-ing", "module": "动词与时态", "mid": "M2", "examples": ["I am reading now.", "She is cooking."], "meaning": ["我正在读书。", "她在做饭。"]}, {"structure": "do/does + V", "module": "动词与时态", "mid": "M2", "examples": ["Do you like apples?", "Does he like milk?"], "meaning": ["你喜欢苹果吗?", "他喜欢牛奶吗?"]}, {"structure": "can + V", "module": "动词与时态", "mid": "M2", "examples": ["I can swim.", "She can sing."], "meaning": ["我会游泳。", "她会唱歌。"]}],L2:[{"structure": "be + adj", "module": "形容词结构", "mid": "M1", "example": "I am happy today because the sun is shining.", "meaning": "今天我很开心,因为阳光灿烂。"}, {"structure": "feel/look + adj", "module": "系表结构", "mid": "M1", "example": "I feel nervous before my first day of school.", "meaning": "开学第一天前,我感到有些紧张。"}, {"structure": "look + adj", "module": "系表结构", "mid": "M1", "example": "He looks friendly, and he always says hello to everyone.", "meaning": "他看起来很友好,而且总是主动跟每个人打招呼。"}, {"structure": "adj and adj", "module": "并列形容词", "mid": "M1", "example": "She has a nice and friendly dog.", "meaning": "她有一只温顺友好的狗。"}, {"structure": "Something doesn’t feel right.", "module": "感觉异常", "mid": "M1", "example": "Something doesn’t feel right with my phone.", "meaning": "我的手机有点不太对劲。"}, {"structure": "This looks ..., but I’ll try my best.", "module": "状态对比", "mid": "M1", "example": "This looks difficult, but I’ll try my best.", "meaning": "这看起来很难,但我会尽力而为。"}, {"structure": "You look ... now.", "module": "感觉状态", "mid": "M1", "example": "You look happy now.", "meaning": "你现在看起来很开心。"}, {"structure": "The ice is too ... so we can’t ...", "module": "困难描述", "mid": "M1", "example": "The ice is too thin so we can't skate on it.", "meaning": "冰面太薄了,我们不能在上面滑冰。"}, {"structure": "How are you feeling today?", "module": "be + adj 描述", "mid": "M1", "example": "How are you feeling today? \nYou look happy!", "meaning": "你今天感觉怎么样? \n你看起来挺开心的!"}, {"structure": "I’m feeling ... today.", "module": "be + adj 描述", "mid": "M1", "example": "I'm feeling tired today.", "meaning": "今天我感觉有点累。"}, {"structure": "It’s very ... outside today.", "module": "be + adj 描述", "mid": "M1", "example": "It's very cold outside today.", "meaning": "今天外面非常冷。"}, {"structure": "You look ... in this picture.", "module": "be + adj 描述", "mid": "M1", "example": "You look happy in this picture.", "meaning": "在这张照片里,你看起来很开心。"}, {"structure": "My room is always ... and ....", "module": "be + adj 描述", "mid": "M1", "example": "My room is always warm and cozy.", "meaning": "我的房间总是温暖又舒适。"}, {"structure": "The movie was really ....", "module": "be + adj 描述", "mid": "M1", "example": "The movie was really funny.", "meaning": "这部电影真是太好笑了。"}, {"structure": "Our teacher is very ....", "module": "be + adj 描述", "mid": "M1", "example": "Our teacher is very patient.", "meaning": "我们的老师非常有耐心。"}, {"structure": "This bag is too ....", "module": "be + adj 描述", "mid": "M1", "example": "This bag is too small for all my books.", "meaning": "这个包装不下我所有的书。"}, {"structure": "Are you sure this is ....?", "module": "be + adj 描述", "mid": "M1", "example": "Are you sure this is warm enough?", "meaning": "你确定这够暖和吗?"}, {"structure": "I’m not sure if it’s ....", "module": "be + adj 描述", "mid": "M1", "example": "I’m not sure if it’s warm enough to swim today.", "meaning": "今天不太确定水温是否适合游泳。"}, {"structure": "What colour is ...?", "module": "be + adj 描述", "mid": "M1", "example": "What color is your new school uniform?", "meaning": "你的新校服是什么颜色的?"}, {"structure": "It’s ...", "module": "be + adj 描述", "mid": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Are you tired?", "module": "be + adj 描述", "mid": "M1", "example": "Are you hungry after playing?", "meaning": "玩完之后你饿了吗?"}, {"structure": "Yes, I’m a bit ....", "module": "be + adj 描述", "mid": "M1", "example": "Yes, I’m a bit nervous about my first day at school.", "meaning": "是的,我对开学第一天有点紧张。"}, {"structure": "No, I’m not ....", "module": "be + adj 描述", "mid": "M1", "example": "No, I'm not tired.", "meaning": "不,我不累。"}, {"structure": "It’s so ... today!", "module": "be + adj 描述", "mid": "M1", "example": "It's so sunny today!", "meaning": "今天阳光真好啊!"}, {"structure": "This looks ....", "module": "be + adj 描述", "mid": "M1", "example": "This looks delicious.", "meaning": "这看起来很好吃。"}, {"structure": "You’re very ....", "module": "be + adj 描述", "mid": "M1", "example": "You're very kind.", "meaning": "你真是太好了。"}, {"structure": "How’s the weather today?", "module": "be + adj 描述", "mid": "M1", "example": "How’s the weather today? \nIt's sunny and warm.", "meaning": "今天天气怎么样? \n阳光很好,也很暖和。"}, {"structure": "It’s ... today.", "module": "be + adj 描述", "mid": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Is it hot or cold?", "module": "be + adj 描述", "mid": "M1", "example": "Is it hot or cold?", "meaning": "是热还是冷?"}, {"structure": "It’s not very ....", "module": "be + adj 描述", "mid": "M1", "example": "It's not very expensive.", "meaning": "{中文翻译}\n这个不是很贵。"}, {"structure": "The sky is so ....", "module": "be + adj 描述", "mid": "M1", "example": "The sky is so blue today.", "meaning": "今天天空真蓝。"}, {"structure": "Everything looks....", "module": "be + adj 描述", "mid": "M1", "example": "Everything looks tidy.", "meaning": "一切看起来都井井有条。"}, {"structure": "The view is really ....", "module": "be + adj 描述", "mid": "M1", "example": "The view is really beautiful.", "meaning": "景色真是太美了。"}, {"structure": "That was very ....", "module": "be + adj 描述", "mid": "M1", "example": "That was very interesting.", "meaning": "那可真有意思。"}, {"structure": "You seem ....", "module": "be + adj 描述", "mid": "M1", "example": "You seem tired this morning.", "meaning": "今天早上你看起来有点累。"}, {"structure": "That’s really ...!", "module": "be + adj 描述", "mid": "M1", "example": "That’s really amazing!", "meaning": "这真是太棒了!"}, {"structure": "The story is very ....", "module": "be + adj 描述", "mid": "M1", "example": "The story is very exciting.", "meaning": "这个故事非常扣人心弦。"}, {"structure": "My parents are both ....", "module": "be + adj 描述", "mid": "M1", "example": "My parents are both very busy on weekdays.", "meaning": "我父母在工作日都非常忙。"}, {"structure": "I’m afraid it’s ....", "module": "be + adj 描述", "mid": "M1", "example": "I’m afraid it’s too cold.", "meaning": "恐怕天气太冷了。"}, {"structure": "It’s difficult to ....", "module": "be + adj 描述", "mid": "M1", "example": "It's difficult to find a good restaurant.", "meaning": "很难找到一家好餐馆。"}, {"structure": "It’s strange that ....", "module": "be + adj 描述", "mid": "M1", "example": "It's strange that the cat is sleeping so much today.", "meaning": "今天这只猫睡得这么多,真是奇怪。"}, {"structure": "The food smells....", "module": "be + adj 描述", "mid": "M1", "example": "The food smells wonderful.", "meaning": "这食物闻起来真香。"}, {"structure": "-er than", "module": "比较级", "mid": "M2", "example": "He is taller than me, but I run faster than him.", "meaning": "他比我高,但我跑得比他快。"}, {"structure": "What did you do yesterday?", "module": "动词与时态", "mid": "M2", "example": "What did you do yesterday? I watched a movie with my family.", "meaning": "你昨天干什么了?我和家人一起看了场电影。"}, {"structure": "I ... yesterday.", "module": "动词与时态", "mid": "M2", "example": "I called my grandmother yesterday.", "meaning": "昨天我给奶奶打了个电话。"}, {"structure": "What are you doing now?", "module": "动词与时态", "mid": "M2", "example": "What are you doing now? \nI am helping my mom cook dinner.", "meaning": "你现在在做什么? \n我正在帮我妈妈做晚饭。"}, {"structure": "I’m ... now.", "module": "动词与时态", "mid": "M2", "example": "I'm eating lunch now.", "meaning": "我正在吃午饭。"}, {"structure": "What will you do tomorrow?", "module": "动词与时态", "mid": "M2", "example": "What will you do tomorrow?", "meaning": "你明天打算做什么?"}]},B={"color": "colour", "colors": "colours", "colored": "coloured", "coloring": "colouring", "favorite": "favourite", "favorites": "favourites", "center": "centre", "centers": "centres", "centered": "centred", "meter": "metre", "meters": "metres", "theater": "theatre", "theaters": "theatres", "traveling": "travelling", "traveled": "travelled", "traveler": "traveller", "canceled": "cancelled", "canceling": "cancelling", "jewelry": "jewellery", "organize": "organise", "organizes": "organises", "organized": "organised", "organizing": "organising", "realize": "realise", "realizes": "realises", "realized": "realised", "realizing": "realising", "recognize": "recognise", "recognizes": "recognises", "recognized": "recognised", "recognizing": "recognising", "apologize": "apologise", "apologizes": "apologises", "apologized": "apologised", "license": "licence", "defense": "defence", "offense": "offence", "pretense": "pretence", "dialog": "dialogue", "catalog": "catalogue", "analog": "analogue", "neighbor": "neighbour", "neighbors": "neighbours", "neighborhood": "neighbourhood", "honor": "honour", "honors": "honours", "honored": "honoured", "humor": "humour", "labor": "labour", "flavor": "flavour", "flavors": "flavours", "behavior": "behaviour", "behaviors": "behaviours", "rumor": "rumour", "program": "programme", "check": "cheque", "gray": "grey", "tire": "tyre", "tires": "tyres", "mold": "mould", "plow": "plough", "aluminum": "aluminium", "sulfur": "sulphur", "mom": "mum", "mommy": "mummy", "soccer": "football", "vacation": "holiday", "vacations": "holidays", "elevator": "lift", "elevators": "lifts", "apartment": "flat", "apartments": "flats", "trash": "rubbish", "garbage": "rubbish", "cookie": "biscuit", "cookies": "biscuits", "candy": "sweet", "candies": "sweets", "faucet": "tap", "faucets": "taps", "sidewalk": "pavement", "sidewalks": "pavements", "sneakers": "trainers", "pants": "trousers", "eraser": "rubber", "erasers": "rubbers", "fall": "autumn", "pajamas": "pyjamas", "highway": "motorway", "highways": "motorways", "railroad": "railway", "airplane": "aeroplane", "airplanes": "aeroplanes", "movie": "film", "movies": "films", "schedule": "timetable", "schedules": "timetables", "yard": "garden", "yards": "gardens", "cell phone": "mobile phone", "cell phones": "mobile phones", "gas": "petrol", "gas station": "petrol station", "mail": "post", "mailbox": "postbox", "mailman": "postman", "intersection": "crossroads", "intersections": "crossroads", "popsicle": "ice lolly", "popsicles": "ice lollies", "french fries": "chips", "eggplant": "aubergine", "zucchini": "courgette", "cilantro": "coriander", "rutabaga": "swede"},NR=["i\\s*(?:'m|am)\\s+not\\s+good\\s+at", "i\\s*(?:'m|am)\\s+(?:so\\s+)?(?:bad|terrible|awful|stupid|dumb|ugly|fat|useless|hopeless)", "i\\s+(?:can't|cannot)\\s+do\\s+(?:it|this|that|anything)", "i\\s+(?:hate|dislike)\\s+(?:myself|me)", "i\\s*(?:'m|am)\\s+(?:too|so)\\s+(?:slow|dumb|stupid|weak)", "nobody\\s+(?:likes|loves)\\s+me", "i\\s*(?:'m|am)\\s+(?:never|always)\\s+(?:wrong|bad)"],DD=["try to pronounce", "one more time", "say it again", "you should", "you must", "please repeat", "try again", "say that again", "pronounce clearly"]; +var TP={listening_drag:["L1"],listening_choicePic:["L1"],listening_tableCloze:["L2"],listening_choiceLong:["L2"],listening_choiceShort:["L2"],listening_matchInfo:["L2"],reading_pic_judge:["L1","L2"],reading_pic_qa:["L1","L2"],reading_matchInfo:["L2"],reading_matchPara:["L2"],reading_choiceLong:["L2"],reading_cloze:["L2"],reading_openCloze:["L2"],writing_pic_qa:["L1","L2"],writing_email:["L2"],writing_picWrite:["L2"],speaking_pic_qa:["L1"],speaking_pic_recognize:["L1"],speaking_qa:["L1","L2"],speaking_topic:["L2"]}; +var TA={"核心听力选择":"listening_choicePic","核心听力拖拽":"listening_drag","听力拖拽":"listening_drag","听力选择":"listening_choicePic","听力选图":"listening_choicePic","听音选图":"listening_choicePic","听力长对话":"listening_choiceLong","听力短对话":"listening_choiceShort","听力信息匹配":"listening_matchInfo","听力表格填空":"listening_tableCloze","听力填空":"listening_tableCloze","阅读单选":"reading_choiceLong","阅读判断":"reading_pic_judge","看图判断":"reading_pic_judge","看图回答":"reading_pic_qa","阅读信息匹配":"reading_matchInfo","阅读段落匹配":"reading_matchPara","阅读完形":"reading_cloze","阅读开放填空":"reading_openCloze","写作看图":"writing_pic_qa","写作邮件":"writing_email","口语日常":"speaking_qa","口语看图":"speaking_pic_qa","口语话题":"speaking_topic","口语识物":"speaking_pic_recognize","中对话跟读":"speaking_qa","中对话朗读":"speaking_qa","中对话选读":"listening_choiceShort","中对话选义":"listening_choiceShort","中对话挖空":"reading_cloze","中对话组句":"reading_cloze","中对话选图":"listening_choicePic","中对话练习":"listening_choiceShort","中对话口语":"speaking_qa","中对话听选":"listening_choiceShort","选词补句":"reading_cloze","选词填空":"reading_cloze","图片单选":"reading_pic_judge","图片多选":"reading_pic_judge","选词排序":"reading_cloze","跟读判断":"speaking_qa","朗读练习":"speaking_qa","选图填空":"listening_choicePic","中图片单选":"reading_pic_judge","中选图单选":"listening_choicePic","中跟读":"speaking_qa","中跟读练习":"speaking_qa","对话选择":"dialogue_choose","对话选择-配图":"dialogue_choose","对话选读":"dialogue_select_read","对话选读-配图":"dialogue_select_read","对话朗读":"dialogue_read","对话朗读-配图":"dialogue_read","对话挖空":"dialogue_fill","对话挖空-配图":"dialogue_fill","对话组句":"dialogue_sentence","对话组句-配图":"dialogue_sentence","对话表达":"dialogue_express","图片单选-配图":"image_single","图片多选-配图":"image_multi","图片有序-配图":"image_order","看图说话":"image_describe","看图说话-配图":"image_describe","信息拼词":"info_spell","信息组句":"info_sentence","物品互动":"object_interact"}; + +// ── CTYPE field requirement definitions ── +var CF={ +core_reading_order:{required:["taskData","sequenceData","textData","learningData"],qCheck:"answerInOptions",meaning:true,feedback:true}, +core_reading_imageDrag:{required:["taskInfo","questionGroup","studyInfo"]}, +core_listening_order:{required:["taskData","sequenceData","textData","learningData"],audioField:"audio"}, +core_listening_drag:{required:["taskData","dialogList","questionList","learningData"]}, +core_listening_choose:{required:["taskData","questionGroup","learningData"]}, +core_speaking_reply:{required:["taskData","configData","settingData","exampleDialog","learningData"]}, +core_speaking_inquiry:{required:["taskData","configData","settingData","exampleDialog","learningData"]}, +core_speaking_monologue:{required:["taskData","configData","npclistData","learningData"]}, +core_speaking_image:{required:["taskData","configData","imageInfo","questionList","optionList","learningData"]}, +core_writing_questionMakeSentence:{required:["taskInfo","textInfo","evalInfo","studyInfo"]}, +core_writing_imgMakeSentence:{required:["taskInfo","textInfo","evalInfo","studyInfo"]}, +core_writing_imgWrite:{required:["taskInfo","textInfo","evalInfo","studyInfo"]}, +core_writing_questionWrite:{required:["taskInfo","textInfo","evalInfo","studyInfo"]}, +core_speaking_discuss:{required:["taskData","configData"]} +}; + +// ── Component type config rules ── +var CR={ +dialogue_choose:{hasCorrect:true,reqFields:["任务标题","资源配置","情境引入","互动内容","后置对话"],interactStart:"要求:选择正确的回复",optFormat:"选项N:",noFeedbackField:true}, +dialogue_select_read:{hasCorrect:false,reqFields:["任务标题","资源配置","情境引入","互动内容","后置对话"],interactStart:"要求:选择一个你想表达的观点",optFormat:"选项N:",allOptionsHaveFeedback:true}, +dialogue_read:{hasCorrect:false,reqFields:["任务标题","资源配置","情境引入","互动内容","互动反馈","后置对话"],readMarker:"(朗读)"}, +dialogue_fill:{hasCorrect:true,reqFields:["任务标题","资源配置","情境引入","互动内容","互动反馈","后置对话"],gapMarker:"___",audioMarker:"(音频)"}, +dialogue_sentence:{hasCorrect:false,reqFields:["任务标题","资源配置","情境引入","互动内容","互动反馈","后置对话"],optMax:4}, +dialogue_express:{hasCorrect:false,reqFields:["任务标题","资源配置","情境引入","互动内容","互动反馈","后置对话"]}, +image_single:{hasCorrect:true,isImageType:true,reqFields:["任务标题","情境引入","互动内容","互动反馈","后置对话"],optFormat:"NN",qMustBeImperative:true,highlightSyntax:true}, +image_multi:{hasCorrect:true,isImageType:true,reqFields:["任务标题","情境引入","互动内容","互动反馈","后置对话"],optFormat:"NN"}, +image_order:{hasCorrect:true,isImageType:true,reqFields:["任务标题","情境引入","互动内容","互动反馈","后置对话"],optMin:4,orderFormat:"正确顺序:"}, +image_describe:{hasCorrect:false,reqFields:["任务标题","任务背景","任务描述","知识","对话角色","角色背景","互动问题","通过规则","示例对话"]}, +info_spell:{hasCorrect:true,reqFields:["任务标题","资源配置","互动内容","后置对话"],gapFormat:/(\d+)/,gapMaxRatio:0.5,letterMin:4,letterMax:7}, +info_sentence:{hasCorrect:false,reqFields:["任务标题","资源配置","互动内容","后置对话"],optMin:3,optMax:5}, +object_interact:{hasCorrect:true,reqFields:["任务标题","互动内容"]} +}; + +// ── Utils ── +function ew(t){return t?t.toLowerCase().replace(/[^a-z\s'-]/g,' ').split(/\s+/).filter(function(w){return w.length>1}):[]} +function nt(n){var c=n.trim();return TA[c]||c.toLowerCase().replace(/\s+/g,'_')} +function ct(e){return e.match(/text|sentence|dialog|content|question|answer|option|learning|instruction|feedback/i)} + +// ════════════ VALIDATORS ════════════ + +// 1. Vocabulary check +function v_vocab(content,lvl){ + var issues=[],words=content&&content.keyPreview?content.keyPreview:[]; + var allowed=lvl==='L1'?W.L1:Object.assign({},W.L1,W.L2); + words.forEach(function(rw){ + var w=(rw||'').toLowerCase().trim();if(!w)return; + if(allowed[w]){var i=allowed[w];issues.push({level:'good',word:w,msg:'"'+w+'" 在'+lvl+'词库内 ('+i.pos+' '+i.meaning+')',detail:i});} + else{issues.push({level:'danger',word:w,msg:'"'+w+'" 不在'+lvl+'词库,疑似超纲',detail:null});} + }); + var fc=issues.filter(function(i){return i.level==='danger'}).length; + return{title:'词汇超纲检测',issues:issues,failCount:fc,passCount:issues.length-fc,summary:issues.length===0?'无目标词汇':fc===0?'全部'+issues.length+'词在库':fc+'词疑似超纲/'+issues.length+'目标'}; +} + +// 2. British spelling +function v_spell(texts){ + var issues=[],seen={}; + ew((texts||[]).filter(Boolean).join(' ')).forEach(function(w){ + var l=w.toLowerCase();if(seen[l]||!B[l])return; + seen[l]=true;issues.push({level:'warn',word:w,suggested:B[l],msg:'"'+w+'" 美式拼写→建议英式 "'+B[l]+'"'}); + }); + return{title:'英式拼写检测',issues:issues,failCount:issues.length,summary:issues.length===0?'未检测到美式拼写':'发现 '+issues.length+' 处美式拼写'}; +} + +// 3. Markdown detection +function v_md(texts){ + var issues=[],t=(texts||[]).filter(Boolean).join('\n'),p=/\*\*|__|`[^`]+`|^#{1,6}\s|^\s*[-*+]\s|^\s*\d+\.\s|\*[^*]+\*|_[^_]+_/gm,m; + while((m=p.exec(t))!==null){ + var s=Math.max(0,m.index-20),e=Math.min(t.length,m.index+40); + issues.push({level:'warn',mark:m[0],ctx:'...'+t.substring(s,e).replace(/\n/g,' ')+'...',msg:'Markdown标记 "'+m[0]+'" 应移除'}); + } + return{title:'Markdown格式检测',issues:issues,failCount:issues.length,summary:issues.length===0?'未检测到Markdown标记':'发现 '+issues.length+' 处Markdown标记'}; +} + +// 4. Punctuation check +function v_punct(texts){ + var issues=[]; + (texts||[]).filter(Boolean).forEach(function(t){ + var m=t.match(/[\u3001\u3002\uff0c\uff1b\uff1a\u201c\u201d\u2018\u2019\uff01\uff08\uff09\u300a\u300b]/g); + if(m)issues.push({level:'warn',text:t.substring(0,60),msg:'英文文本含中文标点 '+JSON.stringify(m)}); + if(/~/.test(t))issues.push({level:'warn',text:t,msg:'非标准标点 "~" 应使用标准英文标点'}); + if(/!!!|\?\?\?|!!\?|\?!!/.test(t))issues.push({level:'warn',text:t,msg:'连续感叹号/问号不符合规范'}); + }); + return{title:'标点符号规范',issues:issues,failCount:issues.length,summary:issues.length===0?'标点符号使用规范':'发现 '+issues.length+' 处标点问题'}; +} + +// 5. Type-stage match +function v_type(name,lvl){ + var n=nt(name),a=TP[n]; + if(!a)return{title:'题型-阶段匹配',resolved:n,isUnknown:true,msg:'未在已知题型表中匹配 "'+name+'" → '+n,isMatch:false}; + if(a.indexOf(lvl)>=0)return{title:'题型-阶段匹配',resolved:n,allowedStages:a,isMatch:true,msg:'题型 "'+name+'" → '+n+' 在'+lvl+'允许'}; + return{title:'题型-阶段匹配',resolved:n,allowedStages:a,isMatch:false,msg:'题型 "'+name+'" → '+n+' 仅允许 '+a.join(',')+','+lvl+'不允许!'}; +} + +// 6. Dialog quality +function v_dialog(lines,lvl){ + var issues=[],isL1=lvl==='L1',mw=isL1?7:8,ww=10; + (lines||[]).filter(Boolean).forEach(function(l){ + var t=(l.text||l.content||l.sentence||l.dialog||'').trim();if(!t)return; + var wc=t.split(/\s+/).length; + if(wc>ww)issues.push({level:'danger',text:t,wc:wc,msg:'台词 '+wc+'词,超'+ww+'词上限,建议拆分'}); + else if(wc>mw)issues.push({level:'warn',text:t,wc:wc,msg:'台词 '+wc+'词,超'+mw+'词建议上限'}); + for(var i=0;i2}); + var mk=ks.filter(function(k){return lo.indexOf(k)>=0}); + if(mk.length>=Math.ceil(ks.length*0.5)&&ks.length>=2){matched=true;issues.push({level:'good',sentence:s.substring(0,60),pattern:aps[i].structure,module:aps[i].module,msg:'近似匹配句型 "'+aps[i].structure+'" ('+aps[i].module+')'});break;} + } + if(!matched)issues.push({level:'info',sentence:s.substring(0,60),msg:'句子未匹配到'+lvl+'句型库中已知结构'}); + }); + return{title:'句型合规检测',issues:issues,summary:'句型合规检查完成'}; +} + +// 9. NEW: JSON structure validation per cType +function v_json_struct(jsonData,cType){ + var issues=[]; + if(!jsonData||typeof jsonData!=='object')return{title:'JSON结构校验',issues:[{level:'danger',msg:'jsonData 缺失或非对象'}],summary:'jsonData无效'}; + var f=CF[cType];if(!f)return{title:'JSON结构校验',issues:[{level:'info',msg:'cType="'+cType+'" 未定义字段规则,跳过结构校验'}],summary:'跳过(未知cType)'}; + // Check required object fields + f.required.forEach(function(k){ + if(!jsonData[k])issues.push({level:'danger',field:k,msg:'缺少必填字段 "'+k+'" (cType='+cType+')'}); + }); + // kpInfo checks + if(jsonData.taskData||jsonData.taskInfo){ + var td=jsonData.taskData||jsonData.taskInfo; + var ki=jsonData.kpInfo; + if(ki&&td){ + if(ki.cType&&td.cType&&ki.cType!==td.cType)issues.push({level:'danger',msg:'kpInfo.cType="'+ki.cType+'" ≠ task.cType="'+td.cType+'"'}); + if(ki.cId&&td.cId&&ki.cId!==td.cId)issues.push({level:'danger',msg:'kpInfo.cId="'+ki.cId+'" ≠ task.cId="'+td.cId+'"'}); + } + } + // Reading question checks + if(f.qCheck==='answerInOptions'&&jsonData.textData&&jsonData.textData.question){ + (Array.isArray(jsonData.textData.question)?jsonData.textData.question:[jsonData.textData.question]).forEach(function(q,i){ + if(!q.optionList||q.answer===undefined)return; + var ans=Array.isArray(q.answer)?q.answer:[q.answer]; + ans.forEach(function(a){ + if(typeof a==='number'&&(a<0||a>=q.optionList.length))issues.push({level:'danger',msg:'question['+i+'] answer索引'+a+'越界 (optionList长度='+q.optionList.length+')'}); + }); + if(f.meaning&&!q.meaning)issues.push({level:'warn',msg:'question['+i+'] 缺少meaning字段'}); + if(f.feedback&&q.optionList)q.optionList.forEach(function(o,j){if(!o.feedback)issues.push({level:'warn',msg:'optionList['+j+'] 缺少feedback'})}); + }); + } + // Audio field check + if(f.audioField&&jsonData.textData&&!jsonData.textData[f.audioField])issues.push({level:'danger',msg:'textData 缺少 "'+f.audioField+'" 字段(听力类题型必须有音频材料)'}); + return{title:'JSON结构校验',issues:issues,summary:issues.length===0?'JSON结构完整':issues.length+'项结构问题'}; +} + +// 10. NEW: Task title format +function v_title(title){ + var issues=[]; + if(!title)return{title:'任务标题格式',issues:[{level:'danger',msg:'任务标题为空'}],summary:'标题为空'}; + if(/对话\d/.test(title)||/-\d/.test(title))issues.push({level:'warn',msg:'标题含序号 "'+title+'",应使用中文括号或删除序号'}); + if(/\d/.test(title)&&!/[((]\s*[一二三四五六七八九十\d]+\s*[))]/.test(title)&&!/第\d+/.test(title)){} // skip if has Chinese bracket numbering + if(/[a-zA-Z][^\x00-\x7f]/.test(title)||/[^\x00-\x7f][a-zA-Z]/.test(title)){ + if(!/[a-zA-Z]\s+[^\x00-\x7f]/.test(title)&&!/[^\x00-\x7f]\s+[a-zA-Z]/.test(title))issues.push({level:'warn',msg:'标题英文单词前后可能缺少空格:"'+title+'"'}); + } + if(/^对话\s*$/.test(title)||/^互动\s*$/.test(title))issues.push({level:'warn',msg:'标题过于笼统:"'+title+'",应结合剧情语义化'}); + return{title:'任务标题格式',issues:issues,summary:issues.length===0?'标题格式合格':issues.length+'项标题格式问题'}; +} + +// 11. NEW: Component config field validation +function v_config(config,tid){ + var issues=[],rules=CR[tid]; + if(!rules){return{title:'组件配置校验',issues:[{level:'info',msg:'类型 "'+tid+'" 未定义配置规则'}],summary:'跳过(未知类型)'};} + // Check required fields + var cfgText=config||''; + rules.reqFields.forEach(function(k){if(cfgText.indexOf('【'+k+'】')<0)issues.push({level:'danger',field:k,msg:'缺少配置字段 "'+k+'"'});}); + // Interact format + if(rules.interactStart&&cfgText.indexOf(rules.interactStart)<0)issues.push({level:'warn',msg:'【互动内容】需以 "'+rules.interactStart+'" 开头'}); + // Correct answer check + if(rules.hasCorrect===false&&/(正确)/.test(cfgText))issues.push({level:'danger',msg:'该类型不应标注(正确),所有选项为开放表达(对话选读)'}); + if(rules.hasCorrect===true&&!/(正确)/.test(cfgText))issues.push({level:'warn',msg:'该类型需标注(正确)'}); + // All options have feedback (selective reading) + if(rules.allOptionsHaveFeedback){ + var opts=cfgText.match(/选项\d+[::]\s*(.+?)(?=\n|选项\d+|$)/g)||[]; + opts.forEach(function(o,i){if(!/[-\u2013]\s*反馈/.test(cfgText.substring(cfgText.indexOf(o))))issues.push({level:'warn',msg:'选项'+(i+1)+'缺少反馈(对话选读每个选项均需反馈)'});}); + } + // 朗读 marker + if(rules.readMarker&&cfgText.indexOf(rules.readMarker)<0)issues.push({level:'warn',msg:'对话朗读【互动内容】末尾需标注 "'+rules.readMarker+'"'}); + // Gap marker + if(rules.gapMarker&&cfgText.indexOf('___')<0)issues.push({level:'warn',msg:'对话挖空【互动内容】需含 "___" 挖空标记'}); + // Audio marker + if(rules.audioMarker&&cfgText.indexOf('(音频)')<0)issues.push({level:'warn',msg:'【互动内容】缺少 "(音频)" 标记'}); + // Image type: option format 00/01/02 + if(rules.optFormat==='NN'){ + var imgOpts=cfgText.match(/\b\d{2}\b/g)||[]; + if(imgOpts.length<2)issues.push({level:'warn',msg:'图片类选项需使用 "00""01""02"... 格式'}); + } + // Image type: question must be imperative + if(rules.qMustBeImperative){ + var Qline=(cfgText.match(/题干[::]\s*(.+)/)||[])[1]||''; + if(/[??]/.test(Qline))issues.push({level:'warn',msg:'图片类题干禁止问句,需使用指令句式:"'+Qline+'"'}); + } + // Highlight syntax + if(rules.highlightSyntax){ + var dollarCount=(cfgText.match(/\$/g)||[]).length; + if(dollarCount>0&&dollarCount%2!==0)issues.push({level:'danger',msg:'高亮符号$不配对(应为 $word$)'}); + } + // Option max + if(rules.optMax){ + var optCount=(cfgText.match(/选项\d+[::]/g)||[]).length; + if(optCount>rules.optMax)issues.push({level:'warn',msg:'选项数'+optCount+'超出上限'+rules.optMax}); + } + // Info spelling gap check + if(rules.gapFormat){ + var gap=cfgText.match(/\((\d+)\)/); + if(gap){ + var wordMatch=cfgText.match(/([A-Za-z]+)\(\d+\)|\(\d+\)([A-Za-z]+)/); + if(wordMatch){ + var fullWord=(wordMatch[1]||'')+(wordMatch[2]||''),gapLen=parseInt(gap[1]); + if(fullWord.length>0&&gapLen>Math.ceil(fullWord.length*rules.gapMaxRatio))issues.push({level:'warn',msg:'挖空长度'+gapLen+'超过单词 "'+fullWord+'" 长度'+fullWord.length+'的一半'}); + } + } + } + // Order format + if(rules.orderFormat&&cfgText.indexOf(rules.orderFormat)<0&&(cfgText.match(/选项:/)||cfgText.match(/\b\d{2}\b/)))issues.push({level:'warn',msg:'图片有序需标注 "'+rules.orderFormat+'"'}); + return{title:'组件配置校验 ('+tid+')',issues:issues,summary:issues.length===0?'配置格式合格':issues.length+'项配置问题'}; +} + +// 12. NEW: Feedback rules validation +function v_feedback(cfgText){ + var issues=[]; + // Correct feedback must be "无" + var cf=cfgText.match(/正确[::]\s*(.+?)(?=\n|错误|后置|$)/im); + if(cf&&cf[1].trim()!=='无')issues.push({level:'warn',msg:'【正确反馈】应为 "无",当前:"'+cf[1].trim()+'"'}); + // Error feedback must have role name + var ef=cfgText.match(/错误[::]\s*(.+?)(?=\n|正确|后置|$)/im); + if(ef&&!/[A-Z]/.test(ef[1])&&ef[1].trim()!=='无')issues.push({level:'warn',msg:'【错误反馈】缺少角色名,格式应为 "错误 角色名 : 对话内容"'}); + // Error feedback should not be didactic + if(ef)DD.forEach(function(p){ + if(ef[1].toLowerCase().indexOf(p.toLowerCase())>=0)issues.push({level:'warn',msg:'【错误反馈】含说教式表达 ("'+p+'"),应改为自然场景对话'}); + }); + // Check for prohibited 图片资源 line + if(/【图片资源】/.test(cfgText))issues.push({level:'danger',msg:'禁止出现【图片资源】行,图片信息应放在【资源配置】中'}); + return{title:'反馈格式校验',issues:issues,summary:issues.length===0?'反馈格式合格':issues.length+'项反馈问题'}; +} + +// 13. NEW: Third person singular grammar +function v_thirdperson(sentences){ + var issues=[]; + var tps=[/\bhe\s/i,/\bshe\s/i,/\bit\s/i,/Otis\s/i,/Mum\s/i,/Dan\s/i,/Sally\s/i,/Vicky\s/i,/Ben\s/i,/Lucy\s/i,/May\s/i,/Matt\s/i,/Sarah\s/i,/Johnny\s/i,/Smith\s/i,/Eva\s/i,/Celina\s/i,/Rebecca\s/i]; + (sentences||[]).filter(Boolean).forEach(function(s){ + for(var i=0;i0&&as.length0?'⚠️ '+dc+'项严重问题,'+wc+'项警告':'⚠️ '+wc+'项可优化项 ('+sc+'项通过)'}; +} + +// Advanced: validate raw component config text +function validateConfig(cfgText,tid,lvl){ + var rr=[],t=nt(tid||''),l=(lvl||'L1').toUpperCase(); + if(t)rr.push(v_title(extractTitle(cfgText))); + if(t)rr.push(v_config(cfgText,t)); + rr.push(v_feedback(cfgText)); + if(t==='dialogue_select_read'||t==='dialogue_choose')rr.push(v_dialogue_type(cfgText,t)); + if(t==='image_describe')rr.push(v_image_desc(cfgText)); + // Also run text checks + rr.push(v_spell([cfgText])); + rr.push(v_md([cfgText])); + rr.push(v_punct([cfgText])); + return{title:'组件配置深度校验 ('+t+')',results:rr,summary:rr.reduce(function(s,r){return s+r.issues.length},0)+'项问题'}; +} + +function extractTitle(cfg){ + var m=cfg.match(/【任务标题】\s*\n?\s*(.+)/);return m?m[1].trim():''; +} + +// Combined: validate both content + json +function validateFull(content,jsonObj,lvl){ + var r=validate(content,lvl); + if(jsonObj&&jsonObj.cType){r.results.push(v_json_struct(jsonObj,jsonObj.cType));} + return r; +} + +// ── Export ── +g.PedagogyRules={VERSION:'2.0.0', + validate:validate,validateConfig:validateConfig,validateFull:validateFull, + checkTypeMatch:v_type, + checkJSON:v_json_struct,checkTitle:v_title,checkConfig:v_config,checkFeedback:v_feedback, + checkThirdPerson:v_thirdperson,checkDialogueType:v_dialogue_type,checkImageDesc:v_image_desc, + WORD_LISTS:W,PATTERNS:P,TYPE_RULES:TP,SPELLING_MAP:B,CTYPE_FIELDS:CF,CONFIG_RULES:CR,RULES:{dialog:{maxWords:8,coreMax:7,warnWords:10}} +}; +console.log('[PedagogyRules v2] L1 words:'+Object.keys(W.L1).length+' L2 words:'+Object.keys(W.L2).length+' L1 pat:'+P.L1.length+' L2 pat:'+P.L2.length+' Brit:'+Object.keys(B).length+' Types:'+Object.keys(TP).length+' CTypes:'+Object.keys(CF).length+' ConfigRules:'+Object.keys(CR).length); +})(typeof window!=='undefined'?window:this); diff --git a/output/l1_pedagogy_rules_v3.js b/output/l1_pedagogy_rules_v3.js new file mode 100644 index 0000000..ad410f0 --- /dev/null +++ b/output/l1_pedagogy_rules_v3.js @@ -0,0 +1,288 @@ +(function(g){"use strict"; +var W={L1:{"red": {"pos": "adj", "meaning": "红色的", "unit": "S0-U0-L1", "diff": 1}, "hat": {"pos": "n", "meaning": "帽子", "unit": "S0-U0-L1", "diff": 1}, "blue": {"pos": "adj", "meaning": "蓝的", "unit": "S0-U0-L1", "diff": 1}, "bag": {"pos": "n", "meaning": "袋,包", "unit": "S0-U0-L1", "diff": 1}, "orange": {"pos": "n", "meaning": "橙子", "unit": "S1-U10-L3", "diff": 1}, "green": {"pos": "adj", "meaning": "绿色的", "unit": "S0-U0-L2", "diff": 1}, "dress": {"pos": "n", "meaning": "连衣裙", "unit": "S0-U0-L2", "diff": 1}, "there": {"pos": "adv", "meaning": "那里", "unit": "S0-U0-L3", "diff": 1}, "put": {"pos": "v", "meaning": "放", "unit": "S0-U0-L3", "diff": 1}, "purple": {"pos": "adj", "meaning": "紫色的", "unit": "S0-U0-L5", "diff": 1}, "give": {"pos": "v", "meaning": "给", "unit": "S0-U0-L3", "diff": 1}, "water": {"pos": "n", "meaning": "水", "unit": "S0-U0-L4", "diff": 1}, "here": {"pos": "adv", "meaning": "在这里", "unit": "S0-U0-L4", "diff": 1}, "dirty": {"pos": "adj", "meaning": "肮脏的", "unit": "S0-U0-L4", "diff": 1}, "clean": {"pos": "v", "meaning": "清洁", "unit": "S0-U0-L4", "diff": 1}, "pink": {"pos": "adj", "meaning": "粉红色的", "unit": "S0-U0-L2", "diff": 1}, "get": {"pos": "v", "meaning": "收到", "unit": "", "diff": 1}, "wall": {"pos": "n", "meaning": "墙", "unit": "S1-U1-L1", "diff": 1}, "table": {"pos": "n", "meaning": "桌子", "unit": "S1-U1-L1", "diff": 1}, "floor": {"pos": "n", "meaning": "地板", "unit": "S1-U1-L1", "diff": 1}, "hand": {"pos": "n", "meaning": "手", "unit": "S1-U1-L2", "diff": 1}, "foot": {"pos": "n", "meaning": "脚", "unit": "S1-U1-L2", "diff": 1}, "black": {"pos": "adj", "meaning": "黑的", "unit": "S1-U1-L2", "diff": 1}, "tomato": {"pos": "n", "meaning": "西红柿", "unit": "S1-U1-L3", "diff": 1}, "fish": {"pos": "n", "meaning": "鱼", "unit": "S1-U1-L3", "diff": 1}, "chicken": {"pos": "n", "meaning": "鸡肉", "unit": "S1-U1-L3", "diff": 1}, "nose": {"pos": "n", "meaning": "鼻子", "unit": "S1-U1-L4", "diff": 1}, "eye": {"pos": "n", "meaning": "眼睛", "unit": "S1-U1-L4", "diff": 1}, "brown": {"pos": "adj", "meaning": "棕色的", "unit": "S1-U1-L4", "diff": 1}, "yellow": {"pos": "adj", "meaning": "黄色的", "unit": "S1-U1-L5", "diff": 1}, "white": {"pos": "adj", "meaning": "白色的", "unit": "S1-U1-L5", "diff": 1}, "go": {"pos": "v", "meaning": "去,走", "unit": "S1-U2-L1", "diff": 1}, "dog": {"pos": "n", "meaning": "狗", "unit": "S1-U2-L1", "diff": 1}, "come": {"pos": "v", "meaning": "来", "unit": "S1-U2-L1", "diff": 1}, "cat": {"pos": "n", "meaning": "猫", "unit": "S1-U2-L1", "diff": 1}, "pie": {"pos": "n", "meaning": "馅饼", "unit": "S1-U2-L2", "diff": 1}, "can": {"pos": "v", "meaning": "能,会", "unit": "S1-U2-L4", "diff": 1}, "open": {"pos": "adj", "meaning": "开着的", "unit": "", "diff": 1}, "happy": {"pos": "adj", "meaning": "快乐的", "unit": "S1-U2-L5", "diff": 1}, "see": {"pos": "v", "meaning": "看见", "unit": "S1-U3-L1", "diff": 1}, "1": {"pos": "num", "meaning": "1", "unit": "S1-U3-L1", "diff": 1}, "paper": {"pos": "adj", "meaning": "纸质的", "unit": "", "diff": 1}, "book": {"pos": "n", "meaning": "书", "unit": "S1-U3-L2", "diff": 1}, "3": {"pos": "num", "meaning": "3", "unit": "S1-U3-L2", "diff": 1}, "2": {"pos": "num", "meaning": "2", "unit": "S1-U3-L2", "diff": 1}, "pen": {"pos": "n", "meaning": "钢笔", "unit": "S1-U3-L3", "diff": 1}, "box": {"pos": "n", "meaning": "盒子", "unit": "S1-U3-L3", "diff": 1}, "4": {"pos": "num", "meaning": "4", "unit": "S1-U3-L3", "diff": 1}, "6": {"pos": "num", "meaning": "6", "unit": "S1-U3-L4", "diff": 1}, "5": {"pos": "num", "meaning": "5", "unit": "S1-U3-L4", "diff": 1}, "sing": {"pos": "v", "meaning": "唱", "unit": "S1-U4-L1", "diff": 1}, "eat": {"pos": "v", "meaning": "吃", "unit": "S1-U4-L2", "diff": 1}, "7": {"pos": "num", "meaning": "7", "unit": "S1-U4-L2", "diff": 1}, "rug": {"pos": "n", "meaning": "小地毯", "unit": "S1-U4-L3", "diff": 1}, "door": {"pos": "n", "meaning": " 门", "unit": "", "diff": 1}, "bed": {"pos": "n", "meaning": "床", "unit": "S1-U4-L3", "diff": 1}, "9": {"pos": "num", "meaning": "9", "unit": "S1-U4-L4", "diff": 1}, "8": {"pos": "num", "meaning": "8", "unit": "S1-U4-L4", "diff": 1}, "10": {"pos": "num", "meaning": "10", "unit": "S1-U4-L5", "diff": 1}, "zoo": {"pos": "n", "meaning": "动物园", "unit": "", "diff": 1}, "zebra": {"pos": "n", "meaning": "斑马", "unit": "S1-U7-L2", "diff": 1}, "young": {"pos": "adj", "meaning": "年轻的", "unit": "", "diff": 1}, "year": {"pos": "n", "meaning": "年", "unit": "", "diff": 1}, "write": {"pos": "v", "meaning": "写", "unit": "", "diff": 1}, "woman": {"pos": "n", "meaning": "女人", "unit": "S1-U5-L1", "diff": 1}, "window": {"pos": "n", "meaning": "窗户", "unit": "S1-U12-L4", "diff": 1}, "warm": {"pos": "adj", "meaning": "温暖的", "unit": "", "diff": 1}, "want": {"pos": "v", "meaning": "想要", "unit": "", "diff": 1}, "walk": {"pos": "v", "meaning": "走", "unit": "S1-U7-L2", "diff": 1}, "very": {"pos": "adv", "meaning": "非常", "unit": "", "diff": 1}, "under": {"pos": "prep", "meaning": "在...下面", "unit": "S2-U14-L5", "diff": 1}, "try": {"pos": "v", "meaning": "尝试", "unit": "S1-U12-L5", "diff": 1}, "tree": {"pos": "n", "meaning": "树", "unit": "S1-U7-L1", "diff": 1}, "train": {"pos": "n", "meaning": "火车", "unit": "S1-U8-L1", "diff": 1}, "too": {"pos": "adv", "meaning": "也", "unit": "S1-U12-L2", "diff": 1}, "tomorrow": {"pos": "n", "meaning": "明天", "unit": "", "diff": 1}, "today": {"pos": "n", "meaning": "今天", "unit": "", "diff": 1}, "tiger": {"pos": "n", "meaning": "老虎", "unit": "S1-U5-L3", "diff": 1}, "those": {"pos": "pron", "meaning": "那些", "unit": "S1-U12-L1", "diff": 1}, "this": {"pos": "pron", "meaning": "这个", "unit": "S1-U12-L1", "diff": 1}, "these": {"pos": "pron", "meaning": "这些", "unit": "S1-U12-L1", "diff": 1}, "that": {"pos": "pron", "meaning": "那个", "unit": "S1-U12-L1", "diff": 1}, "tell": {"pos": "v", "meaning": "告诉", "unit": "", "diff": 1}, "teacher": {"pos": "n", "meaning": "老师", "unit": "S2-U14-L2", "diff": 1}, "talk": {"pos": "v", "meaning": "说话", "unit": "", "diff": 1}, "swim": {"pos": "v", "meaning": "游泳", "unit": "S1-U11-L5", "diff": 1}, "sun": {"pos": "n", "meaning": "太阳", "unit": "S1-U8-L2", "diff": 1}, "study": {"pos": "v", "meaning": "学习", "unit": "S2-U14-L1", "diff": 1}, "student": {"pos": "n", "meaning": "学生", "unit": "S2-U14-L1", "diff": 1}, "speak": {"pos": "v", "meaning": "说", "unit": "", "diff": 1}, "some": {"pos": "det", "meaning": "一些", "unit": "", "diff": 1}, "sofa": {"pos": "n", "meaning": "沙发", "unit": "", "diff": 1}, "sock": {"pos": "n", "meaning": "袜子", "unit": "", "diff": 1}, "small": {"pos": "adj", "meaning": "小的", "unit": "S1-U9-L1", "diff": 1}, "sleep": {"pos": "v", "meaning": "睡觉", "unit": "S1-U7-L4", "diff": 1}, "skirt": {"pos": "n", "meaning": "裙子", "unit": "S1-U9-L4", "diff": 1}, "sit": {"pos": "v", "meaning": "坐下", "unit": "S1-U8-L1", "diff": 1}, "sister": {"pos": "n", "meaning": "姐姐、妹妹", "unit": "S1-U8-L1", "diff": 1}, "short": {"pos": "adj", "meaning": "短的", "unit": "", "diff": 1}, "shoe": {"pos": "n", "meaning": "鞋", "unit": "", "diff": 1}, "shirt": {"pos": "n", "meaning": "衬衫", "unit": "S1-U9-L1", "diff": 1}, "ship": {"pos": "n", "meaning": "船", "unit": "", "diff": 1}, "sheep": {"pos": "n", "meaning": "绵羊", "unit": "S1-U5-L3", "diff": 1}, "school": {"pos": "n", "meaning": "学校", "unit": "S2-U14-L1", "diff": 1}, "say": {"pos": "v", "meaning": "说", "unit": "", "diff": 1}, "sad": {"pos": "adj", "meaning": "悲伤的", "unit": "", "diff": 1}, "run": {"pos": "v", "meaning": "跑", "unit": "", "diff": 1}, "ruler": {"pos": "n", "meaning": "尺子", "unit": "", "diff": 1}, "room": {"pos": "n", "meaning": "房间", "unit": "", "diff": 1}, "rice": {"pos": "n", "meaning": "米饭", "unit": "S1-U6-L4", "diff": 1}, "read": {"pos": "v", "meaning": "阅读", "unit": "", "diff": 1}, "radio": {"pos": "n", "meaning": "收音机", "unit": "S1-U9-L2", "diff": 1}, "potato": {"pos": "n", "meaning": "土豆", "unit": "S1-U7-L3", "diff": 1}, "play": {"pos": "v", "meaning": "玩", "unit": "S2-U14-L1", "diff": 1}, "plane": {"pos": "n", "meaning": "飞机", "unit": "S1-U8-L3", "diff": 1}, "pig": {"pos": "n", "meaning": "猪", "unit": "S1-U7-L4", "diff": 1}, "phone": {"pos": "v", "meaning": "给…...打电话", "unit": "", "diff": 1}, "people": {"pos": "n", "meaning": "人", "unit": "", "diff": 1}, "pencil": {"pos": "n", "meaning": "铅笔", "unit": "", "diff": 1}, "pea": {"pos": "n", "meaning": "豌豆", "unit": "", "diff": 1}, "pe": {"pos": "n", "meaning": "体育", "unit": "S1-U10-L4", "diff": 1}, "paint": {"pos": "v", "meaning": "(用颜料)绘画", "unit": "", "diff": 1}, "one": {"pos": "pron", "meaning": "一个人(或物)", "unit": "", "diff": 1}, "old": {"pos": "adj", "meaning": "年老的", "unit": "", "diff": 1}, "now": {"pos": "adv", "meaning": "现在", "unit": "", "diff": 1}, "night": {"pos": "n", "meaning": "夜晚", "unit": "S1-U12-L5", "diff": 1}, "nice": {"pos": "adj", "meaning": "好的", "unit": "S1-U6-L3", "diff": 1}, "new": {"pos": "adj", "meaning": "新的", "unit": "S1-U9-L2", "diff": 1}, "mum": {"pos": "n", "meaning": "妈妈", "unit": "S1-U8-L4", "diff": 1}, "mouth": {"pos": "n", "meaning": "嘴巴", "unit": "", "diff": 1}, "mother": {"pos": "n", "meaning": "母亲", "unit": "", "diff": 1}, "morning": {"pos": "n", "meaning": "早上", "unit": "S1-U12-L5", "diff": 1}, "month": {"pos": "n", "meaning": "月", "unit": "", "diff": 1}, "monkey": {"pos": "n", "meaning": "猴子", "unit": "S1-U7-L1", "diff": 1}, "minute": {"pos": "n", "meaning": "分钟", "unit": "", "diff": 1}, "mine": {"pos": "pron", "meaning": "我的", "unit": "", "diff": 1}, "milk": {"pos": "n", "meaning": "牛奶", "unit": "S1-U5-L2", "diff": 1}, "men": {"pos": "n", "meaning": "男人(man 的复数)", "unit": "", "diff": 1}, "meat": {"pos": "n", "meaning": "肉类", "unit": "S1-U10-L3", "diff": 1}, "me": {"pos": "pron", "meaning": "我", "unit": "S1-U12-L2", "diff": 1}, "mat": {"pos": "n", "meaning": "地垫", "unit": "S2-U14-L4", "diff": 1}, "many": {"pos": "det", "meaning": "许多", "unit": "", "diff": 1}, "man": {"pos": "n", "meaning": "男人", "unit": "S1-U5-L1", "diff": 1}, "make": {"pos": "v", "meaning": "制造", "unit": "S1-U6-L3", "diff": 1}, "love": {"pos": "v", "meaning": "爱", "unit": "S1-U12-L2", "diff": 1}, "lots of": {"pos": "det", "meaning": "大量的", "unit": "", "diff": 1}, "long": {"pos": "adj", "meaning": "长的", "unit": "S1-U7-L5 ", "diff": 1}},L2:{"dentist": {"pos": "n", "meaning": "牙医", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "department": {"pos": "n", "meaning": "部门", "cefr": "A2", "cambridge": "KET", "diff": 2}, "department store": {"pos": "n", "meaning": "百货商店", "cefr": "A2", "cambridge": "KET", "diff": 2}, "describe": {"pos": "v", "meaning": "描述", "cefr": "A2", "cambridge": "KET", "diff": 2}, "desert": {"pos": "v", "meaning": "遗弃", "cefr": "A2", "cambridge": "KET", "diff": 2}, "design": {"pos": "v", "meaning": "设计", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dessert": {"pos": "n", "meaning": "甜点", "cefr": "A2", "cambridge": "KET", "diff": 2}, "detailed": {"pos": "adj", "meaning": "详细的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "diary": {"pos": "n", "meaning": "日记", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "dictionary": {"pos": "n", "meaning": "词典", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "die": {"pos": "v", "meaning": "消失;灭亡", "cefr": "A2", "cambridge": "KET", "diff": 2}, "difference": {"pos": "n", "meaning": "差别", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "different": {"pos": "adj", "meaning": "不同的", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "difficult": {"pos": "adj", "meaning": "困难的", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "digital": {"pos": "adj", "meaning": "数字的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "digital camera": {"pos": "n", "meaning": "数码相机", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dinosaur": {"pos": "n", "meaning": "恐龙", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "diploma": {"pos": "n", "meaning": "文凭", "cefr": "A2", "cambridge": "KET", "diff": 2}, "directions": {"pos": "n", "meaning": "方向", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dirty": {"pos": "adj", "meaning": "脏的", "cefr": "Pre-A1", "cambridge": "Starters", "diff": 2}, "disco": {"pos": "n", "meaning": "迪斯科", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discount": {"pos": "n", "meaning": "折扣", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discover": {"pos": "v", "meaning": "发现", "cefr": "A2", "cambridge": "KET", "diff": 2}, "discuss": {"pos": "vt", "meaning": "讨论", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dish": {"pos": "n", "meaning": "菜肴", "cefr": "A2", "cambridge": "KET", "diff": 2}, "display": {"pos": "v", "meaning": "显示", "cefr": "B1", "cambridge": "PET", "diff": 2}, "dive": {"pos": "v", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "diff": 2}, "diving": {"pos": "n", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "diff": 2}, "doctor": {"pos": "n", "meaning": "医生", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "document": {"pos": "n", "meaning": "文件", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dollar": {"pos": "n", "meaning": "美元", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dot": {"pos": "n", "meaning": "点", "cefr": "A2", "cambridge": "KET", "diff": 2}, "double": {"pos": "v", "meaning": "使加倍", "cefr": "A2", "cambridge": "KET", "diff": 2}, "double room": {"pos": "phrase", "meaning": "双人间", "cefr": "A2", "cambridge": "KET", "diff": 2}, "doubt": {"pos": "v", "meaning": "怀疑", "cefr": "B1", "cambridge": "PET", "diff": 2}, "download": {"pos": "v", "meaning": "下载", "cefr": "A2", "cambridge": "KET", "diff": 2}, "downstairs": {"pos": "adj", "meaning": "楼下的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dozen": {"pos": "det", "meaning": "十二", "cefr": "B1", "cambridge": "PET", "diff": 2}, "draw": {"pos": "n", "meaning": "抽签", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drawer": {"pos": "n", "meaning": "抽屉", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dream": {"pos": "v", "meaning": "梦想", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dress": {"pos": "v", "meaning": "穿衣服", "cefr": "A2", "cambridge": "KET", "diff": 2}, "dressed": {"pos": "adj", "meaning": "穿着衣服的", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drive": {"pos": "v", "meaning": "驾车送(人)", "cefr": "A2", "cambridge": "KET", "diff": 2}, "driving licence": {"pos": "n", "meaning": "驾驶执照", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drop": {"pos": "n", "meaning": "滴", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drugstore": {"pos": "n", "meaning": "药店", "cefr": "A2", "cambridge": "KET", "diff": 2}, "drum": {"pos": "n", "meaning": "鼓", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "dry": {"pos": "v", "meaning": "变干", "cefr": "A1", "cambridge": "Movers", "diff": 2}, "during": {"pos": "prep", "meaning": "在……期间", "cefr": "A2", "cambridge": "KET/Flyers", "diff": 2}, "duty-free": {"pos": "adj", "meaning": "免税的", "cefr": "B1", "cambridge": "PET", "diff": 2}, "dvd player": {"pos": "n", "meaning": "DVD播放机", "cefr": "A2", "cambridge": "KET", "diff": 2}}},P={L1:[{"structure": "be + adj", "module": "形容词结构", "mid": "M1", "examples": ["I am happy today.", "I am sad today."], "meaning": ["今天我很开心。", "今天我很难过。"]}, {"structure": "feel + adj", "module": "系表结构", "mid": "M1", "examples": ["I feel tired.", "I feel happy."], "meaning": ["我感到累。", "我感到开心。"]}, {"structure": "look + adj", "module": "系表结构", "mid": "M1", "examples": ["You look happy.", "He looks tired."], "meaning": ["你看起来很高兴。", "他看起来累了。"]}, {"structure": "adj and adj", "module": "并列形容词", "mid": "M1", "examples": ["The room is big and clean.", "The dog is small and cute."], "meaning": ["房间又大又干净。", "这只狗又小又可爱。"]}, {"structure": "S + V", "module": "动词与时态", "mid": "M2", "examples": ["I read books.", "We go to school."], "meaning": ["我读书。", "我们去上学。"]}, {"structure": "S + be + V-ing", "module": "动词与时态", "mid": "M2", "examples": ["I am reading now.", "She is cooking."], "meaning": ["我正在读书。", "她在做饭。"]}, {"structure": "do/does + V", "module": "动词与时态", "mid": "M2", "examples": ["Do you like apples?", "Does he like milk?"], "meaning": ["你喜欢苹果吗?", "他喜欢牛奶吗?"]}, {"structure": "can + V", "module": "动词与时态", "mid": "M2", "examples": ["I can swim.", "She can sing."], "meaning": ["我会游泳。", "她会唱歌。"]}],L2:[{"structure": "be + adj", "module": "形容词结构", "mid": "M1", "example": "I am happy today because the sun is shining.", "meaning": "今天我很开心,因为阳光灿烂。"}, {"structure": "feel/look + adj", "module": "系表结构", "mid": "M1", "example": "I feel nervous before my first day of school.", "meaning": "开学第一天前,我感到有些紧张。"}, {"structure": "look + adj", "module": "系表结构", "mid": "M1", "example": "He looks friendly, and he always says hello to everyone.", "meaning": "他看起来很友好,而且总是主动跟每个人打招呼。"}, {"structure": "adj and adj", "module": "并列形容词", "mid": "M1", "example": "She has a nice and friendly dog.", "meaning": "她有一只温顺友好的狗。"}, {"structure": "Something doesn’t feel right.", "module": "感觉异常", "mid": "M1", "example": "Something doesn’t feel right with my phone.", "meaning": "我的手机有点不太对劲。"}, {"structure": "This looks ..., but I’ll try my best.", "module": "状态对比", "mid": "M1", "example": "This looks difficult, but I’ll try my best.", "meaning": "这看起来很难,但我会尽力而为。"}, {"structure": "You look ... now.", "module": "感觉状态", "mid": "M1", "example": "You look happy now.", "meaning": "你现在看起来很开心。"}, {"structure": "The ice is too ... so we can’t ...", "module": "困难描述", "mid": "M1", "example": "The ice is too thin so we can't skate on it.", "meaning": "冰面太薄了,我们不能在上面滑冰。"}, {"structure": "How are you feeling today?", "module": "be + adj 描述", "mid": "M1", "example": "How are you feeling today? \nYou look happy!", "meaning": "你今天感觉怎么样? \n你看起来挺开心的!"}, {"structure": "I’m feeling ... today.", "module": "be + adj 描述", "mid": "M1", "example": "I'm feeling tired today.", "meaning": "今天我感觉有点累。"}, {"structure": "It’s very ... outside today.", "module": "be + adj 描述", "mid": "M1", "example": "It's very cold outside today.", "meaning": "今天外面非常冷。"}, {"structure": "You look ... in this picture.", "module": "be + adj 描述", "mid": "M1", "example": "You look happy in this picture.", "meaning": "在这张照片里,你看起来很开心。"}, {"structure": "My room is always ... and ....", "module": "be + adj 描述", "mid": "M1", "example": "My room is always warm and cozy.", "meaning": "我的房间总是温暖又舒适。"}, {"structure": "The movie was really ....", "module": "be + adj 描述", "mid": "M1", "example": "The movie was really funny.", "meaning": "这部电影真是太好笑了。"}, {"structure": "Our teacher is very ....", "module": "be + adj 描述", "mid": "M1", "example": "Our teacher is very patient.", "meaning": "我们的老师非常有耐心。"}, {"structure": "This bag is too ....", "module": "be + adj 描述", "mid": "M1", "example": "This bag is too small for all my books.", "meaning": "这个包装不下我所有的书。"}, {"structure": "Are you sure this is ....?", "module": "be + adj 描述", "mid": "M1", "example": "Are you sure this is warm enough?", "meaning": "你确定这够暖和吗?"}, {"structure": "I’m not sure if it’s ....", "module": "be + adj 描述", "mid": "M1", "example": "I’m not sure if it’s warm enough to swim today.", "meaning": "今天不太确定水温是否适合游泳。"}, {"structure": "What colour is ...?", "module": "be + adj 描述", "mid": "M1", "example": "What color is your new school uniform?", "meaning": "你的新校服是什么颜色的?"}, {"structure": "It’s ...", "module": "be + adj 描述", "mid": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Are you tired?", "module": "be + adj 描述", "mid": "M1", "example": "Are you hungry after playing?", "meaning": "玩完之后你饿了吗?"}, {"structure": "Yes, I’m a bit ....", "module": "be + adj 描述", "mid": "M1", "example": "Yes, I’m a bit nervous about my first day at school.", "meaning": "是的,我对开学第一天有点紧张。"}, {"structure": "No, I’m not ....", "module": "be + adj 描述", "mid": "M1", "example": "No, I'm not tired.", "meaning": "不,我不累。"}, {"structure": "It’s so ... today!", "module": "be + adj 描述", "mid": "M1", "example": "It's so sunny today!", "meaning": "今天阳光真好啊!"}, {"structure": "This looks ....", "module": "be + adj 描述", "mid": "M1", "example": "This looks delicious.", "meaning": "这看起来很好吃。"}, {"structure": "You’re very ....", "module": "be + adj 描述", "mid": "M1", "example": "You're very kind.", "meaning": "你真是太好了。"}, {"structure": "How’s the weather today?", "module": "be + adj 描述", "mid": "M1", "example": "How’s the weather today? \nIt's sunny and warm.", "meaning": "今天天气怎么样? \n阳光很好,也很暖和。"}, {"structure": "It’s ... today.", "module": "be + adj 描述", "mid": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Is it hot or cold?", "module": "be + adj 描述", "mid": "M1", "example": "Is it hot or cold?", "meaning": "是热还是冷?"}, {"structure": "It’s not very ....", "module": "be + adj 描述", "mid": "M1", "example": "It's not very expensive.", "meaning": "{中文翻译}\n这个不是很贵。"}, {"structure": "The sky is so ....", "module": "be + adj 描述", "mid": "M1", "example": "The sky is so blue today.", "meaning": "今天天空真蓝。"}, {"structure": "Everything looks....", "module": "be + adj 描述", "mid": "M1", "example": "Everything looks tidy.", "meaning": "一切看起来都井井有条。"}, {"structure": "The view is really ....", "module": "be + adj 描述", "mid": "M1", "example": "The view is really beautiful.", "meaning": "景色真是太美了。"}, {"structure": "That was very ....", "module": "be + adj 描述", "mid": "M1", "example": "That was very interesting.", "meaning": "那可真有意思。"}, {"structure": "You seem ....", "module": "be + adj 描述", "mid": "M1", "example": "You seem tired this morning.", "meaning": "今天早上你看起来有点累。"}, {"structure": "That’s really ...!", "module": "be + adj 描述", "mid": "M1", "example": "That’s really amazing!", "meaning": "这真是太棒了!"}, {"structure": "The story is very ....", "module": "be + adj 描述", "mid": "M1", "example": "The story is very exciting.", "meaning": "这个故事非常扣人心弦。"}, {"structure": "My parents are both ....", "module": "be + adj 描述", "mid": "M1", "example": "My parents are both very busy on weekdays.", "meaning": "我父母在工作日都非常忙。"}, {"structure": "I’m afraid it’s ....", "module": "be + adj 描述", "mid": "M1", "example": "I’m afraid it’s too cold.", "meaning": "恐怕天气太冷了。"}, {"structure": "It’s difficult to ....", "module": "be + adj 描述", "mid": "M1", "example": "It's difficult to find a good restaurant.", "meaning": "很难找到一家好餐馆。"}, {"structure": "It’s strange that ....", "module": "be + adj 描述", "mid": "M1", "example": "It's strange that the cat is sleeping so much today.", "meaning": "今天这只猫睡得这么多,真是奇怪。"}, {"structure": "The food smells....", "module": "be + adj 描述", "mid": "M1", "example": "The food smells wonderful.", "meaning": "这食物闻起来真香。"}, {"structure": "-er than", "module": "比较级", "mid": "M2", "example": "He is taller than me, but I run faster than him.", "meaning": "他比我高,但我跑得比他快。"}, {"structure": "What did you do yesterday?", "module": "动词与时态", "mid": "M2", "example": "What did you do yesterday? I watched a movie with my family.", "meaning": "你昨天干什么了?我和家人一起看了场电影。"}, {"structure": "I ... yesterday.", "module": "动词与时态", "mid": "M2", "example": "I called my grandmother yesterday.", "meaning": "昨天我给奶奶打了个电话。"}, {"structure": "What are you doing now?", "module": "动词与时态", "mid": "M2", "example": "What are you doing now? \nI am helping my mom cook dinner.", "meaning": "你现在在做什么? \n我正在帮我妈妈做晚饭。"}, {"structure": "I’m ... now.", "module": "动词与时态", "mid": "M2", "example": "I'm eating lunch now.", "meaning": "我正在吃午饭。"}, {"structure": "What will you do tomorrow?", "module": "动词与时态", "mid": "M2", "example": "What will you do tomorrow?", "meaning": "你明天打算做什么?"}]}; + +// ═══════════ BENCHMARKS ═══════════ +var BM={ + L1:{wordsPerSent:{ideal:5,min:3,max:7},targetsPerRound:{ideal:1,max:2},targetExposure:{ideal:3,min:1},dialogRounds:{min:2,ideal:4,max:8},questions:{min:1,ideal:2,max:5}}, + L2:{wordsPerSent:{ideal:7,min:4,max:9},targetsPerRound:{ideal:1,max:2.5},targetExposure:{ideal:3,min:1},dialogRounds:{min:2,ideal:5,max:10},questions:{min:2,ideal:3,max:6}} +}; +// Level-specific difficulty weights for cefr/cambridge levels +var DIFF_WEIGHT={A0:0,A1:1,A2:2,B1:4,B2:6,C1:8,C2:10,Pre_A1:0.5,Starters:0,Movers:1,Flyers:2,KET:3,PET:5}; + +// ── Utils ── +function ew(t){return t?t.toLowerCase().replace(/[^a-z\s'-]/g,' ').split(/\s+/).filter(function(w){return w.length>1}):[]} +function wc(t){return t?t.split(/\s+/).length:0} +function clamp(v,lo,hi){return Math.max(lo,Math.min(hi,v))} +function avg(arr){return arr.length?arr.reduce(function(a,b){return a+b},0)/arr.length:0} + +// ═══════════ QUALITY SCORERS ═══════════ + +// 1. Vocabulary Alignment Score (0-100) +// Higher = more above-level vocabulary (worse alignment) +// Interpretation: >50 means significant over-level vocab +function scoreVocabAlignment(keyPreview,lvl){ + var targets=keyPreview||[],lvl=lvl||'L1'; + if(!targets.length)return{score:0,label:'无目标词',details:[],interpretation:'无法评分:缺少目标词汇数据'}; + var scores=[],details=[]; + targets.forEach(function(w){ + var lo=(w||'').toLowerCase().trim();if(!lo)return; + var inL1=W.L1[lo],inL2=W.L2[lo]; + if(lvl==='L1'){ + if(inL1){scores.push(0);details.push({word:w,level:'L1',diff:inL1.diff||1,status:'in_level',msg:'"'+w+'" L1词库内 ✓'});} + else if(inL2){scores.push(70);details.push({word:w,level:'L2',cefr:inL2.cefr,cambridge:inL2.cambridge,status:'above_level',msg:'"'+w+'" 属L2词汇,超L1范围'});} + else{scores.push(90);details.push({word:w,level:'unknown',status:'out_of_scope',msg:'"'+w+'" 不在L1/L2词库,大概率超纲'});} + }else{ + if(inL1){scores.push(10);details.push({word:w,level:'L1',diff:inL1.diff||1,status:'review_level',msg:'"'+w+'" L1词汇,用于L2属复习 ✓'});} + else if(inL2){scores.push(20);details.push({word:w,level:'L2',cefr:inL2.cefr,cambridge:inL2.cambridge,status:'in_level',msg:'"'+w+'" L2词库内 ✓'});} + else{scores.push(80);details.push({word:w,level:'unknown',status:'out_of_scope',msg:'"'+w+'" 不在L1/L2词库,大概率超纲'});} + } + }); + var sc=avg(scores),above=details.filter(function(d){return d.status==='above_level'||d.status==='out_of_scope'}).length; + var interp=sc<15?'词汇完全在目标级别范围内':sc<40?'大部分词汇在级别内,少量超纲':sc<70?'约'+above+'/'+details.length+'词超纲,难度偏高':'多数词汇超出目标级别,难度显著偏高'; + return{score:Math.round(sc),label:'词汇匹配度',details:details,overLevelCount:above,totalCount:details.length,interpretation:interp}; +} + +// 2. Sentence Complexity Score (0-100) +// Higher = sentences are too long/complex (worse for the level) +function scoreSentenceComplexity(dialogs,lvl){ + var lines=dialogs||[],bm=BM[lvl||'L1']||BM.L1; + if(!lines.length)return{score:0,label:'无台词',details:[],interpretation:'无法评分:缺少对话台词'}; + var wps=[],longCount=0; + lines.forEach(function(line){ + var n=wc(line); + if(n>0){wps.push(n);if(n>bm.wordsPerSent.max+2)longCount++;} + }); + var avgWPS=avg(wps),maxWPS=Math.max.apply(null,wps); + // Score: deviation from ideal. 0 = ideal, 100 = extreme deviation + var dev=avgWPS-bm.wordsPerSent.ideal; + var sc=clamp(Math.round(dev<0?Math.abs(dev)/bm.wordsPerSent.ideal*30:dev/bm.wordsPerSent.max*70+30),0,100); + var interp=sc<25?'句子简洁,适合'+lvl+'级别':sc<50?'句子长度适中':sc<75?'部分句子偏长('+longCount+'句超'+bm.wordsPerSent.max+'词),可能增加理解负担':'句子普遍偏长(均'+avgWPS.toFixed(1)+'词),显著超过'+lvl+'建议水平'; + return{score:sc,label:'语句复杂度',avgWPS:Math.round(avgWPS*10)/10,maxWPS:maxWPS,longSentenceCount:longCount,totalSentences:wps.length,idealWPS:bm.wordsPerSent.ideal,bm_max:bm.wordsPerSent.max,interpretation:interp}; +} + +// 3. Knowledge Density Score (0-100) +// Higher = too many targets packed in (worse) +function scoreKnowledgeDensity(keyPreview,dialogRounds,lvl){ + var tc=(keyPreview||[]).length,dr=Math.max(dialogRounds||1,1),bm=BM[lvl||'L1']||BM.L1; + var ratio=tc/dr; + // Ideal ratio ~1 target per 2 rounds for L1, 1 target per 1.5 rounds for L2 + var idealRatio=bm.targetsPerRound.ideal; + // Score: 0 if sparse, 100 if too dense + var sc; + if(ratio<0.2)sc=10; + else if(ratio=bm.targetExposure.ideal?100:Math.round(70+(cnt-2)/(bm.targetExposure.ideal-2)*30); + scores.push(sc); + details.push({word:w,count:cnt,score:sc,status:cnt===0?'zero':cnt===1?'low':cnt===2?'moderate':'good',msg:'"'+w+'" 出现'+cnt+'次'+(cnt===0?' ⚠️ 零暴露':cnt=90?'全部目标词曝光充分 ✓':ascore>=60?'多数目标词曝光良好,'+zeroCnt+'个零暴露':ascore>=30?zeroCnt+'个目标词零暴露,'+details.filter(function(d){return d.status==='low'}).length+'个曝光不足':'知识点严重曝光不足,'+zeroCnt+'个目标词完全未出现'; + return{score:ascore,label:'知识点曝光度',details:details,zeroExposureCount:zeroCnt,lowExposureCount:details.filter(function(d){return d.status==='low'}).length,perfectExposureCount:details.filter(function(d){return d.status==='good'}).length,idealExposure:bm.targetExposure.ideal,interpretation:interp}; +} + +// 5. Content Coverage Score (0-100) +// How adequate is the component's content structure? +function scoreContentCoverage(summary,lvl){ + var bm=BM[lvl||'L1']||BM.L1,s=summary||{}; + var scores=[],details=[]; + // Dialog rounds + var dr=s.dialogRounds||0; + if(dr<=0){scores.push(0);details.push('无对话结构 ⚠️');} + else if(dr=bm.questions.min&&qc<=bm.questions.max){scores.push(95);details.push('练习'+qc+'题 数量合理 ✓');} + else if(qc0){scores.push(lp<=4?95:75);details.push('学习点'+lp+'个'+(lp<=4?' ✓':''));} + // Feedback + var fb=s.feedbackCount||0; + if(s.questionCount>0&&fb>0){scores.push(fb>=s.questionCount?95:60);details.push('反馈'+fb+'条'+(fb>=s.questionCount?' ✓':'(不足)'));} + var ascore=Math.round(avg(scores)); + return{score:ascore,label:'内容完整度',scores:scores,details:details,interpretation:ascore>=85?'内容结构完整 ✓':ascore>=60?'内容结构基本完整,部分环节可加强':'内容结构不完整,缺少关键教学环节'}; +} + +// ═══════════ BEHAVIORAL CORRELATION ═══════════ + +// Cross-analyze quality scores with behavioral metrics +function correlateBehavioral(qualityScores,item,lvl){ + var insights=[],p=Number(item&&item.perfect)||0,o=Number(item&&item.oops)||0; + // 1. Vocabulary difficulty vs Perfect rate + var vs=qualityScores.vocabAlignment; + if(vs&&vs.score>40&&p<75)insights.push({type:'vocab_difficulty_impact',confidence:vs.score>70?'high':'medium', + insight:'词汇匹配度低('+vs.score+'分):'+vs.overLevelCount+'/'+vs.totalCount+'词超纲,可能解释Perfect率'+p+'%偏低。超纲词:'+vs.details.filter(function(d){return d.status!=='in_level'}).map(function(d){return d.word}).join('、'), + action:'建议替换超纲词汇为'+lvl+'词库内等价词,或降低难度等级'}); + // 2. Sentence complexity vs Oops rate + var ss=qualityScores.sentenceComplexity; + if(ss&&ss.score>50&&o>5)insights.push({type:'complexity_oops_correlation',confidence:ss.score>75?'high':'medium', + insight:'语句复杂度偏高('+ss.score+'分):均'+ss.avgWPS+'词/句(建议≤'+ss.bm_max+'词),'+ss.longSentenceCount+'/'+ss.totalSentences+'句超长。高Oops('+o+'%)可能与理解门槛有关', + action:'建议拆长句为短句(每句≤'+ss.bm_max+'词),降低单次听力/阅读负荷'}); + // 3. Knowledge density vs Perfect rate + var ks=qualityScores.knowledgeDensity; + if(ks&&ks.score>60&&p<75)insights.push({type:'density_perfect_impact',confidence:ks.score>80?'high':'medium', + insight:'知识密度过高('+ks.score+'分):'+ks.targetCount+'个目标词/'+ks.dialogRounds+'轮对话,学生吸收压力大,Perfect率'+p+'%与此相关', + action:'建议减少目标词数或增加对话轮数,降低单轮知识密度'}); + // 4. Knowledge exposure vs Perfect rate + var es=qualityScores.knowledgeExposure; + if(es&&es.score<50&&p<80)insights.push({type:'exposure_perfect_gap',confidence:es.score<25?'high':'medium', + insight:'知识点曝光不足('+es.score+'分):'+es.zeroExposureCount+'个目标词零暴露,学生未在语境中充分接触目标语言', + action:'建议在对话中增加目标词的自然复现,每个目标词至少出现'+es.idealExposure+'次'}); + // 5. Good patterns (positive) + if(vs&&vs.score<15&&p>=80)insights.push({type:'good_alignment',confidence:'low', + insight:'词汇难度匹配良好('+vs.score+'分)+高Perfect('+p+'%):内容难度与学生水平匹配 ✓'}); + if(ss&&ss.score<25&&o<=5)insights.push({type:'good_complexity',confidence:'low', + insight:'语句简洁('+ss.score+'分)+低Oops('+o+'%):语言难度控制在合理范围 ✓'}); + return{insights:insights,summary:insights.length+'条诊断洞察'}; +} + +// ═══════════ COMPONENT COMPARISON ═══════════ +function compareComponents(compA,compB,lvl){ + function qs(c){return evaluate(c.summary,c.item,lvl).qualityScores;} + var qa=qs(compA),qb=qs(compB),comparisons=[]; + ['vocabAlignment','sentenceComplexity','knowledgeDensity','knowledgeExposure','contentCoverage'].forEach(function(k){ + if(qa[k]&&qb[k]){ + var da=qa[k].score-qb[k].score; + // vocabAlignment, sentenceComplexity, knowledgeDensity: lower=better. knowledgeExposure, contentCoverage: higher=better + var lowerBetter=['vocabAlignment','sentenceComplexity','knowledgeDensity'].indexOf(k)>=0; + var aBetter=lowerBetter?(da<0):(da>0); + var winner=aBetter?'A':'B',loser=aBetter?'B':'A'; + if(Math.abs(da)>=10)comparisons.push({dimension:qa[k].label,diff:Math.abs(da),winner:winner,mag:Math.abs(da),msg:qa[k].label+':组件'+winner+'优于组件'+loser+'(差'+Math.abs(da)+'分)'}); + } + }); + return{comparisons:comparisons,summary:comparisons.length+'个维度有显著差异(≥10分)'}; +} + +// ═══════════ RISK FLAGS ═══════════ + +function analyzeRisks(qualityScores,item,lvl){ + var flags=[],p=Number(item&&item.perfect)||0,o=Number(item&&item.oops)||0; + if(qualityScores.vocabAlignment&&qualityScores.vocabAlignment.score>50){ + var ol=qualityScores.vocabAlignment.overLevelCount,tt=qualityScores.vocabAlignment.totalCount; + flags.push({risk:'vocab_overlevel',severity:qualityScores.vocabAlignment.score>75?'high':'medium', + detail:ol+'/'+tt+'目标词超纲',impact:'超纲词增加认知负荷 → Oops↑ Perfect↓'}); + } + if(qualityScores.sentenceComplexity&&qualityScores.sentenceComplexity.score>60){ + flags.push({risk:'sentence_too_long',severity:qualityScores.sentenceComplexity.score>80?'high':'medium', + detail:'均'+qualityScores.sentenceComplexity.avgWPS+'词/句(建议≤'+qualityScores.sentenceComplexity.bm_max+')',impact:'长句增加理解门槛 → Oops↑ 完成率↓'}); + } + if(qualityScores.knowledgeExposure&&qualityScores.knowledgeExposure.zeroExposureCount>0){ + flags.push({risk:'zero_exposure',severity:qualityScores.knowledgeExposure.zeroExposureCount>=qualityScores.knowledgeExposure.details.length/2?'high':'medium', + detail:qualityScores.knowledgeExposure.zeroExposureCount+'个目标词零暴露',impact:'学生未在语境中接触目标语言 → 学习效果差'}); + } + if(qualityScores.knowledgeDensity&&qualityScores.knowledgeDensity.score>70){ + flags.push({risk:'over_dense',severity:qualityScores.knowledgeDensity.score>85?'high':'medium', + detail:qualityScores.knowledgeDensity.targetCount+'词/'+qualityScores.knowledgeDensity.dialogRounds+'轮',impact:'知识密度过高 → 学生吸收困难 → Perfect↓'}); + } + if(qualityScores.contentCoverage&&qualityScores.contentCoverage.score<60){ + flags.push({risk:'thin_content',severity:qualityScores.contentCoverage.score<40?'high':'medium', + detail:'内容完整度仅'+qualityScores.contentCoverage.score+'分',impact:'缺少关键教学环节 → 教学效果难以保证'}); + } + // Behavioral red flags + if(p<70&&o>=10)flags.push({risk:'critical_performance',severity:'high',detail:'Perfect='+p+'%/Oops='+o+'%',impact:'关键内容组件表现严重不达标,需优先排查'}); + else if(p<70)flags.push({risk:'low_perfect',severity:'medium',detail:'Perfect='+p+'%',impact:'学习吸收不足,建议复核内容质量和难度'}); + else if(o>=10)flags.push({risk:'high_oops',severity:'medium',detail:'Oops='+o+'%',impact:'操作或理解阻塞,建议复核交互设计和内容清晰度'}); + return{flags:flags,severityCounts:{high:flags.filter(function(f){return f.severity==='high'}).length,medium:flags.filter(function(f){return f.severity==='medium'}).length},summary:flags.length+'个风险项('+flags.filter(function(f){return f.severity==='high'}).length+'高/'+flags.filter(function(f){return f.severity==='medium'}).length+'中)'}; +} + +// ═══════════ MAIN API ═══════════ + +/** + * evaluate(summary, item, level) + * summary: summarizeComponentContent() 的返回值 + * item: {perfect, oops, good, cType, cId, ...} 组件的行为指标 + * level: "L1" | "L2" + * Returns: {qualityScores, behavioralInsights, riskAnalysis, overallScore} + */ +function evaluate(summary,item,lvl){ + var l=lvl||'L1',s=summary||{},it=item||{}; + var allDialogs=(s.realContent&&s.realContent.dialogs)||[]; + if(!allDialogs.length&&s.dialogLines)allDialogs=s.dialogLines.filter(function(l){return typeof l==='string'}).map(function(l){return l}); + + var qs={}; + qs.vocabAlignment=scoreVocabAlignment(s.keyPreview,l); + qs.sentenceComplexity=scoreSentenceComplexity(allDialogs,l); + qs.knowledgeDensity=scoreKnowledgeDensity(s.keyPreview,s.dialogRounds,l); + qs.knowledgeExposure=scoreKnowledgeExposure(s.keyPreview,allDialogs,l); + qs.contentCoverage=scoreContentCoverage(s,l); + + // Overall score: weighted average + // Vocab alignment and exposure are key for learning quality + var weights={vocabAlignment:0.30,sentenceComplexity:0.20,knowledgeDensity:0.10,knowledgeExposure:0.30,contentCoverage:0.10}; + // Positive-direction metrics (higher=better): invert for overall problem score + var posMetrics={knowledgeExposure:true,contentCoverage:true}; + var overall=0,wsum=0; + Object.keys(weights).forEach(function(k){if(qs[k]&&qs[k].score!==undefined){ + var s=posMetrics[k]?(100-qs[k].score):qs[k].score; + overall+=s*weights[k];wsum+=weights[k]; + }}); + overall=wsum>0?Math.round(overall/wsum):null; + // Boost: if behavioral data shows critical issues, raise overall score + var p=Number(it.perfect)||0,o=Number(it.oops)||0; + if(p>0&&p<60&&overall!==null)overall=Math.round(overall*0.7+15); + if(o>15&&overall!==null)overall=Math.round(overall*0.7+15); + + var bi=correlateBehavioral(qs,it,l); + var ra=analyzeRisks(qs,it,l); + + return{ + level:l, + componentType:it.cType||it.type||'', + componentId:it.cId||'', + qualityScores:qs, + overallQualityScore:overall, + overallLabel:overall===null?'无法计算':overall<15?'优(内容质量高)':overall<30?'良(质量较好)':overall<50?'中(有提升空间)':'差(需优化)', + behavioralInsights:bi, + riskAnalysis:ra, + timestamp:new Date().toISOString() + }; +} + +/** + * Quick evaluate: just the quality scores, no behavioral correlation + */ +function score(summary,lvl){return evaluate(summary,null,lvl).qualityScores;} + +/** + * Get benchmarks for reference + */ +function benchmarks(lvl){return BM[lvl||'L1']||BM.L1;} + +// ── Export ── +g.PedagogyRules={VERSION:'3.0.0', + evaluate:evaluate,score:score,benchmarks:benchmarks,compare:compareComponents, + scoreVocabAlignment:scoreVocabAlignment,scoreSentenceComplexity:scoreSentenceComplexity, + scoreKnowledgeDensity:scoreKnowledgeDensity,scoreKnowledgeExposure:scoreKnowledgeExposure, + scoreContentCoverage:scoreContentCoverage, + correlateBehavioral:correlateBehavioral,analyzeRisks:analyzeRisks, + WORD_LISTS:W,PATTERNS:P,BENCHMARKS:BM +}; +console.log('[PedagogyRules v3] L1 words:'+Object.keys(W.L1).length+' L2 words:'+Object.keys(W.L2).length+' L1 pat:'+P.L1.length+' L2 pat:'+P.L2.length); +})(typeof window!=='undefined'?window:this); diff --git a/output/sample_questions/01_reading_pic_makeWord.json b/output/sample_questions/01_reading_pic_makeWord.json index 7c0f1cf..d772384 100644 --- a/output/sample_questions/01_reading_pic_makeWord.json +++ b/output/sample_questions/01_reading_pic_makeWord.json @@ -1,7 +1,7 @@ { "category": "reading", "type": "reading_pic_makeWord", - "questionSetID": "020301", + "questionSetID": "110199", "textTitle": "Look at the pictures. Look at the letters. Write the word.", "questionSet": [ { diff --git a/output/sample_questions/02_reading_word_definition.json b/output/sample_questions/02_reading_word_definition.json index 6dc21fb..7edbf2f 100644 --- a/output/sample_questions/02_reading_word_definition.json +++ b/output/sample_questions/02_reading_word_definition.json @@ -1,7 +1,7 @@ { "category": "reading", "type": "reading_word_definition", - "questionSetID": "030501", + "questionSetID": "110199", "textTitle": "Look and read. Choose the correct words and write them on the lines.", "questionSet": [ { diff --git a/output/sample_questions/03_writing_pic_faq.json b/output/sample_questions/03_writing_pic_faq.json index c759277..97d00ba 100644 --- a/output/sample_questions/03_writing_pic_faq.json +++ b/output/sample_questions/03_writing_pic_faq.json @@ -1,7 +1,7 @@ { "category": "writing", "type": "writing_pic_faq", - "questionSetID": "021601", + "questionSetID": "110199", "textDesc": "Look and write.", "textImage": "021601.png", "imageDesc": "A park scene: a boy is riding a bike, a girl in a black skirt is reading a book under a tree, a dog is running near the flowers, and there is a red ball on the grass.", diff --git a/output/sample_questions/04_listening_listenWrite.json b/output/sample_questions/04_listening_listenWrite.json index ec37546..78e67352 100644 --- a/output/sample_questions/04_listening_listenWrite.json +++ b/output/sample_questions/04_listening_listenWrite.json @@ -1,33 +1,43 @@ { "category": "listening", "type": "listening_listenWrite", - "questionSetID": "110901", + "questionSetID": "110199", "textTitle": "Read the question. Listen and write a name or a number.", - "textAudio": "110901.mp3", - "textImage": "110901.png", + "textAudio": "110199.mp3", + "textImage": "110199.png", "textDesc": "There are two examples. Listen and write.", "questionSet": [ { "question": "What is the girl's name?", - "answerText": "Lucy" + "answerText": "Lucy", + "ability": ["显性细节理解|数字/时间/地点"], + "explanation": "音频中介绍女孩时说 'My name is Lucy',直接抓取姓名的关键词即可。注意人名首字母大写。" }, { "question": "How old is she?", - "answerText": "8" + "answerText": "8", + "ability": ["显性细节理解|数字/时间/地点"], + "explanation": "音频中女孩提到 'I am eight years old',直接抓取年龄数字即可。注意用阿拉伯数字作答。" }, { "question": "What is the name of her dog?", - "questionDesc": "Her dog is called (4).", - "answerText": "Max" + "questionDesc": "Her dog is called (3).", + "answerText": "Max", + "ability": ["显性细节理解|数字/时间/地点"], + "explanation": "音频中提到 'My dog is called Max',从对话中抓取狗的名字。注意人名首字母大写。" }, { "question": "Where does she live?", "questionDesc": "She lives in (5) Street.", - "answerText": "Green" + "answerText": "Green", + "ability": ["显性细节理解|数字/时间/地点"], + "explanation": "音频中提到 'I live in Green Street',抓取街道名称。注意首字母大写。" }, { "question": "What number is her house?", - "answerText": "12" + "answerText": "12", + "ability": ["显性细节理解|数字/时间/地点"], + "explanation": "音频中提到 'My house number is twelve',抓取门牌号即可。注意用阿拉伯数字作答。" } ] } diff --git a/output/sample_questions/05_reading_select_cloze_noPic.json b/output/sample_questions/05_reading_select_cloze_noPic.json index f1a8c87..dcae1d4 100644 --- a/output/sample_questions/05_reading_select_cloze_noPic.json +++ b/output/sample_questions/05_reading_select_cloze_noPic.json @@ -1,42 +1,43 @@ { "category": "reading", "type": "reading_select_cloze", - "questionSetID": "050401", + "questionSetID": "110199", "textTitle": "Look and read. Choose the correct words and write them on the lines.", + "textImage": "110199.png", "questionSet": [ { "question": "Michael: Hi Sally, I didn't see you at school yesterday. Where were you?", "questionDesc": "Sally: (0).", "answer": [1], - "ability": ["上下文理解", "对话逻辑", "语义推断"], + "ability": ["对话理解|问答匹配"], "explanation": "Michael问Sally昨天为什么没来学校,Sally的回答应该解释原因。'I was feeling sick so I stayed in bed'恰好解释了缺席原因,符合对话逻辑。" }, { "question": "Michael: Oh no! What was the matter? Did you have a sore head?", "questionDesc": "Sally: (0).", "answer": [4], - "ability": ["上下文理解", "对话逻辑", "语义推断"], + "ability": ["对话理解|问答匹配"], "explanation": "Michael问Sally是不是头疼,Sally的回答应该是否定头疼并说明实际情况。'No. I had a terrible cold but it's better now'符合这个对话逻辑。" }, { "question": "Michael: I hate being ill.", "questionDesc": "Sally: (0).", "answer": [0], - "ability": ["上下文理解", "对话逻辑", "语义推断"], + "ability": ["对话理解|问答匹配"], "explanation": "Michael说讨厌生病,Sally表示同感。'So do I! It's horrible!'表达相同的感受,符合上下文。" }, { "question": "Michael: In our English lesson, we had to answer some questions about a story.", "questionDesc": "Sally: (0).", "answer": [2], - "ability": ["上下文理解", "对话逻辑", "语义推断"], + "ability": ["对话理解|问答匹配"], "explanation": "Michael说英语课上回答了问题,Sally回应自己的情况。'Did you? I just watched TV all day'使用反问+自述的方式,符合对话自然过渡。" }, { "question": "Sally: Do you have a lot of homework?", "questionDesc": "Michael: (0).", "answer": [5], - "ability": ["上下文理解", "对话逻辑", "语义推断"], + "ability": ["对话理解|问答匹配"], "explanation": "Sally问作业多不多,Michael回答关于作业的数量。'A few, I hope you'll enjoy them'带有幽默感,符合小学生对话风格。" } ], diff --git a/output/sample_questions/06_reading_select_cloze_withPic.json b/output/sample_questions/06_reading_select_cloze_withPic.json index 69d9b41..4d77472 100644 --- a/output/sample_questions/06_reading_select_cloze_withPic.json +++ b/output/sample_questions/06_reading_select_cloze_withPic.json @@ -1,7 +1,7 @@ { "category": "reading", "type": "reading_select_cloze", - "questionSetID": "050402", + "questionSetID": "110199", "textTitle": "Look and read. Choose the correct words and write them on the lines.", "textImage": "050402.png", "imageDesc": "A park scene with children playing: one boy is flying a kite, a girl is sitting on a blanket eating a sandwich, and a dog is running after a ball.",