Parcourir la source

修改report到paper

insomniaLee il y a 5 ans
Parent
commit
1f395800d4

+ 54 - 0
src/main/java/com/mooctest/controller/AuditController.java

@@ -0,0 +1,54 @@
+package com.mooctest.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.mooctest.service.AuditTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+public class AuditController {
+
+    @Autowired
+    AuditTaskService auditTaskService;
+
+    @GetMapping("/addTask")
+    public String gettest (Model model){
+        return "addTask";
+    }
+
+    @GetMapping("/reloadTask")
+    public String reloadTask ( Model model ){
+        return "addTask";
+    }
+
+
+
+    @GetMapping("/auditTasks")
+    public String auditTask ( Model model){
+        JSONArray jsonArray = auditTaskService.getTaskData(); // 所有的数据。
+        model.addAttribute("tasks",jsonArray);
+        return "audit_task_list";
+    }
+
+    @GetMapping("/changeAuditTask")
+    public String changeTask ( Model model ,@RequestParam("id") String id ){
+        JSONObject data = auditTaskService.getSingleTask(id);
+        model.addAttribute("data",data);
+        return "changeAuditTask";
+    }
+
+
+    @GetMapping("/reloadJob")
+    @ResponseBody
+    public JSONObject reloadJob ( Model model, @RequestParam("id") String id ){
+        JSONObject res = auditTaskService.getSingleTask(id);
+        return res;
+    }
+
+}

+ 61 - 0
src/main/java/com/mooctest/controller/PaperController.java

@@ -0,0 +1,61 @@
+package com.mooctest.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.mooctest.service.AuditTaskService;
+import com.mooctest.service.PaperService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+public class PaperController {
+
+
+
+    @Autowired
+    PaperService paperService;
+
+    @GetMapping("/addPaper")
+    public String addPaper (Model model){
+        return "add_paper";
+    }
+
+//    @GetMapping("/reloadTask")
+//    public String reloadTask ( Model model ){
+//        return "addTask";
+//    }
+
+    @GetMapping("/papers")
+    public String auditTask ( Model model){
+        JSONArray jsonArray = paperService.getPaperData(); // 所有的数据。
+        model.addAttribute("tasks",jsonArray);
+        return "paper_list";
+    }
+
+    @GetMapping("/testSinglePaperJson")
+    @ResponseBody
+    public JSONObject hello ( @RequestParam("id") String id ){
+        String paperId = "5dc7be4bc9e77c000ecf0ee5";
+        JSONObject res = paperService.getSinglePaper(id);
+        return res;
+    }
+
+    @GetMapping("/changePaper")
+    public String changeTask ( Model model ,@RequestParam("id") String id ){
+        JSONObject data = paperService.getSinglePaper(id);
+        model.addAttribute("data",data);
+        return "changePaper";
+    }
+
+
+//    @GetMapping("/reloadJob")
+//    @ResponseBody
+//    public JSONObject reloadJob ( Model model, @RequestParam("id") String id ){
+//        JSONObject res = auditTaskService.getSingleTask(id);
+//        return res;
+//    }
+}

+ 50 - 0
src/main/java/com/mooctest/service/PaperService.java

@@ -0,0 +1,50 @@
+package com.mooctest.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class PaperService {
+
+
+    public JSONArray getPaperData(){
+        RestTemplate rt = new RestTemplate();
+        StringHttpMessageConverter stringHttpMessageConverter=new StringHttpMessageConverter(Charset.forName("UTF-8"));
+        List<HttpMessageConverter<?>> list=new ArrayList<HttpMessageConverter<?>>();
+        list.add(stringHttpMessageConverter);
+        rt.setMessageConverters(list);
+        String str = "http://47.99.140.117:9090/Bug/api/paper/getPapers";
+        JSONArray tasksJson = JSON.parseArray(rt.getForObject(str , String.class));
+        return tasksJson;
+    }
+
+    public JSONObject getSinglePaper ( String paperId){
+        RestTemplate template = new RestTemplate();
+        String url = "http://47.99.140.117:9090/Bug/api/paper/getPaperJson";
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
+        paramMap.add("paper_id", paperId);
+        template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
+        HttpHeaders headers = new HttpHeaders();
+        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
+        ResponseEntity<String> response2 = template.postForEntity(url, httpEntity, String.class);
+        JSONObject tasksJson = JSON.parseObject(response2.getBody());
+        JSONObject resJson = JSON.parseObject(tasksJson.getString("json"));
+        resJson.put("paperId", tasksJson.getString("paper_id"));
+        return  resJson;
+    }
+}

+ 10 - 8
src/main/java/com/mooctest/service/TaskService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.mooctest.dao.MasterReportDao;
 import com.mooctest.data.TaskDTO;
