Browse Source

修改所有文件路径构造与jsp显示字段逻辑

luoshi 4 years ago
parent
commit
88d476a36e
100 changed files with 2780 additions and 14522 deletions
  1. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  2. 78 31
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  3. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  4. 17 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java
  5. 61 25
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java
  6. 4 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/FileStore.java
  7. 26 38
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/DiskStore.java
  8. 22 20
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/OssStore.java
  9. 90 92
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  10. 82 89
      stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/PictureUrlBuilder.java
  11. 24 32
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  12. 17 22
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  13. 16 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  14. 23 33
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java
  15. 5 19
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  16. 9 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java
  17. 28 38
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  18. 5 7
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  19. 7 12
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  20. 10 17
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  21. 35 45
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java
  22. 9 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  23. 6 7
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java
  24. 13 30
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  25. 7 15
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  26. 8 15
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java
  27. 26 47
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java
  28. 34 77
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ImageCheckThread.java
  29. 25 45
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ExamSubjectVO.java
  30. 9 3
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java
  31. 7 7
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java
  32. 224 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java
  33. 4 8
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/LoginController.java
  34. 0 161
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java
  35. 13 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/exception/ApiException.java
  36. 0 87
      stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetDownloadThread.java
  37. 0 135
      stmms-web/src/main/java/cn/com/qmth/stmms/file/controller/FileController.java
  38. 5 15
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  39. 0 157
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java
  40. 131 130
      stmms-web/src/main/webapp/WEB-INF/views/include/trialDetail.jsp
  41. 82 85
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcess.jsp
  42. 77 79
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcessJson.jsp
  43. 79 82
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcess.jsp
  44. 74 76
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcessJson.jsp
  45. 231 228
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswerEdit.jsp
  46. 217 215
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudentEdit.jsp
  47. 7 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspected.jsp
  48. 106 105
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/jsonView.jsp
  49. 177 166
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperList.jsp
  50. 66 69
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcess.jsp
  51. 64 66
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcessJson.jsp
  52. 79 74
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanPackage.jsp
  53. 102 98
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreDetail.jsp
  54. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp
  55. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp
  56. 90 90
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentTrack.jsp
  57. 30 30
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/mark.jsp
  58. 13 13
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markJson.jsp
  59. 0 97
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markLeader.jsp
  60. 5 5
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp
  61. 9 9
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp
  62. 172 172
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp
  63. 0 6443
      stmms-web/src/main/webapp/static/mark-leader/css/bootstrap.css
  64. 0 1168
      stmms-web/src/main/webapp/static/mark-leader/css/style.css
  65. 0 21
      stmms-web/src/main/webapp/static/mark-leader/image-popover.html
  66. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/00001_F.jpg
  67. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/background.jpg
  68. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/button.png
  69. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/close.png
  70. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/down.png
  71. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/hp-close.png
  72. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/images-close.png
  73. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/off.png
  74. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/on.png
  75. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/up.png
  76. BIN
      stmms-web/src/main/webapp/static/mark-leader/images/未标题-2.psd
  77. BIN
      stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings-white.png
  78. BIN
      stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings.png
  79. 0 308
      stmms-web/src/main/webapp/static/mark-leader/index-select.html
  80. 0 291
      stmms-web/src/main/webapp/static/mark-leader/index.html
  81. 0 4
      stmms-web/src/main/webapp/static/mark-leader/js/jquery-ui.min.js
  82. 0 3
      stmms-web/src/main/webapp/static/mark-leader/js/jquery.min.js
  83. 0 0
      stmms-web/src/main/webapp/static/mark-leader/js/jquery.min.map
  84. 0 7
      stmms-web/src/main/webapp/static/mark-leader/js/jquery.mousewheel.min.js
  85. 0 482
      stmms-web/src/main/webapp/static/mark-leader/js/json2.js
  86. 0 604
      stmms-web/src/main/webapp/static/mark-leader/js/mark-control.js
  87. 0 38
      stmms-web/src/main/webapp/static/mark-leader/js/modules/answer-view.js
  88. 0 59
      stmms-web/src/main/webapp/static/mark-leader/js/modules/arbitration-process.js
  89. 0 47
      stmms-web/src/main/webapp/static/mark-leader/js/modules/back-process.js
  90. 0 105
      stmms-web/src/main/webapp/static/mark-leader/js/modules/change-name.js
  91. 0 50
      stmms-web/src/main/webapp/static/mark-leader/js/modules/flash-image-view.js
  92. 0 81
      stmms-web/src/main/webapp/static/mark-leader/js/modules/header-mark-status.js
  93. 0 80
      stmms-web/src/main/webapp/static/mark-leader/js/modules/heart-beat.js
  94. 0 38
      stmms-web/src/main/webapp/static/mark-leader/js/modules/idle-process.js
  95. 0 87
      stmms-web/src/main/webapp/static/mark-leader/js/modules/image-builder.js
  96. 0 37
      stmms-web/src/main/webapp/static/mark-leader/js/modules/image-server-selector.js
  97. 0 690
      stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-board.js
  98. 0 188
      stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-history.js
  99. 0 147
      stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-status.js
  100. 0 268
      stmms-web/src/main/webapp/static/mark-leader/js/modules/multi-image-view.js

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
@@ -99,6 +100,13 @@ public class Exam implements Serializable {
     @Column(name = "type", length = 16, nullable = false)
     private ExamType type;
 
+    /**
+     * 题卡类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "card_type", length = 16, nullable = true)
+    private FormatType cardType;
+
     public Integer getId() {
         return id;
     }
@@ -251,4 +259,11 @@ public class Exam implements Serializable {
         this.code = code;
     }
 
+    public FormatType getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(FormatType cardType) {
+        this.cardType = cardType;
+    }
 }

+ 78 - 31
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -1,7 +1,8 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import org.apache.commons.lang.StringUtils;
 
 import javax.persistence.*;
@@ -41,12 +42,6 @@ public class ExamSubject implements Serializable {
     @Column(name = "upload_count")
     private Integer uploadCount;
 
-    @Column(name = "has_paper")
-    private boolean hasPaper;
-
-    @Column(name = "has_answer")
-    private boolean hasAnswer;
-
     @Column(name = "remark")
     private String remark;
 
@@ -68,12 +63,39 @@ public class ExamSubject implements Serializable {
     @Column(name = "sheet_config", nullable = true)
     private String sheetConfig;
 
+    /**
+     * 题卡类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "card_type", length = 16, nullable = true)
+    private FormatType cardType;
+
+    /**
+     * 试卷文件类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "paper_file_type", length = 16, nullable = true)
+    private FormatType paperFileType;
+
+    /**
+     * 标答文件类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "answer_file_type", length = 16, nullable = true)
+    private FormatType answerFileType;
+
     /**
      * 大题数量
      */
     @Transient
     private long groupCount;
 
+    @Transient
+    private String paperUrl;
+
+    @Transient
+    private String answerUrl;
+
     public ExamSubject() {
         this.pk = new ExamSubjectPK();
     }
@@ -151,14 +173,6 @@ public class ExamSubject implements Serializable {
         return sb.toString();
     }
 
-    public String getPaperUrl() {
-        return PictureUrlBuilder.getPaperUrl(getExamId(), getCode());
-    }
-
-    public String getAnswerUrl() {
-        return PictureUrlBuilder.getAnswerUrl(getExamId(), getCode());
-    }
-
     public String getLevel() {
         return level;
     }
@@ -191,22 +205,6 @@ public class ExamSubject implements Serializable {
         this.groupCount = groupCount;
     }
 
-    public boolean isHasPaper() {
-        return hasPaper;
-    }
-
-    public void setHasPaper(boolean hasPaper) {
-        this.hasPaper = hasPaper;
-    }
-
-    public boolean isHasAnswer() {
-        return hasAnswer;
-    }
-
-    public void setHasAnswer(boolean hasAnswer) {
-        this.hasAnswer = hasAnswer;
-    }
-
     public boolean isNeedCalculate() {
         return needCalculate;
     }
@@ -238,4 +236,53 @@ public class ExamSubject implements Serializable {
     public List<PictureConfigItem> getSheetConfigList() {
         return PictureConfigItem.parse(sheetConfig);
     }
+
+    public FormatType getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(FormatType cardType) {
+        this.cardType = cardType;
+    }
+
+    public FormatType getPaperFileType() {
+        return paperFileType;
+    }
+
+    public void setPaperFileType(FormatType paperFileType) {
+        this.paperFileType = paperFileType;
+    }
+
+    public FormatType getAnswerFileType() {
+        return answerFileType;
+    }
+
+    public void setAnswerFileType(FormatType answerFileType) {
+        this.answerFileType = answerFileType;
+    }
+
+    public String getPaperUrl() {
+        return paperUrl;
+    }
+
+    public void setPaperUrl(String paperUrl) {
+        this.paperUrl = paperUrl;
+    }
+
+    public String getAnswerUrl() {
+        return answerUrl;
+    }
+
+    public void setAnswerUrl(String answerUrl) {
+        this.answerUrl = answerUrl;
+    }
+
+    public void setPaperAnswerUrl(FileService fileService) {
+        if (paperFileType != null) {
+            paperUrl = fileService.getPaperUri(getExamId(), getCode(), paperFileType);
+        }
+        if (answerFileType != null) {
+            answerUrl = fileService.getAnswerUri(getExamId(), getCode(), answerFileType);
+        }
+    }
 }

+ 0 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -132,8 +132,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 subject.setSubjectiveScore(0d);
                 subject.setTotalScore(0d);
                 subject.setUploadCount(0);
-                subject.setHasAnswer(false);
-                subject.setHasPaper(false);
                 subject.setRemark(es.getRemark());
             } else {
                 subject.setLevel(es.getLevel());
@@ -190,8 +188,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             subject.setSubjectiveScore(0d);
             subject.setTotalScore(0d);
             subject.setUploadCount(0);
-            subject.setHasAnswer(false);
-            subject.setHasPaper(false);
             subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
             subjectService.save(subject);
         } else {

+ 17 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java

@@ -9,19 +9,21 @@ public interface FileService {
 
     String getFileServer();
 
-    boolean uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index);
+    void uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index) throws Exception;
 
-    boolean uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index);
+    void uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index) throws Exception;
 
-    boolean uploadJson(InputStream ins, String md5, int examId, String secretNumber);
+    void uploadJson(InputStream ins, String md5, int examId, String secretNumber) throws Exception;
 
-    boolean uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index);
+    void uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index) throws Exception;
 
-    boolean uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type);
+    void uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
 
-    boolean uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type);
+    void uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
 
-    boolean uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type);
+    void uploadCard(InputStream ins, String md5, int examId, FormatType type) throws Exception;
+
+    void uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
 
     String getSheetUri(int examId, String examNumber, int index);
 
@@ -41,5 +43,13 @@ public interface FileService {
 
     String getAnswerUri(int examId, String subjectCode, FormatType type);
 
+    String getCardUri(int examId, FormatType type);
+
     String getCardUri(int examId, String subjectCode, FormatType type);
+
+    boolean sheetExist(int examId, String examNumber, int index);
+
+    boolean sliceExist(int examId, String secreNumber, int index);
+
+    boolean jsonExist(int examId, String secreNumber);
 }

+ 61 - 25
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java

@@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.LinkedList;
 import java.util.List;
@@ -20,7 +19,7 @@ import java.util.List;
 @Service("fileService")
 public class FileServiceImpl implements FileService, InitializingBean {
 
-    private static final String EMPTY_SUBJECT_CODE_PLACEHOLDER = "common";
+    private static final String COMMON_PLACEHOLDER = "common";
 
     private static final int DEFAULT_SUFFIX_LENGTH = 3;
 
@@ -63,42 +62,59 @@ public class FileServiceImpl implements FileService, InitializingBean {
     }
 
     @Override
-    public boolean uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index) {
-        return store.write(getSheetUri(examId, examNumber, index), ins, md5);
+    public void uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index) throws Exception {
+        store.write(getSheetUri(examId, examNumber, index), ins, md5);
     }
 
     @Override
-    public boolean uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index) {
-        return store.write(getSliceUri(examId, secretNumber, index), ins, md5);
+    public void uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index) throws Exception {
+        store.write(getSliceUri(examId, secretNumber, index), ins, md5);
     }
 
     @Override
-    public boolean uploadJson(InputStream ins, String md5, int examId, String secretNumber) {
-        return store.write(getJsonUri(examId, secretNumber), ins, md5);
+    public void uploadJson(InputStream ins, String md5, int examId, String secretNumber) throws Exception {
+        store.write(getJsonUri(examId, secretNumber), ins, md5);
     }
 
     @Override
-    public boolean uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index) {
-        return store.write(getPackageUri(examId, packageCode, index), ins, md5);
+    public void uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index) throws Exception {
+        store.write(getPackageUri(examId, packageCode, index), ins, md5);
     }
 
     @Override
-    public boolean uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type) {
-        return checkFormat(type, FormatType.PDF, FormatType.JSON) && store
-                .write(getPaperUri(examId, subjectCode, type), ins, md5);
+    public void uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.PDF, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getPaperUri(examId, subjectCode, type), ins, md5);
+
     }
 
     @Override
-    public boolean uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type) {
-        return checkFormat(type, FormatType.PDF, FormatType.JSON) && store
-                .write(getAnswerUri(examId, subjectCode, type), ins, md5);
+    public void uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.PDF, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getAnswerUri(examId, subjectCode, type), ins, md5);
     }
 
     @Override
-    public boolean uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type) {
-        return checkFormat(type, FormatType.ZIP, FormatType.JSON) && store
-                .write(getCardUri(examId, subjectCode != null ? subjectCode : EMPTY_SUBJECT_CODE_PLACEHOLDER, type),
-                        ins, md5);
+    public void uploadCard(InputStream ins, String md5, int examId, FormatType type) throws Exception {
+        if (!checkFormat(type, FormatType.ZIP, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getCardUri(examId, COMMON_PLACEHOLDER, type), ins, md5);
+    }
+
+    @Override
+    public void uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.ZIP, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getCardUri(examId, subjectCode, type), ins, md5);
     }
 
     @Override
@@ -161,8 +177,27 @@ public class FileServiceImpl implements FileService, InitializingBean {
 
     @Override
     public String getCardUri(int examId, String subjectCode, FormatType type) {
-        return FileType.ANSWER
-                .getPath(examId, subjectCode != null ? subjectCode : EMPTY_SUBJECT_CODE_PLACEHOLDER, type.getExtName());
+        return FileType.ANSWER.getPath(examId, subjectCode, type.getExtName());
+    }
+
+    @Override
+    public String getCardUri(int examId, FormatType type) {
+        return FileType.ANSWER.getPath(examId, COMMON_PLACEHOLDER, type.getExtName());
+    }
+
+    @Override
+    public boolean sheetExist(int examId, String examNumber, int index) {
+        return store.exist(getSheetUri(examId, examNumber, index));
+    }
+
+    @Override
+    public boolean sliceExist(int examId, String secretNumber, int index) {
+        return store.exist(getSliceUri(examId, secretNumber, index));
+    }
+
+    @Override
+    public boolean jsonExist(int examId, String secretNumber) {
+        return store.exist(getJsonUri(examId, secretNumber));
     }
 
     @Override
@@ -182,7 +217,7 @@ public class FileServiceImpl implements FileService, InitializingBean {
         }
     }
 
-    public static void main(String[] args) throws FileNotFoundException {
+    public static void main(String[] args) throws Exception {
         FileServiceImpl service = new FileServiceImpl();
         service.fileServer = "123";
         service.fileStore = "oss://LTAI4FnJ2pgV6aGceYcCkeEi:ktrMEVE7PfoxRPeJUPDFeygOIH4aU7@qmth-test.oss-cn-shenzhen.aliyuncs.com";
@@ -190,7 +225,8 @@ public class FileServiceImpl implements FileService, InitializingBean {
 
         //DiskStore ds = new DiskStore("/Users/luoshi/Downloads");
         //String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(ds.read("123456.jpg")));
-        System.out.println(service.uploadSheet(new FileInputStream("/Users/luoshi/Downloads/123456.jpg"),
-                "7e9b368ff5da88ff2413c2c9083c481d", 1, "123456", 1));
+        service.uploadSheet(new FileInputStream("/Users/luoshi/Downloads/123456.jpg"),
+                "7e9b368ff5da88ff2413c2c9083c481d", 1, "123456", 1);
+        System.out.println("success");
     }
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/FileStore.java

@@ -4,7 +4,9 @@ import java.io.InputStream;
 
 public interface FileStore {
 
-    boolean write(String path, InputStream ins, String md5);
+    void write(String path, InputStream ins, String md5) throws Exception;
 
-    byte[] read(String path);
+    byte[] read(String path) throws Exception;
+
+    boolean exist(String path);
 }

+ 26 - 38
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/DiskStore.java

@@ -31,54 +31,42 @@ public class DiskStore implements FileStore {
     }
 
     @Override
-    public boolean write(String path, InputStream ins, String md5) {
-        FileOutputStream ous = null;
+    public void write(String path, InputStream ins, String md5) throws Exception {
         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-        try {
-            IOUtils.copy(ins, buffer);
-            byte[] data = buffer.toByteArray();
-            if (!BinaryUtil.encodeMD5(data).equalsIgnoreCase(md5)) {
-                throw new RuntimeException("md5 validate faile");
-            }
-            File target = new File(rootDir, path);
-            target.getParentFile().mkdirs();
-            ous = new FileOutputStream(target);
-            ous.write(data);
-            ous.close();
-            return true;
-        } catch (Exception e) {
-            log.error("write file error:" + path, e);
-            return false;
-        } finally {
-            IOUtils.closeQuietly(ous);
-            IOUtils.closeQuietly(buffer);
+        IOUtils.copy(ins, buffer);
+        byte[] data = buffer.toByteArray();
+        if (!BinaryUtil.encodeMD5(data).equalsIgnoreCase(md5)) {
+            throw new RuntimeException("md5 validate faile");
         }
+        File target = new File(rootDir, path);
+        target.getParentFile().mkdirs();
+        FileOutputStream ous = new FileOutputStream(target);
+        ous.write(data);
+        IOUtils.closeQuietly(ous);
     }
 
     @Override
-    public byte[] read(String path) {
+    public byte[] read(String path) throws Exception {
         File file = new File(rootDir, path);
         if (file.exists() && file.isFile()) {
-            FileInputStream ins = null;
-            FileChannel channel = null;
-            try {
-                ins = new FileInputStream(file);
-                channel = ins.getChannel();
-                ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
-                while ((channel.read(byteBuffer)) > 0) {
-                    //
-                }
-                return byteBuffer.array();
-            } catch (Exception e) {
-                log.error("read file error:" + path, e);
-                return null;
-            } finally {
-                IOUtils.closeQuietly(ins);
-                IOUtils.closeQuietly(channel);
+            FileInputStream ins = new FileInputStream(file);
+            FileChannel channel = ins.getChannel();
+            ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
+            while ((channel.read(byteBuffer)) > 0) {
+                //
             }
+            IOUtils.closeQuietly(ins);
+            IOUtils.closeQuietly(channel);
+            return byteBuffer.array();
         } else {
-            return null;
+            throw new RuntimeException("read file unexist:" + path);
         }
     }
 
+    @Override
+    public boolean exist(String path) {
+        File file = new File(rootDir, path);
+        return file.exists() && file.isFile();
+    }
+
 }

+ 22 - 20
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/OssStore.java

@@ -56,31 +56,33 @@ public class OssStore implements FileStore {
     }
 
     @Override
-    public boolean write(String path, InputStream ins, String md5) {
-        try {
-            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessSecret);
-            ObjectMetadata metadata = new ObjectMetadata();
-            metadata.setContentMD5(BinaryUtil.toBase64String(Encodes.decodeHex(md5)));
-            ossClient.putObject(bucket, path, ins, metadata);
-            ossClient.shutdown();
-            return true;
-        } catch (Exception e) {
-            log.error("write file error", e);
-            return false;
-        }
+    public void write(String path, InputStream ins, String md5) throws Exception {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessSecret);
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setContentMD5(BinaryUtil.toBase64String(Encodes.decodeHex(md5)));
+        ossClient.putObject(bucket, path, ins, metadata);
+        ossClient.shutdown();
     }
 
     @Override
-    public byte[] read(String path) {
+    public byte[] read(String path) throws Exception {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKey);
+        OSSObject ossObject = ossClient.getObject(bucket, path);
+        ByteArrayOutputStream ous = new ByteArrayOutputStream();
+        IOUtils.copy(ossObject.getObjectContent(), ous);
+        ossClient.shutdown();
+        return ous.toByteArray();
+    }
+
+    @Override
+    public boolean exist(String path) {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKey);
         try {
-            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKey);
-            OSSObject ossObject = ossClient.getObject(bucket, path);
-            ByteArrayOutputStream ous = new ByteArrayOutputStream();
-            IOUtils.copy(ossObject.getObjectContent(), ous);
-            return ous.toByteArray();
+            return ossClient.doesObjectExist(bucket, path);
         } catch (Exception e) {
-            log.error("read file error", e);
-            return null;
+            return false;
+        } finally {
+            ossClient.shutdown();
         }
     }
 }

+ 90 - 92
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -1,56 +1,28 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.mark.model.*;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.*;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrationDTO;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
-import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.model.SpecialTagDTO;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-import cn.com.qmth.stmms.biz.mark.model.TrackDTO;
-import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
-import cn.com.qmth.stmms.biz.mark.model.TrialTag;
-import cn.com.qmth.stmms.biz.mark.model.TrialTrack;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
-import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.biz.mark.service.TrialService;
-import cn.com.qmth.stmms.biz.user.service.UserService;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * 评卷任务服务实现
- * 
+ *
  * @author LS
- * 
  */
 @Service("taskService")
 public class TaskServiceImpl implements TaskService {
@@ -75,9 +47,6 @@ public class TaskServiceImpl implements TaskService {
     @Autowired
     private MarkSpecialTagService markSpecialTagService;
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     private MarkerService markerService;
 
@@ -85,11 +54,14 @@ public class TaskServiceImpl implements TaskService {
     private TrialService trialService;
 
     @Autowired
-    private ExamService examService;
+    private ExamSubjectService subjectService;
 
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private FileService fileService;
+
     @Override
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
         List<Task> list = new LinkedList<Task>();
@@ -104,24 +76,28 @@ public class TaskServiceImpl implements TaskService {
 
     @Override
     public Task build(ArbitrateHistory history, MarkGroup group) {
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
         ExamStudent student = studentService.findByExamIdAndExamNumber(history.getExamId(), history.getExamNumber());
         List<MarkLibrary> libraryList = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
-        Integer campusId = libraryList.get(0).getCampusId();
-
         Task task = new Task();
         task.setExist(true);
         task.setStudentId(student.getId());
         task.setLibraryId(history.getId());
         task.setMarkStepList(buildMarkStep(group, null));
-        task.setPictureUrls(PictureUrlBuilder.getSliceUrls(student.getExamId(), campusId, student.getSubjectCode(),
-                student.getExamNumber(), student.getSliceCount()));
+        // TODO examNumber->secretNumber
+        task.setPictureUrls(
+                fileService.getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder.getSheetUrls(student.getExamId(), campusId, student.getSubjectCode(),
-                student.getExamNumber(), student.getSheetCount()));
-        task.setJsonUrl(PictureUrlBuilder.getAnswerJson(student.getExamId(), student.getSubjectCode(),
-                student.getPaperType(), student.getExamNumber()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(student.getExamId(), student.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(student.getExamId(), student.getSubjectCode()));
+        // TODO examNumber->secretNumber
+        task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getExamNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
         task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         task.setMarkTime(history.getUpdateTime());
         // 构造仲裁信息
@@ -146,8 +122,10 @@ public class TaskServiceImpl implements TaskService {
 
     @Override
     public Task build(MarkLibrary library) {
+        ExamSubject subject = subjectService.find(library.getExamId(), library.getSubjectCode());
         ExamStudent student = studentService.findByExamIdAndExamNumber(library.getExamId(), library.getExamNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+
         Task task = new Task();
         task.setExist(true);
         task.setStatusValue(MarkStatus.FORMAL.getValue());
@@ -156,16 +134,21 @@ public class TaskServiceImpl implements TaskService {
         // 正评显示考生编号
         task.setStudentNumber(library.getStudentId().toString());
         task.setMarkStepList(buildMarkStep(group, library.getId()));
-        task.setPictureUrls(PictureUrlBuilder.getSliceUrls(library.getExamId(), library.getCampusId(),
-                library.getSubjectCode(), library.getExamNumber(), student.getSliceCount()));
+        // TODO examNumber->secretNumber
+        task.setPictureUrls(
+                fileService.getSliceUris(library.getExamId(), library.getExamNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder.getSheetUrls(library.getExamId(), library.getCampusId(),
-                library.getSubjectCode(), library.getExamNumber(), student.getSheetCount()));
-        task.setJsonUrl(PictureUrlBuilder.getAnswerJson(library.getExamId(), library.getSubjectCode(),
-                student.getPaperType(), student.getExamNumber()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(library.getExamId(), library.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(library.getExamId(), library.getSubjectCode()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        // TODO examNumber->secretNumber
+        task.setJsonUrl(fileService.getJsonUri(library.getExamId(), library.getExamNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         task.setMarkTime(library.getMarkerTime());
         task.setTagList(getMarkSpecialTagList(library.getId()));
         if (library.getMarkerScore() != null) {
@@ -183,8 +166,10 @@ public class TaskServiceImpl implements TaskService {
 
     @Override
     public Task build(TrialLibrary library, TrialHistory history) {
-        ExamStudent student = studentService.findById(library.getStudentId());
+        ExamSubject subject = subjectService.find(library.getExamId(), library.getSubjectCode());
+        ExamStudent student = studentService.findByExamIdAndExamNumber(library.getExamId(), library.getExamNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+
         Task task = new Task();
         task.setExist(true);
         task.setStatusValue(MarkStatus.TRIAL.getValue());
@@ -194,16 +179,21 @@ public class TaskServiceImpl implements TaskService {
         task.setStudentId(library.getStudentId());
         task.setLibraryId(library.getId());
         task.setMarkStepList(buildTrialStep(group, history));
-        task.setPictureUrls(PictureUrlBuilder.getSliceUrls(library.getExamId(), library.getCampusId(),
-                library.getSubjectCode(), library.getExamNumber(), student.getSliceCount()));
+        // TODO examNumber->secretNumber
+        task.setPictureUrls(
+                fileService.getSliceUris(library.getExamId(), library.getExamNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder.getSheetUrls(library.getExamId(), library.getCampusId(),
-                library.getSubjectCode(), library.getExamNumber(), student.getSheetCount()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(library.getExamId(), library.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(library.getExamId(), library.getSubjectCode()));
-        task.setJsonUrl(PictureUrlBuilder.getAnswerJson(library.getExamId(), library.getSubjectCode(),
-                student.getPaperType(), student.getExamNumber()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        // TODO examNumber->secretNumber
+        task.setJsonUrl(fileService.getJsonUri(library.getExamId(), library.getExamNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         if (history != null) {
             task.setMarkTime(history.getMarkerTime());
             task.setTotalScore(history.getMarkerScore());
@@ -215,8 +205,9 @@ public class TaskServiceImpl implements TaskService {
 
     private List<MarkStepDTO> buildMarkStep(MarkGroup group, Integer libraryId) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
-                group.getSubjectCode(), false, group.getNumber());
+        List<ExamQuestion> sList = questionService
+                .findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
+                        group.getNumber());
         int number = 0;
         for (ExamQuestion question : sList) {
             number++;
@@ -239,8 +230,9 @@ public class TaskServiceImpl implements TaskService {
 
     private List<MarkStepDTO> buildTrialStep(MarkGroup group, TrialHistory history) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
-                group.getSubjectCode(), false, group.getNumber());
+        List<ExamQuestion> sList = questionService
+                .findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
+                        group.getNumber());
         int number = 0;
         for (ExamQuestion question : sList) {
             number++;
@@ -312,22 +304,27 @@ public class TaskServiceImpl implements TaskService {
     @Override
     public Task build(Integer studentId) {
         ExamStudent student = studentService.findById(studentId);
+        ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
         Task task = new Task();
         task.setExist(true);
         task.setStudentId(studentId);
         // task.setLibraryId(studentId);
         task.setMarkStepList(buildMarkStep(student));
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        task.setPictureUrls(PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                student.getSubjectCode(), student.getExamNumber(), student.getSliceCount()));
-        task.setPictureConfig(buildPictureConfig(student.getSliceCount()));
-        task.setSheetUrls(PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(),
-                student.getExamNumber(), student.getSheetCount()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(student.getExamId(), student.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(student.getExamId(), student.getSubjectCode()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        // TODO examNumber->secretNumber
+        task.setPictureUrls(
+                fileService.getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount()));
+        // TODO examNumber->secretNumber
+        task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getExamNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore());
         task.setBack(true);
-
         return task;
     }
 
@@ -341,8 +338,8 @@ public class TaskServiceImpl implements TaskService {
 
     private List<MarkStepDTO> buildMarkStep(ExamStudent student) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
-        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
+        List<ExamQuestion> sList = questionService
+                .findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
         int number = 0;
         for (ExamQuestion question : sList) {
             number++;
@@ -378,8 +375,9 @@ public class TaskServiceImpl implements TaskService {
                 stepTask.setBack(task.isBack());
                 stepTask.setLibraryId(library.getId());
                 stepTask.setHeaderId(task.getHeaderId());
-                List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                        library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
+                List<ExamQuestion> sList = questionService
+                        .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(), library.getSubjectCode(),
+                                false, library.getGroupNumber());
                 if (start == end) {
                     end = end + sList.size() * 2 - 1;
                 } else {

+ 82 - 89
stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/PictureUrlBuilder.java

@@ -1,16 +1,9 @@
 package cn.com.qmth.stmms.common.utils;
 
-import java.text.MessageFormat;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
 /**
  * 答题卡扫描大图URL构造工具类
- * 
+ *
  * @author LS
- * 
  */
 public class PictureUrlBuilder {
 
@@ -36,85 +29,85 @@ public class PictureUrlBuilder {
 
     private static final String JSON_SUFFIX = "json";
 
-    public static List<String> getInnerSheetUrls(int examId, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotBlank(examNumber) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(INNER_SHEET_URL_TEMPLATE, String.valueOf(examId), examNumber,
-                        String.valueOf(i)));
-            }
-        }
-        return list;
-    }
-
-    public static List<String> getSheetUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getSheetUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
-        return MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
-                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
-    }
-
-    public static String getSliceUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
-        return MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
-                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
-    }
-
-    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber,
-            List<String> picNumbers) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && picNumbers != null) {
-            for (String picNumber : picNumbers) {
-                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(picNumber), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getAnswerUrl(int examId, String subjectCode) {
-        return MessageFormat.format(ANSWER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
-    }
-
-    public static String getPaperUrl(int examId, String subjectCode) {
-        return MessageFormat.format(PAPER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
-    }
-
-    public static List<String> getPackageUrls(int examId, String packageCode, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(packageCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(PACKAGE_URL_TEMPLATE, String.valueOf(examId), packageCode,
-                        String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getAnswerJson(Integer examId, String subjectCode, String paperType, String examNumber) {
-        if (StringUtils.isNotEmpty(paperType)) {
-            return MessageFormat.format(JSON_PAPER_TYPE_URL_TEMPLATE, String.valueOf(examId), subjectCode, paperType,
-                    examNumber, JSON_SUFFIX);
-        }
-        return MessageFormat.format(JSON_URL_TEMPLATE, String.valueOf(examId), subjectCode, examNumber, JSON_SUFFIX);
-    }
+    //    public static List<String> getInnerSheetUrls(int examId, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotBlank(examNumber) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(INNER_SHEET_URL_TEMPLATE, String.valueOf(examId), examNumber,
+    //                        String.valueOf(i)));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static List<String> getSheetUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getSheetUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
+    //        return MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
+    //                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
+    //    }
+    //
+    //    public static String getSliceUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
+    //        return MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
+    //                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
+    //    }
+    //
+    //    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber,
+    //            List<String> picNumbers) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && picNumbers != null) {
+    //            for (String picNumber : picNumbers) {
+    //                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(picNumber), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getAnswerUrl(int examId, String subjectCode) {
+    //        return MessageFormat.format(ANSWER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
+    //    }
+    //
+    //    public static String getPaperUrl(int examId, String subjectCode) {
+    //        return MessageFormat.format(PAPER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
+    //    }
+    //
+    //    public static List<String> getPackageUrls(int examId, String packageCode, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(packageCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(PACKAGE_URL_TEMPLATE, String.valueOf(examId), packageCode,
+    //                        String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getAnswerJson(Integer examId, String subjectCode, String paperType, String examNumber) {
+    //        if (StringUtils.isNotEmpty(paperType)) {
+    //            return MessageFormat.format(JSON_PAPER_TYPE_URL_TEMPLATE, String.valueOf(examId), subjectCode, paperType,
+    //                    examNumber, JSON_SUFFIX);
+    //        }
+    //        return MessageFormat.format(JSON_URL_TEMPLATE, String.valueOf(examId), subjectCode, examNumber, JSON_SUFFIX);
+    //    }
 }

+ 24 - 32
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java

@@ -1,25 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
@@ -28,10 +8,25 @@ import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/admin/exam/check/answer")
@@ -49,8 +44,8 @@ public class AnswerCheckController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
-    @Value("${sheet.image.server}")
-    private String sheetServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "识别结果检查", type = LogType.QUERY)
     @RequestMapping
@@ -101,7 +96,7 @@ public class AnswerCheckController extends BaseExamController {
                 query.setPageNumber(query.getPageNumber() + 1);
                 query = studentService.findByQuery(query);
             }
-            view.addObject("sheetServer", sheetServer);
+            view.addObject("fileServer", fileService.getFileServer());
             view.addObject("ids", StringUtils.join(ids, ","));
             return view;
         } else {
@@ -143,17 +138,14 @@ public class AnswerCheckController extends BaseExamController {
         result.accumulate("subjectiveScore", student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0);
         result.accumulate("upload", student.isUpload());
         result.accumulate("absent", student.isAbsent());
-
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        result.accumulate(
-                "sheetUrls",
-                PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(),
-                        student.getExamNumber(), student.getSheetCount()));
+        result.accumulate("sheetUrls",
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
 
         JSONArray array = new JSONArray();
         Map<Integer, String> titles = new HashMap<Integer, String>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
-                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<String> answers = student.getAnswerList();
         if (questions.isEmpty()) {
             // 未设置客观题或无客观题

+ 17 - 22
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -24,7 +25,6 @@ import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.stereotype.Controller;
@@ -67,17 +67,8 @@ public class ArbitrateController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
@@ -131,14 +122,16 @@ public class ArbitrateController extends BaseExamController {
         if (group == null) {
             return "redirect:/admin/exam/arbitrate";
         }
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/arbitrate";
+        }
         releaseByUser(wu.getUser().getId());
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
         model.addAttribute("history", history);
-        model.addAttribute("jsonServer", jsonServer);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
             return "modules/exam/arbitrateSingleProcessJson";
@@ -159,13 +152,15 @@ public class ArbitrateController extends BaseExamController {
         if (group == null) {
             return "redirect:/admin/exam/arbitrate";
         }
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/arbitrate";
+        }
         releaseByUser(wu.getUser().getId());
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
-        model.addAttribute("jsonServer", jsonServer);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
             return "modules/exam/arbitrateBatchProcessJson";

+ 16 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -1,14 +1,16 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.enums.CheckType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,14 +18,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.enums.CheckType;
-import cn.com.qmth.stmms.common.enums.LogType;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 @Controller
 @RequestMapping("/admin/exam/check/student")
@@ -35,8 +33,8 @@ public class CheckStudentController extends BaseExamController {
     @Autowired
     private CheckStudentService checkStudentService;
 
-    @Value("${sheet.image.server}")
-    private String sheetServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "人工确认查询", type = LogType.QUERY)
     @RequestMapping
@@ -73,7 +71,7 @@ public class CheckStudentController extends BaseExamController {
             for (CheckStudent student : list) {
                 ids.add(student.getStudentId());
             }
-            view.addObject("sheetServer", sheetServer);
+            view.addObject("fileServer", fileService.getFileServer());
             view.addObject("ids", StringUtils.join(ids, ","));
             return view;
         } else {

+ 23 - 33
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java

@@ -1,14 +1,21 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
+import cn.com.qmth.stmms.admin.thread.DataSyncThread;
+import cn.com.qmth.stmms.admin.utils.HttpUtil;
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,24 +29,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
-import cn.com.qmth.stmms.admin.thread.DataSyncThread;
-import cn.com.qmth.stmms.admin.utils.HttpUtil;
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.exam.model.DataSync;
-import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.ExportExcel;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
 
 @Controller
 @RequestMapping("/admin/exam/data/sync")
@@ -69,6 +62,9 @@ public class DataSyncController extends BaseExamController {
     @Autowired
     private DataSyncService dataSyncService;
 
+    @Autowired
+    private FileService fileService;
+
     @Value("${qmth.examcloud.host}")
     private String host;
 
@@ -96,12 +92,6 @@ public class DataSyncController extends BaseExamController {
     @Value("${qmth.examcloud.pageSize}")
     private Integer pageSize;
 
-    @Value("${file.root}")
-    private String baseDir;
-
-    @Autowired
-    private UpyunConfig config;
-
     @RequestMapping()
     public ModelAndView index(HttpServletRequest request, @RequestParam Integer examId) {
         if (examId != null) {
@@ -133,8 +123,8 @@ public class DataSyncController extends BaseExamController {
     public String save(HttpServletRequest request, DataSync dataSync, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         if (lockService.trylock(LockType.DATA_SYNC, examId)) {
-            DataSyncThread thread = new DataSyncThread(dataSync, pageSize, baseDir, config, lockService,
-                    dataSyncService, examService, studentService, subjectService);
+            DataSyncThread thread = new DataSyncThread(dataSync, pageSize, lockService, dataSyncService, examService,
+                    studentService, subjectService, fileService);
             taskExecutor.submit(thread);
         }
         dataSync = dataSyncService.findByExamId(examId);

+ 5 - 19
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -2,8 +2,6 @@ package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
@@ -13,6 +11,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.Logging;
@@ -21,8 +20,6 @@ import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.session.service.SessionService;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JsonConfig;
@@ -31,7 +28,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -63,13 +59,7 @@ public class ExamController extends BaseExamController {
     private ExamSubjectService examSubjectService;
 
     @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private SessionService sessionService;
-
-    @Value("${sheet.image.server}")
-    private String imageServer;
+    private FileService fileService;
 
     @Logging(menu = "查询考试", type = LogType.QUERY)
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -219,7 +209,7 @@ public class ExamController extends BaseExamController {
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             String sheetConfig = subject != null ? subject.getSheetConfig() : exam.getSheetConfig();
             model.addAttribute("pictureConfig", buildPictureConfig(sheetConfig));
-            model.addAttribute("imageServer", imageServer);
+            model.addAttribute("fileServer", fileService.getFileServer());
             return "modules/mark/picConfig";
         } else {
             model.addAttribute("message", "参数有误");
@@ -227,11 +217,7 @@ public class ExamController extends BaseExamController {
         }
     }
 
-    private List<String> buildPicUrl(ExamStudent examStudent) {
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder
-                .getSheetUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
-                        examStudent.getExamNumber(), examStudent.getSheetCount());
-        return picUrls;
+    private List<String> buildPicUrl(ExamStudent student) {
+        return fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount());
     }
 }

+ 9 - 13
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java

@@ -2,12 +2,13 @@ package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.admin.dto.ExceptionStudentDTO;
 import cn.com.qmth.stmms.admin.thread.ImageCheckThread;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -17,7 +18,6 @@ import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,21 +35,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
 public class ImageCheckController extends BaseExamController {
 
     @Autowired
-    private CampusService campusService;
+    private ExamStudentService studentService;
 
     @Autowired
-    private ExamStudentService studentService;
+    private FileService fileService;
 
     @Autowired
-    private UpyunConfig config;
+    private ExamService examService;
 
     @Qualifier("task-executor")
     @Autowired
     private AsyncTaskExecutor taskExecutor;
 
-    @Value("${file.root}")
-    private String baseDir;
-
     private AtomicBoolean running = new AtomicBoolean(false);
 
     @Logging(menu = "图片检查", type = LogType.QUERY)
@@ -79,10 +76,9 @@ public class ImageCheckController extends BaseExamController {
     @RequestMapping("/run")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView checkImage(HttpServletRequest request) {
-        int examId = getSessionExamId(request);
-        if (running.compareAndSet(false, true) == true) {
-            ImageCheckThread thread = new ImageCheckThread(examId, running, config, baseDir, studentService,
-                    campusService);
+        Exam exam = examService.findById(getSessionExamId(request));
+        if (running.compareAndSet(false, true)) {
+            ImageCheckThread thread = new ImageCheckThread(exam, studentService, fileService, running);
             taskExecutor.submit(thread);
         }
         return new ModelAndView("redirect:/admin/exam/check/image");

+ 28 - 38
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,31 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -35,6 +9,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -52,8 +27,22 @@ import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
@@ -88,12 +77,12 @@ public class InspectedController extends BaseExamController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private FileService fileService;
+
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
     @Logging(menu = "开始复核", type = LogType.QUERY)
     @RequestMapping("/start")
     @ResponseBody
@@ -132,7 +121,7 @@ public class InspectedController extends BaseExamController {
                     query.setPageNumber(query.getPageNumber() + 1);
                     query = libraryService.findByQuery(query);
                 }
-                view.addObject("sliceServer", sliceServer);
+                view.addObject("fileServer", fileService.getFileServer());
                 view.addObject("ids", StringUtils.join(ids, ","));
                 return view;
             }
@@ -159,8 +148,9 @@ public class InspectedController extends BaseExamController {
             result.accumulate("markerScore", library.getMarkerScore());
 
             JSONArray array = new JSONArray();
-            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
+            List<ExamQuestion> questions = questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(), library.getSubjectCode(),
+                            false, library.getGroupNumber());
             List<ScoreItem> scores = library.getScoreList();
             for (int i = 0; i < questions.size(); i++) {
                 ExamQuestion question = questions.get(i);
@@ -171,11 +161,11 @@ public class InspectedController extends BaseExamController {
             }
             result.accumulate("questions", array);
 
-            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
-                    library.getGroupNumber());
-            Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            List<String> picUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
+            MarkGroup group = groupService
+                    .findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
+            //TODO examNumber->secretNumber
+            List<String> picUrls = fileService
+                    .getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount());
             List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
             List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
             result.accumulate("picUrls", picUrls);

+ 5 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -11,13 +12,11 @@ import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -59,8 +58,8 @@ public class LibraryController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "评卷任务查询", type = LogType.QUERY)
     @RequestMapping
@@ -176,9 +175,8 @@ public class LibraryController extends BaseExamController {
             String questionNumbers = String.join(",", strings);
             model.addAttribute("questionNumbers", questionNumbers);
         }
-        model.addAttribute("jsonServer", jsonServer);
-        model.addAttribute("answerUrl", PictureUrlBuilder
-                .getAnswerJson(examId, student.getSubjectCode(), student.getPaperType(), student.getExamNumber()));
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("answerUrl", fileService.getJsonUri(student.getExamId(), student.getExamNumber()));
         return "modules/exam/jsonView";
     }
 }

+ 7 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -1,11 +1,11 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
@@ -13,7 +13,6 @@ import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -25,7 +24,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
@@ -71,8 +69,8 @@ public class MarkGroupController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
-    @Value("${slice.image.server}")
-    private String imageServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
@@ -570,7 +568,7 @@ public class MarkGroupController extends BaseExamController {
         if (examStudents.size() > 0) {
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             model.addAttribute("pictureConfig", buildPictureConfig(group));
-            model.addAttribute("imageServer", imageServer);
+            model.addAttribute("fileServer", fileService.getFileServer());
             return "modules/mark/picConfig";
         } else {
             addMessage(redirectAttributes, "参数有误");
@@ -592,12 +590,9 @@ public class MarkGroupController extends BaseExamController {
         return json;
     }
 
-    private List<String> buildPicUrl(ExamStudent examStudent) {
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder
-                .getSliceUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
-                        examStudent.getExamNumber(), examStudent.getSliceCount());
-        return picUrls;
+    private List<String> buildPicUrl(ExamStudent student) {
+        // TODO examNumber->secretNumber
+        return fileService.getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount());
     }
 
     private List<ExamQuestion> buildQuestionList(MarkGroup group, List<ExamQuestionDTO> detailList) {

+ 10 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
@@ -27,7 +28,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -86,17 +86,8 @@ public class MarkQualityController extends BaseExamController {
     @Autowired
     private UserService userService;
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "质量监控查询", type = LogType.QUERY)
     @RequestMapping
@@ -242,11 +233,13 @@ public class MarkQualityController extends BaseExamController {
         if (group == null) {
             return "redirect:/admin/exam/mark";
         }
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("jsonServer", jsonServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/mark";
+        }
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
         model.addAttribute("markerId", markerId);
         model.addAttribute("markerScore", markerScore);

+ 35 - 45
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -1,29 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -31,9 +14,23 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.utils.OriginTag;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 @Controller("trackController")
 @RequestMapping("/admin/exam/track")
@@ -41,9 +38,6 @@ public class MarkTrackController extends BaseExamController {
 
     protected static Logger log = LoggerFactory.getLogger(MarkTrackController.class);
 
-    @Value("${slice.image.server}")
-    private String imageServer;
-
     @Autowired
     private MarkTrackService markTrackService;
 
@@ -61,19 +55,21 @@ public class MarkTrackController extends BaseExamController {
 
     @Autowired
     private MarkSpecialTagService markSpecialTagService;
-    
+
     @Autowired
     private ExamQuestionService questionService;
 
+    @Autowired
+    private FileService fileService;
+
     @RequestMapping("/student/{studentId}")
     public ModelAndView view(@PathVariable Integer studentId) {
         ModelAndView view = new ModelAndView("modules/exam/studentTrack");
-        view.addObject("imageServer", imageServer);
+        view.addObject("fileServer", fileService.getFileServer());
         ExamStudent student = studentService.findById(studentId);
         if (student != null && student.isUpload()) {
-            Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            List<String> sliceUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
+            List<String> sliceUrls = fileService
+                    .getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount());
             view.addObject("urls", StringUtils.join(sliceUrls, ","));
 
             JSONArray result = new JSONArray();
@@ -91,29 +87,24 @@ public class MarkTrackController extends BaseExamController {
     }
 
     /**
-     * 
-     * @param request
-     * @param model
-     * @param query
-     * @return
+     *
      */
     @ResponseBody
     @RequestMapping
     public HashMap<String, Object> list(Integer studentId) {
         List<MarkLibrary> librarys = libraryService.findByStudentId(studentId);
         ExamStudent examStudent = studentService.findById(studentId);
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
         List<Object> list = new ArrayList<Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         for (MarkLibrary library : librarys) {
             if (null != library.getTaskNumber() && library.getTaskNumber() == 2) {
                 continue;
             }
-            HashMap<String, Object> groups = set(library, examStudent, campus);
+            HashMap<String, Object> groups = set(library, examStudent);
             list.add(groups);
         }
         map.put("list", list);
-        map.put("imageServer", imageServer);
+        map.put("fileServer", fileService.getFileServer());
         return map;
     }
 
@@ -122,24 +113,23 @@ public class MarkTrackController extends BaseExamController {
     public HashMap<String, Object> byLibrary(Integer libraryId) {
         MarkLibrary library = libraryService.findById(libraryId);
         ExamStudent examStudent = studentService.findById(library.getStudentId());
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
         List<Object> list = new ArrayList<Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
-        HashMap<String, Object> groups = set(library, examStudent, campus);
+        HashMap<String, Object> groups = set(library, examStudent);
         list.add(groups);
         map.put("list", list);
-        map.put("imageServer", imageServer);
+        map.put("fileServer", fileService.getFileServer());
         return map;
     }
 
-    private HashMap<String, Object> set(MarkLibrary library, ExamStudent examStudent, Campus campus) {
+    private HashMap<String, Object> set(MarkLibrary library, ExamStudent student) {
         HashMap<String, Object> groups = new HashMap<String, Object>();
-        MarkGroup group = groupService.findOne(examStudent.getExamId(), examStudent.getSubjectCode(),
-                library.getGroupNumber());
-        group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examStudent.getExamId(), examStudent.getSubjectCode(),
-                    false, group.getNumber()));
-        List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
+        MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
+        group.setQuestionList(questionService
+                .findByExamAndSubjectAndObjectiveAndGroupNumber(student.getExamId(), student.getSubjectCode(), false,
+                        group.getNumber()));
+        List<String> picUrls = fileService
+                .getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount());
         List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
         List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
         groups.put("picUrls", picUrls);

+ 9 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -14,6 +14,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -27,7 +28,6 @@ import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.stereotype.Controller;
@@ -60,8 +60,8 @@ public class PaperController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
-    @Value("${card.server}")
-    private String cardServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "试卷管理查询", type = LogType.QUERY)
     @RequestMapping
@@ -78,12 +78,15 @@ public class PaperController extends BaseExamController {
             }
         }
         query = subjectService.findByQuery(query);
+        for (ExamSubject subject : query.getResult()) {
+            subject.setPaperAnswerUrl(fileService);
+        }
         model.addAttribute("query", query);
         model.addAttribute("upload", upload);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
-        model.addAttribute("cardServer", cardServer);
+        model.addAttribute("fileServer", fileService.getFileServer());
         Exam exam = examService.findById(examId);
         model.addAttribute("examType", exam.getType());
         return "modules/exam/paperList";
@@ -104,10 +107,10 @@ public class PaperController extends BaseExamController {
         ExamSubject subject = subjectService.find(examId, subjectCode);
         if (subject != null) {
             List<ExamQuestion> list = new LinkedList<ExamQuestion>();
-            if (objective == null || objective.booleanValue() == true) {
+            if (objective == null || objective) {
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, true));
             }
-            if (objective == null || objective.booleanValue() == false) {
+            if (objective == null || !objective) {
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false));
             }
             model.addAttribute("questionList", list);

+ 6 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java

@@ -10,16 +10,15 @@ import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -44,8 +43,8 @@ public class ScanController extends BaseExamController {
     @Autowired
     private ExamPackageService packageService;
 
-    @Value("${package.image.server}")
-    private String packageServer;
+    @Autowired
+    private FileService fileService;
 
     /**
      * 按科目统计扫描进度
@@ -87,7 +86,7 @@ public class ScanController extends BaseExamController {
      * 按学习中心统计扫描进度
      *
      * @param request
-     * @param subjectCode
+     * @param query
      * @return
      */
     @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
@@ -138,13 +137,13 @@ public class ScanController extends BaseExamController {
         query.setExamId(examId);
         query = packageService.findByQuery(query);
         for (ExamPackage ep : query.getResult()) {
-            ep.setUrls(PictureUrlBuilder.getPackageUrls(examId, ep.getCode(), ep.getPicCount()));
+            ep.setUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
         }
         ModelAndView view = new ModelAndView("modules/exam/scanPackage");
         view.addObject("packageList", query.getResult());
         view.addObject("query", query);
         view.addObject("totalCount", packageService.sumByExam(examId));
-        view.addObject("packageServer", packageServer);
+        view.addObject("fileServer", fileService.getFileServer());
         return view;
     }
 }

+ 13 - 30
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.admin.utils.ExportStudentExcel;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
@@ -19,13 +20,11 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -77,24 +76,14 @@ public class ScoreController extends BaseExamController {
     @Autowired
     private CheckStudentService checkStudentService;
 
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    @Value("${package.image.server}")
-    private String packageServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "成绩查询", type = LogType.QUERY)
     @RequestMapping
     public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query,
             @RequestParam(defaultValue = "0") Integer filter) {
         WebUser wu = RequestUtils.getWebUser(request);
-        List<Exam> examList = getExamList(wu);
         if (query.getExamId() != null) {
             query.setExamId(getSessionExamId(request));
         }
@@ -113,9 +102,6 @@ public class ScoreController extends BaseExamController {
                 buildSheetUrl(student);
                 buildPackageUrl(student);
                 buildAnswerUrl(student);
-                student.setAnswerUrl(PictureUrlBuilder
-                        .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(),
-                                student.getExamNumber()));
             }
             String exportMessage =
                     query.getSubjectCode() != null ? enableExport(query.getExamId(), query.getSubjectCode()) : null;
@@ -132,10 +118,7 @@ public class ScoreController extends BaseExamController {
         }
         view.addObject("query", query);
         view.addObject("filter", filter);
-        view.addObject("imageServer", imageServer);
-        view.addObject("packageServer", packageServer);
-        view.addObject("cardServer", cardServer);
-        view.addObject("jsonServer", jsonServer);
+        view.addObject("fileServer", fileService.getFileServer());
         return view;
     }
 
@@ -152,9 +135,7 @@ public class ScoreController extends BaseExamController {
             ModelAndView view = new ModelAndView("modules/exam/scoreDetail");
             view.addObject("student", student);
             view.addObject("scoreList", buildScoreList(student));
-            view.addObject("imageServer", imageServer);
-            view.addObject("packageServer", packageServer);
-            view.addObject("cardServer", cardServer);
+            view.addObject("fileServer", fileService.getFileServer());
             view.addObject("queryString", StringUtils.trimToEmpty(queryString));
             return view;
         } else {
@@ -368,24 +349,26 @@ public class ScoreController extends BaseExamController {
 
     private void buildSheetUrl(ExamStudent student) {
         // 改为内部原图浏览地址,直接附带标记内容
-        student.setSheetUrls(PictureUrlBuilder
-                .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
+        //student.setSheetUrls(PictureUrlBuilder
+        //        .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
+        student.setSheetUrls(
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder
-                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
+                student.setPackageUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
             }
         }
     }
 
     private void buildAnswerUrl(ExamStudent student) {
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        if (subject != null && subject.isHasAnswer()) {
-            student.setAnswerUrl(subject.getAnswerUrl());
+        if (subject != null && subject.getAnswerFileType() != null) {
+            student.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
         }
         if (subject != null) {
             student.setSubjectRemark(StringUtils.trimToEmpty(subject.getRemark()));

+ 7 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java

@@ -13,6 +13,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
@@ -21,7 +22,6 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import com.google.common.collect.Lists;
 import net.sf.json.JSONObject;
@@ -29,7 +29,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -70,11 +69,8 @@ public class StudentController extends BaseExamController {
     @Autowired
     private ExamPackageService packageService;
 
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    @Value("${package.image.server}")
-    private String packageServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "查询考生", type = LogType.QUERY)
     @RequestMapping
@@ -99,8 +95,7 @@ public class StudentController extends BaseExamController {
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
-        model.addAttribute("imageServer", imageServer);
-        model.addAttribute("packageServer", packageServer);
+        model.addAttribute("fileServer", fileService.getFileServer());
         Exam exam = examService.findById(examId);
         model.addAttribute("examType", exam.getType());
         return "modules/exam/studentList";
@@ -569,18 +564,15 @@ public class StudentController extends BaseExamController {
     }
 
     private void buildSheetUrl(ExamStudent student) {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        student.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
-                        student.getSheetCount()));
+        student.setSheetUrls(
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder
-                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
+                student.setPackageUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
             }
         }
     }

+ 8 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
@@ -15,14 +16,12 @@ import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.DateUtils;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -68,11 +67,8 @@ public class TrialController extends BaseExamController {
     @Autowired
     private UserService userService;
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
     @Logging(menu = "试评管理查询", type = LogType.QUERY)
     @RequestMapping
@@ -170,10 +166,8 @@ public class TrialController extends BaseExamController {
                 obj.accumulate("success", true);
                 if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
                     // 多媒体配置
-                    obj.accumulate("jsonServer", jsonServer);
-                    obj.accumulate("urls", PictureUrlBuilder
-                            .getAnswerJson(library.getExamId(), library.getSubjectCode(), student.getPaperType(),
-                                    library.getExamNumber()));
+                    obj.accumulate("fileServer", fileService.getFileServer());
+                    obj.accumulate("urls", fileService.getJsonUri(student.getExamId(), student.getExamNumber()));
                     List<ExamQuestion> questions = questionService
                             .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(),
                                     student.getSubjectCode(), false, group.getNumber());
@@ -185,10 +179,9 @@ public class TrialController extends BaseExamController {
                     obj.accumulate("questionNumbers", questionNumbers);
                 } else {
                     // 裁切图配置
-                    obj.accumulate("imageServer", sliceServer);
-                    obj.accumulate("urls", PictureUrlBuilder
-                            .getSliceUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                                    library.getExamNumber(), student.getSliceCount()));
+                    obj.accumulate("fileServer", fileService.getFileServer());
+                    obj.accumulate("urls", fileService
+                            .getSliceUris(student.getExamId(), student.getExamNumber(), 1, student.getSliceCount()));
                     obj.accumulate("pictureConfig", group.getPictureConfigList());
                 }
                 // 评卷记录集合

+ 26 - 47
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java

@@ -1,24 +1,6 @@
 package cn.com.qmth.stmms.admin.thread;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import cn.com.qmth.stmms.admin.utils.HttpUtil;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
 import cn.com.qmth.stmms.biz.exam.model.DataSync;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -27,9 +9,21 @@ import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 public class DataSyncThread implements Runnable {
 
@@ -43,16 +37,14 @@ public class DataSyncThread implements Runnable {
 
     private ExamService examService;
 
+    private FileService fileService;
+
     private LockService lockService;
 
     private DataSyncService dataSyncService;
 
     private Integer pageSize;
 
-    private String baseDir;
-
-    private UpyunConfig config;
-
     private HttpUtil subjectHttp;
 
     private HttpUtil studentHttp;
@@ -77,18 +69,17 @@ public class DataSyncThread implements Runnable {
 
     public static final String SIZE = "size";
 
-    public DataSyncThread(DataSync dataSync, Integer pageSize, String baseDir, UpyunConfig config,
-            LockService lockService, DataSyncService dataSyncService, ExamService examService,
-            ExamStudentService studentService, ExamSubjectService subjectService) {
+    public DataSyncThread(DataSync dataSync, Integer pageSize, LockService lockService, DataSyncService dataSyncService,
+            ExamService examService, ExamStudentService studentService, ExamSubjectService subjectService,
+            FileService fileService) {
         this.dataSync = dataSync;
         this.lockService = lockService;
         this.dataSyncService = dataSyncService;
         this.examService = examService;
         this.studentService = studentService;
         this.subjectService = subjectService;
+        this.fileService = fileService;
         this.pageSize = pageSize;
-        this.baseDir = baseDir;
-        this.config = config;
         this.subjectHttp = new HttpUtil(dataSync.getSubjectUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
                 dataSync.getRootOrgId());
         this.studentHttp = new HttpUtil(dataSync.getStudentUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
@@ -124,9 +115,10 @@ public class DataSyncThread implements Runnable {
                 String paperResult = subjectPaperHttp.httpAction(null, datas.toString());
                 JSONObject paperJson = JSONObject.fromObject(paperResult);
                 String paper = paperJson.getString("subjectivePaperList");
-                File paperFile = new File(new File(baseDir, config.getMediaBucket()), PictureUrlBuilder.getAnswerJson(
-                        exam.getId(), subjectCode, null, subjectCode));
-                writeFile(paper, paperFile);
+                byte[] paperData = paper.getBytes(StandardCharsets.UTF_8);
+                fileService
+                        .uploadPaper(new ByteArrayInputStream(paperData), BinaryUtil.encodeMD5(paperData), exam.getId(),
+                                subjectCode, FormatType.JSON);
                 // 获取考生
                 Long startId = 0L;
                 ExamSubject examSubject = subjectService.find(exam.getId(), subjectCode);
@@ -192,10 +184,9 @@ public class DataSyncThread implements Runnable {
                         list.add(examStudent);
 
                         String answerJson = student.getString(SUBJECTIVES);
-                        File file = new File(new File(baseDir, config.getMediaBucket()),
-                                PictureUrlBuilder.getAnswerJson(exam.getId(), subjectCode, null,
-                                        examStudent.getExamNumber()));
-                        writeFile(answerJson, file);
+                        byte[] jsonData = answerJson.getBytes(StandardCharsets.UTF_8);
+                        fileService.uploadJson(new ByteArrayInputStream(jsonData), BinaryUtil.encodeMD5(jsonData),
+                                exam.getId(), examStudent.getExamNumber());
                     }
                     int count = studentService.batchSave(list);
                     if (count > 0) {
@@ -218,16 +209,4 @@ public class DataSyncThread implements Runnable {
         }
     }
 
-    private void writeFile(String answerJson, File file) throws IOException, FileNotFoundException,
-            UnsupportedEncodingException {
-        if (!file.exists()) {
-            file.getParentFile().mkdirs();
-            file.createNewFile();
-        }
-        FileOutputStream fos = new FileOutputStream(file);
-        fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
-        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
-        bw.write(answerJson);
-        bw.close();
-    }
 }

+ 34 - 77
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ImageCheckThread.java

@@ -1,60 +1,45 @@
 package cn.com.qmth.stmms.admin.thread;
 
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.commons.lang.StringUtils;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.enums.ExamType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.common.upyun.UpYun;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 public class ImageCheckThread implements Runnable {
 
     protected static Logger log = LoggerFactory.getLogger(ImageCheckThread.class);
 
-    private int examId;
-
     private AtomicBoolean running;
 
-    private UpYun sheetUpyun;
-
-    private UpYun sliceUpyun;
-
-    private String baseDir;
+    private Exam exam;
 
     private ExamStudentService studentService;
 
-    private CampusService campusService;
+    private FileService fileService;
 
-    public ImageCheckThread(int examId, AtomicBoolean running, UpyunConfig config, String baseDir,
-            ExamStudentService studentService, CampusService campusService) {
-        this.examId = examId;
+    public ImageCheckThread(Exam exam, ExamStudentService studentService, FileService fileService,
+            AtomicBoolean running) {
+        this.exam = exam;
         this.running = running;
-        this.sheetUpyun = new UpYun(config.getSheetBucket(), config.getSheetUsername(), config.getSheetPassword());
-        this.sliceUpyun = new UpYun(config.getSliceBucket(), config.getSliceUsername(), config.getSlicePassword());
-        this.baseDir = baseDir;
         this.studentService = studentService;
-        this.campusService = campusService;
+        this.fileService = fileService;
     }
 
     @Override
     public void run() {
-        log.info("start check image for examId=" + examId);
+        log.info("start check image for examId=" + exam.getId());
         try {
             int pageNumber = 1;
             int pageSize = 500;
             while (true) {
-                List<ExamStudent> list = studentService.findByExamIdAndUploadAndAbsent(examId, true, false, pageNumber,
-                        pageSize);
+                List<ExamStudent> list = studentService
+                        .findByExamIdAndUploadAndAbsent(exam.getId(), true, false, pageNumber, pageSize);
                 if (list == null || list.isEmpty()) {
                     break;
                 }
@@ -66,65 +51,37 @@ public class ImageCheckThread implements Runnable {
                 pageNumber++;
             }
         } catch (Exception e) {
-            log.error("check image exception for examId=" + examId, e);
+            log.error("check image exception for examId=" + exam.getId(), e);
         } finally {
             running.set(false);
-            log.info("finish check image for examId=" + examId);
+            log.info("finish check image for examId=" + exam.getId());
         }
     }
 
     private void checkStudent(ExamStudent student) {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        if (student.getSheetCount() == 0 || student.getSliceCount() == 0 || campus == null) {
-            record(student, true);
-            return;
-        }
-
-        List<String> sheetUrls = PictureUrlBuilder.getSheetUrls(examId, campus.getId(), student.getSubjectCode(),
-                student.getExamNumber(), student.getSheetCount());
-        for (String url : sheetUrls) {
-            if (!exist(url, sheetUpyun)) {
-                record(student, true);
-                return;
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            boolean exception = false;
+            for (int i = 1; i <= student.getSheetCount(); i++) {
+                if (!fileService.sheetExist(student.getExamId(), student.getExamNumber(), i)) {
+                    exception = true;
+                    break;
+                }
             }
-        }
-
-        List<String> sliceUrls = PictureUrlBuilder.getSliceUrls(examId, campus.getId(), student.getSubjectCode(),
-                student.getExamNumber(), student.getSliceCount());
-        for (String url : sliceUrls) {
-            if (!exist(url, sliceUpyun)) {
-                record(student, true);
-                return;
+            for (int i = 1; i <= student.getSliceCount(); i++) {
+                //TODO examNumber->secretNumber
+                if (!fileService.sliceExist(student.getExamId(), student.getExamNumber(), i)) {
+                    exception = true;
+                    break;
+                }
             }
+            record(student, exception);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            record(student, fileService.jsonExist(student.getExamId(), student.getExamNumber()));
         }
 
-        record(student, false);
     }
 
     private void record(ExamStudent student, boolean exception) {
         studentService.updateException(student.getId(), exception);
     }
-
-    private boolean exist(String path, UpYun config) {
-        if (StringUtils.isNotBlank(baseDir)) {
-            try {
-                File file = new File(baseDir, config.getBucketName() + path);
-                return file.exists() && file.isFile();
-            } catch (Exception e) {
-                return false;
-            }
-        } else {
-            int retry = 1;
-            while (retry <= 3) {
-                try {
-                    Map<String, String> result = config.getFileInfo(path);
-                    return result != null && "file".equals(result.get("type"));
-                } catch (Exception e) {
-                    retry++;
-                    continue;
-                }
-            }
-            return false;
-        }
-    }
 }

+ 25 - 45
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ExamSubjectVO.java

@@ -1,45 +1,25 @@
-package cn.com.qmth.stmms.admin.vo;
-
-public class ExamSubjectVO {
-
-    private Integer examId;
-
-    private String code;
-
-    private Boolean hasPaper;
-
-    private Boolean hasAnswer;
-
-    public Integer getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Integer examId) {
-        this.examId = examId;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public Boolean getHasPaper() {
-        return hasPaper;
-    }
-
-    public void setHasPaper(Boolean hasPaper) {
-        this.hasPaper = hasPaper;
-    }
-
-    public Boolean getHasAnswer() {
-        return hasAnswer;
-    }
-
-    public void setHasAnswer(Boolean hasAnswer) {
-        this.hasAnswer = hasAnswer;
-    }
-
-}
+package cn.com.qmth.stmms.admin.vo;
+
+public class ExamSubjectVO {
+
+    private Integer examId;
+
+    private String code;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+}

+ 9 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java

@@ -1,15 +1,15 @@
 package cn.com.qmth.stmms.api.controller;
 
-import javax.servlet.http.HttpServletResponse;
-
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.common.controller.BaseController;
+import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
-import cn.com.qmth.stmms.common.controller.BaseController;
+import javax.servlet.http.HttpServletResponse;
 
 public class BaseApiController extends BaseController {
 
@@ -32,4 +32,10 @@ public class BaseApiController extends BaseController {
             log.error("api response senderror", e);
         }
     }
+
+    protected JSONObject result(boolean success) {
+        JSONObject obj = new JSONObject();
+        obj.accumulate("success", success);
+        return obj;
+    }
 }

+ 7 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java

@@ -111,13 +111,13 @@ public class ExamInfoController extends BaseApiController {
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
             ExamSubject es = subjectService.find(subject.getExamId(), subject.getCode());
             if (es != null) {
-                if (subject.getHasAnswer() != null) {
-                    es.setHasAnswer(subject.getHasAnswer());
-                }
-                if (subject.getHasPaper() != null) {
-                    es.setHasPaper(subject.getHasPaper());
-                }
-                subjectService.save(es);
+                //                if (subject.getHasAnswer() != null) {
+                //                    es.setHasAnswer(subject.getHasAnswer());
+                //                }
+                //                if (subject.getHasPaper() != null) {
+                //                    es.setHasPaper(subject.getHasPaper());
+                //                }
+                //                subjectService.save(es);
                 result.accumulate("code", subject.getCode());
                 return result;
             } else {

+ 224 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java

@@ -0,0 +1,224 @@
+package cn.com.qmth.stmms.api.controller;
+
+import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * 统一的对外文件服务接口
+ *
+ * @author luoshi
+ */
+@Controller("fileApiController")
+@RequestMapping("/api/file")
+public class FileController extends BaseApiController {
+
+    protected static final Logger log = LoggerFactory.getLogger(FileController.class);
+
+    @Autowired
+    private FileService fileService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    private Exam validateExam(ApiUser au, Integer examId, ExamType... types) {
+        Exam exam = examService.findById(examId);
+        if (exam == null || !exam.getSchoolId().equals(au.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        if (types != null && !Arrays.asList(types).contains(exam.getType())) {
+            throw ApiException.QUERY_PARAM_ERROR.replaceMessage("exam type invalid");
+        }
+        return exam;
+    }
+
+    private ExamStudent validateExamStudent(Integer examId, String examNumber) {
+        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
+        if (student == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": examNumber error");
+        }
+        return student;
+    }
+
+    private ExamSubject validateExamSubject(Integer examId, String subjectCode) {
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        if (subject == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": subjectCode error");
+        }
+        return subject;
+    }
+
+    private void validateFormatType(FormatType format, FormatType... types) {
+        if (!Arrays.asList(types).contains(format)) {
+            throw new RuntimeException("format type error");
+        }
+    }
+
+    @RequestMapping(value = "/sheet/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadSheet(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam Integer index, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        validateExamStudent(examId, examNumber);
+        try {
+            fileService.uploadSheet(file.getInputStream(), md5, examId, examNumber, index);
+        } catch (Exception e) {
+            log.error("sheet upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("sheet upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/slice/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadSlice(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam Integer index, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        validateExamStudent(examId, examNumber);
+        try {
+            fileService.uploadSlice(file.getInputStream(), md5, examId, examNumber, index);
+        } catch (Exception e) {
+            log.error("slice upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("slice upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/json/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadSlice(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam String md5, @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.MULTI_MEDIA);
+        validateExamStudent(examId, examNumber);
+        try {
+            fileService.uploadJson(file.getInputStream(), md5, examId, examNumber);
+        } catch (Exception e) {
+            log.error("json upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("json upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/paper/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadPaper(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String subjectCode, @RequestParam FormatType format, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        Exam exam = validateExam(au, examId);
+        ExamSubject subject = validateExamSubject(examId, subjectCode);
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            validateFormatType(format, FormatType.PDF);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            validateFormatType(format, FormatType.JSON);
+        }
+        try {
+            fileService.uploadPaper(file.getInputStream(), md5, examId, subjectCode, format);
+            subject.setPaperFileType(format);
+            subjectService.save(subject);
+        } catch (Exception e) {
+            log.error("paper upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("paper upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/answer/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadAnswer(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String subjectCode, @RequestParam FormatType format, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        Exam exam = validateExam(au, examId);
+        ExamSubject subject = validateExamSubject(examId, subjectCode);
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            validateFormatType(format, FormatType.PDF);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            validateFormatType(format, FormatType.JSON);
+        }
+        try {
+            fileService.uploadAnswer(file.getInputStream(), md5, examId, subjectCode, format);
+            subject.setAnswerFileType(format);
+            subjectService.save(subject);
+        } catch (Exception e) {
+            log.error("answer upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("answer upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/card/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadCard(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam(required = false) String subjectCode, @RequestParam FormatType format,
+            @RequestParam String md5, @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        subjectCode = StringUtils.trimToNull(subjectCode);
+        Exam exam = validateExam(au, examId, ExamType.SCAN_IMAGE);
+        ExamSubject subject = subjectCode != null ? validateExamSubject(examId, subjectCode) : null;
+        FormatType current = subject != null ? subject.getCardType() : exam.getCardType();
+        if (current != null) {
+            validateFormatType(format, current);
+        } else {
+            validateFormatType(format, FormatType.JSON, FormatType.ZIP);
+        }
+        try {
+            if (subject != null) {
+                fileService.uploadCard(file.getInputStream(), md5, examId, subjectCode, format);
+                subject.setCardType(format);
+                subjectService.save(subject);
+            } else {
+                fileService.uploadCard(file.getInputStream(), md5, examId, format);
+                exam.setCardType(format);
+                examService.save(exam);
+            }
+        } catch (Exception e) {
+            log.error("card upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("card upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+}

+ 4 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/LoginController.java

@@ -1,23 +1,18 @@
 package cn.com.qmth.stmms.api.controller;
 
-import javax.servlet.http.HttpServletRequest;
-
-import cn.com.qmth.stmms.api.dto.UserDTO;
-import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
+import javax.servlet.http.HttpServletRequest;
 
 @Controller("loginApiController")
 @RequestMapping("/api")
@@ -34,6 +29,7 @@ public class LoginController extends BaseApiController {
         JSONObject obj = new JSONObject();
         obj.accumulate("userId", user.getUserData() != null ? user.getUserData().getId() : 0);
         obj.accumulate("userName", user.getUserData() != null ? user.getUserData().getName() : "");
+        obj.accumulate("userRole", user.getRole().toString());
         obj.accumulate("campusId", 0);
         obj.accumulate("schoolId", user.getSchoolId());
         return obj;

+ 0 - 161
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java

@@ -1,161 +0,0 @@
-package cn.com.qmth.stmms.api.controller;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.api.utils.ImageBuildUtil;
-import cn.com.qmth.stmms.api.utils.SheetDownloadThread;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.utils.PictureTag;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.upyun.UpYun;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import net.sf.json.JSONObject;
-
-@Controller("pictureController")
-@RequestMapping("/")
-public class PictureController {
-
-    protected static final Logger log = LoggerFactory.getLogger(PictureController.class);
-
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private UpyunConfig config;
-
-    @Autowired
-    private LockService lockService;
-
-    @Qualifier("task-executor")
-    @Autowired
-    private AsyncTaskExecutor taskExecutor;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${file.root}")
-    private String baseDir;
-
-    @Value("${file.save}")
-    private String saveDir;
-
-    @RequestMapping("/sheet/{examId}/{examNumber}-{index}")
-    public void getSheet(HttpServletResponse response, @PathVariable Integer examId, @PathVariable String examNumber,
-            @PathVariable Integer index, @RequestParam(required = false, defaultValue = "true") Boolean withTag) throws IOException {
-        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
-        if (student == null || !student.isUpload() || index < 1 || index > student.getSheetCount()) {
-            response.sendError(HttpStatus.NOT_FOUND.value());
-            return;
-        }
-        try {
-            List<PictureTag> tags = null;
-            if (withTag != null && withTag) {
-                tags = studentService.buildSheetTags(student, index);
-            }
-            BufferedImage image = ImageBuildUtil.buildTagImage(getSheetImage(student, index), tags);
-            response.setContentType("image/jpeg");
-            ImageIO.write(image, "jpg", response.getOutputStream());
-        } catch (Exception e) {
-            log.error("get sheet error", e);
-            response.reset();
-            response.sendError(HttpStatus.NOT_FOUND.value());
-            return;
-        }
-    }
-
-    @RequestMapping("/sheet/{examId}/save")
-    @ResponseBody
-    public Object saveAllSheet(HttpServletResponse response, @PathVariable Integer examId,
-            @RequestParam(required = false, defaultValue = "true") Boolean withTag) throws IOException {
-        JSONObject result = new JSONObject();
-        Exam exam = examService.findById(examId);
-        if (exam == null) {
-            result.accumulate("success", false);
-            result.accumulate("message", "exam not exists");
-            return result;
-        }
-        if (StringUtils.isBlank(saveDir)) {
-            result.accumulate("success", false);
-            result.accumulate("message", "file.save not exists");
-            return result;
-        }
-        if (lockService.trylock(LockType.SAVE_SHEET, examId)) {
-            taskExecutor.submit(new SheetDownloadThread(examId, saveDir, withTag, this, studentService, lockService));
-        }
-        result.accumulate("running", lockService.isLocked(LockType.SAVE_SHEET, examId));
-        return result;
-    }
-
-    @RequestMapping("/sheet/{examId}/status")
-    @ResponseBody
-    public Object saveAllSheetStatus(HttpServletResponse response, @PathVariable Integer examId) throws IOException {
-        JSONObject result = new JSONObject();
-        result.accumulate("running", lockService.isLocked(LockType.SAVE_SHEET, examId));
-        return result;
-    }
-
-    public BufferedImage getSheetImage(ExamStudent student, int index) throws FileNotFoundException, IOException {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        String url = PictureUrlBuilder
-                .getSheetUrl(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(), index);
-        if (StringUtils.isNotBlank(baseDir)) {
-            return ImageIO.read(new File(new File(baseDir, config.getSheetBucket()), url));
-        } else {
-            UpYun upyun = new UpYun(config.getSheetBucket(), config.getSheetUsername(), config.getSheetPassword());
-            ByteArrayOutputStream ous = new ByteArrayOutputStream();
-            upyun.readFile(url, ous);
-            return ImageIO.read(new ByteArrayInputStream(ous.toByteArray()));
-        }
-    }
-
-    public BufferedImage getSliceImage(ExamStudent student, int index) throws FileNotFoundException, IOException {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        String url = PictureUrlBuilder
-                .getSliceUrl(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(), index);
-        if (StringUtils.isNotBlank(baseDir)) {
-            return ImageIO.read(new File(new File(baseDir, config.getSliceBucket()), url));
-        } else {
-            UpYun upyun = new UpYun(config.getSliceBucket(), config.getSliceUsername(), config.getSlicePassword());
-            ByteArrayOutputStream ous = new ByteArrayOutputStream();
-            upyun.readFile(url, ous);
-            return ImageIO.read(new ByteArrayInputStream(ous.toByteArray()));
-        }
-    }
-
-}

+ 13 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/exception/ApiException.java

@@ -15,6 +15,14 @@ public class ApiException extends RuntimeException {
         return code;
     }
 
+    public ApiException replaceMessage(String message) {
+        return new ApiException(this.code, message);
+    }
+
+    public ApiException appendMessage(String message) {
+        return new ApiException(this.code, this.getMessage() + message);
+    }
+
     public static final ApiException AUTHORIZATION_UNEXIST = new ApiException(401, "authorization unexists");
 
     public static final ApiException SIGNATURE_INVALID = new ApiException(401, "signature invalid");
@@ -25,5 +33,10 @@ public class ApiException extends RuntimeException {
 
     public static final ApiException EXAM_NOT_ACCESSIBLED = new ApiException(401, "user cannot access specified exam");
 
+    public static final ApiException QUERY_PARAM_ERROR = new ApiException(400, "query param error");
+
     public static final ApiException USER_LOGIN_FAILE = new ApiException(500, "user login faile");
+
+    public static final ApiException FILE_UPLOAD_ERROR = new ApiException(500, "file upload error");
+
 }

+ 0 - 87
stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetDownloadThread.java

@@ -1,87 +0,0 @@
-package cn.com.qmth.stmms.api.utils;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-
-import javax.imageio.ImageIO;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import cn.com.qmth.stmms.api.controller.PictureController;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.common.enums.LockType;
-
-public class SheetDownloadThread implements Runnable {
-
-    public static final Logger log = LoggerFactory.getLogger(SheetDownloadThread.class);
-
-    private Integer examId;
-
-    private File baseDir;
-
-    private Boolean withTag;
-
-    private PictureController controller;
-
-    private ExamStudentService studentService;
-
-    private LockService lockService;
-
-    public SheetDownloadThread(Integer examId, String dir, Boolean withTag, PictureController controller,
-            ExamStudentService studentService, LockService lockService) {
-        this.examId = examId;
-        this.baseDir = new File(dir);
-        this.withTag = withTag;
-        this.controller = controller;
-        this.studentService = studentService;
-        this.lockService = lockService;
-    }
-
-    @Override
-    public void run() {
-        try {
-            ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-            query.setExamId(examId);
-            query.setUpload(true);
-            query.setPageSize(100);
-            query.setPageNumber(0);
-            while (true) {
-                query.setPageNumber(query.getPageNumber() + 1);
-                query = studentService.findByQuery(query);
-                if (query.getCurrentCount() == 0) {
-                    break;
-                }
-
-                for (ExamStudent student : query.getResult()) {
-                    log.info("write for student: " + student.getExamNumber());
-                    for (int i = 1; i <= student.getSheetCount(); i++) {
-                        download(student, i);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.error("save sheet thread error", e);
-        } finally {
-            lockService.unlock(LockType.SAVE_SHEET, examId);
-        }
-    }
-
-    private void download(ExamStudent student, int index) {
-        File file = new File(baseDir, examId + File.separator + student.getSubjectCode() + File.separator
-                + student.getExamNumber() + "-" + index + ".jpg");
-        try {
-            file.getParentFile().mkdirs();
-            BufferedImage image = ImageBuildUtil.buildTagImage(controller.getSheetImage(student, index),
-                    withTag != null && withTag.booleanValue() ? studentService.buildSheetTags(student, index) : null);
-            ImageIO.write(image, "jpg", file);
-            log.info("write sheet file success: " + file.getAbsolutePath());
-        } catch (Exception e) {
-            log.error("write sheet file error: " + file.getAbsolutePath(), e);
-        }
-    }
-
-}

+ 0 - 135
stmms-web/src/main/java/cn/com/qmth/stmms/file/controller/FileController.java

@@ -1,135 +0,0 @@
-package cn.com.qmth.stmms.file.controller;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import cn.com.qmth.stmms.common.upyun.UpYun;
-
-/**
- * 模拟又拍云的数据接口,提供局域网内的文件上传/下载服务
- * 
- * @author luoshi
- * 
- */
-@Controller("fileApiController")
-@RequestMapping("/file")
-public class FileController implements InitializingBean {
-
-    protected static final Logger log = LoggerFactory.getLogger(FileController.class);
-
-    @Value("${file.root}")
-    private String baseDir;
-
-    private boolean enable;
-
-    @RequestMapping(value = "/**", method = { RequestMethod.PUT, RequestMethod.POST })
-    public void upload(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        File full = new File(baseDir, getFilePath(request));
-        File parent = full.getParentFile();
-        if (parent.exists() || parent.mkdirs()) {
-            try {
-                OutputStream output = new FileOutputStream(full);
-                IOUtils.copy(request.getInputStream(), output);
-                output.close();
-
-                String md5 = request.getHeader(UpYun.CONTENT_MD5);
-                if (StringUtils.isNotBlank(md5)) {
-                    // 文件内容MD5摘要验证
-                    if (!UpYun.md5(full).equals(md5)) {
-                        log.error("md5 check faile: " + full.getAbsolutePath());
-                        response.sendError(500, "md5 check faile: " + full.getAbsolutePath());
-                    }
-                }
-            } catch (Exception e) {
-                log.error("write file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "write file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            log.error("mkdir faile: " + parent.getAbsolutePath());
-            response.sendError(500, "mkdir faile: " + parent.getAbsolutePath());
-        }
-    }
-
-    @RequestMapping(value = "/**", method = RequestMethod.GET)
-    public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        String filePath = getFilePath(request);
-        File full = new File(baseDir, filePath);
-        if (full.exists()) {
-            try {
-                FileCopyUtils.copy(new FileInputStream(full), response.getOutputStream());
-            } catch (Exception e) {
-                log.error("read file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "read file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            response.sendError(404, "file not found: " + filePath);
-        }
-    }
-
-    @RequestMapping(value = "/**", method = RequestMethod.HEAD)
-    public void info(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        String filePath = getFilePath(request);
-        File full = new File(baseDir, filePath);
-        if (full.exists()) {
-            try {
-                response.addHeader(UpYun.X_UPYUN_FILE_TYPE, full.isFile() ? "file" : "folder");
-                response.addHeader(UpYun.X_UPYUN_FILE_SIZE, String.valueOf(full.length()));
-                response.addHeader(UpYun.X_UPYUN_FILE_DATE, String.valueOf(full.lastModified()));
-                if (full.isFile()) {
-                    response.addHeader(UpYun.CONTENT_MD5, UpYun.md5(full));
-                }
-            } catch (Exception e) {
-                log.error("read file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "read file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            response.sendError(404, "file not found: " + filePath);
-        }
-    }
-
-    private String getFilePath(HttpServletRequest request) {
-        return request.getRequestURI().substring(5);
-    }
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        if (StringUtils.isNotBlank(baseDir)) {
-            File dir = new File(baseDir);
-            if (dir.exists() && dir.isDirectory()) {
-                enable = true;
-            }
-        }
-    }
-}

+ 5 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -86,21 +87,12 @@ public class MarkController extends BaseController {
     @Autowired
     private SessionService sessionService;
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
+    @Autowired
+    private FileService fileService;
 
     @Value("${marker.forceMode}")
     private String forceMarkMode;
 
-    @Value("${json.server}")
-    private String jsonServer;
-
     @RequestMapping(value = "/reset", method = RequestMethod.GET)
     public ModelAndView reset(HttpServletRequest request) {
         User user = RequestUtils.getWebUser(request).getUser();
@@ -233,12 +225,10 @@ public class MarkController extends BaseController {
      * @param modelAndView
      */
     private void preProcess(Marker marker, ModelAndView modelAndView) {
-        modelAndView.addObject("sliceServer", sliceServer);
-        modelAndView.addObject("sheetServer", sheetServer);
-        modelAndView.addObject("cardServer", cardServer);
-        modelAndView.addObject("jsonServer", jsonServer);
+        modelAndView.addObject("fileServer", fileService.getFileServer());
         modelAndView.addObject("marker", marker);
         ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
+        subject.setPaperAnswerUrl(fileService);
         modelAndView.addObject("subject", subject);
         Exam exam = examService.findById(marker.getExamId());
         modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());

+ 0 - 157
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java

@@ -1,157 +0,0 @@
-package cn.com.qmth.stmms.mark;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.common.controller.BaseController;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-
-@Controller
-@RequestMapping("/admin/mark/leader")
-public class MarkLeaderController extends BaseController {
-
-    private static Logger log = LoggerFactory.getLogger(MarkLeaderController.class);
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @RequestMapping("/index")
-    public ModelAndView index(HttpServletRequest request, @RequestParam(value = "studentId") Integer studentId) {
-        ExamStudent student = studentService.findById(studentId);
-        WebUser user = RequestUtils.getWebUser(request);
-        Marker marker = new Marker();
-        marker.setId(user.getId());
-        marker.setExamId(student.getExamId());
-        marker.setSubjectCode(student.getSubjectCode());
-        ModelAndView modelAndView = new ModelAndView("modules/mark/markLeader");
-        preProcess(marker, studentId, modelAndView);
-        return modelAndView;
-    }
-
-    /**
-     * 进入评卷界面后的通用预处理
-     * 
-     * @param marker
-     * @param modelAndView
-     * @param modelAndView
-     */
-    private void preProcess(Marker marker, Integer studentId, ModelAndView modelAndView) {
-        modelAndView.addObject("sliceServer", sliceServer);
-        modelAndView.addObject("sheetServer", sheetServer);
-        modelAndView.addObject("cardServer", cardServer);
-        modelAndView.addObject("marker", marker);
-        modelAndView.addObject("studentId", studentId);
-        ExamStudent student = studentService.findById(studentId);
-        modelAndView.addObject("subject", subjectService.find(student.getExamId(), student.getSubjectCode()));
-    }
-
-    @RequestMapping("/status")
-    @ResponseBody
-    public JSONObject status(HttpServletRequest request,
-            @RequestParam(value = "studentId", required = false) Integer studentId) {
-        JSONObject status = new JSONObject();
-        if (studentId == null) {
-            status.accumulate("valid", false);
-            status.accumulate("totalCount", 1);
-            status.accumulate("markedCount", 1);
-        } else {
-            ExamStudent student = studentService.findById(studentId);
-            ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-            if (subject == null) {
-                status.accumulate("valid", false);
-                return status;
-            }
-            status.accumulate("valid", true);
-        }
-        return status;
-    }
-
-    @RequestMapping("/gettask")
-    @ResponseBody
-    public Task getTask(HttpServletRequest request,
-            @RequestParam(value = "studentId", required = false) Integer studentId) {
-        WebUser marker = RequestUtils.getWebUser(request);
-        Task task = null;
-        if (studentId == null) {
-            task = new Task();
-            task.setExist(false);
-            task.setMessage("当前无评卷任务");
-        } else {
-            task = getTask(marker, studentId);
-        }
-        return task;
-    }
-
-    /**
-     * 设置任务通用属性
-     * 
-     * @param task
-     * @param marker
-     * @param stage
-     * @param count
-     * @param bmList
-     */
-    private void setTaskParameter(Task task, WebUser marker) {
-        task.setHeaderId(marker.getId());
-    }
-
-    private Task getTask(WebUser marker, Integer studentId) {
-        Task task = taskService.build(studentId);
-        setTaskParameter(task, marker);
-        return task;
-    }
-
-    @RequestMapping(value = "/savetask", method = RequestMethod.POST)
-    @ResponseBody
-    public JSONObject saveTask(HttpServletRequest request, @RequestBody Task task) {
-        JSONObject result = new JSONObject();
-        try {
-            if (taskService.submitByStudent(task)) {
-                result.accumulate("success", true);
-                result.accumulate("status", status(request, null));
-            } else {
-                result.accumulate("success", false);
-            }
-        } catch (Exception e) {
-            log.error("MarkController-保存任务出错", e);
-            result.accumulate("success", false);
-        }
-        return result;
-    }
-
-}

+ 131 - 130
stmms-web/src/main/webapp/WEB-INF/views/include/trialDetail.jsp

@@ -1,155 +1,156 @@
-<%@ page contentType="text/html;charset=UTF-8"%>
+<%@ page contentType="text/html;charset=UTF-8" %>
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
 <script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
 <script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
 
 <div id="trial-detail-content" class="container-fluid" style="display:none">
-<div class="row-fluid">
-    <div id="trial-left-div" class="span7" style="overflow-y:scroll">
-    </div>
-    <div id="trial-right-div" class="span5">
-        <table id="contentTable" class="table table-striped table-bordered table-condensed">
-            <thead>
+    <div class="row-fluid">
+        <div id="trial-left-div" class="span7" style="overflow-y:scroll">
+        </div>
+        <div id="trial-right-div" class="span5">
+            <table id="contentTable" class="table table-striped table-bordered table-condensed">
+                <thead>
                 <tr>
                     <th>评卷员</th>
                     <th>姓名</th>
                     <th>给分</th>
                     <th>时间</th>
                 </tr>
-            </thead>
-            <tbody id="trial-history">
-            </tbody>
-        </table>
+                </thead>
+                <tbody id="trial-history">
+                </tbody>
+            </table>
+        </div>
     </div>
 </div>
-</div>
 
 <script type="text/javascript">
-var trialDetailModal = new jBox('Modal', {isolateScroll: false});
+    var trialDetailModal = new jBox('Modal', {isolateScroll: false});
 
-$(document).ready(function() {
-    $('#trial-left-div').height($(window).height()*0.83);
-});
+    $(document).ready(function () {
+        $('#trial-left-div').height($(window).height() * 0.83);
+    });
 
-function initTrialDetailPopover(title, libraryId) {
-	initTrialDetailContent(libraryId); 
-	trialDetailModal.setWidth($(window).width()*0.9);
-	trialDetailModal.setHeight($(window).height()*0.85);
-	trialDetailModal.setTitle(title);
-	trialDetailModal.open();
-}
+    function initTrialDetailPopover(title, libraryId) {
+        initTrialDetailContent(libraryId);
+        trialDetailModal.setWidth($(window).width() * 0.9);
+        trialDetailModal.setHeight($(window).height() * 0.85);
+        trialDetailModal.setTitle(title);
+        trialDetailModal.open();
+    }
 
-function initTrialDetailContent(libraryId){
-	$('#trial-history').empty();
-	$('#trial-left-div').empty();
-	$.ajax({
-        type:"GET",
-        url:'${ctx}/admin/exam/trial/detail?libraryId='+libraryId,  
-        dataType:"json",
-        success:function(data){
-	        if(data.success==true) {
-	            for (var i = 0; i < data.historyList.length; i++) {
-	                var history = data.historyList[i];
-	                $('#trial-history').append('<tr><td>'+history.loginName+'</td><td>'+history.name+'</td><td>'+history.score+'</td><td>'+history.time+'</td></tr>');
-	            }
-	            if(data.imageServer != undefined && data.pictureConfig != undefined){
-		            new ImageLoader( {
-		                server: data.imageServer
-		            }).merge(data.urls, data.pictureConfig, function(image){
-	                    trialDetailModal.setContent($('#trial-detail-content'));
-	                    $(image).width($('#trial-left-div').width()*0.95);
-	                    $(image).appendTo('#trial-left-div');
-	                }, function(error){
-		                trialDetailModal.setTitle('加载失败');
-		            });
-	            }else if(data.jsonServer != undefined && data.questionNumbers != undefined){
-	            	var url = data.jsonServer + data.urls;
-	            	var questionNumbers = data.questionNumbers.split(",");
-	            	let questionArr = {};
-	            	questionNumbers.forEach(questionNumber => {
-	            		questionArr[questionNumber] = true;
-	                });
-	            	$.get(url, function (result) {
-	            		 let questions = JSON.parse(result) || [];
-	            		//var result = '[{"mainNumber": 6,"subNumber": 19,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"}]},{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"},{"type": "text","value": "我是答案答案daan"}]}]}}]';
-	            		//let questions = JSON.parse(result);
+    function initTrialDetailContent(libraryId) {
+        $('#trial-history').empty();
+        $('#trial-left-div').empty();
+        $.ajax({
+            type: "GET",
+            url: '${ctx}/admin/exam/trial/detail?libraryId=' + libraryId,
+            dataType: "json",
+            success: function (data) {
+                if (data.success == true) {
+                    for (var i = 0; i < data.historyList.length; i++) {
+                        var history = data.historyList[i];
+                        $('#trial-history').append('<tr><td>' + history.loginName + '</td><td>' + history.name + '</td><td>' + history.score + '</td><td>' + history.time + '</td></tr>');
+                    }
+                    if (data.fileServer != undefined && data.pictureConfig != undefined) {
+                        new ImageLoader({
+                            server: data.fileServer
+                        }).merge(data.urls, data.pictureConfig, function (image) {
+                            trialDetailModal.setContent($('#trial-detail-content'));
+                            $(image).width($('#trial-left-div').width() * 0.95);
+                            $(image).appendTo('#trial-left-div');
+                        }, function (error) {
+                            trialDetailModal.setTitle('加载失败');
+                        });
+                    } else if (data.fileServer != undefined && data.questionNumbers != undefined) {
+                        var url = data.fileServer + data.urls;
+                        var questionNumbers = data.questionNumbers.split(",");
+                        let questionArr = {};
+                        questionNumbers.forEach(questionNumber => {
+                            questionArr[questionNumber] = true;
+                        });
+                        $.get(url, function (result) {
+                            let questions = JSON.parse(result) || [];
+                            //var result = '[{"mainNumber": 6,"subNumber": 19,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"}]},{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"},{"type": "text","value": "我是答案答案daan"}]}]}}]';
+                            //let questions = JSON.parse(result);
 
-	            		 questions.forEach(question => {
-	            	            // 按题号过滤
-	            	            if (questionArr[question.mainNumber + "." + question.subNumber] === true) {
-	            	                let numberTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "题号:" + question.mainNumber + "-" + question.subNumber
-	            	                    }]
-	            	                };
-	            	                let bodyTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "题干:"
-	            	                    }]
-	            	                };
-	            	                let answerTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "考生答案:"
-	            	                    }, {
-	            	                        "type": "text",
-	            	                        "param": {
-	            	                            "italic": true,
-	            	                            "danger": true
-	            	                        },
-	            	                        "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
-	            	                    }]
-	            	                };
-	            	                let standardTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "标准答案:"
-	            	                    }]
-	            	                };
-	            	                this.holder = $('#trial-left-div');
-	            	                $(renderSection(numberTitle)).appendTo(this.holder);
-	            	                $(renderSection(bodyTitle)).appendTo(this.holder);
-	            	                if(question.parentBody!=null && question.parentBody!=undefined){
-	            						$(renderRichText(question.parentBody)).appendTo(this.holder); 
-	            					}
-	            	                $(renderRichText(question.body)).appendTo(this.holder);
-	            	                $(renderSection(answerTitle)).appendTo(this.holder);
-	            	                $(renderRichText(question.studentAnswer)).appendTo(this.holder);
-	            	                $(renderSection(standardTitle)).appendTo(this.holder);
-	            	                $(renderRichText(question.answer)).appendTo(this.holder);
-	            	                trialDetailModal.setContent($('#trial-detail-content'));
-	            	            }
-	            	        });
-	                }).error(function () {
-	                	trialDetailModal.setTitle('加载失败')
-	                }); 
-	            }
-	        }else {
-	            trialDetailModal.setTitle('加载失败')
-	        }
-        }
-    });
-}
-function textCount(jsonBody) {
-    let sections = jsonBody.sections || [];
-    let count = 0;
-    sections.forEach(section => {
-        let blocks = section.blocks || [];
-        blocks.forEach(block => {
-            if (block.type === 'text' && block.value != undefined) {
-                count += block.value.length;
+                            questions.forEach(question => {
+                                // 按题号过滤
+                                if (questionArr[question.mainNumber + "." + question.subNumber] === true) {
+                                    let numberTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "题号:" + question.mainNumber + "-" + question.subNumber
+                                        }]
+                                    };
+                                    let bodyTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "题干:"
+                                        }]
+                                    };
+                                    let answerTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "考生答案:"
+                                        }, {
+                                            "type": "text",
+                                            "param": {
+                                                "italic": true,
+                                                "danger": true
+                                            },
+                                            "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
+                                        }]
+                                    };
+                                    let standardTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "标准答案:"
+                                        }]
+                                    };
+                                    this.holder = $('#trial-left-div');
+                                    $(renderSection(numberTitle)).appendTo(this.holder);
+                                    $(renderSection(bodyTitle)).appendTo(this.holder);
+                                    if (question.parentBody != null && question.parentBody != undefined) {
+                                        $(renderRichText(question.parentBody)).appendTo(this.holder);
+                                    }
+                                    $(renderRichText(question.body)).appendTo(this.holder);
+                                    $(renderSection(answerTitle)).appendTo(this.holder);
+                                    $(renderRichText(question.studentAnswer)).appendTo(this.holder);
+                                    $(renderSection(standardTitle)).appendTo(this.holder);
+                                    $(renderRichText(question.answer)).appendTo(this.holder);
+                                    trialDetailModal.setContent($('#trial-detail-content'));
+                                }
+                            });
+                        }).error(function () {
+                            trialDetailModal.setTitle('加载失败')
+                        });
+                    }
+                } else {
+                    trialDetailModal.setTitle('加载失败')
+                }
             }
         });
-    });
-    return count;
-}
+    }
+
+    function textCount(jsonBody) {
+        let sections = jsonBody.sections || [];
+        let count = 0;
+        sections.forEach(section => {
+            let blocks = section.blocks || [];
+            blocks.forEach(block => {
+                if (block.type === 'text' && block.value != undefined) {
+                    count += block.value.length;
+                }
+            });
+        });
+        return count;
+    }
 </script>
 
 

+ 82 - 85
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcess.jsp

@@ -1,92 +1,89 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				clearUrl: '${ctx}/admin/exam/arbitrate/clear',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-history':{
-                        pageSize:10
-                    },
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				getUrl : '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				historyUrl : '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
-				submitUrl : '${ctx}/admin/exam/arbitrate/saveTask',
-				clearUrl : '${ctx}/admin/exam/arbitrate/clear'
-			});
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            getUrl: '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            historyUrl: '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear'
+        });
+    });
+</script>
 </body>
 </html>

+ 77 - 79
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcessJson.jsp

@@ -1,86 +1,84 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				clearUrl: '${ctx}/admin/exam/arbitrate/clear',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-history':{
-                        pageSize:10
-                    },
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				getUrl : '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				historyUrl : '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
-				submitUrl : '${ctx}/admin/exam/arbitrate/saveTask',
-				clearUrl : '${ctx}/admin/exam/arbitrate/clear'
-			});
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'warning-info': {}
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            getUrl: '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            historyUrl: '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear'
+        });
+    });
+</script>
 </body>
 </html>

+ 79 - 82
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcess.jsp

@@ -1,89 +1,86 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.on('task.submit.success', this, function(event, context){
-                window.close();
-            });
-            mc.on('task.submit.error', this, function(event, context){
-                //window.close();
-            });
-            $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function(task){
-                mc.setTask(task);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        mc.on('task.submit.success', this, function (event, context) {
+            window.close();
+        });
+        mc.on('task.submit.error', this, function (event, context) {
+            //window.close();
+        });
+        $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function (task) {
+            mc.setTask(task);
+        });
+    });
+</script>
 </body>
 </html>

+ 74 - 76
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcessJson.jsp

@@ -1,83 +1,81 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-			mc.on('task.submit.success', this, function(event, context){
-                window.close();
-            });
-            mc.on('task.submit.error', this, function(event, context){
-                //window.close();
-            });
-            $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function(task){
-                mc.setTask(task);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'warning-info': {}
+            }
+        });
+        mc.on('task.submit.success', this, function (event, context) {
+            window.close();
+        });
+        mc.on('task.submit.error', this, function (event, context) {
+            //window.close();
+        });
+        $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function (task) {
+            mc.setTask(task);
+        });
+    });
+</script>
 </body>
 </html>

+ 231 - 228
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswerEdit.jsp

@@ -1,34 +1,36 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <html lang="en">
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
-
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
+    
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
 </head>
 <body id="index">
 <div class="wp">
     <div id="top" class="top cl">
-        <div class="z"><div>
-            <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
-            <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
-            <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
-            <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
-            <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
-            <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
-            <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
-            <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
-        </div></div>
+        <div class="z">
+            <div>
+                <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
+                <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
+                <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
+                <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
+                <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
+                <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
+                <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
+                <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
+            </div>
+        </div>
         <div class="y cl">
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
@@ -41,28 +43,28 @@
         <div class="box">
             <div class="cont cl">
                 <div id="left" class="left">
-                        <div class="form-m">
-                            <div class="form-t">
-                                <span class="b">是否缺考:</span>
-                                <label>
+                    <div class="form-m">
+                        <div class="form-t">
+                            <span class="b">是否缺考:</span>
+                            <label>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
-                                </label>
-                                <label>
+                            </label>
+                            <label>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
-                                </label>
-                                <span class="b">试卷类型:</span>
-                                <label>
+                            </label>
+                            <span class="b">试卷类型:</span>
+                            <label>
                                 <input id="paperType" name="paperType" class="input-large" maxlength="1"/>
-                                </label>
-                            </div>
-                            <div id="answer-content">
-                            </div>
+                            </label>
                         </div>
-                        <div class="form-b cl">
-                            <input type="button" id="save-button" value="保存"/>
-                            <input type="button" id="previous-button" class="next" value="上一张"/>
-                            <input type="button" id="next-button" class="next" value="下一张"/>
+                        <div id="answer-content">
                         </div>
+                    </div>
+                    <div class="form-b cl">
+                        <input type="button" id="save-button" value="保存"/>
+                        <input type="button" id="previous-button" class="next" value="上一张"/>
+                        <input type="button" id="next-button" class="next" value="下一张"/>
+                    </div>
                 </div>
                 <div class="right">
                     <div style="position:relative;" class="image-content" id="image-holder">
@@ -74,214 +76,215 @@
 </div>
 </body>
 <script type="text/javascript">
-var ids = [${ids}];
-var current;
-var student;
-var iviewer;
-var regex = /^[a-z]+$/ig;
-$(document).ready(function() {
-    $('#next-button').click(function(){
-        process(current+1);
-    });
-    $('#previous-button').click(function(){
-        process(current-1);
-    });
-    $('#save-button').click(save);
-    $('.absent-select').click(function(){
-        if(!$(this).hasClass('on')) {
-            $('.absent-select').removeClass('on');
-            $(this).addClass('on');
-        }
-        if(student!=undefined) {
-            student.absent = $(this).attr('data-absent')=='true';
-        }
-    });
-    $('#zoom-in-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', 1);
-        }
-    });
-    $('#zoom-out-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', -1);
+    var ids = [${ids}];
+    var current;
+    var student;
+    var iviewer;
+    var regex = /^[a-z]+$/ig;
+    $(document).ready(function () {
+        $('#next-button').click(function () {
+            process(current + 1);
+        });
+        $('#previous-button').click(function () {
+            process(current - 1);
+        });
+        $('#save-button').click(save);
+        $('.absent-select').click(function () {
+            if (!$(this).hasClass('on')) {
+                $('.absent-select').removeClass('on');
+                $(this).addClass('on');
+            }
+            if (student != undefined) {
+                student.absent = $(this).attr('data-absent') == 'true';
+            }
+        });
+        $('#zoom-in-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', 1);
+            }
+        });
+        $('#zoom-out-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', -1);
+            }
+        });
+        $('#zoom-origin-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('set_zoom', 100);
+            }
+        });
+        $('#zoom-fit-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('fit');
+            }
+        });
+        if (ids.length == 0) {
+            alert('没有需要处理的考生,请返回重新搜索');
+            return;
         }
+        process(1);
     });
-    $('#zoom-origin-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('set_zoom', 100);
+
+    function process(index) {
+        if (index < 1) {
+            return;
         }
-    });
-    $('#zoom-fit-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('fit');
+        if (index > ids.length) {
+            alert('所有考生已处理完毕,请返回重新搜索');
+            return;
         }
-    });
-    if(ids.length==0){
-        alert('没有需要处理的考生,请返回重新搜索');
-        return;
+        current = index;
+        $('#answer-content').empty();
+        $('#image-holder').hide();
+        $('#save-button').attr("disabled", true);
+        $('#previous-button').attr("disabled", true);
+        $('#next-button').attr("disabled", true);
+        $.post('${ctx}/admin/exam/check/answer/info', {
+            studentId: ids[index - 1]
+        }, function (result) {
+            student = result;
+            render();
+        }).error(function () {
+            alert('获取考生信息出错');
+            onProcessFinish(true)
+        });
     }
-    process(1);
-});
 
-function process(index){
-    if(index<1){
-        return;
-    }
-    if(index > ids.length){
-        alert('所有考生已处理完毕,请返回重新搜索');
-        return;
+    function onProcessFinish(error) {
+        if (!error) {
+            $('#save-button').removeAttr("disabled");
+        }
+        $('#previous-button').removeAttr("disabled");
+        $('#next-button').removeAttr("disabled");
     }
-    current = index;
-    $('#answer-content').empty();
-    $('#image-holder').hide();
-    $('#save-button').attr("disabled", true);
-    $('#previous-button').attr("disabled", true);
-    $('#next-button').attr("disabled", true);
-    $.post('${ctx}/admin/exam/check/answer/info', {
-        studentId: ids[index-1]
-    }, function(result){
-        student = result;
-        render();
-    }).error(function() {
-        alert('获取考生信息出错');
-        onProcessFinish(true)
-    });
-}
 
-function onProcessFinish(error) {
-    if(!error) {
-        $('#save-button').removeAttr("disabled");
-    }
-    $('#previous-button').removeAttr("disabled");
-    $('#next-button').removeAttr("disabled");
-}
+    function render() {
+        $('#progress').html(current + '/' + ids.length);
+        $('#name').html(student.name);
+        $('#examNumber').html(student.examNumber);
+        $('#studentCode').html(student.studentCode);
+        $('#subject').html(student.subjectCode + '_' + student.subjectName);
+        $('#campusName').html(student.campusName);
+        $('#objectiveScore').html(student.objectiveScore);
+        $('#subjectiveScore').html(student.subjectiveScore);
 
-function render(){
-    $('#progress').html(current+'/'+ids.length);
-    $('#name').html(student.name);
-    $('#examNumber').html(student.examNumber);
-    $('#studentCode').html(student.studentCode);
-    $('#subject').html(student.subjectCode+'_'+student.subjectName);
-    $('#campusName').html(student.campusName);
-    $('#objectiveScore').html(student.objectiveScore);
-    $('#subjectiveScore').html(student.subjectiveScore);
-    
-    $('.absent-select').removeClass('on');
-    if(student.absent==true){
-        $('.absent-select[data-absent="true"]').addClass('on');
-    }else{
-        $('.absent-select[data-absent="false"]').addClass('on');
-    }
-    $('.form-t').find('input').on('input', onPaperTypeInput);
-    
-    var count = {};
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var title = student.titles[q.mainNumber];
-            var dom = $('#answer-content dl[number="'+q.mainNumber+'"]');
-            if(dom.length<1){
-                dom = $('<dl number="'+q.mainNumber+'"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
-                dom.find('span.b').html(student.titles[q.mainNumber]);
-            }
-            if(count[q.mainNumber]==undefined){
-                count[q.mainNumber] = 0;
-            }
-            count[q.mainNumber]++;
-            dom.find('span.num').html('('+count[q.mainNumber]+')');
-            
-            q.dom = $('<span class="input"><em>'+q.subNumber+'</em><input type="text" value="'+q.answer+'" number="'+i+'"/></span>').appendTo(dom.find('dd'));
-            if(title.indexOf('多项选择')>=0 || title.indexOf('多选')>=0){
-                q.dom.find('input').addClass('large');
+        $('.absent-select').removeClass('on');
+        if (student.absent == true) {
+            $('.absent-select[data-absent="true"]').addClass('on');
+        } else {
+            $('.absent-select[data-absent="false"]').addClass('on');
+        }
+        $('.form-t').find('input').on('input', onPaperTypeInput);
+
+        var count = {};
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var title = student.titles[q.mainNumber];
+                var dom = $('#answer-content dl[number="' + q.mainNumber + '"]');
+                if (dom.length < 1) {
+                    dom = $('<dl number="' + q.mainNumber + '"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
+                    dom.find('span.b').html(student.titles[q.mainNumber]);
+                }
+                if (count[q.mainNumber] == undefined) {
+                    count[q.mainNumber] = 0;
+                }
+                count[q.mainNumber]++;
+                dom.find('span.num').html('(' + count[q.mainNumber] + ')');
+
+                q.dom = $('<span class="input"><em>' + q.subNumber + '</em><input type="text" value="' + q.answer + '" number="' + i + '"/></span>').appendTo(dom.find('dd'));
+                if (title.indexOf('多项选择') >= 0 || title.indexOf('多选') >= 0) {
+                    q.dom.find('input').addClass('large');
+                }
+                q.dom.find('input').on('input', onAnswerInput);
+                q.dom.find('input').on('focus', onAnswerFocus);
             }
-            q.dom.find('input').on('input', onAnswerInput);
-            q.dom.find('input').on('focus', onAnswerFocus);
+        }
+
+        if (iviewer == undefined) {
+            iviewer = $('#image-holder').iviewer({
+                src: '${fileServer}' + student.sheetUrls[0],
+                zoom_delta: 1.2,
+                zoom: 'fit',
+                zoom_min: 10,
+                mousewheel: false,
+                zoom_animation: false,
+                update_on_resize: true,
+                ui_disabled: true,
+                onFinishLoad: function (ev, url) {
+                    $('#image-holder').show();
+                    onProcessFinish(false);
+                },
+                onErrorLoad: function (ev, url) {
+                    onProcessFinish(true);
+                }
+            });
+        } else {
+            iviewer.iviewer('loadImage', '${fileServer}' + student.sheetUrls[0]);
         }
     }
 
-    if(iviewer==undefined){
-        iviewer = $('#image-holder').iviewer({
-            src: '${sheetServer}' + student.sheetUrls[0],
-            zoom_delta: 1.2,
-            zoom: 'fit',
-            zoom_min: 10,
-            mousewheel: false,
-            zoom_animation: false,
-            update_on_resize: true,
-            ui_disabled: true,
-            onFinishLoad: function(ev, url) {
-                $('#image-holder').show();
-                onProcessFinish(false);
-            },
-            onErrorLoad: function(ev, url) {
-                onProcessFinish(true);
+    function save() {
+        if (student == undefined) {
+            return;
+        }
+        var array = [];
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var value = q.dom.find('input').val();
+                if (value.length == 0) {
+                    value = '#';
+                }
+                array.push(value);
+            } else {
+                array.push(q.answer);
+            }
+        }
+        $.post('${ctx}/admin/exam/check/answer/save', {
+            studentId: student.id,
+            absent: student.absent,
+            answers: array.join(',')
+        }, function (result) {
+            if (result == true) {
+                process(current + 1);
+            } else {
+                alert('保存失败,请稍后重试');
             }
         });
-    }else{
-        iviewer.iviewer('loadImage', '${sheetServer}' + student.sheetUrls[0]);
     }
-}
 
-function save(){
-    if(student==undefined){
-        return;
+    function onAnswerFocus() {
+        $(this)[0].select();
     }
-    var array = [];
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var value = q.dom.find('input').val();
-            if(value.length==0){
-                value='#';
-            }
-            array.push(value);
-        }else{
-            array.push(q.answer);
+
+    function onAnswerInput() {
+        var value = $(this).val();
+        var q = student.answers[parseInt($(this).attr('number'))];
+        if (value.length > 1 && q.multi == false) {
+            value = value.substring(value.length - 1);
         }
-    }
-    $.post('${ctx}/admin/exam/check/answer/save', {
-        studentId: student.id,
-        absent: student.absent,
-        answers: array.join(',')
-    }, function(result){
-        if(result==true){
-            process(current+1);
-        }else{
-            alert('保存失败,请稍后重试');
+        regex.lastIndex = 0;
+        if (value.length == 0 || regex.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
         }
-    });
-}
-
-function onAnswerFocus(){
-    $(this)[0].select();
-}
-
-function onAnswerInput(){
-    var value = $(this).val();
-    var q = student.answers[parseInt($(this).attr('number'))];
-    if(value.length>1 && q.multi==false){
-        value = value.substring(value.length-1);
-    }
-    regex.lastIndex = 0;
-    if(value.length==0 || regex.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
-    }
-    $(this).val(value);
-}
-function onPaperTypeInput(){
-    var value = $(this).val();
-    if(value.length>1){
-        value = value.substring(value.length-1);
+        $(this).val(value);
     }
-    var re = new RegExp("^[a-zA-Z#]+$"); 
-    if(value.length==0 || re.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
+
+    function onPaperTypeInput() {
+        var value = $(this).val();
+        if (value.length > 1) {
+            value = value.substring(value.length - 1);
+        }
+        var re = new RegExp("^[a-zA-Z#]+$");
+        if (value.length == 0 || re.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
+        }
+        $(this).val(value);
     }
-    $(this).val(value);
-}
 </script>
 </html>

+ 217 - 215
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudentEdit.jsp

@@ -1,34 +1,36 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <html lang="en">
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
-
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
+    
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
 </head>
 <body id="index">
 <div class="wp">
     <div id="top" class="top cl">
-        <div class="z"><div>
-            <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
-            <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
-            <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
-            <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
-            <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
-            <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
-            <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
-            <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
-        </div></div>
+        <div class="z">
+            <div>
+                <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
+                <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
+                <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
+                <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
+                <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
+                <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
+                <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
+                <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
+            </div>
+        </div>
         <div class="y cl">
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
@@ -41,24 +43,24 @@
         <div class="box">
             <div class="cont cl">
                 <div id="left" class="left">
-                        <div class="form-m">
-                      <!--       <div class="form-t">
-                                <span class="b">是否缺考:</span>
-                                <label>
-                                <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
-                                </label>
-                                <label>
-                                <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
-                                </label>
-                            </div> -->
-                            <div id="answer-content">
-                            </div>
-                        </div>
-                        <div class="form-b cl">
-                            <input type="button" id="save-button" value="保存"/>
-                            <input type="button" id="previous-button" class="next" value="上一张"/>
-                            <input type="button" id="next-button" class="next" value="下一张"/>
+                    <div class="form-m">
+                        <!--       <div class="form-t">
+                                  <span class="b">是否缺考:</span>
+                                  <label>
+                                  <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
+                                  </label>
+                                  <label>
+                                  <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
+                                  </label>
+                              </div> -->
+                        <div id="answer-content">
                         </div>
+                    </div>
+                    <div class="form-b cl">
+                        <input type="button" id="save-button" value="保存"/>
+                        <input type="button" id="previous-button" class="next" value="上一张"/>
+                        <input type="button" id="next-button" class="next" value="下一张"/>
+                    </div>
                 </div>
                 <div class="right">
                     <div style="position:relative;" class="image-content" id="image-holder">
@@ -70,200 +72,200 @@
 </div>
 </body>
 <script type="text/javascript">
-var ids = [${ids}];
-var current;
-var student;
-var iviewer;
-var regex = /^[a-z]+$/ig;
-$(document).ready(function() {
-    $('#next-button').click(function(){
-        process(current+1);
-    });
-    $('#previous-button').click(function(){
-        process(current-1);
-    });
-    $('#save-button').click(save);
-    $('.absent-select').click(function(){
-        if(!$(this).hasClass('on')) {
-            $('.absent-select').removeClass('on');
-            $(this).addClass('on');
-        }
-        if(student!=undefined) {
-            student.absent = $(this).attr('data-absent')=='true';
-        }
-    });
-    $('#zoom-in-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', 1);
-        }
-    });
-    $('#zoom-out-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', -1);
+    var ids = [${ids}];
+    var current;
+    var student;
+    var iviewer;
+    var regex = /^[a-z]+$/ig;
+    $(document).ready(function () {
+        $('#next-button').click(function () {
+            process(current + 1);
+        });
+        $('#previous-button').click(function () {
+            process(current - 1);
+        });
+        $('#save-button').click(save);
+        $('.absent-select').click(function () {
+            if (!$(this).hasClass('on')) {
+                $('.absent-select').removeClass('on');
+                $(this).addClass('on');
+            }
+            if (student != undefined) {
+                student.absent = $(this).attr('data-absent') == 'true';
+            }
+        });
+        $('#zoom-in-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', 1);
+            }
+        });
+        $('#zoom-out-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', -1);
+            }
+        });
+        $('#zoom-origin-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('set_zoom', 100);
+            }
+        });
+        $('#zoom-fit-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('fit');
+            }
+        });
+        if (ids.length == 0) {
+            alert('没有需要处理的考生,请返回重新搜索');
+            return;
         }
+        process(1);
     });
-    $('#zoom-origin-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('set_zoom', 100);
+
+    function process(index) {
+        if (index < 1) {
+            return;
         }
-    });
-    $('#zoom-fit-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('fit');
+        if (index > ids.length) {
+            alert('所有考生已处理完毕,请返回重新搜索');
+            return;
         }
-    });
-    if(ids.length==0){
-        alert('没有需要处理的考生,请返回重新搜索');
-        return;
+        current = index;
+        $('#answer-content').empty();
+        $('#image-holder').hide();
+        $('#save-button').attr("disabled", true);
+        $('#previous-button').attr("disabled", true);
+        $('#next-button').attr("disabled", true);
+        $.post('${ctx}/admin/exam/check/answer/info', {
+            studentId: ids[index - 1]
+        }, function (result) {
+            student = result;
+            render();
+        }).error(function () {
+            alert('获取考生信息出错');
+            onProcessFinish(true)
+        });
     }
-    process(1);
-});
 
-function process(index){
-    if(index<1){
-        return;
-    }
-    if(index > ids.length){
-        alert('所有考生已处理完毕,请返回重新搜索');
-        return;
+    function onProcessFinish(error) {
+        if (!error) {
+            $('#save-button').removeAttr("disabled");
+        }
+        $('#previous-button').removeAttr("disabled");
+        $('#next-button').removeAttr("disabled");
     }
-    current = index;
-    $('#answer-content').empty();
-    $('#image-holder').hide();
-    $('#save-button').attr("disabled", true);
-    $('#previous-button').attr("disabled", true);
-    $('#next-button').attr("disabled", true);
-    $.post('${ctx}/admin/exam/check/answer/info', {
-        studentId: ids[index-1]
-    }, function(result){
-        student = result;
-        render();
-    }).error(function() {
-        alert('获取考生信息出错');
-        onProcessFinish(true)
-    });
-}
 
-function onProcessFinish(error) {
-    if(!error) {
-        $('#save-button').removeAttr("disabled");
-    }
-    $('#previous-button').removeAttr("disabled");
-    $('#next-button').removeAttr("disabled");
-}
+    function render() {
+        $('#progress').html(current + '/' + ids.length);
+        $('#name').html(student.name);
+        $('#examNumber').html(student.examNumber);
+        $('#studentCode').html(student.studentCode);
+        $('#subject').html(student.subjectCode + '_' + student.subjectName);
+        $('#campusName').html(student.campusName);
+        $('#objectiveScore').html(student.objectiveScore);
+        $('#subjectiveScore').html(student.subjectiveScore);
 
-function render(){
-    $('#progress').html(current+'/'+ids.length);
-    $('#name').html(student.name);
-    $('#examNumber').html(student.examNumber);
-    $('#studentCode').html(student.studentCode);
-    $('#subject').html(student.subjectCode+'_'+student.subjectName);
-    $('#campusName').html(student.campusName);
-    $('#objectiveScore').html(student.objectiveScore);
-    $('#subjectiveScore').html(student.subjectiveScore);
-    
-    $('.absent-select').removeClass('on');
-    if(student.absent==true){
-        $('.absent-select[data-absent="true"]').addClass('on');
-    }else{
-        $('.absent-select[data-absent="false"]').addClass('on');
-    }
-    
-    var count = {};
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var title = student.titles[q.mainNumber];
-            var dom = $('#answer-content dl[number="'+q.mainNumber+'"]');
-            if(dom.length<1){
-                dom = $('<dl number="'+q.mainNumber+'"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
-                dom.find('span.b').html(student.titles[q.mainNumber]);
-            }
-            if(count[q.mainNumber]==undefined){
-                count[q.mainNumber] = 0;
-            }
-            count[q.mainNumber]++;
-            dom.find('span.num').html('('+count[q.mainNumber]+')');
-            
-            q.dom = $('<span class="input"><em>'+q.subNumber+'</em><input type="text" value="'+q.answer+'" number="'+i+'"/></span>').appendTo(dom.find('dd'));
-            if(title.indexOf('多项选择')>=0 || title.indexOf('多选')>=0){
-                q.dom.find('input').addClass('large');
+        $('.absent-select').removeClass('on');
+        if (student.absent == true) {
+            $('.absent-select[data-absent="true"]').addClass('on');
+        } else {
+            $('.absent-select[data-absent="false"]').addClass('on');
+        }
+
+        var count = {};
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var title = student.titles[q.mainNumber];
+                var dom = $('#answer-content dl[number="' + q.mainNumber + '"]');
+                if (dom.length < 1) {
+                    dom = $('<dl number="' + q.mainNumber + '"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
+                    dom.find('span.b').html(student.titles[q.mainNumber]);
+                }
+                if (count[q.mainNumber] == undefined) {
+                    count[q.mainNumber] = 0;
+                }
+                count[q.mainNumber]++;
+                dom.find('span.num').html('(' + count[q.mainNumber] + ')');
+
+                q.dom = $('<span class="input"><em>' + q.subNumber + '</em><input type="text" value="' + q.answer + '" number="' + i + '"/></span>').appendTo(dom.find('dd'));
+                if (title.indexOf('多项选择') >= 0 || title.indexOf('多选') >= 0) {
+                    q.dom.find('input').addClass('large');
+                }
+                q.dom.find('input').on('input', onAnswerInput);
+                q.dom.find('input').on('focus', onAnswerFocus);
             }
-            q.dom.find('input').on('input', onAnswerInput);
-            q.dom.find('input').on('focus', onAnswerFocus);
+        }
+
+        if (iviewer == undefined) {
+            iviewer = $('#image-holder').iviewer({
+                src: '${fileServer}' + student.sheetUrls[0],
+                zoom_delta: 1.2,
+                zoom: 'fit',
+                zoom_min: 10,
+                mousewheel: false,
+                zoom_animation: false,
+                update_on_resize: true,
+                ui_disabled: true,
+                onFinishLoad: function (ev, url) {
+                    $('#image-holder').show();
+                    onProcessFinish(false);
+                },
+                onErrorLoad: function (ev, url) {
+                    onProcessFinish(true);
+                }
+            });
+        } else {
+            iviewer.iviewer('loadImage', '${fileServer}' + student.sheetUrls[0]);
         }
     }
 
-    if(iviewer==undefined){
-        iviewer = $('#image-holder').iviewer({
-            src: '${sheetServer}' + student.sheetUrls[0],
-            zoom_delta: 1.2,
-            zoom: 'fit',
-            zoom_min: 10,
-            mousewheel: false,
-            zoom_animation: false,
-            update_on_resize: true,
-            ui_disabled: true,
-            onFinishLoad: function(ev, url) {
-                $('#image-holder').show();
-                onProcessFinish(false);
-            },
-            onErrorLoad: function(ev, url) {
-                onProcessFinish(true);
+    function save() {
+        if (student == undefined) {
+            return;
+        }
+        var array = [];
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var value = q.dom.find('input').val();
+                if (value.length == 0) {
+                    value = '#';
+                }
+                array.push(value);
+            } else {
+                array.push(q.answer);
+            }
+        }
+        $.post('${ctx}/admin/exam/check/student/save', {
+            studentId: student.id,
+            absent: student.absent,
+            answers: array.join(',')
+        }, function (result) {
+            if (result == true) {
+                process(current + 1);
+            } else {
+                alert('保存失败,请稍后重试');
             }
         });
-    }else{
-        iviewer.iviewer('loadImage', '${sheetServer}' + student.sheetUrls[0]);
     }
-}
 
-function save(){
-    if(student==undefined){
-        return;
+    function onAnswerFocus() {
+        $(this)[0].select();
     }
-    var array = [];
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var value = q.dom.find('input').val();
-            if(value.length==0){
-                value='#';
-            }
-            array.push(value);
-        }else{
-            array.push(q.answer);
+
+    function onAnswerInput() {
+        var value = $(this).val();
+        var q = student.answers[parseInt($(this).attr('number'))];
+        if (value.length > 1 && q.multi == false) {
+            value = value.substring(value.length - 1);
         }
-    }
-    $.post('${ctx}/admin/exam/check/student/save', {
-        studentId: student.id,
-        absent: student.absent,
-        answers: array.join(',')
-    }, function(result){
-        if(result==true){
-            process(current+1);
-        }else{
-            alert('保存失败,请稍后重试');
+        regex.lastIndex = 0;
+        if (value.length == 0 || regex.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
         }
-    });
-}
-
-function onAnswerFocus(){
-    $(this)[0].select();
-}
-
-function onAnswerInput(){
-    var value = $(this).val();
-    var q = student.answers[parseInt($(this).attr('number'))];
-    if(value.length>1 && q.multi==false){
-        value = value.substring(value.length-1);
-    }
-    regex.lastIndex = 0;
-    if(value.length==0 || regex.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
+        $(this).val(value);
     }
-    $(this).val(value);
-}
 </script>
 </html>

+ 7 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspected.jsp

@@ -195,7 +195,9 @@
         
         
         
-        ${sheetServer}' + student.sheetUrls[0],
+        
+        
+        ${fileServer}' + student.sheetUrls[0],
               zoom_delta: 1.2,
               zoom: 'fit',
               zoom_min: 10,
@@ -221,12 +223,14 @@
         
         
         
-        ${sheetServer}' + student.sheetUrls[0]);
+        
+        
+        ${fileServer}' + student.sheetUrls[0]);
     } */
         var pane = $('<canvas id="track-builder-canvas"></canvas>').appendTo($('#image-holder-track'));
         var canvas = document.getElementById('track-builder-canvas');
         var ctx = canvas.getContext('2d');
-        buildImages('${sliceServer}', student.picUrls, student.pictureConfig, canvas, ctx, student.markTracks, student.markSpecialTagList);
+        buildImages('${fileServer}', student.picUrls, student.pictureConfig, canvas, ctx, student.markTracks, student.markSpecialTagList);
         $('#image-holder-track').show();
         onProcessFinish(false);
     }

+ 106 - 105
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/jsonView.jsp

@@ -1,121 +1,122 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <html lang="en">
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
-<script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
+    <script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
 
 </head>
 <body id="index">
-	<div id="json-view-content" class="rich-text">
-	</div>
+<div id="json-view-content" class="rich-text">
+</div>
 </body>
 <script type="text/javascript">
-var url = "${jsonServer}${answerUrl}";
-var questionNumbers ="${questionNumbers}";
+    var url = "${fileServer}${answerUrl}";
+    var questionNumbers = "${questionNumbers}";
 
-$(document).ready(function() {
-	initJsonPopover(url,questionNumbers); 
-});
-
-function initJsonPopover(url,questionNumbers){
-	questionNumbers = questionNumbers.split(",");
-	let questionArr = {};
-	questionNumbers.forEach(questionNumber => {
-		questionArr[questionNumber] = true;
+    $(document).ready(function () {
+        initJsonPopover(url, questionNumbers);
     });
-	$('#json-view-content').empty();
-    $.ajax({  
-        type:"GET",  
-        url:url,  
-        dataType:"json",  
-        success:function(data){ 
-        	//var data ='[{"mainNumber": 6,"subNumber": 1,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"}]}]}}]';
-        	//data = JSON.parse(data);
-         	let questions = data || [];
-         	questions.forEach(question => {
-                 // 按题号过滤
-                 if (questionArr[question.mainNumber + "." + question.subNumber] === true || questionNumbers=="") {
-                     let numberTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "题号:" + question.mainNumber + "-" + question.subNumber
-                         }]
-                     };
-                     let bodyTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "题干:"
-                         }]
-                     };
-                     let answerTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "考生答案:"
-                         }, {
-                             "type": "text",
-                             "param": {
-                                 "italic": true,
-                                 "danger": true
-                             },
-                             "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
-                         }]
-                     };
-                     let standardTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "标准答案:"
-                         }]
-                     };
-                     this.holder = $('#json-view-content');
-                     $(renderSection(numberTitle)).appendTo(this.holder);
-                     $(renderSection(bodyTitle)).appendTo(this.holder);
-                     if(question.parentBody!=null && question.parentBody!=undefined){
-     					$(renderRichText(question.parentBody)).appendTo(this.holder); 
-     				}
-                     $(renderRichText(question.body)).appendTo(this.holder);
-                     $(renderSection(answerTitle)).appendTo(this.holder);
-                     $(renderRichText(question.studentAnswer)).appendTo(this.holder);
-                     $(renderSection(standardTitle)).appendTo(this.holder);
-                     $(renderRichText(question.answer)).appendTo(this.holder);
-                 }
-             });
-             if (this.viewer != undefined) {
-                 this.viewer.destroy();
-             }
-         	const viewer = new Viewer($('#json-view-content')[0], {}); 
-          } 
-     }); 
 
-}
-function textCount(jsonBody) {
-    let sections = jsonBody.sections || [];
-    let count = 0;
-    sections.forEach(section => {
-        let blocks = section.blocks || [];
-        blocks.forEach(block => {
-            if (block.type === 'text' && block.value != undefined) {
-                count += block.value.length;
+    function initJsonPopover(url, questionNumbers) {
+        questionNumbers = questionNumbers.split(",");
+        let questionArr = {};
+        questionNumbers.forEach(questionNumber => {
+            questionArr[questionNumber] = true;
+        });
+        $('#json-view-content').empty();
+        $.ajax({
+            type: "GET",
+            url: url,
+            dataType: "json",
+            success: function (data) {
+                //var data ='[{"mainNumber": 6,"subNumber": 1,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"}]}]}}]';
+                //data = JSON.parse(data);
+                let questions = data || [];
+                questions.forEach(question => {
+                    // 按题号过滤
+                    if (questionArr[question.mainNumber + "." + question.subNumber] === true || questionNumbers == "") {
+                        let numberTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "题号:" + question.mainNumber + "-" + question.subNumber
+                            }]
+                        };
+                        let bodyTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "题干:"
+                            }]
+                        };
+                        let answerTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "考生答案:"
+                            }, {
+                                "type": "text",
+                                "param": {
+                                    "italic": true,
+                                    "danger": true
+                                },
+                                "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
+                            }]
+                        };
+                        let standardTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "标准答案:"
+                            }]
+                        };
+                        this.holder = $('#json-view-content');
+                        $(renderSection(numberTitle)).appendTo(this.holder);
+                        $(renderSection(bodyTitle)).appendTo(this.holder);
+                        if (question.parentBody != null && question.parentBody != undefined) {
+                            $(renderRichText(question.parentBody)).appendTo(this.holder);
+                        }
+                        $(renderRichText(question.body)).appendTo(this.holder);
+                        $(renderSection(answerTitle)).appendTo(this.holder);
+                        $(renderRichText(question.studentAnswer)).appendTo(this.holder);
+                        $(renderSection(standardTitle)).appendTo(this.holder);
+                        $(renderRichText(question.answer)).appendTo(this.holder);
+                    }
+                });
+                if (this.viewer != undefined) {
+                    this.viewer.destroy();
+                }
+                const viewer = new Viewer($('#json-view-content')[0], {});
             }
         });
-    });
-    return count;
-}
+
+    }
+
+    function textCount(jsonBody) {
+        let sections = jsonBody.sections || [];
+        let count = 0;
+        sections.forEach(section => {
+            let blocks = section.blocks || [];
+            blocks.forEach(block => {
+                if (block.type === 'text' && block.value != undefined) {
+                    count += block.value.length;
+                }
+            });
+        });
+        return count;
+    }
 </script>
 
 

+ 177 - 166
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperList.jsp

@@ -1,167 +1,178 @@
-<%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<html>
-<head>
-	<title>试卷管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
-</head>
-<body>
-	<div id="objImportBox" class="hide">
-		<form id="objImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-			style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-			<input name="objective" type="hidden" value="true"/>
-			<input name="file" type="file" style="width:330px"/><br/><br/>  
-			<input class="btn btn-primary" type="submit" value="导入" onclick="goObjImport()"/>
-			<a href="${ctx}/admin/exam/paper/template?objective=true">下载模板</a>
-		</form>
-	</div>
-	<div id="subImportBox" class="hide">
-		<form id="subImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-			style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-			<input name="objective" type="hidden" value="false"/>
-			<input name="file" type="file" style="width:330px"/><br/><br/>  
-			<input class="btn btn-primary" type="submit" value="导入" onclick="goSubImport()"/>
-			<a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
-		</form>
-	</div>
-	<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
-	<form id="searchForm" action="${ctx}/admin/exam/paper" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-		<div>
-			<label>科目</label>
-			<select class="input-large" name="code" id="subject-select">
-				<option value="">请选择</option>
-				<c:forEach items="${subjectList}" var="subject">
-				<option value="${subject.code}" data-level="${subject.level}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-			</select>
-			<label>层次</label>
-			<select class="input-small" name="level" id="level-select">
-				<option value="">请选择</option>
-				<c:forEach items="${levelList}" var="level">
-				<option value="${level}" data-level="${level}" <c:if test="${level==query.level}">selected</c:if>>${level}</option>
-				</c:forEach>
-			</select>
-			<label>专业类型</label>
-			<select class="input-small" name="category" id="category-select">
-				<option value="">请选择</option>
-				<c:forEach items="${categoryList}" var="category">
-				<option value="${category}" <c:if test="${category==query.category}">selected</c:if>>${category}</option>
-				</c:forEach>
-			</select>
-			&nbsp;
-			<label>状态</label>
-			<select class="input-small" name="upload">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>已扫描</option>
-				<option value="0" <c:if test="${upload!=null && upload==false}">selected</c:if>>未扫描</option>
-			</select>
-			&nbsp;
-			<label>总分不等于</label>
-			<input type="text" name="totalScoreNotEqual" value="${query.totalScoreNotEqual}"  maxlength="10" class="input-mini"/>
-			<br/><br/>
-			&nbsp;
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;
-			<div class="btn-group">
-				<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-					导入<span class="caret"></span>
-				</a>
-				<ul class="dropdown-menu">
-					<li><a href="##" id="obj-import">客观题</a></li>
-					<li><a href="##" id="sub-import">主观题</a></li>
-				</ul>
-			</div>
-			</c:if>
-			&nbsp;
-			<div class="btn-group">
-				<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-					导出<span class="caret"></span>
-				</a>
-				<ul class="dropdown-menu">
-					<li><a href="${ctx}/admin/exam/paper/export?objective=true">客观题</a></li>
-					<li><a href="${ctx}/admin/exam/paper/export?objective=false">主观题</a></li>
-				</ul>
-			</div>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>科目名称</th>
-				<th>层次</th>
-				<th>专业类型</th>
-				<th>试卷</th>
-				<th>答案</th>
-				<th>客观总分</th>
-				<th>主观总分</th>
-				<th>试卷总分</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${query.result}" var="subject">
-			<tr>
-				<td>
-					<a href="${ctx}/admin/exam/paper/detail?subjectCode=${subject.code}">${subject.code}-${subject.name}&nbsp;${subject.remark}</a>
-				</td>
-				<td>${subject.level}</td>
-				<td>${subject.category}</td>
-				<td>
-				<c:if test="${subject.hasPaper}">
-				<a href="${cardServer}${subject.paperUrl}" target="_blank">已上传</a>
-				</c:if>
-				</td>
-				<td>
-				<c:if test="${subject.hasAnswer}">
-				<a href="${cardServer}${subject.answerUrl}" target="_blank">已上传</a>
-				</c:if>
-				</td>
-				<td>${subject.objectiveScore}</td>
-				<td>${subject.subjectiveScore}</td>
-				<td>${subject.totalScore}</td>
-				<td>
-				<c:if test="${examType!='MULTI_MEDIA'}">
-				<a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">原图遮盖</a>
-				</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-<script type="text/javascript">
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").submit();
-	return false;
-}
-$("#obj-import").click(function(){
-	$.jBox($("#objImportBox").html(), {title:"导入客观题", buttons:{"关闭":true}, 
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#sub-import").click(function(){
-	$.jBox($("#subImportBox").html(), {title:"导入主观题", buttons:{"关闭":true}, 
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-function goObjImport(){
-    alert("导入后请务必重新统分");
-};
-function goSubImport(){
-    alert("导入后请务必重新统分");
-};
-</script>	
-</body>
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>试卷管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
+</head>
+<body>
+<div id="objImportBox" class="hide">
+    <form id="objImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <input name="objective" type="hidden" value="true"/>
+        <input name="file" type="file" style="width:330px"/><br/><br/>  
+        <input class="btn btn-primary" type="submit" value="导入" onclick="goObjImport()"/>
+        <a href="${ctx}/admin/exam/paper/template?objective=true">下载模板</a>
+    </form>
+</div>
+<div id="subImportBox" class="hide">
+    <form id="subImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <input name="objective" type="hidden" value="false"/>
+        <input name="file" type="file" style="width:330px"/><br/><br/>  
+        <input class="btn btn-primary" type="submit" value="导入" onclick="goSubImport()"/>
+        <a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
+    </form>
+</div>
+<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
+<form id="searchForm" action="${ctx}/admin/exam/paper" method="post" class="breadcrumb form-search">
+    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+    <div>
+        <label>科目</label>
+        <select class="input-large" name="code" id="subject-select">
+            <option value="">请选择</option>
+            <c:forEach items="${subjectList}" var="subject">
+                <option value="${subject.code}" data-level="${subject.level}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
+            </c:forEach>
+        </select>
+        <label>层次</label>
+        <select class="input-small" name="level" id="level-select">
+            <option value="">请选择</option>
+            <c:forEach items="${levelList}" var="level">
+                <option value="${level}" data-level="${level}" <c:if test="${level==query.level}">selected</c:if>>${level}</option>
+            </c:forEach>
+        </select>
+        <label>专业类型</label>
+        <select class="input-small" name="category" id="category-select">
+            <option value="">请选择</option>
+            <c:forEach items="${categoryList}" var="category">
+                <option value="${category}" <c:if test="${category==query.category}">selected</c:if>>${category}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <label>状态</label>
+        <select class="input-small" name="upload">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>已扫描</option>
+            <option value="0" <c:if test="${upload!=null && upload==false}">selected</c:if>>未扫描</option>
+        </select>
+        &nbsp;
+        <label>总分不等于</label>
+        <input type="text" name="totalScoreNotEqual" value="${query.totalScoreNotEqual}" maxlength="10" class="input-mini"/>
+        <br/><br/>
+        &nbsp;
+        <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;
+            <div class="btn-group">
+                <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                    导入<span class="caret"></span>
+                </a>
+                <ul class="dropdown-menu">
+                    <li><a href="##" id="obj-import">客观题</a></li>
+                    <li><a href="##" id="sub-import">主观题</a></li>
+                </ul>
+            </div>
+        </c:if>
+        &nbsp;
+        <div class="btn-group">
+            <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                导出<span class="caret"></span>
+            </a>
+            <ul class="dropdown-menu">
+                <li><a href="${ctx}/admin/exam/paper/export?objective=true">客观题</a></li>
+                <li><a href="${ctx}/admin/exam/paper/export?objective=false">主观题</a></li>
+            </ul>
+        </div>
+    </div>
+</form>
+<tags:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>科目名称</th>
+        <th>层次</th>
+        <th>专业类型</th>
+        <th>试卷</th>
+        <th>答案</th>
+        <th>客观总分</th>
+        <th>主观总分</th>
+        <th>试卷总分</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${query.result}" var="subject">
+        <tr>
+            <td>
+                <a href="${ctx}/admin/exam/paper/detail?subjectCode=${subject.code}">${subject.code}-${subject.name}&nbsp;${subject.remark}</a>
+            </td>
+            <td>${subject.level}</td>
+            <td>${subject.category}</td>
+            <td>
+                <c:if test="${subject.paperUrl != null}">
+                    <a href="${fileServer}${subject.paperUrl}" target="_blank">已上传</a>
+                </c:if>
+            </td>
+            <td>
+                <c:if test="${subject.answerUrl != null}">
+                    <a href="${fileServer}${subject.answerUrl}" target="_blank">已上传</a>
+                </c:if>
+            </td>
+            <td>${subject.objectiveScore}</td>
+            <td>${subject.subjectiveScore}</td>
+            <td>${subject.totalScore}</td>
+            <td>
+                <c:if test="${examType!='MULTI_MEDIA'}">
+                    <a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">原图遮盖</a>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<script type="text/javascript">
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").submit();
+        return false;
+    }
+
+    $("#obj-import").click(function () {
+        $.jBox($("#objImportBox").html(), {
+            title: "导入客观题", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+    $("#sub-import").click(function () {
+        $.jBox($("#subImportBox").html(), {
+            title: "导入主观题", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+
+    function goObjImport() {
+        alert("导入后请务必重新统分");
+    };
+
+    function goSubImport() {
+        alert("导入后请务必重新统分");
+    };
+</script>
+</body>
 </html>

+ 66 - 69
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcess.jsp

@@ -1,77 +1,74 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
 
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'quality-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-            $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function(taskList){
-                mc.setTask(taskList[0]);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'quality-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function (taskList) {
+            mc.setTask(taskList[0]);
+        });
+    });
+</script>
 </body>
 </html>

+ 64 - 66
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcessJson.jsp

@@ -1,74 +1,72 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
 
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'quality-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-            $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function(taskList){
-                mc.setTask(taskList[0]);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'quality-process': {},
+                'warning-info': {}
+            }
+        });
+        $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function (taskList) {
+            mc.setTask(taskList[0]);
+        });
+    });
+</script>
 </body>
 </html>

+ 79 - 74
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanPackage.jsp

@@ -1,83 +1,88 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>扫描进度</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+    <title>扫描进度</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
-		<!--<li><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
-		<li class="active"><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
-	</ul>
-	<form id="searchForm" action="${ctx}/admin/exam/scan/package" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-
-		<label>编号</label>
-		<input type="text" name="code" value="${query.code}" class="input-medium"/>
-		&nbsp;
-		<label>状态</label>
-		<select name="upload" class="input-small">
-			<option value="">不限</option>
-			<option value="false" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
-			<option value="true" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
-		</select>
-		&nbsp;
-		<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		&nbsp;
-		<input id="btnTotalCount" class="btn" type="button" value="总数:${totalCount}"/>
-	</form>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>签到表编号</th>
-				<th>图片数量</th>
-				<th>查看图片</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${packageList}" var="pac">
-			<tr>
-				<td>${pac.code}</td>
-				<td>${pac.picCount}</td>
-				<td>
-				<a class="view-link" href="##" data-image-url="${pac.urlString}" data-title="${pac.code}">查看</a>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
+    <!--<li><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
+    <li class="active"><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
+</ul>
+<form id="searchForm" action="${ctx}/admin/exam/scan/package" method="post" class="breadcrumb form-search">
+    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+    
+    <label>编号</label>
+    <input type="text" name="code" value="${query.code}" class="input-medium"/>
+    &nbsp;
+    <label>状态</label>
+    <select name="upload" class="input-small">
+        <option value="">不限</option>
+        <option value="false" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
+        <option value="true" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
+    </select>
+    &nbsp;
+    <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+    &nbsp;
+    <input id="btnTotalCount" class="btn" type="button" value="总数:${totalCount}"/>
+</form>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>签到表编号</th>
+        <th>图片数量</th>
+        <th>查看图片</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${packageList}" var="pac">
+        <tr>
+            <td>${pac.code}</td>
+            <td>${pac.picCount}</td>
+            <td>
+                <a class="view-link" href="##" data-image-url="${pac.urlString}" data-title="${pac.code}">查看</a>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
-$(document).ready(function() {
-    /* new jBox('Image', {
-    	imageFade: 0,
-    	delayOpen: 0,
-    	delayClose: 0,
-    	maxHeight: $(window).height()*0.88
-    }); */
-    $('.view-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
+    $(document).ready(function () {
+        /* new jBox('Image', {
+            imageFade: 0,
+            delayOpen: 0,
+            delayClose: 0,
+            maxHeight: $(window).height()*0.88
+        }); */
+        $('.view-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
+            return false;
+        });
     });
-});
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").submit();
-	return false;
-}
-</script>	
+
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").submit();
+        return false;
+    }
+</script>
 </body>
 </html>

+ 102 - 98
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreDetail.jsp

@@ -1,107 +1,111 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>分数查询</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
-	
-	<link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
-	<script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
+    <title>分数查询</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
+    
+    <link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
+    <script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
 </head>
 <body>
-	<form id="searchForm" action="" method="post" class="breadcrumb form-search">
-		<div>
-			<label>姓名:${student.name}</label>
-			<label>准考证号:${student.examNumber}</label>
-			<label>学号:${student.studentCode}</label>
-			<label>科目:${student.subjectCode}-${student.subjectName}</label>
-			<label>客观总分:${student.objectiveScore}</label>
-			<label>主观总分:${student.subjectiveScore}</label>
-			<label>试卷总分:${student.totalScore}</label>
-			<br/>
-			&nbsp;
-			<a class="btn sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
-			&nbsp;
-			<a class="btn package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>		
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;
-			<a class="btn btn-warning" href="##" id="edit-button">保存</a>
-			</c:if>
-			&nbsp;
-			<a class="btn" href="${ctx}/admin/exam/score?${queryString}">返回</a>
-		</div>
-	</form>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>题目</th>
-				<th>分数</th>
-				<th>答案</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${scoreList}" var="item">
-			<tr class="score-tr" data-objective="${item.objective}">
-				<td>${item.title}</td>
-				<td><input class="score-input" value="${item.scoreString}"/></td>
-				<td>
-				<c:if test="${item.objective==true}">
-				<input class="answer-input" value="${item.answer}"/>
-				</c:if>
-				<c:if test="${item.objective==false}">
-				&nbsp;
-				</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+<form id="searchForm" action="" method="post" class="breadcrumb form-search">
+    <div>
+        <label>姓名:${student.name}</label>
+        <label>准考证号:${student.examNumber}</label>
+        <label>学号:${student.studentCode}</label>
+        <label>科目:${student.subjectCode}-${student.subjectName}</label>
+        <label>客观总分:${student.objectiveScore}</label>
+        <label>主观总分:${student.subjectiveScore}</label>
+        <label>试卷总分:${student.totalScore}</label>
+        <br/>
+        &nbsp;
+        <a class="btn sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
+           data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
+        &nbsp;
+        <a class="btn package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;
+            <a class="btn btn-warning" href="##" id="edit-button">保存</a>
+        </c:if>
+        &nbsp;
+        <a class="btn" href="${ctx}/admin/exam/score?${queryString}">返回</a>
+    </div>
+</form>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>题目</th>
+        <th>分数</th>
+        <th>答案</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${scoreList}" var="item">
+        <tr class="score-tr" data-objective="${item.objective}">
+            <td>${item.title}</td>
+            <td><input class="score-input" value="${item.scoreString}"/></td>
+            <td>
+                <c:if test="${item.objective==true}">
+                    <input class="answer-input" value="${item.answer}"/>
+                </c:if>
+                <c:if test="${item.objective==false}">
+                    &nbsp;
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
-var examNumber = '${student.examNumber}';
-$(document).ready(function() {
-    /* new jBox('Image', {
-    	imageFade: 0,
-    	delayOpen: 0,
-    	delayClose: 0,
-    	maxHeight: $(window).height()*0.88
-    }); */
-    $('.sheet-link').click(function(){
-    	initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
-    	return false;
+    var examNumber = '${student.examNumber}';
+    $(document).ready(function () {
+        /* new jBox('Image', {
+            imageFade: 0,
+            delayOpen: 0,
+            delayClose: 0,
+            maxHeight: $(window).height()*0.88
+        }); */
+        $('.sheet-link').click(function () {
+            initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            return false;
+        });
+        $('.package-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
+            return false;
+        });
+        $('#edit-button').click(function () {
+            var o = [];
+            var s = [];
+            $('tr.score-tr').each(function (index, obj) {
+                var tr = $(obj);
+                if (tr.attr('data-objective') == 'true') {
+                    o.push(tr.find('.answer-input').val() + ':' + tr.find('.score-input').val());
+                } else {
+                    s.push(tr.find('.score-input').val());
+                }
+            });
+            $.post('${ctx}/admin/exam/score/edit', {
+                examNumber: examNumber,
+                objectiveItems: o.join(';'),
+                subjectiveItems: s.join(';')
+            }, function (result) {
+                if (result.success == true) {
+                    alert('修改成功');
+                    window.location.reload();
+                } else {
+                    alert(result.message);
+                }
+            });
+        });
     });
-    $('.package-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
-    });
-    $('#edit-button').click(function(){
-    	var o = [];
-    	var s = [];
-    	$('tr.score-tr').each(function(index, obj){
-    		var tr = $(obj);
-    		if(tr.attr('data-objective')=='true'){
-    			o.push(tr.find('.answer-input').val()+':'+tr.find('.score-input').val());
-    		}else{
-    			s.push(tr.find('.score-input').val());
-    		}
-    	});
-    	$.post('${ctx}/admin/exam/score/edit', {
-    		examNumber: examNumber,
-    		objectiveItems: o.join(';'),
-    		subjectiveItems: s.join(';')
-    	}, function(result){
-    		if(result.success==true){
-    			alert('修改成功');
-    			window.location.reload();
-    		}else{
-    			alert(result.message);
-    		}
-    	});
-    });
-});
-</script>	
+</script>
 </body>
 </html>

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp

@@ -188,7 +188,7 @@
                 <c:if test="${student.upload==true}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
                         <a class="sheet-link" href="##" data-id="${student.id}" data-sheet-url="${student.sheetUrlString}"
-                           data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                           data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
                         <a href="${ctx}/admin/exam/track/student/${student.id}" target="_blank">轨迹图</a>
                     </c:if>
@@ -221,7 +221,7 @@
             return false;
         });
         $('.package-link').click(function () {
-            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
             return false;
         });
         $('#exam-select').change(function () {

+ 3 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp

@@ -157,7 +157,7 @@
             <td>
                 <c:if test="${student.upload==true}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
-                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
                     </c:if>
                     <c:if test="${examType=='MULTI_MEDIA'}">
@@ -224,11 +224,11 @@
 
     $(document).ready(function () {
         $('.sheet-link').click(function () {
-            initSheetPopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            initSheetPopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
             return false;
         });
         $('.package-link').click(function () {
-            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
             return false;
         });
     });

+ 90 - 90
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentTrack.jsp

@@ -1,112 +1,112 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <html lang="en">
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
 </head>
 <body>
 <canvas id="canvas"></canvas>
 </body>
 <script type="text/javascript">
-var imageServer = '${imageServer}';
-var urls = '${urls}'.split(',');
-var tags = JSON.parse('${tags}');
-var ctx;
-$(document).ready(function() {
-    var images = [];
-    var count = 0;
-    for(var i=0;i<urls.length;i++) {
-        var image = new Image();
-        images.push(image);
-        image.src = imageServer+urls[i];
-        image.onload = function(){
-            this.loaded = true;
-            count++;
-            
-            if(count==urls.length) {
-                render(images);
+    var imageServer = '${fileServer}';
+    var urls = '${urls}'.split(',');
+    var tags = JSON.parse('${tags}');
+    var ctx;
+    $(document).ready(function () {
+        var images = [];
+        var count = 0;
+        for (var i = 0; i < urls.length; i++) {
+            var image = new Image();
+            images.push(image);
+            image.src = imageServer + urls[i];
+            image.onload = function () {
+                this.loaded = true;
+                count++;
+
+                if (count == urls.length) {
+                    render(images);
+                }
             }
         }
-    }
-});
+    });
 
-function render(images) {
-    var maxWidth=0;
-    var totalHeight=0;
-    for(var i=0;i<images.length;i++) {
-        images[i].left = 0;
-        images[i].top = totalHeight;
-        maxWidth = Math.max(maxWidth, images[i].width);
-        totalHeight += images[i].height;
-    }
-    
-    var canvas = $('#canvas')[0];
-    canvas.width = maxWidth;
-    canvas.height = totalHeight;
-    ctx = canvas.getContext('2d');
-    for(var i=0;i<images.length;i++) {
-        ctx.drawImage(images[i], 0, 0, images[i].width, images[i].height, images[i].left, images[i].top, images[i].width, images[i].height);
-    }
-    
-    for(var i=0;i<tags.length;i++) {
-        renderGroup(tags[i], images)
-    }
-}
+    function render(images) {
+        var maxWidth = 0;
+        var totalHeight = 0;
+        for (var i = 0; i < images.length; i++) {
+            images[i].left = 0;
+            images[i].top = totalHeight;
+            maxWidth = Math.max(maxWidth, images[i].width);
+            totalHeight += images[i].height;
+        }
 
-function renderGroup(group, images) {
-    var configs = group.config;
-    var tags = group.tags;
-    if(configs.length==0 || tags.length==0) {
-        return;
-    }
-    
-    var maxWidth = 0;
-    var totalHeight = 0;
-    // 计算评卷分组拼接图的总高度与最大宽度
-    for (var i=0;i<configs.length;i++) {
-        var config = configs[i];
-        if (config.w == 0 || config.h == 0) {
-            // 兼容老数据,宽高未设置时,表示直接使用整张裁切图
-            var image = images[config.i-1];
-            if(image!=undefined) {
-                config.w = image.width;
-                config.h = image.height;
-            }
+        var canvas = $('#canvas')[0];
+        canvas.width = maxWidth;
+        canvas.height = totalHeight;
+        ctx = canvas.getContext('2d');
+        for (var i = 0; i < images.length; i++) {
+            ctx.drawImage(images[i], 0, 0, images[i].width, images[i].height, images[i].left, images[i].top, images[i].width, images[i].height);
         }
-        if (config.w > 0 && config.h > 0) {
-            maxWidth = Math.max(maxWidth, config.w);
-            totalHeight += config.h;
+
+        for (var i = 0; i < tags.length; i++) {
+            renderGroup(tags[i], images)
         }
     }
-    
-    // 遍历所有显示元素
-    for (var i=0;i<tags.length;i++) {
-        var tag = tags[i];
-        // 计算显示元素在拼接图内的绝对位置
-        var left = maxWidth * tag.positionX;
-        var top = totalHeight * tag.positionY;
-        var start = 0;
-        for (var j=0;j<configs.length;j++) {
-            var config = configs[j];
+
+    function renderGroup(group, images) {
+        var configs = group.config;
+        var tags = group.tags;
+        if (configs.length == 0 || tags.length == 0) {
+            return;
+        }
+
+        var maxWidth = 0;
+        var totalHeight = 0;
+        // 计算评卷分组拼接图的总高度与最大宽度
+        for (var i = 0; i < configs.length; i++) {
+            var config = configs[i];
+            if (config.w == 0 || config.h == 0) {
+                // 兼容老数据,宽高未设置时,表示直接使用整张裁切图
+                var image = images[config.i - 1];
+                if (image != undefined) {
+                    config.w = image.width;
+                    config.h = image.height;
+                }
+            }
             if (config.w > 0 && config.h > 0) {
-                var image = images[config.i-1];
-                if (top <= (config.h + start) && image!=undefined) {
-                    // 根据绝对高度判断显示元素是否落在当前拼接块
-                    ctx.font ="60px Arial";
-                    ctx.fillStyle ='red';
-                    ctx.fillText(tag.content, Math.max(60,left+config.x+image.left), Math.max(60,top-start+config.y+image.top));
-                    break;
-                } else {
-                    start += config.h;
+                maxWidth = Math.max(maxWidth, config.w);
+                totalHeight += config.h;
+            }
+        }
+
+        // 遍历所有显示元素
+        for (var i = 0; i < tags.length; i++) {
+            var tag = tags[i];
+            // 计算显示元素在拼接图内的绝对位置
+            var left = maxWidth * tag.positionX;
+            var top = totalHeight * tag.positionY;
+            var start = 0;
+            for (var j = 0; j < configs.length; j++) {
+                var config = configs[j];
+                if (config.w > 0 && config.h > 0) {
+                    var image = images[config.i - 1];
+                    if (top <= (config.h + start) && image != undefined) {
+                        // 根据绝对高度判断显示元素是否落在当前拼接块
+                        ctx.font = "60px Arial";
+                        ctx.fillStyle = 'red';
+                        ctx.fillText(tag.content, Math.max(60, left + config.x + image.left), Math.max(60, top - start + config.y + image.top));
+                        break;
+                    } else {
+                        start += config.h;
+                    }
                 }
             }
         }
     }
-}
 </script>
 </html>

+ 30 - 30
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/mark.jsp

@@ -1,23 +1,23 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>高校版阅卷系统</title>
-    <link type="text/css" href="${ctxStatic}/mark/style/bootstrap.css" rel="stylesheet" />
+    <link type="text/css" href="${ctxStatic}/mark/style/bootstrap.css" rel="stylesheet"/>
     <link type="text/css" href="${ctxStatic}/mark/style/style.css" rel="stylesheet"/>
     
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.mousewheel.min.js"></script>
-	
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.iviewer.js"></script>
-    <link rel="stylesheet" href="${ctxStatic}/mark/style/jquery.iviewer.css" rel="stylesheet" />
-
+    <link rel="stylesheet" href="${ctxStatic}/mark/style/jquery.iviewer.css" rel="stylesheet"/>
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/perfect-scrollbar.min.js"></script>
     <link rel="stylesheet" href="${ctxStatic}/mark/style/perfect-scrollbar.min.css"/>
- 
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-module.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/task-control.js"></script>
@@ -25,34 +25,34 @@
 </head>
 
 <body>
-    <div class="container-fluid">
-        <div class="row-fluid" id="container">
-        </div>
+<div class="container-fluid">
+    <div class="row-fluid" id="container">
     </div>
+</div>
 </body>
 
 <script type="text/javascript">
-$(document).ready(function() {
-    var mc = new MarkControl({
-        container: $('#container'),
-        userName: '${web_user.marker.name}',
-        staticServer: '${ctxStatic}/mark/',
-        imageServer: '${imageServer}',
-        modules: {
-            'imageSimple': {},
-            'problem': {
-                autoSubmit: false,
-                reasons: ['试卷模糊', '答错位置', '无法判别']
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            userName: '${web_user.marker.name}',
+            staticServer: '${ctxStatic}/mark/',
+            imageServer: '${fileServer}',
+            modules: {
+                'imageSimple': {},
+                'problem': {
+                    autoSubmit: false,
+                    reasons: ['试卷模糊', '答错位置', '无法判别']
+                }
             }
-        }
-    });
-    mc.start({
-        mode: 'loop', //loop, list
-        submitUrl: '${ctx}/mark/savetask',
-        getUrl: '${ctx}/mark/gettask',
-        historyUrl: '${ctx}/mark/gethistory'
+        });
+        mc.start({
+            mode: 'loop', //loop, list
+            submitUrl: '${ctx}/mark/savetask',
+            getUrl: '${ctx}/mark/gettask',
+            historyUrl: '${ctx}/mark/gethistory'
+        });
     });
-});
 </script>
 
 </html>

+ 13 - 13
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markJson.jsp

@@ -6,27 +6,27 @@
     <title>云阅卷高校版</title>
     <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
     <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
-
+    
     <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
     <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
     
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-	<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
     <script src="${ctxStatic}/rich-text/js/render.js"></script>
     <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-	<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
     <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
@@ -49,7 +49,7 @@
         var mc = new MarkControl({
             container: $('#container'),
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
@@ -64,7 +64,7 @@
             settingSyncUrl: '${ctx}/mark/update-setting',
             modules: {
                 'json-loader': {
-                    jsonServer: '${jsonServer}'
+                    jsonServer: '${fileServer}'
                 },
                 'json-view': {},
                 'mark-status': {
@@ -81,10 +81,10 @@
                 },
                 'warning-info': {},
                 <c:if test="${isFormal==true}">
-				'problem-process':{
-					problemTypes : '${problemTypes}'
+                'problem-process': {
+                    problemTypes: '${problemTypes}'
                 },
-				</c:if>	
+                </c:if>
                 'change-name': {
                     url: '${ctx}/mark/change-name'
                 }

+ 0 - 97
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markLeader.jsp

@@ -1,97 +0,0 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-leader/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-leader/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/answer-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/paper-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/change-name.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/tag-process.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/view-sidebar.js"></script>
-</head>
-<body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutUrl: '${ctx}/mark/logout',
-				clearUrl: '${ctx}/admin/mark/leader/clear',
-				prefetchCount:'1',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						simple : false,
-						subjectName : '${subject.displayName}'
-					},
-// 					'mark-history':{
-// 						pageSize:10
-// 					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'change-name':{
-						url : '${ctx}/mark/change-name'
-					},
-					'tag-process':{
-						url : '${ctx}/mark/tags'
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/mark/leader/status',
-				getUrl : '${ctx}/admin/mark/leader/gettask?studentId=${studentId}',
-				historyUrl : '${ctx}/admin/mark/leader/gethistory',
-				submitUrl : '${ctx}/admin/mark/leader/savetask',
-				clearUrl : '${ctx}/admin/mark/leader/clear'
-			});
-		});
-	</script>
-</body>
-</html>

+ 5 - 5
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp

@@ -55,7 +55,7 @@
         var mc = new MarkControl({
             container: $('#container'),
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
@@ -88,11 +88,11 @@
                     //showTotalScore:true
                 },
                 'slice-view': {
-                    server: '${sliceServer}'
+                    server: '${fileServer}'
                 },
                 <c:if test="${sheetView==true}">
                 'sheet-view': {
-                    server: '${sheetServer}',
+                    server: '${fileServer}',
                     sheetConfig: '${sheetConfig}'
                 },
                 </c:if>
@@ -110,11 +110,11 @@
                     list: [
                         {
                             title: getMessage('mark.sidebar.paper'),
-                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                            url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'
                         },
                         {
                             title: getMessage('mark.sidebar.answer'),
-                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                            url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'
                         }
                     ]
                 },

+ 9 - 9
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp

@@ -6,16 +6,16 @@
     <title>云阅卷高校版</title>
     <link href="${ctxStatic}/mark-track/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-track/css/style.css" rel="stylesheet" type="text/css"/>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/json2.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.mousewheel.min.js"></script>
-
+    
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
     <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/object-view.js"></script>
@@ -47,7 +47,7 @@
         var mc = new MarkControl({
             container: $('#container'),
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
@@ -90,11 +90,11 @@
                 },
                 'specialTag': {},
                 'slice-view': {
-                    server: '${sliceServer}'
+                    server: '${fileServer}'
                 },
                 <c:if test="${sheetView==true}">
                 'sheet-view': {
-                    server: '${sheetServer}',
+                    server: '${fileServer}',
                     sheetConfig: '${sheetConfig}'
                 },
                 </c:if>
@@ -102,11 +102,11 @@
                     list: [
                         {
                             title: getMessage('mark.sidebar.paper'),
-                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                            url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'
                         },
                         {
                             title: getMessage('mark.sidebar.answer'),
-                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                            url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'
                         }
                     ]
                 }

+ 172 - 172
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp

@@ -1,14 +1,14 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>高校版阅卷系统</title>
-	<link rel="stylesheet" href="${ctxStatic}/jcrop/css/jquery.Jcrop.min.css"/>
-	<link rel="stylesheet" href="${ctxStatic}/pic-config/css/style.css"/>
-	<script type="text/javascript" src="${ctxStatic}/jquery/jquery-1.9.1.min.js"></script>
-	<script type="text/javascript" src="${ctxStatic}/jcrop/js/jquery.Jcrop.min.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/jcrop/css/jquery.Jcrop.min.css"/>
+    <link rel="stylesheet" href="${ctxStatic}/pic-config/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/jquery/jquery-1.9.1.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/jcrop/js/jquery.Jcrop.min.js"></script>
 </head>
 <body>
 <div class="c-box" style="display:none" id="pic-config-div">
@@ -48,185 +48,185 @@
 </body>
 
 <script type="text/javascript">
-var message = '${message}';
-if(message!=null&&message!=''&&message!=undefined){
-	alert(message);
-}
-var image_server = '${imageServer}';
-var pictureConfig = '${pictureConfig}';
-var picUrls = '${picUrls}';
-var picUrl = picUrls.split('[')[1].split(']')[0];
-var urls=[];
-for (var j = 0; j < picUrl.split(',').length; j++) {
-	urls.push(picUrl.split(',')[j].trim());
-} 
-var config=window.localStorage.getItem("pictureConfig");
-if(config!=null&&config!=undefined){
-	pictureConfig = config;
-}
-
-var saveCallback;
-var jcrop_canvas;
-var jcrop_api;
-var image_array = [];
-$(document).ready(function(e) {
-    $('#pic-config-div').css('z-index', 9999);
-    $('#pic-config-div').height($(window).height());
-    $('#pic-config-div').width($(window).width());
-    $('#pic-config-div').offset({top:0, left:0});
-    
-    $('#pic-config-clear').click(function(){
-        $('#pic-config-preview').empty();
-    });
-    $('#pic-config-save').click(function(){
-        var result = [];
-        $('#pic-config-preview').find('li').each(function(){
-            result.push(JSON.parse($(this).attr('data-config')));
-        })
-        if(result.length==0){
-            alert('请至少裁切一张小图后再保存');
-            return;
-        }
-        $('#pic-config-div').hide();
-        if(saveCallback!=undefined){
-            saveCallback(result);
-        }
-    });
-    $('#pic-config-cancel').click(function(){
-       // $('#pic-config-div').hide();
-    	window.close(); 
-    });
-    $('#preview-image-button').click(function(){
-        addPreviewImage();
-    });
-    $('#pic-content').Jcrop({
-        //boxWidth: $(window).width()*0.65,
-        boxHeight: $(window).height()-90,
-        onDblClick: addPreview
-    }, function() {
-        jcrop_api = this;
-    });
-    jcrop_canvas = $('#pic-canvas')[0];
-    
-    initPicConfigPopup(urls,pictureConfig,function(result){
-    	if (window.opener && !window.opener.closed) {
-    	 	window.opener.document.getElementById("picList").value = JSON.stringify(result);
-    		window.opener.document.getElementById("configuration").innerText="设置成功";
-    		window.localStorage.setItem("pictureConfig",JSON.stringify(result));
-    		window.close(); 
-    	}
-    });
-});
-
-function initPicConfigPopup(urls, config, onSave) {
-	if(config){
-		config = JSON.parse(config);
-	}
-    initImages(urls,config);
-    saveCallback = onSave;
-    $('#pic-config-div').show();
-}
-
-function initImages(urls,config) {
-    var container = $('#pic-switch');
-    container.empty();
-    container.attr('data-index','');
-    image_array = [];
-    for(var i=1;i<=urls.length;i++) {
-        var img = new Image();
-        img.crossOrigin = '';
-        var timestamp = new Date().getTime();
-        img.src = image_server + urls[i-1]+ '?' + timestamp;
-        image_array.push(img);
-        var dom = $('<li data-index="'+i+'"><a href="javascript:void(0)">'+i+'</a></li>').appendTo(container);
-        dom.find('a').click(function(){
-            var index = parseInt($(this).parent().attr('data-index'));
-            jcrop_api.setImage(image_array[index-1].src);
-            container.attr('data-index', index);
-            container.find('li').removeClass('on');
-            $(this).parent().addClass('on');
-        })
+    var message = '${message}';
+    if (message != null && message != '' && message != undefined) {
+        alert(message);
+    }
+    var image_server = '${fileServer}';
+    var pictureConfig = '${pictureConfig}';
+    var picUrls = '${picUrls}';
+    var picUrl = picUrls.split('[')[1].split(']')[0];
+    var urls = [];
+    for (var j = 0; j < picUrl.split(',').length; j++) {
+        urls.push(picUrl.split(',')[j].trim());
     }
-    container.find('li:first a').trigger('click');
-    if(image_array.length==urls.length){
-    	img.onload = function () {
-    		initConfigs(config);
-    	};
+    var config = window.localStorage.getItem("pictureConfig");
+    if (config != null && config != undefined) {
+        pictureConfig = config;
     }
-    
-}
 
-function initConfigs(config) {
-    $('#pic-config-preview').empty();
+    var saveCallback;
+    var jcrop_canvas;
+    var jcrop_api;
+    var image_array = [];
+    $(document).ready(function (e) {
+        $('#pic-config-div').css('z-index', 9999);
+        $('#pic-config-div').height($(window).height());
+        $('#pic-config-div').width($(window).width());
+        $('#pic-config-div').offset({top: 0, left: 0});
+
+        $('#pic-config-clear').click(function () {
+            $('#pic-config-preview').empty();
+        });
+        $('#pic-config-save').click(function () {
+            var result = [];
+            $('#pic-config-preview').find('li').each(function () {
+                result.push(JSON.parse($(this).attr('data-config')));
+            })
+            if (result.length == 0) {
+                alert('请至少裁切一张小图后再保存');
+                return;
+            }
+            $('#pic-config-div').hide();
+            if (saveCallback != undefined) {
+                saveCallback(result);
+            }
+        });
+        $('#pic-config-cancel').click(function () {
+            // $('#pic-config-div').hide();
+            window.close();
+        });
+        $('#preview-image-button').click(function () {
+            addPreviewImage();
+        });
+        $('#pic-content').Jcrop({
+            //boxWidth: $(window).width()*0.65,
+            boxHeight: $(window).height() - 90,
+            onDblClick: addPreview
+        }, function () {
+            jcrop_api = this;
+        });
+        jcrop_canvas = $('#pic-canvas')[0];
+
+        initPicConfigPopup(urls, pictureConfig, function (result) {
+            if (window.opener && !window.opener.closed) {
+                window.opener.document.getElementById("picList").value = JSON.stringify(result);
+                window.opener.document.getElementById("configuration").innerText = "设置成功";
+                window.localStorage.setItem("pictureConfig", JSON.stringify(result));
+                window.close();
+            }
+        });
+    });
 
-    if(config!=undefined){
-        for(var i=0;i<config.length;i++){
-            addPreviewByConfig(config[i]);
+    function initPicConfigPopup(urls, config, onSave) {
+        if (config) {
+            config = JSON.parse(config);
         }
+        initImages(urls, config);
+        saveCallback = onSave;
+        $('#pic-config-div').show();
     }
-}
-
-function getCropConfig(c) {
-    var scaleX = jcrop_api.getScaleFactor()[0];
-    var scaleY = jcrop_api.getScaleFactor()[1];
-    config = {
-        x: c.x * scaleX,
-        y: c.y * scaleY,
-        w: c.w * scaleX,
-        h: c.h * scaleY
+
+    function initImages(urls, config) {
+        var container = $('#pic-switch');
+        container.empty();
+        container.attr('data-index', '');
+        image_array = [];
+        for (var i = 1; i <= urls.length; i++) {
+            var img = new Image();
+            img.crossOrigin = '';
+            var timestamp = new Date().getTime();
+            img.src = image_server + urls[i - 1] + '?' + timestamp;
+            image_array.push(img);
+            var dom = $('<li data-index="' + i + '"><a href="javascript:void(0)">' + i + '</a></li>').appendTo(container);
+            dom.find('a').click(function () {
+                var index = parseInt($(this).parent().attr('data-index'));
+                jcrop_api.setImage(image_array[index - 1].src);
+                container.attr('data-index', index);
+                container.find('li').removeClass('on');
+                $(this).parent().addClass('on');
+            })
+        }
+        container.find('li:first a').trigger('click');
+        if (image_array.length == urls.length) {
+            img.onload = function () {
+                initConfigs(config);
+            };
+        }
+
     }
-    return config;
-}
-
-function addPreview(c) {
-    if (parseInt(c.w) > 0) {
-        var config = getCropConfig(c);
-        config.i = $('#pic-switch').attr('data-index');
-        if(config.i!='') {
-            config.i = parseInt(config.i);
-            addPreviewByConfig(config);
+
+    function initConfigs(config) {
+        $('#pic-config-preview').empty();
+
+        if (config != undefined) {
+            for (var i = 0; i < config.length; i++) {
+                addPreviewByConfig(config[i]);
+            }
         }
-        jcrop_api.release();
     }
-}
 
-function addPreviewImage() {
-    var index = $('#pic-switch').attr('data-index');
-    if(index==''){
-        return;
+    function getCropConfig(c) {
+        var scaleX = jcrop_api.getScaleFactor()[0];
+        var scaleY = jcrop_api.getScaleFactor()[1];
+        config = {
+            x: c.x * scaleX,
+            y: c.y * scaleY,
+            w: c.w * scaleX,
+            h: c.h * scaleY
+        }
+        return config;
     }
-    var config = {
-        i: parseInt(index),
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0
+
+    function addPreview(c) {
+        if (parseInt(c.w) > 0) {
+            var config = getCropConfig(c);
+            config.i = $('#pic-switch').attr('data-index');
+            if (config.i != '') {
+                config.i = parseInt(config.i);
+                addPreviewByConfig(config);
+            }
+            jcrop_api.release();
+        }
     }
-    addPreviewByConfig(config);
-}
-
-function addPreviewByConfig(config){
-    var container = $('#pic-config-preview');
-    var width = config.w;
-    var height = config.h;
-    if(width==0){
-        width = image_array[config.i-1].width;
+
+    function addPreviewImage() {
+        var index = $('#pic-switch').attr('data-index');
+        if (index == '') {
+            return;
+        }
+        var config = {
+            i: parseInt(index),
+            x: 0,
+            y: 0,
+            w: 0,
+            h: 0
+        }
+        addPreviewByConfig(config);
     }
-    if(height==0){
-        height = image_array[config.i-1].height;
+
+    function addPreviewByConfig(config) {
+        var container = $('#pic-config-preview');
+        var width = config.w;
+        var height = config.h;
+        if (width == 0) {
+            width = image_array[config.i - 1].width;
+        }
+        if (height == 0) {
+            height = image_array[config.i - 1].height;
+        }
+        jcrop_canvas.width = width
+        jcrop_canvas.height = height
+
+        jcrop_canvas.getContext("2d").drawImage(image_array[config.i - 1], config.x, config.y, width, height, 0, 0, width, height);
+
+        var dom = $('<li><span class="order">' + config.i + '</span><div class="m"><img src=""/></div><span class="close">&times;</span></li>').appendTo(container);
+        dom.attr('data-config', JSON.stringify(config));
+        dom.find('img').attr('src', jcrop_canvas.toDataURL());
+        dom.find('span.close').click(function () {
+            $(this).parent().remove();
+        });
     }
-    jcrop_canvas.width = width
-    jcrop_canvas.height = height
-    
-    jcrop_canvas.getContext("2d").drawImage(image_array[config.i-1], config.x, config.y, width, height,0,0,width, height);
-    
-    var dom = $('<li><span class="order">'+config.i+'</span><div class="m"><img src=""/></div><span class="close">&times;</span></li>').appendTo(container);
-    dom.attr('data-config', JSON.stringify(config));
-    dom.find('img').attr('src', jcrop_canvas.toDataURL());
-    dom.find('span.close').click(function(){
-        $(this).parent().remove();
-    });
-}
 </script>
 
 </html>

+ 0 - 6443
stmms-web/src/main/webapp/static/mark-leader/css/bootstrap.css

@@ -1,6443 +0,0 @@
-/*!
- * Bootstrap v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
-  *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.clearfix:after {
-  clear: both;
-}
-
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-
-audio:not([controls]) {
-  display: none;
-}
-
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-      -ms-text-size-adjust: 100%;
-}
-
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-a:hover,
-a:active {
-  outline: 0;
-}
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-img {
-  width: auto\9;
-  height: auto;
-  max-width: 100%;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img,
-.google-maps img {
-  max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
-  cursor: pointer;
-}
-
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-
-@media print {
-  * {
-    color: #000 !important;
-    text-shadow: none !important;
-    background: transparent !important;
-    box-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  .ir a:after,
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  @page  {
-    margin: 0.5cm;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-}
-
-body {
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  background-color: #ffffff;
-}
-
-a {
-  color: #0088cc;
-  text-decoration: none;
-}
-
-a:hover,
-a:focus {
-  color: #005580;
-  text-decoration: underline;
-}
-
-.img-rounded {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
-  -webkit-border-radius: 500px;
-     -moz-border-radius: 500px;
-          border-radius: 500px;
-}
-
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-
-.row:before,
-.row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row:after {
-  clear: both;
-}
-
-[class*="span"] {
-  float: left;
-  min-height: 1px;
-  margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.span12 {
-  width: 940px;
-}
-
-.span11 {
-  width: 860px;
-}
-
-.span10 {
-  width: 780px;
-}
-
-.span9 {
-  width: 700px;
-}
-
-.span8 {
-  width: 620px;
-}
-
-.span7 {
-  width: 540px;
-}
-
-.span6 {
-  width: 460px;
-}
-
-.span5 {
-  width: 380px;
-}
-
-.span4 {
-  width: 300px;
-}
-
-.span3 {
-  width: 220px;
-}
-
-.span2 {
-  width: 140px;
-}
-
-.span1 {
-  width: 100px;
-}
-
-.offset12 {
-  margin-left: 980px;
-}
-
-.offset11 {
-  margin-left: 900px;
-}
-
-.offset10 {
-  margin-left: 820px;
-}
-
-.offset9 {
-  margin-left: 740px;
-}
-
-.offset8 {
-  margin-left: 660px;
-}
-
-.offset7 {
-  margin-left: 580px;
-}
-
-.offset6 {
-  margin-left: 500px;
-}
-
-.offset5 {
-  margin-left: 420px;
-}
-
-.offset4 {
-  margin-left: 340px;
-}
-
-.offset3 {
-  margin-left: 260px;
-}
-
-.offset2 {
-  margin-left: 180px;
-}
-
-.offset1 {
-  margin-left: 100px;
-}
-
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row-fluid:after {
-  clear: both;
-}
-
-.row-fluid [class*="span"] {
-  display: block;
-  float: left;
-  width: 100%;
-  min-height: 30px;
-  margin-left:0px;
-/*  margin-left: 2.127659574468085%;
-*/  *margin-left: 2.074468085106383%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
-	margin-left:0px;
-/*  margin-left: 2.127659574468085%;
-*/}
-
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
-	width:85.106%;
-/*  width: 82.97872340425532%;*/
-  *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
-	 width:76.595%;
-/*  width: 74.46808510638297%;*/
-  *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
-	 width:70.21%;
-/*  width: 65.95744680851064%;
-*/  *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {width:57%;
-/*  width: 57.44680851063829%;
-*/  *width: 57.39361702127659%;}
-
-.row-fluid .span6 {
-	width:49.96%;
-/*  width: 48.93617021276595%;
-*/  *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
-	width:42.553%;
-/*  width: 40.42553191489362%;
-*/  *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {width: 31.914893617021278%;
-/*	width:34.042px;
-*//*  width: 31.914893617021278%;
-*/  *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
-	width:25.531%;
-/*  width: 23.404255319148934%;
-*/  *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-
-.container:before,
-.container:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container:after {
-  clear: both;
-}
-
-.container-fluid {
-/*  padding-right: 20px;
-  padding-left: 20px;*/
-  *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container-fluid:after {
-  clear: both;
-}
-
-p {
-  margin: 0 0 10px;
-}
-
-.lead {
-  margin-bottom: 20px;
-  font-size: 21px;
-  font-weight: 200;
-  line-height: 30px;
-}
-
-small {
-  font-size: 85%;
-}
-
-strong {
-  font-weight: bold;
-}
-
-em {
-  font-style: italic;
-}
-
-cite {
-  font-style: normal;
-}
-
-.muted {
-  color: #999999;
-}
-
-a.muted:hover,
-a.muted:focus {
-  color: #808080;
-}
-
-.text-warning {
-  color: #c09853;
-}
-
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #a47e3c;
-}
-
-.text-error {
-  color: #b94a48;
-  margin:0 5px;
-}
-
-a.text-error:hover,
-a.text-error:focus {
-  color: #953b39;
-}
-
-.text-info {
-  color: #3a87ad;
-}
-
-a.text-info:hover,
-a.text-info:focus {
-  color: #2d6987;
-}
-
-.text-success {
-  color: #468847;
-}
-
-a.text-success:hover,
-a.text-success:focus {
-  color: #356635;
-}
-
-.text-left {
-  text-align: left;
-}
-
-.text-right {
-  text-align: right;
-}
-
-.text-center {
-  text-align: center;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 10px 0;
-  font-family: inherit;
-  font-weight: bold;
-  line-height: 20px;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-
-h1,
-h2,
-h3 {
-  line-height: 40px;
-}
-
-h1 {
-  font-size: 38.5px;
-}
-
-h2 {
-  font-size: 31.5px;
-}
-
-h3 {
-  font-size: 24.5px;
-}
-
-h4 {
-  font-size: 17.5px;
-}
-
-h5 {
-  font-size: 14px;
-}
-
-h6 {
-  font-size: 11.9px;
-}
-
-h1 small {
-  font-size: 24.5px;
-}
-
-h2 small {
-  font-size: 17.5px;
-}
-
-h3 small {
-  font-size: 14px;
-}
-
-h4 small {
-  font-size: 14px;
-}
-
-.page-header {
-  padding-bottom: 9px;
-  margin: 20px 0 30px;
-  border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 10px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-
-li {
-  line-height: 20px;
-}
-
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  *display: inline;
-  padding-right: 5px;
-  padding-left: 5px;
-  *zoom: 1;
-}
-
-dl {
-  margin-bottom: 20px;
-}
-
-dt,
-dd {
-  line-height: 20px;
-}
-
-dt {
-  font-weight: bold;
-}
-
-dd {
-  margin-left: 10px;
-}
-
-.dl-horizontal {
-  *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.dl-horizontal:after {
-  clear: both;
-}
-
-.dl-horizontal dt {
-  float: left;
-  width: 160px;
-  overflow: hidden;
-  clear: left;
-  text-align: right;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.dl-horizontal dd {
-  margin-left: 180px;
-}
-
-hr {
-  margin: 20px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 20px;
-  border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
-  margin-bottom: 0;
-  font-size: 17.5px;
-  font-weight: 300;
-  line-height: 1.25;
-}
-
-blockquote small {
-  display: block;
-  line-height: 20px;
-  color: #999999;
-}
-
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-
-blockquote.pull-right small:before {
-  content: '';
-}
-
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-address {
-  display: block;
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 20px;
-}
-
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 12px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-code {
-  padding: 2px 4px;
-  color: #d14;
-  white-space: nowrap;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 20px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-pre.prettyprint {
-  margin-bottom: 20px;
-}
-
-pre code {
-  padding: 0;
-  color: inherit;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border: 0;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-form {
-  margin: 0 0 20px;
-}
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: 40px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
-  font-size: 15px;
-  color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 20px;
-  padding: 4px 6px;
-  margin-bottom: 0px;
-  font-size: 14px;
-  line-height: 20px;
-  color: #555555;
-/*  vertical-align: middle;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-input,
-textarea,
-.uneditable-input {
-  width: 206px;
-}
-
-textarea {
-  height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-          transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
-  margin:5px;
-  margin-top: 1px \9;
-  *margin-top: 0;
-  line-height: normal;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-
-select,
-input[type="file"] {
-  height: 30px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 30px;
-}
-
-select {
-  width: 220px;
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  cursor: not-allowed;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-
-.radio,
-.checkbox {
-  min-height: 20px;
-  padding-left: 20px;
-}
-
-.checkbox-tab {
-  min-height: 20px;
-  padding-left: 20px;
-  margin-right:20px; float:left;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-/*  margin-left: -20px;
-*/}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-
-.input-mini {
-  width: 60px;
-}
-
-.input-small {
-  width: 90px;
-}
-
-.input-medium {
-  width: 150px;
-}
-
-.input-large {
-  width: 210px;
-}
-
-.input-xlarge {
-  width: 270px;
-}
-
-.input-xxlarge {
-  width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
-  width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
-  width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
-  width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
-  width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
-  width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
-  width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
-  width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
-  width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
-  width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
-  width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
-  width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
-  width: 46px;
-}
-
-.controls-row {
-  *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.controls-row:after {
-  clear: both;
-}
-
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
-  float: left;
-}
-
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
-  padding-top: 5px;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
-  color: #3a87ad;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  color: #3a87ad;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  border-color: #3a87ad;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
-  border-color: #2d6987;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #3a87ad;
-}
-
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-     -moz-box-shadow: 0 0 6px #f8b9b7;
-          box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
-  padding: 19px 20px 20px;
-  margin-top: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-actions:after {
-  clear: both;
-}
-
-.help-block,
-.help-inline {
-  color: #595959;
-}
-
-.help-block {
-  display: block;
-  margin-bottom: 10px;
-}
-
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  padding-left: 5px;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
-  display: inline-block;
-  padding-left:15px;
-  margin: 10px;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
-  font-size: 14px;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  vertical-align: top;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 20px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
-  vertical-align: top;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
-  background-color: #a9dba9;
-  border-color: #46a546;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input + .btn-group .btn:last-child,
-.input-append select + .btn-group .btn:last-child,
-.input-append .uneditable-input + .btn-group .btn:last-child {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
-  margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child,
-.input-append .btn-group:last-child > .dropdown-toggle {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .btn-group:first-child {
-  margin-left: 0;
-}
-
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-.form-inline{ margin:5px;}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-
-.control-group {
-  margin-bottom: 10px;
-}
-
-legend + .control-group {
-  margin-top: 20px;
-  -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
-  margin-bottom: 20px;
-  *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-horizontal .control-group:after {
-  clear: both;
-}
-
-.form-horizontal .control-label {
-  float: left;
-  width: 160px;
-  padding-top: 5px;
-  text-align: right;
-}
-
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 180px;
-  *margin-left: 0;
-}
-.controls-list{margin-left:0 !important;}
-.controls-list a{
-width:50px; height:28px;
-padding:0 3px;
-line-height:28px;
-display:block;
-text-align:center;
-margin:0px 10px 10px 0px;
-border:#c1c1c1 solid 1px;
-background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-float:left;
-}
-.controls-list a:hover{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;
-}
-.controls-list a.curr{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;	
-}
-.form-horizontal .controls:first-child {
-  *padding-left: 180px;
-}
-
-.form-horizontal .help-block {
-  margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
-  margin-top: 10px;
-}
-
-.form-horizontal .form-actions {
-  padding-left: 180px;
-}
-
-table {
-  max-width: 100%;
-  background-color: #c9d1d6;
-  border-spacing: 0;
-  text-align:center;
-  font-size:14px;
-}
-
-.table {
-  width: 100%;
-
-}
-.table th,
-.table td {
-  padding: 9px 6px;
-  line-height: 20px;
-  text-align: left;
-  border-top: 1px solid #5d6d7d;
-  color:#004260;
-}
-
-.table th {
-  font-weight: bold;
-  	font-size:15px;
-}
-
-.table thead th {
-	background:#455b71;
-	color:#fff;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-
-.table .table {
-  background-color: #ffffff;
-}
-
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:first-child,
-.table-bordered tbody:first-child tr:first-child > td:first-child,
-.table-bordered tbody:first-child tr:first-child > th:first-child {
-/*  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.table-bordered thead:first-child tr:first-child > th:last-child,
-.table-bordered tbody:first-child tr:first-child > td:last-child,
-.table-bordered tbody:first-child tr:first-child > th:last-child {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;*/
-}
-
-.table-bordered thead:last-child tr:last-child > th:first-child,
-.table-bordered tbody:last-child tr:last-child > td:first-child,
-.table-bordered tbody:last-child tr:last-child > th:first-child,
-.table-bordered tfoot:last-child tr:last-child > td:first-child,
-.table-bordered tfoot:last-child tr:last-child > th:first-child {
-/*  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;*/
-}
-
-.table-bordered thead:last-child tr:last-child > th:last-child,
-.table-bordered tbody:last-child tr:last-child > td:last-child,
-.table-bordered tbody:last-child tr:last-child > th:last-child,
-.table-bordered tfoot:last-child tr:last-child > td:last-child,
-.table-bordered tfoot:last-child tr:last-child > th:last-child {
-/*  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;*/
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
-  -webkit-border-bottom-left-radius: 0;
-          border-bottom-left-radius: 0;
-  -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 0;
-          border-bottom-right-radius: 0;
-  -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-/*  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;*/
-}
-
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
-  background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
-  background-color: #a2b2bb;
-}
-.table-hover tbody tr.active > td,
-.table-hover tbody tr.active > th {
-  background-color: #a2b2bb;
-  color:#fff;
-}
-
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-
-.table td.span1,
-.table th.span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-
-.table td.span2,
-.table th.span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-
-.table td.span3,
-.table th.span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-
-.table td.span4,
-.table th.span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-
-.table td.span5,
-.table th.span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-
-.table td.span6,
-.table th.span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-
-.table td.span7,
-.table th.span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-
-.table td.span8,
-.table th.span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-
-.table td.span9,
-.table th.span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-
-.table td.span10,
-.table th.span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-
-.table td.span11,
-.table th.span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-
-.table td.span12,
-.table th.span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-.table thead tr.gray > td {
-  background-color: #f00;
-}
-
-.table tbody tr.success > td {
-  background-color: #dff0d8;
-}
-
-.table tbody tr.error > td {
-  background-color: #f2dede;
-}
-
-.table tbody tr.warning > td {
-  background-color: #fefbee;
-}
-
-.table tbody tr.info > td {
-  background-color: #e4f5fe;
-}
-.table tbody tr.active > td {
-  background-color: #5a7686;
-}
-.table-hover thead tr.gray:hover > td {
-  background-color: #efeded;
-}
-
-.table-hover tbody tr.success:hover > td {
-  background-color: #d0e9c6;
-}
-
-.table-hover tbody tr.error:hover > td {
-  background-color: #ebcccc;
-}
-
-.table-hover tbody tr.warning:hover > td {
-  background-color: #faf2cc;
-}
-
-.table-hover tbody tr.info:hover > td {
-  background-color: #c4e3f3;
-}
-
-
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  margin-top: 1px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-
-.icon-red,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-red.png");
-}
-
-
-.icon-glass {
-  background-position: 0      0;
-}
-
-.icon-music {
-  background-position: -24px 0;
-}
-
-.icon-search {
-  background-position: -48px 0;
-}
-
-.icon-envelope {
-  background-position: -72px 0;
-}
-
-.icon-heart {
-  background-position: -96px 0;
-}
-
-.icon-star {
-  background-position: -120px 0;
-}
-
-.icon-star-empty {
-  background-position: -144px 0;
-}
-
-.icon-user {
-  background-position: -168px 0;
-}
-
-.icon-film {
-  background-position: -192px 0;
-}
-
-.icon-th-large {
-  background-position: -216px 0;
-}
-
-.icon-th {
-  background-position: -240px 0;
-}
-
-.icon-th-list {
-  background-position: -264px 0;
-}
-
-.icon-ok {
-  background-position: -288px 0;
-}
-
-.icon-remove {
-  background-position: -312px 0;
-}
-
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-
-.icon-off {
-  background-position: -384px 0;
-}
-
-.icon-signal {
-  background-position: -408px 0;
-}
-
-.icon-cog {
-  background-position: -432px 0;
-}
-
-.icon-trash {
-  background-position: -456px 0;
-}
-
-.icon-home {
-  background-position: 0 -24px;
-}
-
-.icon-file {
-  background-position: -24px -24px;
-}
-
-.icon-time {
-  background-position: -48px -24px;
-}
-
-.icon-road {
-  background-position: -72px -24px;
-}
-
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-
-.icon-download {
-  background-position: -120px -24px;
-}
-
-.icon-upload {
-  background-position: -144px -24px;
-}
-
-.icon-inbox {
-  background-position: -168px -24px;
-}
-
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-
-.icon-repeat {
-  background-position: -216px -24px;
-}
-
-.icon-refresh {
-  background-position: -240px -24px;
-}
-
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-
-.icon-lock {
-  background-position: -287px -24px;
-}
-
-.icon-flag {
-  background-position: -312px -24px;
-}
-
-.icon-headphones {
-  background-position: -336px -24px;
-}
-
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-
-.icon-barcode {
-  background-position: -456px -24px;
-}
-
-.icon-tag {
-  background-position: 0 -48px;
-}
-
-.icon-tags {
-  background-position: -25px -48px;
-}
-
-.icon-book {
-  background-position: -48px -48px;
-}
-
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-
-.icon-print {
-  background-position: -96px -48px;
-}
-
-.icon-camera {
-  background-position: -120px -48px;
-}
-
-.icon-font {
-  background-position: -144px -48px;
-}
-
-.icon-bold {
-  background-position: -167px -48px;
-}
-
-.icon-italic {
-  background-position: -192px -48px;
-}
-
-.icon-text-height {
-  background-position: -216px -48px;
-}
-
-.icon-text-width {
-  background-position: -240px -48px;
-}
-
-.icon-align-left {
-  background-position: -264px -48px;
-}
-
-.icon-align-center {
-  background-position: -288px -48px;
-}
-
-.icon-align-right {
-  background-position: -312px -48px;
-}
-
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-
-.icon-list {
-  background-position: -360px -48px;
-}
-
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-
-.icon-picture {
-  background-position: -456px -48px;
-}
-
-.icon-pencil {
-  background-position: 0 -72px;
-}
-
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-
-.icon-adjust {
-  background-position: -48px -72px;
-}
-
-.icon-tint {
-  background-position: -72px -72px;
-}
-
-.icon-edit {
-  background-position: -96px -72px;
-}
-
-.icon-share {
-  background-position: -120px -72px;
-}
-
-.icon-check {
-  background-position: -144px -72px;
-}
-
-.icon-move {
-  background-position: -168px -72px;
-}
-
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-
-.icon-backward {
-  background-position: -240px -72px;
-}
-
-.icon-play {
-  background-position: -264px -72px;
-}
-
-.icon-pause {
-  background-position: -288px -72px;
-}
-
-.icon-stop {
-  background-position: -312px -72px;
-}
-
-.icon-forward {
-  background-position: -336px -72px;
-}
-
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-
-.icon-eject {
-  background-position: -408px -72px;
-}
-
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-
-.icon-plus {
-  background-position: -408px -96px;
-}
-
-.icon-minus {
-  background-position: -433px -96px;
-}
-
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-
-.icon-gift {
-  background-position: -24px -120px;
-}
-
-.icon-leaf {
-  background-position: -48px -120px;
-}
-
-.icon-fire {
-  background-position: -72px -120px;
-}
-
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-
-.icon-plane {
-  background-position: -168px -120px;
-}
-
-.icon-calendar {
-  background-position: -192px -120px;
-}
-
-.icon-random {
-  width: 16px;
-  background-position: -216px -120px;
-}
-
-.icon-comment {
-  background-position: -240px -120px;
-}
-
-.icon-magnet {
-  background-position: -264px -120px;
-}
-
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-
-.icon-retweet {
-  background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-
-.icon-folder-close {
-  width: 16px;
-  background-position: -384px -120px;
-}
-
-.icon-folder-open {
-  width: 16px;
-  background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-
-.icon-hdd {
-  background-position: 0 -144px;
-}
-
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-
-.icon-bell {
-  background-position: -48px -144px;
-}
-
-.icon-certificate {
-  background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-
-.icon-globe {
-  background-position: -336px -144px;
-}
-
-.icon-wrench {
-  background-position: -360px -144px;
-}
-
-.icon-tasks {
-  background-position: -384px -144px;
-}
-
-.icon-filter {
-  background-position: -408px -144px;
-}
-
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index:9999;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-/*  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;*/
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu > li > a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 20px;
-  color: #333333;
-  white-space: nowrap;
-}
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0081c2;
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0081c2;
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  outline: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  color: #999999;
-}
-
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.open {
-  *z-index: 1000;
-}
-
-.open > .dropdown-menu {
-  display: block;
-}
-
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-
-.dropdown-submenu {
-  position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-     -moz-border-radius: 0 6px 6px 6px;
-          border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
-  display: block;
-}
-
-.dropup .dropdown-submenu > .dropdown-menu {
-  top: auto;
-  bottom: 0;
-  margin-top: 0;
-  margin-bottom: -2px;
-  -webkit-border-radius: 5px 5px 5px 0;
-     -moz-border-radius: 5px 5px 5px 0;
-          border-radius: 5px 5px 5px 0;
-}
-
-.dropdown-submenu > a:after {
-  display: block;
-  float: right;
-  width: 0;
-  height: 0;
-  margin-top: 5px;
-  margin-right: -10px;
-  border-color: transparent;
-  border-left-color: #cccccc;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-
-.dropdown-submenu.pull-left {
-  float: none;
-}
-
-.dropdown-submenu.pull-left > .dropdown-menu {
-  left: -100%;
-  margin-left: 10px;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.dropdown .dropdown-menu .nav-header {
-  padding-right: 20px;
-  padding-left: 20px;
-}
-
-.typeahead {
-  z-index: 1051;
-  margin-top: 2px;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-     -moz-transition: opacity 0.15s linear;
-       -o-transition: opacity 0.15s linear;
-          transition: opacity 0.15s linear;
-}
-
-.fade.in {
-  opacity: 1;
-}
-
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition: height 0.35s ease;
-     -moz-transition: height 0.35s ease;
-       -o-transition: height 0.35s ease;
-          transition: height 0.35s ease;
-}
-
-.collapse.in {
-  height: auto;
-}
-
-.close {
-  float: right;
-  font-size: 13px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-
-.close:hover,
-.close:focus {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.btn {
-  display: inline-block;
-  *display: inline;
-  padding: 4px 12px;
-  *margin-left: .3em;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  text-align: center;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  vertical-align: middle;
-  cursor: pointer;
-  background-color: #f5f5f5;
-  *background-color: #e6e6e6;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border: 1px solid #cccccc;
-  *border: 0;
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border-bottom-color: #b3b3b3;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:focus,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-
-.btn:first-child {
-  *margin-left: 0;
-}
-
-.btn:hover,
-.btn:focus {
-  color: #333333;
-  text-decoration: none;
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-     -moz-transition: background-position 0.1s linear;
-       -o-transition: background-position 0.1s linear;
-          transition: background-position 0.1s linear;
-}
-
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-large {
-  padding: 11px 19px;
-  font-size: 17.5px;
-/*  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;*/
-}
-
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
-  margin-top: 4px;
-}
-
-.btn-small {
-  padding: 2px 10px;
-  font-size: 11.9px;
-/*  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;*/
-}
-
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
-  margin-top: 0;
-}
-
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
-  margin-top: -1px;
-}
-
-.btn-mini {
-  padding: 0 6px;
-  font-size: 10.5px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  *background-color: #0044cc;
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #003399 \9;
-}
-
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  *background-color: #f89406;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  *background-color: #bd362f;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  *background-color: #51a351;
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-repeat: repeat-x;
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  *background-color: #2f96b4;
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  *background-color: #222222;
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-repeat: repeat-x;
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-link {
-  color: #0088cc;
-  cursor: pointer;
-  border-color: transparent;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-link:hover,
-.btn-link:focus {
-  color: #005580;
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
-  color: #333333;
-  text-decoration: none;
-}
-
-.btn-group {
-  position: relative;
-  display: inline-block;
-  *display: inline;
-  *margin-left: .3em;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.btn-group:first-child {
-  *margin-left: 0;
-}
-
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-toolbar {
-  margin-top: 10px;
-  margin-bottom: 10px;
-  font-size: 0;
-}
-
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
-  font-size: 14px;
-}
-
-.btn-group > .btn-mini {
-  font-size: 10.5px;
-}
-
-.btn-group > .btn-small {
-  font-size: 11.9px;
-}
-
-.btn-group > .btn-large {
-  font-size: 17.5px;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-/*  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;*/
-}
-
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-/*  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;*/
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-/*  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;*/
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
-  *padding-top: 5px;
-  padding-right: 8px;
-  *padding-bottom: 5px;
-  padding-left: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
-  *padding-top: 2px;
-  padding-right: 5px;
-  *padding-bottom: 2px;
-  padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
-  *padding-top: 7px;
-  padding-right: 12px;
-  *padding-bottom: 7px;
-  padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #0044cc;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #222222;
-}
-
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-
-.btn-large .caret {
-  margin-top: 6px;
-}
-
-.btn-large .caret {
-  border-top-width: 5px;
-  border-right-width: 5px;
-  border-left-width: 5px;
-}
-
-.btn-mini .caret,
-.btn-small .caret {
-  margin-top: 8px;
-}
-
-.dropup .btn-large .caret {
-  border-bottom-width: 5px;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-
-.btn-group-vertical > .btn {
-  display: block;
-  float: none;
-  max-width: 100%;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group-vertical > .btn + .btn {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-vertical > .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical > .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical > .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-     -moz-border-radius: 6px 6px 0 0;
-          border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical > .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.alert {
-  padding: 5px 30px 5px 14px;
-  margin:6px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
- -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.alert,
-.alert h4 {
-  color: #c09853;
-}
-
-.alert h4 {
-  margin: 0;
-}
-
-.alert .close {
-  position: relative;
-/*  top: -2px;
-*/  right: -21px;
-  line-height: 20px;
-}
-
-.alert-success {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-
-.alert-success h4 {
-  color: #468847;
-}
-
-.alert-danger,
-.alert-error {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #eed3d7;
-}
-
-.alert-danger h4,
-.alert-error h4 {
-  color: #b94a48;
-}
-
-.alert-info {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-
-.alert-info h4 {
-  color: #3a87ad;
-}
-
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-
-.alert-block p + p {
-  margin-top: 5px;
-}
-
-.nav {
-/*  margin-bottom: 20px;*/
-/*margin-top:5px;*/
-  margin-left: 0;
-  list-style: none;
-  font-weight:bold;
-}
-
-.nav > li > a {
-  display: block;
-}
-
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #0088CC;
-  color:#fff;
-}
-
-.nav > li > a > img {
-  max-width: none;
-}
-
-.nav > .pull-right {
-  float: right;
-}
-
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-
-.nav-list {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-right: -15px;
-  margin-left: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #0088cc;
-}
-
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
-  margin-right: 2px;
-}
-
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-
-.nav-tabs {
- /*  border-bottom: 1px solid #ddd;
- min-height:250px;
-*/
-margin:0 10px;
-}
-
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-/*  line-height: 20px;*/
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
-  color: #555555;
-  cursor: default;
-  background-color: #ffffff;
-  background-image:linear-gradient(to bottom, #fafafa, #f0f0f0);
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  background-color:#c9e9ff;
-/*  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;*/
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
-  color: #fff;
-  background-color: #0088cc;
-  border:#1972c3 solid 1px;
-}
-
-.nav-pills > .warning > a,
-.nav-pills > .warning > a:hover,
-.nav-pills > .warning > a:focus {
-  color: #B94A48;
-  background-color: #F2DEDE;
-  border:#EED3D7 solid 1px;
-}
-
-.nav-stacked > li {
-  float: none;
-}
-
-.nav-stacked > li > a {
-  margin-right: 0;
-/*  border:1px solid #B9D9F0;
-*/}
-
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 2px;
-          border-top-right-radius: 2px;
-  -webkit-border-top-left-radius: 2px;
-          border-top-left-radius: 2px;
-  -moz-border-radius-topright: 2px;
-  -moz-border-radius-topleft: 2px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
-  z-index: 2;
-  border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 5px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
-  margin-top: 6px;
-  border-top-color: #0088cc;
-  border-bottom-color: #0088cc;
-}
-
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
-  border-top-color: #005580;
-  border-bottom-color: #005580;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
-  cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
-  border-color: #999999;
-}
-
-.tabbable {
-  *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.tabbable:after {
-  clear: both;
-}
-
-.tab-content {
-  overflow: auto;
-  border:#ddd solid 1px;
-  padding:15px;
-/*  min-height:428px;
-*/  border-radius:0px 4px 4px 4px;
-/*  border-top:none;
-  border-right:none;
-  border-bottom:none;  border-left:none;*/
-  border:#ddd solid 1px;
-  margin-bottom:10px;
-  margin-left:10px; margin-right:10px;
-
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
-  border-top-color: #ddd;
-  border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
-  border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 5px;
-}
-
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 0px;
-  border-right: 1px solid #ddd;
-  min-height:448px;
-}
-
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-		  font-size:18px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
-  color: #999999;
-}
-
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-}
-
-.navbar {
-  *position: relative;
-  *z-index: 2;
-  margin-bottom: 0px;
-  overflow: visible;
-}
-
-.navbar-inner {
-  background-image:url(../images/header-bg.png);
-  min-height: 50px;
-  padding-right: 20px;
-  padding-left: 20px;
- background-color: #0073BF;
-  /* background-image: -moz-linear-gradient(top, #017CCE, #0073BF);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#017CCE), to(#0073BF));
-  background-image: -webkit-linear-gradient(top, #017CCE, #0073BF);
-  background-image: -o-linear-gradient(top, #017CCE, #0073BF);
-  background-image: linear-gradient(to bottom, #017CCE, #0073BF);*/
-  background-repeat: repeat-x;
-  border: none;
-  -webkit-border-radius: 0px;
-     -moz-border-radius: 0px;
-          border-radius: 0px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#34a4ee', endColorstr='#086dba', GradientType=0);
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-inner:after {
-  clear: both;
-}
-
-.navbar .container {
-  width: auto;
-}
-
-.nav-collapse.collapse {
-  height: auto;
-  overflow: visible;
-}
-
-.navbar .brand {
-  display: block;
-  float: left;
-  margin-left: -20px;
-  font-size: 26px;
-  color: #fff;
-  text-shadow: 0 1px 0 #4d4d4d;
-  font-family:"微软雅黑";
-  height:50px; line-height:50px;
-  padding:0 20px;
-}
-
-.navbar .brand:hover,
-.navbar .brand:focus {
-  text-decoration: none;
-}
-
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 40px;
-  color: #777777;
-}
-
-.navbar-link {
-  color: #777777;
-}
-
-.navbar-link:hover,
-.navbar-link:focus {
-  color: #333333;
-}
-
-.navbar .divider-vertical {
-  height: 10px;
-  margin: 22px 5px;
-  border-right: 0px solid #ffffff;
-  border-left: 1px solid #f2f2f2;
-}
-
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 5px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
-  margin-top: 0;
-}
-
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-form:after {
-  clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 5px;
-  white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-
-.navbar-search .search-query {
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.navbar-static-top {
-  position: static;
-  margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border-width: 0 0 1px;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  border-width: 1px 0 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.navbar-fixed-top {
-  top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
-  float: right;
-  margin-right: 0;
-}
-
-.navbar .nav > li {
-  float: left;
-}
-
-.navbar .nav > li > a {
-  color: #fff;
-  text-decoration: none;
-/*  border-radius:4px;*/
-  height:35px; 
-  line-height:35px;
-  margin:10px; 
-  padding:0 10px;
-  text-shadow: 0 1px 0 #;
-}
-
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  color: #fff;
-  text-decoration: none;
-  background-color: #0961a3;
-  
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #00659a;
-  text-decoration: none;
-/*  border-radius:4px;*/
-  height:35px; line-height:35px;
-  margin:10px; 
-  padding:0 10px;
-  background-color: #c4e8ff;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-right: 5px;
-  margin-left: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #ededed;
-  *background-color: #e5e5e5;
-  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
-  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
-  background-repeat: repeat-x;
-  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #e5e5e5;
-  *background-color: #d9d9d9;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #cccccc \9;
-}
-
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-     -moz-border-radius: 1px;
-          border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
-  position: absolute;
-  top: -7px;
-  left: 9px;
-  display: inline-block;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-left: 7px solid transparent;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
-  position: absolute;
-  top: -6px;
-  left: 10px;
-  display: inline-block;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  border-left: 6px solid transparent;
-  content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  top: auto;
-  bottom: -7px;
-  border-top: 7px solid #ccc;
-  border-bottom: 0;
-  border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  top: auto;
-  bottom: -6px;
-  border-top: 6px solid #ffffff;
-  border-bottom: 0;
-}
-
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #555555;
-  background-color: #e5e5e5;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  right: 12px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  right: 13px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  right: 100%;
-  left: auto;
-  margin-right: -1px;
-  margin-left: 0;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse .navbar-inner {
-  background-color: #1b1b1b;
-  background-image: -moz-linear-gradient(top, #222222, #111111);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-  background-image: -webkit-linear-gradient(top, #222222, #111111);
-  background-image: -o-linear-gradient(top, #222222, #111111);
-  background-image: linear-gradient(to bottom, #222222, #111111);
-  background-repeat: repeat-x;
-  border-color: #252525;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .brand {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-text {
-  color: #999999;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-  background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
-  border-right-color: #222222;
-  border-left-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #515151;
-  border-color: #111111;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-  -webkit-transition: none;
-     -moz-transition: none;
-       -o-transition: none;
-          transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  outline: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e0e0e;
-  *background-color: #040404;
-  background-image: -moz-linear-gradient(top, #151515, #040404);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-  background-image: -webkit-linear-gradient(top, #151515, #040404);
-  background-image: -o-linear-gradient(top, #151515, #040404);
-  background-image: linear-gradient(to bottom, #151515, #040404);
-  background-repeat: repeat-x;
-  border-color: #040404 #040404 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #040404;
-  *background-color: #000000;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #000000 \9;
-}
-
-.breadcrumb {
-  padding: 8px 15px;
-  margin: 0 0 0px;
-  list-style: none;
-  font-weight:bold;
-  background-color: #f5f5f5;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.breadcrumb > li {
-  display: inline-block;
-  *display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-
-.breadcrumb > li > .divider {
-  padding: 0 5px;
-  color: #ccc;
-}
-
-.breadcrumb > .active {
-  color: #ababab;
-}
-
-.pagination {
-/*  margin: 20px 0;*/
-margin:10px;
-float:left;
-}
-
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  margin-left: 0;
-  -webkit-border-radius: 0px;
-     -moz-border-radius: 0px;
-          border-radius: 4px;
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
-  display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
-  float: left;
-  padding: 6px 14px;
-  line-height: 20px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  color: #999999;
-  cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
-  color: #999999;
-  cursor: default;
-  background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
-  border-left-width: 1px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.pagination-centered {
-  text-align: center;
-}
-
-.pagination-right {
-  text-align: right;
-}
-
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
-  padding: 11px 19px;
-  font-size: 17.5px;
-}
-
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;
-}
-
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
-  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;
-}
-
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 3px;
-          border-bottom-left-radius: 3px;
-  -webkit-border-top-left-radius: 3px;
-          border-top-left-radius: 3px;
-  -moz-border-radius-bottomleft: 3px;
-  -moz-border-radius-topleft: 3px;
-}
-
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
-  -webkit-border-top-right-radius: 3px;
-          border-top-right-radius: 3px;
-  -webkit-border-bottom-right-radius: 3px;
-          border-bottom-right-radius: 3px;
-  -moz-border-radius-topright: 3px;
-  -moz-border-radius-bottomright: 3px;
-}
-
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
-  padding: 2px 10px;
-  font-size: 11.9px;
-}
-
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
-  padding: 0 6px;
-  font-size: 10.5px;
-}
-
-.pager {
-  margin: 20px 0;
-  text-align: center;
-  list-style: none;
-  *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.pager:after {
-  clear: both;
-}
-
-.pager li {
-  display: inline;
-}
-
-.pager li > a,
-.pager li > span {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.pager li > a:hover,
-.pager li > a:focus {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-
-.pager .next > a,
-.pager .next > span {
-  float: right;
-}
-
-.pager .previous > a,
-.pager .previous > span {
-  float: left;
-}
-
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
-  color: #999999;
-  cursor: default;
-  background-color: #fff;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.modal {
-  position: fixed;
-  top: 10%;
-  left: 50%;
-  z-index: 1050;
- width: 560px;
-margin-left: -280px;
-
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-.modal2 {
-  position: fixed;
-top: 10%;
- /*   left: 50%;*/
-  z-index: 1050;
-  width: 80%;
-  margin:0 10%;
-/*  margin-left: -280px;*/
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-
-.modal-copy {
-  position: fixed;
-top: 10%;
- /*   left: 50%;*/
-  z-index: 1050;
-  width: 70%;
- margin:0 1%;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-.modal.fade {
-  top: -25%;
-  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
-     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
-       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
-          transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
-  top: 10%;
-}
-
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
-  margin-top: 2px;
-}
-
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-
-.modal-body {
-  position: relative;
-  max-height: 440px;
-  padding: 15px;
-  overflow-y: hidden;
-}
-
-.modal-form {
-  margin-bottom: 0;
-}
-
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-     -moz-box-shadow: inset 0 1px 0 #ffffff;
-          box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.modal-footer:after {
-  clear: both;
-}
-
-.modal-footer .btn + .btn {
-  margin-bottom: 0;
-  margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-
-.modal-footer .btn-block + .btn-block {
-  margin-left: 0;
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  font-size: 11px;
-  line-height: 1.4;
-  opacity: 0;
-  filter: alpha(opacity=0);
-  visibility: visible;
-}
-
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.tooltip.top {
-  padding: 5px 0;
-  margin-top: -3px;
-}
-
-.tooltip.right {
-  padding: 0 5px;
-  margin-left: 3px;
-}
-
-.tooltip.bottom {
-  padding: 5px 0;
-  margin-top: 3px;
-}
-
-.tooltip.left {
-  padding: 0 5px;
-  margin-left: -3px;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-top-color: #000000;
-  border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-right-color: #000000;
-  border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-left-color: #000000;
-  border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-bottom-color: #000000;
-  border-width: 0 5px 5px;
-}
-
-.popover {
-	width:245px;
-  position: absolute;
-  top: 0;
- left: 0;
- z-index: 1010;
-  display: none;
-/* max-width: 265px;
-*/ padding: 1px;
-  text-align: left;
-  white-space: normal;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  word-wrap: break-word;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-.popover.top {
-  margin-top: -10px;
-}
-
-.popover.right {
-  margin-left: 10px;
-}
-
-.popover.bottom {
-  margin-top: 10px;
-}
-
-.popover.left {
-  margin-left: -10px;
-}
-
-.popover-title {
-	width:215px;
-  padding: 9px 15px;
-  margin:0;
-  float:left;
-  font-size: 15px;
-  font-weight: bold;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-     -moz-border-radius: 5px 5px 0 0;
-          border-radius: 5px 5px 0 0;
-}
-.popover-list{
-  padding: 5px 14px;
-  border-bottom:1px solid #ebebeb;
-  float:left;
-}
-.popover-list.wit{ width:237px;}
-.popover-button{
-	line-height:42px;
-	text-align:center;
-	margin-bottom:5px;
-}
-.popover-button i{ margin:0 3px;}
-.popover-title:empty {
-  display: none;
-}
-
-.popover-content{
-}
-.popover-content a{
-padding:5px 13px;
-text-align:center;
-margin:6px 8px;
-border:#949494 solid 1px;
-background-image: -moz-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#bbbbbb));
-background-image: -webkit-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: -o-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: linear-gradient(to bottom, #eaeaea, #bbbbbb);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-display:block;
-float:left;
-}
-.popover-content a:hover{
-border:#455565 solid 1px;
-background-image: -moz-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6d7c8b), to(#5d6d7d));
-background-image: -webkit-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -o-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: linear-gradient(to bottom, #6d7c8b, #5d6d7d);
-color:#fff;
-}
-.popover-content a.curr{
-border:#455565 solid 1px;
-background:#5d6d7d;
-background-image: -moz-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6d7c8b), to(#5d6d7d));
-background-image: -webkit-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -o-linear-gradient(top, #6d7c8b, #006baa);
-background-image: linear-gradient(to bottom, #6d7c8b, #5d6d7d);
-color:#fff;	5d6d7d
-}
-
-.popover-content2{
-}
-.popover-content2 a{
-width:60px; height:28px;
-line-height:28px;
-display:block;
-text-align:center;
-margin:6px 8px;
-border:#c1c1c1 solid 1px;
-background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-float:left;
-}
-.popover-content2 a:hover{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;
-}
-.popover-content2 a.curr{
-border:#004898 solid 1px;
-background:#006baa;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;	
-}
-
-
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover .arrow {
-  border-width: 11px;
-}
-
-.popover .arrow:after {
-  border-width: 10px;
-  content: "";
-}
-
-.popover.top .arrow {
-  bottom: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-top-color: #999;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  border-bottom-width: 0;
-}
-
-.popover.top .arrow:after {
-  bottom: 1px;
-  margin-left: -10px;
-  border-top-color: #ffffff;
-  border-bottom-width: 0;
-}
-
-.popover.right .arrow {
-  top: 50%;
-  left: -11px;
-  margin-top: -11px;
-  border-right-color: #999;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  border-left-width: 0;
-}
-
-.popover.right .arrow:after {
-  bottom: -10px;
-  left: 1px;
-  border-right-color: #ffffff;
-  border-left-width: 0;
-}
-
-.popover.bottom .arrow {
-  top: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-bottom-color: #999;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  border-top-width: 0;
-}
-
-.popover.bottom .arrow:after {
-  top: 1px;
-  margin-left: -10px;
-  border-bottom-color: #ffffff;
-  border-top-width: 0;
-}
-
-.popover.left .arrow {
-  top: 50%;
-  right: -11px;
-  margin-top: -11px;
-  border-left-color: #999;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  border-right-width: 0;
-}
-
-.popover.left .arrow:after {
-  right: 1px;
-  bottom: -10px;
-  border-left-color: #ffffff;
-  border-right-width: 0;
-}
-
-
-
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.thumbnails:after {
-  clear: both;
-}
-
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-
-.thumbnails > li {
-  float: left;
-}
-.row-fluid .entry-w{ width:980px; margin:0 auto; font-family:"微软雅黑";}
-.thumbnail {
-  display: block;
-  padding: 16px 35px;
-  margin:150px 20px;
-  line-height: 20px;
-  border: 1px solid #bce8f1;
-   background-image: -moz-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f0f9fd), to(#c8e5f3));
-  background-image: -webkit-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: -o-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: linear-gradient(to bottom, #f0f9fd, #c8e5f3);
-  box-shadow:0 1px 0 rgba(255, 255, 255, 0.8) inset, 0 1px 2px rgba(0, 0, 0, 0.05);/*
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-     -moz-transition: all 0.2s ease-in-out;
-       -o-transition: all 0.2s ease-in-out;
-          transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover,
-a.thumbnail:focus {
-  background-image: -moz-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e5f6ff), to(#9cd6f3));
-  background-image: -webkit-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: -o-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: linear-gradient(to bottom, #e5f6ff, #9cd6f3);
-  box-shadow:0 1px 0 rgba(255, 255, 255, 0.8) inset, 0 1px 2px rgba(0, 0, 0, 0.05);
-  border-color: #85c1e0;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.thumbnail .caption {
-  padding: 9px;
-  color: #383838;
-  text-align:center;
-
-
-}
-
-.media,
-.media-body {
-  overflow: hidden;
-  *overflow: visible;
-  zoom: 1;
-}
-
-.media,
-.media .media {
-  margin-top: 15px;
-}
-
-.media:first-child {
-  margin-top: 0;
-}
-
-.media-object {
-  display: block;
-}
-
-.media-heading {
-  margin: 0 0 5px;
-}
-
-.media > .pull-left {
-  margin-right: 10px;
-}
-
-.media > .pull-right {
-  margin-left: 10px;
-}
-
-.media-list {
-  margin-left: 0;
-  list-style: none;
-}
-
-.label,
-.badge {
-  display: inline-block;
-  padding: 2px 4px;
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  white-space: nowrap;
-  vertical-align: baseline;
-  background-color: #999999;
-}
-
-.label {
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.badge {
-  padding-right: 9px;
-  padding-left: 9px;
-  -webkit-border-radius: 9px;
-     -moz-border-radius: 9px;
-          border-radius: 9px;
-}
-
-.label:empty,
-.badge:empty {
-  display: none;
-}
-
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
-
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-
-.progress {
-  height: 20px;
-  margin-bottom: 20px;
-  overflow: hidden;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
-  float: left;
-  width: 0;
-  height: 100%;
-  font-size: 12px;
-  color: #ffffff;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-     -moz-transition: width 0.6s ease;
-       -o-transition: width 0.6s ease;
-          transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-     -moz-background-size: 40px 40px;
-       -o-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-     -moz-animation: progress-bar-stripes 2s linear infinite;
-      -ms-animation: progress-bar-stripes 2s linear infinite;
-       -o-animation: progress-bar-stripes 2s linear infinite;
-          animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.accordion {
-  margin-bottom: 20px;
-}
-
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.accordion-heading {
-  border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-
-.accordion-toggle {
-  cursor: pointer;
-}
-
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
-  position: relative;
-  margin-bottom: 20px;
-  line-height: 1;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-inner > .item {
-  position: relative;
-  display: none;
-  -webkit-transition: 0.6s ease-in-out left;
-     -moz-transition: 0.6s ease-in-out left;
-       -o-transition: 0.6s ease-in-out left;
-          transition: 0.6s ease-in-out left;
-}
-
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
-  display: block;
-  line-height: 1;
-}
-
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  display: block;
-}
-
-.carousel-inner > .active {
-  left: 0;
-}
-
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-
-.carousel-inner > .next {
-  left: 100%;
-}
-
-.carousel-inner > .prev {
-  left: -100%;
-}
-
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
-  left: 0;
-}
-
-.carousel-inner > .active.left {
-  left: -100%;
-}
-
-.carousel-inner > .active.right {
-  left: 100%;
-}
-
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-     -moz-border-radius: 23px;
-          border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
-  right: 15px;
-  left: auto;
-}
-
-.carousel-control:hover,
-.carousel-control:focus {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-
-.carousel-indicators {
-  position: absolute;
-  top: 15px;
-  right: 15px;
-  z-index: 5;
-  margin: 0;
-  list-style: none;
-}
-
-.carousel-indicators li {
-  display: block;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin-left: 5px;
-  text-indent: -999px;
-  background-color: #ccc;
-  background-color: rgba(255, 255, 255, 0.25);
-  border-radius: 5px;
-}
-
-.carousel-indicators .active {
-  background-color: #fff;
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
-  line-height: 20px;
-  color: #ffffff;
-}
-
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-
-.carousel-caption p {
-  margin-bottom: 0;
-}
-
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 30px;
-  color: inherit;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  letter-spacing: -1px;
-  color: inherit;
-}
-
-.hero-unit li {
-  line-height: 30px;
-}
-
-.pull-right {
-  float: right;
-}
-
-.pull-left {
-  float: left;
-}
-
-.hide {
-  display: none;
-}
-
-.show {
-  display: block;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-.affix {
-  position: fixed;
-}

+ 0 - 1168
stmms-web/src/main/webapp/static/mark-leader/css/style.css

@@ -1,1168 +0,0 @@
-@charset "utf-8";
-/* CSS Document */
-html {
-	height: 100%;
-}
-
-body {
-	margin: 0;
-	padding: 0px 0 0 0;
-	font-size: 14px;
-	background: #f5f4f4;
-}
-
-input
-,
-textarea
-,
-{
-margin
-:
- 
-0;
-padding
-:
- 
-0;
-font-size
-:
- 
-14
-px
-;
-
-    
-outline
-:
- 
-none
-;
-
-
-}
-html:root body,html:root input,html:root button,html:root textarea,html:root select { '
-	font-family: "微软雅黑", Fixedsys;
-	';
-}
-
-form,ul,ol,li,dl,dt,dd,h1,h2,h3,h4,h5,p {
-	margin: 0;
-	padding: 0;
-	list-style: none;
-	ont-style: normal;
-}
-
-fieldset {
-	border-left: none;
-	border-right: none;
-	font-size: 14px;
-	border-top: solid 1px #decfa0;
-	border-bottom: none;
-}
-
-legend {
-	color: #4971b9;
-	margin-left: 10px;
-}
-
-a {
-	text-decoration: none;
-	color: #484848;
-	outline: none;
-}
-
-a:hover {
-	text-decoration: none;
-	color: #279437;
-}
-
-a img {
-	border: none;
-}
-
-i,em {
-	font-style: normal;
-}
-/* 通用样式 */
-.fl {
-	float: left;
-}
-
-.fr {
-	float: right;
-}
-
-.oh {
-	overflow: hidden;
-}
-
-.hd {
-	display: none
-}
-
-.width2 {
-	width: 200px;
-}
-
-.padding5 {
-	padding: 5px;
-}
-
-.padding10 {
-	padding: 10px;
-}
-
-.domain {
-	padding: 3px;
-	min-height: 30px;
-}
-
-.border {
-	border-color: #ccc;
-	border-left: none;
-	border-right: none;
-}
-
-.mr-t {
-	margin-top: 5px;
-}
-
-.mr2-t {
-	margin-top: 10px;
-}
-
-.hide {
-	display: none;
-}
-
-.show {
-	display: block;
-}
-/*回评*/
-.image-view-popover {
-	width: 100%;
-	background: #fff;
-	position: absolute;
-}
-
-.image-view-popover .popover-header {
-	height: 50px;
-	background: #eff3f6;
-	border-bottom: solid 1px #dce0e2;
-}
-
-.image-view-popover .popover-header .title {
-	font-size: 26px;
-	line-height: 46px;
-	font-weight: bold;
-	color: #3163a1;
-	margin-left: 15px;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-switch {
-	float: left;
-	margin: 9px 0px 8px 15px;
-}
-
-.image-view-popover .popover-header .image-switch a {
-	padding: 3px 8px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-switch a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-switch a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-control {
-	margin: 9px 15px 8px 15px;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-control a {
-	padding: 3px 8px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-control a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-control a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-close {
-	margin-top: 15px;
-	margin-right: 15px;
-	cursor: pointer;
-	float: right;
-}
-
-.image-view-popover .popover-content {
-	padding: 10px;
-}
-
-.image-content {
-	position: relative;
-	overflow: hidden;
-}
-
-.mark-steps {
-	background-color: #cbd0d3;
-	height: 100%;
-}
-
-.mark-steps .header {
-	background-color: #2da5da;
-	height: 40px;
-	line-height: 40px;
-	font-size: 14px;
-	color: #fff;
-	text-align: center;
-	white-space: nowrap;
-}
-
-.mark-steps .header .useinfo {
-	width: 55%;
-	color: #fff;
-	padding: 0 5px 0 10px;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	display: block;
-	float: left;
-}
-
-.mark-steps .header .logout {
-	width: 30%;
-	color: #fff;
-	padding: 0 20px 0 5px;
-}
-
-.mark-steps .tips {
-	padding: 5px;
-}
-
-.mark-steps .tips .tools {
-	
-}
-
-.mark-steps .tips .setp {
-	margin-top: 5px;
-}
-
-.mark-steps .tips .text {
-	padding: 0 55px;
-	line-height: 28px;
-}
-
-.mark-steps .tips .on {
-	width: 74px;
-	height: 28px;
-	background: url(../images/on.png) no-repeat;
-	display: block;
-	margin-left: 50px;
-}
-
-.mark-steps .tips .off {
-	width: 74px;
-	height: 28px;
-	background: url(../images/off.png) no-repeat;
-	display: block;
-	margin-left: 50px;
-}
-/*键盘给分*/
-.mark-steps .step-board {
-	padding: 5px 5px 5px 5px;
-}
-
-.mark-steps .step-board .step-list {
-	position: relative;
-	overflow: hidden;
-}
-
-.mark-steps .step-board .header {
-	color: #fff;
-	font-size: 14px;
-	font-weight: bold;
-	background: #5d6d7d;
-	height: 16px;
-	line-height: 16px;
-	text-align: center;
-	display: block;
-}
-
-.mark-steps .step-board .sublist {
-	
-}
-
-.mark-steps .step-board .sublist .fraction {
-	background: #ececec;
-	height: 39px;
-	line-height: 39px;
-	color: #ed5321;
-	display: block;
-	text-align: center;
-	font-family: "微软雅黑";
-	font-size: 30px;
-	font-weight: bold;
-	margin: 4px 0;
-}
-.mark-steps .step-board .newSubListCss{height: 20px;line-height: 19px; color: #333; display: block;text-align: center; font-family: "微软雅黑"; font-size: 16px; font-weight: normal; margin: 5px 0 5px 0;}
-.mark-steps .step-board .newSubListCss .red{ color: #ed5321; font-weight: bold; font-size: 16px; }
-/*.sidebar .step-list .sublist .up{ height:27px; text-align:center; cursor:pointer;}
-.sidebar .step-list .sublist .down{height:22px; text-align:center; cursor:pointer;}*/
-.mark-steps .step-board .step-list .done {
-	width: 100%;
-	height: 118px;
-	background: #c6fde7;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .done .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .done .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #309c52;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .done .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #ed5321;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .done .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .done .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #309c52;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .done .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .done .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .current {
-	width: 100%;
-	height: 118px;
-	background: #ffe2d7;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .current .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .current .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #309c52;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .current .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #ed5321;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .current .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .current .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #309c52;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .current .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .current .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .todo {
-	width: 100%;
-	height: 118px;
-	background: #e0e2e4;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .todo .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .todo .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #8d8d8d;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .todo .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #8d8d8d;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .todo .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .todo .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #8d8d8d;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .todo .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #8d8d8d;
-}
-
-.mark-steps .step-board .step-list .todo .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #8d8d8d;
-}
-/*分值列表*/
-.score-board {
-	width: 283px;
-}
-
-.score-board .header {
-	width: 273px;
-	height: 39px;
-	padding: 0 5px;
-	background-color: #5d6d7d;
-	line-height: 39px;
-	font-size: 14px;
-	color: #fff;
-	font-weight: bold;
-	cursor: pointer;
-	float: left;
-}
-
-.score-board .header .span1 {
-	width: 120px;
-}
-
-.score-board .header-close {
-	margin-top: 10px;
-	float: right;
-}
-
-.score-board .header-text {
-	margin-top: -10px;
-	float: right;
-	color: #fff;
-}
-
-.score-board .footer {
-	width: 263px;
-	height: 39px;
-	line-height: 39px;
-	font-weight: bold;
-	color: #fff;
-	padding: 0 10px;
-	background: #5d6d7d;
-	float: left;
-}
-
-.score-board .footer .font {
-	font-size: 22px;
-	text-align: left;
-	font-family: "微软雅黑", Fixedsys;
-	float: left;
-}
-
-.score-board .footer .yellow {
-	color: #ffd800;
-}
-
-.score-board .footer .button {
-	width: 55px;
-	height: 26px;
-	line-height: 26px;
-	text-align: center;
-	margin-top: 7px;
-	margin-left: 5px;
-	color: #fff;
-	font-size: 16px;
-	font-weight: bold;
-	background: #ed5321;
-	display: block;
-	float: right;
-}
-
-.score-board .content {
-	width: 271px;
-	border: solid 1px #5d6d7d;
-	background: #e6eaed;
-	padding: 5px;
-	float: left;
-}
-
-.score-board .content .sublist {
-	width: 271px;
-	margin: 2px 0;
-	float: left;
-}
-
-.score-board .content .sublist:hover {
-	background: #fce9ce;
-}
-
-.score-board .content .sublist .number {
-	width: 55px;
-	padding: 4px 0;
-	font-size: 12px;
-	font-weight: bold;
-	color: #46565f;
-	word-wrap: break-word;
-	float: left;
-	text-align: right;
-}
-
-.score-board .content .sublist .fraction {
-	width: 211px;
-	margin-left: 5px;
-	word-wrap: break-word;
-	float: right;
-	text-align: left;
-}
-
-.score-board .content .sublist .fraction a {
-	width: 24px;
-	height: 24px;
-	line-height: 24px;
-	margin: 2px;
-	font-size: 12px;
-	color: #333333;
-	background: #d0d5d9;
-	border: solid 1px #9ea3a7;
-	text-align: center;
-	display: block;
-	float: left;
-}
-
-.score-board .content .sublist .fraction a:hover {
-	background: #ed5321;
-	color: #fff;
-	border: #ed5321 solid 1px;
-}
-
-.score-board .content .sublist .fraction a.active {
-	background: #ed5321;
-	color: #fff;
-	border: #ed5321 solid 1px;
-}
-
-.score-board-popover {
-	float: right;
-	top: 48px;
-	right: 15.3%;
-	position: absolute;
-}
-/*回评列表*/
-.mark-sidebar {
-	background-color: #cbd0d3;
-	height: 100%;
-}
-
-.mark-sidebar .header {
-	background-color: #46617b;
-	height: 40px;
-	line-height: 40px;
-	font-size: 20px;
-	border-bottom: #46617b solid 1px;
-	color: #fff;
-	text-align: center;
-}
-
-.mark-sidebar .header p {
-	float: left;
-	padding: 0 10px;
-}
-
-.mark-sidebar .header a {
-	float: right;
-	padding: 15px 10px 0 0;
-}
-
-.mark-sidebar .header .yellow {
-	color: #ffd800;
-}
-
-.mark-sidebar .m-pagination {
-	padding: 11px 0;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination a {
-	padding: 5px 8px;
-	text-align: center;
-	color: #fff;
-	font-size: 14px;
-	background: #5a7686;
-	margin: 0 5px;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination a:hover {
-	background: #ed5321;
-}
-
-.mark-sidebar .m-pagination a.active {
-	background: #ed5321;
-}
-
-.mark-sidebar .m-pagination {
-	padding: 11px 0;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination i {
-	padding: 5px 8px;
-	text-align: center;
-	color: #fff;
-	font-size: 14px;
-	background: #acacac;
-	margin: 0 5px;
-	text-align: center;
-}
-
-.mark-sidebar .sublist {
-	
-}
-
-.mark-sidebar .sublist .titel {
-	background: #2da5da;
-	height: 37px;
-	line-height: 37px;
-	color: #fff;
-	border: #2297cc solid 1px;
-	text-align: center;
-}
-/*图片内容区开始*/
-.center-content {
-	
-}
-
-.center-content .header {
-	background: #5d6d7d;
-	color: #fff;
-	height: 21px;
-	padding: 10px;
-}
-
-.center-content .header .text {
-	color: #fff;
-	font-size: 16px;
-	font-weight: bold;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	float: left;
-}
-
-.center-content .header .text i {
-	padding: 0 2px;
-}
-
-.center-content .header .text em {
-	color: #ffe400;
-}
-/*.center-content .header .pictures{ color:#fff; margin-left:10px; cursor:pointer; float:left;}
-.center-content .header .pictures .L-btn{ background:#cbd0d3; width:93px; height:28px; padding:5px 10px; color:#4b555e; font-weight:bold;}
-.center-content .header .pictures .M-btn{ background:#e0e2e4; height:28px; padding:5px 10px; color:#354f67;}*/
-.center-content .header .header-btn {
-	
-}
-
-.center-content .header .btn {
-	background: #cbd0d3;
-	padding: 3px 6px 3px 6px;
-	margin: -3px 2px 2px 1px;
-	color: #4b555e;
-	font-weight: bold;
-	float: left;
-}
-/*.center-content .header .fraction{ font-size:36px; font-family:Arial, Helvetica, sans-serif; font-weight:bold; color:#008f58; text-align:right; float:right;}
-*/
-.center-content .header .fraction .active {
-	font-size: 45px;
-	color: #f53c00;
-}
-
-.center-content .tips {
-	word-wrap: break-word;
-	text-align: left;
-	float: right;
-}
-/*.center-content .tips .help{ width:25%;color:#fff; padding:0 5px 0 5px; float:left;}
-*/
-.center-content .tips .useinfo {
-	color: #fff;
-	padding: 0 5px 0 10px;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	display: block;
-	float: left;
-}
-
-.center-content .tips .logout {
-	color: #fff;
-	padding: 0 5px 0 5px;
-	float: left;
-}
-
-.center-content .content {
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	overflow: hidden;
-	position: relative;
-}
-/*从这里开始是评卷详细信息*/
-.mark-detail {
-	
-}
-
-.mark-detail .m-close {
-	font-size: 17.5px;
-	font-weight: bold;
-	color: #006998;
-	padding: 11px 19px;
-	background: #91d2f0;
-	cursor: pointer;
-	float: right;
-}
-
-.mark-detail .m-open {
-	font-size: 17.5px;
-	font-weight: bold;
-	color: #0079af;
-	padding: 11px 19px;
-	background: #b5e3f8;
-	float: right;
-}
-
-.mark-detail .m-open .yellow {
-	color: #ed5321;
-}
-
-.mark-detail-float {
-	float: right;
-	bottom: 5px;
-	right: 15.3%;
-	position: absolute;
-}
-/*小助手样式*/
-.assistant {
-	position: absolute;
-}
-/*图片属性*/
-.image-popover {
-	
-}
-
-.image-popover .image-control {
-	width: 330px;
-	border: #c4e0ed solid 1px;
-	background: #f2fbff;
-	float: left;
-}
-
-.image-popover .image-control .control-row {
-	width: 310px;
-	padding: 5px 6px;
-	float: left;
-}
-
-.image-popover .image-control .control-row .title {
-	width: 60px;
-	font-weight: bold;
-	font-size: 14px;
-	color: #006d9d;
-	font-family: "宋体";
-	margin-top: 10px;
-	text-align: right;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content {
-	width: 250px;
-	word-wrap: break-word;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content a {
-	padding: 6px 12px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	/*text-shadow:0px 0px 1px #fff;
-*/
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-popover .image-control .control-row .content a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-popover .image-popover-close {
-	padding: 8px 8px;
-	background: #e4e4e4;
-	border: #c4e0ed solid 1px;
-	border-left: none;
-	font-size: 14px;
-	font-family: "宋体";
-	font-weight: bold;
-	color: #017eb5;
-	text-align: center;
-	float: left;
-	cursor: pointer;
-}
-/*弹出窗口*/
-.warning-popover {
-	width: 400px;
-	min-height: 150px;
-	background: #f2dede;
-	border: #eed3d7 solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -100px 0 0 -200px;
-	text-align: center;
-}
-
-.warning-popover p {
-	font-size: 28px;
-	color: #b94a48;
-	text-align: center;
-	padding: 30px 15px;
-	line-height: 35px;
-}
-
-.warning-popover .text-c {
-	margin: 0px 10px 10px 10px;
-}
-
-.message-popover {
-	width: 400px;
-	min-height: 150px;
-	background: #fff;
-	font-family: "微软雅黑", Fixedsys;
-	border: #5d6d7d solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -150px 0 0 -200px;
-	text-align: center;
-}
-
-.message-popover .popover-header {
-	width: 100%;
-	height: 46px;
-	background: #5d6d7d;
-	color: #fff;
-}
-
-.message-popover .popover-header .title {
-	font-size: 22px;
-	font-weight: bold;
-	color: #fff;
-	margin: 0px;
-	padding: 13px 0 0 13px;
-	float: left;
-}
-
-.message-popover .popover-header .image-close {
-	margin: 0px;
-	padding: 13px 13px 0 0px;
-	cursor: pointer;
-	float: right;
-}
-
-.message-popover .popover-cont {
-	font-size: 18px;
-	color: #005277;
-	text-align: left;
-	padding: 15px;
-	line-height: 30px;
-	word-wrap: break-word;
-}
-
-.message-popover .text-c {
-	margin: 0px 0 15px 0;
-	width: 100px;
-	text-align: center;
-}
-
-.message-popover2 {
-	width: 400px;
-	font-family: "微软雅黑", Fixedsys;
-	min-height: 150px;
-	background: #fff;
-	border: #ffcc00 solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -150px 0 0 -200px;
-	text-align: center;
-}
-
-.message-popover2 .popover-header {
-	width: 100%;
-	height: 46px;
-	background: #eabb00;
-	color: #fff;
-}
-
-.message-popover2 .popover-header .title {
-	font-size: 22px;
-	font-weight: bold;
-	color: #000;
-	margin: 0px;
-	padding: 13px 0 0 13px;
-	float: left;
-}
-
-.message-popover2 .popover-header .image-close {
-	margin: 0px;
-	padding: 13px 13px 0 0px;
-	cursor: pointer;
-	float: right;
-}
-
-.message-popover2 .popover-cont {
-	font-size: 18px;
-	color: #fd3435;
-	text-align: center;
-	padding: 15px;
-	line-height: 30px;
-	text-align: left;
-}
-
-.message-popover2 .text-c {
-	margin: 0px 0 15px 0;
-	width: 100px;
-	text-align: center;
-}
-
-.user-input {
-	font-family: "微软雅黑", Fixedsys;
-	width: 94%;
-	height: 25px !important;
-	font-size: 14px;
-	font-weight: bold;
-	border-top: #a5c7c8 solid 1px;
-	border-left: #99b3d3 solid 1px;
-	border-right: #bec9d7 solid 1px;
-	border-bottom: #e2e7ed solid 1px;
-	font-size: 14px;
-	padding: 10px !important;
-	border-radius: 0px;
-	overflow: hidden;
-}
-
-.wrong {
-    font-size: 18px;
-    color: #f00;
-    line-height: 30px;
-}
-.message-popover .popover-cont .username,.password,.password2 {
-    font-size: 12px;
-    color: #f00;
-    line-height: 30px;
-    padding-left: 20px;
-}
-a.button.all-zero-button {
-	margin-right: 20px;
-}
-.message-popover .popover-cont .username-input,.password-input,.password2-input{
-    width: 200px;
-}
-.message-popover .text-userInfo {
-    margin: 0px 0 15px 0;
-    width: 50px;
-    float: right;
-    margin-right: 20px;
-}
-
-.password-input,.password2-input{
-    margin-left: 20px;
-}
-
-.username-input{
-    margin-left: 12px;
-}

+ 0 - 21
stmms-web/src/main/webapp/static/mark-leader/image-popover.html

@@ -1,21 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>高校版阅卷系统</title>
-<link href="css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="css/style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div class="image-view-popover">
-  <div class="popover-header">
-    <p class="title">原图切换</p>
-    <p class="image-switch"><a href="#">1</a><a href="#">2</a><a class="curr" href="#">3</a><a href="#">4</a></p>
-    <p class="image-control"><a class="curr" href="#">放大</a><a href="#">缩小</a><a href="#">1:1</a><a href="#">全屏</a></p>
-    <p class="image-close"><img src="images/images-close.png" /></p>
-  </div>
-  <div class="popover-content"><img src="images/00001_F.jpg" /></div>
-</div>
-</body>
-</html>

BIN
stmms-web/src/main/webapp/static/mark-leader/images/00001_F.jpg


BIN
stmms-web/src/main/webapp/static/mark-leader/images/background.jpg


BIN
stmms-web/src/main/webapp/static/mark-leader/images/button.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/close.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/down.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/hp-close.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/images-close.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/off.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/on.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/up.png


BIN
stmms-web/src/main/webapp/static/mark-leader/images/未标题-2.psd


BIN
stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings-white.png


BIN
stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings.png


+ 0 - 308
stmms-web/src/main/webapp/static/mark-leader/index-select.html

@@ -1,308 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>高校版阅卷系统</title>
-<link href="css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="css/style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div class="container-fluid">
-  <div class="row-fluid">
-    <!--若隐藏左边回评界面,请将Body content里class="span10"改为span12-->
-    <div class="span2 mark-sidebar">
-       <div class="header">
-       <p class="fl">前<i class=" yellow">10</i>份-前<i class=" yellow">20</i>份</p>
-       <a href="#"><img src="images/hp-close.png" /></a>
-       </div>
-       <div class="m-pagination">
-        <a class="active" href="#">上一页</a>
-        <a href="#">下一页</a>
-       </div>
-       <div class="m-pagination">
-        <i>上一页</i>
-        <i>下一页</i>
-       </div>
-       <div class="sublist">
-        <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>密号</th>
-                  <th>时间</th>
-                  <th>总分</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr >
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="act">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="active">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-              </tbody>
-            </table>
-       </div>
-    </div>
-    <div class="span10 center-content">
-     <!--头部内容区开始-->
-      <div class="row-fluid">
-         <div class="header">
-         <p class="text">
-         <i>正评</i>
-         <i>密号<em>89652</em></i>
-         <i>评卷数<em>0</em></i>
-         </p>
-         <p class="text">
-         <i>试卷总数<em>100</em></i>
-         <i>已评<em>50份</em></i>
-         <i>未评<em>30份</em></i>
-         <i>已评比例<em>20%</em></i>
-         </p>
-         <a href="#" class="btn">隐藏</a>
-         <p class="tips">
-          <em>
-          <a href="#" class="btn"><!--<i class="icon-zoom-in"></i>-->放大</a>
-          <a href="#" class="btn"><!--<i class="icon-zoom-out"></i>-->缩小</a>
-          <a href="#" class="btn"><!--<i class="icon-move"></i>-->拖动</a>
-          <a href="#" class="btn"><!--<i class="icon-zoom-out"></i>-->1:1</a>
-          </em>
-          <em><a href="#" class="btn"><i class="icon-hand-up"></i> <i>小助手</i></a></em>
-          <a class="useinfo" href="#"><i class="icon-user icon-white"></i> <i>中国党中国党</i></a>
-          <a class="logout" href="#"><i class="icon-off icon-white"></i> <i>退出</i></a>
-         </p>
-         </div>
-      </div>
-     <!--头部内容区结束-->
-      <div class="row-fluid">
-       <div class="span10 image-content"><img src="images/00001_F.jpg" /></div>
-       <div class="span2 mark-steps">
-        <!--从这里开始是键盘给分板-->
-           <div class="step-board">
-             <a href="#" class="header"><< 显示分值表</a>
-                 <p><i class="fl mr2-t"><strong>选作:</strong></i>
-                   <select class="span8 mr-t">
-                  <option>未选择</option>
-                  <option>2</option>
-                  <option>3</option>
-                  <option>4</option>
-                  <option>5</option>
-                </select>
-                </p>
-             <div class="sublist"><p class="fraction">总分 <i>50分</i></p><div>
-             
-             <div class="step-list">
-             <div class="done">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25.5</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="current">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">8</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-            </div>
-            
-           </div>
-       </div>
-           </div>
-           <!--键盘给分板到这里结束-->
-       </div>
-      </div>
-      <!--从这里开始是小助手-->
-      <div class="popover bottom assistant show">
-           <div class="arrow"></div>
-           <h3 class="popover-title">评卷功能</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">回评</a><a class="curr" href="#">样卷</a><a  href="#">标答</a><a  href="#">全卷</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">问题卷</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">试卷模糊</a><a class="curr" href="#">答错位置</a><a  href="#">无法判别</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">个人设置</h3>
-              <div class="popover-content">
-              <span class="popover-list">总分确认</span>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                开启
-              </label>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                关闭
-              </label>
-              </div>
-        </div>
-<!--小助手结束--> 
-    </div>
-  </div>
-</div>
-<!--从这里开始是分值列表-->
-  <div class="score-board score-board-popover">
-    <div class="header">
-    <p class="fl"><i class="fl">选作题:</i><select class="span1  mr-t">
-  <option>未选择</option>
-  <option>2</option>
-  <option>3</option>
-  <option>4</option>
-  <option>5</option>
-</select></p>
-    <a class="header-close" href="#"><i class="header-text">键盘给分 >></i></a>
-<!--    <a class="header-close" href="#"><img src="images/close.png" /> 键盘给分</a></div>
--->    </div>
-    <div class="content">
-      <div class="sublist">
-        <p class="number">01</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">02</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">第三小题填空提</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a class="active" href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">04</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">05</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">06</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">07</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">08</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">10</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-    </div>
-    <div class="footer">
-      <p class="font">总分:<i class="yellow">50分</i></p>
-      <a class="button" href="">提 交</a>
-    </div>
-  </div>
-<!--分值列表结束-->
-</body>
-</html>

+ 0 - 291
stmms-web/src/main/webapp/static/mark-leader/index.html

@@ -1,291 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>高校版阅卷系统</title>
-<link href="css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="css/style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div class="container-fluid">
-  <div class="row-fluid">
-    <!--若隐藏左边回评界面,请将Body content里class="span10"改为span12-->
-    <div class="span2 mark-sidebar">
-       <div class="header">
-       <p class="fl">前<i class=" yellow">10</i>份-前<i class=" yellow">20</i>份</p>
-       <a href="#"><img src="images/hp-close.png" /></a>
-       </div>
-       <div class="m-pagination">
-        <a class="active" href="#">上一页</a>
-        <a href="#">下一页</a>
-       </div>
-       <div class="m-pagination">
-        <i>上一页</i>
-        <i>下一页</i>
-       </div>
-       <div class="sublist">
-        <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>密号</th>
-                  <th>时间</th>
-                  <th>总分</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr >
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="act">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="active">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-              </tbody>
-            </table>
-       </div>
-    </div>
-    <div class="span10 center-content">
-     <!--头部内容区开始-->
-      <div class="row-fluid">
-         <div class="header">
-         <p class="text">
-         <i>正评</i>
-         <i>密号<em>89652</em></i>
-         <i>评卷数<em>0</em></i>
-         </p>
-         <p class="text">
-         <i>试卷总数<em>100</em></i>
-         <i>已评<em>50份</em></i>
-         <i>未评<em>30份</em></i>
-         <i>已评比例<em>20%</em></i>
-         </p>
-         <a href="#" class="btn">隐藏</a>
-         <p class="tips">
-          <em>
-          <a href="#" class="btn"><i class="icon-zoom-in"></i> 放大</a>
-          <a href="#" class="btn"><i class="icon-zoom-out"></i> 缩小</a>
-          <a href="#" class="btn"><i class="icon-move"></i> 拖动</a>
-          <a href="#" class="btn"><i class="icon-zoom-out"></i> 1:1</a>
-          </em>
-          <em><a href="#" class="btn"><i class="icon-hand-up"></i> <i>小助手</i></a></em>
-          <a class="useinfo" href="#"><i class="icon-user icon-white"></i> <i>中国党中国党</i></a>
-          <a class="logout" href="#"><i class="icon-off icon-white"></i> <i>退出</i></a>
-         </p>
-         </div>
-      </div>
-     <!--头部内容区结束-->
-      <div class="row-fluid">
-       <div class="span10 image-content"><img src="images/00001_F.jpg" /></div>
-       <div class="span2 mark-steps">
-        <!--从这里开始是键盘给分板-->
-           <div class="step-board">
-             <a href="#" class="header"><< 显示分值表</a>
-             <div class="sublist"><p class="fraction">总分 <i>50分</i></p><div>
-             
-             <div class="step-list">
-             <div class="done">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25.5</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="current">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">8</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-            </div>
-            
-           </div>
-       </div>
-           </div>
-           <!--键盘给分板到这里结束-->
-       </div>
-      </div>
-      <!--从这里开始是小助手-->
-      <div class="popover bottom assistant show">
-           <div class="arrow"></div>
-           <h3 class="popover-title">评卷功能</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">回评</a><a class="curr" href="#">样卷</a><a  href="#">标答</a><a  href="#">全卷</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">问题卷</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">试卷模糊</a><a class="curr" href="#">答错位置</a><a  href="#">无法判别</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">个人设置</h3>
-              <div class="popover-content">
-              <span class="popover-list">总分确认</span>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                开启
-              </label>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                关闭
-              </label>
-              </div>
-        </div>
-<!--小助手结束--> 
-    </div>
-  </div>
-</div>
-<!--从这里开始是分值列表-->
-  <div class="score-board score-board-popover">
-    <div class="header">
-    <p class="fl">书面表达(完成句子)第五大题目</p>
-    <a class="header-close" href="#"><img src="images/close.png" /></a></div>
-    <div class="content">
-      <div class="sublist">
-        <p class="number">01</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">02</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">第三小题填空提</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a class="active" href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">04</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">05</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">06</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">07</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">08</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">10</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-    </div>
-    <div class="footer">
-      <p class="font">总分:<i class="yellow">50分</i></p>
-      <a class="button" href="">提 交</a>
-    </div>
-  </div>
-<!--分值列表结束-->
-</body>
-</html>

File diff suppressed because it is too large
+ 0 - 4
stmms-web/src/main/webapp/static/mark-leader/js/jquery-ui.min.js


File diff suppressed because it is too large
+ 0 - 3
stmms-web/src/main/webapp/static/mark-leader/js/jquery.min.js


File diff suppressed because it is too large
+ 0 - 0
stmms-web/src/main/webapp/static/mark-leader/js/jquery.min.map


File diff suppressed because it is too large
+ 0 - 7
stmms-web/src/main/webapp/static/mark-leader/js/jquery.mousewheel.min.js


+ 0 - 482
stmms-web/src/main/webapp/static/mark-leader/js/json2.js

@@ -1,482 +0,0 @@
-/*
-    http://www.JSON.org/json2.js
-    2010-03-20
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects. It can be a
-                        function or an array of strings.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the value
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 ? '0' + n : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array of strings, then it will be
-            used to select the members to be serialized. It filters the results
-            such that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date ?
-                    'Date(' + this[key] + ')' : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-*/
-
-/*jslint evil: true, strict: false */
-
-/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
-    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (!this.JSON) {
-    this.JSON = {};
-}
-
-(function () {
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return n < 10 ? '0' + n : n;
-    }
-
-    if (typeof Date.prototype.toJSON !== 'function') {
-
-        Date.prototype.toJSON = function (key) {
-
-            return isFinite(this.valueOf()) ?
-                   this.getUTCFullYear()   + '-' +
-                 f(this.getUTCMonth() + 1) + '-' +
-                 f(this.getUTCDate())      + 'T' +
-                 f(this.getUTCHours())     + ':' +
-                 f(this.getUTCMinutes())   + ':' +
-                 f(this.getUTCSeconds())   + 'Z' : null;
-        };
-
-        String.prototype.toJSON =
-        Number.prototype.toJSON =
-        Boolean.prototype.toJSON = function (key) {
-            return this.valueOf();
-        };
-    }
-
-    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        gap,
-        indent,
-        meta = {    // table of character substitutions
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '"' : '\\"',
-            '\\': '\\\\'
-        },
-        rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        escapable.lastIndex = 0;
-        return escapable.test(string) ?
-            '"' + string.replace(escapable, function (a) {
-                var c = meta[a];
-                return typeof c === 'string' ? c :
-                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + '"' :
-            '"' + string + '"';
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i,          // The loop counter.
-            k,          // The member key.
-            v,          // The member value.
-            length,
-            mind = gap,
-            partial,
-            value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (value && typeof value === 'object' &&
-                typeof value.toJSON === 'function') {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === 'function') {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case 'string':
-            return quote(value);
-
-        case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return isFinite(value) ? String(value) : 'null';
-
-        case 'boolean':
-        case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-        case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-            if (!value) {
-                return 'null';
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || 'null';
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0 ? '[]' :
-                    gap ? '[\n' + gap +
-                            partial.join(',\n' + gap) + '\n' +
-                                mind + ']' :
-                          '[' + partial.join(',') + ']';
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === 'object') {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    k = rep[i];
-                    if (typeof k === 'string') {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0 ? '{}' :
-                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
-                        mind + '}' : '{' + partial.join(',') + '}';
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== 'function') {
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = '';
-            indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === 'number') {
-                for (i = 0; i < space; i += 1) {
-                    indent += ' ';
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === 'string') {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== 'function' &&
-                    (typeof replacer !== 'object' ||
-                     typeof replacer.length !== 'number')) {
-                throw new Error('JSON.stringify');
-            }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-            return str('', {'': value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== 'function') {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k, v, value = holder[key];
-                if (value && typeof value === 'object') {
-                    for (k in value) {
-                        if (Object.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            cx.lastIndex = 0;
-            if (cx.test(text)) {
-                text = text.replace(cx, function (a) {
-                    return '\\u' +
-                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-            if (/^[\],:{}\s]*$/.
-test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return typeof reviver === 'function' ?
-                    walk({'': j}, '') : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError('JSON.parse');
-        };
-    }
-}());

+ 0 - 604
stmms-web/src/main/webapp/static/mark-leader/js/mark-control.js

@@ -1,604 +0,0 @@
-function MarkControl(option) {
-    this.option = option;
-
-    this.maxPrefetchCount = parseInt(option.prefetchCount);
-    this.maxPrefetchCount = this.maxPrefetchCount != undefined && this.maxPrefetchCount > 1 ? this.maxPrefetchCount : 1;
-
-    this.container = option.container;
-    this.context = {
-        imageServer: option.imageServer,
-        staticServer: option.staticServer,
-        isFinish: false,
-        prefetching: false,
-        prefetchTask: []
-    };
-    //初始化容器结构
-    this.initContainer();
-    //初始化事件监听
-    this.initTriggers(option);
-    //初始化功能模块
-    this.initModules(option);
-    //初始化成功回调方法
-    //console.log('MarkControl init success!');
-    //if (option.success != undefined && typeof(option.success) == 'function') {
-    //    option.success();
-    //}
-}
-
-MarkControl.prototype.initContainer = function() {
-    var height = this.option.height;
-    if (height == undefined) {
-        height = $(window).height();
-    }
-    this.container = getDom(this.main_row_dom, this).appendTo(this.container);
-
-    if (this.option.enableSidear != false) {
-        this.container.sidebar = getDom(this.sidebar_dom, this).appendTo(this.container);
-        this.container.sidebar.css('max-height', height);
-    }
-    this.container.center = getDom(this.center_dom, this).appendTo(this.container);
-    this.container.header = getDom(this.center_header_dom, this).appendTo(this.container.center).find('.header');
-    this.container.centerContent = getDom(this.center_content_dom, this).appendTo(this.container.center);
-    this.container.imageContent = getDom(this.image_content_dom, this).appendTo(this.container.centerContent);
-
-    this.container.height(height);
-    this.container.centerContent.css('height', height - this.container.header.parent().height());
-
-    this.initHeaderAndAssistant();
-}
-
-MarkControl.prototype.initHeaderAndAssistant = function() {
-    var self = this;
-    this.container.header.find('#mark-user-name').html(this.option.userName);
-    if (this.option.logoutTitle != undefined) {
-        this.container.header.find('#logout-title').html(this.option.logoutTitle);
-    }
-    this.container.header.find('#logout-link').click(function() {
-        self.trigger('logout.link.click');
-        return true;
-    })
-
-    this.container.assistant = getDom(this.assistant_dom, this).appendTo(this.container);
-    this.container.assistant.positionSet = false;
-    this.container.assistantButton = this.container.header.find('#assistant-button');
-
-    this.container.assistantButton.click(this, function(event) {
-        if (self.container.assistant.positionSet == false) {
-            self.container.assistant.offset({
-                top: self.container.assistantButton.position().top + self.container.assistantButton.height() + 5,
-                left: self.container.assistantButton.position().left - 85
-            });
-            self.container.assistant.positionSet = true;
-        }
-        self.container.assistant.toggle();
-    });
-
-}
-
-MarkControl.prototype.initMarkFunction = function() {
-    var functionList = this.container.assistant.functionList;
-    if (functionList == undefined) {
-        functionList = getDom(this.mark_function_dom, this).appendTo(this.container.assistant).find('#function-list');
-        this.container.assistant.functionList = functionList;
-    }
-}
-
-//增加某个事件的监听方法
-MarkControl.prototype.on = function(eventName, caller, callback, async) {
-    if (eventName && callback && eventName.length > 0 && typeof(callback) == 'function') {
-        if (async) {
-            this.container.bind(eventName, callback);
-        } else {
-            if (this.triggers[eventName] == undefined) {
-                this.triggers[eventName] = new Array();
-            }
-            this.triggers[eventName].push({
-                caller: caller,
-                callback: callback
-            });
-        }
-    }
-}
-
-//触发某个事件,并传递事件相关内容
-MarkControl.prototype.trigger = function(eventName, eventObject) {
-    var result = true;
-    if (eventName && eventName.length > 0) {
-        var array = this.triggers[eventName];
-        if (array != undefined && array.length > 0) {
-            var event = {
-                name: eventName
-            }
-            for (var i in array) {
-                result = result & array[i].callback.call(array[i].caller, event, this.context, eventObject);
-            }
-        }
-        this.container.trigger(eventName, this.context, eventObject);
-    }
-    return result;
-}
-
-//初始化事件监听
-MarkControl.prototype.initTriggers = function(option) {
-    if (this.triggers == undefined) {
-        this.triggers = {};
-    }
-    if (option != undefined && option.on != undefined) {
-        for (var name in option.on) {
-            this.on(name, option.on[name]);
-        }
-    }
-
-    var self = this;
-    this.on('view.sidebar.open', this, function(event, context, eventObject) {
-        this.container.assistant.hide();
-        if (this.container.center.hasClass('span12')) {
-            this.container.center.removeClass('span12');
-            this.container.center.addClass('span7');
-        } else if (this.container.center.hasClass('span10')) {
-            this.container.center.removeClass('span10');
-            this.container.center.addClass('span5');
-        }
-        this.trigger('center.width.change');
-    });
-    this.on('view.sidebar.close', this, function(event, context, eventObject) {
-        this.container.assistant.hide();
-        if (this.container.center.hasClass('span7')) {
-            this.container.center.removeClass('span7');
-            this.container.center.addClass('span12');
-        } else if (this.container.center.hasClass('span5')) {
-            this.container.center.removeClass('span5');
-            this.container.center.addClass('span10');
-        }
-        this.trigger('center.width.change');
-    });
-    this.on('mark.sidebar.open', this, function(event, context, eventObject) {
-        this.container.assistant.hide();
-        if (this.container.center.hasClass('span12')) {
-            this.container.center.removeClass('span12');
-            this.container.center.addClass('span10');
-        } else if (this.container.center.hasClass('span7')) {
-            this.container.center.removeClass('span7');
-            this.container.center.addClass('span5');
-        }
-        this.trigger('center.width.change');
-    });
-    this.on('mark.sidebar.close', this, function(event, context, eventObject) {
-        this.container.assistant.hide();
-        if (this.container.center.hasClass('span10')) {
-            this.container.center.removeClass('span10');
-            this.container.center.addClass('span12');
-        } else if (this.container.center.hasClass('span5')) {
-            this.container.center.removeClass('span5');
-            this.container.center.addClass('span7');
-        }
-        this.trigger('center.width.change');
-    });
-    this.on('task.get.finish', this, function(event, context, eventObject) {
-        context.prefetchCallback = undefined;
-    });
-    this.on('task.get.none', this, function(event, context, eventObject) {
-        self.getStatus();
-        if (context.task == undefined && self.option.clearUrl != undefined) {
-            $.post(self.option.clearUrl, {}, function() {});
-        }
-        context.prefetchCallback = function() {
-            context.prefetchCallback = undefined;
-            if (self.context.task == undefined && self.context.prefetchTask.length > 0) {
-                self.getTask();
-            }
-        }
-    });
-    this.on('task.prefetch.success', this, function(event, context, eventObject) {
-        if (context.prefetchCallback != undefined) {
-            context.prefetchCallback();
-        }
-        setTimeout(function() {
-            self.prefetch();
-        }, 500);
-    });
-    this.on('task.prefetch.error', this, function(event, context, eventObject) {
-        setTimeout(function() {
-            self.prefetch();
-        }, 500);
-    });
-    this.on('task.prefetch.none', this, function(event, context, eventObject) {
-        if (context.prefetchCallback != undefined) {
-            context.prefetchCallback();
-        }
-        if (context.isFinish != true) {
-            setTimeout(function() {
-                self.prefetch();
-            }, 1000);
-        }
-    });
-    this.on('task.prefetch.finish', this, function(event, context, eventObject) {
-        self.getTask();
-    });
-    this.on('task.submit.before', this, function(event, context, eventObject) {
-        context.submitting = true;
-    });
-    this.on('task.submit.success', this, function(event, context, eventObject) {
-        context.submitting = false;
-        context.task = undefined;
-        self.getTask();
-    });
-    this.on('task.submit.error', this, function(event, context, eventObject) {
-        context.submitting = false;
-    });
-    this.on('task.pass.success', this, function(event, context, eventObject) {
-        if (context.task != undefined && self.option.clearUrl != undefined) {
-            $.post(self.option.clearUrl, {
-                libraryId: context.task.libraryId
-            });
-        }
-        context.task = undefined;
-        self.getTask();
-    });
-
-    $(document).keypress(this, function(event) {
-        if (self.context.listenKeyboard != false) {
-            return self.trigger('key.press', event);
-        }
-    });
-    $(document).keydown(this, function(event) {
-        if (self.context.listenKeyboard != false) {
-            return self.trigger('key.down', event);
-        }
-    });
-    $(document).keyup(this, function(event) {
-        if (self.context.listenKeyboard != false) {
-            return self.trigger('key.up', event);
-        }
-    });
-
-    window.onbeforeunload = function(e) {
-        if (self.option.clearUrl != undefined) {
-            $.post(self.option.clearUrl);
-        }
-    }
-}
-
-//初始化功能模块
-MarkControl.prototype.initModules = function(option) {
-    if (this.modules == undefined) {
-        this.modules = {};
-    }
-    var names = [];
-    var options = [];
-    for (var name in this.defaultModules) {
-        names.push(name);
-        options[name] = this.defaultModules[name];
-    }
-
-    if (option.modules != undefined) {
-        for (var name in option.modules) {
-            if (options[name] == undefined) {
-                names.push(name);
-                options[name] = {};
-            }
-            $.extend(options[name], option.modules[name]);
-        }
-    }
-
-    this.initModule(names, options, this.option.success);
-    //initModule(this, names, 0, options);
-}
-
-//指定初始化某个名称的模块
-MarkControl.prototype.initModule = function(names, options, success) {
-    for (var i in names) {
-        var name = names[i];
-        var option = options[name];
-        var moduleInit = name.replace(/-/g, '_');
-        if (option == undefined || typeof(option) != 'object') {
-            option = {};
-        }
-        option.markControl = this;
-        eval('this.modules[name]=' + moduleInit + '(option, function(){})');
-    }
-    if (success != undefined && typeof(success) == 'function') {
-        success();
-    }
-}
-
-function initModuleAsync(markControl, names, index, option) {
-    if (index < names.length) {
-        var name = names[index];
-        var moduleOption = option[name];
-        var moduleUrl = 'modules/' + name + '.js';
-        var moduleInit = name.replace(/-/g, '_');
-        var modules = markControl.modules;
-        if (modules[name] == undefined) {
-            if (typeof(moduleOption) != 'object') {
-                moduleOption = {};
-            }
-            moduleOption.markControl = markControl;
-            $.getScript(moduleUrl, function() {
-                var success = function() {
-                    initModule(markControl, names, index + 1, option);
-                }
-                eval('modules[name]=' + moduleInit + '(moduleOption, success)');
-            });
-        } else {
-            initModule(markControl, names, index + 1, option);
-        }
-    } else {
-        if (markControl.option.success != undefined && typeof(markControl.option.success) == 'function') {
-            markControl.option.success();
-        }
-    }
-}
-
-MarkControl.prototype.start = function(taskOption) {
-    taskOption.markControl = this;
-    var markControl = this;
-    taskOption.success = function() {
-        markControl.context.prefetchCallback = function() {
-            markControl.context.prefetchCallback = undefined;
-            markControl.getTask();
-        }
-        markControl.context.statusCallback = function() {
-            markControl.context.statusCallback = undefined;
-            markControl.prefetch();
-        }
-        markControl.getStatus();
-    };
-    taskOption.error = function(message) {
-        alert('初始化失败,请刷新页面重新加载');
-    };
-    this.taskControl = new TaskControl(taskOption);
-    this.taskControl.init();
-}
-
-//task预加载
-MarkControl.prototype.prefetch = function() {
-    var taskControl = this.taskControl;
-    var markControl = this;
-    var context = this.context;
-    var imageBuilder = this.modules['image-builder'];
-
-    if (context.isFinish != true) {
-        if (taskControl.isFinish()) {
-            context.isFinish = true;
-        } else if (context.prefetchTask.length >= markControl.maxPrefetchCount) {
-            markControl.trigger('task.prefetch.success');
-        } else if (context.prefetching == false) {
-            context.prefetching = true;
-            markControl.trigger('task.prefetch.before');
-
-            taskControl.fetch(function(task) {
-                if (imageBuilder != undefined) {
-                    imageBuilder.build(task, function(error) {
-                        if (error) {
-                            context.prefetching = false;
-                            markControl.trigger('task.prefetch.error');
-                        } else {
-                            context.prefetchTask.push(task);
-                            context.prefetchStatus = undefined;
-                            context.prefetching = false;
-                            markControl.trigger('task.prefetch.success');
-                        }
-                    });
-                } else {
-                    context.prefetchTask.push(task);
-                    context.prefetchStatus = undefined;
-                    context.prefetching = false;
-                    markControl.trigger('task.prefetch.success');
-                }
-            }, function(task) {
-                context.prefetchStatus = task.message;
-                context.prefetching = false;
-                markControl.trigger('task.prefetch.none');
-            }, function() {
-                context.prefetching = false;
-                markControl.trigger('task.prefetch.none');
-            });
-        }
-    } else {
-        markControl.trigger('task.prefetch.finish');
-    }
-}
-
-MarkControl.prototype.getStatus = function() {
-    if (this.taskControl == undefined) {
-        return;
-    }
-    var self = this;
-    this.taskControl.status(function(status) {
-        self.context.status = status;
-        if (status != undefined) {
-            self.context.isFinish = status.blockTotalCount > 0 && status.blockTotalCount == (status.blockMarkedCount + status.blockExceptionCount);
-        }
-        if (self.context.statusCallback != undefined) {
-            self.context.statusCallback();
-        }
-        self.trigger('mark.status.change', status);
-    })
-}
-
-MarkControl.prototype.getTask = function() {
-    if (this.taskControl == undefined) {
-        return;
-    }
-    var markControl = this;
-    var context = this.context;
-    markControl.trigger('task.get.before');
-
-    if (context.isFinish == true) {
-        markControl.trigger('task.get.finish');
-        return;
-    } else if (context.task != undefined) {
-        markControl.trigger('task.get.success');
-        return;
-    } else if (context.waitTask != undefined) {
-        //优先选择因回评等操作处于等待状态的任务
-        context.task = context.waitTask;
-        context.waitTask = undefined;
-        markControl.trigger('task.get.success');
-    } else if (context.prefetchTask.length > 0) {
-        //判断是否有任务已预加载完毕
-        context.task = context.prefetchTask.shift();
-        markControl.trigger('task.get.success');
-    } else if (context.prefetchStatus != undefined) {
-        //判断是否有在无预加载任务的情况下的消息提示
-        markControl.trigger('task.get.none', context.prefetchStatus);
-    } else {
-        markControl.trigger('task.get.none');
-    }
-}
-
-MarkControl.prototype.getHistory = function(data) {
-    if (this.taskControl == undefined) {
-        return;
-    }
-    this.taskControl.history(data, function(result) {
-        data.result = result;
-        this.option.markControl.trigger('history.get.success', data);
-    }, function(message) {
-        data.message = message;
-        this.option.markControl.trigger('history.get.error', data);
-    });
-}
-
-MarkControl.prototype.setTask = function(task) {
-    var imageBuilder = this.modules['image-builder'];
-    var self = this;
-
-    if (this.context.task != undefined && !this.context.task.previous && this.context.waitTask == undefined) {
-        this.context.waitTask = this.context.task;
-    }
-    this.trigger('task.get.before');
-    if (imageBuilder != undefined && task != undefined) {
-        imageBuilder.build(task, function(error) {
-            self.context.task = task;
-            self.trigger('task.get.success');
-        });
-    } else {
-        self.context.task = task;
-        if (task != undefined) {
-            this.trigger('task.get.success');
-        }
-    }
-}
-
-MarkControl.prototype.submitTask = function(submitUrl) {
-    var task = this.context.task;
-    var markControl = this;
-    var submitUrl = submitUrl != undefined && submitUrl.length > 0 ? submitUrl : this.option.submitUrl;
-
-    if (task != undefined && this.context.submitting != true) {
-        task.markStepList = undefined;
-        task.pictureUrls = undefined;
-        task.sheetUrls = undefined;
-        task.imageData = undefined;
-        task.markFinish = undefined;
-        task.markTime = undefined;
-
-        this.trigger('task.submit.before');
-        if (this.taskControl != undefined) {
-            //已定义任务引擎
-            this.taskControl.submit(task, function(status) {
-                if (status != undefined && status.valid == true) {
-                    markControl.context.status = status;
-                    markControl.trigger('mark.status.change', status);
-                }
-                //markControl.context.task = undefined;
-                markControl.trigger('task.submit.success');
-                //markControl.getTask();
-            }, function(message) {
-                markControl.trigger('task.submit.error', message);
-            });
-        } else if (submitUrl != undefined && submitUrl.length > 0) {
-            //未定义任务引擎,依赖定义/传入的提交地址
-            $.ajax({
-                url: submitUrl,
-                type: 'POST',
-                data: task,
-                success: function(result) {
-                    if (result.success == true) {
-                        //markControl.context.task = undefined;
-                        markControl.trigger('task.submit.success');
-                        //markControl.getTask();
-                    } else {
-                        markControl.trigger('task.submit.error', result.message);
-                    }
-                },
-                error: function(message) {
-                    markControl.trigger('task.submit.error', message);
-                }
-            });
-        } else {
-            markControl.trigger('task.submit.success');
-            //markControl.getTask();
-        }
-    }
-}
-
-//默认要初始化的模块名称
-MarkControl.prototype.defaultModules = {
-    'image-builder': {}
-};
-
-MarkControl.prototype.main_row_dom = '<div class="row-fluid" style="background-image:url({staticServer}/mark-new/images/background.jpg)"></div>';
-
-MarkControl.prototype.sidebar_dom = '<div class="mark-sidebar span2 hide"></div>';
-
-MarkControl.prototype.center_dom = '<div class="center-content span12"></div>';
-
-MarkControl.prototype.center_header_dom = '<div class="row-fluid"><div class="header"><p class="tips">\
-<em>\
-<a href="javascript:void(0)" id="assistant-button" class="btn"><i class="icon-wrench"></i> 小助手</a></em>\
-<a class="useinfo" href="#"><i class="icon-user icon-white"></i><i id="mark-user-name"></i></a>\
-<a class="logout" id="logout-link" href="{logoutUrl}"><i class="icon-off icon-white"></i> <i id="logout-title">退出</i></a>\
-</p></div></div>';
-
-MarkControl.prototype.center_content_dom = '<div class="row-fluid"></div>';
-
-MarkControl.prototype.image_content_dom = '<div class="image-content span12"></div>';
-
-MarkControl.prototype.assistant_dom = '<div class="popover bottom assistant"><div class="arrow"></div></div>';
-
-MarkControl.prototype.mark_function_dom = '<h3 class="popover-title">评卷功能</h3>\
-<div class="popover-content"><p id="function-list" class="popover-list">\
-</p></div>';
-
-//其他通用方法
-String.prototype.startWith = function(prefix) {
-    return this.indexOf(prefix) === 0;
-}
-String.prototype.endWith = function(suffix) {
-    return this.match(suffix + "$") == suffix;
-};
-
-//日期格式化
-Date.prototype.format = function(fmt) { //author: meizz 
-    var o = {
-        "M+": this.getMonth() + 1, //月份 
-        "d+": this.getDate(), //日 
-        "h+": this.getHours(), //小时 
-        "m+": this.getMinutes(), //分 
-        "s+": this.getSeconds(), //秒 
-        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
-        "S": this.getMilliseconds() //毫秒 
-    };
-    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
-    for (var k in o) {
-        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
-    }
-    return fmt;
-}
-
-function getDom(content, markControl) {
-    if (markControl != undefined && markControl.option.staticServer != undefined) {
-        content = content.replace(/{staticServer}/g, markControl.option.staticServer);
-    }
-    if (markControl != undefined && markControl.option.logoutUrl != undefined) {
-        content = content.replace(/{logoutUrl}/g, markControl.option.logoutUrl);
-    }
-    return $(content);
-}
-
-function isArray(obj) {
-    return obj != undefined && Object.prototype.toString.call(obj) === '[object Array]';
-}

+ 0 - 38
stmms-web/src/main/webapp/static/mark-leader/js/modules/answer-view.js

@@ -1,38 +0,0 @@
-//查看答案模块
-var answer_view = function(option, success) {
-    var object = new AnswerView(option);
-    success();
-    return object;
-}
-
-function AnswerView(option) {
-    this.markControl = option.markControl;
-    this.server = option.server;
-    this.init();
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        this.render(this.server + context.task.answerUrl);
-    });
-    this.markControl.on('task.get.none', this, function(event, context, eventObject) {
-        this.render();
-    });
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
-        this.render();
-    });
-}
-
-AnswerView.prototype.init = function() {
-    this.markControl.initMarkFunction();
-    this.toggleButton = getDom(this.toggle_button_dom, this.markControl).appendTo(this.markControl.container.assistant.functionList);
-}
-
-AnswerView.prototype.render = function(url) {
-    if (url != undefined && url.length > 0) {
-        this.toggleButton.attr('href', url);
-        this.toggleButton.show();
-    } else {
-        this.toggleButton.attr('href', '##');
-        this.toggleButton.hide();
-    }
-}
-
-AnswerView.prototype.toggle_button_dom = '<a href="#" target="_blank">标答</a>';

+ 0 - 59
stmms-web/src/main/webapp/static/mark-leader/js/modules/arbitration-process.js

@@ -1,59 +0,0 @@
-//回评模块
-var arbitration_process = function(option, success) {
-    var object = new ArbitrationProcess(option);
-    success();
-    return object;
-}
-
-function ArbitrationProcess(option) {
-    this.markControl = option.markControl;
-    this.container = this.markControl.container.sidebar;
-    this.init();
-
-    this.markControl.on('task.get.none', this, function(event, context, data) {
-        this.container.list.empty();
-        this.markControl.trigger('mark.sidebar.close');
-        this.container.addClass('hide');
-    });
-    this.markControl.on('task.get.success', this, function(event, context, data) {
-        if (context.task.previous != true) {
-            var historyList = context.task.arbitrationList;
-            this.container.list.empty();
-            if (isArray(historyList) && historyList.length > 0) {
-                for (var i in historyList) {
-                    var history = historyList[i];
-                    var row = getDom(this.history_row_dom, this.markControl).appendTo(this.container.list);
-                    row.find('.history-name').html(history.markerName);
-
-                    var date = new Date();
-                    date.setTime(history.markTime);
-                    row.find('.history-time').html(date.format('hh:mm:ss'));
-                    row.find('.history-score').html(history.totalScore);
-                }
-            }
-            this.markControl.trigger('mark.sidebar.open');
-            this.container.removeClass('hide');
-        }
-    });
-    this.markControl.on('mark.history.open', this, function(event, context, data) {
-        this.container.addClass('hide');
-    });
-}
-
-ArbitrationProcess.prototype.init = function() {
-    this.container.empty();
-
-    this.container.header = getDom(this.header_dom, this.markControl).appendTo(this.container);
-    this.container.list = getDom(this.history_list_dom, this.markControl).appendTo(this.container).find('#history-list');
-}
-
-
-ArbitrationProcess.prototype.header_dom = '<div class="header">\
-<p class="fl">给分记录</p></div>';
-
-ArbitrationProcess.prototype.history_list_dom = '<div class="sublist"><table class="table table-hover">\
-<thead><tr><th>评卷员</th><th>时间</th><th>总分</th></tr></thead>\
-<tbody id="history-list"></tbody></table></div>';
-
-ArbitrationProcess.prototype.history_row_dom = '<tr><td class="history-name"></td>\
-<td class="history-time"></td><td class="history-score"></td></tr>';

+ 0 - 47
stmms-web/src/main/webapp/static/mark-leader/js/modules/back-process.js

@@ -1,47 +0,0 @@
-//打回处理模块
-var back_process = function(option, success) {
-    var object = new BackProcess(option);
-    success();
-    return object;
-}
-
-function BackProcess(option) {
-    this.markControl = option.markControl;
-    this.autoSubmit = option.autoSubmit === false ? false : true;
-    this.init();
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
-        this.task = undefined;
-        this.button.hide();
-    });
-    this.markControl.on('task.get.none', this, function(event, context, eventObject) {
-        this.task = undefined;
-        this.button.hide();
-    });
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        this.task = context.task;
-        this.button.show();
-    });
-}
-
-BackProcess.prototype.init = function() {
-    var self = this;
-
-    this.markControl.initMarkFunction();
-    this.button = getDom(this.button_dom, this.markControl).appendTo(this.markControl.container.assistant.functionList);
-    this.button.click(this, function() {
-        self.onBackSelect();
-    });
-}
-
-BackProcess.prototype.onBackSelect = function() {
-    if (this.task != undefined) {
-        this.task.back = true;
-        if (this.autoSubmit == false && confirm('确认要将本试卷打回?')) {
-            this.markControl.submitTask();
-        } else if (this.autoSubmit == true) {
-            this.markControl.submitTask();
-        }
-    }
-}
-
-BackProcess.prototype.button_dom = '<a class="back-process-button" href="#">打回</a>';

+ 0 - 105
stmms-web/src/main/webapp/static/mark-leader/js/modules/change-name.js

@@ -1,105 +0,0 @@
-//评卷状态模块
-var change_name = function(option, success) {
-    var object = new ChangeName(option);
-    success();
-    return object;
-}
-
-function ChangeName(option) {
-    this.markControl = option.markControl;
-    this.url = option.url;
-    this.context = option.markControl.context;
-    this.userName = option.markControl.container.header.find('#mark-user-name');
-    this.popover = getDom(this.popover_dom, this.markControl);
-    this.popover.userNameInput = this.popover.find('input.username-input');
-    this.popover.passwordInput = this.popover.find('input.password-input');
-    this.popover.password2Input = this.popover.find('input.password2-input');
-    this.popover.userNameMessage = this.popover.find('i.username');
-    this.popover.password2Message = this.popover.find('i.password2');
-    this.popover.submitButton = this.popover.find('a.btn');
-    this.popover.cancelButton = this.popover.find('p.image-close');
-    this.popover.appendTo(this.markControl.container);
-
-    var self = this;
-
-    this.markControl.container.header.find('a.useinfo').click(function() {
-        self.toggle(true);
-    });
-    this.popover.cancelButton.click(function() {
-        self.toggle(false);
-    });
-    this.popover.submitButton.click(function() {
-              var logout = false;
-              var nameText = self.popover.userNameInput.val();
-                  nameText = nameText.replace(/(^\s*)|(\s*$)/g, "");
-              var pwText = self.popover.passwordInput.val();
-                  pwText = pwText.replace(/(^\s*)|(\s*$)/g, "");
-              var pw2Text = self.popover.password2Input.val();
-                  pw2Text = pw2Text.replace(/(^\s*)|(\s*$)/g, "");
-              if (nameText.length == 0) {
-                  self.popover.userNameMessage.html('姓名不能为空');
-                  return false;
-              } else if (nameText.length > 8) {
-                  self.popover.userNameMessage.html('长度不能超过8个字');
-                  return false;
-              }
-              if(pwText.length > 0 || pw2Text.length > 0) {
-                  logout = true;
-                  if (!pw2Text) {
-                    self.popover.password2Message.html('请再次输入您的密码');
-                    return false;
-                  }
-                  if (pwText != pw2Text) {
-                    self.popover.password2Message.html('两次密码请保持一致');
-                    return false;
-                  }
-                  if(pw2Text.length < 4){
-                    self.popover.password2Message.html('密码的长度至少4位');
-                    return false;
-                  }
-              }
-                $.post(self.url, {
-                    name: nameText,
-                    password:pwText
-                }, function(result) {
-                    if (result.success == true) {
-                        self.userName.html(result.name);
-                        self.toggle(false);
-                        if(logout){//修改密码后请重新登陆
-                          window.location.href = '/mark/logout';
-                        }
-                    } else {
-                        self.popover.userNameMessage.html('修改失败,请稍后重试');
-                    }
-                }).error(function() {
-                    self.popover.userNameMessage.html('网络通信错误,请稍后重试');
-                });
-    });
-}
-
-ChangeName.prototype.toggle = function(enable) {
-    if (enable == true) {
-        this.enable = true;
-        this.popover.userNameInput.val(this.userName.html());
-        this.popover.passwordInput.val('');
-        this.popover.userNameMessage.html('');
-        this.popover.password2Message.html('');
-        this.popover.show();
-        this.context.listenKeyboard = false;
-    } else {
-        this.enable = false;
-        this.popover.hide();
-        this.context.listenKeyboard = true;
-    }
-}
-
-ChangeName.prototype.popover_dom = '<div class="message-popover" style="display:none"><div class="popover-header">\
-<p class="title">修改个人信息</p><p class="image-close"><img src="{staticServer}/mark-new/images/images-close.png" /></p></div>\
-<div class="popover-cont"><span style="color: red;">*</span><input type="text" class="username-input" placeholder="请输入您的姓名" />\
-<i class="wrong username"></i></div>\
-<div class="popover-cont"><input type="password" class="password-input" placeholder="请输入新的密码" />\
- <i class="wrong password"></i></div>\
- <div class="popover-cont"><input type="password" class="password2-input" placeholder="请再次输入您的密码" /> \
- <i class="wrong password2"></i></div>\
-<a href="#" class="btn btn-small btn-info text-userInfo">确定</a>\
-</div>';

+ 0 - 50
stmms-web/src/main/webapp/static/mark-leader/js/modules/flash-image-view.js

@@ -1,50 +0,0 @@
-var flashImageView;
-
-var flash_image_view = function(option, success) {
-    flashImageView = new FlashImageView(option);
-    flashImageView.createSuccess = success;
-    return flashImageView;
-}
-
-function FlashImageView(option) {
-    this.markControl = option.markControl;
-    this.init();
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
-        this.task = undefined;
-    });
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        this.task = context.task;
-        this.imageCount = this.task.pictureUrls.length;
-        this.imageServer = context.imageServer;
-        //refreshPictureConfig(this.task.pictureConfig, this.task.pictureUrls, this.imageServer);
-        getSwfObject('ImageViewer').setJson(this.task.pictureConfig);
-    });
-}
-
-FlashImageView.prototype.init = function() {
-    this.container = getDom(this.container_dom, this.markControl).appendTo(this.markControl.container.center);
-    var path = this.markControl.context.staticServer + '/plugin/';
-    var container = this.container;
-    $.getScript(path + 'swfobject.js', function() {
-        $.getScript(path + 'swfplugin.js', function() {
-            initImageViewPluginDefault(path, "viewer", container.width(), container.height());
-        });
-    });
-}
-
-function refreshPictureConfig(config, urls, imageServer) {
-    if (urls != undefined && urls.length > 0 && config != undefined && config != '') {
-        for (var i = 0; i < urls.length; i++) {
-            eval('config=config.replace(/\\{' + i + '\\}/, "' + (imageServer + urls[i]) + '")');
-        }
-        getSwfObject('ImageViewer').setJson(config);
-    }
-}
-
-function creationComplete() {
-    flashImageView.createSuccess();
-}
-
-function loadComplete() {}
-
-FlashImageView.prototype.container_dom = '<div id="viewer"></div>';

+ 0 - 81
stmms-web/src/main/webapp/static/mark-leader/js/modules/header-mark-status.js

@@ -1,81 +0,0 @@
-//评卷状态模块
-var header_mark_status = function(option, success) {
-    var object = new HeaderMarkStatus(option);
-    success();
-    return object;
-}
-
-function HeaderMarkStatus(option) {
-    this.markControl = option.markControl;
-    this.title = option.title;
-    this.init();
-    this.markControl.on('task.get.before', this, function(event, context, statusInfo) {
-        //this.topStatus.find('#type-name').html('正在领取任务');
-        this.secretArea.hide();
-        this.blockTitle.hide();
-    });
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        var task = context.task;
-        //状态栏区域
-        this.blockTitle.show();
-        this.blockTitle.html(task.blockTitle);
-
-        var typeName = task.libraryType < this.typeName.length ? this.typeName[task.libraryType] : '';
-        //this.topStatus.find('#type-name').html(typeName);
-
-        this.secretArea.show();
-        this.topStatus.find('#secret-number').html(task.studentId);
-    });
-    this.markControl.on('task.get.none', this, function(event, context, status) {
-        this.secretArea.hide();
-        this.blockTitle.hide();
-        this.topStatus.find('#block-title').html();
-        //this.topStatus.find('#type-name').html('');
-        this.topStatus.find('#secret-number').html('');
-    });
-    this.markControl.on('mark.status.change', this, function(event, context, status) {
-        this.render(status);
-    });
-}
-
-HeaderMarkStatus.prototype.init = function() {
-    this.progress = getDom(this.progress_dom, this.markControl).prependTo(this.markControl.container.header);
-    this.topStatus = getDom(this.top_status_dom, this.markControl).prependTo(this.markControl.container.header);
-    this.secretArea = this.topStatus.find('#secret-area');
-    this.secretArea.hide();
-    this.progress.hide();
-
-    this.blockTitle = this.topStatus.find('#block-title');
-    this.topStatus.find('#status-title').html(this.title);
-}
-
-HeaderMarkStatus.prototype.render = function(status) {
-    if (status != undefined && status.valid === true) {
-        this.progress.show();
-        //进度信息区域
-        var totalCount = status.blockTotalCount;
-        var markedCount = status.blockMarkedCount;
-        var leftCount = totalCount > markedCount ? (totalCount - markedCount) : 0;
-        var markedPercent = totalCount > 0 ? new Number((totalCount - leftCount) * 100 / totalCount).toFixed(0) : 0;
-        if (markedPercent == '100' && leftCount > 0) {
-            markedPercent = '99';
-        } else if (markedPercent == '0' && markedCount > 0) {
-            markedPercent = '1';
-        }
-        this.progress.find('#total-count').html(totalCount);
-        this.progress.find('#marked-count').html(markedCount);
-        //this.progress.find('#todo-count').html(leftCount);
-        //this.progress.find('#marked-percent').html(markedPercent.toString() + '%');
-    }
-}
-
-HeaderMarkStatus.prototype.typeName = ['样卷', '试评', '正评'];
-
-HeaderMarkStatus.prototype.top_status_dom = '<p class="text">\
-<i id="status-title"></i>\
-<i id="type-name"></i>\
-<i id="block-title"></i>\
-<i id="secret-area">考生编号<em id="secret-number"></em></i>\
-</p>';
-
-HeaderMarkStatus.prototype.progress_dom = '<p class="text"></p>';

+ 0 - 80
stmms-web/src/main/webapp/static/mark-leader/js/modules/heart-beat.js

@@ -1,80 +0,0 @@
-//评卷状态模块
-var heart_beat = function(option, success) {
-    var object = new HeartBeat(option);
-    success();
-    return object;
-}
-
-function HeartBeat(option) {
-    this.markControl = option.markControl;
-    this.url = option.url;
-    this.interval = parseInt(option.interval) != undefined ? parseInt(option.interval) : 20;
-
-    this.popover = getDom(this.popover_dom, this.markControl);
-    this.popover.content = this.popover.find('.popover-cont');
-    this.popover.confirmButton = this.popover.find('#message-confirm-button');
-    this.popover.nextButton = this.popover.find('#message-next-button');
-
-    this.popover.hide();
-    this.popover.appendTo(this.markControl.container);
-
-    var self = this;
-    this.popover.confirmButton.click(function() {
-        self.popover.hide();
-    });
-    this.popover.nextButton.click(function() {
-        self.index++;
-        self.showMessage();
-    });
-
-    if (this.url != undefined && this.url != '') {
-        this.beat();
-    }
-}
-
-HeartBeat.prototype.beat = function() {
-    var self = this;
-    $.ajax({
-        method: 'POST',
-        url: this.url,
-        timeout: 10000,
-        success: function(message) {
-            if (message != undefined && message.length > 0) {
-                self.initMessage(message);
-            }
-        },
-        complete: function() {
-            setTimeout(function() {
-                self.beat();
-            }, self.interval * 1000);
-        }
-    });
-}
-
-HeartBeat.prototype.initMessage = function(message) {
-    this.message = message;
-    this.index = 0;
-    this.showMessage();
-}
-
-HeartBeat.prototype.showMessage = function() {
-    if (this.index < this.message.length) {
-        this.popover.content.html(this.message[this.index]);
-        if (this.index == (this.message.length - 1)) {
-            this.popover.confirmButton.show();
-            this.popover.nextButton.hide();
-        } else {
-            this.popover.confirmButton.hide();
-            this.popover.nextButton.show();
-        }
-        this.popover.show();
-    } else {
-        this.popover.hide();
-    }
-}
-
-HeartBeat.prototype.popover_dom = '<div class="message-popover"><div class="popover-header">\
-<p class="title">通知</p></div><div class="popover-cont"></div>\
-<a href="#" class="btn btn-large btn-info text-c" id="message-next-button" style="display:none">下一条</a>\
-<a href="#" class="btn btn-large btn-info text-c" id="message-confirm-button" style="display:none">确 定</a>\
-</div>';

+ 0 - 38
stmms-web/src/main/webapp/static/mark-leader/js/modules/idle-process.js

@@ -1,38 +0,0 @@
-//评卷状态模块
-var idle_process = function(option, success) {
-    var object = new IdleProcess(option);
-    success();
-    return object;
-}
-
-function IdleProcess(option) {
-    this.markControl = option.markControl;
-    this.logoutUrl = option.logoutUrl;
-    this.timeoutMinute = parseInt(option.timeout) != undefined ? parseInt(option.timeout) : 3;
-    this.intervalSecond = 15;
-
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        this.libraryId = context.task.libraryId;
-        this.start = new Date().getTime();
-    });
-
-    this.process();
-}
-
-IdleProcess.prototype.process = function() {
-    var self = this;
-    if (this.lastLibraryId == undefined) {
-        this.lastLibraryId = this.libraryId;
-    }
-    var now = new Date().getTime();
-    if (this.lastLibraryId != undefined && this.libraryId != undefined && this.start != undefined) {
-        if (this.lastLibraryId == this.libraryId) {
-            if ((now - this.start) > (this.timeoutMinute * 60 * 1000)) {
-                window.location.href = this.logoutUrl;
-            }
-        }
-    }
-    setTimeout(function() {
-        self.process();
-    }, self.intervalSecond * 1000);
-}

+ 0 - 87
stmms-web/src/main/webapp/static/mark-leader/js/modules/image-builder.js

@@ -1,87 +0,0 @@
-//简单多张图片排列显示模块
-var image_builder = function(option, success) {
-    var object = new ImageBuilder(option);
-    success();
-    return object;
-}
-
-function ImageBuilder(option) {
-    this.markControl = option.markControl;
-    this.init();
-}
-
-ImageBuilder.prototype.init = function() {
-    this.container = getDom(this.canvas_dom, this.markControl).appendTo(this.markControl.container);
-    this.container.hide();
-    this.canvas = document.getElementById('image-builder-canvas');
-    this.ctx = this.canvas.getContext("2d");
-}
-
-ImageBuilder.prototype.build = function(task, callback) {
-    var self = this;
-    //调用图片预加载函数,实现回调函数
-    var imageObjects = [];
-    this.loadImages(imageObjects, task.pictureUrls, 0, function(images) {
-        var maxWidth = 0;
-        var totalHeight = 0;
-        for (var i = 0; i < images.length; i++) {
-            //计算最大宽度与合计高度
-            var image = images[i];
-            maxWidth = Math.max(maxWidth, image.width);
-            totalHeight += image.height;
-        }
-        if (maxWidth > 0 && totalHeight > 0) {
-            //设置画布大小及背景颜色
-            self.canvas.width = maxWidth;
-            self.canvas.height = totalHeight;
-            self.ctx.fillStyle = "#FFFFFF";
-            self.ctx.fillRect(0, 0, maxWidth, totalHeight);
-            //绘画到画布
-            var height = 0;
-            for (var i = 0; i < images.length; i++) {
-                var image = images[i];
-                self.ctx.drawImage(image, 0, 0, image.width, image.height, 0, height, image.width, image.height);
-                height += image.height;
-            }
-            //生成合并后的图像数据
-            task.imageData = this.canvas.toDataURL("image/jpeg");
-            self.ctx.clearRect(0, 0, self.canvas.width, self.canvas.height);
-        }
-        callback();
-    }, function(error) {
-        if (error) {
-            console.log(error);
-        }
-        callback('image load error');
-    });
-}
-
-/*
-实现一系列图片的预加载
-参数urls:图片实际URL数组
-参数number:array数组遍历下标
-参数callback:回调函数——图片预加载完成后立即执行此函数
-*/
-ImageBuilder.prototype.loadImages = function(images, urls, number, callback, exception) {
-    var self = this;
-    var imageServer = this.markControl.context.imageServer;
-    var defaultServer = this.markControl.option.imageServer;
-    if (urls != undefined && number < urls.length) {
-        var img = new Image();
-        img.onload = function() {
-            images.push(img);
-            self.loadImages(images, urls, number + 1, callback, exception);
-        }
-        img.onerror = function() {
-            img.onerror = undefined;
-            //self.loadImages(images, urls, number + 1, callback);
-            exception('load error for: ' + img.src);
-        }
-        img.crossOrigin = '';
-        img.src = imageServer + urls[number] + '?' + new Date().getTime();
-    } else {
-        callback.call(this, images);
-    }
-}
-
-ImageBuilder.prototype.canvas_dom = '<div><canvas id="image-builder-canvas"></canvas></div>';

+ 0 - 37
stmms-web/src/main/webapp/static/mark-leader/js/modules/image-server-selector.js

@@ -1,37 +0,0 @@
-//评卷状态模块
-var image_server_selector = function(option, success) {
-    var object = new ImageServerSelector(option);
-    success();
-    return object;
-}
-
-function ImageServerSelector(option) {
-    this.markControl = option.markControl;
-    this.servers = option.servers;
-    this.flag = option.flag != undefined && option.flag.length > 0 ? option.flag : '/ok.jpg';
-
-    this.connect(0);
-}
-
-ImageServerSelector.prototype.connect = function(index) {
-    if (isArray(this.servers) && this.servers.length > index) {
-        var self = this;
-        var url = this.servers[index].trim();
-        if (url.length > 0) {
-            $.ajax({
-                url: url + this.flag,
-                type: 'GET',
-                cache: false,
-                //timeout: 1000,
-                error: function() {
-                    self.connect(index + 1);
-                },
-                success: function() {
-                    self.markControl.context.imageServer = url;
-                }
-            });
-        } else {
-            self.connect(index + 1);
-        }
-    }
-}

+ 0 - 690
stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-board.js

@@ -1,690 +0,0 @@
-//给分板模块
-var mark_board = function(option, success) {
-    var object = new MarkBoard(option);
-    success();
-    return object;
-}
-
-function MarkBoard(option) {
-    this.markControl = option.markControl;
-    this.needConfirm = option.needConfirm === true ? true : false;
-    this.autoSubmit = option.autoSubmit === false ? false : true;
-    this.showScoreBoard = option.showScoreBoard === false ? false : true;
-    this.enableSkip = option.enableSkip === true ? true : false;
-
-    this.init();
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
-        this.task = undefined;
-        this.stepList = undefined;
-        this.currentStep = undefined;
-        this.stepCount = undefined;
-        this.render();
-    });
-    this.markControl.on('task.load.finish', this, function(event, context, eventObject) {
-        this.initByTask(context.task);
-    });
-    this.markControl.on('mark.step.change', this, this.onStepSelect);
-    this.markControl.on('key.press', this, function(e, context, event) {
-        var code = event.keyCode;
-        //console.log('key press:' + code);
-        if (this.currentStep != undefined && this.task != undefined) {
-            if (code >= 48 && code <= 57) {
-                this.onNumberInput(code - 48);
-                event.preventDefault();
-                return false;
-            } else if (code >= 96 && code <= 105 && event.numLock) {
-                this.onNumberInput(code - 96);
-                event.preventDefault();
-                return false;
-            } else if (code == 46 || code == 110 || code == 190) {
-                //小数点
-                this.onDecimalInput();
-                event.preventDefault();
-                return false;
-            } else if (code == 45) {
-                //-按键,切换到上一个步骤
-                if (this.currentStep.number > 1) {
-                    this.resetCurrentStep();
-                    this.markControl.trigger('mark.step.change', this.currentStep.number - 1);
-                    event.preventDefault();
-                    return false;
-                }
-            } else if (code == 61 || code == 43) {
-                //+按键,切换到下一个步骤
-                if (this.currentStep.number < this.stepCount && this.currentStep.markScore != undefined) {
-                    this.resetCurrentStep();
-                    this.markControl.trigger('mark.step.change', this.currentStep.number + 1);
-                    event.preventDefault();
-                    return false;
-                }
-            } else if (code == 13 || code == 108) {
-                //回车键
-                if (this.currentStep.markFinish === true && this.task.markFinish === true) {
-                    this.onTaskSubmit();
-                    event.preventDefault();
-                    return false;
-                } else {
-                    this.onNumberSubmit();
-                    event.preventDefault();
-                    return false;
-                }
-            }
-        }
-    });
-    this.markControl.on('key.down', this, function(e, context, event) {
-        var code = event.keyCode;
-        //console.log('key down:' + code);
-        if (this.currentStep != undefined && this.task != undefined) {
-            if (code == 8 || code == 46) {
-                //删除键&回退键
-                this.onNumberDelete();
-                event.preventDefault();
-                return false;
-            } else if (code == 32) {
-                //屏蔽空格键按下效果
-                return false;
-            } else if (code == 80 && this.enableSkip) {
-                //P键,跳过当前任务
-                this.markControl.trigger('task.pass.success');
-            }
-        }
-    });
-    this.markControl.on('key.up', this, function(e, context, event) {
-        var code = event.keyCode;
-        //console.log('key down:' + code);
-        if (this.currentStep != undefined && this.task != undefined) {
-            if (code == 32) {
-                //空格键提交步骤分
-                this.onNumberSubmit();
-                event.preventDefault();
-                return false;
-            }
-        }
-    });
-
-}
-
-MarkBoard.prototype.init = function() {
-    this.stepBoard = getDom(this.step_board_dom, this.markControl).appendTo(this.markControl.container.centerContent);
-    this.stepBoard.height(this.markControl.container.centerContent.height());
-    this.stepBoard.selectiveHeader = this.stepBoard.find('#step-board-selective-header');
-    this.stepBoard.stepHolder = this.stepBoard.find('.step-list');
-    this.stepBoard.stepHolder.height(this.markControl.container.centerContent.height() - 90);
-    this.stepBoard.stepHolder.perfectScrollbar({
-        wheelSpeed: 20,
-        useKeyboard: false,
-        minScrollbarLength: 30,
-        suppressScrollX: true
-    });
-
-    this.scoreBoard = getDom(this.scoreBoard_dom, this.markControl).appendTo(this.markControl.container);
-    this.scoreBoard.header = getDom(this.scoreBoard_header_dom, this.markControl).appendTo(this.scoreBoard).find('#score-board-header');
-    this.scoreBoard.stepHolder = getDom(this.scoreBoard_stepHolder_dom, this.markControl).appendTo(this.scoreBoard);
-    this.scoreBoard.footer = getDom(this.scoreBoard_footer_dom, this.markControl).appendTo(this.scoreBoard).find('#score-board-total-score');
-
-    this.scoreBoard.stepHolder.css('max-height', $(window).height() * 0.75);
-    this.scoreBoard.stepHolder.css('overflow', 'scroll');
-
-    this.scoreBoard.draggable({
-        containment: "window"
-    });
-
-    this.scoreBoard.find('#task-submit-button').click(this, function(event) {
-        var markBoard = event.data;
-        if (markBoard.task != undefined && markBoard.currentStep.markFinish === true) {
-            markBoard.onTaskSubmit();
-        }
-    });
-    this.scoreBoard.find('#resetBtn').click(this, function(event) {
-        var markBoard = event.data;
-        var selectedBlockId = $(".block-id-list  option:selected").val();
-        if (markBoard.task != undefined) {
-            if (markBoard.task.blockId == selectedBlockId) {
-                alert("不能重新分发到同一题!");
-                return false;
-            } else if (selectedBlockId == 0) {
-                alert("必须选择一题分发!");
-                return false;
-            } else {
-                markBoard.task.reset = true;
-                markBoard.task.blockId = selectedBlockId;
-                markBoard.onTaskSubmit();
-            }
-        }
-    });
-    $('#resetBtn').click(this, function(event) {
-        var markBoard = event.data;
-        var selectedBlockId = $(".block-id-list  option:selected").val();
-        if (markBoard.task != undefined) {
-            if (markBoard.task.blockId == selectedBlockId) {
-                alert("不能重新分发到同一题!");
-                return false;
-            } else if (selectedBlockId == 0) {
-                alert("必须选择一题分发!");
-                return false;
-            } else {
-                markBoard.task.reset = true;
-                markBoard.task.blockId = selectedBlockId;
-                markBoard.onTaskSubmit();
-            }
-        }
-    });
-    if (this.enableSkip) {
-        this.scoreBoard.find('#task-pass-button').show();
-        this.scoreBoard.find('#task-pass-button').click(this, function(event) {
-            var markBoard = event.data;
-            markBoard.markControl.trigger('task.pass.success');
-        });
-    }
-    this.scoreBoard.find('#score-board-close-button').click(this, function(event) {
-        event.data.toggleScoreBoard(false);
-    });
-    this.stepBoard.find('#show-score-board-button').click(this, function(event) {
-        event.data.toggleScoreBoard(true);
-    });
-    this.scoreBoard.find('.all-zero-button').click(this, function(event) {
-        event.data.allZeroSubmit();
-    });
-    this.stepBoard.find('.all-zero-button').click(this, function(event) {
-        event.data.allZeroSubmit();
-    });
-
-    this.popover = getDom(this.popover_dom, this.markControl).appendTo(this.markControl.container);
-    this.popover.css('text-align', 'center');
-
-    this.popover.title = this.popover.find('.popover-title');
-    this.popover.title.css('font-size', '20px');
-    this.popover.title.css('line-height', '25px');
-    //this.popover.width('100');
-    //this.popover.title.width('100');
-}
-
-MarkBoard.prototype.initByTask = function(task) {
-    this.task = task;
-    this.stepList = task.markStepList;
-    this.currentStep = undefined;
-    this.stepCount = this.stepList != undefined ? this.stepList.length : 0;
-
-    task.totalScore = parseFloat(task.totalScore);
-    var markFinish = true;
-    var scoreList = task.scoreList != undefined && task.scoreList != '' ? task.scoreList.split(',') : [];
-    for (var j in task.markStepList) {
-        var step = task.markStepList[j];
-        if (scoreList != undefined && scoreList.length > j) {
-            step.markScore = parseFloat(scoreList[j]);
-            step.score = new String(step.markScore);
-            step.markFinish = true;
-        } else {
-            markFinish = false;
-        }
-    }
-    task.markFinish = task.totalScore != undefined && markFinish == true;
-
-    this.render(task);
-    if (this.stepCount > 0) {
-        this.markControl.trigger('mark.step.change', 1);
-    } else if (task.markFinish == true) {
-        this.currentStep = {
-            markFinish: true
-        };
-    }
-}
-
-MarkBoard.prototype.onDecimalInput = function() {
-    var score = this.currentStep.score;
-    if (this.currentStep.interval < 1 && !score.endWith('.')) {
-        score = score + '.';
-    }
-    this.currentStep.score = score;
-    this.currentStep.markFinish = false;
-    this.onScoreChange();
-}
-
-MarkBoard.prototype.onNumberInput = function(number) {
-    this.currentStep.score = this.currentStep.score + '' + number;
-    this.currentStep.markFinish = false;
-    this.onScoreChange();
-}
-
-MarkBoard.prototype.onNumberDelete = function(number) {
-    var score = this.currentStep.score;
-    if (score.length > 1) {
-        score = score.substring(0, score.length - 1);
-    } else {
-        score = '';
-    }
-    this.currentStep.score = score;
-    this.currentStep.markFinish = false;
-    this.onScoreChange();
-}
-
-MarkBoard.prototype.onNumberSubmit = function() {
-    var score = this.currentStep.score;
-    var interval = this.currentStep.interval;
-    if (score.length > 0) {
-        if (interval < 1 && score.startWith('.')) {
-            score = '0'.concat(score);
-        } else if (interval < 1 && score.endWith('.')) {
-            score = score.concat(interval.toString().substring(2));
-        }
-    }
-    if (this.validateScore(this.currentStep, score)) {
-        this.onScoreSubmit(true);
-    } else if (this.showScoreBoard == true) {
-        //分值表模式下,自动清除已输入的无效内容,免去删除操作
-        this.resetCurrentStep();
-        this.onScoreChange();
-    }
-}
-
-//切换步骤时,重置当前步骤的状态
-//若当前分数未提交,则还原之前已给的分数;若之前还未给分,则清空分数显示
-MarkBoard.prototype.resetCurrentStep = function() {
-    var step = this.currentStep;
-    if (step != undefined) {
-        if (step.markScore != undefined) {
-            step.markFinish = true;
-            step.score = new String(step.markScore);
-        } else {
-            step.markFinish = false;
-            step.score = '';
-        }
-        this.markControl.trigger('mark.score.change');
-    }
-}
-
-MarkBoard.prototype.onStepSelect = function(event, context, stepNumber) {
-    if (stepNumber <= this.stepCount && stepNumber > 0) {
-        //还是点击当前步骤,不触发任何动作
-        if (this.currentStep != undefined && this.currentStep.number == stepNumber) {
-            return;
-        }
-        //修改原step状态
-        if (this.currentStep != undefined) {
-            var dom = this.stepBoard.stepArray[this.currentStep.number - 1];
-            dom.removeClass('current');
-            if (this.currentStep.markScore != undefined) {
-                dom.addClass('done');
-                dom.find('.current-score').html(this.currentStep.markScore);
-            } else {
-                dom.addClass('todo');
-                dom.find('.current-score').html('');
-            }
-        }
-        this.togglePopover(false);
-
-        this.currentStep = this.stepList[stepNumber - 1];
-        if (this.currentStep.score == undefined) {
-            this.currentStep.score = '';
-        }
-        dom = this.stepBoard.stepArray[stepNumber - 1];
-        dom.removeClass('done');
-        dom.removeClass('todo');
-        dom.addClass('current');
-        //step列表自动滚动
-        //alert(this.stepBoard.stepHolder.height() - dom.height());
-        var scrollTop = this.stepBoard.stepHolder.scrollTop();
-        var maxHeight = this.stepBoard.stepHolder.height();
-        var domTop = dom.position().top;
-        var domHeight = dom.height();
-        if (domTop < 0 && scrollTop > 0) {
-            scrollTop = Math.max(scrollTop - domHeight, 0);
-        } else if ((domTop + domHeight) > maxHeight) {
-            scrollTop += (domTop + domHeight - maxHeight + 5);
-        }
-        this.stepBoard.stepHolder.scrollTop(scrollTop);
-    }
-}
-
-MarkBoard.prototype.onScoreChange = function() {
-    if (this.currentStep != undefined) {
-        var dom = this.stepBoard.stepArray[this.currentStep.number - 1];
-        dom.find('.current-score').html(this.currentStep.score);
-
-        this.togglePopover(false);
-    }
-}
-
-MarkBoard.prototype.onScoreSubmit = function(autoNext) {
-    if (this.currentStep != undefined) {
-        this.currentStep.markScore = parseFloat(this.currentStep.score);
-        this.currentStep.markFinish = true;
-        this.onScoreChange();
-        this.updateTotalScore();
-
-        this.stepBoard.find('#total-score').html(this.task.totalScore);
-        this.scoreBoard.footer.html(this.task.totalScore);
-        var currentScore = this.currentStep.score;
-        this.scoreBoard.stepArray[this.currentStep.number - 1].find('.score-select').each(function(index, obj) {
-            if ($(obj).attr('data-score') == currentScore) {
-                $(obj).addClass('active');
-            } else {
-                $(obj).removeClass('active');
-            }
-        });
-        this.markControl.trigger('mark.score.change');
-        if (autoNext === true && this.currentStep.number < this.stepCount) {
-            this.markControl.trigger('mark.step.change', this.currentStep.number + 1);
-        } else if (this.task.markFinish === true && this.showScoreBoard == false && this.autoSubmit === true) {
-            this.onTaskSubmit();
-        }
-    }
-}
-
-MarkBoard.prototype.updateTotalScore = function() {
-    if (this.task != undefined) {
-        var totalScore = 0;
-        var finish = true;
-        for (var i in this.stepList) {
-            if (this.stepList[i].markScore != undefined) {
-                totalScore = totalScore + this.stepList[i].markScore;
-            } else {
-                finish = false;
-            }
-        }
-        this.task.totalScore = totalScore;
-        this.task.markFinish = finish;
-    }
-}
-
-MarkBoard.prototype.allZeroSubmit = function() {
-    if (this.task != undefined && this.stepList != undefined && this.stepList.length > 0) {
-        for (var i in this.stepList) {
-            this.stepList[i].markScore = 0;
-        }
-        this.onTaskSubmit();
-    }
-}
-
-MarkBoard.prototype.onTaskSubmit = function() {
-    var totalScore = 0;
-    var scoreList = [];
-    var finish = true;
-    for (var i in this.stepList) {
-        var score = this.stepList[i].markScore;
-        if (score != undefined) {
-            totalScore = totalScore + score;
-            scoreList.push(score);
-        } else {
-            finish = false;
-        }
-    }
-    if (this.task.reset) {
-        finish = true;
-    }
-    if (!finish) {
-        alert('当前任务还有未给分的步骤,请继续给分');
-    } else if (!this.needConfirm || confirm('总分为' + totalScore + ', 确认要提交吗?')) {
-        this.task.totalScore = totalScore;
-        this.task.scoreList = scoreList.join(',');
-        this.markControl.submitTask();
-    }
-}
-
-MarkBoard.prototype.validateScore = function(step, scoreString) {
-    var stepDom = this.stepBoard.stepArray[this.currentStep.number - 1].find('.current-score');
-    if (!$.isNumeric(scoreString)) {
-        this.togglePopover(true, '不是合法数字', stepDom);
-        //alert('当前分数不是合法数字');
-        return false;
-    }
-    var score = new Number(scoreString);
-    if (score < step.min) {
-        this.togglePopover(true, '不能小于' + step.min, stepDom);
-        //alert('当前分数不应小于' + step.min);
-        return false;
-    }
-    if (score > step.max) {
-        this.togglePopover(true, '不能大于' + step.max, stepDom);
-        //alert('当前分数不应大于' + step.max);
-        return false;
-    }
-    var find = false;
-    if (step.scoreList.length > 0) {
-        for (var i in step.scoreList) {
-            if (score == step.scoreList[i]) {
-                find = true;
-            }
-        }
-    }
-    if (!find) {
-        this.togglePopover(true, '不符合分值间隔要求', stepDom);
-        //alert('当前分数不符合分值间隔要求');
-        return false;
-    }
-    step.score = scoreString;
-    return true;
-}
-
-MarkBoard.prototype.render = function(task) {
-    if (task != undefined) {
-        var self = this;
-        var title = task.blockTitle;
-        this.initMarkBoardHeader();
-
-        this.stepBoard.stepHolder.empty();
-        this.stepBoard.stepArray = [];
-        if (task.markFinish === true) {
-            this.stepBoard.find('#total-score').html(task.totalScore);
-            this.scoreBoard.footer.html(task.totalScore);
-        } else {
-            this.stepBoard.find('#total-score').html('');
-            this.scoreBoard.footer.html('');
-        }
-
-        this.scoreBoard.stepHolder.empty();
-        this.scoreBoard.stepArray = [];
-        for (var i in task.markStepList) {
-            var step = task.markStepList[i];
-            //初始化步骤列表
-            var dom = getDom(this.step_dom, this.markControl);
-            dom.attr('data-number', step.number);
-            dom.find('.step-title').html(step.title);
-            dom.find('.interval-score').html('间隔' + step.interval + '分');
-            dom.find('.max-score').html(step.max);
-            dom.find('.min-score').html(step.min);
-            if (step.markFinish === true) {
-                dom.addClass('done');
-                dom.find('.current-score').html(step.score);
-            } else {
-                dom.addClass('todo');
-            }
-            dom.click(function() {
-                self.onStepSelect(undefined, undefined, $(this).attr('data-number'));
-            })
-            this.stepBoard.stepArray.push(dom.appendTo(this.stepBoard.stepHolder));
-            //初始化分值表
-            var dom2 = getDom(this.scoreBoard_step_dom, this.markControl);
-            dom2.attr('data-number', step.number);
-            dom2.find('.number').html(step.title);
-            var scoreHolder = dom2.find('.fraction');
-            for (var j in step.scoreList) {
-                var dom3 = getDom(this.scoreBoard_score_dom, this.markControl);
-                var score = step.scoreList[j];
-                dom3.attr('data-step-number', step.number);
-                dom3.attr('data-score', score);
-                dom3.html(score);
-                dom3.appendTo(scoreHolder);
-
-                if (step.markFinish === true && step.markScore == score) {
-                    dom3.addClass('active');
-                }
-            }
-            this.scoreBoard.stepArray.push(dom2.appendTo(this.scoreBoard.stepHolder));
-        }
-        this.toggleScoreBoard(this.showScoreBoard);
-
-        this.scoreBoard.find('.score-select').click(this, function(event) {
-            var markBoard = event.data;
-            if (markBoard.task != undefined) {
-                var object = $(event.target);
-                markBoard.markControl.trigger('mark.step.change', object.attr('data-step-number'));
-                markBoard.currentStep.score = object.attr('data-score');
-                markBoard.onScoreSubmit();
-            }
-        });
-    } else {
-        this.initMarkBoardHeader();
-
-        this.stepBoard.stepHolder.empty();
-        this.stepBoard.stepArray = [];
-        this.stepBoard.find('#total-score').html('');
-        this.stepBoard.hide();
-
-        this.scoreBoard.stepHolder.empty();
-        this.scoreBoard.stepArray = [];
-        this.scoreBoard.hide();
-    }
-}
-
-MarkBoard.prototype.initMarkBoardHeader = function() {
-    var self = this;
-    if (this.task == undefined) {
-        this.stepBoard.selectiveHeader.hide();
-        this.scoreBoard.header.html('');
-    } else {
-        var group = this.task.selectiveGroup;
-        if (group != undefined) {
-            this.scoreBoard.header.empty();
-            var blockSelect = (this.scoreBoard.header).append(this.scoreBoard_selective_dom).find('select');
-            blockSelect.append('<option value="0">无</option>');
-            if (group.blockList != undefined) {
-                for (var i = 0; i < group.blockList.length; i++) {
-                    var block = group.blockList[i];
-                    var selected = this.task.blockId == block.id ? 'selected' : '';
-
-                    blockSelect.append('<option value="' + block.id + '" ' + selected + '>' + block.title + '</option>');
-                }
-            }
-            blockSelect.change(function() {
-                self.onBlockChange($(this).val());
-            });
-
-            blockSelect = this.stepBoard.selectiveHeader.find('select');
-            blockSelect.empty();
-            blockSelect.append('<option value="0">无</option>');
-            if (group.blockList != undefined) {
-                for (var i = 0; i < group.blockList.length; i++) {
-                    var block = group.blockList[i];
-                    var selected = this.task.blockId == block.id ? 'selected' : '';
-
-                    blockSelect.append('<option value="' + block.id + '" ' + selected + '>' + block.title + '</option>');
-                }
-            }
-            blockSelect.unbind();
-            blockSelect.change(function() {
-                self.onBlockChange($(this).val());
-            });
-            this.stepBoard.selectiveHeader.show();
-        } else {
-            this.stepBoard.selectiveHeader.hide();
-            this.scoreBoard.header.html(this.task.blockTitle);
-        }
-    }
-}
-
-MarkBoard.prototype.toggleScoreBoard = function(show) {
-    this.resetCurrentStep();
-    if (show) {
-        this.markControl.trigger('step.board.hide');
-        this.showScoreBoard = true;
-        this.scoreBoard.show();
-        this.stepBoard.hide();
-    } else {
-        this.markControl.trigger('step.board.show');
-        this.showScoreBoard = false;
-        this.scoreBoard.hide();
-        this.stepBoard.show();
-    }
-}
-
-MarkBoard.prototype.onBlockChange = function(blockId) {
-    if (this.task != undefined && this.task.selectiveGroup != undefined) {
-        this.task.blockId = parseInt(blockId);
-        this.task.totalScore = 0;
-        this.task.scoreList = '';
-
-        var block = undefined;
-        for (var i = 0; i < this.task.selectiveGroup.blockList.length; i++) {
-            if (this.task.blockId == this.task.selectiveGroup.blockList[i].id) {
-                block = this.task.selectiveGroup.blockList[i];
-                break;
-            }
-        }
-        if (block != undefined) {
-            this.task.markStepList = block.markStepList;
-        } else {
-            this.task.markStepList = [];
-        }
-        this.initByTask(this.task);
-    }
-}
-
-MarkBoard.prototype.togglePopover = function(show, text, baseDom) {
-    var popover = this.popover;
-    if (show == true && baseDom != undefined) {
-        //console.log(baseDom.offset().top + ',' + baseDom.offset().left);
-        popover.offset({
-            top: baseDom.offset().top + 20,
-            left: baseDom.offset().left - popover.width()
-        });
-        popover.title.html(text);
-        popover.show();
-        //console.log(popover.offset().top + ',' + popover.offset().left);
-    } else {
-        popover.offset({
-            top: 0,
-            left: 0
-        })
-        popover.title.html('');
-        popover.hide();
-    }
-}
-
-MarkBoard.prototype.step_board_dom = '<div class="span2 mark-steps" style="display:none"><div class="step-board">\
-<a href="#" class="header" id="show-score-board-button"><< 鼠标给分</a>\
-<div class="sublist"><p class="fraction">总分 <i id="total-score">5</i></p><div>\
-<a href="#" class="header all-zero-button">全零分</a>\
-<div class="step-list"></div>\
-</div></div>';
-
-MarkBoard.prototype.step_dom = '<div><div class="number">\
-<div class="title step-title"></div>\
-<div class="num current-score"></div></div>\
-<div class="score">\
-<div class="title interval-score"></div>\
-<div class="num min-score"></div>\
-<div class="icon">▲</div>\
-<div class="num max-score"></div>\
-</div></div>';
-
-MarkBoard.prototype.scoreBoard_dom = '<div class="score-board score-board-popover" style="display:none"></div>';
-
-MarkBoard.prototype.scoreBoard_header_dom = '<div class="header">\
-<p class="fl" id="score-board-header"></p>\
-<a class="header-close" id="score-board-close-button" href="#">\
-<i class="header-text">键盘给分 >></i></a>\
-</div>';
-
-MarkBoard.prototype.scoreBoard_stepHolder_dom = '<div class="content"></div>';
-
-MarkBoard.prototype.scoreBoard_step_dom = '<div class="sublist">\
-<p class="number"></p>\
-<p class="fraction"></p>\
-</div>';
-
-MarkBoard.prototype.scoreBoard_score_dom = '<a href="#" class="score-select"></a>';
-
-MarkBoard.prototype.scoreBoard_footer_dom = '<div class="footer">\
-<p class="font">总分:<i class="yellow" id="score-board-total-score"></i></p>\
-<a id="task-submit-button" class="button" href="#">提 交</a>\
-<a class="button all-zero-button" href="##">全零分</a>\
-<a id="task-pass-button" class="button" href="#" style="display:none">跳 过</a>\
-</div>';
-
-MarkBoard.prototype.popover_dom = '<div class="popover left assistant">\
-<div class="arrow"></div>\
-<h3 class="popover-title"></h3></div>';
-
-MarkBoard.prototype.scoreBoard_selective_dom = '<i class="fl">选做结果</i>\
-<select class="block-id-list span1 mr-t"></select>';

+ 0 - 188
stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-history.js

@@ -1,188 +0,0 @@
-//回评模块
-var mark_history = function(option, success) {
-    var object = new MarkHistory(option);
-    success();
-    return object;
-}
-
-function MarkHistory(option) {
-    this.markControl = option.markControl;
-    //this.url = option.url;
-    this.pageSize = option.pageSize;
-    this.taskList = [];
-    this.container = this.markControl.container.sidebar;
-    this.loading = false;
-
-    this.markControl.initMarkFunction();
-    this.container.toggleButton = getDom(this.toggle_button_dom, this.markControl).appendTo(this.markControl.container.assistant.functionList);
-    this.container.toggleButton.click(this, function(event) {
-        event.data.toggle(true);
-    });
-
-    this.markControl.on('history.get.success', this, function(event, context, data) {
-        var taskList = data.result;
-        this.taskList = [];
-        this.loading = false;
-        this.container.list.empty();
-        if (isArray(taskList) && taskList.length > 0) {
-            this.taskList = taskList;
-            for (var i in taskList) {
-                var task = taskList[i];
-                var row = getDom(this.history_row_dom, this.markControl).appendTo(this.container.list);
-                row.find('.history-secret-number').html(task.studentId);
-
-                var date = new Date();
-                date.setTime(task.markTime);
-                row.find('.history-time').html(date.format('hh:mm:ss'));
-                row.find('.history-score').html(task.totalScore);
-                row.attr('data-index', i);
-
-                //回评任务处理
-                task.previous = true;
-                // task.markFinish = true;
-                // task.totalScore = parseFloat(task.totalScore);
-                // var scoreList = task.scoreList != undefined ? task.scoreList.split(',') : [];
-                // for (var j in task.markStepList) {
-                //     var step = task.markStepList[j];
-                //     if (scoreList != undefined && scoreList.length > j) {
-                //         step.markScore = new Number(scoreList[j]);
-                //         step.score = new String(step.markScore);
-                //         step.markFinish = true;
-                //     }
-                // }
-            }
-        }
-        this.container.list.find('td').click(this, function(event) {
-            var markHistory = event.data;
-            var index = $(event.target).parent().attr('data-index');
-            markHistory.onTaskSelect(index);
-        });
-        this.pageNumber = data.pageNumber;
-        this.updateHeader();
-
-        if (this.taskList.length > 0) {
-            this.onTaskSelect(0);
-        }
-    });
-    this.markControl.on('history.get.error', this, function(event, context, data) {
-        alert('暂时无法读取评卷历史,请稍后重试');
-    });
-    this.markControl.on('task.submit.success', this, function(event, context, data) {
-        if (this.enable) {
-            this.toggle(false);
-        }
-    });
-    this.markControl.on('task.get.success', this, function(event, context, data) {
-        this.loading = false;
-    });
-}
-
-MarkHistory.prototype.init = function() {
-    this.container.empty();
-
-    this.container.header = getDom(this.header_dom, this.markControl).appendTo(this.container);
-    this.container.paginator = getDom(this.paginator_dom, this.markControl).appendTo(this.container);
-    this.container.list = getDom(this.history_list_dom, this.markControl).appendTo(this.container).find('#history-list');
-
-    this.container.header.find('#close-history-button').click(this, function(event) {
-        event.data.toggle(false);
-        this.markControl.context.task = undefined;
-        this.markControl.getTask();
-    })
-    this.container.paginator.find('#last-page-button').click(this, function(event) {
-        var markHistory = event.data;
-        markHistory.onSearch(markHistory.pageNumber + 1);
-    });
-    this.container.paginator.find('#next-page-button').click(this, function(event) {
-        var markHistory = event.data;
-        if (markHistory.pageNumber > 1) {
-            markHistory.onSearch(markHistory.pageNumber - 1);
-        }
-    });
-}
-
-MarkHistory.prototype.toggle = function(enable) {
-    this.enable = enable;
-    if (enable) {
-        this.init();
-        this.pageNumber = 1;
-        this.markControl.setTask(undefined);
-        this.markControl.trigger('mark.sidebar.open');
-        this.markControl.trigger('mark.history.open');
-        this.updateHeader();
-        this.container.list.empty();
-        this.container.removeClass('hide');
-        this.onSearch();
-    } else {
-        this.container.addClass('hide');
-        this.markControl.trigger('mark.sidebar.close');
-        this.markControl.trigger('mark.history.close');
-    }
-}
-
-MarkHistory.prototype.updateHeader = function() {
-    this.container.header.find('#history-start').html(this.pageSize * (this.pageNumber - 1));
-    this.container.header.find('#history-end').html(this.pageSize * this.pageNumber);
-
-    if (this.pageNumber == 1) {
-        this.container.paginator.find('#next-page-label').show();
-        this.container.paginator.find('#next-page-button').hide();
-    } else {
-        this.container.paginator.find('#next-page-label').hide();
-        this.container.paginator.find('#next-page-button').show();
-    }
-
-    if (this.taskList.length < this.pageSize) {
-        this.container.paginator.find('#last-page-label').show();
-        this.container.paginator.find('#last-page-button').hide();
-    } else {
-        this.container.paginator.find('#last-page-label').hide();
-        this.container.paginator.find('#last-page-button').show();
-    }
-}
-
-MarkHistory.prototype.onSearch = function(pageNumber) {
-    if (pageNumber == undefined || pageNumber < 1) {
-        pageNumber = 1;
-    }
-    this.markControl.getHistory({
-        pageNumber: pageNumber,
-        pageSize: this.pageSize
-    });
-}
-
-MarkHistory.prototype.onTaskSelect = function(index) {
-    var number = new String(index);
-    if (this.taskList != undefined && index < this.taskList.length && this.loading != true) {
-        this.container.list.find('tr').each(function(index, obj) {
-            if ($(obj).attr('data-index') == number) {
-                $(obj).addClass('active');
-            } else {
-                $(obj).removeClass('active');
-            }
-        });
-
-        var task = this.taskList[index];
-        this.markControl.setTask(task);
-        this.loading = true;
-    }
-}
-
-MarkHistory.prototype.toggle_button_dom = '<a href="#">回评</a>';
-
-MarkHistory.prototype.header_dom = '<div class="header">\
-<p class="fl">前<i class="yellow" id="history-start"></i>-前<i class="yellow" id="history-end"></i></p>\
-<a href="#" id="close-history-button"><img src="{staticServer}/mark-new/images/hp-close.png"></a>\
-</div>';
-
-MarkHistory.prototype.paginator_dom = '<div class="m-pagination"><a id="last-page-button" href="#">上一页</a>\
-<i id="last-page-label">上一页</i>\
-<a id="next-page-button" href="#">下一页</a>\
-<i id="next-page-label">下一页</i></div>';
-
-MarkHistory.prototype.history_list_dom = '<div class="sublist"><table class="table table-hover">\
-<thead><tr><th>编号</th><th>时间</th><th>总分</th></tr></thead>\
-<tbody id="history-list"></tbody></table></div>';
-
-MarkHistory.prototype.history_row_dom = '<tr><td class="history-secret-number"></td>\
-<td class="history-time"></td><td class="history-score"></td></tr>';

+ 0 - 147
stmms-web/src/main/webapp/static/mark-leader/js/modules/mark-status.js

@@ -1,147 +0,0 @@
-//评卷状态模块
-var mark_status = function(option, success) {
-    var object = new MarkStatus(option);
-    success();
-    return object;
-}
-
-function MarkStatus(option) {
-    this.markControl = option.markControl;
-    this.init(option);
-    this.markControl.on('task.get.before', this, function(event, context, statusInfo) {
-        this.topStatus.find('#stage-name').html('正在加载');
-    });
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        var task = context.task;
-        //修改页面显示
-        this.topStatus.find('#stage-name').html('');
-        this.topStatus.find('#student-number').html(task.studentId);
-        this.studentTitle.show();
-
-        if (task.objectiveScore != undefined) {
-            this.objectiveArea.find('#objective-score').html(task.objectiveScore);
-            this.objectiveArea.show();
-        } else {
-            this.objectiveArea.hide();
-        }
-        this.checkTopCount(task);
-    });
-    this.markControl.on('task.get.none', this, function(event, context, status) {
-        this.topStatus.find('#stage-name').html('');
-        this.topStatus.find('#student-number').html('');
-        this.studentTitle.hide();
-        this.objectiveArea.hide();
-    });
-    this.markControl.on('task.get.finish', this, function(event, context, status) {
-        this.topStatus.find('#stage-name').html('');
-        this.topStatus.find('#student-number').html('');
-        this.studentTitle.hide();
-        this.objectiveArea.hide();
-    });
-    this.markControl.on('mark.status.change', this, function(event, context, status) {
-        this.status = status;
-        this.render(status);
-    });
-    this.markControl.on('view.sidebar.open', this, function(event, context, eventObject) {
-        this.blockProgress.hide();
-    });
-    this.markControl.on('view.sidebar.close', this, function(event, context, eventObject) {
-        this.blockProgress.show();
-    });
-}
-
-MarkStatus.prototype.init = function(option) {
-    this.topStatus = getDom(this.status_dom, this.markControl).prependTo(this.markControl.container.header);
-    this.blockProgress = getDom(this.progress_dom, this.markControl).insertAfter(this.topStatus);
-    this.subjectTitle = this.topStatus.find('#subject-title');
-    this.studentTitle = this.topStatus.find('#student-title');
-    this.objectiveArea = this.topStatus.find('#objective-area');
-
-    this.popover = getDom(this.popover_dom, this.markControl);
-    this.popover.hide();
-    this.popover.appendTo(this.markControl.container);
-    var self = this;
-    this.popover.find('#continue-button').click(function() {
-        self.ignoreTopCount = true;
-        self.popover.hide();
-    });
-
-    this.subjectTitle.find('#subject-name').html(option.subjectName);
-    if (option.subjectSelectUrl != undefined) {
-        this.subjectTitle.click(function() {
-            window.location.href = option.subjectSelectUrl;
-        });
-    }
-}
-
-MarkStatus.prototype.checkTopCount = function(task) {
-    //任务限额提示
-    if (task != undefined && task.previous != true && this.status != undefined && this.status.topCount > 0 && this.status.markedCount >= this.status.topCount && this.ignoreTopCount != true) {
-        this.popover.show();
-    } else {
-        this.popover.hide();
-    }
-}
-
-MarkStatus.prototype.render = function(status) {
-    if (status != undefined && status.valid === true) {
-        var topCount = status.topCount;
-        this.topStatus.find('#mark-count').html(status.personCount);
-
-        //大题进度信息区域
-        if (this.blockProgress != undefined) {
-            var totalCount = status.totalCount;
-            var markedCount = status.markedCount;
-            var exceptionCount = status.exceptionCount;
-            var leftCount = totalCount > (markedCount + exceptionCount) ? (totalCount - markedCount - exceptionCount) : 0;
-            var markedPercent = totalCount > 0 ? new Number((totalCount - leftCount) * 100 / totalCount).toFixed(0) : '0';
-            if (markedPercent == '100' && leftCount > 0) {
-                markedPercent = '99';
-            } else if (markedPercent == '0' && markedCount > 0) {
-                markedPercent = '1';
-            }
-            if(topCount > 0){
-                if(this.blockProgress.find('#top-count').length == 0){
-                  this.blockProgress.find('#todo-count').after('<i>任务数<em id="top-count"></em></i>');
-                  this.blockProgress.find('#top-count').html(topCount);
-                }
-            }
-            this.blockProgress.find('#total-count').html(totalCount);
-            this.blockProgress.find('#marked-count').html(markedCount);
-            this.blockProgress.find('#todo-count').html(leftCount);
-            this.blockProgress.find('#exception-count').html(exceptionCount);
-            this.blockProgress.find('#marked-percent').html(markedPercent + '%');
-        }
-
-        if (status.totalCount > 0 && status.totalCount == status.markedCount) {
-            this.markControl.context.isFinish = true;
-        }
-    }
-}
-
-MarkStatus.prototype.status_dom = '<p class="text">\
-<i id="subject-title" style="cursor:pointer"><em id="subject-name"></em></i>\
-<i id="stage-name"></i>\
-<i id="student-title">考生编号<em id="student-number"></em></i>\
-<i id="objective-area">客观得分<em id="objective-score"></em></i>\
-<i>评卷数<em id="mark-count"></em></i>\
-</p>';
-
-MarkStatus.prototype.progress_dom = '<p class="text">\
-<i>未评<em id="todo-count"></em></i>\
-<i>进度<em id="marked-percent"></em></i>\
-</p>';
-
-MarkStatus.prototype.block_progress_bak_dom = '<p class="text">\
-<i>总数<em id="total-count"></em></i>\
-<i>已评<em id="marked-count"></em></i>\
-<i>未评<em id="todo-count"></em></i>\
-<i>异常<em id="exception-count"></em></i>\
-<i>进度<em id="marked-percent"></em></i>\
-</p>';
-
-MarkStatus.prototype.popover_dom = '<div class="warning-popover">\
-<p>分配任务已评完,是否继续?</p>\
-<a href="#" class="btn btn-large btn-primary text-c" id="continue-button">继续</a>\
-<a href="{logoutUrl}" class="btn btn-large text-c" id="exit-button">退出</a>\
-</div>';

+ 0 - 268
stmms-web/src/main/webapp/static/mark-leader/js/modules/multi-image-view.js

@@ -1,268 +0,0 @@
-//简单多张图片排列显示模块
-var multi_image_view = function(option, success) {
-    var object = new MultiImageView(option);
-    success();
-    return object;
-}
-
-function MultiImageView(option) {
-    this.markControl = option.markControl;
-    this.defaultZoom = 'fit';
-    this.init();
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
-        this.task = undefined;
-        this.imageCount = 0;
-        this.render();
-    });
-    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
-        this.task = context.task;
-        this.imageCount = this.task.pictureUrls.length;
-        this.imageServer = context.imageServer;
-        this.render();
-    });
-    this.markControl.on('step.board.show', this, function(event, context, eventObject) {
-        this.container.removeClass('span12');
-        this.container.addClass('span10');
-
-        this.container.perfectScrollbar('update');
-        if (this.iviewer != undefined) {
-            this.iviewer.iviewer('update');
-        }
-    });
-    this.markControl.on('step.board.hide', this, function(event, context, eventObject) {
-        this.container.removeClass('span10');
-        this.container.addClass('span12');
-
-        this.container.perfectScrollbar('update');
-        if (this.iviewer != undefined) {
-            this.iviewer.iviewer('update');
-        }
-    });
-    this.markControl.on('center.width.change', this, function(event, context, eventObject) {
-        this.container.perfectScrollbar('update');
-        if (this.iviewer != undefined) {
-            this.iviewer.iviewer('update');
-        }
-    });
-    this.markControl.on('key.press', this, function(e, context, event) {
-        var code = event.keyCode;
-        if (this.iviewer != undefined && this.currentConfig != undefined && this.imageCount > 0) {
-            if (code == 91) {
-                // [按键,切换上一张图片
-                var number = this.currentConfig.number;
-                if (number > 1) {
-                    this.change(number - 1);
-                    event.preventDefault();
-                    return false;
-                }
-            } else if (code == 93) {
-                // ]按键,切换下一张图片
-                var number = this.currentConfig.number;
-                if (number < this.imageCount) {
-                    this.change(number + 1);
-                    event.preventDefault();
-                    return false;
-                }
-            }
-        }
-    });
-    this.markControl.on('key.up', this, function(e, context, event) {
-        var code = event.keyCode;
-        if (this.iviewer != undefined && this.currentConfig != undefined && this.imageCount > 0) {
-            if (code == 37) {
-                // left按键,切换上一张图片
-                var number = this.currentConfig.number;
-                if (number > 1) {
-                    this.change(number - 1);
-                    event.preventDefault();
-                    return false;
-                }
-            } else if (code == 39) {
-                // right按键,切换下一张图片
-                var number = this.currentConfig.number;
-                if (number < this.imageCount) {
-                    this.change(number + 1);
-                    event.preventDefault();
-                    return false;
-                }
-            }
-        }
-
-    });
-}
-
-MultiImageView.prototype.init = function() {
-    this.configCache = {};
-    this.container = getDom(this.container_dom, this.markControl).appendTo(this.markControl.container.center);
-    this.container.perfectScrollbar({
-        wheelSpeed: 20
-    });
-    this.container.width('100%');
-    this.container.height(this.markControl.container.height() - 41);
-
-    this.imageHolder = getDom(this.imageHolder_dom, this.markControl).appendTo(this.container);
-    this.imageHolder.width('100%');
-
-    this.centerHeader = getDom(this.center_header_dom, this.markControl).appendTo(this.markControl.container.header.find('p.pictures')).parent();
-    this.centerHeader.hide();
-    this.imageControl = getDom(this.image_control_dom, this.markControl).appendTo(this.markControl.container);
-    this.imageControl.css('position', 'absolute');
-    this.imageSwitchList = this.imageControl.find('#image-switch-list');
-
-    this.centerHeader.click(this, function(event) {
-        var obj = event.data.centerHeader;
-        var position = obj.offset();
-        var left = position.left;
-        var top = position.top + obj.height();
-        event.data.imageControl.css('top', top);
-        event.data.imageControl.css('left', left);
-        event.data.imageControl.toggle();
-    });
-    this.imageControl.find('a.image-popover-close').click(this, function(event) {
-        event.data.imageControl.hide();
-    });
-    this.imageControl.find('#zoom-out-button').click(this, function(event) {
-        var iviewer = event.data.iviewer;
-        if (iviewer != undefined) {
-            iviewer.iviewer('zoom_by', 1);
-        }
-    });
-    this.imageControl.find('#zoom-in-button').click(this, function(event) {
-        var iviewer = event.data.iviewer;
-        if (iviewer != undefined) {
-            iviewer.iviewer('zoom_by', -1);
-        }
-    });
-    this.imageControl.find('#zoom-fit-button').click(this, function(event) {
-        var iviewer = event.data.iviewer;
-        if (iviewer != undefined) {
-            iviewer.iviewer('fit');
-        }
-    });
-    this.imageControl.find('#zoom-origin-button').click(this, function(event) {
-        var iviewer = event.data.iviewer;
-        if (iviewer != undefined) {
-            iviewer.iviewer('set_zoom', 100);
-        }
-    });
-}
-
-MultiImageView.prototype.render = function() {
-    if (this.task != undefined) {
-        var config = this.configCache[this.task.blockId];
-        if (config == undefined) {
-            config = {
-                number: 1,
-                zoom: this.defaultZoom
-            };
-            this.configCache[this.task.blockId] = config;
-        }
-        if (config.number == undefined || config.number < 0 || config.number > this.imageCount) {
-            config.number = 1;
-        }
-        this.currentConfig = config;
-
-        for (var i = 1; i <= this.imageCount; i++) {
-            var switchButton = getDom(this.image_switch_button_dom, this.markControl).appendTo(this.imageSwitchList);
-            switchButton.html(i);
-            switchButton.attr('data-number', i);
-            if (i == config.number) {
-                switchButton.addClass('curr');
-            }
-        }
-        this.imageSwitchList.find('.image-switch-button').click(this, function(event) {
-            var number = $(event.target).attr('data-number');
-            event.data.change(number, config.zoom, config);
-            event.data.imageControl.hide();
-        });
-
-        if (this.iviewer == undefined) {
-            var MultiImageView = this;
-            this.iviewer = this.imageHolder.iviewer({
-                src: this.imageServer + this.task.pictureUrls[config.number - 1],
-                zoom: config.zoom,
-                ui_disabled: true,
-                mousewheel: false,
-                zoom_animation: false,
-                onZoom: function(ev, new_zoom) {
-                    MultiImageView.onZoomSet(new_zoom);
-                },
-                onStopDrag: function(ev, point) {
-                    MultiImageView.onStopDrag(point);
-                },
-                onFinishLoad: function(ev, url) {
-                    MultiImageView.onImageLoad();
-                }
-            });
-            this.centerHeader.find('#image-number').html(config.number);
-        } else {
-            this.change(config.number, config.zoom, config);
-        }
-        this.imageHolder.show();
-        this.centerHeader.show();
-
-        this.imageHolder.trigger('mouseenter');
-    } else {
-        this.centerHeader.hide();
-        this.imageHolder.hide();
-        this.currentConfig = undefined;
-        this.imageSwitchList.empty();
-    }
-}
-
-MultiImageView.prototype.change = function(number) {
-    if (this.task != undefined && number > 0 && number <= this.imageCount && this.currentConfig != undefined && this.currentConfig.loading == false) {
-        this.currentConfig.loading = true;
-        this.currentConfig.number = number;
-
-        this.iviewer.iviewer('loadImage', this.imageServer + this.task.pictureUrls[number - 1]);
-        this.centerHeader.find('#image-number').html(number);
-        this.imageSwitchList.find('.image-switch-button').each(function(index, obj) {
-            if ($(obj).attr('data-number') == number) {
-                $(obj).addClass('curr');
-            } else {
-                $(obj).removeClass('curr');
-            }
-        });
-    }
-}
-
-MultiImageView.prototype.onImageLoad = function() {
-    this.currentConfig.loading = false;
-    this.imageHolder.find('img').css('top', '0');
-    this.iviewer.iviewer('set_zoom', this.currentConfig.zoom);
-    if (this.currentConfig.dx != undefined && this.currentConfig.dy != undefined) {
-        this.iviewer.iviewer('moveTo', point.dx, point.dy);
-    }
-}
-
-MultiImageView.prototype.onZoomSet = function(zoom) {
-    if (this.currentConfig.loading == false) {
-        this.currentConfig.zoom = zoom;
-    }
-}
-
-MultiImageView.prototype.onStopDrag = function(point) {
-    if (this.currentConfig.loading == false) {
-        this.currentConfig.dx = point.x;
-        this.currentConfig.dy = point.y;
-    }
-}
-
-MultiImageView.prototype.container_dom = '<div class="content"></div>';
-
-MultiImageView.prototype.imageHolder_dom = '<div style="position:relative"></div>';
-
-MultiImageView.prototype.center_header_dom = '<i class="L-pic">当前图片</i><i id="image-number" class="R-pic"></i>';
-
-MultiImageView.prototype.image_control_dom = '<div class="image-popover hide">\
-<div class="image-control">\
-<span class="control-row"><p class="title">图片切换</p><p class="content" id="image-switch-list"></p></span>\
-<span class="control-row"><p class="title">图片控制</p>\
-<p class="content">\
-<a href="#" id="zoom-out-button">放大</a><a href="#" id="zoom-in-button">缩小</a>\
-<a href="#" id="zoom-fit-button">1:1</a><a href="#" id="zoom-origin-button">原始</a>\
-</p></span></div>\
-<a href="#" class="image-popover-close"><p>关</p><p>闭</p></a></div>';
-
-MultiImageView.prototype.image_switch_button_dom = '<a href="#" class="image-switch-button"></a>';

Some files were not shown because too many files changed in this diff