diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 3feb937..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(npx tsc --noEmit)", - "Bash(pnpm lint)", - "Bash(pnpm add -D typescript-eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin)", - "Bash(git add .)", - "Bash(git commit -m \"$(cat <<''EOF''\n迁移到 TypeScript\n\n完整的 TypeScript 迁移,提升代码质量和开发体验\n\n**安装依赖:**\n- TypeScript 5.9.3\n- @types/react, @types/react-dom, @types/node\n- typescript-eslint 相关包\n\n**配置文件:**\n- 创建 tsconfig.json (应用配置)\n- 创建 tsconfig.node.json (Node 配置)\n- 更新 eslint.config.ts 支持 TypeScript\n- 所有配置文件迁移到 .ts 扩展名\n\n**源代码迁移:**\n- 所有 .jsx 文件 → .tsx\n- 所有 .js 文件 → .ts \n- 添加完整的类型定义和接口\n- 修复所有类型错误\n\n**类型定义:**\n- Experiment 接口 (实验数据类型)\n- DraggableItemProps 接口\n- 函数参数类型注解\n- React 组件 Props 类型\n\n**代码优化:**\n- 修复 main.tsx 中的 null 检查\n- 添加 DragEndEvent 类型\n- 使用类型守卫和类型断言\n- 改进错误处理\n\n**构建脚本:**\n- 添加 typecheck 脚本\n- build 脚本包含类型检查\n- 更新 index.html 入口为 main.tsx\n\n**验证:**\n- ✅ TypeScript 编译通过\n- ✅ ESLint 检查通过\n- ✅ 所有类型正确推导\n- ✅ 代码质量提升\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude \nEOF\n)\")" - ], - "deny": [], - "ask": [] - } -} diff --git a/public/audio/luxun/mp3_luxun_01.mp3 b/public/audio/luxun/mp3_luxun_01.mp3 new file mode 100644 index 0000000..0cfb2f7 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_01.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_02.mp3 b/public/audio/luxun/mp3_luxun_02.mp3 new file mode 100644 index 0000000..4c45df5 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_02.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_03.mp3 b/public/audio/luxun/mp3_luxun_03.mp3 new file mode 100644 index 0000000..d232d14 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_03.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_04.mp3 b/public/audio/luxun/mp3_luxun_04.mp3 new file mode 100644 index 0000000..ddf3541 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_04.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_05.mp3 b/public/audio/luxun/mp3_luxun_05.mp3 new file mode 100644 index 0000000..db009e5 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_05.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_06.mp3 b/public/audio/luxun/mp3_luxun_06.mp3 new file mode 100644 index 0000000..31f9bb0 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_06.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_07.mp3 b/public/audio/luxun/mp3_luxun_07.mp3 new file mode 100644 index 0000000..462691c Binary files /dev/null and b/public/audio/luxun/mp3_luxun_07.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_08.mp3 b/public/audio/luxun/mp3_luxun_08.mp3 new file mode 100644 index 0000000..260514c Binary files /dev/null and b/public/audio/luxun/mp3_luxun_08.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_09.mp3 b/public/audio/luxun/mp3_luxun_09.mp3 new file mode 100644 index 0000000..638c0f6 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_09.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_10.mp3 b/public/audio/luxun/mp3_luxun_10.mp3 new file mode 100644 index 0000000..0ce708d Binary files /dev/null and b/public/audio/luxun/mp3_luxun_10.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_11.mp3 b/public/audio/luxun/mp3_luxun_11.mp3 new file mode 100644 index 0000000..f1283be Binary files /dev/null and b/public/audio/luxun/mp3_luxun_11.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_12.mp3 b/public/audio/luxun/mp3_luxun_12.mp3 new file mode 100644 index 0000000..ccbe058 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_12.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_13.mp3 b/public/audio/luxun/mp3_luxun_13.mp3 new file mode 100644 index 0000000..6285cca Binary files /dev/null and b/public/audio/luxun/mp3_luxun_13.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_14.mp3 b/public/audio/luxun/mp3_luxun_14.mp3 new file mode 100644 index 0000000..56e9606 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_14.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_15.mp3 b/public/audio/luxun/mp3_luxun_15.mp3 new file mode 100644 index 0000000..c491d85 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_15.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_16.mp3 b/public/audio/luxun/mp3_luxun_16.mp3 new file mode 100644 index 0000000..8a3531f Binary files /dev/null and b/public/audio/luxun/mp3_luxun_16.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_17.mp3 b/public/audio/luxun/mp3_luxun_17.mp3 new file mode 100644 index 0000000..f04036b Binary files /dev/null and b/public/audio/luxun/mp3_luxun_17.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_18.mp3 b/public/audio/luxun/mp3_luxun_18.mp3 new file mode 100644 index 0000000..93e9e9e Binary files /dev/null and b/public/audio/luxun/mp3_luxun_18.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_19.mp3 b/public/audio/luxun/mp3_luxun_19.mp3 new file mode 100644 index 0000000..80c86e3 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_19.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_20.mp3 b/public/audio/luxun/mp3_luxun_20.mp3 new file mode 100644 index 0000000..6553697 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_20.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_21.mp3 b/public/audio/luxun/mp3_luxun_21.mp3 new file mode 100644 index 0000000..11d83d4 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_21.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_22.mp3 b/public/audio/luxun/mp3_luxun_22.mp3 new file mode 100644 index 0000000..d17c76d Binary files /dev/null and b/public/audio/luxun/mp3_luxun_22.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_23.mp3 b/public/audio/luxun/mp3_luxun_23.mp3 new file mode 100644 index 0000000..804daef Binary files /dev/null and b/public/audio/luxun/mp3_luxun_23.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_24.mp3 b/public/audio/luxun/mp3_luxun_24.mp3 new file mode 100644 index 0000000..622e334 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_24.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_25.mp3 b/public/audio/luxun/mp3_luxun_25.mp3 new file mode 100644 index 0000000..5a22b08 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_25.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_26.mp3 b/public/audio/luxun/mp3_luxun_26.mp3 new file mode 100644 index 0000000..5b7c634 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_26.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_27.mp3 b/public/audio/luxun/mp3_luxun_27.mp3 new file mode 100644 index 0000000..c671005 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_27.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_28.mp3 b/public/audio/luxun/mp3_luxun_28.mp3 new file mode 100644 index 0000000..0ac55c8 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_28.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_29.mp3 b/public/audio/luxun/mp3_luxun_29.mp3 new file mode 100644 index 0000000..3580090 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_29.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_30.mp3 b/public/audio/luxun/mp3_luxun_30.mp3 new file mode 100644 index 0000000..0cb815d Binary files /dev/null and b/public/audio/luxun/mp3_luxun_30.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_31.mp3 b/public/audio/luxun/mp3_luxun_31.mp3 new file mode 100644 index 0000000..a52f904 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_31.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_32.mp3 b/public/audio/luxun/mp3_luxun_32.mp3 new file mode 100644 index 0000000..26a782b Binary files /dev/null and b/public/audio/luxun/mp3_luxun_32.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_32_02.mp3 b/public/audio/luxun/mp3_luxun_32_02.mp3 new file mode 100644 index 0000000..c72a21d Binary files /dev/null and b/public/audio/luxun/mp3_luxun_32_02.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_33.mp3 b/public/audio/luxun/mp3_luxun_33.mp3 new file mode 100644 index 0000000..a05fe22 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_33.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_33_02.mp3 b/public/audio/luxun/mp3_luxun_33_02.mp3 new file mode 100644 index 0000000..5a3ff7b Binary files /dev/null and b/public/audio/luxun/mp3_luxun_33_02.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_34.mp3 b/public/audio/luxun/mp3_luxun_34.mp3 new file mode 100644 index 0000000..ab5292d Binary files /dev/null and b/public/audio/luxun/mp3_luxun_34.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_35.mp3 b/public/audio/luxun/mp3_luxun_35.mp3 new file mode 100644 index 0000000..a4f93e1 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_35.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_36.mp3 b/public/audio/luxun/mp3_luxun_36.mp3 new file mode 100644 index 0000000..8ca1212 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_36.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_37.mp3 b/public/audio/luxun/mp3_luxun_37.mp3 new file mode 100644 index 0000000..9c9ff34 Binary files /dev/null and b/public/audio/luxun/mp3_luxun_37.mp3 differ diff --git a/public/audio/luxun/mp3_luxun_38.mp3 b/public/audio/luxun/mp3_luxun_38.mp3 new file mode 100644 index 0000000..1d97a0b Binary files /dev/null and b/public/audio/luxun/mp3_luxun_38.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_01.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_01.mp3 new file mode 100644 index 0000000..c1c312b Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_01.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_02.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_02.mp3 new file mode 100644 index 0000000..4c45df5 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_02.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_03.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_03.mp3 new file mode 100644 index 0000000..303f157 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_03.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_04.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_04.mp3 new file mode 100644 index 0000000..ae4fe3d Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_04.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_05.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_05.mp3 new file mode 100644 index 0000000..d8f1862 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_05.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_06.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_06.mp3 new file mode 100644 index 0000000..233b0b4 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_06.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_07.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_07.mp3 new file mode 100644 index 0000000..e538137 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_07.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_08.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_08.mp3 new file mode 100644 index 0000000..e8c2f23 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_08.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_09.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_09.mp3 new file mode 100644 index 0000000..1e1c2a8 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_09.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_10.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_10.mp3 new file mode 100644 index 0000000..de06ff4 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_10.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_11.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_11.mp3 new file mode 100644 index 0000000..084dfed Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_11.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_12.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_12.mp3 new file mode 100644 index 0000000..a07a695 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_12.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_13.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_13.mp3 new file mode 100644 index 0000000..8278ae6 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_13.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_14.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_14.mp3 new file mode 100644 index 0000000..56a1553 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_14.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_15.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_15.mp3 new file mode 100644 index 0000000..c3c5c52 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_15.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_16.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_16.mp3 new file mode 100644 index 0000000..ccc1454 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_16.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_17.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_17.mp3 new file mode 100644 index 0000000..2170088 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_17.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_18.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_18.mp3 new file mode 100644 index 0000000..1f25743 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_18.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_19.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_19.mp3 new file mode 100644 index 0000000..868e853 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_19.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_20.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_20.mp3 new file mode 100644 index 0000000..30fc64f Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_20.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_21.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_21.mp3 new file mode 100644 index 0000000..b9ea9d1 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_21.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_22.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_22.mp3 new file mode 100644 index 0000000..a446bc6 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_22.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_23.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_23.mp3 new file mode 100644 index 0000000..f79c26b Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_23.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_24.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_24.mp3 new file mode 100644 index 0000000..62faf91 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_24.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_25.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_25.mp3 new file mode 100644 index 0000000..d1df22b Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_25.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_26.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_26.mp3 new file mode 100644 index 0000000..31a4a1c Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_26.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_27.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_27.mp3 new file mode 100644 index 0000000..ed0d1eb Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_27.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_28.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_28.mp3 new file mode 100644 index 0000000..73dde45 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_28.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_29.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_29.mp3 new file mode 100644 index 0000000..9d1c5ab Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_29.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_30.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_30.mp3 new file mode 100644 index 0000000..3a466db Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_30.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_31.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_31.mp3 new file mode 100644 index 0000000..4c2304b Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_31.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_32.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_32.mp3 new file mode 100644 index 0000000..7076bce Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_32.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_33.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_33.mp3 new file mode 100644 index 0000000..cb23957 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_33.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_34.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_34.mp3 new file mode 100644 index 0000000..36ff462 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_34.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_35.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_35.mp3 new file mode 100644 index 0000000..5e158ed Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_35.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_36.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_36.mp3 new file mode 100644 index 0000000..4e26fe0 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_36.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_37.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_37.mp3 new file mode 100644 index 0000000..c4ac5e4 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_37.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_38.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_38.mp3 new file mode 100644 index 0000000..1c0db1a Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_38.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_39.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_39.mp3 new file mode 100644 index 0000000..b769ab5 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_39.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_40.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_40.mp3 new file mode 100644 index 0000000..655fc4a Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_40.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_41.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_41.mp3 new file mode 100644 index 0000000..673e00c Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_41.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_42.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_42.mp3 new file mode 100644 index 0000000..f2a79a4 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_42.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_43.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_43.mp3 new file mode 100644 index 0000000..8c81802 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_43.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_44.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_44.mp3 new file mode 100644 index 0000000..55fb38f Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_44.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_45.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_45.mp3 new file mode 100644 index 0000000..3a23e78 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_45.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_46.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_46.mp3 new file mode 100644 index 0000000..324dc66 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_46.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_47.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_47.mp3 new file mode 100644 index 0000000..0422af4 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_47.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_48.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_48.mp3 new file mode 100644 index 0000000..c92b481 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_48.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_49.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_49.mp3 new file mode 100644 index 0000000..35590f6 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_49.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_50.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_50.mp3 new file mode 100644 index 0000000..21cf1f5 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_50.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_51.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_51.mp3 new file mode 100644 index 0000000..1a5a064 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_51.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_52.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_52.mp3 new file mode 100644 index 0000000..9ef260d Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_52.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_53.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_53.mp3 new file mode 100644 index 0000000..543592d Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_53.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_54.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_54.mp3 new file mode 100644 index 0000000..055cfad Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_54.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_55.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_55.mp3 new file mode 100644 index 0000000..574a572 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_55.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_56.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_56.mp3 new file mode 100644 index 0000000..6c3d479 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_56.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_57.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_57.mp3 new file mode 100644 index 0000000..e3ef594 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_57.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_58.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_58.mp3 new file mode 100644 index 0000000..83043d7 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_58.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 new file mode 100644 index 0000000..af06206 Binary files /dev/null and b/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 differ diff --git a/src/assets/images/luxun/reflection/scene2/底图.png b/src/assets/images/luxun/reflection/scene2/底图.png index b0774a4..28bc46b 100644 Binary files a/src/assets/images/luxun/reflection/scene2/底图.png and b/src/assets/images/luxun/reflection/scene2/底图.png differ diff --git a/src/assets/images/puzzle/chenyun/svg/碎片路径.svg b/src/assets/images/puzzle/chenyun/svg/碎片路径.svg new file mode 100644 index 0000000..2ee1020 --- /dev/null +++ b/src/assets/images/puzzle/chenyun/svg/碎片路径.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/puzzle/chenyun/svg/纯色.svg b/src/assets/images/puzzle/chenyun/svg/纯色.svg new file mode 100644 index 0000000..4ba20a3 --- /dev/null +++ b/src/assets/images/puzzle/chenyun/svg/纯色.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/puzzle/chenyun/svg/轮廓.svg b/src/assets/images/puzzle/chenyun/svg/轮廓.svg new file mode 100644 index 0000000..c300b5e --- /dev/null +++ b/src/assets/images/puzzle/chenyun/svg/轮廓.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/exhibit/ExhibitDescriptionNarration.tsx b/src/components/exhibit/ExhibitDescriptionNarration.tsx index b4624d8..de8a2fb 100644 --- a/src/components/exhibit/ExhibitDescriptionNarration.tsx +++ b/src/components/exhibit/ExhibitDescriptionNarration.tsx @@ -1,14 +1,19 @@ -import { useEffect, useRef, useState, useCallback } from "react"; +import { useEffect } from "react"; import { cn, getBackgroundImage } from "@/lib/utils"; import { AnimatePresence, motion } from "framer-motion"; +import { useAudioManager } from "@/hooks/useAudioManager"; export interface ExhibitDescriptionNarrationProps { /** 描述文本 */ text?: string; /** 是否可见 */ visible?: boolean; - /** 是否自动播放语音 */ + /** 是否自动播放音频(默认 true) */ autoPlay?: boolean; + /** 音频文件地址 */ + audioSrc?: string; + /** 音频分组 id,相同 channel 内互斥,不同 channel 可同时播放;不传则全局互斥 */ + audioChannelId?: string; /** 额外的自定义类 */ className?: string; } @@ -16,114 +21,41 @@ export interface ExhibitDescriptionNarrationProps { /** * 展品描述播报组件 * - 显示展品描述文本 - * - 支持文本转语音(TTS)播报 - * - 提供播放/暂停控制 + * - 支持音频文件播放(通过 useAudioManager) + * - 提供播放/停止控制 */ const ExhibitDescriptionNarration = ({ text, visible = true, - autoPlay = false, + autoPlay = true, + audioSrc, + audioChannelId, className, }: ExhibitDescriptionNarrationProps) => { - const [isPlaying, setIsPlaying] = useState(false); - const [isPaused, setIsPaused] = useState(false); - const utteranceRef = useRef(null); - const synthRef = useRef(null); + // 音频管理:默认全局互斥,如果传了 audioChannelId 则按 channel 互斥 + const { currentSrc, isPlaying, play, stop } = useAudioManager( + audioChannelId + ? { mode: "channel", channelId: audioChannelId } + : { mode: "global" } + ); - // 初始化语音合成 + // 当前组件对应的音频是否正在播放 + const isCurrentAudioPlaying = + audioSrc && currentSrc === audioSrc && isPlaying; + + // 自动播放音频 useEffect(() => { - if (typeof window !== "undefined" && "speechSynthesis" in window) { - synthRef.current = window.speechSynthesis; + if (visible && autoPlay && audioSrc) { + play(audioSrc); } - }, []); + }, [visible, autoPlay, audioSrc, play]); - // 播放语音 - const playSpeech = useCallback(() => { - if (!text || !synthRef.current) return; - - // 如果已有正在播放的语音,先停止 - if (utteranceRef.current) { - synthRef.current.cancel(); - } - - const utterance = new SpeechSynthesisUtterance(text); - utterance.lang = "zh-CN"; - utterance.rate = 0.9; // 语速稍慢 - utterance.pitch = 1; // 音调 - utterance.volume = 1; // 音量 - - utterance.onstart = () => { - setIsPlaying(true); - setIsPaused(false); - }; - - utterance.onend = () => { - setIsPlaying(false); - setIsPaused(false); - utteranceRef.current = null; - }; - - utterance.onerror = () => { - setIsPlaying(false); - setIsPaused(false); - utteranceRef.current = null; - }; - - utteranceRef.current = utterance; - synthRef.current.speak(utterance); - }, [text]); - - // 暂停语音 - const pauseSpeech = useCallback(() => { - if (synthRef.current && isPlaying) { - synthRef.current.pause(); - setIsPaused(true); - } - }, [isPlaying]); - - // 继续播放语音 - const resumeSpeech = useCallback(() => { - if (synthRef.current && isPaused) { - synthRef.current.resume(); - setIsPaused(false); - } - }, [isPaused]); - - // 停止语音 - const stopSpeech = useCallback(() => { - if (synthRef.current) { - synthRef.current.cancel(); - setIsPlaying(false); - setIsPaused(false); - utteranceRef.current = null; - } - }, []); - - // 自动播放 + // 组件不可见时停止音频(仅当当前播放的是该组件的 audioSrc) useEffect(() => { - if (visible && autoPlay && text && synthRef.current) { - // 延迟一下确保组件已渲染 - const timer = setTimeout(() => { - playSpeech(); - }, 300); - return () => { - clearTimeout(timer); - stopSpeech(); - }; + if (!visible && audioSrc && currentSrc === audioSrc) { + stop(); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [visible, autoPlay, text]); - - // 组件卸载或不可见时停止语音 - useEffect(() => { - if (!visible) { - stopSpeech(); - } - return () => { - stopSpeech(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [visible]); + }, [visible, audioSrc, currentSrc, stop]); if (!text) return null; @@ -166,12 +98,12 @@ const ExhibitDescriptionNarration = ({ {text} - {/* 控制按钮 */} - {synthRef.current && ( + {/* 控制按钮 - 仅在提供了 audioSrc 时显示 */} + {audioSrc && (
- {!isPlaying && !isPaused && ( + {!isCurrentAudioPlaying && ( )} - {isPlaying && !isPaused && ( + {isCurrentAudioPlaying && ( - )} - {isPaused && ( - - )} - {(isPlaying || isPaused) && ( -
diff --git a/src/pages/luxun/reflection/scene1.tsx b/src/pages/luxun/reflection/scene1.tsx index 881d71d..11619e2 100644 --- a/src/pages/luxun/reflection/scene1.tsx +++ b/src/pages/luxun/reflection/scene1.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Image, StudyGuideModal } from "@/components"; import SuccessAlert from "@/components/layout/alert/success-alert"; -import { getBackgroundImage, getStaticImage } from "@/lib/utils"; +import { getBackgroundImage, getPublicPath, getStaticImage } from "@/lib/utils"; const starName = "luxun"; @@ -340,6 +340,7 @@ const LuxunReflectionScene1 = () => { onContinue={() => { setShowGuideModal(false); }} + audioSrc={getPublicPath("audio/luxun/mp3_luxun_31.mp3")} > {`同学你好,欢迎来到“跨越时空·体悟”学习模块! 请登陆“时空回溯・亲历时代”体验仓,下一站:1892年,绍兴三味书屋。 diff --git a/src/pages/luxun/reflection/scene2.tsx b/src/pages/luxun/reflection/scene2.tsx index 74530f5..cf74f2e 100644 --- a/src/pages/luxun/reflection/scene2.tsx +++ b/src/pages/luxun/reflection/scene2.tsx @@ -4,7 +4,7 @@ import { Image, DragFill, GuideSteps, GuideStepsItem } from "@/components"; import type { DragFillResult } from "@/components"; import ErrorAlert from "@/components/layout/alert/error-alert"; import SuccessAlert from "@/components/layout/alert/success-alert"; -import { getBackgroundImage, getStaticImage } from "@/lib/utils"; +import { getBackgroundImage, getPublicPath, getStaticImage } from "@/lib/utils"; const starName = "luxun"; @@ -373,7 +373,7 @@ const LuxunReflectionScene2 = () => { {placedItem.name} ) : (
@@ -492,7 +492,7 @@ const LuxunReflectionScene2 = () => { {item.name} ); @@ -585,7 +585,10 @@ const LuxunReflectionScene2 = () => { highlightSelectors={[]} zIndex={10000} > - + 这些线索藏在先生的文字里,长按卡片拖到对应地标旁,还原创作故事! @@ -598,7 +601,10 @@ const LuxunReflectionScene2 = () => { highlightSelectors={[]} zIndex={10000} > - + 你读懂了鲁迅文字与土地的联结,再深入看看文字里的初心! diff --git a/src/pages/luxun/reflection/scene3.tsx b/src/pages/luxun/reflection/scene3.tsx index 434438c..1b57d9a 100644 --- a/src/pages/luxun/reflection/scene3.tsx +++ b/src/pages/luxun/reflection/scene3.tsx @@ -1,7 +1,13 @@ -import { getBackgroundImage, getStaticImage } from "@/lib/utils"; +import { getBackgroundImage, getPublicPath, getStaticImage } from "@/lib/utils"; import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; -import { Image, GuideSteps, GuideStepsItem, EndingOverlay } from "@/components"; +import { + Image, + GuideSteps, + GuideStepsItem, + StudyGuideModal, + EndingOverlay, +} from "@/components"; import { SingleChoiceQuizPanel } from "@/components/layout/quiz"; import SuccessAlert from "@/components/layout/alert/success-alert"; @@ -33,15 +39,14 @@ const LuxunReflectionScene3 = () => { const [completedQuiz3, setCompletedQuiz3] = useState(false); // 题目3是否完成 const [showSummary, setShowSummary] = useState(false); // 是否显示总结 const [completionGuideVisible, setCompletionGuideVisible] = useState(false); // 通关提示对话是否显示 - const [_completionGuideFinished, setCompletionGuideFinished] = - useState(false); // 通关提示对话是否已完成 + + const [showGuideModal, setShowGuideModal] = useState(true); // 成功提示相关状态 const [showSuccessAlert, setShowSuccessAlert] = useState(false); const [successMessage, setSuccessMessage] = useState(""); - // 结束语覆盖层是否显示 - const [showEndingOverlay, setShowEndingOverlay] = useState(false); // 结束语覆盖层是否已关闭 const [endingOverlayFinished, setEndingOverlayFinished] = useState(false); + const [showEndingOverlay, setShowEndingOverlay] = useState(false); const allCompleted = completedQuiz1 && completedQuiz2 && completedQuiz3; const progress = @@ -55,7 +60,7 @@ const LuxunReflectionScene3 = () => { if (showSummary) { const timer = setTimeout(() => { setCompletionGuideVisible(true); - }, 800); + }, 500); return () => clearTimeout(timer); } }, [showSummary]); @@ -287,7 +292,7 @@ const LuxunReflectionScene3 = () => {
{/* 提示图标 - 鲁迅1左侧 */} - {hintPosition === "luxun1" && ( + {hintPosition === "luxun1" && !showGuanzhu && (
{ onVisibleChange={(visible) => { if (!visible) { setCompletionGuideVisible(false); - setCompletionGuideFinished(true); // 对话关闭后标记为已完成 - // 显示结束语覆盖层 setShowEndingOverlay(true); } }} @@ -447,12 +450,14 @@ const LuxunReflectionScene3 = () => { highlightSelectors={[]} zIndex={10000} > - + 恭喜你读懂了鲁迅的文字与初心,愿这份精神能伴你前行! - {/* 结束语覆盖层 */} { setShowEndingOverlay(false); setEndingOverlayFinished(true); }} + audioSrc={getPublicPath("audio/luxun/mp3_luxun_34.mp3")} /> + + { + setShowGuideModal(false); + }} + verticalAlign="center" + audioSrc={getPublicPath("audio/luxun/mp3_luxun_33.mp3")} + > + 先生的每一步足迹、每一篇文字,都藏着不变的精神底色——拼出这份精神脉络,读懂先生的初心! +
); }; diff --git a/src/pages/sunzhongshan/internalization.tsx b/src/pages/sunzhongshan/internalization.tsx index a1bd172..9aaf59b 100644 --- a/src/pages/sunzhongshan/internalization.tsx +++ b/src/pages/sunzhongshan/internalization.tsx @@ -369,6 +369,7 @@ const ChenyunInternalization = () => { { setShowNarration(false); }} @@ -386,10 +387,16 @@ const ChenyunInternalization = () => { }} showMask={false} > - + 小沪,参观完故居,我对孙中山先生从"医人"到"医国"的转变、《实业计划》里的宏大构想有了很多感触,但总觉得这些历史和精神离我们的生活还有些远,不知道该怎么真正理解和传承。 - + 你的感受特别真实!孙中山先生的精神不是停留在书本里的文字,而是能指导我们当下行动的思想财富。今天我们特别邀请到了上海孙中山故居纪念馆研究部主任孙旻老师,让她带我们一起解读先生精神的时代意义,把这份传承落到实处。 @@ -407,7 +414,10 @@ const ChenyunInternalization = () => { showMask={false} zIndex={60} > - + 再看香山路7号这座小楼,相信你有很多心里话想对孙中山先生说。现在,就请你把这份感悟浓缩成几句话,既呼应先生的精神,也给自己未来许下一个承诺吧! @@ -425,7 +435,8 @@ const ChenyunInternalization = () => { { if (audioRef.current) { diff --git a/src/pages/sunzhongshan/place/place1.tsx b/src/pages/sunzhongshan/place/place1.tsx index 23ab799..754a95c 100644 --- a/src/pages/sunzhongshan/place/place1.tsx +++ b/src/pages/sunzhongshan/place/place1.tsx @@ -255,6 +255,7 @@ const SunzhongshanPlace1 = () => { setShowGuideModal(false); setVisible(true); }} + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_01.mp3")} > {`同学你好,欢迎来到“走进故居·对话”学习模块! 此刻你正置身于孙中山故居堂屋,接下来请随时光的脚步,一同走进他人生中四段激情燃烧的岁月:立志救国·推翻帝制、讨袁护法·捍卫共和、与时俱进·探索新路、抱病北上·鞠躬尽瘁。做好准备了吗?开始探索这段波澜壮阔的历史征程吧!`} @@ -273,10 +274,16 @@ const SunzhongshanPlace1 = () => { showMask={false} highlightSelectors={[]} > - + 小沪,老师说过,孙中山先生早年学习的是医学。从治病救人到革命救国,他为什么会做出这种转变呢? - + 来看看这张孙中山先生青年时期的相片吧。 @@ -286,6 +293,7 @@ const SunzhongshanPlace1 = () => { visible={showAfterDialogGuide} onContinue={() => setShowAfterDialogGuide(false)} ailgn="left" + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_02.mp3")} > 1.场景中出现动态光点的展品表示未浏览,可通过点击光点来了解展品背后的故事,通过滚轮可以放大展品,浏览展品后蓝色动态光点会变为已浏览状态。 {"\n"} @@ -313,8 +321,16 @@ const SunzhongshanPlace1 = () => { highlightSelectors={[]} zIndex={10000} > - "革命四杰"? - + + "革命四杰"? + + 是呀,这是孙中山先生在香港西医书院就读之时与同学的留影。孙先生1887年入学,其间广泛阅读西方自然科学和社会政治学说书籍。常与同学陈少白、尤列、杨鹤龄一起畅谈革命,抨击时政,被戏称为"四大寇"。 @@ -330,10 +346,16 @@ const SunzhongshanPlace1 = () => { showMask={false} zIndex={10000} > - + 原来孙先生早在青年时期就把国家前途命运放在了心上。 - + 不仅是关心,他还付诸了实际行动。看看这件展品。 @@ -357,12 +379,30 @@ const SunzhongshanPlace1 = () => { highlightSelectors={[]} zIndex={10000} > - + 这是郑观应写给盛宣怀的信。 - + 是的。1894年,孙中山先生回乡起草了"上李鸿章书",希望劝谏清政府改良救国。他多方寻找上书门径,这就是作为同乡和前辈的郑观应帮忙写给盛宣怀,希望他向李鸿章推荐孙先生的书信。 + + 那么,这次上书最后成功了吗? + + + 1894年春天,朝鲜农民起义爆发。孙中山先生的上书于这一年的6月投递,可惜当时甲午战争已经箭在弦上,李鸿章忙于备战,并未予以接见。这件事使得孙先生放弃了依靠清政府改良救国的幻想,转而投身革命,以求彻底推翻封建君主专制制度。 + {/* 光标4的对话 */} @@ -377,10 +417,16 @@ const SunzhongshanPlace1 = () => { highlightSelectors={[]} zIndex={10000} > - + 哇!这张《申报》好震撼,"中华民国万岁""孙大总统万岁",就连发行日期写的都是"中华民国元年元月二日"! - + 没错!资产阶级民主革命的尝试走过了风雨兼程的十余年,这一过程中孙中山先生一直在探寻救国道路,1905年孙先生在亲自撰写的《民报》发刊词中明确提出了三民主义,即民族、民权、民生这一资产阶级民主革命的政纲。 @@ -489,16 +535,25 @@ const SunzhongshanPlace1 = () => { showMask={false} zIndex={10000} > - + 这些尝试终于在武昌起义过后迎来了回响。1911年年末,湖南、广东等14个省和上海纷纷宣布脱离清政府独立。 1912年1月1日上午,上海有一万多人聚集在沪宁车站,欢送孙先生前去南京就任临时大总统。当天夜里11点,孙先生在原清朝两江总督府宣誓就职,新的共和政体就此诞生。彼时仍属农历辛亥年,因此历史上将这一系列事件称为"辛亥革命"。 - + 孙中山先生领导的辛亥革命推动了中国社会的变革,可是这张《民立报》让我有点不明白,孙先生刚当上临时大总统,为什么又很快宣布"解职"了呀? - + 中华民国的建立有个重要背景——"南北议和"。辛亥革命中宣告独立的省份大多集中在中国南方,负隅顽抗的清政府将最后希望寄托在主导北洋军阀势力的袁世凯身上。在列强支持下,袁世凯率军南下。 @@ -518,14 +573,28 @@ const SunzhongshanPlace1 = () => { highlightSelectors={[]} zIndex={10000} > - 这算不算一种"妥协"呀? - + + 这算不算一种"妥协"呀? + + 可以说,这是当时客观条件限制下的一种无奈妥协。因为革命党人的首要目标是推翻帝制,在武装力量不足以对抗北洋军阀的情况下,只能暂时信任袁世凯,希望他能维护共和。你看旁边的"南北议和"纪念章和纪念墨盒,就是当时这段历史的见证。 - + 可后来袁世凯不是复辟当皇帝了吗?那孙中山先生是不是特别后悔呀? - + 的确,所以辛亥革命未能改变旧中国半殖民地半封建的社会性质和中国人民的悲惨境遇,也未能完成实现民族独立、人民解放的历史任务。孙中山先生十分痛心,但也更坚定了捍卫共和的决心。这也为他后来发起二次革命、护法运动埋下了伏笔。 diff --git a/src/pages/sunzhongshan/place/place2.tsx b/src/pages/sunzhongshan/place/place2.tsx index 496cc6a..c0c0c20 100644 --- a/src/pages/sunzhongshan/place/place2.tsx +++ b/src/pages/sunzhongshan/place/place2.tsx @@ -193,10 +193,16 @@ const SunzhongshanPlace2 = () => { highlightSelectors={[]} zIndex={10000} > - + 这张大大的路线图好复杂,上面画满了铁路线,这是孙中山先生规划的吗? - + 对!这是中国铁路总公司的路线图。孙中山先生辞去临时大总统后,致力于国家的实业建设。他认为"交通为实业之母,铁路又为交通之母"。要让国家强大,首先要发展实业,投身铁路规划与建设就是其中一项重要实践。 @@ -237,10 +243,16 @@ const SunzhongshanPlace2 = () => { highlightSelectors={[]} zIndex={10000} > - + 真是一个宏伟的计划,可是在内忧外患的时局下,实现起来一定很艰难吧? - + 是的,1913年3月"宋教仁案"将国民党和袁世凯方面的矛盾推向高峰。不愿坐视袁世凯窃取辛亥革命果实后独揽大权,革命党人发动了"二次革命"。可惜革命失败,孙中山先生被迫流亡海外。 diff --git a/src/pages/sunzhongshan/place/place3.tsx b/src/pages/sunzhongshan/place/place3.tsx index 2f2559f..e9b519e 100644 --- a/src/pages/sunzhongshan/place/place3.tsx +++ b/src/pages/sunzhongshan/place/place3.tsx @@ -202,16 +202,28 @@ const SunzhongshanPlace3 = () => { highlightSelectors={[]} zIndex={10000} > - + 这张是李大钊先生的手迹啊,和孙中山先生有什么关系呢? - + 这封信的收件人是胡适。信里提到,孙中山先生经历了陈炯明叛变事件回到上海后,态度变得很冷静,不再坚持之前的护法主张,反而提出"收军权于中央""结合民主的联合战线,与反动派决裂"等。 - + 孙先生与李大钊先生进行了深入的交谈。他在寻找新的合作力量吗? - + 这个力量就是新生的中国共产党。孙中山先生向共产党人释放了巨大的诚意。除了与李大钊的频繁接触,他还在上海会见了共产国际代表马林,明确表示愿意和苏俄合作;邀请鲍罗庭来中国担任国民党组织教练员; @@ -231,10 +243,16 @@ const SunzhongshanPlace3 = () => { highlightSelectors={[]} zIndex={10000} > - + 我记得国共第一次合作正式形成的标志就是国民党一大,这就是当时的大会宣言吗? - + 完全正确!1924年1月20日,中国国民党第一次全国代表大会在广东高师礼堂开幕,孙中山先生以国民党总理的身份担任大会主席,主持开幕式。此次大会共有165名代表出席,其中共产党员代表超过20人,包括李大钊、毛泽东等中共早期领导人。 @@ -336,10 +354,16 @@ const SunzhongshanPlace3 = () => { highlightSelectors={[]} zIndex={10000} > - + 这时候,工农群众的力量还没有正式登上历史舞台呢。 - + 旁边这本《星期评论》创刊于五四运动后。孙中山先生在五四运动中看到了群众的力量和工人、学生们的热情。更觉顺应时代潮流,传播新文化、介绍马克思主义、鼓励工人运动的重要性。 @@ -359,10 +383,16 @@ const SunzhongshanPlace3 = () => { highlightSelectors={[]} zIndex={10000} > - + 这本书看起来很特别,《社会主义的精义》是孙中山先生写的吗?他也关注社会主义学说呀? - + 不仅关注,而且还很早。1912年10月14日-16日,孙中山先生连续三日在上海三马路(今汉口路)中华大戏院发表关于社会主义学说的演讲,吸引了众多听众。这就是演说后经由他本人修订出版的小册子。 diff --git a/src/pages/sunzhongshan/place/place4.tsx b/src/pages/sunzhongshan/place/place4.tsx index 3322663..fd01e2f 100644 --- a/src/pages/sunzhongshan/place/place4.tsx +++ b/src/pages/sunzhongshan/place/place4.tsx @@ -178,6 +178,8 @@ const SunzhongshanPlace4 = () => { return next; }); }} + animationSpeed={200} + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_46.mp3")} /> {/* 关闭学习引导后显示的对话(图1) */} @@ -192,10 +194,16 @@ const SunzhongshanPlace4 = () => { highlightSelectors={[]} zIndex={10000} > - + 革命终于有了可靠的盟友,统一战线建立;北伐战争在有条不紊地筹备中,国家统一在望,孙中山先生一定十分欣慰吧? - + 是的。然而长期操劳国事使得孙中山先生身体抱恙。在生命最后的时间里,他仍在为国奔走,始终未曾停歇。看看这张拍摄于1924年11月17日的照片吧。 @@ -211,8 +219,16 @@ const SunzhongshanPlace4 = () => { showMask={false} zIndex={10000} > - 这是……外滩? - + + 这是……外滩? + + 没错。1924年10月,冯玉祥将军发动“北京政变”,推翻了曹锟政府,邀请孙中山先生北上共商国是,希望能实现国家和平统一。 diff --git a/src/pages/sunzhongshan/reflection/index.tsx b/src/pages/sunzhongshan/reflection/index.tsx index 252487f..513cbcf 100644 --- a/src/pages/sunzhongshan/reflection/index.tsx +++ b/src/pages/sunzhongshan/reflection/index.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Image, StudyGuideModal } from "@/components"; -import { getBackgroundImage, getStaticImage } from "@/lib/utils"; +import { getBackgroundImage, getPublicPath, getStaticImage } from "@/lib/utils"; const starName = "sunzhongshan"; const GUIDE_STORAGE_KEY = `${starName}-reflection-guide-shown`; @@ -192,7 +192,11 @@ const SunzhongshanReflection = () => {
{/* 学习引导弹窗 */} - + 同学你好,欢迎来到“跨越时空·体悟”学习模块!{"\n"} 请登陆“时空回溯・亲历时代”体验仓,下一站:二十世纪初,上海。{"\n"} 辛亥革命之后,民主共和的观念深入人心。面对中外反动势力,社会各界更广泛地行动起来,以各自的方式争取着民主自由和国家尊严。 diff --git a/src/pages/sunzhongshan/reflection/scene1.tsx b/src/pages/sunzhongshan/reflection/scene1.tsx index 099c371..6a4454d 100644 --- a/src/pages/sunzhongshan/reflection/scene1.tsx +++ b/src/pages/sunzhongshan/reflection/scene1.tsx @@ -105,7 +105,7 @@ const SunzhongshanReflectionScene1 = () => { const handleClueClick = (clueId: string, clueName: string) => { // 如果已收集,不重复收集 if (isClueCollected(clueId)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -125,7 +125,7 @@ const SunzhongshanReflectionScene1 = () => { duration: 1200, onComplete: () => { // 动画完成后的回调 - setSuccessAlertContent("获得该线索!快去线索簿查看详细信息吧!"); + setSuccessAlertContent("获得1条线索,已获得线索可在线索簿中查看!"); setShowSuccessAlert(true); }, }); @@ -139,7 +139,7 @@ const SunzhongshanReflectionScene1 = () => { // 如果线索1已收集,显示提示 if (isClueCollected(clue1Id)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -401,6 +401,11 @@ const SunzhongshanReflectionScene1 = () => { visible={showSuccessAlert} title="恭喜你!" content={successAlertContent} + audioSrc={ + successAlertContent === "获得1条线索,已获得线索可在线索簿中查看!" + ? getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_49.mp3") + : undefined + } onContinue={() => { setShowSuccessAlert(false); setSuccessAlertContent(""); @@ -438,6 +443,7 @@ const SunzhongshanReflectionScene1 = () => { visible={showGuide} onContinue={handleGuideClose} zIndex={10000} + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_48.mp3")} > 同学你好,欢迎来到二十世纪初的上海。
@@ -506,7 +512,9 @@ const SunzhongshanReflectionScene1 = () => {
); diff --git a/src/pages/sunzhongshan/reflection/scene2.tsx b/src/pages/sunzhongshan/reflection/scene2.tsx index 6518ef1..2ddb095 100644 --- a/src/pages/sunzhongshan/reflection/scene2.tsx +++ b/src/pages/sunzhongshan/reflection/scene2.tsx @@ -115,7 +115,7 @@ const SunzhongshanReflectionScene2 = () => { const handleClueClick = (clueId: string, clueName: string) => { // 如果已收集,不重复收集 if (isClueCollected(clueId)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -135,7 +135,7 @@ const SunzhongshanReflectionScene2 = () => { duration: 1200, onComplete: () => { // 动画完成后的回调 - setSuccessAlertContent("获得该线索!快去线索簿查看详细信息吧!"); + setSuccessAlertContent("获得1条线索,已获得线索可在线索簿中查看!"); setShowSuccessAlert(true); }, }); @@ -149,7 +149,7 @@ const SunzhongshanReflectionScene2 = () => { // 如果线索1已收集,显示提示 if (isClueCollected(clue1Id)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -169,7 +169,7 @@ const SunzhongshanReflectionScene2 = () => { duration: 1200, onComplete: () => { // 动画完成后显示成功提示 - setSuccessAlertContent("获得该线索!快去线索簿查看详细信息吧!"); + setSuccessAlertContent("获得1条线索,已获得线索可在线索簿中查看!"); setShowSuccessAlert(true); }, }); @@ -426,6 +426,11 @@ const SunzhongshanReflectionScene2 = () => { visible={showSuccessAlert} title="恭喜你!" content={successAlertContent} + audioSrc={ + successAlertContent === "获得1条线索,已获得线索可在线索簿中查看!" + ? getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_49.mp3") + : undefined + } onContinue={() => { setShowSuccessAlert(false); setSuccessAlertContent(""); @@ -463,6 +468,7 @@ const SunzhongshanReflectionScene2 = () => { visible={showGuide} onContinue={handleGuideClose} zIndex={10000} + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_51.mp3")} > 1921年7月,中国共产党第一次全国代表大会在上海召开,中国革命的面貌自此焕然一新。
@@ -533,6 +539,7 @@ const SunzhongshanReflectionScene2 = () => { text={`恭喜你完成场景二的探索!\n1922年夏到1924年初,李大钊来到上海,在宣传革命思想的同时与孙中山进行了数次会面,为改组国民党和促成第一次国共合作作出了巨大贡献。\n1924年1月,中国国民党第一次全国代表大会在广州召开,孙中山重新解释了三民主义,事实上确立了联俄、联共、扶助农工三大政策。李大钊、毛泽东等10名共产党员当选为中国国民党第一届中央执行委员会委员或候补委员。国民党一大的召开标志着第一次国共合作的正式形成。\n请你走进场景三,继续探索吧!`} animationSpeed={200} onContinue={handleCompleteGuideClose} + audioSrc={getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_52.mp3")} />
); diff --git a/src/pages/sunzhongshan/reflection/scene3.tsx b/src/pages/sunzhongshan/reflection/scene3.tsx index 3e4b9cd..7285dc8 100644 --- a/src/pages/sunzhongshan/reflection/scene3.tsx +++ b/src/pages/sunzhongshan/reflection/scene3.tsx @@ -112,7 +112,7 @@ const SunzhongshanReflectionScene3 = () => { const handleClueClick = (clueId: string, clueName: string) => { // 如果已收集,不重复收集 if (isClueCollected(clueId)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -132,7 +132,7 @@ const SunzhongshanReflectionScene3 = () => { duration: 1200, onComplete: () => { // 动画完成后的回调 - setSuccessAlertContent("获得该线索!快去线索簿查看详细信息吧!"); + setSuccessAlertContent("获得1条线索,已获得线索可在线索簿中查看!"); setShowSuccessAlert(true); // 如果是在"窃窃私语"场景收集了线索1,显示 Cursor @@ -162,7 +162,7 @@ const SunzhongshanReflectionScene3 = () => { // 如果线索4已收集,显示提示 if (isClueCollected(clue4Id)) { - setSuccessAlertContent("该线索已收集"); + setSuccessAlertContent("该线索已收集!"); setShowSuccessAlert(true); return; } @@ -182,7 +182,7 @@ const SunzhongshanReflectionScene3 = () => { duration: 1200, onComplete: () => { // 动画完成后显示成功提示 - setSuccessAlertContent("获得该线索!快去线索簿查看详细信息吧!"); + setSuccessAlertContent("获得1条线索,已获得线索可在线索簿中查看!"); setShowSuccessAlert(true); }, }); @@ -472,6 +472,11 @@ const SunzhongshanReflectionScene3 = () => { visible={showSuccessAlert} title="恭喜你!" content={successAlertContent} + audioSrc={ + successAlertContent === "获得1条线索,已获得线索可在线索簿中查看!" + ? getPublicPath("audio/sunzhongshan/mp3_sunzhongshan_49.mp3") + : undefined + } onContinue={() => { setShowSuccessAlert(false); setSuccessAlertContent(""); @@ -517,6 +522,7 @@ const SunzhongshanReflectionScene3 = () => { 后来,学校建立了中国社会主义青年团团支部,你积极靠拢,成为一名光荣的团员。 @@ -586,6 +592,7 @@ const SunzhongshanReflectionScene3 = () => {