题库前端与后端交互
1.获取题目信息
代码如下:
//从后端数据库获得所有问题信息,保存到list
private ArrayList<QuestionItem> getData() {
String res = HttpClient.findQuestionsBycid(c_id);
JSONArray jsonArray = JSONArray.parseArray(res);
ArrayList<QuestionItem> interList = new ArrayList<>();
for (int i=0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
BigInteger qid = jsonObject.getBigInteger("qid");
String stem = jsonObject.getString("stem");
float score = jsonObject.getFloat("score");
String res2 = HttpClient.findOptionsByoqid(String.valueOf(qid));
JSONArray jsonArray2 = JSONArray.parseArray(res2);
ArrayList<OptionItem> interList2 = new ArrayList<>();
for (int j=0; j < jsonArray2.size(); j++) {
JSONObject jsonObject2 = jsonArray2.getJSONObject(j);
String o_num = jsonObject2.getString("o_num");
String o_content = jsonObject2.getString("o_content");
Boolean o_answer = jsonObject2.getBoolean("o_answer");
int o_id = jsonObject2.getInteger("o_id");
interList2.add(new OptionItem(o_num,o_content,o_answer,o_id));
}
interList.add(new QuestionItem(stem,String.valueOf(qid),interList2,String.valueOf(score)));
}
return interList;
}
new Thread(() -> {
list = getData();
questionItemProvider = new QuestionItemProvider(getPageData(page), getFractionAbility());
getFractionAbility().getUITaskDispatcher().asyncDispatch(() -> {//获取UI 主线
listContainer.setItemProvider(questionItemProvider);
});
}).start();
public static String findQuestionsBycid(String c_id){
String url = "http://t40g792468.qicp.vip/question/findQuestionsBycid?c_id="+c_id;
return doGet(url);
}
public static String findOptionsByoqid(String o_q_id){
String url = "http://t40g792468.qicp.vip/question/findOptionsByoqid?o_q_id="+o_q_id;
return doGet(url);
}
2.删除题目
代码如下:
delete_btn.setClickedListener(lis->{
new Thread(() -> {
int len = (Math.min(list.size(),page*14) - (page-1)*14);
int count = 0;
for (int i = 0; i< len ; i++ ){
Checkbox cb = (Checkbox) listContainer.getComponentAt(i).findComponentById(ResourceTable.Id_item_name);
if (cb.isChecked()){
String q_id = list.get((page-1)*14 + (i-count)).getId();
HttpClient.removeOptions(q_id);
HttpClient.removeQuestion(q_id);
count++;
}
}
list=getData();
questionItemProvider = new QuestionItemProvider(getPageData(page), getFractionAbility());
getFractionAbility().getUITaskDispatcher().asyncDispatch(() -> {//获取UI 主线
listContainer.setItemProvider(questionItemProvider);
});
}).start();
public static String removeOptions(String o_q_id){
String url = "http://t40g792468.qicp.vip/question/removeOptions?o_q_id="+o_q_id;
return doGet(url);
}
public static String removeQuestion(String q_id){
String url = "http://t40g792468.qicp.vip/question/removeQuestion?q_id="+q_id;
return doGet(url);
}
3.添加/更新题目
代码如下:
add_btn.setClickedListener(lis->{
TextField stem_input = (TextField)
getFractionAbility().findComponentById(ResourceTable.Id_stem_input);
String stem = stem_input.getText();
if (stem.equals("")||stem.equals(null)){
showTips("题干未输入");
return;
}
Text score_input = (Text)
getFractionAbility().findComponentById(ResourceTable.Id_score_select_text);
String score = score_input.getText();
//保存已输入的选项内容到当前optionItemProvider的链表
int len = optionItemProvider.getList().size();
if (len==0){
showTips("请设置选项");
return;
}
for (int i = 0; i< len ; i++ ){
TextField tf = (TextField) OpListContainer.getComponentAt(i).findComponentById(ResourceTable.Id_choice_input);
if (tf.getText().equals("")||tf.getText().equals(null)){
showTips("选项"+(char)(i+65)+"未输入内容");
return;
}
optionItemProvider.getList().get(i).setStem(tf.getText());
}
boolean flag = true;
for (int i = 0; i< len ; i++ ){
if(optionItemProvider.getList().get(i).isAnswer())
flag=false;
}
if (flag){
showTips("未设置正确答案");
return;
}
if (editing_key == -1){
//添加新题目
new Thread(() -> {
HttpClient.insertQuestion(stem,score,c_id);
String q_id = HttpClient.getqid();
for (int i = 0; i< len ; i++ ){
boolean answer = optionItemProvider.getList().get(i).isAnswer();
String num = optionItemProvider.getList().get(i).getSign();
String content = optionItemProvider.getList().get(i).getStem();
HttpClient.insertOption(answer,num,content,q_id);
}
list = getData();
questionItemProvider = new QuestionItemProvider(getPageData(page), getFractionAbility());
getFractionAbility().getUITaskDispatcher().asyncDispatch(() -> {//获取UI 主线
listContainer.setItemProvider(questionItemProvider);
});
}).start();
}else{
//修改旧题目
new Thread(() -> {
String q_id = list.get(editing_key).getId();
HttpClient.updateQuestionsBycid(stem,score,q_id);
HttpClient.removeOptions(q_id);
for (int i = 0; i< len ; i++ ){
boolean answer = optionItemProvider.getList().get(i).isAnswer();
String num = optionItemProvider.getList().get(i).getSign();
String content = optionItemProvider.getList().get(i).getStem();
HttpClient.insertOption(answer,num,content,q_id);
}
list = getData();
questionItemProvider = new QuestionItemProvider(getPageData(page), getFractionAbility());
getFractionAbility().getUITaskDispatcher().asyncDispatch(() -> {//获取UI 主线
listContainer.setItemProvider(questionItemProvider);
});
}).start();
}
removeFocus();
close_add_question_frame();
});
public static String insertQuestion(String q_stem,String q_score,String c_id){
String url = "http://t40g792468.qicp.vip/question/insertQuestion?q_stem="+q_stem+"&q_score="+q_score+"&c_id="+c_id;
return doGet(url);
}
public static String insertOption(boolean o_answer,String o_num, String o_content,String o_q_id){
String url = "http://t40g792468.qicp.vip/question/insertOption?o_answer="+o_answer+"&o_num="+o_num+"&o_content="+o_content+"&o_q_id="+o_q_id;
return doGet(url);
}
public static String updateQuestionsBycid(String q_stem,String q_score,String q_id){
String url = "http://t40g792468.qicp.vip/question/updateQuestionsBycid?q_stem="+q_stem+"&q_score="+q_score+"&q_id="+q_id;
return doGet(url);
}
public static String insertOption(boolean o_answer,String o_num, String o_content,String o_q_id){
String url = "http://t40g792468.qicp.vip/question/insertOption?o_answer="+o_answer+"&o_num="+o_num+"&o_content="+o_content+"&o_q_id="+o_q_id;
return doGet(url);
}
4.后端实现
DAO层:
@Transactional
@Modifying
@Query(nativeQuery = true,value = "UPDATE t_question SET q_stem = ?1,q_score = ?2 WHERE q_id= ?3") //原生SQL方法
public void updateQuestionsBycid( String q_stem, float q_score,BigInteger q_id);
@Query(nativeQuery = true,value = "SELECT distinct t_question.q_id,t_question.q_stem,t_question.q_score from t_question WHERE t_question.c_id=?1") //原生SQL方法
public List<Object> findQuestionsBycid(int c_id);
@Transactional
@Modifying
@Query(nativeQuery = true,value = "INSERT INTO t_question (q_stem, q_score, c_id) VALUES (?1, ?2, ?3)") //原生SQL方法
public int insertQuestion(String q_stem,float q_score,int c_id);
@Query(nativeQuery = true,value = "SELECT distinct t_option.o_num,t_option.o_content,t_option.o_answer,t_option.o_id from t_option WHERE t_option.o_q_id = ?1") //原生SQL方法
public List<Object> findOptionsByoqid(int o_q_id);
@Query(nativeQuery = true,value = "SELECT MAX(q_id) FROM t_question") //原生SQL方法
public int getq_id();
@Transactional
@Modifying
@Query(nativeQuery = true,value = "DELETE FROM t_option WHERE o_id=?1") //原生SQL方法
public void removeOption(int o_id);
@Transactional
@Modifying
@Query(nativeQuery = true,value = "INSERT INTO t_option (o_answer,o_num,o_content,o_q_id) VALUES (?1, ?2, ?3,?4)") //原生SQL方法
public void insertOption(boolean o_answer,String o_num, String o_content,int o_q_id);
@Transactional
@Modifying
@Query(nativeQuery = true,value = "DELETE FROM t_option WHERE o_q_id=?1") //原生SQL方法
public void removeOptions(int o_p_id);
@Transactional
@Modifying
@Query(nativeQuery = true,value = "DELETE FROM t_question WHERE q_id=?1") //原生SQL方法
public void removeQuestion(int q_id);
Controller层:
@RequestMapping("/findAll")
@ResponseBody
public Object findAll(){
ResultData result = new ResultData();
result.setData(questionDao.findAll());
return result;
}
@RequestMapping("/findOne")
@ResponseBody
public Object findOne(Long id){
return questionDao.findById(id);
}
@RequestMapping("/findQuestionsBycid")
@ResponseBody
public Object findQuestionsBycid(int c_id){
List<QuestionData> datas = new ArrayList<>();
List<Object> result = questionDao.findQuestionsBycid(c_id);
for (Object o : result) {
Object[] rowArray = (Object[]) o;
QuestionData d = new QuestionData((BigInteger)rowArray[0],(String) rowArray[1],(float)rowArray[2]);
datas.add(d);
}
return datas;
}
@RequestMapping("/updateQuestionsBycid")
@ResponseBody
public Object updateQuestionsBycid(String q_stem,float q_score,BigInteger q_id){
questionDao.updateQuestionsBycid(q_stem, q_score,q_id);
return "1";
}
@RequestMapping("/insertQuestion")
@ResponseBody
public Object insertQuestion(String q_stem,float q_score,int c_id){
return questionDao.insertQuestion( q_stem,q_score,c_id );
}
@RequestMapping("/findOptionsByoqid")
@ResponseBody
public Object findOptionsByoqid(int o_q_id){
List<OptionData> datas = new ArrayList<>();
List<Object> result = questionDao.findOptionsByoqid( o_q_id );
for (Object o : result) {
Object[] rowArray = (Object[]) o;
OptionData d = new OptionData((String)rowArray[0],(String) rowArray[1],(boolean)rowArray[2],(int)rowArray[3]);
datas.add(d);
}
return datas;
}
@RequestMapping("/removeOption")
@ResponseBody
public Object removeOption(int o_id){
questionDao.removeOption( o_id );
return "1";
}
@RequestMapping("/insertOption")
@ResponseBody
public Object insertOption(boolean o_answer,String o_num, String o_content,int o_q_id){
questionDao.insertOption(o_answer,o_num,o_content,o_q_id);
return "1";
}
@RequestMapping("/getq_id")
@ResponseBody
public Object getq_id(){
return questionDao.getq_id();
}
@RequestMapping("/removeOptions")
@ResponseBody
public Object removeOptions(int o_q_id){
questionDao.removeOptions( o_q_id );
return "1";
}
@RequestMapping("/removeQuestion")
@ResponseBody
public Object removeQuestion(int q_id){
questionDao.removeQuestion( q_id );
return "1";
}