后端习题批量添加的接口
@RequestMapping(value = "/question_file_add", method = RequestMethod.POST)
@ResponseBody
public Result question_file_add(HttpServletRequest request, Model model, @RequestParam("file") MultipartFile file){
if( file==null ){
log.info("接受的excel为NULL");
return Result.error(CodeMsg.FILE_RESOLVE_ERROR);
}
Workbook workbook = null;
StringBuilder msg = new StringBuilder();
Map<String, List<QuestionEntity>> data = new HashMap<String, List<QuestionEntity>>();
List<QuestionEntity> success_add = new ArrayList<QuestionEntity>();
List<QuestionEntity> failed_add = new ArrayList<QuestionEntity>();
List<QuestionEntity> already_exists_add = new ArrayList<QuestionEntity>();
try {
InputStream inputStream = file.getInputStream();
Integer length = file.getOriginalFilename().split("\\.").length;
String suffix = file.getOriginalFilename().split("\\.")[length - 1];
if ("xls".equals(suffix)) {
workbook = new HSSFWorkbook(inputStream);// 后缀为.xls则用HSSFWorkbook
} else if ("xlsx".equals(suffix)) {
workbook = new XSSFWorkbook(inputStream);// 后缀为.xlsx则用XSSFWorkbook
}
if( workbook==null ){
return Result.success("空表NULL");
}
//默认取第一张表
Sheet sheet = workbook.getSheetAt(0);
//默认第一行为标题
Row titleRow = sheet.getRow(0);
//循环取每行的数据
for( int rowIndex=1;rowIndex<sheet.getPhysicalNumberOfRows();rowIndex++ ){
QuestionObject questionObject = new QuestionObject();
Row row = sheet.getRow(rowIndex);
if( row==null ){
continue;
}
QuestionEntity questionEntity = new QuestionEntity();
List<QuestionItemObject> questionItemObjects = new ArrayList<QuestionItemObject>();
for( int cellIndex=0;cellIndex<row.getPhysicalNumberOfCells();cellIndex++ ){
String title = titleRow.getCell(cellIndex).getStringCellValue();
if(title.equals("")){
continue;
}
Cell cell = row.getCell(cellIndex);
switch (title){
case "标签":
String labelStr = cell.getStringCellValue();
Integer label = 0;
switch (labelStr){
//******************
//这里要根据label表中算法id 进行修改
case "k-means":
label = 1;
break;
case "kNN":
label = 2;
break;
case "决策树":
label = 3;
break;
case "支持向量机":
label = 4;
break;
case "逻辑回归":
label = 5;
break;
case "朴素贝叶斯":
label = 6;
break;
}
questionEntity.setLabelId(label);
break;
case "题目":
questionObject.setTitleContent(cell.getStringCellValue());
break;
case "题型":
String questionTypeStr = cell.getStringCellValue();
Integer questionType = null;
switch (questionTypeStr){
case "单选题":
questionType = 1;
break;
case "多选题":
questionType = 2;
break;
case "判断题":
questionType = 3;
break;
}
questionEntity.setQuestionType(questionType);
break;
case "难度": //难度是Double型
questionEntity.setDifficult(cell.getNumericCellValue());
break;
case "正确答案":
questionObject.setCorrect(cell.getStringCellValue());
break;
case "题解":
questionObject.setAnalyze(cell.getStringCellValue());
break;
case "选项1":
questionItemObjects.add(new QuestionItemObject("A", cell.getStringCellValue()));
break;
case "选项2":
questionItemObjects.add(new QuestionItemObject("B", cell.getStringCellValue()));
break;
case "选项3":
questionItemObjects.add(new QuestionItemObject("C", cell.getStringCellValue()));
break;
case "选项4":
questionItemObjects.add(new QuestionItemObject("D", cell.getStringCellValue()));
break;
}
}
//
if( questionEntity.getQuestionType()==3 ){//判断题的选项只有2个
List<QuestionItemObject> items = new ArrayList<QuestionItemObject>();
for (QuestionItemObject questionItemObject : questionItemObjects) {
if (questionItemObject.getPrefix().equals("A")) {
items.add(questionItemObject);
} else if (questionItemObject.getPrefix().equals("B")) {
items.add(questionItemObject);
}
}
questionObject.setQuestionItemObjects(items);
}else{
questionObject.setQuestionItemObjects(questionItemObjects);
}
questionEntity.setQuestionObject(questionObject);
//设置questionEntity的创建者
User operator = (User)(request.getSession().getAttribute("user"));
if( operator==null){
//操作用户为空,无法记录日志
return Result.error(CodeMsg.USER_SESSION_EXPIRED);
}
questionEntity.setCreateUserId(operator.getId());
questionEntity.setCorrectTimes("0");
//保存到数据库
if( questionEntityService.save(questionEntity)==null ){
//保存该学生数据失败
msg.append(questionEntity.getQuestionObject().getTitleContent());
failed_add.add(questionEntity);
}else{
log.info("成功创建"+questionEntity.getId());
success_add.add(questionEntity);
}
}
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("success", success_add);
model.addAttribute("failed", failed_add);
model.addAttribute("already_exist", already_exists_add);
return Result.success(model);
}
前端习题批量添加页面
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>首页 - AIAL</title>
<#include "../common/header.ftl" />
<!--标签插件-->
<link rel="stylesheet" href="../admin/js/jquery-tags-input/jquery.tagsinput.min.css">
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<!--左侧导航-->
<aside class="lyear-layout-sidebar">
<!-- logo -->
<div id="logo" class="sidebar-header">
<a href="../admin/index.html"><img src="../admin/images/logo-sidebar.png" title="LightYear" alt="LightYear" /></a>
</div>
<div class="lyear-layout-sidebar-scroll">
<#include "../common/left-menu.ftl" />
</div>
</aside>
<!--End 左侧导航-->
<#include "../common/header-menu.ftl" />
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="card">
<div class="card-header"><h3>题目添加</h3></div>
<div class="card-body">
<ul class="nav nav-tabs nav-justified">
<li class="active">
<a data-toggle="tab" href="#home-basic">批量添加</a>
</li>
<li class="nav-item">
<a data-toggle="tab" href="#profile-basic">单个添加</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="home-basic">
<form class="form-horizontal" method="post" onsubmit="return false;">
<#-- 文件上传格式-->
<div class="form-group col-xs-7">
<label class="col-xs-12" for="example-file-input">exls文件上传规则</label>
<div class="col-xs-12">
<p>1. 请保证...</p>
<p>2. 请按照...</p>
</div>
</div>
<#-- 上传按钮-->
<div class="form-group col-xs-5">
<label class="col-xs-12" for="file-input">点击上传</label>
<div class="col-xs-12">
<input type="file" id="file-input" name="file-input" accept=".xls,.xlsx">
</div>
</div>
<#-- 提交按钮-->
<div class="form-group">
<div class="col-xs-12">
<button class="btn btn-primary col-xs-offset-5" id="submit-file-btn" >提交</button>
</div>
</div>
</form>
</div>
<!--单个题目的添加 -->
<div class="tab-pane fade" id="profile-basic">
单个题目的添加区域
</div>
</div>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<#include "../common/footer.ftl" />
<script type="text/javascript" src="../admin/js/perfect-scrollbar.min.js"></script>
<!--tag标签插件-->
<script src="../admin/js/jquery-tags-input/jquery.tagsinput.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
//文件上传添加学生
$("#submit-file-btn").click(function () {
var fd = new FormData();
var file = document.getElementById("file-input").files[0];
if (file === undefined) {
showWarningMsg("文件数据为空, 请正确上传文件!");
return;
}
//上传的参数名 参数值 k-v键值对
fd.append("file", file);
$.ajax({
url:"${request.contextPath}/platform/question_file_add",
type:"post",
data:fd,
async : true, //此处为异步加载
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
beforeSend: function () {
$("#submit").attr({ disabled: "disabled" });// 禁用按钮防止重复提交
// showWarningMsg("文件处理中,请稍候……");
},
success:function(data){
if (data.code === 0) {
console.log("打印传过来的数据");
console.log(data.data);
showSuccessMsg(data.msg, function () {
});
var failed = data.data.failed;
if( failed.length>0 ){
createTable(failed, "导入失败的习题");
}
var already_exist = data.data.already_exist;
if( already_exist.length>0 ){
createTable(already_exist, "已经存在而无法导入的习题");
}
var success = data.data.success;
if( success.length>0 ){
createTable(success, "成功导入的习题");
}
}
else{
showErrorMsg(data.msg);
}
},
complete: function () {
$("#submit").removeAttr("disabled");
},
error:function(data){
alert("网络错误");
},
});
});
});
function createTable(data, msg) {
var table = $("<table class=\"table table-bordered\"></table>");
var thead = $("<thead></thead>");
var tr = $("<tr></tr>");
var th0 = $("<th>"+msg+"</th>");
var th1 = $("<th>题目</th>");
var th2 = $("<th>难度</th>");
var th3 = $("<th>题型</th>");
var th4 = $("<th>题解</th>");
var th5 = $("<th>正确答案</th>");
var th6 = $("<th>选项1</th>");
var th7 = $("<th>选项2</th>");
var th8 = $("<th>选项3</th>");
var th9 = $("<th>选项4</th>");
tr.append(th0).append(th1).append(th2).append(th3).append(th4).append(th5).append(th6).append(th7).append(th8).append(th9);
thead.append(tr);
table.append(thead);
for(var i=0;i<data.length;i++){
var td0 = $("<td>"+(i+1)+"</td>");
var td1 = $("<td>"+data[i].questionObject.titleContent+"</td>");
var td2 = $("<td>"+data[i].difficult+"</td>");
var td3 = null;
var td6 = "";
var td7 = "";
var td8 = "";
var td9 = "";
var td4 = $("<td>"+data[i].questionObject.analyze+"</td>");
var td5 = $("<td>"+data[i].questionObject.correct+"</td>");
switch (data[i].questionType) {
case "1":
case 1:
td3 = $("<td>单选题</td>");
td6 = $("<td>"+data[i].questionObject.questionItemObjects[0].content+"</td>");
td7 = $("<td>"+data[i].questionObject.questionItemObjects[1].content+"</td>");
td8 = $("<td>"+data[i].questionObject.questionItemObjects[2].content+"</td>");
td9 = $("<td>"+data[i].questionObject.questionItemObjects[3].content+"</td>");
break;
case "2":
case 2:
td3 = $("<td>多选题</td>");
td6 = $("<td>"+data[i].questionObject.questionItemObjects[0].content+"</td>");
td7 = $("<td>"+data[i].questionObject.questionItemObjects[1].content+"</td>");
td8 = $("<td>"+data[i].questionObject.questionItemObjects[2].content+"</td>");
td9 = $("<td>"+data[i].questionObject.questionItemObjects[3].content+"</td>");
break;
case "3":
case 3:
td3 = $("<td>判断题</td>");
td6 = $("<td>"+data[i].questionObject.questionItemObjects[0].content+"</td>");
td7 = $("<td>"+data[i].questionObject.questionItemObjects[1].content+"</td>");
break;
}
var tr = $("<tr></tr>");
tr.append(td0).append(td1).append(td2).append(td3).append(td4).append(td5).append(td6).append(td7).append(td8).append(td9);
table.append(tr);
}
$("#home-basic").append(table);
console.log(msg+"显示完毕");
}
</script>
</body>
</html>
前端题目列表页面
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>首页 - AIAL</title>
<#include "../common/header.ftl" />
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<!--左侧导航-->
<aside class="lyear-layout-sidebar">
<!-- logo -->
<div id="logo" class="sidebar-header">
<a href="../admin/index.html"><img src="../admin/images/logo-sidebar.png" title="LightYear" alt="LightYear" /></a>
</div>
<div class="lyear-layout-sidebar-scroll">
<#include "../common/left-menu.ftl" />
</div>
</aside>
<!--End 左侧导航-->
<#include "../common/header-menu.ftl" />
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="row">s
<div class="col-lg-12">
<div class="card">
<div class="card-toolbar clearfix">
<form class="pull-right search-bar" method="get" action="#!" role="form">
<div class="input-group">
<div class="input-group-btn">
<input type="hidden" name="search_field" id="search-field" value="title">
<button class="btn btn-default dropdown-toggle" id="search-btn" data-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
标题 <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li> <a tabindex="-1" href="javascript:void(0)" data-field="title">标题</a> </li>
<li> <a tabindex="-1" href="javascript:void(0)" data-field="cat_name">栏目</a> </li>
</ul>
</div>
<input type="text" class="form-control" value="" name="keyword" placeholder="请输入名称">
</div>
</form>
<div class="toolbar-btn-action">
<a class="btn btn-primary m-r-5" href="${request.contextPath}/menu/exercise_add"><i class="mdi mdi-plus"></i> 新增</a>
<a class="btn btn-danger" id="exercise_delete" href="#!"><i class="mdi mdi-window-close"></i> 删除</a>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>
<label class="lyear-checkbox checkbox-primary">
<input type="checkbox" id="check-all"><span></span>
</label>
</th>
<th>习题id</th>
<#-- <th>题目</th>-->
<th>标签</th>
<th>难度</th>
<th>类型</th>
<th>正确答案</th>
<#-- <th>题解</th>-->
<#-- <th>正确率</th>-->
<th>操作</th>
</tr>
</thead>
<tbody>
<#if Questions??>
<#list Questions as question>
<tr>
<td>
<label class="lyear-checkbox checkbox-primary">
<input type="checkbox" name="ids" value="${question.getId()}"><span></span>
</label>
</td>
<td>${question.getId()!""}</td>
<#-- <td>${question.getId()!""}</td>-->
<td>${question.getLabel()!""}</td>
<td>${question.getDifficulty()!""}</td>
<td>${question.getQuestionType()!""}</td>
<td>${question.getCorrect()!""}</td>
<td>
<div class="btn-group">
<a class="btn btn-xs btn-default" href="#!" title="编辑" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>
</div>
</td>
</tr>
</#list>
</#if>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<#include "../common/footer.ftl" />
<script type="text/javascript" src="../admin/js/perfect-scrollbar.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// goPage(1, 5);//进入该页面时,显示第1页,每页有6条数据
$("#exercise_delete").click( function () {
console.log("点击删除习题");
del("${request.contextPath}/menu/exercise_del");
})
});
//删除学生的方法
function del(url){
if($("input[type='checkbox']:checked").length == 0){
showWarningMsg('请选择一条数据进行删除!');
return;
}
var ids = []; //被选中要删除的习题id列表
$("input[type='checkbox']:checked").each(function(i, e){ ids.push(Number($(e).val())); });
console.log("习题id="+ids);
console.log("JSON字符串格式:"+JSON.stringify(ids));
$.confirm({
title: '确定删除?',
content: '删除后数据不可恢复,请慎重!',
buttons: {
confirm: {
text: '确认',
action: function(){
deleteReq(ids,url);
// showWarningMsg("还未发送Ajax");
}
},
cancel: {
text: '关闭',
action: function(){
}
}
}
});
}
//调用删除方法
function deleteReq(id,url){
$.ajax({
url:url,
type:'POST',
data: JSON.stringify(id),
dataType:'json',
contentType:"application/json;charset=UTF-8",
success:function(data){
if( data.code == 0 ){
showSuccessMsg('习题删除成功!',function(){
$("input[type='checkbox']:checked").parents("tr").remove();
});
}else{
showErrorMsg(data.msg);
}
},
error:function(data){
alert('网络错误!');
}
});
}
</script>
</body>
</html>
习题列表后端接口:
/**
* 题目删除请求的处理
* @param id
* @return
*/
@RequestMapping( value = "/exercise_del", method = RequestMethod.POST)
@ResponseBody
public Result exercise_del(@RequestBody List<Long> id){
log.info("进入删除习题的接口");
log.info(id.toString());
return Result.success("成功删除"+id.toString());
}
/**
* 题目管理页面
* @return
*/
@RequestMapping(value = "/exercise_page")
public String exercise_list(Model model){
model.addAttribute("siteName", siteConfig.getSiteName());
model.addAttribute("siteUrl", siteConfig.getSiteUrl());
model.addAttribute("Questions", questionService.findAll());
log.info(questionService.findAll().toString());
return "/admin/menu/exercise_list";
// return "/admin/test/test_question_content";
}