一个轻量、有趣、适合 Java 学习的单词卡 / 记忆训练平台,采用 Vue 3 + Spring Boot + Redis + MySQL 的前后端分离架构。
WordSprint 围绕“背单词”这个单一场景,提供单词卡管理、随机训练、错题回顾、学习打卡、积分排行和学习统计等能力。
这个项目的目标不是做成完整教育平台,而是做成一个流程完整、能真正跑通、同时适合练手的前后端分离项目。
- 用户注册、登录、JWT 鉴权
- 用户资料更新、学习计划设置(每日学习/复习目标、提醒开关)
- 单词卡新增、编辑、删除、分页查询
- 单词卡 CSV 导入(模板下载、导入结果反馈)
- 学习训练:看词忆义、看义拼词、选择题、错题重练
- 错题本自动收集与恢复掌握
- 每日学习打卡与连续学习天数统计
- 积分系统与排行榜
- 学习统计页:趋势、正确率、熟练度分布、打卡日历
- 公共词库浏览与一键导入
- 管理员公共词库 CSV 导入
- Redis 实际承担:排行榜、签到状态、防重复提交等职责
Vue 3ViteVue RouterPiniaAxiosElement PlusECharts(可选)
Java 17Spring Boot 3.xSpring Security + JWTMyBatis-PlusMySQL 8Redis 7Spring ValidationSpringDoc OpenAPI / Knife4j
Node.js 20+Maven 3.9+IDEADocker(可选)
WordSprint/
├─ frontend/ # Vue 项目
│ ├─ src/
│ │ ├─ api/
│ │ ├─ assets/
│ │ ├─ components/
│ │ ├─ composables/
│ │ ├─ layout/
│ │ ├─ router/
│ │ ├─ stores/
│ │ ├─ styles/
│ │ ├─ utils/
│ │ └─ views/
│ └─ package.json
├─ backend/ # Spring Boot 项目
│ ├─ src/main/java/com/example/wordsprint/
│ │ ├─ common/
│ │ ├─ config/
│ │ ├─ controller/
│ │ ├─ dto/
│ │ ├─ entity/
│ │ ├─ mapper/
│ │ ├─ redis/
│ │ ├─ security/
│ │ ├─ service/
│ │ ├─ service/impl/
│ │ └─ vo/
│ └─ pom.xml
├─ sql/ # 数据库初始化脚本
│ └─ init.sql
├─ README.md
├─ FRONTEND_PAGE_DESIGN.md
├─ WORD_CARD_DEV_PLAN.md
├─ DATABASE_DESIGN.md
├─ API_LIST.md
└─ ITERATION_TODO.md
第一版建议先完成下面 6 个完整流程:
- 用户注册登录
- 单词卡 CRUD
- 随机抽题训练
- 答题提交与结果判定
- 错题本
- 打卡与积分榜
只要这 6 个点跑通,这个项目就已经具备完整的学习价值。
当前状态:以上 MVP 已完成,并已进入增强与最终完善阶段。
本项目中的 Redis 不只是“接进来”,而是承担真实业务职责:
排行榜:使用ZSet保存积分榜和连续打卡榜签到状态:记录用户当天是否已打卡随机抽题池:缓存用户当前训练题池,减少重复 SQL 抽取热门统计缓存:缓存首页热门词卡、公开词库、统计摘要防重复提交:保护答题提交接口,避免短时间重复提交
当前仓库已经完成前后端基础骨架,下面是一份按本机开发环境整理过的启动说明。
推荐环境:
Java 17Maven 3.9+Node.js 20+MySQL 8+Redis 7+Homebrew
如果你还没装这些工具,推荐直接用 Homebrew:
brew install openjdk@17 maven mysql redis如果本机默认 Java 不是 17,先切到 Java 17:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH="$JAVA_HOME/bin:$PATH"验证环境:
java -version
mvn -version
node -v
npm -v使用 Homebrew 服务启动:
brew services start mysql
brew services start redis确认服务已起来:
lsof -nP -iTCP:3306 -sTCP:LISTEN
lsof -nP -iTCP:6379 -sTCP:LISTEN
redis-cli ping如果是第一次安装 MySQL,建议把 root 密码设成项目默认值 123456,这样和当前后端配置一致:
mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';"
mysql -u root -e "CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY '123456';"
mysql -u root -e "ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '123456';"
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;"执行初始化脚本:
mysql -h 127.0.0.1 -u root -p123456 < sql/init.sql如需查看表结构和设计说明,可参考 DATABASE_DESIGN.md。
cd backend
mvn spring-boot:run默认端口:8080
如果 8080 被占用,可以临时换端口:
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=18080"启动后可访问健康检查:
curl http://127.0.0.1:8080/api/healthcd frontend
npm install
npm run dev默认端口:5173
如果后端不是跑在 8080,例如你用了 18080,则前端启动前先覆盖接口地址:
cd frontend
VITE_API_BASE_URL=http://127.0.0.1:18080 npm run dev推荐按这个顺序验证:
- 先启动 MySQL 和 Redis
- 执行
sql/init.sql - 启动后端并访问
/api/health - 启动前端
- 打开登录页,测试注册 -> 登录 -> 进入仪表盘
- 再验证单词卡 CRUD
- 确认
backend/src/main/resources/application-dev.yml中jwt.secret是非空字符串
- 通常是 MySQL 没启动,或者数据库
wordsprint还没初始化 - 先检查
3306端口和sql/init.sql是否执行成功
- 换一个端口启动,例如
18080
- 检查
VITE_API_BASE_URL是否和后端实际端口一致
- 先执行
redis-cli ping - 返回
PONG才说明 Redis 已正常运行
brew services stop mysql
brew services stop redisspring.datasource.url=jdbc:mysql://127.0.0.1:3306/wordsprint?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
jwt.secret=replace-with-your-secret
jwt.expire-hours=24VITE_API_BASE_URL=http://127.0.0.1:8080- 登录页
- 注册页
- 首页 / 学习仪表盘
- 单词卡列表页
- 新增 / 编辑单词卡页
- 学习训练页
- 错题本页
- 排行榜页
- 学习统计页
- 个人中心页
- 公共词库页
WORD_CARD_DEV_PLAN.md:完整开发计划与开发规范FRONTEND_PAGE_DESIGN.md:前端页面结构、交互流程、数据需求设计DATABASE_DESIGN.md:数据库设计、建表 SQL、索引与 Redis Key 规划API_LIST.md:接口设计清单和请求响应样例ITERATION_TODO.md:分阶段开发任务拆解
当前建议:
- 先补示例数据(公共词库演示数据、学习统计演示数据)
- 再完善 README 与 API 文档(保证可交接、可展示)
- 再做 Redis 失效策略和交互细节完善
推荐使用下面的提交前缀:
feat: add study submit api
fix: correct streak calculation
refactor: simplify word query service
docs: add database design
style: adjust dashboard layout
当前仓库已完成 MVP 并落地多项增强能力,整体可用性与演示完整度较高。
- 用户与鉴权:注册、登录、当前用户、资料更新
- 学习计划:读取/更新每日学习与复习目标
- 单词卡:CRUD + CSV 导入 + 批量写入优化
- 学习训练:四种模式、答题提交、判题反馈、学习记录联动
- 错题本:列表、状态切换、移除/撤销、专项重练
- 打卡积分与排行榜:自动打卡、积分累计、积分榜/连续打卡榜(Redis ZSet)
- 学习统计:今日摘要、
WEEK/MONTH/ALL趋势、熟练度分布、打卡日历 - 公共词库:分页浏览、一键导入个人词库、管理员 CSV 批量导入
- 上传限制:前后端统一
20MB - 阶段 12 部分优化:异常提示统一、核心页面空态/加载态/错误态补齐
- 后端
mvn test通过 - 后端可启动并访问
/api/health - 注册 -> 登录 -> 获取当前用户流程可用
- 单词卡 CRUD 与 CSV 导入可用
- 学习训练 / 错题本 / 排行榜 / 学习统计链路可用
- 学习计划与个人中心对接可用
- 公共词库与管理员 CSV 导入可用
- 前端
npm run build通过
- 准备示例数据(提升“开箱即用”体验)
- 完善 README 和 API 文档口径
- 优化 Redis 缓存失效策略与交互完善
- 本地环境已配置完成:
mysql、redis、wordsprint数据库、sql/init.sql已跑过 - 当前后端默认端口为
8080(冲突时可切18080) - 若要测试管理员公共词库导入,请确保账号角色为
ADMIN - 当前主要完善点在:示例数据、文档完善、缓存策略优化