前言

英语单词背到吐,Excel 还在手动敲?我把 10 万条词库 + AI 发音 + 在线测试 塞进一个 SpringBoot 系统,老师现场打分:‘这才是真正的数字化学习!’ 今天源码全部公开,复制就能跑。

博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质量技术内容、深耕Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解。

💯文末获取源码+数据库💯
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人。

项目特色

  1. 零基础友好:关键代码全注释,IDEA 一键跑通
  2. 真实业务闭环:Excel 导入 → 在线测试 → 成绩看板
  3. 高并发:10 万单词 30 秒导入,秒级响应
角色 功能 描述
管理员 首页数据看板 实时统计
管理员 Excel 一键导入 拖拽上传
管理员 自动生成英式发音 点击喇叭→ 标准发音
学生 在线测试 听语音拼写单词→ 答对得分
学生 成绩看板 实时统计

系统截图

登录:
在这里插入图片描述
英语学习:
在这里插入图片描述

书籍管理:
在这里插入图片描述

词汇管理:
在这里插入图片描述

用户管理:

在这里插入图片描述

功能展示

Excel 一键导入

核心代码:

@PostMapping(value = "add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ApiOperation(value = "导入英语词汇书")
public HttpResponseResult addEnglishBook(@ApiParam(value = "英语词汇文件") @RequestParam(value = "file") MultipartFile file,
@ApiParam(value = "书籍编码") @RequestParam(defaultValue = "") String bookCode,
@ApiParam(value = "书籍名称") @RequestParam(defaultValue = "") String bookName,
@ApiParam(value = "描述") @RequestParam(defaultValue = "") String description) throws Exception {
if (file == null) {
return HttpDataResponseResult.isBadRequest("英语词汇文件不能为空!", null);
    }
if (StringUtils.isNotEmpty(bookCode) && englishBookService.isExistBookCode(bookCode)) {
return HttpDataResponseResult.isBadRequest("该书籍编号已存在!");
    }

    EnglishBookDto dto = EnglishBookDto.builder()
            .bookCode(bookCode)
            .bookName(bookName)
            .description(description).build();

try {
        InputStream in = file.getInputStream();
        Workbook workbook = WorkbookFactory.create(in);
// 保存EnglishBook
ServiceResult result = englishBookService.insertEnglishBook(dto, workbook.getSheetAt(0));

if (result.getStatus() == HttpStatus.OK.value()) {
            EnglishBook englishBook = (EnglishBook) result.getData();
// 备份词汇书文件到本地
ByteArrayOutputStream baOs = new ByteArrayOutputStream();
            workbook.write(baOs);
            ExportFileUtils.writeToFile(baOs.toByteArray(), englishBook.getFilePath());

return HttpDataResponseResult.isSuccess("英语词汇书籍【" + englishBook.getBookName() + "】上传成功!", englishBook);
        }

return HttpDataResponseResult.isNotModified(result.getMessage(), result.getData());

    } catch (IOException e) {
return HttpDataResponseResult.isBadRequest("无法将Excel文件解析为内置对象,仅支持xls、xlsx格式的文件。Error ------> " + e.getMessage(), null);
    } catch (POIXMLException e) {
return HttpDataResponseResult.isBadRequest("无法将Excel文件解析为内置对象,仅支持xls、xlsx格式的文件。Error ------> " + e.getMessage(), null);
    }
}

功能演示:

单词导入

在线测试

核心代码:

public ServiceResult insertExamScore(ExamScoreDto examScoreDto, SysUser user) {
    ExamScore examScore = ExamScore.builder()
            .userId(user.getUserId())
            .bookCode(examScoreDto.getBookCode())
            .totalQuestions(examScoreDto.getTotalQuestions())
            .answerTrue(examScoreDto.getAnswerTrue())
            .totalScore(100)
            .examTime(new Date()).build();

float f = (float) examScoreDto.getAnswerTrue() / examScoreDto.getTotalQuestions() * examScore.getTotalScore();
int score = Math.round(f);

    examScore.setScore(score);  // 考试得分
examScore.setPoint(examScoreDto.getAnswerTrue() == examScoreDto.getTotalQuestions() ? 10 : 0);  // 满分加 10 积分

int row = examScoreMapper.insert(examScore);
if (row == 1) {
        LambdaQueryWrapper<EnglishBook> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EnglishBook::getBookCode, examScore.getBookCode());
        EnglishBook book = bookMapper.selectOne(wrapper);
        examScore.setBookName(book == null ? "书籍已被移除!" : book.getBookName());
return ServiceResult.isSuccess("成绩单提交成功!", examScore);
    }
return ServiceResult.isInternalError("成绩单提交失败,未知错误!");
}

功能演示:

测试

词汇新增

核心代码:

public ServiceResult insertEnglishWord(EnglishWordDto englishWordDto) {
    EnglishWord word = EntityUtils.entityConvert(englishWordDto, new EnglishWord(), false);
    word.setBookCode(word.getBookCode());
    word.setStatus((short) 1);
    wrapCommonAttr(word);
// 保存信息到数据库
int row = englishWordMapper.insert(word);
if (row == 1) {
// 下载发音文件
downLoadWordsMp3(Arrays.asList(word));
return ServiceResult.isSuccess("英语词库更新成功!", word);
    }
return ServiceResult.isInternalError("英语词库创建失败,未知错误!");
}

功能演示:
在这里插入图片描述

领取方式

点击链接,文章最下方自动获取
完整源码
word.xlsx 模板 + 海量单词库
部署文档
转发本文到 3 个群,再送「答辩 PPT 模板」。

优秀案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果文章帮到你,点赞+关注,如需更多其他项目分享请留言。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