+import com.mooctest.model.BugData;
 import com.mooctest.model.Task;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +38,9 @@ public class TaskService {
     @Autowired
     BugReportService bugReportService;
 
+    @Autowired
+    BugDataService bugDataService;
+
     @Value("${task.info.addr}")
     String taskInfoAddr;
 
@@ -64,21 +68,19 @@ public class TaskService {
 
         return dtos.stream()
                 .map(taskDTO -> {
-                    long totalBugs = masterReportDao.countByExamIdAndCaseId(taskDTO.getExamId(), taskDTO.getCaseId());
+                    long totalBugs = bugDataService.getReportNum(taskDTO.getExamId(),taskDTO.getCaseId());
                     long undealBugs = 0;
                     if (totalBugs == 0) {
                         totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
                         undealBugs = totalBugs;
                     } else {
-                        undealBugs = masterReportDao.countByExamIdAndCaseIdAndStatus(taskDTO.getExamId(), taskDTO.getCaseId(), 0);
+                        undealBugs = bugDataService.getReportUnDealNum(taskDTO.getExamId(),taskDTO.getCaseId());
                     }
                     taskDTO.setNumOfTotalBug(totalBugs);
                     taskDTO.setNumOfUndeal(undealBugs);
-
                     return taskDTO;
                 }).sorted(Comparator.comparing(TaskDTO::getExamId).reversed())
                 .collect(Collectors.toList());
-
     }
 
     public List<TaskDTO> getAllTasks2() {
@@ -90,13 +92,13 @@ public class TaskService {
                 })
                 .map(taskDTO -> {
                     if (taskDTO.getName().equals("途牛旅游") && taskDTO.getVersion().equals("9.56.0")) {
-                        long totalBugs = masterReportDao.countByExamIdAndCaseId(taskDTO.getExamId(), taskDTO.getCaseId());
+                        long totalBugs = bugDataService.getReportNum(taskDTO.getExamId(),taskDTO.getCaseId());
                         long undealBugs = 0;
                         if (totalBugs == 0) {
                             totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
                             undealBugs = totalBugs;
                         } else {
-                            undealBugs = masterReportDao.countByExamIdAndCaseIdAndStatus(taskDTO.getExamId(), taskDTO.getCaseId(), 0);
+                            undealBugs = bugDataService.getReportUnDealNum(taskDTO.getExamId(),taskDTO.getCaseId());
                         }
                         taskDTO.setNumOfTotalBug(totalBugs);
                         taskDTO.setNumOfUndeal(undealBugs);
@@ -160,13 +162,13 @@ public class TaskService {
         List<TaskDTO> tasks = getAllTasks();
         TaskDTO taskDTO = tasks.stream().filter(task -> task.getExamId() == examId && task.getCaseId() == caseId).findFirst().orElse(taskDefault);
 
-        long totalBugs = masterReportDao.countByExamIdAndCaseId(taskDTO.getExamId(), taskDTO.getCaseId());
+        long totalBugs = bugDataService.getReportNum(examId, caseId);
         long undealBugs = 0;
         if (totalBugs == 0) {
             totalBugs = bugReportService.getAllBugs(taskDTO.getExamId(), taskDTO.getCaseId()).size();
             undealBugs = totalBugs;
         } else {
-            undealBugs = masterReportDao.countByExamIdAndCaseIdAndStatus(taskDTO.getExamId(), taskDTO.getCaseId(), 0);
+            undealBugs = bugDataService.getReportUnDealNum(examId, caseId);
         }
         taskDTO.setNumOfTotalBug(totalBugs);
         taskDTO.setNumOfUndeal(undealBugs);

+ 28 - 4
src/main/resources/static/js/addTask.js

@@ -636,6 +636,7 @@ generateJson = function( type ){
             report_list.push(str2number(tempExample.innerHTML));
         }
         temp.report_list = report_list
+        temp.origin_report_list = $('#fitlist'+ruleIndex).val();
         // bianli biao
         var myTable = document.getElementById("table"+ruleIndex) ; //
         var rowNum =  myTable.rows.length;
@@ -658,6 +659,8 @@ generateJson = function( type ){
                 itemTemp.type="Multiple"
                 // var optionS = new Object();
                 // optionS.option = singleCheckData
+                itemTemp.originTip = singleCheckTip;
+                itemTemp.originData = singleCheckTip;
                 options.push(singleCheckData)
             }else if(type=="check"){
                 var checkTip = myTable.rows[i].cells[1].children[0].value;
@@ -665,6 +668,8 @@ generateJson = function( type ){
                 itemTemp.description = checkTip;
                 // itemTemp.is_multiple = "1"
                 itemTemp.type="Multiple"
+                itemTemp.originTip = checkTip;
+                itemTemp.originData = checkData;
                 var optionC ;
                 var checkArr = checkData.split(';');
                 for( var  checkJ = 0;checkJ<checkArr.length;checkJ++){
@@ -679,6 +684,8 @@ generateJson = function( type ){
                 itemTemp.description = ratioTip;
                 // itemTemp.is_multiple = "0"
                 itemTemp.type="Single"
+                itemTemp.originTip = ratioTip;
+                itemTemp.originData = ratioData;
                 var optionR ;
                 for( var  ratioJ = 0;ratioJ<ratioArr.length;ratioJ++){
                     // optionR = new Object();
@@ -690,6 +697,7 @@ generateJson = function( type ){
                 itemTemp.description = textData;
                 // itemTemp.is_multiple = "0"
                 itemTemp.type="Description"
+                itemTemp.originData = textData;
                 // var optionT = new Object();
                 // optionT.option = ""
                 // options.push("")
@@ -699,6 +707,7 @@ generateJson = function( type ){
                 itemTemp.description = fileData;
                 // itemTemp.is_multiple = "0"
                 itemTemp.type="File"
+                itemTemp.originData=fileData;
                 // var optionF = new Object();
                 // optionF.option = ""
                 // options.push("")
@@ -713,9 +722,23 @@ generateJson = function( type ){
     data.item_group_list = item_group_list
     data.report_list = getReportInfo()
     data.group_list = getDeliverInfo()
-    console.log(JSON.stringify(data))
-
-    // 发送清秀
+    console.log(JSON.stringify(data));
+    // 提交
+
+    //check
+    // $.ajax({
+    //     url: 'http://10.0.0.29:8090/Bug/api/extra/uploadJob',
+    //     data: {
+    //         'jobJson': JSON.stringify(data)
+    //     },
+    //     type: 'POST',
+    //     success: function (result) {
+    //         var obj = eval('(' + result + ')');
+    //         console.log(obj)
+    //     }
+    // })
+    // return ;
+    // 发送请求
     $.ajax({
         url: 'http://47.99.140.117:9090/Bug/api/extra/uploadJob',
         data:{
@@ -724,6 +747,7 @@ generateJson = function( type ){
         type: 'POST',
         success: function (result) {
             // alert(result);
+            console.log(result);
             var obj = eval('(' + result + ')');
             console.log(obj)
             console.log(obj["id"])
@@ -731,7 +755,7 @@ generateJson = function( type ){
             if(obj['status'] == 'fail'){
                 $.notify({
                     // options
-                    message: '数据有问题,请检查'
+                    message: obj['message']
                 },{
                     // settings
                     delay: 100,

+ 834 - 0
src/main/resources/static/js/add_paper.js

@@ -0,0 +1,834 @@
+test=function (element,id) {
+    var data = $(event.target).val();
+    $('#namelist'+id).html(getSpanHtml(getData(data)))
+    // console.log(getData(data))
+}
+/*<![CDATA[*/
+getData = function (str) {
+    var arr=str.split(";");
+    var res = new Array();
+    var tempArr;
+    var tempStart
+    var tempEnd
+    for(var i =0;i<arr.length;i++){
+        if(arr[i].indexOf("~")>=0){
+            tempArr = arr[i].split("~");
+            var tempStart = new Number(tempArr[0]);
+            var tempEnd   = new Number(tempArr[1]);
+            for ( var ii =tempStart;ii<tempEnd;ii++){
+                res.push(ii+"");
+            }
+            res.push(tempEnd+"");
+        }else{
+            res.push(arr[i]);
+        }
+    }
+    return res;
+}
+
+getSpanHtml = function(data){
+    var res = '';
+    for(var i =0;i<data.length;i++){
+        res+='<span class="badge bg-green">'+data[i]+'</span>'
+    }
+    return res;
+}
+
+getRealData = function(str){
+    var arr = str.split("~");
+    var start = new Number(arr[0]);
+    var end   = new Number(arr[1]);
+    var res = new Array();
+    for ( var i =start;i<end;i++){
+        res.push(i+"");
+    }
+    res.push(end+"");
+    return res;
+}
+
+addNewOption = function () {
+    $('#maincontent').append('\n' +
+        '            <div class="box box-info rule"  id="rule' +ruleId+
+        '">\n' +
+        '                <div class="box-header with-border">\n' +
+        '                    <h3 class="box-title">定制审查选项</h3>\n' +
+        '                    <button type="submit" onclick="addCheck(' +ruleId+
+        ')" class="btn btn-success pull-right">新建多选框</button>\n' +
+        '                    <button type="submit" onclick="addRatio(' +ruleId+
+        ')" class="btn btn-success pull-right">新建单选框</button>\n' +
+        '                    <button type="submit" onclick="addSingleCheck(' +ruleId+
+        ')" class="btn btn-success pull-right">新建单复选框</button>\n' +
+        '                    <button type="submit" onclick="addText(' +ruleId+
+        ')" class="btn btn-success pull-right">新建文本框</button>\n' +
+        '                    <button type="submit" onclick="addUpload(' +ruleId+
+        ')" class="btn btn-success pull-right">新建文件上传</button>\n' +
+        '                </div>\n' +
+        '                <!-- /.box-header -->\n' +
+        '                <!-- form start -->\n' +
+        '                <div class="form-horizontal">\n' +
+        '                    <div class="box-body">\n' +
+        '                        <div class="form-group">\n' +
+        '                            <label  class="col-sm-2 control-label">适用报告列表</label>\n' +
+        '                            <div class="col-sm-10">\n' +
+        '                                <input  onchange="test(this,' + ruleId +  ')" class="form-control" id="fitlist' + ruleId+
+        '" placeholder="请输入编号并用;分割,可用~输入连续的试题名称"/>\n' +
+        '                            </div>\n' +
+        '                            <label  class="col-sm-2 control-label">已选报告列表</label>\n' +
+        '                            <div class="col-sm-10" id="namelist' +ruleId+
+        '" >\n' +
+        '                            </div>\n' +
+        '                        </div>\n' +
+        '\n' +
+        '                        <div class="form-group">\n' +
+        '                            <label  class="col-sm-2 control-label">审查项</label>\n' +
+        '                            <div class="col-sm-10 ">\n' +
+        '                                <table class="table" id="table' + ruleId+
+        '">\n' +
+        '<tr>\n' +
+        '                    <td>\n' +
+        '                        示例\n' +
+        '                    </td>\n' +
+        '                    <td>\n' +
+        '                        标签\n' +
+        '                    </td>\n' +
+        '                    <td>\n' +
+        '                        数据说明\n' +
+        '                    </td>\n' +
+        '                    <td>\n' +
+        '                        操作\n' +
+        '                    </td>\n' +
+        '                </tr>'+
+        '\n' +
+        '                                </table>\n' +
+        '                            </div>\n' +
+        '                        </div>\n' +
+        '                    </div>\n' +
+        '                    <div class="box-footer">\n' +
+        '                        <button type="button" onclick="deleteRule(' +ruleId+
+        ')" class="btn btn-default">删除</button>\n' +
+        '                        <button type="button" class="btn btn-default" onclick="showModal(' +ruleId+
+        ')">\n' +
+        '                            本地预览\n' +
+        '                        </button>\n' +
+        '                        <button type="button" onclick="addNewOption()" class="btn btn-info pull-right">继续添加</button>\n' +
+        '                    </div>\n' +
+        '                </div>\n' +
+        '            </div>');
+    ruleId++;
+}
+
+addRatio = function (id) { // 添加单选框
+    var table = $('#table'+id);
+    var index = getNewRatioIndex();
+    table.append('<tr type="ratio">\n' +
+        '                                        <td>\n' +
+        '                                            <div class="form-group">\n' +
+        '                                                <div class="radio">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="radio" name="optionsRadios' + index+
+        '"  value="option1" checked="checked"/>\n' +
+        '                                                        Option one\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '                                                <div class="radio">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="radio" name="optionsRadios' +index+
+        '"  value="option2"/>\n' +
+        '                                                        Option two\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '                                                <div class="radio">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="radio" name="optionsRadios' +index+
+        '"  value="option3" />\n' +
+        '                                                        Option three\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '                                            </div>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleRatioByLabel(this)" type="text" class="form-control" placeholder="选项说明"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleRatio(this)" type="text" class="form-control" placeholder="选项数据 请用;将选项分隔"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>\n' +
+        '                                            <button onclick="downTr(this,' +id+
+        ')" class="btn btn-default">下移</button>\n' +
+        '                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>\n' +
+        '                                        </td>\n' +
+        '                                    </tr>')
+
+}
+
+addText = function (id) { // 添加文字
+    var table = $('#table'+id);
+    table.append('<tr type="text">\n' +
+        '                                        <td>\n' +
+        '                                            <input type="text" class="form-control" placeholder="选项说明"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleText(this)" type="text" class="form-control" placeholder="选项数据"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>\n' +
+        '                                            <button onclick="downTr(this,' +id+
+        ')" class="btn btn-default">下移</button>\n' +
+        '                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>\n' +
+        '                                        </td>\n' +
+        '                                    </tr>')
+}
+
+addUpload = function(id){// add upload input
+    var table = $('#table'+id); //
+
+    table.append('<tr type="file">\n' +
+        '                                        <td>\n' +
+        '<div class="form-group">\n' +
+        '                  <label for="exampleFile' +id+
+        '">File input</label>\n' +
+        '                  <input type="file" id="exampleFile' +id+
+        '">\n' +
+        '                </div>'+
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleFile(this)" type="text"  class="form-control" placeholder="请输入说明文字"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>\n' +
+        '                                            <button onclick="downTr(this,' +id+
+        ')" class="btn btn-default">下移</button>\n' +
+        '                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>\n' +
+        '                                        </td>\n' +
+        '                                    </tr>')
+}
+
+addSingleCheck = function (id) { // 添加多选框
+    var table = $('#table'+id);
+    table.append('<tr type="singleCheck">\n' +
+        '                                        <td>\n' +
+        '                                            <div class="form-group">\n' +
+        '                                                <div class="checkbox">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="checkbox"/>\n' +
+        '                                                        Checkbox 1\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '                                            </div>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleSingleByLabel(this)" type="text" class="form-control" placeholder="选项说明"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleSingle(this)" type="text" class="form-control" placeholder="选项数据"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>\n' +
+        '                                            <button onclick="downTr(this,' +id+
+        ')" class="btn btn-default">下移</button>\n' +
+        '                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>\n' +
+        '                                        </td>\n' +
+        '                                    </tr>')
+}
+
+addCheck = function (id) {
+    var table = $('#table'+id);
+    table.append('<tr type="check">\n' +
+        '                                        <td>\n' +
+        '                                            <div class="form-group">\n' +
+        '                                                <div class="checkbox">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="checkbox"/>\n' +
+        '                                                        Checkbox 1\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '\n' +
+        '                                                <div class="checkbox">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="checkbox"/>\n' +
+        '                                                        Checkbox 2\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '\n' +
+        '                                                <div class="checkbox">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="checkbox" />\n' +
+        '                                                        Checkbox disabled\n' +
+        '                                                    </label>\n' +
+        '                                                </div>\n' +
+        '                                            </div>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleCheckByLabel(this)" type="text" class="form-control" placeholder="选项说明"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <input onchange="showExampleCheck(this)" type="text" class="form-control" placeholder="选项数据 请用;将选项分隔"/>\n' +
+        '                                        </td>\n' +
+        '                                        <td>\n' +
+        '                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>\n' +
+        '                                            <button onclick="downTr(this,' +id +
+        ')" class="btn btn-default">下移</button>\n' +
+        '                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>\n' +
+        '                                        </td>\n' +
+        '                                    </tr>')
+
+};
+
+deleteTr = function(element){
+    element.parentNode.parentNode.remove();
+}
+
+upTr = function(element){
+    var $tr = $(element).parents("tr");
+    if ($tr.index() != 1) {
+        $tr.prev().before($tr);
+    }
+}
+
+downTr  = function (element,id) {
+    var length = $('#table'+id +' tr').length;
+    var $tr = $(element).parents("tr");
+    if ($tr.index() != length - 1) {
+        $tr.next().after($tr);
+    }
+}
+
+deleteRule = function (id) {
+    $('#rule'+id).remove()
+}
+
+showModal = function (id) {
+    var body = $('#formBody');
+    var myTable = document.getElementById("table"+id);
+    body.html("");
+    var da1 = $('#fitlist'+id).val();
+    var selectedData = '<div class="form-group">\n' +
+        '                            <label class="col-sm-2 control-label">适用试题</label>\n' +
+        '                            <div class="col-sm-10">\n' +
+        getSpanHtml(getData(da1))+
+        '                            </div>\n' +
+        '                        </div>';
+    body.append(selectedData);
+    var rowNum =  myTable.rows.length;
+    var tempdata  =  [];
+    var td0;
+    var tr;
+    var type;
+    for(var i = 0;i<rowNum;i++){
+        tr = myTable.rows[i];
+        type=tr.getAttribute("type");
+        if(type=="singleCheck"){
+            var singleCheckTip = myTable.rows[i].cells[1].children[0].value;
+            var singleCheckData = myTable.rows[i].cells[2].children[0].value;
+            console.log(singleCheckData,singleCheckTip)
+            var singleCheckTemp = '<div class="form-group">\n' +
+                '                            <label class="col-sm-2 control-label">' +singleCheckTip+
+                '</label>\n' +
+                '                            <div class="col-sm-10">\n' ;
+
+            singleCheckTemp+='<div class="checkbox">\n' +
+                '                                                    <label>\n' +
+                '                                                        <input type="checkbox"/>\n' +singleCheckData+
+                '                                                    </label>\n' +
+                '                                                </div>';
+
+            singleCheckTemp+=
+                '                                            </div>\n' +
+                '                                        </div>';
+            body.append(singleCheckTemp);
+        }else if(type=="check"){
+            var checkTip = myTable.rows[i].cells[1].children[0].value;
+            var checkData = myTable.rows[i].cells[2].children[0].value;
+            var checkArr = checkData.split(';');
+            var checkTemp = '<div class="form-group">\n' +
+                '                            <label class="col-sm-2 control-label">' +checkTip+
+                '</label>\n' +
+                '                            <div class="col-sm-10">\n' ;
+            for( var  checkJ = 0;checkJ<checkArr.length;checkJ++){
+                checkTemp+='<div class="checkbox">\n' +
+                    '                                                    <label>\n' +
+                    '                                                        <input type="checkbox"/>\n' +checkArr[checkJ]+
+                    '                                                    </label>\n' +
+                    '                                                </div>';
+            }
+            checkTemp+=
+                '                                            </div>\n' +
+                '                                        </div>';
+            body.append(checkTemp);
+        }else if(type=="ratio"){
+            var ratioTip = myTable.rows[i].cells[1].children[0].value;
+            var ratioData = myTable.rows[i].cells[2].children[0].value;
+            var ratioArr = ratioData.split(';');
+            var ratioTemp = '<div class="form-group">\n' +
+                '                            <label class="col-sm-2 control-label">' +ratioTip+
+                '</label>\n' +
+                '                            <div class="col-sm-10">\n' ;
+
+            for( var  ratioJ = 0;ratioJ<ratioArr.length;ratioJ++){
+                ratioTemp+='<div class="radio">\n' +
+                    '                                                    <label>\n' +
+                    '                                                        <input type="radio" name="optionsRadios' + i+
+                    '"  value="' +ratioArr[ratioJ]+
+                    '"/>\n' +ratioArr[ratioJ]+
+                    '                                                    </label>\n' +
+                    '                                                </div>';
+            }
+            ratioTemp+=
+                '                                            </div>\n' +
+                '                                        </div>';
+            body.append(ratioTemp);
+        }else if(type=="text"){
+            var textData = myTable.rows[i].cells[1].children[0].value;
+            body.append('<div class="form-group">\n' +
+                '                            <label class="col-sm-2 control-label">' +textData+
+                '</label>\n' +
+                '                            <div class="col-sm-10">\n' +
+                '<input class="form-control"  placeholder="请输入"/>'+
+                '                            </div>\n' +
+                '                        </div>')
+        }else if( type == "file"){
+            // when the check item is file upload input
+            var fileData = myTable.rows[i].cells[1].children[0].value;
+            body.append('<div class="form-group">\n' +
+                '                            <label for="testApplication"  class="col-sm-2 control-label">'+fileData+
+                '</label>\n' +
+                '                            <div class="col-sm-10">\n' +
+                '                                <input  type="file" />\n' +
+                '                                <!--                               <p class="help-block">Example block-level help text here.</p>-->\n' +
+                '                            </div>\n' +
+                '                        </div>');
+        }
+    }
+    $('#modal-default').modal('show');
+}
+
+showModalAlert = function () {
+    var name = $('#name').val();
+}
+
+
+checkNum = function (event) {
+    var num = event.target.value;
+    console.log(num)
+    if(!isNaN(num)&&num.length!=0){
+        console.log(event.target.parentElement.parentElement)
+        event.target.parentElement.parentElement.setAttribute("class","form-group has-success")
+        if(event.target.nextSibling!=null){
+            event.target.nextSibling.remove();
+        }
+    }else{
+        var newNode = document.createElement("span");
+        newNode.setAttribute("class","help-block")
+        newNode.innerHTML =" 请输入数字 ";
+        if(event.target.nextSibling!=null){
+            event.target.nextSibling.remove();
+        }
+        event.target.parentNode.insertBefore(newNode,event.target.nextSibling)
+
+        // if(event.target.nextSibling!=null){
+        // }else{
+        //     event.target.parentNode.insertBefore(newNode,event.target.nextSibling)
+        // }
+        event.target.parentElement.parentElement.setAttribute("class","form-group has-error")
+    }
+}
+
+str2number = function(data){
+    //  refer : https://blog.csdn.net/u010865136/article/details/49336255
+    return parseInt(data)
+}
+
+checkNull = function (event) {
+    var num = event.target.value;
+    console.log(num)
+    if(num!=null&&num.length!=0){
+        console.log(event.target.parentElement.parentElement)
+        event.target.parentElement.parentElement.setAttribute("class","form-group has-success")
+        if(event.target.nextSibling!=null){
+            event.target.nextSibling.remove();
+        }
+    }else{
+        var newNode = document.createElement("span");
+        newNode.setAttribute("class","help-block")
+        newNode.innerHTML =" 请填写 ";
+        if(event.target.nextSibling==null){
+            event.target.parentNode.insertBefore(newNode,event.target.nextSibling)
+        }
+        event.target.parentElement.parentElement.setAttribute("class","form-group has-error")
+    }
+}
+
+
+showExampleFile = function (element) {
+    var td = $(element).parents("td").prev("td"); // 获取示例
+    var data = $(element).val();
+    td.html('<div class="form-group">\n' +
+        '                            <label   class="col-sm-3 control-label">' + data +
+        '</label>\n' +
+        '                            <div class="col-sm-9">\n' +
+        '                                <input  type="file" />\n' +
+        '                            </div>\n' +
+        '                        </div>')
+}
+showExampleText = function (element) {
+    var $tr = $(element).parents("td").prev("td"); // 获取上一个元素
+    var data = $(element).val();
+    $tr.html('<div class="form-group">\n' +
+        '                  <label  class="col-sm-3 control-label">' +data+
+        '</label>\n' +
+        '\n' +
+        '                  <div class="col-sm-9">\n' +
+        '                    <input type="text" class="form-control"  placeholder="请输入">\n' +
+        '                  </div>\n' +
+        '                </div>')
+}
+showExampleRatio = function (element) { // xuanxiang  shuju
+    // 显示单选框
+    var dataRatio = $(element).parents("td").prev("td").prev("td"); // 获取展示的元素
+    var data  =  $(element).val();
+    var label = $(element).parents("td").prev("td").children("input").val();
+    dataRatio.html(getExampleRatioHtml(label,data));
+}
+//show example ratio by label ;
+showExampleRatioByLabel = function(element){
+    // 显示单选框
+    var dataRatio = $(element).parents("td").prev("td"); // 获取展示的元素
+    var label  =  $(element).val();
+    var data = $(element).parents("td").next("td").children("input").val();
+    dataRatio.html(getExampleRatioHtml(label,data));
+}
+getExampleRatioHtml = function(label,data){
+    var index = getNewRatioIndex();
+    var ratioArr = data.split(';');
+    var ratioTemp = '<div class="form-group">\n' +
+        '                            <label class="col-sm-3 control-label">' +label+
+        '</label>\n' +
+        '                            <div class="col-sm-9">\n' ;
+
+    for( var  ratioJ = 0;ratioJ<ratioArr.length;ratioJ++){
+        ratioTemp+='<div class="radio">\n' +
+            '                                                    <label>\n' +
+            '                                                        <input type="radio" name="optionsRadios' + index+
+            '"  value="' +ratioArr[ratioJ]+
+            '"/>\n' +ratioArr[ratioJ]+
+            '                                                    </label>\n' +
+            '                                                </div>';
+    }
+    ratioTemp+=
+        '                                            </div>\n' +
+        '                                        </div>';
+    return ratioTemp;
+}
+showExampleSingle = function(element){
+    //单复选框
+    var dataRatio = $(element).parents("td").prev("td").prev("td"); // 获取展示的元素
+    var data  =  $(element).val();
+    var label = $(element).parents("td").prev("td").children("input").val();
+    dataRatio.html(getExampleSingleHtml(label,data));
+}
+showExampleSingleByLabel = function(element){
+    //单复选框
+    var dataRatio = $(element).parents("td").prev("td"); // 获取展示的元素
+    var label  =  $(element).val();
+    var data = $(element).parents("td").next("td").children("input").val();
+    dataRatio.html(getExampleSingleHtml(label,data));
+}
+getExampleSingleHtml = function(label,data ){
+    var singleCheckTip = label;
+    var singleCheckData = data;
+    var singleCheckTemp = '<div class="form-group">\n' +
+        '                            <label class="col-sm-3 control-label">' +singleCheckTip+
+        '</label>\n' +
+        '                            <div class="col-sm-9">\n' ;
+
+    singleCheckTemp+='<div class="checkbox">\n' +
+        '                                                    <label>\n' +
+        '                                                        <input type="checkbox"/>\n' +singleCheckData+
+        '                                                    </label>\n' +
+        '                                                </div>';
+
+    singleCheckTemp+=
+        '                                            </div>\n' +
+        '                                        </div>';
+    return singleCheckTemp;
+}
+showExampleCheck = function(element){
+    //复选框
+    var dataRatio = $(element).parents("td").prev("td").prev("td"); // 获取展示的元素
+    var data  =  $(element).val();
+    var label = $(element).parents("td").prev("td").children("input").val();
+    dataRatio.html(getExampleCheckHtml(label,data));
+}
+showExampleCheckByLabel = function( element ){
+    //复选框
+    var dataRatio = $(element).parents("td").prev("td"); // 获取展示的元素
+    var label  =  $(element).val();
+    var data = $(element).parents("td").next("td").children("input").val();
+    dataRatio.html(getExampleCheckHtml(label,data));
+}
+getExampleCheckHtml = function(label,data){
+    // ---
+    var checkTip = label;
+    var checkData = data;
+    var checkArr = checkData.split(';');
+    var checkTemp = '<div class="form-group">\n' +
+        '                            <label class="col-sm-3 control-label">' +checkTip+
+        '</label>\n' +
+        '                            <div class="col-sm-9">\n' ;
+    for( var  checkJ = 0;checkJ<checkArr.length;checkJ++){
+        checkTemp+='<div class="checkbox">\n' +
+            '                                                    <label>\n' +
+            '                                                        <input type="checkbox"/>\n' +checkArr[checkJ]+
+            '                                                    </label>\n' +
+            '                                                </div>';
+    }
+    checkTemp+=
+        '                                            </div>\n' +
+        '                                        </div>';
+    return checkTemp;
+}
+
+getDataSplit = function ( str ) {
+    var arr=str.split(";");
+    var res = new Array();
+    for(var i =0;i<arr.length;i++){
+        res.push(arr[i]);
+    }
+    return res;
+}
+//获取在本页面不会重复的ratio
+getNewRatioIndex = function () {
+    ratioIndex++;
+    return ratioIndex;
+}
+
+generateJson = function( type ){
+    // 遍历页面上的数据,生成json数据。
+    var data = new Object();
+    data.description = $('#description').val();
+    data.name = $('#name').val();
+    // data.time = $('#reservationtime').val();
+    data.type = $('#testType').val();
+    data.application_url = "http://www.mooctest.net/assets/img/mooctest.png";
+    data.requirement_url = "http://www.mooctest.net/assets/img/mooctest.png";
+    data.report_num = str2number( $('#reportNum').val() );
+    data.create_time = "2019/10/02"
+    // data.worker_num = str2number( $('#auditNum').val() );
+    var item_group_list = new Array();
+    $('.rule').each(function () {
+        // every item information
+        var element = $(this);
+        var temp = new Object();
+        var reportTemp = new Object()
+        var ruleIndex = element.attr("id").charAt(4); // index is 4 (like)
+        // temp.index = ruleIndex;
+        var examples = $('#namelist'+ruleIndex).children();
+        var tempExample  ;
+        var report_list = new Array();
+        for ( var i =0;i<examples.length;i++){
+            tempExample = examples[i];
+            // reportTemp = new Object();
+            // reportTemp.report_index = tempExample.innerHTML;
+            report_list.push(str2number(tempExample.innerHTML));
+        }
+        temp.report_list = report_list
+        temp.origin_report_list = $('#fitlist'+ruleIndex).val();
+        // bianli biao
+        var myTable = document.getElementById("table"+ruleIndex) ; //
+        var rowNum =  myTable.rows.length;
+        var tr;
+        var type;
+        var item_list = new Array();
+        var itemTemp ;
+        for(var i = 1;i<rowNum;i++){
+            itemTemp = new Object()
+            tr = myTable.rows[i];
+            type=tr.getAttribute("type");
+            itemTemp.index = (i-1);
+            itemTemp.is_required = true;
+            var options = new Array()
+            if(type=="singleCheck"){
+                var singleCheckTip = myTable.rows[i].cells[1].children[0].value;
+                var singleCheckData = myTable.rows[i].cells[2].children[0].value;
+                itemTemp.description = singleCheckTip
+                // itemTemp.is_multiple ="0"
+                itemTemp.type="Multiple"
+                // var optionS = new Object();
+                // optionS.option = singleCheckData
+                itemTemp.originTip = singleCheckTip;
+                itemTemp.originData = singleCheckTip;
+                options.push(singleCheckData)
+            }else if(type=="check"){
+                var checkTip = myTable.rows[i].cells[1].children[0].value;
+                var checkData = myTable.rows[i].cells[2].children[0].value;
+                itemTemp.description = checkTip;
+                // itemTemp.is_multiple = "1"
+                itemTemp.type="Multiple"
+                itemTemp.originTip = checkTip;
+                itemTemp.originData = checkData;
+                var optionC ;
+                var checkArr = checkData.split(';');
+                for( var  checkJ = 0;checkJ<checkArr.length;checkJ++){
+                    // optionC = new Object();
+                    // optionC.option = checkArr[checkJ]
+                    options.push(checkArr[checkJ])
+                }
+            }else if(type=="ratio"){
+                var ratioTip = myTable.rows[i].cells[1].children[0].value;
+                var ratioData = myTable.rows[i].cells[2].children[0].value;
+                var ratioArr = ratioData.split(';');
+                itemTemp.description = ratioTip;
+                // itemTemp.is_multiple = "0"
+                itemTemp.type="Single"
+                itemTemp.originTip = ratioTip;
+                itemTemp.originData = ratioData;
+                var optionR ;
+                for( var  ratioJ = 0;ratioJ<ratioArr.length;ratioJ++){
+                    // optionR = new Object();
+                    // optionR.option = ratioArr[ratioJ]
+                    options.push(ratioArr[ratioJ])
+                }
+            }else if(type=="text"){
+                var textData = myTable.rows[i].cells[1].children[0].value;
+                itemTemp.description = textData;
+                // itemTemp.is_multiple = "0"
+                itemTemp.type="Description"
+                itemTemp.originData = textData;
+                // var optionT = new Object();
+                // optionT.option = ""
+                // options.push("")
+
+            }else if( type == "file"){
+                var fileData = myTable.rows[i].cells[1].children[0].value;
+                itemTemp.description = fileData;
+                // itemTemp.is_multiple = "0"
+                itemTemp.type="File"
+                itemTemp.originData=fileData;
+                // var optionF = new Object();
+                // optionF.option = ""
+                // options.push("")
+            }
+            itemTemp.options= options
+            item_list.push(itemTemp)
+        }
+        temp.item_list=item_list
+        item_group_list.push(temp)
+        // console.log(JSON.stringify(temp))
+    })
+    data.item_group_list = item_group_list
+    data.report_list = getReportInfo()
+    // data.group_list = getDeliverInfo()
+    console.log(JSON.stringify(data));
+    // 提交
+
+    //check
+    // $.ajax({
+    //     url: 'http://10.0.0.29:8090/Bug/api/extra/uploadJob',
+    //     data: {
+    //         'jobJson': JSON.stringify(data)
+    //     },
+    //     type: 'POST',
+    //     success: function (result) {
+    //         var obj = eval('(' + result + ')');
+    //         console.log(obj)
+    //     }
+    // })
+    // return ;
+    // 发送请求
+    $.ajax({
+        url: 'http://47.99.140.117:9090/Bug/api/paper/uploadPaper',
+        data:{
+            'paperJson':JSON.stringify(data)
+        },
+        type: 'POST',
+        success: function (result) {
+            // alert(result);
+            console.log(result);
+            var obj = eval('(' + result + ')');
+            console.log(obj)
+            console.log(obj["id"])
+            console.log(obj['status']);
+            if(obj['status'] == 'fail'){
+                $.notify({
+                    // options
+                    message: obj['message']
+                },{
+                    // settings
+                    delay: 100,
+                    timer: 1000,
+                    type: 'error'
+                });
+            }else{
+                // success
+                var jobId = obj['paperId'];
+                if ( type == 1 ){
+                    var workid = getOneWorker();
+                    console.log("worke")
+                    console.log(workid)
+                    window.open('http://47.99.140.117:9090/report/job/'+jobId+'/'+workid+'/0/1');
+                }else{
+                    $.notify({
+                        // options
+                        message: '添加成功,paperid为'+jobId
+                    },{
+                        // settings
+                        delay: 100,
+                        timer: 3000,
+                        type: 'success'
+                    });
+                }
+            }
+        }
+    });
+}
+
+showyu = function (){
+    generateJson(1)
+}
+
+
+
+getReportInfo = function(){
+    var str = $('#reportInfo').val();
+    console.log(str)
+    var obj = eval('(' + str + ')');
+    // var tessst = new Object()
+    // tessst.reports = obj
+    console.log(JSON.stringify(obj))
+    return obj
+}
+
+getDeliverInfo = function () {
+    var str = $('#deliverInfo').val();
+    console.log(str)
+    var obj = eval('(' + str + ')');
+    // var tessst = new Object()
+    // tessst.reports = obj
+    console.log(JSON.stringify(obj))
+    return obj
+}
+
+changeJob = function () {
+    $('#modal-reload').modal('show');
+}
+
+reloadJob = function () {
+    var jobId = $('#jobid').val();
+    location.href = '/addTask?jobid='+jobid
+}
+
+getOneWorker = function () {
+    // var str = $('#deliverInfo').val();
+    // // console.log(str)
+    // var obj = eval('(' + str + ')');
+    // console.log(obj[0].worker_list[0])
+    // return obj[0].worker_list[0];
+    return 1
+}
+
+/*]]>*/

+ 14 - 5
src/main/resources/templates/addTask.html

@@ -94,8 +94,17 @@
                     <a href="/addTask">
                         <i class="glyphicon glyphicon-pencil"></i>
                         <span>
-                新建任务
-            </span>
+                            新建任务
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/auditTasks">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            众审任务列表
+                        </span>
                     </a>
                 </li>
                 <!--                {% for task in app_list %}-->
@@ -109,6 +118,8 @@
 
 
             </ul>
+
+
         </section>
     </aside>
 
@@ -238,12 +249,10 @@
             </div>
 
 
-            <!-- Horizontal Form -->
-
-
 
 
         </section>
+
     </div>
 
 

+ 377 - 0
src/main/resources/templates/add_paper.html

@@ -0,0 +1,377 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
+      layout:decorator="base">
+<head>
+    <link rel="stylesheet" href="/static/css/applications.css" type="text/css"/>
+    <!-- dataTables -->
+    <link rel="stylesheet" type="text/css"
+          href="/static/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css"/>
+    <!-- Font Awesome -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/font-awesome/css/font-awesome.min.css"/>
+    <!-- Ionicons -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/Ionicons/css/ionicons.min.css"/>
+    <!-- daterange picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.css"/>
+    <!-- bootstrap datepicker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css"/>
+    <!-- iCheck for checkboxes and radio inputs -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/iCheck/all.css"/>
+    <!-- Bootstrap time Picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.css"/>
+    <!-- Select2 -->
+    <link rel="stylesheet" type="text/css" href="/static/AdminLTE/bower_components/select2/dist/css/select2.min.css"/>
+    <!-- Theme style -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/AdminLTE.min.css"/>
+    <!-- AdminLTE Skins. Choose a skin from the css/skins
+         folder instead of downloading all of them to reduce the load. -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/skins/_all-skins.min.css"/>
+    <style>
+        body {
+            padding-right: 0px !important;
+        }
+        *.modal-open {
+            overflow-y: scroll;
+            padding-right: 0 !important;
+        }
+        .content {
+            padding-left: 45px;
+            padding-right: 45px;
+        }
+        .box {
+            margin-bottom: 50px;
+        }
+        .box-header button{
+            margin-right: 5px;
+        }
+        .table tr td {
+            padding-right: 10px;
+            padding-left: 10px;
+            border-top: 1px solid #f4f4f4;
+            border-right: 1px solid #f4f4f4;
+        }
+
+        td .form-group {
+            margin-bottom: 0px;
+        }
+    </style>
+</head>
+<body>
+<div layout:fragment="mainbody">
+
+
+
+    <aside class="main-sidebar">
+        <section class="sidebar">
+            <div class="user-panel">
+                <div class="pull-left image">
+                    <img src="/static/images/avatar/avatar-admin.jpg" class="img-circle" alt="User Image" />
+                </div>
+                <div class="pull-left info">
+                    <p>Admin</p>
+                    <a href="#">
+                        <i class="fa fa-circle text-success"></i>
+                        Online
+                    </a>
+                </div>
+            </div>
+
+            <!-- Search form -->
+            <form action="#" method="get" class="sidebar-form">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search..." />
+                    <span class="input-group-btn">
+						<button type="submit" name="search" id="search-btn" class="btn btn-flat">
+							<i class="fa fa-search"></i>
+						</button>
+					</span>
+                </div>
+            </form>
+
+            <!-- Sidebar Menu -->
+            <ul class="sidebar-menu tree" data-widget="tree">
+                <li>
+                    <a href="/addPaper">
+                        <i class="glyphicon glyphicon-pencil"></i>
+                        <span>
+                            新建试卷
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/auditTasks">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            众审任务列表
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/papers">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            试卷列表
+                        </span>
+                    </a>
+                </li>
+
+
+            </ul>
+
+
+        </section>
+    </aside>
+
+
+    <div class="content-wrapper">
+        <!-- Content Header (Page header) -->
+        <section class="content-header">
+            <h1>
+                新建众审任务
+                <small>众包审核</small>
+            </h1>
+            <ol class="breadcrumb">
+                <li><a href="/home"><i class="fa fa-dashboard"></i> 主页</a></li>
+                <li><a href="/addTask">新建试卷</a></li>
+            </ol>
+        </section>
+
+        <!-- Main content -->
+        <section class="content" id="maincontent">
+
+            <div class="box box-primary" >
+                <div class="box-header with-border">
+                    <h3 class="box-title">基本信息</h3>
+
+
+                    <button class="btn btn-success pull-right" onclick="generateJson(0)">
+                        生成
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="changeJob()">
+                        加载任务
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="showyu()">
+                        预览
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="addNewOption()">
+                        新建审查项
+                    </button>
+                </div>
+                <!-- /.box-header -->
+                <div class="box-body">
+                    <form class="form-horizontal">
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">名称</label>
+                            <div class="col-sm-10">
+                                <input  onchange="checkNull(event)" class="form-control" id="name" placeholder="请输入试卷名称"/>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">描述</label>
+                            <div class="col-sm-10">
+                                <textarea onchange="checkNull(event)" id="description" class="form-control" rows="3" placeholder="请输入描述信息"></textarea>
+                            </div>
+                        </div>
+
+                        <!-- select -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" >测试类型</label>
+                            <div class=" col-sm-10">
+                                <select class="form-control" id="testType">
+                                    <option>漏洞扫描分析</option>
+                                    <option>App自动扫描</option>
+                                    <option>Java自动化扫描</option>
+                                    <option>Web自动化扫描</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label for="testApplication"  class="col-sm-2 control-label">附件(可选)</label>
+                            <div class="col-sm-10">
+                                <input  type="file" id="testApplication"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="testRequirement" class="col-sm-2 control-label">测试需求</label>
+                            <div class="col-sm-10">
+                                <input  type="file" id="testRequirement"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告总数</label>
+                            <div class="col-sm-10">
+                                <input id="reportNum" onchange="checkNum(event)" type="text" class="form-control" placeholder="请输入报告总数"/>
+                            </div>
+                        </div>
+
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告信息</label>
+                            <div class="col-sm-10">
+                                <textarea class="form-control" id="reportInfo" onchange="checkNull(event)" rows="3" placeholder="请输入json格式的报告信息"></textarea>
+                            </div>
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+
+
+
+
+        </section>
+
+    </div>
+
+
+    <div class="modal fade" id="modal-default">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalBody">
+                    <form class="form-horizontal" id="formBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+
+    <div class="modal fade" id="modal-alert">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalAlertBody">
+                    <form class="form-horizontal" id="formAlertBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+
+
+
+
+    <div class="modal fade" id="modal-reload">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">从已有任务家在数据</h4>
+                </div>
+                <div class="modal-body" >
+                    <form class="form-horizontal" >
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">JobId</label>
+                            <div class="col-sm-10">
+                                <input  onchange="checkNull(event)" class="form-control" id="jobid" placeholder="请输入任务名称"/>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <button type="button" class="btn btn-primary" onclick="reloadJob()">确认</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+</div>
+
+
+</body>
+</html>
+<!-- jQuery 3 -->
+<!--<script src="/static/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>-->
+<!-- Bootstrap 3.3.7 -->
+<script src="/static/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/select2/dist/js/select2.min.js"></script>
+<!-- InputMask -->
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.date.extensions.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.extensions.js"></script>
+<!-- date-range-picker -->
+<script src="/static/AdminLTE/bower_components/moment/min/moment.min.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
+<!-- bootstrap datepicker -->
+<script src="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
+<!-- bootstrap time picker -->
+<script src="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.js"></script>
+<!-- SlimScroll -->
+<script src="/static/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
+<!-- iCheck 1.0.1 -->
+<script src="/static/AdminLTE/plugins/iCheck/icheck.min.js"></script>
+<!-- FastClick -->
+<script src="/static/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script>
+<!-- AdminLTE App -->
+<!--<script src="/static/AdminLTE/dist/js/adminlte.min.js"></script>-->
+<!-- AdminLTE for demo purposes -->
+<script src="/static/AdminLTE/dist/js/demo.js"></script>
+<!-- add Task js for this file only -->
+<script src="/static/js/add_paper.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-notify/dist/bootstrap-notify.min.js"></script>
+<script type="text/javascript">
+    var ruleId ;
+    var ratioIndex;
+
+    $(document).ready(function(){
+        $('[data-toggle="tooltip"]').tooltip();
+
+        //Initialize Select2 Elements
+        $('.select2').select2()
+
+        ruleId = 0;
+        ratioIndex =0 ;
+
+
+
+        var taskListTable = $('#task-list').DataTable({
+            searching: true,
+            pageLength: 25
+        });
+    });
+
+
+
+
+</script>

+ 156 - 0
src/main/resources/templates/audit_task_list.html

@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
+      layout:decorator="base">
+<head>
+    <link rel="stylesheet" href="/static/css/applications.css" type="text/css"/>
+    <!-- dataTables -->
+    <link rel="stylesheet" type="text/css"
+          href="/static/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css"/>
+    <!-- Select2 -->
+    <link rel="stylesheet" type="text/css" href="/static/AdminLTE/bower_components/select2/dist/css/select2.min.css"/>
+</head>
+<body>
+<div layout:fragment="mainbody">
+    <aside class="main-sidebar">
+        <section class="sidebar">
+            <div class="user-panel">
+                <div class="pull-left image">
+                    <img src="/static/images/avatar/avatar-admin.jpg" class="img-circle" alt="User Image" />
+                </div>
+                <div class="pull-left info">
+                    <p>Admin</p>
+                    <a href="#">
+                        <i class="fa fa-circle text-success"></i>
+                        Online
+                    </a>
+                </div>
+            </div>
+
+            <!-- Search form -->
+            <form action="#" method="get" class="sidebar-form">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search..." />
+                    <span class="input-group-btn">
+						<button type="submit" name="search" id="search-btn" class="btn btn-flat">
+							<i class="fa fa-search"></i>
+						</button>
+					</span>
+                </div>
+            </form>
+
+            <!-- Sidebar Menu -->
+            <ul class="sidebar-menu tree" data-widget="tree">
+                <!--                {% for task in app_list %}-->
+                <!--                <li th:each="task:${tasks}" >-->
+
+                <!--                    <a th:href="'/task_detail?examId='+${task.examId}+'&amp;caseId='+${task.caseId}" th:text="${task.name}">-->
+                <!--                        <i class="fa fa-link"></i>-->
+                <!--                    </a>-->
+                <!--                </li>-->
+                <!--                {% endfor %}-->
+
+                <li>
+                    <a href="/addTask">
+                        <i class="glyphicon glyphicon-pencil"></i>
+                        <span>
+                            新建任务
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/auditTasks">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            众审任务列表
+                        </span>
+                    </a>
+                </li>
+            </ul>
+        </section>
+    </aside>
+
+    <!-- Main Content -->
+    <div class="content-wrapper" style="min-height: 691px;">
+        <section class="content-header">
+            <h1>全部应用</h1>
+
+            <ol class="breadcrumb">
+                <li class="active">
+                    <a href="/home">
+                        <i class="fa fa-dashboard"></i>
+                        全部应用
+                    </a>
+                </li>
+            </ol>
+        </section>
+
+        <!-- Main Content -->
+        <section class="content container-fluid">
+            <!-- 			<div id="task-list-search" class="input-group col-md-6">
+                            <input type="text" class="form-control" placeholder="Search for application">
+                            <span class="input-group-btn">
+                                <button class="btn btn-default" type="button" id="task-search-btn">Search</button>
+                            </span>
+                        </div> -->
+
+            <table id="task-list" class="table table-striped text-center" style="margin-top: 10px">
+                <thead><tr>
+                    <!--<th></th>-->
+                    <th>任务名称</th>
+                    <th>任务类型</th>
+                    <th>任务时间</th>
+                    <!--<th>版本</th>-->
+                    <th>操作</th>
+                </tr></thead>
+                <tbody>
+                <th:block th:each="task : ${tasks}">
+
+                    <tr>
+                        <!--<td><img th:src="${task.icon}" style="width: 25px; height: 25px;" /></td>-->
+                        <td><span  class="label label-info" th:text="${task.get('name')}" ></span></td>
+<!--                        <td><span  class="label label-info" th:text="${task.caseId}">题号</span></td>-->
+                        <td><b><a href="#"  th:text="${task.get('type')}"></a></b></td>
+                        <td><span  class=" " th:text="${task.get('time')}" ></span></td>
+                        <td>
+                            <button th:onclick="'showYulan( \''+${task.get('id')}+'\' )'" class="btn btn-default">预览</button>
+<!--                            <button  class="btn btn-default">修改</button>-->
+                            <a type="button" class="btn btn-default" th:href="'/changeAuditTask?id='+${task.get('id')}">修改</a>
+                            <button    class="btn btn-default">删除</button>
+                        </td>
+                        <!--<td th:text="${task.version}"></td>-->
+<!--                        <td th:if="${task.numOfUndeal > 0}"><span  class="label label-info">审核中</span></td>-->
+<!--                        <td th:if="${task.numOfUndeal == 0}"><span  class="label label-success">审核结束</span></td>-->
+                        <!--<td th:text="${task.startTime}">{{ task.print_start_time }}</td>-->
+                        <!--<td th:text="${task.endTime}">{{ task.print_end_time }}</td>-->
+
+<!--                        <td><span class="badge"><a th:href="'/task_detail?examId=' + ${task.examId} + '&amp;caseId=' + ${task.caseId}" style="color: #fff;" th:text="${task.numOfUndeal}"></a></span></td>-->
+                    </tr>
+                </th:block>
+                </tbody>
+            </table><!-- table -->
+        </section>
+    </div>
+</div>
+</body>
+</html>
+<script src="/static/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/select2/dist/js/select2.min.js"></script>
+
+<script type="text/javascript">
+    $(document).ready(function(){
+        $('[data-toggle="tooltip"]').tooltip();
+
+        var taskListTable = $('#task-list').DataTable({
+            searching: true,
+            pageLength: 25
+        });
+    });
+
+    showYulan = function ( id ) {
+        window.open('http://47.99.140.117:9090/report/job/'+id+'/'+1+'/0/1');
+        // 默认使用0号worker做展示页面。
+    }
+</script>

+ 463 - 0
src/main/resources/templates/changeAuditTask.html

@@ -0,0 +1,463 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
+      layout:decorator="base">
+<head>
+    <link rel="stylesheet" href="/static/css/applications.css" type="text/css"/>
+    <!-- dataTables -->
+    <link rel="stylesheet" type="text/css"
+          href="/static/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css"/>
+    <!-- Font Awesome -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/font-awesome/css/font-awesome.min.css"/>
+    <!-- Ionicons -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/Ionicons/css/ionicons.min.css"/>
+    <!-- daterange picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.css"/>
+    <!-- bootstrap datepicker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css"/>
+    <!-- iCheck for checkboxes and radio inputs -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/iCheck/all.css"/>
+    <!-- Bootstrap time Picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.css"/>
+    <!-- Select2 -->
+    <link rel="stylesheet" type="text/css" href="/static/AdminLTE/bower_components/select2/dist/css/select2.min.css"/>
+    <!-- Theme style -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/AdminLTE.min.css"/>
+    <!-- AdminLTE Skins. Choose a skin from the css/skins
+         folder instead of downloading all of them to reduce the load. -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/skins/_all-skins.min.css"/>
+    <style>
+        body {
+            padding-right: 0px !important;
+        }
+        *.modal-open {
+            overflow-y: scroll;
+            padding-right: 0 !important;
+        }
+        .content {
+            padding-left: 45px;
+            padding-right: 45px;
+        }
+        .box {
+            margin-bottom: 50px;
+        }
+        .box-header button{
+            margin-right: 5px;
+        }
+        .table tr td {
+            padding-right: 10px;
+            padding-left: 10px;
+            border-top: 1px solid #f4f4f4;
+            border-right: 1px solid #f4f4f4;
+        }
+
+        td .form-group {
+            margin-bottom: 0px;
+        }
+    </style>
+</head>
+<body>
+<div layout:fragment="mainbody">
+
+
+
+    <aside class="main-sidebar">
+        <section class="sidebar">
+            <div class="user-panel">
+                <div class="pull-left image">
+                    <img src="/static/images/avatar/avatar-admin.jpg" class="img-circle" alt="User Image" />
+                </div>
+                <div class="pull-left info">
+                    <p>Admin</p>
+                    <a href="#">
+                        <i class="fa fa-circle text-success"></i>
+                        Online
+                    </a>
+                </div>
+            </div>
+
+            <!-- Search form -->
+            <form action="#" method="get" class="sidebar-form">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search..." />
+                    <span class="input-group-btn">
+						<button type="submit" name="search" id="search-btn" class="btn btn-flat">
+							<i class="fa fa-search"></i>
+						</button>
+					</span>
+                </div>
+            </form>
+
+            <!-- Sidebar Menu -->
+            <ul class="sidebar-menu tree" data-widget="tree">
+                <li>
+                    <a href="/addTask">
+                        <i class="glyphicon glyphicon-pencil"></i>
+                        <span>
+                            新建任务
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/auditTasks">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            众审任务列表
+                        </span>
+                    </a>
+                </li>
+
+            </ul>
+        </section>
+    </aside>
+
+
+    <div class="content-wrapper">
+        <!-- Content Header (Page header) -->
+        <section class="content-header">
+            <h1>
+                编辑众审任务
+                <small>众包审核</small>
+            </h1>
+            <ol class="breadcrumb">
+                <li><a href="/home"><i class="fa fa-dashboard"></i> 主页</a></li>
+                <li><a href="/changeAuditTask">编辑众审任务</a></li>
+            </ol>
+        </section>
+
+        <!-- Main content -->
+        <section class="content" id="maincontent">
+
+            <div class="box box-primary" >
+                <div class="box-header with-border">
+                    <h3 class="box-title">基本信息</h3>
+
+                    <button class="btn btn-success pull-right" onclick="generateJson(0)">
+                        保存
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="showyu()">
+                        预览
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="addNewOption()">
+                        新建审查项
+                    </button>
+                </div>
+                <!-- /.box-header -->
+                <div class="box-body">
+                    <form class="form-horizontal">
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">名称</label>
+                            <div class="col-sm-10">
+                                <input  onchange="checkNull(event)" th:value="${data.get('name')}" class="form-control" id="name" placeholder="请输入任务名称"/>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">描述</label>
+                            <div class="col-sm-10">
+                                <textarea onchange="checkNull(event)" th:text="${data.get('description')}" id="description" class="form-control" rows="3" placeholder="请输入描述信息"></textarea>
+                            </div>
+                        </div>
+
+                        <!-- Date and time range -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" >时间</label>
+                            <div class=" col-sm-10">
+                                <!--                                <div class="input-group-addon">-->
+                                <!--                                    <i class="fa fa-clock-o"></i>-->
+                                <!--                                </div>-->
+                                <input type="text" th:value="${data.get('time')}" class="form-control pull-right" id="reservationtime"/>
+                            </div>
+                            <!-- /.input group -->
+                        </div>
+                        <!-- select -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" >测试类型</label>
+                            <div class=" col-sm-10">
+                                <select class="form-control" id="testType"  >
+                                    <option>漏洞扫描分析</option>
+                                    <option>App自动扫描</option>
+                                    <option>Java自动化扫描</option>
+                                    <option>Web自动化扫描</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label for="testApplication"  class="col-sm-2 control-label">附件(可选)</label>
+                            <div class="col-sm-10">
+                                <input  type="file" id="testApplication"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="testRequirement" class="col-sm-2 control-label">测试需求</label>
+                            <div class="col-sm-10">
+                                <input  type="file" id="testRequirement"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告总数</label>
+                            <div class="col-sm-10">
+                                <input id="reportNum" th:value="${data.get('report_num')}" onchange="checkNum(event)" type="text" class="form-control" placeholder="请输入报告总数"/>
+                            </div>
+                        </div>
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">审核人数</label>
+                            <div class="col-sm-10">
+                                <input id="auditNum" th:value="${data.get('worker_num')}" onchange="checkNum(event)"  type="text" class="form-control" placeholder="请输入审核人数"/>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告信息</label>
+                            <div class="col-sm-10">
+                                <textarea class="form-control" th:text="${data.get('report_list')}" id="reportInfo" onchange="checkNull(event)" rows="3" placeholder="请输入json格式的报告信息"></textarea>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告分配信息</label>
+                            <div class="col-sm-10">
+                                <textarea class="form-control" th:text="${data.get('group_list')}" id="deliverInfo" onchange="checkNull(event)" rows="3" placeholder="请输入json格式的报告分配信息"></textarea>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+
+            <!-- Horizontal Form -->
+
+            <!-- Horizontal Form -->
+
+
+            <div class="box box-info rule" th:id="'rule'+${ruleStat.index}" th:each="rule,ruleStat : ${data.get('item_group_list')}">
+                <div class="box-header with-border">
+                    <h3 class="box-title">定制审查选项</h3>
+                    <button type="submit" th:onclick="'addCheck('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建多选框</button>
+                    <button type="submit" th:onclick="'addRatio('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建单选框</button>
+                    <button type="submit" th:onclick="'addSingleCheck('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建单复选框</button>
+                    <button type="submit" th:onclick="'addText('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建文本框</button>
+                    <button type="submit" th:onclick="'addUpload('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建文件上传</button>
+                </div>
+                <!-- /.box-header -->
+                <!-- form start -->
+                <div class="form-horizontal" >
+                    <div class="box-body">
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">适用报告列表</label>
+                            <div class="col-sm-10">
+                                <input th:onchange="'test(this,'+${ruleStat.index}+')'" class="form-control" th:id="'fitlist'+${ruleStat.index}" placeholder="请输入编号并用;分割,可用~输入连续的试题名称" />
+                            </div>
+                            <label class="col-sm-2 control-label">已选报告列表</label>
+                            <div class="col-sm-10" th:id="'namelist'+${ruleStat.index}">
+                                <span th:each="i : ${rule.get('report_list')}" class="badge bg-green" th:text="${i}"></span>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">审查项</label>
+                            <div class="col-sm-10 ">
+                                <table class="table" th:id="'table'+${ruleStat.index}">
+                                    <tbody>
+                                    <tr>
+                                        <td>
+                                            示例
+                                        </td>
+                                        <td>
+                                            标签
+                                        </td>
+                                        <td>
+                                            数据说明
+                                        </td>
+                                        <td>
+                                            操作
+                                        </td>
+                                    </tr>
+                                    <tr th:each="item : ${rule.get('asdfasdf')}" th:attr="'type='+${item.get('type')}">
+
+                                    </tr>
+
+
+
+                                    <tr type="file">
+                                        <td><div class="form-group">
+                                            <label class="col-sm-3 control-label">eesd</label>
+                                            <div class="col-sm-9">
+                                                <input type="file"/>
+                                            </div>
+                                        </div></td>
+                                        <td>
+                                            <input onchange="showExampleFile(this)" type="text" class="form-control" placeholder="请输入说明文字"/>
+                                        </td>
+                                        <td>
+                                        </td>
+                                        <td>
+                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                            <button onclick="downTr(this,0)" class="btn btn-default">下移</button>
+                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                        </td>
+                                    </tr>
+
+
+                                    <tr type="file">
+                                        <td><div class="form-group">
+                                            <label class="col-sm-3 control-label">23r</label>
+                                            <div class="col-sm-9">
+                                                <input type="file"/>
+                                            </div>
+                                        </div></td>
+                                        <td>
+                                            <input onchange="showExampleFile(this)" type="text" class="form-control" placeholder="请输入说明文字"/>
+                                        </td>
+                                        <td>
+                                        </td>
+                                        <td>
+                                            <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                            <button onclick="downTr(this,0)" class="btn btn-default">下移</button>
+                                            <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                        </td>
+                                    </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="box-footer">
+                        <button type="button" onclick="deleteRule(0)" class="btn btn-default">删除</button>
+                        <button type="button" class="btn btn-default" onclick="showModal(0)">
+                            本地预览
+                        </button>
+                        <button type="button" onclick="addNewOption()" class="btn btn-info pull-right">继续添加</button>
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+
+
+    <div class="modal fade" id="modal-default">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalBody">
+                    <form class="form-horizontal" id="formBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+
+    <div class="modal fade" id="modal-alert">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalAlertBody">
+                    <form class="form-horizontal" id="formAlertBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+</div>
+
+
+</body>
+</html>
+<!-- jQuery 3 -->
+<!--<script src="/static/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>-->
+<!-- Bootstrap 3.3.7 -->
+<script src="/static/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/select2/dist/js/select2.min.js"></script>
+<!-- InputMask -->
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.date.extensions.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.extensions.js"></script>
+<!-- date-range-picker -->
+<script src="/static/AdminLTE/bower_components/moment/min/moment.min.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
+<!-- bootstrap datepicker -->
+<script src="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
+<!-- bootstrap time picker -->
+<script src="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.js"></script>
+<!-- SlimScroll -->
+<script src="/static/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
+<!-- iCheck 1.0.1 -->
+<script src="/static/AdminLTE/plugins/iCheck/icheck.min.js"></script>
+<!-- FastClick -->
+<script src="/static/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script>
+<!-- AdminLTE App -->
+<!--<script src="/static/AdminLTE/dist/js/adminlte.min.js"></script>-->
+<!-- AdminLTE for demo purposes -->
+<script src="/static/AdminLTE/dist/js/demo.js"></script>
+<!-- add Task js for this file only -->
+<script src="/static/js/addTask.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-notify/dist/bootstrap-notify.min.js"></script>
+<script type="text/javascript">
+    var ruleId ;
+    var ratioIndex;
+
+    $(document).ready(function(){
+        $('[data-toggle="tooltip"]').tooltip();
+
+        //Initialize Select2 Elements
+        $('.select2').select2()
+
+        ruleId = 0;
+        ratioIndex =0 ;
+
+
+
+        //Date range picker with time picker
+        // $('#reservationtime').daterangepicker({ timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A' })
+        $('#reservationtime').daterangepicker({ timePicker: true, timePickerIncrement: 30, locale: { format: 'MM/DD/YYYY hh:mm A' }})
+
+
+
+
+        var taskListTable = $('#task-list').DataTable({
+            searching: true,
+            pageLength: 25
+        });
+    });
+
+
+
+
+
+</script>

+ 509 - 0
src/main/resources/templates/changePaper.html

@@ -0,0 +1,509 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
+      layout:decorator="base">
+<head>
+    <link rel="stylesheet" href="/static/css/applications.css" type="text/css"/>
+    <!-- dataTables -->
+    <link rel="stylesheet" type="text/css"
+          href="/static/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css"/>
+    <!-- Font Awesome -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/font-awesome/css/font-awesome.min.css"/>
+    <!-- Ionicons -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/Ionicons/css/ionicons.min.css"/>
+    <!-- daterange picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.css"/>
+    <!-- bootstrap datepicker -->
+    <link rel="stylesheet" href="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css"/>
+    <!-- iCheck for checkboxes and radio inputs -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/iCheck/all.css"/>
+    <!-- Bootstrap time Picker -->
+    <link rel="stylesheet" href="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.css"/>
+    <!-- Select2 -->
+    <link rel="stylesheet" type="text/css" href="/static/AdminLTE/bower_components/select2/dist/css/select2.min.css"/>
+    <!-- Theme style -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/AdminLTE.min.css"/>
+    <!-- AdminLTE Skins. Choose a skin from the css/skins
+         folder instead of downloading all of them to reduce the load. -->
+    <link rel="stylesheet" href="/static/AdminLTE/dist/css/skins/_all-skins.min.css"/>
+    <style>
+        body {
+            padding-right: 0px !important;
+        }
+        *.modal-open {
+            overflow-y: scroll;
+            padding-right: 0 !important;
+        }
+        .content {
+            padding-left: 45px;
+            padding-right: 45px;
+        }
+        .box {
+            margin-bottom: 50px;
+        }
+        .box-header button{
+            margin-right: 5px;
+        }
+        .table tr td {
+            padding-right: 10px;
+            padding-left: 10px;
+            border-top: 1px solid #f4f4f4;
+            border-right: 1px solid #f4f4f4;
+        }
+
+        td .form-group {
+            margin-bottom: 0px;
+        }
+    </style>
+</head>
+<body>
+<div layout:fragment="mainbody">
+
+
+
+    <aside class="main-sidebar">
+        <section class="sidebar">
+            <div class="user-panel">
+                <div class="pull-left image">
+                    <img src="/static/images/avatar/avatar-admin.jpg" class="img-circle" alt="User Image" />
+                </div>
+                <div class="pull-left info">
+                    <p>Admin</p>
+                    <a href="#">
+                        <i class="fa fa-circle text-success"></i>
+                        Online
+                    </a>
+                </div>
+            </div>
+
+            <!-- Search form -->
+            <form action="#" method="get" class="sidebar-form">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search..." />
+                    <span class="input-group-btn">
+						<button type="submit" name="search" id="search-btn" class="btn btn-flat">
+							<i class="fa fa-search"></i>
+						</button>
+					</span>
+                </div>
+            </form>
+
+            <!-- Sidebar Menu -->
+            <ul class="sidebar-menu tree" data-widget="tree">
+                <li>
+                    <a href="/addPaper">
+                        <i class="glyphicon glyphicon-pencil"></i>
+                        <span>
+                            新建试卷
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/papers">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            试卷列表
+                        </span>
+                    </a>
+                </li>
+
+            </ul>
+        </section>
+    </aside>
+
+
+    <div class="content-wrapper">
+        <!-- Content Header (Page header) -->
+        <section class="content-header">
+            <h1>
+                编辑众审任务
+                <small>众包审核</small>
+            </h1>
+            <ol class="breadcrumb">
+                <li><a href="/home"><i class="fa fa-dashboard"></i> 主页</a></li>
+                <li><a href="/changeAuditTask">编辑众审任务</a></li>
+            </ol>
+        </section>
+
+        <!-- Main content -->
+        <section class="content" id="maincontent">
+
+            <div class="box box-primary" >
+                <div class="box-header with-border">
+                    <h3 class="box-title">基本信息</h3>
+
+                    <button class="btn btn-success pull-right" onclick="generateJson(0)">
+                        保存
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="showyu()">
+                        预览
+                    </button>
+                    <button class="btn btn-default pull-right" onclick="addNewOption()">
+                        新建审查项
+                    </button>
+                </div>
+                <!-- /.box-header -->
+                <div class="box-body">
+                    <form class="form-horizontal">
+                        <!-- text input -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">名称</label>
+                            <div class="col-sm-10">
+                                <input  onchange="checkNull(event)" th:value="${data.get('name')}" class="form-control" id="name" placeholder="请输入任务名称"/>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">描述</label>
+                            <div class="col-sm-10">
+                                <textarea onchange="checkNull(event)" th:text="${data.get('description')}" id="description" class="form-control" rows="3" placeholder="请输入描述信息"></textarea>
+                            </div>
+                        </div>
+
+                        <!-- Date and time range -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" >时间</label>
+                            <div class=" col-sm-10">
+                                <!--                                <div class="input-group-addon">-->
+                                <!--                                    <i class="fa fa-clock-o"></i>-->
+                                <!--                                </div>-->
+                                <input disabled="disabled" type="text" th:value="${data.get('create_time')}" class="form-control pull-right" />
+                            </div>
+                            <!-- /.input group -->
+                        </div>
+                        <!-- select -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label" >测试类型</label>
+                            <div class=" col-sm-10">
+                                <select class="form-control" id="testType"  th:value="${data.get('type')}" >
+                                    <option>漏洞扫描分析</option>
+                                    <option>App自动扫描</option>
+                                    <option>Java自动化扫描</option>
+                                    <option>Web自动化扫描</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label for="testApplication"  class="col-sm-2 control-label">附件(可选)</label>
+                            <div class="col-sm-10">
+                                <a  th:href="@{${data.get('application_url')}}" class="col-sm-2 " >原始附件</a>
+                                <input  type="file" id="testApplication"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="testRequirement" class="col-sm-2 control-label">测试需求</label>
+                            <div class="col-sm-10">
+                                <a th:href="@{${data.get('requirement_url')}}" class="col-sm-2 " >原始测试需求</a>
+                                <input  type="file" id="testRequirement"/>
+                                <!--                               <p class="help-block">Example block-level help text here.</p>-->
+                            </div>
+                        </div>
+
+                        <!-- text input -->
+<!--                        <div class="form-group">-->
+<!--                            <label class="col-sm-2 control-label">报告总数</label>-->
+<!--                            <div class="col-sm-10">-->
+<!--                                <input id="reportNum" th:value="${data.get('report_num')}" onchange="checkNum(event)" type="text" class="form-control" placeholder="请输入报告总数"/>-->
+<!--                            </div>-->
+<!--                        </div>-->
+
+                        <!-- textarea -->
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">报告信息</label>
+                            <div class="col-sm-10">
+                                <textarea class="form-control" th:text="${data.get('report_list')}" id="reportInfo" onchange="checkNull(event)" rows="3" placeholder="请输入json格式的报告信息"></textarea>
+                            </div>
+                        </div>
+                        <!-- textarea -->
+
+                    </form>
+                </div>
+            </div>
+
+
+            <!-- Horizontal Form -->
+
+            <!-- Horizontal Form -->
+
+
+            <div class="box box-info rule" th:id="'rule'+${ruleStat.index}" th:each="rule,ruleStat : ${data.get('item_group_list')}">
+                <div class="box-header with-border">
+                    <h3 class="box-title">定制审查选项</h3>
+                    <button type="submit" th:onclick="'addCheck('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建多选框</button>
+                    <button type="submit" th:onclick="'addRatio('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建单选框</button>
+                    <button type="submit" th:onclick="'addSingleCheck('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建单复选框</button>
+                    <button type="submit" th:onclick="'addText('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建文本框</button>
+                    <button type="submit" th:onclick="'addUpload('+${ruleStat.index}+')'" class="btn btn-success pull-right">新建文件上传</button>
+                </div>
+                <!-- /.box-header -->
+                <!-- form start -->
+                <div class="form-horizontal" >
+                    <div class="box-body">
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">适用报告列表</label>
+                            <div class="col-sm-10">
+                                <input th:onchange="'test(this,'+${ruleStat.index}+')'" th:value="${rule.get('origin_report_list')}" class="form-control" th:id="'fitlist'+${ruleStat.index}" placeholder="请输入编号并用;分割,可用~输入连续的试题名称" />
+                            </div>
+                            <label class="col-sm-2 control-label">已选报告列表</label>
+                            <div class="col-sm-10" th:id="'namelist'+${ruleStat.index}">
+                                <span th:each="i : ${rule.get('report_list')}" class="badge bg-green" th:text="${i}"></span>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label class="col-sm-2 control-label">审查项</label>
+                            <div class="col-sm-10 ">
+                                <table class="table" th:id="'table'+${ruleStat.index}">
+                                    <tbody>
+                                    <tr>
+                                        <td>
+                                            示例
+                                        </td>
+                                        <td>
+                                            标签
+                                        </td>
+                                        <td>
+                                            数据说明
+                                        </td>
+                                        <td>
+                                            操作
+                                        </td>
+                                    </tr>
+
+                                    <th:block th:each="item : ${rule.get('item_list')}">
+                                        <tr th:if="${item.get('type')=='File'}" type="file">
+                                            <td>
+                                                <div class="form-group">
+                                                <label class="col-sm-3 control-label" th:text="${item.get('description')}"></label>
+                                                <div class="col-sm-9">
+                                                    <input type="file"/>
+                                                </div>
+                                            </div></td>
+                                            <td>
+                                                <input onchange="showExampleFile(this)" th:value="${item.get('originData')}" type="text" class="form-control" placeholder="请输入说明文字"/>
+                                            </td>
+                                            <td>
+                                            </td>
+                                            <td>
+                                                <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                                <button th:onclick="'downTr(this,'+${ruleStat.index}+')'" class="btn btn-default">下移</button>
+                                                <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                            </td>
+                                        </tr>
+                                        <tr th:if="${item.get('type')=='Description'}" type="text">
+                                            <td><div class="form-group">
+                                                <label class="col-sm-3 control-label" th:text="${item.get('description')}"></label>
+
+                                                <div class="col-sm-9">
+                                                    <input type="text" class="form-control" placeholder="请输入"/>
+                                                </div>
+                                            </div></td>
+                                            <td>
+                                                <input onchange="showExampleText(this)" th:value="${item.get('originData')}" type="text" class="form-control" placeholder="选项数据"/>
+                                            </td>
+                                            <td>
+                                            </td>
+                                            <td>
+                                                <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                                <button th:onclick="'downTr(this,'+${ruleStat.index}+')'" class="btn btn-default">下移</button>
+                                                <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                            </td>
+                                        </tr>
+                                        <tr th:if="${item.get('type')=='Multiple'}" type="check">
+                                            <td>
+                                                <div class="form-group">
+                                                    <label class="col-sm-3 control-label" th:text="${item.get('description')}"></label>
+                                                    <div class="col-sm-9">
+                                                        <div class="checkbox"  th:each="da:${item.get('options')}">
+                                                            <label >
+                                                                <input type="checkbox"/>
+                                                                <th:block th:text="${da}"> </th:block>
+                                                            </label>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td>
+                                                <input onchange="showExampleCheckByLabel(this)" th:value="${item.get('originTip')}" type="text" class="form-control" placeholder="选项说明"/>
+                                            </td>
+                                            <td>
+                                                <input onchange="showExampleCheck(this)" th:value="${item.get('originData')}" type="text" class="form-control" placeholder="选项数据 请用;将选项分隔"/>
+                                            </td>
+                                            <td>
+                                                <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                                <button th:onclick="'downTr(this,'+${ruleStat.index}+')'" class="btn btn-default">下移</button>
+                                                <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                            </td>
+                                        </tr>
+                                        <tr th:if="${item.get('type')=='Single'}" type="ratio">
+                                            <td>
+                                                <div class="form-group">
+                                                    <label class="col-sm-3 control-label" th:text="${item.get('description')}">asd</label>
+                                                    <div class="col-sm-9">
+                                                        <div class="radio" th:each="da : ${item.get('options')}" >
+                                                            <label >
+                                                                <input type="radio" name="optionsRadios4" value="asd"/>
+                                                                <th:block th:text="${da}"> </th:block>
+                                                             </label>
+                                                        </div>
+
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td>
+                                                <input onchange="showExampleRatioByLabel(this)" th:value="${item.get('originTip')}"  type="text" class="form-control" placeholder="选项说明"/>
+                                            </td>
+                                            <td>
+                                                <input onchange="showExampleRatio(this)" type="text" th:value="${item.get('originData')}"  class="form-control" placeholder="选项数据 请用;将选项分隔"/>
+                                            </td>
+                                            <td>
+                                                <button onclick="upTr(this)" class="btn btn-default">上移</button>
+                                                <button th:onclick="'downTr(this,'+${ruleStat.index}+')'" class="btn btn-default">下移</button>
+                                                <button onclick="deleteTr(this)" class="btn btn-warning">删除</button>
+                                            </td>
+                                        </tr>
+                                    </th:block>
+
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="box-footer">
+                        <button type="button" onclick="deleteRule(0)" class="btn btn-default">删除</button>
+                        <button type="button" class="btn btn-default" onclick="showModal(0)">
+                            本地预览
+                        </button>
+                        <button type="button" onclick="addNewOption()" class="btn btn-info pull-right">继续添加</button>
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+
+
+    <div class="modal fade" id="modal-default">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalBody">
+                    <form class="form-horizontal" id="formBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+
+    <div class="modal fade" id="modal-alert">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">预览</h4>
+                </div>
+                <div class="modal-body" id="modalAlertBody">
+                    <form class="form-horizontal" id="formAlertBody">
+
+                    </form>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
+                    <!--                    <button type="button" class="btn btn-primary"></button>-->
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+    </div>
+    <!-- /.modal -->
+</div>
+
+
+</body>
+</html>
+<!-- jQuery 3 -->
+<!--<script src="/static/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>-->
+<!-- Bootstrap 3.3.7 -->
+<script src="/static/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/select2/dist/js/select2.min.js"></script>
+<!-- InputMask -->
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.date.extensions.js"></script>
+<script src="/static/AdminLTE/plugins/input-mask/jquery.inputmask.extensions.js"></script>
+<!-- date-range-picker -->
+<script src="/static/AdminLTE/bower_components/moment/min/moment.min.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
+<!-- bootstrap datepicker -->
+<script src="/static/AdminLTE/bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
+<!-- bootstrap time picker -->
+<script src="/static/AdminLTE/plugins/timepicker/bootstrap-timepicker.min.js"></script>
+<!-- SlimScroll -->
+<script src="/static/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
+<!-- iCheck 1.0.1 -->
+<script src="/static/AdminLTE/plugins/iCheck/icheck.min.js"></script>
+<!-- FastClick -->
+<script src="/static/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script>
+<!-- AdminLTE App -->
+<!--<script src="/static/AdminLTE/dist/js/adminlte.min.js"></script>-->
+<!-- AdminLTE for demo purposes -->
+<script src="/static/AdminLTE/dist/js/demo.js"></script>
+<!-- add Paper js -->
+<script src="/static/js/addPaper.js"></script>
+<script src="/static/AdminLTE/bower_components/bootstrap-notify/dist/bootstrap-notify.min.js"></script>
+<script type="text/javascript">
+    var ruleId ;
+    var ratioIndex;
+
+
+
+    $(document).ready(function(){
+        $('[data-toggle="tooltip"]').tooltip();
+
+        //Initialize Select2 Elements
+        $('.select2').select2()
+
+        ruleId = 0;
+        ratioIndex =0 ;
+
+        // $('#testType').val(type)
+        $('#testType').val($('#testType').attr('value'))
+
+        //Date range picker with time picker
+        // $('#reservationtime').daterangepicker({ timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A' })
+        $('#reservationtime').daterangepicker({ timePicker: true, timePickerIncrement: 30, locale: { format: 'MM/DD/YYYY hh:mm A' }})
+
+
+
+
+        var taskListTable = $('#task-list').DataTable({
+            searching: true,
+            pageLength: 25
+        });
+    });
+
+
+
+
+
+</script>

+ 157 - 0
src/main/resources/templates/paper_list.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
+      layout:decorator="base">
+<head>
+    <link rel="stylesheet" href="/static/css/applications.css" type="text/css"/>
+    <!-- dataTables -->
+    <link rel="stylesheet" type="text/css"
+          href="/static/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css"/>
+    <!-- Select2 -->
+    <link rel="stylesheet" type="text/css" href="/static/AdminLTE/bower_components/select2/dist/css/select2.min.css"/>
+</head>
+<body>
+<div layout:fragment="mainbody">
+    <aside class="main-sidebar">
+        <section class="sidebar">
+            <div class="user-panel">
+                <div class="pull-left image">
+                    <img src="/static/images/avatar/avatar-admin.jpg" class="img-circle" alt="User Image" />
+                </div>
+                <div class="pull-left info">
+                    <p>Admin</p>
+                    <a href="#">
+                        <i class="fa fa-circle text-success"></i>
+                        Online
+                    </a>
+                </div>
+            </div>
+
+            <!-- Search form -->
+            <form action="#" method="get" class="sidebar-form">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search..." />
+                    <span class="input-group-btn">
+						<button type="submit" name="search" id="search-btn" class="btn btn-flat">
+							<i class="fa fa-search"></i>
+						</button>
+					</span>
+                </div>
+            </form>
+
+            <!-- Sidebar Menu -->
+            <ul class="sidebar-menu tree" data-widget="tree">
+                <!--                {% for task in app_list %}-->
+                <!--                <li th:each="task:${tasks}" >-->
+
+                <!--                    <a th:href="'/task_detail?examId='+${task.examId}+'&amp;caseId='+${task.caseId}" th:text="${task.name}">-->
+                <!--                        <i class="fa fa-link"></i>-->
+                <!--                    </a>-->
+                <!--                </li>-->
+                <!--                {% endfor %}-->
+
+                <li>
+                    <a href="/addPaper">
+                        <i class="glyphicon glyphicon-pencil"></i>
+                        <span>
+                            新建试卷
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/papers">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            试卷列表
+                        </span>
+                    </a>
+                </li>
+            </ul>
+        </section>
+    </aside>
+
+    <!-- Main Content -->
+    <div class="content-wrapper" style="min-height: 691px;">
+        <section class="content-header">
+            <h1>全部应用</h1>
+
+            <ol class="breadcrumb">
+                <li class="active">
+                    <a href="/home">
+                        <i class="fa fa-dashboard"></i>
+                        全部应用
+                    </a>
+                </li>
+            </ol>
+        </section>
+
+        <!-- Main Content -->
+        <section class="content container-fluid">
+            <!-- 			<div id="task-list-search" class="input-group col-md-6">
+                            <input type="text" class="form-control" placeholder="Search for application">
+                            <span class="input-group-btn">
+                                <button class="btn btn-default" type="button" id="task-search-btn">Search</button>
+                            </span>
+                        </div> -->
+
+            <table id="task-list" class="table table-striped text-center" style="margin-top: 10px">
+                <thead><tr>
+                    <!--<th></th>-->
+                    <th>试卷名称</th>
+                    <th>试卷类型</th>
+                    <th>创建时间</th>
+                    <!--<th>版本</th>-->
+                    <th>操作</th>
+                </tr></thead>
+                <tbody>
+                <th:block th:each="task : ${tasks}">
+
+                    <tr>
+                        <td><b><a href="#"  th:text="${task.get('name')}"></a></b></td>
+                        <!--<td><img th:src="${task.icon}" style="width: 25px; height: 25px;" /></td>-->
+                        <td><span  class="label label-info" th:text="${task.get('type')}" ></span></td>
+                        <!--                        <td><span  class="label label-info" th:text="${task.caseId}">题号</span></td>-->
+
+                        <td><span  class=" " th:text="${task.get('create_time')}" ></span></td>
+                        <td>
+                            <button th:onclick="'showYulan( \''+${task.get('id')}+'\' )'" class="btn btn-default">预览</button>
+                            <!--                            <button  class="btn btn-default">修改</button>-->
+                            <a type="button" class="btn btn-default" th:href="'/changePaper?id='+${task.get('id')}">修改</a>
+                            <button    class="btn btn-default">删除</button>
+                        </td>
+                        <!--<td th:text="${task.version}"></td>-->
+                        <!--                        <td th:if="${task.numOfUndeal > 0}"><span  class="label label-info">审核中</span></td>-->
+                        <!--                        <td th:if="${task.numOfUndeal == 0}"><span  class="label label-success">审核结束</span></td>-->
+                        <!--<td th:text="${task.startTime}">{{ task.print_start_time }}</td>-->
+                        <!--<td th:text="${task.endTime}">{{ task.print_end_time }}</td>-->
+
+                        <!--                        <td><span class="badge"><a th:href="'/task_detail?examId=' + ${task.examId} + '&amp;caseId=' + ${task.caseId}" style="color: #fff;" th:text="${task.numOfUndeal}"></a></span></td>-->
+                    </tr>
+                </th:block>
+                </tbody>
+            </table><!-- table -->
+        </section>
+    </div>
+</div>
+</body>
+</html>
+<script src="/static/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
+<script src="/static/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
+<script src="/static/AdminLTE/bower_components/select2/dist/js/select2.min.js"></script>
+
+<script type="text/javascript">
+    $(document).ready(function(){
+        $('[data-toggle="tooltip"]').tooltip();
+
+        var taskListTable = $('#task-list').DataTable({
+            searching: true,
+            pageLength: 25
+        });
+    });
+
+    showYulan = function ( id ) {
+        window.open('http://47.99.140.117:9090/report/job/'+id+'/'+1+'/0/1');
+        // 默认使用0号worker做展示页面。
+    }
+</script>

+ 1 - 4
src/main/resources/templates/task_detail.html

@@ -147,10 +147,7 @@
 
         <!-- Report List Table -->
         <div class="assign-div pull-right">
-            <button  id="import-btn" class="btn btn-sm btn-assign pull-right">
-                <i class="fa fa-coffee" style="margin-right: 3px;"></i>
-                <span>导入报告</span>
-            </button>
+
             <button th:if="${!aggregated}" id="assign-btn" class="btn btn-sm btn-assign pull-right">
                 <i class="fa fa-coffee" style="margin-right: 3px;"></i>
                 <span>自动融合</span>

+ 11 - 2
src/main/resources/templates/task_list.html

@@ -54,8 +54,17 @@
                     <a href="/addTask">
                         <i class="glyphicon glyphicon-pencil"></i>
                         <span>
-                新建任务
-            </span>
+                            新建任务
+                        </span>
+                    </a>
+                </li>
+
+                <li>
+                    <a href="/auditTasks">
+                        <i class="glyphicon glyphicon-tasks"></i>
+                        <span>
+                            众审任务列表
+                        </span>
                     </a>
                 </li>
             </ul>