相關信息
源碼鏈接:
https://github.com/LeftStan/vocabtest
技術標簽:
html, css, js, jquery, thymleaf, springboot
效果演示
主界面
小學詞匯,初中詞匯,高中詞匯測試界面
考研詞匯,四級詞匯,六級詞匯,托福詞匯,GRE詞匯測試界面
測試結果
前端搭建
使用html,css,js實現單頁應用
html結構
js部分代碼
獲取單詞
function getWords(bookType){ console.log(bookType); $.post("/vocab",{ bookType: bookType.toString() }, function(data,status){ // console.log(data); init(bookType, data); }); }
選擇詞庫后的頁面初始化
根據選擇詞庫不同,初始化不同元素
function init(bookType, data) { //處理后端返回數據,生成單詞列表 const obj=data; len = obj.length; let words_id = []; words_num(bookType); for(let i = 0; i < obj.length; i++){ words_id[i] = obj[i].id.toString(); words[i] = obj[i].word.toString(); let str = obj[i].trans.toString(); str = str.split(';'); answer[i] = str[0]; if(str.length > 1)answer[i] += ';'+ str[1]; } //切換頁內元素 $("#index").toggle(); //選擇小學,初中,高中詞庫 //獲取小學,初中,高中題目(選擇題的錯誤選項,即其它單詞的中文意思 if(bookType === "pri" || bookType === "middle" || bookType === "high") { $.post("/question",{ check: words_id.toString() ,bookType: bookType }, function(data,status){ const obj = data; for(i = 0; i < obj.length; i++){ let str = obj[i].trans.toString(); str = str.split(';'); answers[i] = str[0]; if(str.length > 1)answers[i] += ';'+ str[1]; } // console.log(answers) $("#question").toggle(); next(); }); } //選擇考研,四六級等其它詞庫 else{ index = len; for(let i = 0; i < words.length; i++){ // console.log(words[i]); let $newElement=$('<label><input type="checkbox"><span>'+words[i]+'</span></label>'); $("#words-content").append($newElement); } $("#test").toggle(); } }
執行選擇題部分的下個單詞的展示
以及最終結果展示
function next(){ $("#choose_img").remove(); //判斷題目是否出完 if(index < len){ let num = randomNum(1, 4); $("#word-content").text(words[index]); $("#count").text(index+1+ "/" +len); for(let i = 1; i < 5; i++){ let trans = $("#trans"+num); if(i === 1){ trans.text(answer[index++]); correct = num; // trans.text(answer[index++]); // correct = 1; } else{ trans.text(answers[index0++]); // trans.text(answers[index0++]); } num = (num+1)%5; if(num === 0)num = 1; // console.log(num); } } //跳轉結果頁面 else{ console.log(res); cal_res(); if($("#test").is(":hidden")){ $("#question").toggle(); }else{ countCheck(); $("#test").toggle(); } $("#res").toggle(); } }
詞匯量計算算法
function cal_res(){ //console.log("correct:" + res); //console.log("len:" + len); //console.log("all:" + all); //計算正確率 let ratio = res/len; //根據准確率給予適當加分 if(ratio === 1)ratio += 0.2; else if(ratio > 0.9)ratio += 0.08; else if(ratio > 0.8)ratio += 0.05; else if(ratio > 0.6)ratio += 0.03; else if(ratio > 0.4)ratio += 0.02; res = Math.round(ratio * all); //保底分數為100 if(res < 100)res = 100; $("#res_num").text(res); }
后端搭建
建立各個詞庫的詞庫表
表格設計如下
使用springboot框架搭建
配置數據庫連接,注意MySql版本若為8以上則需要添加時區參數
application.properities文件
# 數據庫驅動: spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 數據源名稱 spring.datasource.name=defaultDataSource # 數據庫連接地址 spring.datasource.url=jdbc:mysql://localhost:3306/vocab?serverTimezone=UTC # 數據庫用戶名&密碼: spring.datasource.username=root spring.datasource.password=123456
編寫pojo
這里使用lombok注解,簡化了代碼
pojo中的Word.java文件
package com.left.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Word { // id, 單詞,翻譯,詞性 private String id, word, trans, pov; }
編寫控制器:
獲取單詞接口
不同的詞庫獲取的數量不同
@PostMapping("/vocab") @ResponseBody public List<Map<String, Object>> book(HttpServletResponse response, @RequestParam("bookType") String book, Model model){ String num = "30"; //根據選擇詞庫決定測試單詞量 switch(book) { case "pri": num="20"; break; case "middle": num="40"; break; case "high": num="80"; break; case "cet4": num="100"; break; case "cet6": num="130"; break; case "kaoyan": num="140"; break; case "toefl": num="150"; break; case "gre": num="260"; break; } //從數據庫獲取數據 String sql = "select * from " + book + " order by rand() limit " + num; List<Map<String, Object>> list_maps = jdbcTemplate.queryForList(sql); //返回數據給前端 return list_maps; }
生成題目接口
對於小學,初中,高中詞庫需要生成對應的選擇題
@PostMapping("/question") @ResponseBody public List<Map<String, Object>> editSave(HttpServletResponse response, @RequestParam("check") String words, @RequestParam("bookType") String book, Model model){ String [] check_words = words.split(","); List<Map<String, Object>> list_maps, temp, ques_maps; list_maps = null; //根據勾選單詞出題 for(String i: check_words){ String sql = ""; sql = "select trans from " + book + " where id != " + i + " order by rand() limit 3"; temp = jdbcTemplate.queryForList(sql); if(list_maps == null) list_maps = temp; else{ list_maps.add(temp.get(0)); list_maps.add(temp.get(1)); list_maps.add(temp.get(2)); } } //返回數據給前端 return list_maps;