一个基于间隔重复算法(SRS)的日语五十音记忆应用,使用 Expo React Native 开发,支持 Android 和 Web 平台。
- ✨ 智能记忆算法:采用 SM-2 间隔重复算法(类似 Anki),科学高效
- 📚 完整假名库:包含 104 个假名(清音、浊音、半浊音、拗音)
- 🎨 精美界面:现代化设计,流畅卡片切换动画
- 🔊 高质量发音:使用 Google Cloud TTS 生成的 104 个日语发音文件
- 📊 学习统计:详细的学习数据和进度追踪
- ⚙️ 灵活设置:可自定义学习模式、每日卡片数量等
- 💾 数据备份:Web 端直接下载/上传 JSON 文件,Android 端通过分享/剪贴板
- 🌓 主题切换:支持浅色/深色/跟随系统三种模式
- 🎯 智能导航栏:滚动页面时自动隐藏,避免遮挡内容
- ⌨️ 快捷键支持:Web 端支持 Alt+1/2/3/4 快速切换页面
- 🔔 学习提醒:可设置每日学习通知
- 🌐 多平台支持:Android APK + Web + Docker
- Android APK:在 Releases 页面下载最新版本
docker run -d --name gojuon -p 8080:80 ghcr.io/lila233/gojuon:latestcurl -O https://raw.githubusercontent.com/lila233/gojuon/master/docker-compose.yml
docker-compose up -d访问 http://localhost:8080 即可使用。
- 框架:React Native 0.81 + Expo SDK 54
- 语言:TypeScript
- 导航:React Navigation (stack + bottom-tabs)
- 状态管理:React Context API
- 存储:AsyncStorage 本地存储
- 音频:expo-av (104个预生成 MP3 文件)
- 构建:EAS Build (Android) / GitHub Actions (Web + Docker)
- Node.js 18+
- npm
- Android 手机 + Expo Go 应用(开发用)
# 克隆项目
git clone https://github.com/lila233/gojuon.git
cd gojuon
# 安装依赖
npm install
# 启动开发服务器
npm run start
# 或指定端口
npx expo start --port 8081adb reverse tcp:8081 tcp:8081在手机 Expo Go 中输入 exp://127.0.0.1:8081 连接。
# 构建 Android APK
eas build --platform android --profile preview
# 构建 Web 版本
npx expo export --platform webExpo 导出的 index.html 默认使用根路径(例如 /_expo/...),而 GitHub Pages 部署在 /<repo> 子路径下。
为了避免本地预览 404,使用下面的脚本会自动重写 index.html 的资源路径到 /<repo>:
# 生成 GH Pages 预览目录并修正资源路径
npm run preview:gh-pages
# 启动本地静态服务器(任选其一)
py -m http.server 4175 --directory gh-pages-preview --bind 127.0.0.1
# 或 npx serve gh-pages-preview打开 http://127.0.0.1:4175/gojuon/ 查看效果。
gojuon/
├── App.tsx # 应用入口,导航配置
├── assets/audio/ # 104 个日语发音 MP3 文件
├── src/
│ ├── components/ # 可复用组件
│ ├── contexts/ # React Context (StudyContext, ThemeContext)
│ ├── data/ # 假名数据 + 音频映射
│ ├── screens/ # 页面组件
│ │ ├── HomeScreen # 首页 - 学习进度和开始按钮
│ │ ├── StudyScreen # 学习 - 卡片翻转和评分
│ │ ├── BrowseScreen # 浏览 - 五十音图表
│ │ ├── StatsScreen # 统计 - 学习数据
│ │ └── SettingsScreen # 设置 - 主题/备份/通知
│ ├── storage/ # AsyncStorage 封装
│ ├── theme/ # 主题颜色定义
│ ├── types/ # TypeScript 类型
│ └── utils/ # 工具函数
│ ├── srs.ts # SM-2 间隔重复算法
│ ├── audio.ts # 音频播放服务
│ ├── backup.ts # 数据备份服务
│ └── notifications.ts # 通知服务
├── .github/workflows/ # CI/CD 自动化
│ ├── deploy.yml # Web 部署到 GitHub Pages
│ ├── docker.yml # Docker 镜像构建
│ └── build-apk.yml # APK 自动构建
├── Dockerfile # Docker 构建配置
├── docker-compose.yml # Docker Compose 配置
└── eas.json # EAS Build 配置
- 5 级评分:忘记(1) → 困难(2) → 一般(3) → 容易(4) → 完美(5)
- 动态间隔:根据评分自动调整下次复习时间
- 评分 1-2:重置进度,次日复习
- 评分 3:缩短间隔 (×0.8),更快复习
- 评分 4:标准间隔递增
- 评分 5:奖励更长间隔 (×1.3)
- 难度因子:每张卡片有独立的难度权重(EF 最低 1.3)
- 间隔递进:1天 → 6天 → round(interval × EF)
| 状态 | 条件 | 说明 |
|---|---|---|
| 新卡片 | 从未学习 | 等待首次学习 |
| 学习中 | repetitions < 2 | 刚开始学习或答错重置 |
| 复习中 | repetitions ≥ 2 | 有一定熟练度 |
| 已掌握 | repetitions ≥ 4 且 interval ≥ 14天 | 连续正确4次以上,间隔达到2周 |
- 使用 Google Cloud TTS (Wavenet 日语女声) 预生成 104 个高质量发音文件
- Web 端自动加载 MP3 文件,原生端使用预打包资源
- 播放速度 0.85x,发音更清晰
MIT License