feat: 清理无用的 MacOS 文件和更新组件,提升代码整洁性

- 删除多个无用的 MacOS 生成文件,减少项目冗余。
- 在 layout 组件中添加 ScaledPortal 和相关类型,增强组件功能。
- 更新 puzzleData 中的学校名称,确保信息准确性。
- 调整 internalization 组件中的提示文本,提升用户体验。
- 在多个场景中引入新的选择题和成功提示,增强学习互动性。
This commit is contained in:
zhongyidian committed 2026-02-01 14:37:14 +08:00
1 parent a365964f54
commit 45dd648d21
60 files changed
+558 -63

No files matched your search

+172 -15
View File
@@ -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,