feat: 清理无用的 MacOS 文件和更新组件,提升代码整洁性
- 删除多个无用的 MacOS 生成文件,减少项目冗余。 - 在 layout 组件中添加 ScaledPortal 和相关类型,增强组件功能。 - 更新 puzzleData 中的学校名称,确保信息准确性。 - 调整 internalization 组件中的提示文本,提升用户体验。 - 在多个场景中引入新的选择题和成功提示,增强学习互动性。
This commit is contained in:
1 parent
a365964f54
commit
45dd648d21
60 files changed
+558
-63
No files matched your search
@@ -78,8 +78,114 @@ const QUIZ_ANCHORS: QuizAnchor[] = [
|
||||
},
|
||||
{
|
||||
id: "quiz-2",
|
||||
time: 60 * 5 + 40,
|
||||
time: 60 * 2, // 2分钟
|
||||
title: "题目2",
|
||||
prompt:
|
||||
"【多选】新时代青年传承“振兴中华”的精神,能够具体落实为( )。",
|
||||
type: "multiple",
|
||||
options: [
|
||||
{
|
||||
value: "A",
|
||||
label: "专注学习,提升自身技能与素养",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!青年通过专注学习、提升自身能力,用精益求精的精神服务于国家建设,才能成为“振兴中华”的践行者。",
|
||||
},
|
||||
{
|
||||
value: "B",
|
||||
label: "秉持精益求精的精神,在专业领域深耕",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!青年在自己的专业领域深耕细作,才能以扎实的能力为国家发展贡献力量。",
|
||||
},
|
||||
{
|
||||
value: "C",
|
||||
label: "遇到困难不退缩,不因失败而灰心",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!不因失败而灰心,也从不因困难而退缩,这种坚韧的态度是践行“振兴中华”过程中不可或缺的品质。",
|
||||
},
|
||||
{
|
||||
value: "D",
|
||||
label: "放弃个人职业规划,直接投身革命事业",
|
||||
isCorrect: false,
|
||||
explanation:
|
||||
"振兴中华要把个人理想融入国家命运,在自己的领域里成为“振兴中华”的践行者。请你再想想吧!",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "quiz-3",
|
||||
time: 60 * 4 + 14, // 4分14秒
|
||||
title: "题目3",
|
||||
prompt: "【多选】新时代青年涵养“天下为公”的情怀能够具体落实为:",
|
||||
type: "multiple",
|
||||
options: [
|
||||
{
|
||||
value: "A",
|
||||
label: "做一名志愿者走进养老院服务老人",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!对他人的关爱与奉献是传承“天下为公”情怀的具体行动哦!",
|
||||
},
|
||||
{
|
||||
value: "B",
|
||||
label: "只专注于个人学业与职业发展,不参与公共事务",
|
||||
isCorrect: false,
|
||||
explanation:
|
||||
"这与“天下为公”的情怀完全相悖。请你再想想吧!",
|
||||
},
|
||||
{
|
||||
value: "C",
|
||||
label: "用自己所学的技能为企业、社区提供服务",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!用自己所学的技能为企业、社区提供服务是青年将个人能力转化为公共服务、践行“天下为公”的重要方式。",
|
||||
},
|
||||
{
|
||||
value: "D",
|
||||
label: "在日常生活中关心身边有需要的人",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!“天下为公”的情怀不需要宏大叙事,从身边小事做起就是具体落实。",
|
||||
},
|
||||
],
|
||||
explanation: "请再仔细分析一下题目,做出更全面的选择吧!",
|
||||
},
|
||||
{
|
||||
id: "quiz-4",
|
||||
time: 60 * 5 + 40,
|
||||
title: "题目4",
|
||||
prompt: "【多选】新时代青年学习“与时俱进”的智慧能够具体落实为:",
|
||||
type: "multiple",
|
||||
options: [
|
||||
{
|
||||
value: "A",
|
||||
label: "主动学习新知识,关注科技等前沿领域",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!主动学习新知识、适应新趋势正是青年与时俱进、紧跟时代步伐的具体表现。",
|
||||
},
|
||||
{
|
||||
value: "B",
|
||||
label: "在工作中突破传统思维,用创新方法解决问题",
|
||||
isCorrect: true,
|
||||
explanation:
|
||||
"恭喜你,选择正确!在工作中突破传统思维,用创新解决问题正是与时俱进精神在职业场景中的落地。",
|
||||
},
|
||||
{
|
||||
value: "C",
|
||||
label: "固执己见,拒绝接受新事物和新变化",
|
||||
isCorrect: false,
|
||||
explanation: "这与“与时俱进”的智慧完全相悖。请你再想想吧!",
|
||||
},
|
||||
],
|
||||
explanation: "请再仔细分析一下题目,做出更全面的选择吧!",
|
||||
},
|
||||
{
|
||||
id: "quiz-5",
|
||||
time: 60 * 5 + 40,
|
||||
title: "题目5",
|
||||
prompt: "【多选】新时代的青年要从孙中山先生身上学习哪些精神?",
|
||||
type: "multiple",
|
||||
options: [
|
||||
@@ -106,7 +212,6 @@ const ChenyunInternalization = () => {
|
||||
const { triggerPuzzleAnimation } = usePuzzleAnimation();
|
||||
|
||||
const [activeSuccess, setActiveSuccess] = useState<string | null>(null);
|
||||
const [successContent, setSuccessContent] = useState<string>("");
|
||||
const [resumeCallback, setResumeCallback] = useState<(() => void) | null>(
|
||||
null
|
||||
);
|
||||
@@ -137,10 +242,11 @@ const ChenyunInternalization = () => {
|
||||
|
||||
// 组件卸载时清理背景音乐
|
||||
useEffect(() => {
|
||||
const audioEl = audioRef.current;
|
||||
return () => {
|
||||
if (audioRef.current) {
|
||||
audioRef.current.pause();
|
||||
audioRef.current.currentTime = 0;
|
||||
if (audioEl) {
|
||||
audioEl.pause();
|
||||
audioEl.currentTime = 0;
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
@@ -195,7 +301,6 @@ const ChenyunInternalization = () => {
|
||||
|
||||
if (isCorrect) {
|
||||
setActiveSuccess(item.id);
|
||||
setSuccessContent("回答正确,请继续探索。");
|
||||
setResumeCallback(() => resume);
|
||||
} else {
|
||||
setDragQuizErrors((prev) => ({
|
||||
@@ -214,7 +319,6 @@ const ChenyunInternalization = () => {
|
||||
|
||||
if (isCorrect) {
|
||||
setActiveSuccess(item.id);
|
||||
setSuccessContent("回答正确,请继续探索。");
|
||||
setResumeCallback(() => resume);
|
||||
} else {
|
||||
setDragQuizErrors((prev) => ({
|
||||
@@ -246,10 +350,9 @@ const ChenyunInternalization = () => {
|
||||
<SuccessAlert
|
||||
visible={activeSuccess === item.id}
|
||||
title="恭喜你, 选择正确!"
|
||||
content={successContent}
|
||||
content="回答正确,请继续探索。"
|
||||
onContinue={() => {
|
||||
setActiveSuccess(null);
|
||||
setSuccessContent("");
|
||||
setDragQuizValues((prev) => {
|
||||
const next = { ...prev };
|
||||
delete next[item.id];
|
||||
@@ -291,23 +394,78 @@ const ChenyunInternalization = () => {
|
||||
}))}
|
||||
correctAnswer={correctAnswers}
|
||||
errorMessage={
|
||||
item.explanation || "再想一想,确保选择了所有正确答案~"
|
||||
item.id === "quiz-2"
|
||||
? (selectedValues: string[]) => {
|
||||
const picked = new Set(selectedValues);
|
||||
const pickedD = item.options.find(
|
||||
(o) => o.value === "D"
|
||||
);
|
||||
if (picked.has("D")) return pickedD?.explanation || "";
|
||||
return "请再仔细分析一下题目,做出更全面的选择吧!";
|
||||
}
|
||||
: item.id === "quiz-3"
|
||||
? (selectedValues: string[]) => {
|
||||
const picked = new Set(selectedValues);
|
||||
const pickedB = item.options.find(
|
||||
(o) => o.value === "B"
|
||||
);
|
||||
if (picked.has("B")) return pickedB?.explanation || "";
|
||||
return (
|
||||
item.explanation ||
|
||||
"请再仔细分析一下题目,做出更全面的选择吧!"
|
||||
);
|
||||
}
|
||||
: item.id === "quiz-4"
|
||||
? (selectedValues: string[]) => {
|
||||
const picked = new Set(selectedValues);
|
||||
const pickedC = item.options.find(
|
||||
(o) => o.value === "C"
|
||||
);
|
||||
if (picked.has("C")) return pickedC?.explanation || "";
|
||||
return (
|
||||
item.explanation ||
|
||||
"请再仔细分析一下题目,做出更全面的选择吧!"
|
||||
);
|
||||
}
|
||||
: item.id === "quiz-5"
|
||||
? (selectedValues: string[]) => {
|
||||
const picked = new Set(selectedValues);
|
||||
const pickedC = item.options.find(
|
||||
(o) => o.value === "C"
|
||||
);
|
||||
if (picked.has("C")) return pickedC?.explanation || "";
|
||||
return (
|
||||
item.explanation ||
|
||||
"请再仔细分析一下题目,做出更全面的选择吧!"
|
||||
);
|
||||
}
|
||||
: item.explanation ||
|
||||
"再想一想,确保选择了所有正确答案~"
|
||||
}
|
||||
onSubmit={(values: string[], isCorrect: boolean) => {
|
||||
if (isCorrect) {
|
||||
setActiveSuccess(item.id);
|
||||
setSuccessContent("回答正确,请继续探索。");
|
||||
// if (item.id === "quiz-2") {
|
||||
// const picked = new Set(values);
|
||||
// const content = item.options
|
||||
// .filter((o) => picked.has(o.value))
|
||||
// .map((o) => o.explanation)
|
||||
// .filter(Boolean)
|
||||
// .join("\n");
|
||||
// setSuccessContent(content || "回答正确,请继续探索。");
|
||||
// } else {
|
||||
// setSuccessContent("回答正确,请继续探索。");
|
||||
// }
|
||||
setResumeCallback(() => resume);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<SuccessAlert
|
||||
visible={activeSuccess === item.id}
|
||||
title="恭喜你, 选择正确!"
|
||||
content={successContent}
|
||||
// title="恭喜你, 选择正确!"
|
||||
// content="回答正确,请继续探索。"
|
||||
onContinue={() => {
|
||||
setActiveSuccess(null);
|
||||
setSuccessContent("");
|
||||
const cb = resumeCallback;
|
||||
setResumeCallback(null);
|
||||
triggerPuzzleAnimation(16);
|
||||
@@ -331,7 +489,6 @@ const ChenyunInternalization = () => {
|
||||
[
|
||||
activeSuccess,
|
||||
resumeCallback,
|
||||
successContent,
|
||||
dragQuizValues,
|
||||
dragQuizErrors,
|
||||
triggerPuzzleAnimation,
|
||||
|
||||
Reference in new issue
Block a user