فهرست منبع

去除open_account,修改第三方评卷员登录;增加评卷端全卷显示功能;增加评卷端全零分功能的开关配置

luoshi 4 سال پیش
والد
کامیت
daa1cdd9b9
52فایلهای تغییر یافته به همراه2768 افزوده شده و 2665 حذف شده
  1. 12 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java
  2. 27 25
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java
  3. 7 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java
  4. 3 18
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java
  5. 18 11
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java
  6. 18 123
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java
  7. 16 27
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/dao/UserDao.java
  8. 42 29
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/model/User.java
  9. 2 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java
  10. 78 68
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/impl/UserServiceImpl.java
  11. 20 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/query/UserSearchQuery.java
  12. 2 2
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/Role.java
  13. 44 0
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/UserSource.java
  14. 5 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java
  15. 33 34
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java
  16. 33 29
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  17. 65 81
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  18. 260 218
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  19. 28 31
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  20. 18 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectClassController.java
  21. 18 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectCollegeController.java
  22. 17 17
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectController.java
  23. 18 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectGroupController.java
  24. 20 20
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectQuestionController.java
  25. 31 26
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java
  26. 20 20
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherClassController.java
  27. 20 20
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherController.java
  28. 165 161
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  29. 7 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/authorization/AuthorizationService.java
  30. 29 30
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  31. 12 23
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java
  32. 3 17
      stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java
  33. 19 27
      stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java
  34. 8 33
      stmms-web/src/main/java/cn/com/qmth/stmms/common/session/model/StmmsSession.java
  35. 39 55
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  36. 0 146
      stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenAccountController.java
  37. 110 0
      stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenUserController.java
  38. 9 30
      stmms-web/src/main/java/cn/com/qmth/stmms/open/interceptor/OpenInterceptor.java
  39. 153 138
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupAdd.jsp
  40. 182 162
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp
  41. 141 129
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp
  42. 120 110
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp
  43. 113 102
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp
  44. 87 87
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp
  45. 113 100
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userList.jsp
  46. 128 123
      stmms-web/src/main/webapp/static/i18n/messages.properties
  47. 6 1
      stmms-web/src/main/webapp/static/i18n/messages_en.properties
  48. 126 121
      stmms-web/src/main/webapp/static/i18n/messages_ja.properties
  49. 128 123
      stmms-web/src/main/webapp/static/i18n/messages_zh.properties
  50. 17 11
      stmms-web/src/main/webapp/static/mark-new/js/modules/mark-board.js
  51. 127 0
      stmms-web/src/main/webapp/static/mark-new/js/modules/slice-view.js
  52. 51 44
      stmms-web/src/main/webapp/static/mark-track/js/modules/mark-board.js

+ 12 - 9
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -1,19 +1,18 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
-import java.util.Date;
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.PagingAndSortingRepository;
-
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import java.util.Date;
+import java.util.List;
 
 public interface MarkGroupDao
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
@@ -127,12 +126,16 @@ public interface MarkGroupDao
     @Query("update MarkGroup g set g.sheetView=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateSheetView(Integer examId, String subjectCode, Integer number, boolean sheetView);
 
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.enableAllZero=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateEnableAllZero(Integer examId, String subjectCode, Integer number, boolean enableAllZero);
+
     @Modifying(clearAutomatically = true)
     @Query("update MarkGroup g set g.status=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3 "
             + "and g.status in (?5)")
     Integer updateStatus(Integer examId, String subjectCode, Integer number, MarkStatus newStatus,
             MarkStatus... currentStatus);
-    
+
     @Modifying(clearAutomatically = true)
     @Query("update MarkGroup g set g.thirdPolicy=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateThirdPolicy(Integer examId, String subjectCode, Integer number, ThirdPolicy third);

+ 27 - 25
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java

@@ -1,31 +1,17 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import java.io.Serializable;
-import java.text.DecimalFormat;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.commons.lang.StringUtils;
-
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.text.DecimalFormat;
+import java.util.*;
 
 /**
  * 评卷分组对象
@@ -96,6 +82,12 @@ public class MarkGroup implements Serializable {
     @Column(name = "sheet_view", nullable = false)
     private boolean sheetView;
 
+    /**
+     * 开启/关闭 全零分
+     */
+    @Column(name = "enable_all_zero", nullable = false)
+    private boolean enableAllZero;
+
     /**
      * 当前评卷状态
      */
@@ -152,13 +144,14 @@ public class MarkGroup implements Serializable {
 
     public MarkGroup(Integer examId, String subjectCode, Integer number, List<PictureConfigItem> configList,
             Double totalScore, Double doubleRate, Double arbitrateThreshold, Integer scorePolicy, String markMode,
-            Integer trialCount, boolean sheetView, Integer thirdPolicy) {
+            Integer trialCount, boolean sheetView, boolean enableAllZero, Integer thirdPolicy) {
         this.pk = new MarkGroupPK();
         this.pk.setExamId(examId);
         this.pk.setNumber(number);
         this.pk.setSubjectCode(subjectCode);
-        this.picList = configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                PictureConfigItem.DB_ITEM_JOINER) : "";
+        this.picList = configList != null && configList.size() > 0 ?
+                StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) :
+                "";
         this.totalScore = totalScore;
         this.libraryCount = 0;
         this.markedCount = 0;
@@ -185,6 +178,7 @@ public class MarkGroup implements Serializable {
             this.status = MarkStatus.FORMAL;
         }
         this.sheetView = sheetView;
+        this.enableAllZero = enableAllZero;
 
         if (thirdPolicy != null) {
             this.thirdPolicy = ThirdPolicy.findByValue(thirdPolicy);
@@ -226,8 +220,9 @@ public class MarkGroup implements Serializable {
     }
 
     public void setPicList(List<PictureConfigItem> configList) {
-        this.picList = configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                PictureConfigItem.DB_ITEM_JOINER) : "";
+        this.picList = configList != null && configList.size() > 0 ?
+                StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) :
+                "";
     }
 
     public List<PictureConfigItem> getPictureConfigList() {
@@ -428,4 +423,11 @@ public class MarkGroup implements Serializable {
         this.thirdPolicy = thirdPolicy;
     }
 
+    public boolean isEnableAllZero() {
+        return enableAllZero;
+    }
+
+    public void setEnableAllZero(boolean enableAllZero) {
+        this.enableAllZero = enableAllZero;
+    }
 }

+ 7 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -1,13 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.Date;
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 
+import java.util.Date;
+import java.util.List;
+
 public interface MarkGroupService {
 
     MarkGroup save(MarkGroup markGroup);
@@ -40,13 +40,16 @@ public interface MarkGroupService {
 
     void updateSheetView(int examId, String subjectCode, Integer number, boolean sheetView);
 
+    void updateEnableAllZero(int examId, String subjectCode, Integer number, boolean enableAllZero);
+
     long sumLibraryCount(Integer examId);
 
     long sumMarkedCount(Integer examId);
 
     double sumTotalScore(Integer examId, String subjectCode);
 
-    boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus, MarkStatus... currentStatus);
+    boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus,
+            MarkStatus... currentStatus);
 
     List<Integer> findExamIdByStatus(MarkStatus... status);
 

+ 3 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java

@@ -1,25 +1,20 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 
+import java.util.List;
+
 public interface MarkerService {
 
     Marker save(Marker marker);
 
     Marker findById(Integer id);
 
-    // Marker findByLoginName(String loginName);
-    //
     List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int groupNumber);
 
     long countByExam(int examId);
 
-    // int batchCreate(ExamSubject subject, int groupNumber, int count, String
-    // password);
-
     MarkerSearchQuery findByQuery(MarkerSearchQuery query);
 
     List<Marker> getMarkCount(int examId);
@@ -30,18 +25,8 @@ public interface MarkerService {
 
     List<Marker> findMode(String commo);
 
-    // public List<Marker> findByStudentId(int studentId);
-
-    public int batchSave(List<Marker> list);
+    int batchSave(List<Marker> list);
 
     void updateMarkSetting(Integer id, String setting);
 
-    // void updateOpenAccountById(Integer id, Integer openAccountId);
-
-    // List<Marker> findByOpenAccountAndMarkStatus(Integer openAccountId,
-    // MarkStatus... status);
-
-    // long countByExamAndSubjectAndGroupAndOpenAccount(Integer examId, String
-    // subjectCode, Integer groupNumber,
-    // Integer openAccountId);
 }

+ 18 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -1,13 +1,5 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -16,6 +8,13 @@ import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
 
 @Service("markGroupService")
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
@@ -38,8 +37,9 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     @Transactional
     @Override
     public void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> configList) {
-        groupDao.updatePicList(examId, subjectCode, number,
-                configList != null && configList.size() > 0 ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) : "");
+        groupDao.updatePicList(examId, subjectCode, number, configList != null && configList.size() > 0 ?
+                StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) :
+                "");
     }
 
     @Transactional
@@ -80,7 +80,14 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
 
     @Transactional
     @Override
-    public boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus, MarkStatus... currentStatus) {
+    public void updateEnableAllZero(int examId, String subjectCode, Integer number, boolean enableAllZero) {
+        groupDao.updateEnableAllZero(examId, subjectCode, number, enableAllZero);
+    }
+
+    @Transactional
+    @Override
+    public boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus,
+            MarkStatus... currentStatus) {
         return groupDao.updateStatus(examId, subjectCode, number, newStatus, currentStatus) > 0;
     }
 

+ 18 - 123
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java

@@ -1,28 +1,25 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
 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.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.LinkedList;
+import java.util.List;
 
 @Service("markerService")
 public class MarkerServiceImpl extends BaseQueryService<Marker> implements MarkerService {
@@ -33,9 +30,6 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     @Autowired
     private MarkLibraryDao libraryDao;
 
-    @Autowired
-    private MarkGroupService groupService;
-
     @Transactional
     @Override
     public Marker save(Marker marker) {
@@ -54,23 +48,11 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
         markerDao.updateMarkSettingById(id, setting);
     }
 
-    // @Transactional
-    // @Override
-    // public void updateOpenAccountById(Integer id, Integer accountId) {
-    // markerDao.updateOpenAccountById(id, accountId);
-    // }
-
     @Override
     public Marker findById(Integer id) {
         return markerDao.findOne(id);
     }
 
-    // @Override
-    // public Marker findByLoginName(String loginName) {
-    // List<Marker> list = markerDao.findByLoginName(loginName);
-    // return list != null && list.size() > 0 ? list.get(0) : null;
-    // }
-
     @Override
     public List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int number) {
         return markerDao.findByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number, null);
@@ -86,78 +68,6 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
         return markerDao.countByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number);
     }
 
-    // @Transactional
-    // @Override
-    // public int batchCreate(ExamSubject subject, int groupNumber, int count,
-    // String password) {
-    // int result = 0;
-    // if (subject != null && count > 0) {
-    // if (groupNumber > 0) {
-    // result = saveMarker(subject, groupNumber, count, password);
-    // } else {
-    // List<MarkGroup> groups =
-    // groupService.findByExamAndSubject(subject.getExamId(),
-    // subject.getCode());
-    // for (MarkGroup markGroup : groups) {
-    // result = result + saveMarker(subject, markGroup.getNumber(), count,
-    // password);
-    // }
-    // }
-    // }
-    // return result;
-    // }
-
-    // private int saveMarker(ExamSubject subject, int groupNumber, int count,
-    // String password) {
-    // int result = 0;
-    // int start = 1;
-    // Marker previous = findLastMarker(subject.getExamId(), subject.getCode());
-    // if (previous != null) {
-    // start = previous.getNumber() + 1;
-    // }
-    // int end = start + count - 1;
-    // for (; start <= end; start++) {
-    // Marker marker = new Marker();
-    // marker.setExamId(subject.getExamId());
-    // marker.setSubjectCode(subject.getCode());
-    // if (StringUtils.isEmpty(password)) {
-    // Random random = new Random();
-    // for (int i = 0; i < 6; i++) {
-    // password += random.nextInt(10);
-    // }
-    // marker.setPassword(password);
-    // password = "";// 随机码生产后将密码置空
-    // } else {
-    // marker.setPassword(password);
-    // }
-    // marker.setEnable(true);
-    // marker.buildLoginName(start);
-    // marker.setLoginName(marker.getLoginName());
-    // marker.setName(marker.getLoginName());
-    // marker.setGroupNumber(groupNumber);
-    // marker.setClassCount(0);
-    // if (save(marker) != null) {
-    // result++;
-    // }
-    // }
-    // return result;
-    // }
-
-    // private Marker findLastMarker(int examId, String subjectCode) {
-    // Marker marker = null;
-    // List<Marker> list = markerDao.findByExamIdAndSubjectCode(examId,
-    // subjectCode, new BaseQuery<Marker>(1, 1,
-    // new Sort(Direction.DESC, "id")));
-    // if (list != null && !list.isEmpty()) {
-    // marker = list.get(0);
-    // }
-    // if (marker != null) {
-    // return Marker.parseLoginName(marker.getLoginName());
-    // } else {
-    // return null;
-    // }
-    // }
-
     @Override
     public List<Marker> getMarkCount(int examId) {
         List<Marker> list = new LinkedList<Marker>();
@@ -178,8 +88,8 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     @Override
     public List<Marker> getMarkCount(int examId, String subjectCode) {
         List<Marker> list = new LinkedList<Marker>();
-        List<Object[]> result = libraryDao.countMarkerAndStatus(examId, subjectCode, LibraryStatus.MARKED,
-                LibraryStatus.INSPECTED);
+        List<Object[]> result = libraryDao
+                .countMarkerAndStatus(examId, subjectCode, LibraryStatus.MARKED, LibraryStatus.INSPECTED);
         if (result != null) {
             for (Object[] array : result) {
                 try {
@@ -222,8 +132,9 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
                 if (query.getUserId() != null) {
                     predicates.add(cb.equal(root.get("userId"), query.getUserId()));
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -239,20 +150,4 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
         return markerDao.findByMode(commo);
     }
 
-    // @Override
-    // public List<Marker> findByOpenAccountAndMarkStatus(Integer accountId,
-    // MarkStatus... status) {
-    // return markerDao.findByOpenAccountIdAndEnableAndMarkStatus(accountId,
-    // true, status);
-    // }
-
-    // @Override
-    // public long countByExamAndSubjectAndGroupAndOpenAccount(Integer examId,
-    // String subjectCode, Integer groupNumber,
-    // Integer openAccountId) {
-    // return
-    // markerDao.countByExamIdAndSubjectCodeAndGroupNumberAndOpenAccountId(examId,
-    // subjectCode, groupNumber,
-    // openAccountId);
-    // }
 }

+ 16 - 27
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/dao/UserDao.java

@@ -1,27 +1,16 @@
-package cn.com.qmth.stmms.biz.user.dao;
-
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.PagingAndSortingRepository;
-
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.common.enums.Role;
-
-public interface UserDao extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
-
-    public List<User> findByLoginName(String LoginName);
-
-    public List<User> findByLoginNameAndPassword(String LoginName, String password);
-
-    public List<User> findBySchoolId(int schoolId);
-
-    public List<User> findBySchoolIdAndRole(int schoolId, Role role);
-
-    public List<User> findBySchoolIdAndRoleIn(int schoolId, Set<Role> roleSet);
-
-    @Query(value = "select * from b_user u where u.id = (select m.user_id from eb_marker m where m.id =?1)", nativeQuery = true)
-    public User findByMarkerId(Integer markerId);
-}
+package cn.com.qmth.stmms.biz.user.dao;
+
+import cn.com.qmth.stmms.biz.user.model.User;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface UserDao extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
+
+    User findFirstByLoginName(String LoginName);
+
+    User findFirstBySchoolIdAndRelatedAccount(Integer schoolId, String relatedAccount);
+
+    @Query(value = "select u from User u where u.id=(select m.userId from Marker m where m.id=?1)")
+    User findByMarkerId(Integer markerId);
+}

+ 42 - 29
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/model/User.java

@@ -1,19 +1,13 @@
 package cn.com.qmth.stmms.biz.user.model;
 
-import java.io.Serializable;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
 @Entity
 @Table(name = "b_user")
 public class User implements Serializable {
@@ -32,19 +26,19 @@ public class User implements Serializable {
     /**
      * 登录名
      */
-    @Column(name = "login_name")
+    @Column(name = "login_name", length = 64, nullable = false)
     private String loginName;
 
     /**
      * 名称
      */
-    @Column(name = "name")
+    @Column(name = "name", length = 64, nullable = false)
     private String name;
 
     /**
      * 密码
      */
-    @Column(name = "password")
+    @Column(name = "password", length = 64, nullable = false)
     private String password;
 
     /**
@@ -54,50 +48,57 @@ public class User implements Serializable {
     @Enumerated(EnumType.STRING)
     private Role role;
 
+    /**
+     * 来源
+     */
+    @Column(name = "source", length = 16, nullable = false)
+    @Enumerated(EnumType.STRING)
+    private UserSource source;
+
     /**
      * 状态
      */
-    @Column(name = "enable")
+    @Column(name = "enable", nullable = false)
     private boolean enable;
 
     /**
      * 所属学校ID
      */
-    @Column(name = "school_id")
+    @Column(name = "school_id", nullable = false)
     private Integer schoolId;
 
     /**
-     * 绑定科目代码
+     * 关联的外部用户标识
      */
-    @Column(name = "subject_code")
-    private String subjectCode;
+    @Column(name = "related_account", length = 64, nullable = true)
+    private String relatedAccount;
 
     /**
      * 最后一次登录时间
      */
-    @Column(name = "last_login_time")
+    @Column(name = "last_login_time", nullable = true)
     private Date lastLoginTime;
 
     /**
      * 最后一次登录IP
      */
-    @Column(name = "last_login_ip")
+    @Column(name = "last_login_ip", length = 64, nullable = true)
     private String lastLoginIp;
 
     @Column(name = "created_time", nullable = false)
     private Date createdTime;
 
-    @Column(name = "updated_time")
+    @Column(name = "updated_time", nullable = false)
     private Date updatedTime;
 
     /**
-     * 访问token
+     * 访问令牌
      */
-    @Column(name = "access_token", nullable = true, length = 64)
+    @Column(name = "access_token", length = 64, nullable = true)
     private String accessToken;
 
     /**
-     * 访问token的刷新时间
+     * 访问令牌的刷新时间
      */
     @Column(name = "access_token_refresh_time", nullable = true)
     private Date accessTokenRefreshTime;
@@ -182,12 +183,20 @@ public class User implements Serializable {
         this.updatedTime = updatedTime;
     }
 
-    public String getSubjectCode() {
-        return subjectCode;
+    public UserSource getSource() {
+        return source;
+    }
+
+    public void setSource(UserSource source) {
+        this.source = source;
     }
 
-    public void setSubjectCode(String subjectCode) {
-        this.subjectCode = subjectCode;
+    public String getRelatedAccount() {
+        return relatedAccount;
+    }
+
+    public void setRelatedAccount(String relatedAccount) {
+        this.relatedAccount = relatedAccount;
     }
 
     public boolean isEnable() {
@@ -210,4 +219,8 @@ public class User implements Serializable {
         this.accessToken = AccessControlUtils.randomString();
         this.accessTokenRefreshTime = new Date();
     }
+
+    public String getAccount() {
+        return source == UserSource.INTERNAL ? loginName : relatedAccount;
+    }
 }

+ 2 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java

@@ -1,8 +1,5 @@
 package cn.com.qmth.stmms.biz.user.service;
 
-import java.util.List;
-import java.util.Set;
-
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
 import cn.com.qmth.stmms.common.enums.Role;
@@ -11,24 +8,16 @@ public interface UserService {
 
     User login(String loginName, String password, String ip);
 
-    User findByLoginName(String loginName);
+    User externalLogin(Integer schoolId, String account, String name, Role role);
 
-    List<User> findByLoginNameAndPassword(String loginName, String password);
+    User findByLoginName(String loginName);
 
     User findById(Integer id);
 
-    List<User> findBySchoolIdAndRole(int schoolId, Role role);
-
-    List<User> findBySchoolIdAndRoleSet(int schoolId, Set<Role> roleSet);
-
     UserSearchQuery findByQuery(final UserSearchQuery query);
 
     User save(User user);
 
-    void deleteById(int id);
-
-    void delete(User user);
-
     User findSchoolAdmin(int schoolId);
 
     User findSchoolViewer(Integer schoolId);

+ 78 - 68
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/impl/UserServiceImpl.java

@@ -1,15 +1,13 @@
 package cn.com.qmth.stmms.biz.user.service.impl;
 
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.user.dao.UserDao;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
+import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -17,12 +15,13 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.stmms.biz.user.dao.UserDao;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.biz.user.service.UserService;
-import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * 用户Service
@@ -36,28 +35,32 @@ public class UserServiceImpl implements UserService {
     private UserDao userDao;
 
     @Override
-    public User findByLoginName(String loginName) {
-        List<User> list = userDao.findByLoginName(loginName);
-        return list != null && list.size() > 0 ? list.get(0) : null;
+    @Transactional
+    public User save(User user) {
+        if (user.getId() != null && user.getId() > 0) {
+            user.setUpdatedTime(new Date());
+        } else {
+            user.setCreatedTime(new Date());
+        }
+        return userDao.save(user);
     }
 
     @Override
-    public List<User> findByLoginNameAndPassword(String loginName, String password) {
-        return userDao.findByLoginNameAndPassword(loginName, password);
-    }
-
-    public List<User> findBySchoolIdAndRole(int schoolId, Role role) {
-        return userDao.findBySchoolIdAndRole(schoolId, role);
+    public User findByLoginName(String loginName) {
+        return userDao.findFirstByLoginName(loginName);
     }
 
-    public List<User> findBySchoolIdAndRoleSet(int schoolId, Set<Role> roleSet) {
-        return userDao.findBySchoolIdAndRoleIn(schoolId, roleSet);
+    @Override
+    public User findByMarkerId(Integer markerId) {
+        return userDao.findByMarkerId(markerId);
     }
 
+    @Override
     public User findById(Integer id) {
         return userDao.findOne(id);
     }
 
+    @Override
     public User findSchoolAdmin(int schoolId) {
         UserSearchQuery query = new UserSearchQuery();
         query.setSchoolId(schoolId);
@@ -72,6 +75,22 @@ public class UserServiceImpl implements UserService {
         }
     }
 
+    @Override
+    public User findSchoolViewer(Integer schoolId) {
+        UserSearchQuery query = new UserSearchQuery();
+        query.setSchoolId(schoolId);
+        query.addIncludeRole(Role.SCHOOL_VIEWER);
+        query.setPageNumber(1);
+        query.setPageSize(1);
+        query = findByQuery(query);
+        if (query.getCurrentCount() > 0) {
+            return query.getResult().get(0);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
     public UserSearchQuery findByQuery(final UserSearchQuery query) {
         if (query.getPageNumber() < 1) {
             query.setPageNumber(1);
@@ -100,13 +119,20 @@ public class UserServiceImpl implements UserService {
                 if (query.getRole() != null) {
                     predicates.add(cb.equal(root.get("role"), query.getRole()));
                 }
+                if (query.getSource() != null) {
+                    predicates.add(cb.equal(root.get("source"), query.getSource()));
+                }
+                if (query.getRelatedAccount() != null) {
+                    predicates.add(cb.equal(root.get("relatedAccount"), query.getRelatedAccount()));
+                }
                 if (query.getIncludeRoles() != null && query.getIncludeRoles().size() > 0) {
                     for (Role role : query.getIncludeRoles()) {
                         predicates.add(cb.equal(root.get("role"), role));
                     }
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         }, query);
         if (result != null) {
@@ -122,43 +148,6 @@ public class UserServiceImpl implements UserService {
         return query;
     }
 
-    @Transactional
-    public User save(User user) {
-        if (user.getId() != null && user.getId() > 0) {
-            user.setUpdatedTime(new Date());
-        } else {
-            user.setCreatedTime(new Date());
-        }
-        return userDao.save(user);
-    }
-
-    @Transactional
-    public void deleteById(int id) {
-        userDao.delete(id);
-    }
-
-    @Transactional
-    public void delete(User user) {
-        if (user != null) {
-            userDao.delete(user);
-        }
-    }
-
-    @Override
-    public User findSchoolViewer(Integer schoolId) {
-        UserSearchQuery query = new UserSearchQuery();
-        query.setSchoolId(schoolId);
-        query.addIncludeRole(Role.SCHOOL_VIEWER);
-        query.setPageNumber(1);
-        query.setPageSize(1);
-        query = findByQuery(query);
-        if (query.getCurrentCount() > 0) {
-            return query.getResult().get(0);
-        } else {
-            return null;
-        }
-    }
-
     @Override
     @Transactional
     public User login(String loginName, String password, String ip) {
@@ -173,7 +162,28 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
-    public User findByMarkerId(Integer markerId) {
-        return userDao.findByMarkerId(markerId);
+    @Transactional
+    public User externalLogin(Integer schoolId, String account, String name, Role role) {
+        User user = userDao.findFirstBySchoolIdAndRelatedAccount(schoolId, account);
+        if (user == null) {
+            user = new User();
+            user.setLoginName(schoolId + "-X-" + account);
+            user.setName(account);
+            user.setPassword(RandomStringUtils.random(16, true, true));
+            user.setRole(role);
+            user.setSource(UserSource.EXTERNAL);
+            user.setEnable(true);
+            user.setSchoolId(schoolId);
+            user.setRelatedAccount(account);
+            user.setCreatedTime(new Date());
+            user.setUpdatedTime(new Date());
+        }
+        if (name != null) {
+            user.setName(name);
+        }
+        user.setLastLoginTime(new Date());
+        user.refreshAccessToken();
+        return userDao.save(user);
     }
+
 }

+ 20 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/query/UserSearchQuery.java

@@ -6,6 +6,7 @@ import java.util.Set;
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 
 public class UserSearchQuery extends BaseQuery<User> {
 
@@ -15,8 +16,12 @@ public class UserSearchQuery extends BaseQuery<User> {
 
     private String name;
 
+    private String relatedAccount;
+
     private Role role;
 
+    private UserSource source;
+
     private Boolean enable;
 
     private Set<Role> includeRoles;
@@ -58,6 +63,14 @@ public class UserSearchQuery extends BaseQuery<User> {
         }
     }
 
+    public String getRelatedAccount() {
+        return relatedAccount;
+    }
+
+    public void setRelatedAccount(String relatedAccount) {
+        this.relatedAccount = relatedAccount;
+    }
+
     public Role getRole() {
         return role;
     }
@@ -74,4 +87,11 @@ public class UserSearchQuery extends BaseQuery<User> {
         this.enable = enable;
     }
 
+    public UserSource getSource() {
+        return source;
+    }
+
+    public void setSource(UserSource source) {
+        this.source = source;
+    }
 }

+ 2 - 2
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/Role.java

@@ -2,8 +2,8 @@ package cn.com.qmth.stmms.common.enums;
 
 public enum Role {
 
-    SYS_ADMIN("系统管理员", 1), SCHOOL_ADMIN("学校管理员", 2), SCANNER("扫描员", 3), SUBJECT_HEADER("科组长", 4), MARKER("评卷员", 5), SCHOOL_VIEWER("学校查询员",
-            6), SCHOOL_DEV("学校接口调用", 7), OPEN_ACCOUNT("第三方账号", 8);
+    SYS_ADMIN("系统管理员", 1), SCHOOL_ADMIN("学校管理员", 2), SCANNER("扫描员", 3), SUBJECT_HEADER("科组长", 4), MARKER("评卷员",
+            5), SCHOOL_VIEWER("学校查询员", 6), SCHOOL_DEV("学校接口调用", 7);
 
     private String name;
 

+ 44 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/UserSource.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.stmms.common.enums;
+
+/**
+ * 用户来源
+ */
+public enum UserSource {
+
+    INTERNAL("内部用户", 1), EXTERNAL("外部用户", 2);
+
+    private String name;
+
+    private int value;
+
+    private UserSource(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public void setValue(int value) {
+        this.value = value;
+    }
+
+    public static UserSource findByValue(int value) {
+        for (UserSource c : UserSource.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+
+}

+ 5 - 13
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -1,20 +1,12 @@
 package cn.com.qmth.stmms.admin.dto;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.*;
+import java.util.Map.Entry;
 
 public class SubjectQuestionDTO {
 
@@ -66,7 +58,7 @@ public class SubjectQuestionDTO {
                     group = new MarkGroup(examId, subjectCode, question.getGroupNumber(),
                             PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
                             question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
-                            question.getTrialCount(), false,1);
+                            question.getTrialCount(), false, true, 1);
                     group.setQuestionMap(new HashMap<Integer, List<ExamQuestion>>());
                     groups.put(question.getGroupNumber(), group);
                 }

+ 33 - 34
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -27,6 +12,17 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedList;
+import java.util.List;
 
 public class BaseExamController extends BaseController {
 
@@ -49,14 +45,13 @@ public class BaseExamController extends BaseController {
 
     protected boolean isFinish(int examId) {
         Exam exam = examService.findById(examId);
-        return exam != null ? exam.getStatus() == ExamStatus.FINISH : false;
+        return exam != null && exam.getStatus() == ExamStatus.FINISH;
     }
 
     /**
      * 添加Flash消息
-     * 
-     * @param messages
-     *            消息
+     *
+     * @param messages 消息
      */
     protected void addMessage(RedirectAttributes redirectAttributes, String... messages) {
         StringBuilder sb = new StringBuilder();
@@ -71,10 +66,11 @@ public class BaseExamController extends BaseController {
         if (wu.isSchoolAdmin() || wu.isSchoolViewer()) {
             list = subjectService.list(examId);
         } else if (wu.isSubjectHeader()) {
-            ExamSubject subject = subjectService.find(examId, wu.getUser().getSubjectCode());
-            if (subject != null) {
-                list.add(subject);
-            }
+            //TODO - subjectHeader
+            //            ExamSubject subject = subjectService.find(examId, wu.getUser().getSubjectCode());
+            //            if (subject != null) {
+            //                list.add(subject);
+            //            }
         }
         return list;
     }
@@ -84,10 +80,11 @@ public class BaseExamController extends BaseController {
         if (wu.isSchoolAdmin()) {
             list = subjectService.list(examId, 0);
         } else if (wu.isSubjectHeader()) {
-            ExamSubject subject = subjectService.find(examId, wu.getUser().getSubjectCode());
-            if (subject != null && subject.getUploadCount() > 0) {
-                list.add(subject);
-            }
+            //TODO - subjectHeader
+            //            ExamSubject subject = subjectService.find(examId, wu.getUser().getSubjectCode());
+            //            if (subject != null && subject.getUploadCount() > 0) {
+            //                list.add(subject);
+            //            }
         }
         return list;
     }
@@ -95,14 +92,15 @@ public class BaseExamController extends BaseController {
     @SuppressWarnings("rawtypes")
     protected BaseQuery subjectFilter(BaseQuery query, WebUser wu) {
         if (wu.isSubjectHeader()) {
+            //TODO - subjectHeader subjectCode filter
             if (query instanceof ExamSubjectSearchQuery) {
-                ((ExamSubjectSearchQuery) query).setCode(wu.getUser().getSubjectCode());
+                //((ExamSubjectSearchQuery) query).setCode(wu.getUser().getSubjectCode());
             } else {
-                try {
-                    BeanUtils.setProperty(query, "subjectCode", wu.getUser().getSubjectCode());
-                } catch (Exception e) {
-
-                }
+                //                try {
+                //                    BeanUtils.setProperty(query, "subjectCode", wu.getUser().getSubjectCode());
+                //                } catch (Exception e) {
+                //
+                //                }
             }
         }
         return query;
@@ -110,7 +108,8 @@ public class BaseExamController extends BaseController {
 
     protected boolean subjectCheck(String subjectCode, WebUser wu) {
         if (wu.isSubjectHeader()) {
-            return subjectCode.equals(wu.getUser().getSubjectCode());
+            //return subjectCode.equals(wu.getUser().getSubjectCode());
+            return true;
         } else {
             return true;
         }

+ 33 - 29
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
@@ -33,6 +17,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.DecimalFormat;
+import java.util.LinkedList;
+import java.util.List;
 
 @Controller("markInfoController")
 @RequestMapping("/admin/exam/mark")
@@ -57,7 +55,7 @@ public class MarkController extends BaseExamController {
 
     /**
      * 评卷进度
-     * 
+     *
      * @param request
      * @param model
      * @param query
@@ -101,13 +99,16 @@ public class MarkController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         List<MarkGroupDTO> result = new LinkedList<MarkGroupDTO>();
-        List<MarkGroup> list = wu.isSubjectHeader() ? groupService.findByExamAndSubject(examId, wu.getUser()
-                .getSubjectCode()) : groupService.findByExam(examId);
+        List<MarkGroup> list =
+                // TODO - subjectheader check
+                //wu.isSubjectHeader() ? groupService.findByExamAndSubject(examId, wu.getUser().getSubjectCode()) :
+                groupService.findByExam(examId);
         for (MarkGroup group : list) {
-            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(),
-                    group.getNumber()));
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    group.getSubjectCode(), false, group.getNumber()));
+            group.setMarkerCount(
+                    markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(), group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                            group.getNumber()));
             MarkGroupDTO dto = new MarkGroupDTO(subjectService.find(examId, group.getSubjectCode()), group);
             result.add(dto);
         }
@@ -129,15 +130,18 @@ public class MarkController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         List<MarkerInfoDTO> result = new LinkedList<MarkerInfoDTO>();
-        List<Marker> list = wu.isSubjectHeader() ? markerService.getMarkCount(examId, wu.getUser().getSubjectCode())
-                : markerService.getMarkCount(examId);
+        List<Marker> list =
+                // TODO - subjectHeader check
+                //wu.isSubjectHeader() ? markerService.getMarkCount(examId, wu.getUser().getSubjectCode()) :
+                markerService.getMarkCount(examId);
         for (Marker marker : list) {
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    group.getSubjectCode(), false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                            group.getNumber()));
             marker.setUser(userService.findById(marker.getUserId()));
-            MarkerInfoDTO dto = new MarkerInfoDTO(marker, subjectService.find(marker.getExamId(),
-                    marker.getSubjectCode()), group);
+            MarkerInfoDTO dto = new MarkerInfoDTO(marker,
+                    subjectService.find(marker.getExamId(), marker.getSubjectCode()), group);
             result.add(dto);
         }
 

+ 65 - 81
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -1,18 +1,25 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
+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.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+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;
+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;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JsonConfig;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -27,40 +34,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-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.Exam;
-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.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-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.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.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-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;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
-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;
+import javax.servlet.http.HttpServletRequest;
+import java.text.DecimalFormat;
+import java.util.*;
 
 @Controller("markGroupController")
 @RequestMapping("/admin/exam/group")
@@ -107,17 +83,20 @@ public class MarkGroupController extends BaseExamController {
         if (subject == null) {
             return "redirect:/admin/exam/mark";
         }
-        if (wu.isSubjectHeader() && !subjectCode.equals(wu.getUser().getSubjectCode())) {
+        if (wu.isSubjectHeader()
+            //TODO - subjectHeader check
+            //&& !subjectCode.equals(wu.getUser().getSubjectCode())
+        ) {
             return "redirect:/admin/exam/mark";
         }
         List<MarkGroup> list = groupService.findByExamAndSubject(examId, subjectCode);
         for (MarkGroup group : list) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
             group.setCurrentCount(markService.applyCount(group));
-            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
-                    .getLibraryCount()) : 0;
+            int percent =
+                    group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount()) : 0;
             group.setPercent(percent);
         }
         model.addAttribute("resultList", list);
@@ -134,13 +113,14 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Boolean withDouble, @RequestParam(required = false) MarkStatus status) {
         int examId = getSessionExamId(request);
         JSONArray array = new JSONArray();
-        List<MarkGroup> list = withDouble != null && withDouble ? groupService.findByExamAndSubjectWithDouble(examId,
-                subjectCode) : (status != null ? groupService
-                .findByExamAndSubjectAndStatus(examId, subjectCode, status) : groupService.findByExamAndSubject(examId,
-                subjectCode));
+        List<MarkGroup> list = withDouble != null && withDouble ?
+                groupService.findByExamAndSubjectWithDouble(examId, subjectCode) :
+                (status != null ?
+                        groupService.findByExamAndSubjectAndStatus(examId, subjectCode, status) :
+                        groupService.findByExamAndSubject(examId, subjectCode));
         for (MarkGroup group : list) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             JSONObject obj = new JSONObject();
             obj.accumulate("number", group.getNumber());
             obj.accumulate("title", group.getTitle());
@@ -277,13 +257,12 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             model.addAttribute("group", group);
-            model.addAttribute(
-                    "questions",
-                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), false, group.getNumber()));
+            model.addAttribute("questions", questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
+                            group.getNumber()));
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
@@ -306,13 +285,14 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, number));
+            group.setQuestionList(
+                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number));
             List<MarkGroup> questionList = new ArrayList<MarkGroup>();
             String[] mainNumbers = group.getMainNumber().split(",");
             for (String mainNumber : mainNumbers) {
-                List<ExamQuestion> list = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
-                        subjectCode, false, Integer.parseInt(mainNumber));
+                List<ExamQuestion> list = questionService
+                        .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
+                                Integer.parseInt(mainNumber));
                 StringBuilder score = new StringBuilder();
                 DecimalFormat format = new DecimalFormat("####.###");
                 String title = "";
@@ -382,7 +362,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) MarkMode markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam(required = false) boolean sheetView, @RequestParam(required = false) String questionDetail,
+            @RequestParam boolean sheetView, @RequestParam boolean enableAllZero,
+            @RequestParam(required = false) String questionDetail,
             @RequestParam(required = false) String intervalScoreList) {
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -393,10 +374,10 @@ public class MarkGroupController extends BaseExamController {
                     questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
                     JSONArray array = JSONArray.fromObject(questionDetail);
                     List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
-                    List<ExamQuestion> all = questionService.findByExamAndSubjectAndObjective(examId, subjectCode,
-                            false);
-                    List<ExamQuestion> old = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                            subjectCode, false, number);
+                    List<ExamQuestion> all = questionService
+                            .findByExamAndSubjectAndObjective(examId, subjectCode, false);
+                    List<ExamQuestion> old = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     Set<Integer> mainNumbers = new HashSet<Integer>();
                     for (ExamQuestion examQuestion : all) {
                         mainNumbers.add(examQuestion.getMainNumber());
@@ -421,8 +402,8 @@ public class MarkGroupController extends BaseExamController {
                     }
                     if (detailList != null && detailList.size() > 0) {
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
-                        ThirdPolicy third = thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy)
-                                : ThirdPolicy.DISABLE;
+                        ThirdPolicy third =
+                                thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
                         try {
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                                     group.getNumber());
@@ -438,8 +419,8 @@ public class MarkGroupController extends BaseExamController {
                 } else {
                     // simple update
                     List<Double> intervalScores = buildDoubleList(intervalScoreList);
-                    List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                            examId, subjectCode, false, number);
+                    List<ExamQuestion> questionList = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     if (intervalScores.size() == questionList.size()) {
                         for (int i = 0; i < questionList.size(); i++) {
                             ExamQuestion q = questionList.get(i);
@@ -466,6 +447,7 @@ public class MarkGroupController extends BaseExamController {
                     groupService.updateTrialCount(examId, subjectCode, number, trialCount);
                 }
                 groupService.updateSheetView(examId, subjectCode, number, sheetView);
+                groupService.updateEnableAllZero(examId, subjectCode, number, enableAllZero);
                 redirectAttributes.addAttribute("subjectCode", subjectCode);
                 redirectAttributes.addAttribute("number", number);
                 return "redirect:/admin/exam/group";
@@ -495,8 +477,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam String picList, @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
-            @RequestParam(required = false) String markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam(required = false) boolean sheetView) {
+            @RequestParam(required = false) String markMode, @RequestParam Integer trialCount,
+            @RequestParam boolean sheetView, @RequestParam boolean enableAllZero) {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -545,15 +527,16 @@ public class MarkGroupController extends BaseExamController {
                         }
                     }
                     group = new MarkGroup(examId, subjectCode, number, picConfigList, 0d, doubleRate,
-                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, thirdPolicy);
+                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, enableAllZero,
+                            thirdPolicy);
                     // clear and replace exam_question
                     questionService
                             .deleteByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     List<ExamQuestion> list = buildQuestionList(group, detailList);
                     questionService.save(list);
                     groupService.save(group);
-                    subjectService.updateScore(examId, subjectCode, false,
-                            groupService.sumTotalScore(examId, subjectCode));
+                    subjectService
+                            .updateScore(examId, subjectCode, false, groupService.sumTotalScore(examId, subjectCode));
                     redirectAttributes.addAttribute("subjectCode", subjectCode);
                     return "redirect:/admin/exam/group";
                 } else {
@@ -611,8 +594,9 @@ public class MarkGroupController extends BaseExamController {
 
     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());
+        List<String> picUrls = PictureUrlBuilder
+                .getSliceUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
+                        examStudent.getExamNumber(), examStudent.getSliceCount());
         return picUrls;
     }
 

+ 260 - 218
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,56 +1,41 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-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.PathVariable;
-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 org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 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.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.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
-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.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.MarkerExcelError;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
-import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
 import com.google.common.collect.Lists;
+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.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 
 @Controller("examMarkerController")
 @RequestMapping("/admin/exam/marker")
@@ -58,8 +43,6 @@ public class MarkerController extends BaseExamController {
 
     protected static Logger log = LoggerFactory.getLogger(MarkerController.class);
 
-    public static final String USER_PASSWORD = "123456";
-
     @Autowired
     private UserService userService;
 
@@ -93,7 +76,6 @@ public class MarkerController extends BaseExamController {
     @Value("${marker.showBtnImportAndBtnUpdateImport}")
     private String showBtnImport;
 
-    @Logging(menu = "评卷员查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -105,11 +87,13 @@ public class MarkerController extends BaseExamController {
         for (Marker marker : query.getResult()) {
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    marker.getSubjectCode(), false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, marker.getSubjectCode(), false,
+                            group.getNumber()));
             marker.setGroup(group);
             marker.setMarkedCount(markService.markedCount(marker));
             marker.setCurrentCount(markService.applyCount(marker));
+            marker.setUser(userService.findById(marker.getUserId()));
         }
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
@@ -125,16 +109,16 @@ public class MarkerController extends BaseExamController {
         JSONArray array = new JSONArray();
         List<Marker> list = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
         for (Marker marker : list) {
+            User user = userService.findById(marker.getUserId());
             JSONObject obj = new JSONObject();
             obj.accumulate("id", marker.getId());
-            // obj.accumulate("loginName", marker.getLoginName());
-            // obj.accumulate("name", marker.getName());
+            obj.accumulate("loginName", user.getAccount());
+            obj.accumulate("name", user.getName());
             array.add(obj);
         }
         return array;
     }
 
-    @Logging(menu = "评卷员回收任务", type = LogType.UPDATE)
     @RequestMapping("/release")
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -176,7 +160,6 @@ public class MarkerController extends BaseExamController {
         return "modules/exam/markerCreate";
     }
 
-    @Logging(menu = "创建评卷员", type = LogType.ADD)
     @RequestMapping(value = "/batch-create", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView create(HttpServletRequest request, @RequestParam String subjectCode,
@@ -186,7 +169,7 @@ public class MarkerController extends BaseExamController {
         ExamSubject subject = subjectService.find(examId, subjectCode);
         ModelAndView view = new ModelAndView("redirect:/admin/exam/marker");
         if (subject != null && count > 0) {
-            // markerService.batchCreate(subject, groupNumber, count, password);
+            markerService.batchCreate(subject, groupNumber, count, password);
         }
         view.addObject("subjectCode", subjectCode);
         if (groupNumber > 0) {
@@ -195,15 +178,14 @@ public class MarkerController extends BaseExamController {
         return view;
     }
 
-    @Logging(menu = "评卷员重置", type = LogType.UPDATE)
     @RequestMapping(value = "/reset")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String resetMarker(@RequestParam Integer id, Model model, RedirectAttributes redirectAttributes) {
         Marker marker = markerService.findById(id);
         if (marker != null) {
             try {
-                lockService.waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber());
+                lockService
+                        .waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
                 lockService.waitlock(LockType.MARKER, marker.getId());
 
                 markService.resetMarker(marker);
@@ -221,7 +203,6 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker";
     }
 
-    @Logging(menu = "评卷员重置", type = LogType.UPDATE)
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -230,8 +211,8 @@ public class MarkerController extends BaseExamController {
         JSONObject obj = new JSONObject();
         if (marker != null) {
             try {
-                lockService.waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber());
+                lockService
+                        .waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
                 lockService.waitlock(LockType.MARKER, marker.getId());
 
                 markService.resetMarker(marker);
@@ -252,7 +233,6 @@ public class MarkerController extends BaseExamController {
         return obj;
     }
 
-    @Logging(menu = "评卷员禁用/启用", type = LogType.UPDATE)
     @RequestMapping(value = "/toggle", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -270,7 +250,6 @@ public class MarkerController extends BaseExamController {
         return obj;
     }
 
-    @Logging(menu = "评卷员导出", type = LogType.EXPORT)
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public String exportFile(MarkerSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
@@ -294,8 +273,9 @@ public class MarkerController extends BaseExamController {
                 }
                 MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
                 if (group != null) {
-                    group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                            group.getSubjectCode(), false, group.getNumber()));
+                    group.setQuestionList(questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                                    group.getNumber()));
                     marker.setGroupName(group.getNumber() + "-" + group.getTitle());
                 } else {
                     marker.setGroupName("");
@@ -309,25 +289,6 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker?repage";
     }
 
-    @Logging(menu = "评卷员重置密码", type = LogType.UPDATE)
-    @RequestMapping(value = "/reSetPassword", method = RequestMethod.POST)
-    @ResponseBody
-    public JSONObject reSetPassword(@RequestParam Integer id, @RequestParam String password) {
-        Marker marker = markerService.findById(id);
-        User user = userService.findById(marker.getUserId());
-        JSONObject obj = new JSONObject();
-        if (user != null) {
-            user.setPassword(Md5EncryptUtils.md5(password));
-            user = userService.save(user);
-            obj.accumulate("success", true);
-        } else {
-            obj.accumulate("success", false);
-            obj.accumulate("message", "该评卷员不存在");
-        }
-        return obj;
-    }
-
-    @Logging(menu = "评卷员设置任务数量", type = LogType.UPDATE)
     @RequestMapping(value = "/setTaskCount", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject setTaskCount(@RequestParam Integer id, @RequestParam Integer taskCount) {
@@ -358,105 +319,192 @@ public class MarkerController extends BaseExamController {
         return "redirect:" + "/admin/exam/marker";
     }
 
-    @Logging(menu = "评卷员导入", type = LogType.IMPORT_FILE)
+    @RequestMapping(value = "/updateLoginNameTemplate")
+    public String updateLoginNameTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "评卷员账号修改导入模板.xlsx";
+            List<MarkerDTO> list = Lists.newArrayList();
+            list.add(new MarkerDTO());
+            new ExportExcel("评卷员账号修改数据", MarkerDTO.class, 2).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:" + "/admin/exam/marker";
+    }
+
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode) {
-        // int examId = getSessionExamId(request);
-        // try {
-        // int successNum = 0;
-        // int failureNum = 0;
-        // StringBuilder failureMsg = new StringBuilder();
-        // ImportExcel ei = new ImportExcel(file, 1, 0);
-        // List<Marker> list = ei.getDataList(Marker.class);
-        // List<Marker> saveList = new LinkedList<Marker>();
-        // Map<String, Marker> saveMap = new HashMap<String, Marker>();
-        // Map<String, ExamSubject> current = null;
-        // current = new HashMap<String, ExamSubject>();
-        // List<ExamSubject> list2 = subjectService.list(examId);
-        // for (ExamSubject s : list2) {
-        // current.put(s.getCode(), s);
-        // }
-        // for (Marker marker : list) {
-        // String password = "";
-        // if (StringUtils.isBlank(marker.getSubjectCode()) ||
-        // StringUtils.isBlank(marker.getLoginName())) {
-        // continue;
-        // }
-        // marker.setExamId(examId);
-        // marker.setName(marker.getLoginName());
-        // marker.setEnable(true);
-        // marker.setClassCount(0);
-        // if (StringUtils.isBlank(marker.getPassword())) {
-        // Random random = new Random();
-        // for (int i = 0; i < 6; i++) {
-        // password += random.nextInt(10);
-        // }
-        // marker.setPassword(password);
-        // }
-        // MarkerExcelError markerExcelError = checkLongNameAndPassword(marker,
-        // current, saveMap);
-        // if (markerExcelError.equals(MarkerExcelError.MARKER)) {
-        // saveList.add(marker);
-        // saveMap.put(marker.getLoginName(), marker);
-        // } else {
-        // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-        // markerExcelError.getName());
-        // failureNum++;
-        // }
-        // }
-        // successNum = markerService.batchSave(saveList);
-        // if (failureNum > 0) {
-        // failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
-        // }
-        // String message = "已成功导入 " + successNum + " 条评卷员 ";
-        // addMessage(redirectAttributes, message + failureMsg);
-        // RequestUtils.setLog(request, message);
-        // } catch (Exception e) {
-        // log.error("Batch import marker error!", e);
-        // addMessage(redirectAttributes, "导入评卷员失败!失败信息:" + e.getMessage());
-        // }
+        int examId = getSessionExamId(request);
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<Marker> list = ei.getDataList(Marker.class);
+            List<Marker> saveList = new LinkedList<Marker>();
+            Map<String, Marker> saveMap = new HashMap<String, Marker>();
+            Map<String, ExamSubject> current = null;
+            current = new HashMap<String, ExamSubject>();
+            List<ExamSubject> list2 = subjectService.list(examId);
+            for (ExamSubject s : list2) {
+                current.put(s.getCode(), s);
+            }
+            for (Marker marker : list) {
+                String password = "";
+                if (StringUtils.isBlank(marker.getSubjectCode()) || StringUtils.isBlank(marker.getLoginName())) {
+                    continue;
+                }
+                marker.setExamId(examId);
+                marker.setName(marker.getLoginName());
+                marker.setEnable(true);
+                marker.setClassCount(0);
+                if (StringUtils.isBlank(marker.getPassword())) {
+                    Random random = new Random();
+                    for (int i = 0; i < 6; i++) {
+                        password += random.nextInt(10);
+                    }
+                    marker.setPassword(password);
+                }
+                MarkerExcelError markerExcelError = checkLongNameAndPassword(marker, current, saveMap);
+                if (markerExcelError.equals(MarkerExcelError.MARKER)) {
+                    saveList.add(marker);
+                    saveMap.put(marker.getLoginName(), marker);
+                } else {
+                    failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + markerExcelError.getName());
+                    failureNum++;
+                }
+            }
+            successNum = markerService.batchSave(saveList);
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
+            }
+            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条评卷员" + failureMsg);
+        } catch (Exception e) {
+            log.error("Batch import marker error!", e);
+            addMessage(redirectAttributes, "导入评卷员失败!失败信息:" + e.getMessage());
+        }
         return "redirect:" + "/admin/exam/marker?subjectCode=" + subjectCode;
     }
 
-    // private MarkerExcelError checkLongNameAndPassword(Marker marker,
-    // Map<String, ExamSubject> current,
-    // Map<String, Marker> saveMap) {
-    // Marker previous = null;
-    //
-    // if (current != null && current.get(marker.getSubjectCode()) == null) {
-    // return MarkerExcelError.MARKERNOTCODE;
-    // }
-    // MarkGroup group = groupService.findOne(marker.getExamId(),
-    // marker.getSubjectCode(),
-    // Integer.valueOf(marker.getGroupName()));
-    // if (group == null) {
-    // return MarkerExcelError.MARKERNOTGROUP;
-    // } else {
-    // marker.setGroupNumber(Integer.valueOf(marker.getGroupName()));
-    // }
-    // if (saveMap != null) {
-    // previous = saveMap.get(marker.getLoginName());
-    // }
-    //
-    // if (previous != null) {
-    // return MarkerExcelError.MARKERED;
-    // }
-    //
-    // previous = markerService.findByLoginName(marker.getLoginName());
-    //
-    // if (marker.getPassword().length() > 0 && marker.getPassword().length() <
-    // 4) {
-    // return MarkerExcelError.MARKERPWERROR;
-    // }
-    //
-    // if (previous == null) {
-    // return MarkerExcelError.MARKER;
-    // }
-    // return MarkerExcelError.MARKERED;
-    // }
+    @RequestMapping(value = "/importUpdate", method = RequestMethod.POST)
+    public String importUpdateFile(HttpServletRequest request, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<MarkerDTO> list = ei.getDataList(MarkerDTO.class);
+            List<Marker> saveList = new LinkedList<Marker>();
+            Map<String, Marker> current = null;
+            List<Marker> list2 = markerService.findMode("common");
+            if (list2.size() < 10000) {
+                current = new HashMap<String, Marker>();
+                for (Marker s : list2) {
+                    current.put(s.getLoginName(), s);
+                }
+            }
+            for (MarkerDTO markerDTO : list) {
+                if (StringUtils.isBlank(markerDTO.getSubjectCode()) || StringUtils.isBlank(markerDTO.getLoginName())
+                        || StringUtils.isBlank(markerDTO.getNewLoginName()) || StringUtils
+                        .isBlank(markerDTO.getPassword())) {
+                    continue;
+                }
+                MarkerExcelError markerExcelError = checkExcelData(markerDTO, current);
+                if (markerExcelError.equals(MarkerExcelError.MARKER)) {
+                    Marker marker = null;
+                    if (current != null) {
+                        marker = current.get(markerDTO.getLoginName());
+                    } else {
+                        marker = markerService.findByLoginName(markerDTO.getLoginName());
+                    }
+                    marker.setLoginName(markerDTO.getNewLoginName());
+                    marker.setPassword(markerDTO.getPassword());
+                    saveList.add(marker);
+                } else {
+                    failureMsg.append("<br/>科目代码(" + markerDTO.getSubjectCode() + ")原评卷员(" + markerDTO.getLoginName()
+                            + ")更换新评卷员为(" + markerDTO.getNewLoginName() + ")失败!");
+                    failureMsg.append("---->失败原因:(" + markerExcelError.getName() + ")");
+                    failureNum++;
+                }
+            }
+            successNum = markerService.batchSave(saveList);
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
+            }
+            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条" + failureMsg);
+        } catch (Exception e) {
+            log.error("Batch import marker error!", e);
+            addMessage(redirectAttributes, "导入修改评卷员账号失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:" + "/admin/exam/marker";
+    }
+
+    private MarkerExcelError checkLongNameAndPassword(Marker marker, Map<String, ExamSubject> current,
+            Map<String, Marker> saveMap) {
+        Marker previous = null;
+
+        if (current != null && current.get(marker.getSubjectCode()) == null) {
+            return MarkerExcelError.MARKERNOTCODE;
+        }
+        MarkGroup group = groupService
+                .findOne(marker.getExamId(), marker.getSubjectCode(), Integer.valueOf(marker.getGroupName()));
+        if (group == null) {
+            return MarkerExcelError.MARKERNOTGROUP;
+        } else {
+            marker.setGroupNumber(Integer.valueOf(marker.getGroupName()));
+        }
+        if (saveMap != null) {
+            previous = saveMap.get(marker.getLoginName());
+        }
+
+        if (previous != null) {
+            return MarkerExcelError.MARKERED;
+        }
+
+        previous = markerService.findByLoginName(marker.getLoginName());
+
+        if (marker.getPassword().length() > 0 && marker.getPassword().length() < 4) {
+            return MarkerExcelError.MARKERPWERROR;
+        }
+
+        if (previous == null) {
+            return MarkerExcelError.MARKER;
+        }
+        return MarkerExcelError.MARKERED;
+    }
 
     // 校验excel中数据
+    public MarkerExcelError checkExcelData(MarkerDTO markerDTO, Map<String, Marker> current) {
+        if (markerDTO != null) {
+            Marker marker = null;
+            if (current == null) {
+                marker = markerService.findByLoginName(markerDTO.getLoginName());
+            } else {
+                marker = current.get(markerDTO.getLoginName());
+            }
+            if (markerDTO.getPassword().length() < 4) {
+                return MarkerExcelError.MARKERPWERROR;
+            }
+            if (marker != null) {
+                if (marker.getSubjectCode().equals(markerDTO.getSubjectCode())) {
+                    if (markerService.countByLoginName(markerDTO.getNewLoginName()) > 0) {
+                        return MarkerExcelError.MARKERNEWMISS;
+                    } else {
+                        return MarkerExcelError.MARKER;
+                    }
+                } else {
+                    return MarkerExcelError.MARKERCODEMISS;
+                }
+            } else {
+                return MarkerExcelError.MARKERMISS;
+            }
+        } else {
+            return MarkerExcelError.MARKERNOTINFO;
+        }
+    }
 
     @RequestMapping(value = "/class/{markerId}", method = RequestMethod.GET)
     public String classAdd(@PathVariable Integer markerId, Model model, RedirectAttributes redirectAttributes) {
@@ -474,67 +522,61 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker";
     }
 
-    @Logging(menu = "评卷员班级绑定", type = LogType.UPDATE)
     @RequestMapping(value = "/class/{markerId}", method = RequestMethod.POST)
     public String classSave(@PathVariable Integer markerId, @RequestParam(required = false) String[] classes,
             Model model, RedirectAttributes redirectAttributes) {
         Marker marker = markerService.findById(markerId);
         if (marker != null) {
             classService.save(marker, classes);
-            addMessage(redirectAttributes, "保存成功");
-            return "redirect:" + "/admin/exam/marker?subjectCode=" + marker.getSubjectCode() + "&groupNumber="
-                    + marker.getGroupNumber();
+            addMessage(redirectAttributes, "保存'" + marker.getLoginName() + "'成功");
+            return "redirect:" + "/admin/exam/marker?subjectCode=" + marker.getSubjectCode() + "&groupNumber=" + marker
+                    .getGroupNumber();
         }
         addMessage(redirectAttributes, "评卷员不存在");
         return "redirect:/admin/exam/marker";
     }
 
-    // @RequestMapping(value = "/account/{markerId}")
-    // public String editAccount(HttpServletRequest request, Model model,
-    // RedirectAttributes redirectAttributes,
-    // @PathVariable Integer markerId) {
-    // Exam exam = examService.findById(getSessionExamId(request));
-    // Marker marker = markerService.findById(markerId);
-    // if (exam != null && marker != null &&
-    // exam.getId().equals(marker.getExamId())) {
-    // model.addAttribute("marker", marker);
-    // model.addAttribute("openAccountList",
-    // userService.listUnbindOpenAccount(exam.getSchoolId(),
-    // marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber()));
-    // return "modules/exam/markerAccount";
-    // }
-    // addMessage(redirectAttributes, "评卷员不存在");
-    // return "redirect:/admin/exam/marker";
-    // }
-
-    // @RequestMapping(value = "/account/bind", method = RequestMethod.POST)
-    // @ResponseBody
-    // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    // public boolean bindAccount(@RequestParam Integer markerId, @RequestParam
-    // Integer accountId) {
-    // Marker marker = markerService.findById(markerId);
-    // if (marker == null) {
-    // return false;
-    // }
-    // OpenAccount oa = userService.findOpenAccount(accountId);
-    // if (oa == null || !oa.isEnable()) {
-    // return false;
-    // }
-    // if
-    // (markerService.countByExamAndSubjectAndGroupAndOpenAccount(marker.getExamId(),
-    // marker.getSubjectCode(),
-    // marker.getGroupNumber(), accountId) == 0) {
-    // markerService.updateOpenAccountById(markerId, accountId);
-    // return true;
-    // }
-    // return false;
-    // }
-
-    // @RequestMapping(value = "/account/unbind", method = RequestMethod.POST)
-    // @ResponseBody
-    // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    // public boolean unbindOpenAccount(@RequestParam Integer markerId) {
-    // markerService.updateOpenAccountById(markerId, null);
-    // return true;
-    // }
+    @RequestMapping(value = "/account/{markerId}")
+    public String editAccount(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
+            @PathVariable Integer markerId) {
+        Exam exam = examService.findById(getSessionExamId(request));
+        Marker marker = markerService.findById(markerId);
+        if (exam != null && marker != null && exam.getId().equals(marker.getExamId())) {
+            model.addAttribute("marker", marker);
+            model.addAttribute("openAccountList", userService
+                    .listUnbindOpenAccount(exam.getSchoolId(), marker.getExamId(), marker.getSubjectCode(),
+                            marker.getGroupNumber()));
+            return "modules/exam/markerAccount";
+        }
+        addMessage(redirectAttributes, "评卷员不存在");
+        return "redirect:/admin/exam/marker";
+    }
+
+    @RequestMapping(value = "/account/bind", method = RequestMethod.POST)
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public boolean bindAccount(@RequestParam Integer markerId, @RequestParam Integer accountId) {
+        Marker marker = markerService.findById(markerId);
+        if (marker == null) {
+            return false;
+        }
+        OpenAccount oa = userService.findOpenAccount(accountId);
+        if (oa == null || !oa.isEnable()) {
+            return false;
+        }
+        if (markerService.countByExamAndSubjectAndGroupAndOpenAccount(marker.getExamId(), marker.getSubjectCode(),
+                marker.getGroupNumber(), accountId) == 0) {
+            markerService.updateOpenAccountById(markerId, accountId);
+            return true;
+        }
+        return false;
+    }
+
+    @RequestMapping(value = "/account/unbind", method = RequestMethod.POST)
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public boolean unbindOpenAccount(@RequestParam Integer markerId) {
+        markerService.updateOpenAccountById(markerId, null);
+        return true;
+    }
 }

+ 28 - 31
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -1,32 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-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;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-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 org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
@@ -50,6 +23,26 @@ 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.RequestUtils;
+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;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 @Controller("examPaperController")
 @RequestMapping("/admin/exam/paper")
@@ -103,7 +96,10 @@ public class PaperController extends BaseExamController {
             @RequestParam(required = false) Boolean objective) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if (wu.isSubjectHeader() && !subjectCode.equals(wu.getUser().getSubjectCode())) {
+        if (wu.isSubjectHeader()
+            // TODO - subjectheader check
+            //&&!subjectCode.equals(wu.getUser().getSubjectCode())
+        ) {
             return "redirect:/admin/exam/paper";
         }
         ExamSubject subject = subjectService.find(examId, subjectCode);
@@ -168,9 +164,10 @@ public class PaperController extends BaseExamController {
         query.setPageSize(Integer.MAX_VALUE);
         query = questionService.findByQuery(query);
         for (ExamQuestion q : query.getResult()) {
-            list.add(objective ? new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()))
-                    : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()), groupMap.get(q.getSubjectCode()
-                            + "_" + q.getGroupNumber())));
+            list.add(objective ?
+                    new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode())) :
+                    new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()),
+                            groupMap.get(q.getSubjectCode() + "_" + q.getGroupNumber())));
         }
         try {
             String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";

+ 18 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectClassController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
@@ -25,6 +9,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程班级成绩分析
@@ -47,7 +45,8 @@ public class ReportSubjectClassController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -68,7 +67,8 @@ public class ReportSubjectClassController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);

+ 18 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectCollegeController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
@@ -25,6 +9,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程学院成绩分析
@@ -47,7 +45,8 @@ public class ReportSubjectCollegeController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -68,7 +67,8 @@ public class ReportSubjectCollegeController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);

+ 17 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectController.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
@@ -24,6 +9,19 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程总量统计
@@ -47,7 +45,8 @@ public class ReportSubjectController extends BaseExamController {
         int examId = getSessionExamId(request);
         query.setExamId(examId);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query = reportSubjectService.findByQuery(query);
         if (query.getCurrentCount() > 0) {
@@ -65,7 +64,8 @@ public class ReportSubjectController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);

+ 18 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectGroupController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
@@ -27,6 +11,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 大题统计分析
@@ -52,7 +50,8 @@ public class ReportSubjectGroupController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -75,7 +74,8 @@ public class ReportSubjectGroupController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);

+ 20 - 20
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectQuestionController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
@@ -26,6 +10,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 客、主观题 成绩分析
@@ -51,7 +49,8 @@ public class ReportSubjectQuestionController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -73,7 +72,8 @@ public class ReportSubjectQuestionController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -87,8 +87,8 @@ public class ReportSubjectQuestionController extends BaseExamController {
         }
         String fileName = query.getObjective() ? "客观题统计分析.xlsx" : "主观题统计分析.xlsx";
         try {
-            new ExportExcel(query.getObjective() ? "客观题统计分析" : "主观题统计分析", ReportSubjectQuestion.class)
-                    .setDataList(list).write(response, fileName).dispose();
+            new ExportExcel(query.getObjective() ? "客观题统计分析" : "主观题统计分析", ReportSubjectQuestion.class).setDataList(list)
+                    .write(response, fileName).dispose();
             return null;
         } catch (Exception e) {
             addMessage(redirectAttributes, "导出成绩失败!" + e.getMessage());

+ 31 - 26
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
@@ -24,6 +9,19 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程分段统计
@@ -48,7 +46,8 @@ public class ReportSubjectRangeController extends BaseExamController {
         // reportSubjectRangeService.saveReportRangeSubjectData(1);
         query.setExamId(examId);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query = reportSubjectRangeService.findByQuery(query);
         if (query.getCurrentCount() > 0) {
@@ -66,7 +65,8 @@ public class ReportSubjectRangeController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -75,15 +75,20 @@ public class ReportSubjectRangeController extends BaseExamController {
         List<ReportSubjectRange> list = query.getResult();
         for (ReportSubjectRange r : list) {
             r.setPercent0_49(new BigDecimal(r.getPercent0_49() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent50_59(new BigDecimal(r.getPercent50_59() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent60_69(new BigDecimal(r.getPercent60_69() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent70_79(new BigDecimal(r.getPercent70_79() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent80_89(new BigDecimal(r.getPercent80_89() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent90_100(new BigDecimal(r.getPercent90_100() * 100).setScale(2, RoundingMode.HALF_UP)
-                    .doubleValue());
-            r.setPercent_lt60(new BigDecimal(r.getPercent_lt60() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent_mte60(new BigDecimal(r.getPercent_mte60() * 100).setScale(2, RoundingMode.HALF_UP)
-                    .doubleValue());
+            r.setPercent50_59(
+                    new BigDecimal(r.getPercent50_59() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent60_69(
+                    new BigDecimal(r.getPercent60_69() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent70_79(
+                    new BigDecimal(r.getPercent70_79() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent80_89(
+                    new BigDecimal(r.getPercent80_89() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent90_100(
+                    new BigDecimal(r.getPercent90_100() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent_lt60(
+                    new BigDecimal(r.getPercent_lt60() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent_mte60(
+                    new BigDecimal(r.getPercent_mte60() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
         }
         String fileName = "课程分段统计.xlsx";
         try {

+ 20 - 20
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherClassController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
@@ -27,6 +11,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程老师班级 成绩分析
@@ -52,7 +50,8 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -77,7 +76,8 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -87,8 +87,8 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
             r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP)
-                    .doubleValue());
+            r.setRelativeAvgScore(
+                    new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
         }
         String fileName = "课程老师班级成绩分析.xlsx";
         try {

+ 20 - 20
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.report;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
@@ -25,6 +9,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 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.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
 
 /**
  * 课程老师成绩分析
@@ -47,7 +45,8 @@ public class ReportSubjectTeacherController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -68,7 +67,8 @@ public class ReportSubjectTeacherController extends BaseExamController {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         if (webuser.isSubjectHeader()) {
-            query.setSubjectCode(webuser.getUser().getSubjectCode());
+            // TODO - subjectheader check
+            //query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
         query.setPageNumber(1);
@@ -78,8 +78,8 @@ public class ReportSubjectTeacherController extends BaseExamController {
             r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP)
-                    .doubleValue());
+            r.setRelativeAvgScore(
+                    new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
         }
         String fileName = "课程老师成绩分析.xlsx";
         try {

+ 165 - 161
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -1,161 +1,165 @@
-package cn.com.qmth.stmms.admin.user;
-
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-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.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.biz.user.service.UserService;
-import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.controller.BaseController;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller
-@RequestMapping("/admin/user")
-public class UserController extends BaseController {
-
-    public static Role[] roleList = { Role.SCANNER, Role.SUBJECT_HEADER };
-
-    @Autowired
-    private UserService userService;
-
-    @Logging(menu = "查询用户", type = LogType.QUERY)
-    @RequestMapping("/list")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView list(HttpServletRequest request, UserSearchQuery query) {
-        User user = RequestUtils.getWebUser(request).getUser();
-        query.setSchoolId(user.getSchoolId());
-        query = userService.findByQuery(query);
-
-        ModelAndView view = new ModelAndView("modules/user/userList");
-        view.addObject("roleList", roleList);
-        view.addObject("query", query);
-        return view;
-    }
-
-    @Logging(menu = "删除用户", type = LogType.DELETE)
-    @RequestMapping("/delete")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String delete(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam Integer id) {
-        User current = RequestUtils.getWebUser(request).getUser();
-        User user = userService.findById(id);
-        String message = null;
-        if (user == null) {
-            message = "找不到指定用户";
-        } else if (!user.getSchoolId().equals(current.getSchoolId()) || user.getId().equals(current.getId())) {
-            message = "不能删除指定用户";
-        } else {
-            userService.delete(user);
-            message = "删除成功";
-        }
-        redirectAttributes.addFlashAttribute("message", message);
-        RequestUtils.setLog(request, message + "id:" + id);
-        return "redirect:/admin/user/list";
-    }
-
-    @RequestMapping(value = "/add", method = RequestMethod.GET)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView addInit(HttpServletRequest request) {
-        ModelAndView view = new ModelAndView("modules/user/userEdit");
-        User user = new User();
-        user.setEnable(true);
-        view.addObject("user", user);
-        view.addObject("roleList", roleList);
-        return view;
-    }
-
-    @RequestMapping(value = "/edit", method = RequestMethod.GET)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView editInit(HttpServletRequest request, @RequestParam Integer id) {
-        User current = RequestUtils.getWebUser(request).getUser();
-        User user = userService.findById(id);
-        if (user != null && user.getSchoolId().equals(current.getSchoolId())) {
-            ModelAndView view = new ModelAndView("modules/user/userEdit");
-            view.addObject("user", user);
-            view.addObject("roleList", roleList);
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/user/list");
-        }
-    }
-
-    @Logging(menu = "新增(修改)用户", type = LogType.UPDATE)
-    @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String save(HttpServletRequest request, Model model, User user) {
-        User current = RequestUtils.getWebUser(request).getUser();
-        User previous = null;
-        if (user.getId() != null) {
-            previous = userService.findById(user.getId());
-        }
-        if (previous == null) {
-            String message = validate(user);
-            if (message == null) {
-                user.setPassword(Md5EncryptUtils.md5(user.getPassword()));
-                user.setSchoolId(current.getSchoolId());
-                user.setCreatedTime(new Date());
-                userService.save(user);
-            } else {
-                model.addAttribute("user", user);
-                model.addAttribute("roleList", roleList);
-                model.addAttribute("message", message);
-                return "modules/user/userEdit";
-            }
-        } else if (previous.getSchoolId().equals(current.getSchoolId())) {
-            previous.setLoginName(user.getLoginName());
-            previous.setName(user.getName());
-            previous.setRole(user.getRole());
-            if (StringUtils.isNotBlank(user.getPassword())) {
-                previous.setPassword(Md5EncryptUtils.md5(user.getPassword()));
-            }
-            if (previous.getRole() != Role.SUBJECT_HEADER) {
-                previous.setSubjectCode(null);
-            } else {
-                previous.setSubjectCode(user.getSubjectCode());
-            }
-            previous.setEnable(user.isEnable());
-            String message = validate(previous);
-            if (message == null) {
-                previous.setUpdatedTime(new Date());
-                userService.save(previous);
-            } else {
-                model.addAttribute("user", previous);
-                model.addAttribute("roleList", roleList);
-                model.addAttribute("message", message);
-                return "modules/user/userEdit";
-            }
-        }
-        return "redirect:/admin/user/list";
-    }
-
-    private String validate(User user) {
-        String message = null;
-        if (StringUtils.isBlank(user.getLoginName())) {
-            message = "登录名不能为空";
-        } else if (!checkLoginName(user)) {
-            message = "登录名不能重复";
-        } else if (StringUtils.isBlank(user.getName())) {
-            message = "名称不能为空";
-        } else if (StringUtils.isBlank(user.getPassword())) {
-            message = "密码不能为空";
-        } else if (user.getRole() == Role.SUBJECT_HEADER && StringUtils.isBlank(user.getSubjectCode())) {
-            message = "科组长必须绑定科目代码";
-        }
-        return message;
-    }
-}
+package cn.com.qmth.stmms.admin.user;
+
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.controller.BaseController;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
+import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+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.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Controller
+@RequestMapping("/admin/user")
+public class UserController extends BaseController {
+
+    public static Role[] QUERY_ROLE_LIST = { Role.SCANNER, Role.SUBJECT_HEADER, Role.MARKER };
+
+    public static Role[] ADD_ROLE_LIST = { Role.SCANNER, Role.MARKER };
+
+    @Autowired
+    private UserService userService;
+
+    @Logging(menu = "查询用户", type = LogType.QUERY)
+    @RequestMapping("/list")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView list(HttpServletRequest request, UserSearchQuery query) {
+        User user = RequestUtils.getWebUser(request).getUser();
+        query.setSchoolId(user.getSchoolId());
+        query = userService.findByQuery(query);
+
+        ModelAndView view = new ModelAndView("modules/user/userList");
+        view.addObject("roleList", QUERY_ROLE_LIST);
+        view.addObject("sourceList", UserSource.values());
+        view.addObject("query", query);
+        return view;
+    }
+
+    //    @Logging(menu = "删除用户", type = LogType.DELETE)
+    //    @RequestMapping("/delete")
+    //    @RoleRequire(Role.SCHOOL_ADMIN)
+    //    public String delete(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam Integer id) {
+    //        User current = RequestUtils.getWebUser(request).getUser();
+    //        User user = userService.findById(id);
+    //        String message = null;
+    //        if (user == null) {
+    //            message = "找不到指定用户";
+    //        } else if (!user.getSchoolId().equals(current.getSchoolId()) || user.getId().equals(current.getId())) {
+    //            message = "不能删除指定用户";
+    //        } else {
+    //            userService.delete(user);
+    //            message = "删除成功";
+    //        }
+    //        redirectAttributes.addFlashAttribute("message", message);
+    //        RequestUtils.setLog(request, message + "id:" + id);
+    //        return "redirect:/admin/user/list";
+    //    }
+
+    @RequestMapping(value = "/add", method = RequestMethod.GET)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView addInit(HttpServletRequest request) {
+        ModelAndView view = new ModelAndView("modules/user/userEdit");
+        User user = new User();
+        user.setEnable(true);
+        view.addObject("user", user);
+        view.addObject("roleList", ADD_ROLE_LIST);
+        return view;
+    }
+
+    @RequestMapping(value = "/edit", method = RequestMethod.GET)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView editInit(HttpServletRequest request, @RequestParam Integer id) {
+        User current = RequestUtils.getWebUser(request).getUser();
+        User user = userService.findById(id);
+        if (user != null && user.getSchoolId().equals(current.getSchoolId())) {
+            ModelAndView view = new ModelAndView("modules/user/userEdit");
+            view.addObject("user", user);
+            //view.addObject("roleList", QUERY_ROLE_LIST);
+            return view;
+        } else {
+            return new ModelAndView("redirect:/admin/user/list");
+        }
+    }
+
+    @Logging(menu = "新增(修改)用户", type = LogType.UPDATE)
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String save(HttpServletRequest request, Model model, User user) {
+        User current = RequestUtils.getWebUser(request).getUser();
+        User previous = null;
+        if (user.getId() != null) {
+            previous = userService.findById(user.getId());
+        }
+        if (previous == null) {
+            String message = validate(user);
+            if (message == null) {
+                user.setPassword(Md5EncryptUtils.md5(user.getPassword()));
+                user.setSchoolId(current.getSchoolId());
+                user.setSource(UserSource.INTERNAL);
+                user.setCreatedTime(new Date());
+                user.setUpdatedTime(new Date());
+                userService.save(user);
+            } else {
+                model.addAttribute("user", user);
+                model.addAttribute("roleList", QUERY_ROLE_LIST);
+                model.addAttribute("message", message);
+                return "modules/user/userEdit";
+            }
+        } else if (previous.getSchoolId().equals(current.getSchoolId())) {
+            previous.setLoginName(user.getLoginName());
+            previous.setName(user.getName());
+            //previous.setRole(user.getRole());
+            if (StringUtils.isNotBlank(user.getPassword())) {
+                previous.setPassword(Md5EncryptUtils.md5(user.getPassword()));
+            }
+            //if (previous.getRole() != Role.SUBJECT_HEADER) {
+            //    previous.setSubjectCode(null);
+            //} else {
+            //    previous.setSubjectCode(user.getSubjectCode());
+            //}
+            previous.setEnable(user.isEnable());
+            String message = validate(previous);
+            if (message == null) {
+                previous.setUpdatedTime(new Date());
+                userService.save(previous);
+            } else {
+                model.addAttribute("user", previous);
+                model.addAttribute("roleList", QUERY_ROLE_LIST);
+                model.addAttribute("message", message);
+                return "modules/user/userEdit";
+            }
+        }
+        return "redirect:/admin/user/list";
+    }
+
+    private String validate(User user) {
+        String message = null;
+        if (StringUtils.isBlank(user.getLoginName())) {
+            message = "登录名不能为空";
+        } else if (!checkLoginName(user)) {
+            message = "登录名不能重复";
+        } else if (StringUtils.isBlank(user.getName())) {
+            message = "名称不能为空";
+        } else if (StringUtils.isBlank(user.getPassword())) {
+            message = "密码不能为空";
+        }
+        //else if (user.getRole() == Role.SUBJECT_HEADER && StringUtils.isBlank(user.getSubjectCode())) {
+        //    message = "科组长必须绑定科目代码";
+        //}
+        return message;
+    }
+}

+ 7 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/authorization/AuthorizationService.java

@@ -20,6 +20,13 @@ public class AuthorizationService {
 
     private static final long TIME_EXPIRE_SECOND = 15;
 
+    public SignatureInfo buildSignature(long timestamp, String authorization, String method, String uri) {
+        if (!expired(timestamp)) {
+            return SignatureInfo.parse(method, uri, timestamp, StringUtils.trimToNull(authorization));
+        }
+        return null;
+    }
+
     public SignatureInfo buildSignature(HttpServletRequest request) {
         long timestamp = 0;
         try {

+ 29 - 30
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -1,15 +1,5 @@
 package cn.com.qmth.stmms.common.controller;
 
-import java.beans.PropertyEditorSupport;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.propertyeditors.CustomBooleanEditor;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-
 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;
@@ -20,17 +10,17 @@ import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreInfo;
-import cn.com.qmth.stmms.common.enums.CheckType;
-import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
-import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.DateUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.CustomBooleanEditor;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import java.beans.PropertyEditorSupport;
+import java.util.Date;
+import java.util.List;
 
 public class BaseController {
 
@@ -121,6 +111,18 @@ public class BaseController {
                 }
             }
         });
+        // UserSource 类型转换
+        binder.registerCustomEditor(UserSource.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(UserSource.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
         // MarkStatus 类型转换
         binder.registerCustomEditor(MarkStatus.class, new PropertyEditorSupport() {
 
@@ -213,8 +215,8 @@ public class BaseController {
     protected boolean saveUploadStudent(ExamStudent student) {
         ExamStudent old = studentService.findById(student.getId());
         if (!student.isAbsent()) {// 正考
-            List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(student.getExamId(),
-                    student.getSubjectCode(), MarkStatus.FINISH);
+            List<MarkGroup> groupList = groupService
+                    .findByExamAndSubjectAndStatus(student.getExamId(), student.getSubjectCode(), MarkStatus.FINISH);
             for (MarkGroup markGroup : groupList) {
                 groupService.updateStatus(student.getExamId(), student.getSubjectCode(), markGroup.getNumber(),
                         MarkStatus.FORMAL, MarkStatus.FINISH);
@@ -230,11 +232,8 @@ public class BaseController {
         }
         boolean success = studentService.updateScanInfo(student);
         if (success) {
-            subjectService.updateUploadCount(
-                    student.getExamId(),
-                    student.getSubjectCode(),
-                    (int) studentService.countUploadedByExamIdAndSubjectCode(student.getExamId(),
-                            student.getSubjectCode()));
+            subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode(), (int) studentService
+                    .countUploadedByExamIdAndSubjectCode(student.getExamId(), student.getSubjectCode()));
         }
         return success;
     }
@@ -242,9 +241,9 @@ public class BaseController {
     private void calculateObjectiveScore(ExamStudent student) {
         ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
 
-        ScoreInfo info = util.calculate(
-                questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
-                        student.getSubjectCode(), true, student.getPaperType()), null);
+        ScoreInfo info = util.calculate(questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType()), null);
 
         student.setObjectiveScore(info.getObjectiveScore());
         student.setScoreList(info.getScoreList(), true);

+ 12 - 23
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.common.controller;
 
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-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.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.Logging;
@@ -25,6 +10,17 @@ import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+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.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
 
 @Controller
 public class LoginController {
@@ -32,12 +28,6 @@ public class LoginController {
     @Autowired
     private UserService userService;
 
-    @Autowired
-    private MarkerService markerService;
-
-    @Autowired
-    private MarkGroupService groupService;
-
     @Autowired
     private SessionService sessionService;
 
@@ -79,7 +69,7 @@ public class LoginController {
             modelAndView.addObject("message", "user.login.error.password");
             return modelAndView;
         }
-        if (u.isEnable() == false) {
+        if (!u.isEnable()) {
             modelAndView.addObject("message", "user.login.error.disabled");
             return modelAndView;
         }
@@ -131,7 +121,6 @@ public class LoginController {
     /**
      * 登出
      *
-     * @param user
      * @param request
      * @param response
      * @return

+ 3 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java

@@ -1,10 +1,9 @@
 package cn.com.qmth.stmms.common.domain;
 
-import org.apache.commons.lang.StringUtils;
-
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.enums.Role;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * web端访问用户抽象描述类
@@ -29,7 +28,8 @@ public class WebUser {
 
     private Marker marker;
 
-    private WebUser(Integer id, String name, Role role, String token, Object userData, String logoutUrl, String markerId) {
+    private WebUser(Integer id, String name, Role role, String token, Object userData, String logoutUrl,
+            String markerId) {
         this.id = id;
         this.name = name;
         this.role = role;
@@ -45,24 +45,10 @@ public class WebUser {
         this(user.getId(), user.getName(), user.getRole(), user.getAccessToken(), user, logoutUrl, markerId);
     }
 
-    // public WebUser(Marker marker, String logoutUrl) {
-    // this(marker.getId(), marker.getName(), Role.MARKER,
-    // marker.getAccessToken(), marker, logoutUrl);
-    // }
-
-    // public WebUser(Marker marker) {
-    // this(marker, null);
-    // }
-
     public User getUser() {
         return userData != null && userData instanceof User ? (User) userData : null;
     }
 
-    // public Marker getMarker() {
-    // return userData != null && userData instanceof Marker ? (Marker) userData
-    // : null;
-    // }
-
     public Integer getId() {
         return id;
     }

+ 19 - 27
stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java

@@ -1,21 +1,8 @@
 package cn.com.qmth.stmms.common.interceptor;
 
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
 import cn.com.qmth.stmms.biz.user.model.User;
@@ -27,10 +14,20 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
 
 /**
- * @Description: 日志操作拦截器
  * @author ting.yin
+ * @Description: 日志操作拦截器
  */
 public class LogInterceptor extends HandlerInterceptorAdapter {
 
@@ -39,9 +36,6 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
     @Autowired
     private OperationLogService logService;
 
-    @Autowired
-    private ExamService examService;
-
     @Autowired
     private MarkerService markerService;
 
@@ -106,10 +100,8 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
 
     /**
      * 从session中构造WebUser对象
-     * 
+     *
      * @param request
-     * @param response
-     * @throws Exception
      */
     private WebUser buildWebUser(HttpServletRequest request) {
         StmmsSession session = RequestUtils.getSession(request);
@@ -118,18 +110,18 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
         if (userId != null && role != null) {
             if (Role.MARKER == role) {
                 User user = userService.findById(userId);
-                if (user != null && user.getAccessTokenRefreshTime() != null
-                        && StringUtils.equals(session.getWebUserToken(), user.getAccessToken())
-                        && !AccessControlUtils.expired(user.getAccessTokenRefreshTime())) {
-                    WebUser wu = new WebUser(user, session.getWebUserLogoutUrl(), session.getMarkerId().toString());
+                if (user != null && user.getAccessTokenRefreshTime() != null && StringUtils
+                        .equals(session.getWebUserToken(), user.getAccessToken()) && !AccessControlUtils
+                        .expired(user.getAccessTokenRefreshTime())) {
+                    WebUser wu = new WebUser(user, session.getWebUserLogoutUrl(), session.getWebMarkerId().toString());
                     RequestUtils.setWebUser(request, wu);
                     return wu;
                 }
             } else {
                 User user = userService.findById(userId);
-                if (user != null && user.getRole() == role && user.getAccessTokenRefreshTime() != null
-                        && StringUtils.equals(session.getWebUserToken(), user.getAccessToken())
-                        && !AccessControlUtils.expired(user.getAccessTokenRefreshTime())) {
+                if (user != null && user.getRole() == role && user.getAccessTokenRefreshTime() != null && StringUtils
+                        .equals(session.getWebUserToken(), user.getAccessToken()) && !AccessControlUtils
+                        .expired(user.getAccessTokenRefreshTime())) {
                     WebUser wu = new WebUser(user, null, null);
                     RequestUtils.setWebUser(request, wu);
                     return wu;

+ 8 - 33
stmms-web/src/main/java/cn/com/qmth/stmms/common/session/model/StmmsSession.java

@@ -1,18 +1,16 @@
 package cn.com.qmth.stmms.common.session.model;
 
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.Role;
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.Transient;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import javax.persistence.Transient;
-
-import org.apache.commons.lang.StringUtils;
-
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.Role;
-
 public class StmmsSession implements Serializable {
 
     private static final long serialVersionUID = -1004172926154352747L;
@@ -27,12 +25,6 @@ public class StmmsSession implements Serializable {
 
     private static final String WEB_USER_LOGOUT_URL = "_web_user_logout_url";
 
-    private static final String OPEN_USER_ID_KEY = "_open_user_id_";
-
-    private static final String OPEN_USER_TOKEN_KEY = "_open_user_token_";
-
-    private static final String OPEN_USER_RETURN_URL_KEY = "_open_user_url_";
-
     private String id;
 
     private Map<String, String> map;
@@ -80,23 +72,6 @@ public class StmmsSession implements Serializable {
         }
     }
 
-    public Integer getOpenUserId() {
-        String value = getParameter(OPEN_USER_ID_KEY);
-        try {
-            return Integer.parseInt(value);
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    public String getOpenUserToken() {
-        return getParameter(OPEN_USER_TOKEN_KEY);
-    }
-
-    public String getOpenUserReturnUrl() {
-        return getParameter(OPEN_USER_RETURN_URL_KEY);
-    }
-
     public Integer getWebUserId() {
         String value = getParameter(WEB_USER_ID_KEY);
         try {
@@ -106,7 +81,7 @@ public class StmmsSession implements Serializable {
         }
     }
 
-    public Integer getMarkerId() {
+    public Integer getWebMarkerId() {
         String value = getParameter(WEB_MARKER_ID_KEY);
         try {
             return Integer.parseInt(value);
@@ -118,7 +93,7 @@ public class StmmsSession implements Serializable {
     public Role getWebUserRole() {
         String value = getParameter(WEB_USER_ROLE_KEY);
         try {
-            return Role.valueOf(value);
+            return Role.findByValue(Integer.parseInt(value));
         } catch (Exception e) {
             return null;
         }
@@ -134,7 +109,7 @@ public class StmmsSession implements Serializable {
 
     public void saveWebUser(WebUser webUser) {
         setParameter(WEB_USER_ID_KEY, String.valueOf(webUser.getId()));
-        setParameter(WEB_MARKER_ID_KEY, webUser.getMarkerId() == null ? "" : String.valueOf(webUser.getMarkerId()));
+        setParameter(WEB_MARKER_ID_KEY, webUser.getMarkerId() != null ? String.valueOf(webUser.getMarkerId()) : null);
         setParameter(WEB_USER_ROLE_KEY, String.valueOf(webUser.getRole()));
         setParameter(WEB_USER_TOKEN_KEY, StringUtils.trimToEmpty(webUser.getToken()));
         setParameter(WEB_USER_LOGOUT_URL, StringUtils.trimToEmpty(webUser.getLogoutUrl()));

+ 39 - 55
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -1,31 +1,5 @@
 package cn.com.qmth.stmms.mark;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringEscapeUtils;
-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.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-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.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -35,37 +9,40 @@ 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.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkResult;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.model.ProblemType;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-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.*;
 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.MarkService;
-import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.biz.mark.service.TrialService;
+import cn.com.qmth.stmms.biz.mark.service.*;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringEscapeUtils;
+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.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
 @Controller
 @RequestMapping("/mark")
@@ -157,7 +134,8 @@ public class MarkController extends BaseController {
     }
 
     @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
-    public ModelAndView select(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
+    public ModelAndView select(HttpServletRequest request, HttpServletResponse response,
+            @RequestParam Integer markerId) {
         User user = RequestUtils.getWebUser(request).getUser();
         ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelectAp");
         Calendar rightNow = Calendar.getInstance();
@@ -228,9 +206,11 @@ public class MarkController extends BaseController {
                 markerService.save(marker);
             }
         }
-        ModelAndView view = new ModelAndView(mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
+        ModelAndView view = new ModelAndView(
+                mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
         view.addObject("forceMode", forceMode);
         view.addObject("sheetView", group.isSheetView());
+        view.addObject("enableAllZero", group.isEnableAllZero());
         view.addObject("isFormal", group.getStatus() == MarkStatus.FORMAL);
         return view;
     }
@@ -383,8 +363,9 @@ public class MarkController extends BaseController {
         while (task == null) {
             List<MarkLibrary> list = new ArrayList<MarkLibrary>();
             // 需要判断评卷员是否绑定了班级
-            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                    marker.getId(), marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
+            list = libraryService
+                    .findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
+                            marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
             if (list.isEmpty()) {
                 break;
             }
@@ -405,8 +386,9 @@ public class MarkController extends BaseController {
         int retry = 1;
         Task task = null;
         while (task == null) {
-            List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
-                    marker.getGroupNumber(), marker.getId(), retry, 10);
+            List<TrialLibrary> list = trialService
+                    .findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                            marker.getId(), retry, 10);
             if (list.isEmpty()) {
                 break;
             }
@@ -502,11 +484,13 @@ public class MarkController extends BaseController {
             // 试评查找给分历史记录
             List<TrialHistory> historyList = new ArrayList<TrialHistory>();
             if (studentId != null) {
-                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber(), marker.getId(), studentId, pageNumber, pageSize, querySort);
+                historyList = trialService
+                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                                marker.getId(), studentId, pageNumber, pageSize, querySort);
             } else {
-                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, null);
+                historyList = trialService
+                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                                marker.getId(), pageNumber, pageSize, querySort, null);
             }
             for (TrialHistory history : historyList) {
                 TrialLibrary library = trialService.findLibrary(history.getLibraryId());

+ 0 - 146
stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenAccountController.java

@@ -1,146 +0,0 @@
-package cn.com.qmth.stmms.open.controller;
-
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang3.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.RequestMethod;
-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.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.school.model.School;
-import cn.com.qmth.stmms.biz.school.service.SchoolService;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.biz.user.service.UserService;
-import cn.com.qmth.stmms.common.authorization.AuthorizationService;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.signature.SignatureInfo;
-import cn.com.qmth.stmms.common.signature.SignatureType;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller("openAccountController")
-@RequestMapping("/open")
-public class OpenAccountController {
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    private UserService userService;
-
-    @Autowired
-    private SchoolService schoolService;
-
-    @Autowired
-    private MarkerService markerService;
-
-    @Autowired
-    private MarkGroupService groupService;
-    //
-    // @RequestMapping(value = "/marker/login", method = RequestMethod.POST)
-    // public String markerLogin(HttpServletRequest request, RedirectAttributes
-    // redirect, @RequestParam String time,
-    // @RequestParam String authorization, @RequestParam String account,
-    // @RequestParam String returnUrl) {
-    // // 请求参数验证
-    // account = StringUtils.trimToEmpty(account);
-    // returnUrl = StringUtils.trimToEmpty(returnUrl);
-    // if (returnUrl.length() == 0) {
-    // return errorRedirect(redirect, null, "returnUrl不能为空");
-    // }
-    // if (account.length() == 0) {
-    // return errorRedirect(redirect, returnUrl, "account不能为空");
-    // }
-    // // 签名验证,获取访问学校
-    // School school = null;
-    // SignatureInfo info = authorizationService.buildSignature(request, time,
-    // authorization);
-    // if (info != null && info.getType() == SignatureType.SECRET) {
-    // school = schoolService.findByAccessKey(info.getInvoker());
-    // }
-    // if (school == null || !school.isEnable() ||
-    // !info.validate(school.getAccessSecret())) {
-    // return errorRedirect(redirect, returnUrl, "接口鉴权失败");
-    // }
-    // // 查找第三方账号并登陆
-    // User user = userService.findBySchoolIdAndAccount(school.getId(),
-    // account);
-    // if (user == null || !user.isEnable()) {
-    // return errorRedirect(redirect, returnUrl, "第三方账号不存在");
-    // }
-    // // 保存第三方账号到session
-    // RequestUtils.getSession(request).saveWebUser(new WebUser(user,
-    // returnUrl));
-    //
-    // return "redirect:/open/marker/list";
-    // }
-    //
-    // @RequestMapping(value = "/marker/list", method = RequestMethod.GET)
-    // public ModelAndView markerList(HttpServletRequest request) {
-    // OpenAccount account = RequestUtils.getOpenUser(request).getOpenAccount();
-    // ModelAndView modelAndView = new ModelAndView("modules/open/marker-list");
-    // // TODO - 增加评卷员列表,构造考试、科目、分组联动数据集合
-    // List<Marker> markerList =
-    // markerService.findByOpenAccountAndMarkStatus(account.getId(),
-    // MarkStatus.TRIAL,
-    // MarkStatus.FORMAL);
-    // modelAndView.addObject("markerList", markerList);
-    // return modelAndView;
-    // }
-    //
-    // @RequestMapping(value = "/marker/select", method = RequestMethod.POST)
-    // public ModelAndView markerSelect(HttpServletRequest request,
-    // @RequestParam Integer markerId) {
-    // // 评卷员与评卷分组校验
-    // OpenAccount account = RequestUtils.getOpenUser(request).getOpenAccount();
-    // Marker marker = markerService.findById(markerId);
-    // if (marker == null || !marker.isEnable() || marker.getOpenAccountId() ==
-    // null
-    // || !marker.getOpenAccountId().equals(account.getId())) {
-    // return new ModelAndView("redirect:/open/marker/list");
-    // }
-    // MarkGroup group = groupService.findOne(marker.getExamId(),
-    // marker.getSubjectCode(), marker.getGroupNumber());
-    // if (group == null || group.getStatus() == MarkStatus.FINISH) {
-    // return new ModelAndView("redirect:/open/marker/list");
-    // }
-    // // 完成评卷员登陆并保存session
-    // // marker.refreshAccessToken();
-    // // marker.setLastLoginIp(request.getRemoteAddr());
-    // // marker.setLastLoginTime(new Date());
-    // // RequestUtils.getSession(request).saveWebUser(new
-    // // WebUser(markerService.save(marker), "/open/marker/list"));
-    // return new ModelAndView("redirect:/mark/index");
-    // }
-    //
-    // @RequestMapping(value = "/error")
-    // public ModelAndView error(HttpServletRequest request,
-    // @RequestParam(required = false) String message,
-    // @RequestParam(required = false) String returnUrl) {
-    // ModelAndView modelAndView = new ModelAndView("modules/open/error");
-    // modelAndView.addObject("message", StringUtils.trimToNull(message));
-    // modelAndView.addObject("returnUrl", StringUtils.trimToNull(returnUrl));
-    // return modelAndView;
-    // }
-    //
-    // private String errorRedirect(RedirectAttributes redirect, String
-    // returnUrl, String... errors) {
-    // if (errors != null && errors.length > 0) {
-    // redirect.addFlashAttribute("message", StringUtils.join(errors, "\n"));
-    // }
-    // if (returnUrl != null && returnUrl.length() > 0) {
-    // redirect.addFlashAttribute("returnUrl", returnUrl);
-    // }
-    // return "redirect:/open/error";
-    // }
-}

+ 110 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenUserController.java

@@ -0,0 +1,110 @@
+package cn.com.qmth.stmms.open.controller;
+
+import cn.com.qmth.stmms.biz.school.model.School;
+import cn.com.qmth.stmms.biz.school.service.SchoolService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.authorization.AuthorizationService;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.session.model.StmmsSession;
+import cn.com.qmth.stmms.common.session.service.SessionService;
+import cn.com.qmth.stmms.common.signature.SignatureInfo;
+import cn.com.qmth.stmms.common.signature.SignatureType;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.apache.commons.lang3.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.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Controller("openUserController")
+@RequestMapping("/open")
+public class OpenUserController {
+
+    @Autowired
+    private SessionService sessionService;
+
+    @Autowired
+    private AuthorizationService authorizationService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private SchoolService schoolService;
+
+    @RequestMapping(value = "/mark/login", method = RequestMethod.POST)
+    public String markLogin(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirect,
+            @RequestParam Long time, @RequestParam String authorization, @RequestParam String account,
+            @RequestParam String name, @RequestParam String returnUrl) {
+        // 请求参数验证
+        authorization = StringUtils.trimToEmpty(authorization);
+        name = StringUtils.trimToNull(name);
+        account = StringUtils.trimToEmpty(account);
+        returnUrl = StringUtils.trimToEmpty(returnUrl);
+        if (time == null) {
+            return errorRedirect(redirect, null, "time不能为空");
+        }
+        if (authorization.length() == 0) {
+            return errorRedirect(redirect, null, "authorization不能为空");
+        }
+        if (returnUrl.length() == 0) {
+            return errorRedirect(redirect, null, "returnUrl不能为空");
+        }
+        if (account.length() == 0) {
+            return errorRedirect(redirect, returnUrl, "account不能为空");
+        }
+        // 签名验证,获取访问学校
+        School school = null;
+        SignatureInfo info = authorizationService
+                .buildSignature(time, authorization, request.getMethod(), request.getServletPath());
+        if (info != null && info.getType() == SignatureType.SECRET) {
+            school = schoolService.findByAccessKey(info.getInvoker());
+        }
+        if (school == null || !school.isEnable() || !info.validate(school.getAccessSecret())) {
+            return errorRedirect(redirect, returnUrl, "鉴权失败");
+        }
+        // 查找第三方账号并登陆
+        User user = userService.externalLogin(school.getId(), account, name, Role.MARKER);
+        if (user == null) {
+            return errorRedirect(redirect, returnUrl, "第三方登录异常");
+        }
+        if (!user.isEnable()) {
+            return errorRedirect(redirect, returnUrl, "第三方账号已禁用");
+        }
+        if (user.getRole() != Role.MARKER) {
+            return errorRedirect(redirect, returnUrl, "第三方账号没有评卷权限");
+        }
+        // 保存第三方账号到session
+        StmmsSession session = RequestUtils.getSession(request);
+        session.saveWebUser(new WebUser(user, returnUrl, null));
+        sessionService.put(request, response, session);
+        return "redirect:/mark/subject-select";
+    }
+
+    @RequestMapping(value = "/error")
+    public ModelAndView error(HttpServletRequest request, @RequestParam(required = false) String message,
+            @RequestParam(required = false) String returnUrl) {
+        ModelAndView modelAndView = new ModelAndView("modules/open/error");
+        modelAndView.addObject("message", StringUtils.trimToNull(message));
+        modelAndView.addObject("returnUrl", StringUtils.trimToNull(returnUrl));
+        return modelAndView;
+    }
+
+    private String errorRedirect(RedirectAttributes redirect, String returnUrl, String... errors) {
+        if (errors != null && errors.length > 0) {
+            redirect.addFlashAttribute("message", StringUtils.join(errors, "\n"));
+        }
+        if (returnUrl != null && returnUrl.length() > 0) {
+            redirect.addFlashAttribute("returnUrl", returnUrl);
+        }
+        return "redirect:/open/error";
+    }
+}

+ 9 - 30
stmms-web/src/main/java/cn/com/qmth/stmms/open/interceptor/OpenInterceptor.java

@@ -1,15 +1,14 @@
 package cn.com.qmth.stmms.open.interceptor;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.interceptor.SessionInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
- * Mark模块操作拦截器
+ * 第三方模块操作拦截器
  *
  * @author XKJ
  */
@@ -19,29 +18,9 @@ public class OpenInterceptor extends SessionInterceptor {
     private UserService userService;
 
     @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        // OpenUser ou = buildOpenUser(request);
-        // if (ou != null) {
-        // return true;
-        // }
-        return redirect(request, response, "/open/error");
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        return true;
+        //return redirect(request, response, "/open/error");
     }
-    //
-    // private OpenUser buildOpenUser(HttpServletRequest request) {
-    // StmmsSession session = RequestUtils.getSession(request);
-    // Integer userId = session.getOpenUserId();
-    // if (userId != null) {
-    // OpenAccount oa = userService.findOpenAccount(userId);
-    // if (oa != null && oa.isEnable() && oa.getAccessTokenRefreshTime() != null
-    // && StringUtils
-    // .equals(session.getOpenUserToken(), oa.getAccessToken()) &&
-    // !AccessControlUtils
-    // .expired(oa.getAccessTokenRefreshTime())) {
-    // OpenUser ou = new OpenUser(oa, session.getOpenUserReturnUrl());
-    // RequestUtils.setOpenUser(request, ou);
-    // return ou;
-    // }
-    // }
-    // return null;
-    // }
+
 }

+ 153 - 138
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupAdd.jsp

@@ -1,192 +1,207 @@
 <%@ 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" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			window.localStorage.removeItem("pictureConfig");
-			$("#number").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-			$(".doubleDiv").hide();
-			$("#openDouble").change(function() { 
-				if ($("#openDouble").is(':checked')){
-					$(".doubleDiv").show();
-				}else{
-					$("#doubleRate").attr("value","");
-					$("#thirdPolicy").attr("value","");
-					$("#arbitrateThreshold").attr("value","");
-					$(".doubleDiv").hide();
-				}
-			});
-		});
-	</script>
+    <title>评卷大题新增</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            window.localStorage.removeItem("pictureConfig");
+            $("#number").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+            $(".doubleDiv").hide();
+            $("#openDouble").change(function () {
+                if ($("#openDouble").is(':checked')) {
+                    $(".doubleDiv").show();
+                } else {
+                    $("#doubleRate").attr("value", "");
+                    $("#thirdPolicy").attr("value", "");
+                    $("#arbitrateThreshold").attr("value", "");
+                    $(".doubleDiv").hide();
+                }
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li class="active"><a href="##">新增大题</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/insert" method="post" class="form-horizontal">
-		<tags:message content="${message}"/>
-		<form:hidden path="subjectCode"/>
-		<input type="hidden" id="questionDetail" name="questionDetail" />
-		<div class="control-group">
-            <label class="control-label">序号</label>
-            <div class="controls">
-                <form:input path="number" htmlEscape="false" maxlength="10" min="1" class="required digits"/>
-            </div>
+<ul class="nav nav-tabs">
+    <li class="active"><a href="##">新增大题</a></li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/insert" method="post"
+           class="form-horizontal">
+    <tags:message content="${message}"/>
+    <form:hidden path="subjectCode"/>
+    <input type="hidden" id="questionDetail" name="questionDetail"/>
+    <div class="control-group">
+        <label class="control-label">序号</label>
+        <div class="controls">
+            <form:input path="number" htmlEscape="false" maxlength="10" min="1" class="required digits"/>
         </div>
-        <div id="questionDiv">
+    </div>
+    <div id="questionDiv">
         <div class="control-group">
             <label class="control-label">大题</label>
             <div class="controls">
-                <input name="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>
-                <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>
-                <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>
+                <input name="mainNumber" type="number" htmlEscape="false" maxlength="10" min="1" class="required digits"
+                       placeholder="大题号"/>
+                <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
+                       placeholder="名称"/>
+                <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
+                       placeholder="步骤分"/>
             </div>
         </div>
+    </div>
+    <div class="control-group">
+        <div class="controls">
+            <input type="button" value="增加大题" id="quetion-add">
         </div>
-        <div class="control-group">
-        	<div class="controls">
-        	<input type="button" value="增加大题" id="quetion-add">
-        	</div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">试评数量</label>
+        <div class="controls">
+            <form:input path="trialCount" htmlEscape="false" min="0" class="digits" type="number" value="0"/>
+            <label>0表示跳过试评</label>
         </div>
-        <div class="control-group">
-            <label class="control-label">试评数量</label>
-            <div class="controls">
-                <form:input path="trialCount" htmlEscape="false" min="0" class="digits" type="number" value="0"/>
-                <label>0表示跳过试评</label>
-            </div>
-        </div>
-        <div class="control-group">
-            <label class="control-label">评卷模式</label>
-            <div class="controls">
+    </div>
+    <div class="control-group">
+        <label class="control-label">评卷模式</label>
+        <div class="controls">
             <select name="markMode">
                 <option value="">不限</option>
                 <c:forEach items="${markModeList}" var="item">
-                     <option value="${item}" >${item.name}</option>
+                    <option value="${item}">${item.name}</option>
                 </c:forEach>
             </select>
-            </div>
         </div>
-        <c:if test="${examType!='MULTI_MEDIA'}">
-		<div class="control-group">
+    </div>
+    <c:if test="${examType!='MULTI_MEDIA'}">
+        <div class="control-group">
             <label class="control-label">图片显示</label>
             <div class="controls">
-               <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}" target="_blank" class="required" id= "configuration">设置</a>
-            </div>
-        </div> 
-        </c:if>
-        <form:input path="picList" class="required" id="picList"  type="hidden"/>
-		<div class="control-group">
-            <label class="control-label">双评</label>
-            <div class="controls">
-                <input type="checkbox" id="openDouble">开启
+                <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}"
+                   target="_blank" class="required" id="configuration">设置</a>
             </div>
         </div>
-        <div class="doubleDiv">
+    </c:if>
+    <form:input path="picList" class="required" id="picList" type="hidden"/>
+    <div class="control-group">
+        <label class="control-label">双评</label>
+        <div class="controls">
+            <input type="checkbox" id="openDouble">开启
+        </div>
+    </div>
+    <div class="doubleDiv">
         <div class="control-group">
             <label class="control-label">双评比例</label>
             <div class="controls">
-                <form:input path="doubleRate" id="doubleRate" htmlEscape="false" maxlength="100" class="required" type="number"/>*比例范围为0-1
+                <form:input path="doubleRate" id="doubleRate" htmlEscape="false" maxlength="100" class="required"
+                            type="number"/>*比例范围为0-1
             </div>
         </div>
         <div class="control-group">
             <label class="control-label">仲裁阀值</label>
             <div class="controls">
-                <form:input path="arbitrateThreshold" id="arbitrateThreshold" htmlEscape="false" maxlength="100" class="required" type="number"/>*阈值为分数
+                <form:input path="arbitrateThreshold" id="arbitrateThreshold" htmlEscape="false" maxlength="100"
+                            class="required" type="number"/>*阈值为分数
             </div>
         </div>
         <div class="control-group">
             <label class="control-label">合分策略</label>
             <div class="controls">
-				<select name="scorePolicy">
-	                <c:forEach items="${scorePolicyList}" var="item">
-	                	 <option value="${item.value}" >${item.name}</option>
-	                </c:forEach>
-	            </select>
+                <select name="scorePolicy">
+                    <c:forEach items="${scorePolicyList}" var="item">
+                        <option value="${item.value}">${item.name}</option>
+                    </c:forEach>
+                </select>
             </div>
         </div>
-		<div class="control-group">
+        <div class="control-group">
             <label class="control-label">三评规则</label>
             <div class="controls">
-				<select name="thirdPolicy">
-	                <c:forEach items="${thirdPolicyList}" var="item">
-	                	 <option value="${item.value}" >${item.name}</option>
-	                </c:forEach>
-	            </select>
+                <select name="thirdPolicy">
+                    <c:forEach items="${thirdPolicyList}" var="item">
+                        <option value="${item.value}">${item.name}</option>
+                    </c:forEach>
+                </select>
             </div>
         </div>
+    </div>
+    <c:if test="${examType!='MULTI_MEDIA'}">
+        <div class="control-group">
+            <label class="control-label">原卷显示</label>
+            <div class="controls">
+                <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
+            </div>
         </div>
-        <c:if test="${examType!='MULTI_MEDIA'}">
-		<div class="control-group">
-			<label class="control-label">原卷显示</label>
-			<div class="controls">
-				<input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
-			</div>
-		</div>
-		</c:if>
-        <div class="form-actions">
-            <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
-            <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}" class="btn">返回</a>
+        <div class="control-group">
+            <label class="control-label">启用全零分</label>
+            <div class="controls">
+                <input name="enableAllZero" type="checkbox" <c:if test="${group.enableAllZero}">checked</c:if>/>
+            </div>
         </div>
-	</form:form>
+    </c:if>
+    <div class="form-actions">
+        <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
+        <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}" class="btn">返回</a>
+    </div>
+</form:form>
 <script type="text/javascript">
-$("#quetion-add").click(function() { 
-	 var dom ='<div class="control-group"><label class="control-label">大题</label><div class="controls">\
+    $("#quetion-add").click(function () {
+        var dom = '<div class="control-group"><label class="control-label">大题</label><div class="controls">\
 <input name="mainNumber" class="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>\
 <input name="mainTitle" class="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>\
 <input name="scoreList" class="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>\
 &nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>\
 </div></div>';
-	$("#questionDiv").append(dom);
-});
+        $("#questionDiv").append(dom);
+    });
+
+    function questionDelete(obj) {
+        $(obj).parent().parent().remove();
+    }
 
-function questionDelete(obj){
-$(obj).parent().parent().remove();
-}
-$('#btnSubmit').click(function(){
-	var questionDetail = [];
-	var fill = true;
-	$("#questionDiv div div").each(function(){
-		var question = []
-		$(this).children("input").each(function(){
-			var q = $(this).val();
-	        if(q==''){
-	            fill = false;
-	        }
-			question.push(q);
-		});
-		var detail = {
-				mainNumber:question[0],
-				mainTitle:question[1],
-				scoreList:question[2].split(",")
-		};
-	    questionDetail.push(detail);
-	});
-	 if(fill){
-		$('#questionDetail').val(JSON.stringify(questionDetail));
-	    $('#inputForm').submit();
-	 }else{
-		 alert('大题不能为空');
-	 }
-});
+    $('#btnSubmit').click(function () {
+        var questionDetail = [];
+        var fill = true;
+        $("#questionDiv div div").each(function () {
+            var question = []
+            $(this).children("input").each(function () {
+                var q = $(this).val();
+                if (q == '') {
+                    fill = false;
+                }
+                question.push(q);
+            });
+            var detail = {
+                mainNumber: question[0],
+                mainTitle: question[1],
+                scoreList: question[2].split(",")
+            };
+            questionDetail.push(detail);
+        });
+        if (fill) {
+            $('#questionDetail').val(JSON.stringify(questionDetail));
+            $('#inputForm').submit();
+        } else {
+            alert('大题不能为空');
+        }
+    });
 </script>
 </body>
 </html>

+ 182 - 162
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp

@@ -1,221 +1,241 @@
 <%@ 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" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var pictureConfig = '${pictureConfig}';
-			window.localStorage.setItem("pictureConfig",pictureConfig);
-			$("#number").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-			var openDouble = "${group.doubleRate}";
-			if(openDouble!=null&&openDouble>0){
-				$("#openDouble").prop("checked",true);
-				$("#openDouble").attr("disabled","disabled");
-				$(".doubleDiv").show();
-			}else{
-				$("#doubleRate").attr("value","");
-				$("#thirdPolicy").attr("value","");
-				$("#arbitrateThreshold").attr("value","");
-				$(".doubleDiv").hide();
-			}
-			
-			$("#openDouble").change(function() { 
-				if ($("#openDouble").is(':checked')){
-					$(".doubleDiv").show();
-				}else{
-					$("#doubleRate").attr("value","");
-					$("#thirdPolicy").attr("value","");
-					$("#arbitrateThreshold").attr("value","");
-					$(".doubleDiv").hide();
-				}
+    <title>评卷大题修改</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            var pictureConfig = '${pictureConfig}';
+            window.localStorage.setItem("pictureConfig", pictureConfig);
+            $("#number").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+            var openDouble = "${group.doubleRate}";
+            if (openDouble != null && openDouble > 0) {
+                $("#openDouble").prop("checked", true);
+                $("#openDouble").attr("disabled", "disabled");
+                $(".doubleDiv").show();
+            } else {
+                $("#doubleRate").attr("value", "");
+                $("#thirdPolicy").attr("value", "");
+                $("#arbitrateThreshold").attr("value", "");
+                $(".doubleDiv").hide();
+            }
 
-			});
-		});
-	</script>
+            $("#openDouble").change(function () {
+                if ($("#openDouble").is(':checked')) {
+                    $(".doubleDiv").show();
+                } else {
+                    $("#doubleRate").attr("value", "");
+                    $("#thirdPolicy").attr("value", "");
+                    $("#arbitrateThreshold").attr("value", "");
+                    $(".doubleDiv").hide();
+                }
+
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
-		<li><a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}">简要修改</a></li>
-		<li class="active"><a href="##">重置修改</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/save" method="post" class="form-horizontal">
-		<tags:message content="${message}"/>
-		<form:hidden path="subjectCode"/>
-		<input type="hidden" id="rest" name="reset" value="true"/>
-		<input type="hidden" id="number" name="number" value="${group.number }"/>
-		<input type="hidden" id="questionDetail" name="questionDetail" />
-        <div class="control-group">
-            <label class="control-label">分组序号</label>
-            <div class="controls">
-                <form:input path="number" htmlEscape="false" maxlength="10" class="required" readonly="true"/>
-            </div>
-        </div>
-        <div id="questionDiv">
-	        <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
-	        <div class="control-group">
-	            <label class="control-label">大题</label>
-	            <div class="controls">
-	                <input name="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号" value="${question.mainNumber }"/>
-	                <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称" value="${question.title }"/>
-	                <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分" value="${question.scoreList }"/>
-	                <c:if test="${!questionStatus.first }">
-	                &nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>
-	                </c:if>
-	            </div>
-	        </div>
-	        </c:forEach>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
+    <li><a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}">简要修改</a>
+    </li>
+    <li class="active"><a href="##">重置修改</a></li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/save" method="post"
+           class="form-horizontal">
+    <tags:message content="${message}"/>
+    <form:hidden path="subjectCode"/>
+    <input type="hidden" id="rest" name="reset" value="true"/>
+    <input type="hidden" id="number" name="number" value="${group.number }"/>
+    <input type="hidden" id="questionDetail" name="questionDetail"/>
+    <div class="control-group">
+        <label class="control-label">分组序号</label>
+        <div class="controls">
+            <form:input path="number" htmlEscape="false" maxlength="10" class="required" readonly="true"/>
         </div>
-        <div class="control-group">
-        	<div class="controls">
-        	<input type="button" value="增加大题" id="quetion-add">
-        	</div>
+    </div>
+    <div id="questionDiv">
+        <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
+            <div class="control-group">
+                <label class="control-label">大题</label>
+                <div class="controls">
+                    <input name="mainNumber" type="number" htmlEscape="false" maxlength="10" min="1"
+                           class="required digits" placeholder="大题号" value="${question.mainNumber }"/>
+                    <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
+                           placeholder="名称" value="${question.title }"/>
+                    <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
+                           placeholder="步骤分" value="${question.scoreList }"/>
+                    <c:if test="${!questionStatus.first }">
+                        &nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>
+                    </c:if>
+                </div>
+            </div>
+        </c:forEach>
+    </div>
+    <div class="control-group">
+        <div class="controls">
+            <input type="button" value="增加大题" id="quetion-add">
         </div>
-		<c:if test="${group.status.value==1}">
+    </div>
+    <c:if test="${group.status.value==1}">
         <div class="control-group">
             <label class="control-label">试评数量</label>
             <div class="controls">
                 <form:input path="trialCount" htmlEscape="false" min="1" class="required digits" type="number"/>
             </div>
         </div>
-        </c:if>
-        <div class="control-group">
-            <label class="control-label">评卷模式</label>
-            <div class="controls">
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">评卷模式</label>
+        <div class="controls">
             <select name="markMode">
                 <option value="">不限</option>
                 <c:forEach items="${markModeList}" var="item">
-                    <option value="${item}" <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
+                    <option value="${item}"
+                            <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
                 </c:forEach>
             </select>
-            </div>
         </div>
-        <c:if test="${examType!='MULTI_MEDIA'}">
-    	<div class="control-group">
+    </div>
+    <c:if test="${examType!='MULTI_MEDIA'}">
+        <div class="control-group">
             <label class="control-label">图片显示</label>
-            <div class="controls"> 
-				<a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}" target="_blank" class="required" id= "configuration">设置</a>
-            </div>
-        </div> 
-        </c:if>
-        <form:input path="picList" class="required" id="picList"  type="hidden"/>
-		<div class="control-group">
-            <label class="control-label">双评</label>
             <div class="controls">
-                <input type="checkbox" id="openDouble">开启
+                <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}"
+                   target="_blank" class="required" id="configuration">设置</a>
             </div>
         </div>
-		<div  class="doubleDiv">
+    </c:if>
+    <form:input path="picList" class="required" id="picList" type="hidden"/>
+    <div class="control-group">
+        <label class="control-label">双评</label>
+        <div class="controls">
+            <input type="checkbox" id="openDouble">开启
+        </div>
+    </div>
+    <div class="doubleDiv">
         <div class="control-group">
             <label class="control-label">双评比例</label>
             <div class="controls">
-                <form:input path="doubleRate" htmlEscape="false" maxlength="100" class="required" type="number" id = "doubleRate"/>*比例范围为0-1
+                <form:input path="doubleRate" htmlEscape="false" maxlength="100" class="required" type="number"
+                            id="doubleRate"/>*比例范围为0-1
             </div>
         </div>
         <div class="control-group">
             <label class="control-label">仲裁阀值</label>
             <div class="controls">
-                <form:input path="arbitrateThreshold" htmlEscape="false" maxlength="100" class="required" type="number" id="arbitrateThreshold"/>*阈值为分数
+                <form:input path="arbitrateThreshold" htmlEscape="false" maxlength="100" class="required" type="number"
+                            id="arbitrateThreshold"/>*阈值为分数
             </div>
         </div>
         <div class="control-group">
             <label class="control-label">合分策略</label>
             <div class="controls">
-				<select name="scorePolicy">
-	                <c:forEach items="${scorePolicyList}" var="item">
-	                	 <option value="${item.value}"<c:if test="${item.value==group.scorePolicy.value}">selected</c:if> >${item.name}</option>
-	                </c:forEach>
-	            </select>
+                <select name="scorePolicy">
+                    <c:forEach items="${scorePolicyList}" var="item">
+                        <option value="${item.value}"
+                                <c:if test="${item.value==group.scorePolicy.value}">selected</c:if> >${item.name}</option>
+                    </c:forEach>
+                </select>
             </div>
         </div>
-		<div class="control-group">
+        <div class="control-group">
             <label class="control-label">三评规则</label>
             <div class="controls">
-				<select name="thirdPolicy">
-	                <c:forEach items="${thirdPolicyList}" var="item">
-	                	 <option value="${item.value}"<c:if test="${item.value==group.thirdPolicy.value}">selected</c:if> >${item.name}</option>
-	                </c:forEach>
-	            </select>
+                <select name="thirdPolicy">
+                    <c:forEach items="${thirdPolicyList}" var="item">
+                        <option value="${item.value}"
+                                <c:if test="${item.value==group.thirdPolicy.value}">selected</c:if> >${item.name}</option>
+                    </c:forEach>
+                </select>
             </div>
         </div>
+    </div>
+    <c:if test="${examType!='MULTI_MEDIA'}">
+        <div class="control-group">
+            <label class="control-label">原卷显示</label>
+            <div class="controls">
+                <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
+            </div>
         </div>
-        <c:if test="${examType!='MULTI_MEDIA'}">
- 		<div class="control-group">
-			<label class="control-label">原卷显示</label>
-			<div class="controls">
-				<input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
-			</div>
-		</div>
-		</c:if>
         <div class="control-group">
-            <label class="control-label">重要提示</label>
+            <label class="control-label">启用全零分</label>
             <div class="controls">
-                <span class="label label-important"><h5>保存后大题关联所有评卷任务都将重置</h5></span>
+                <input name="enableAllZero" type="checkbox" <c:if test="${group.enableAllZero}">checked</c:if>/>
             </div>
         </div>
-        <div class="form-actions">
-            <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
-            <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}" class="btn">返回</a>
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">重要提示</label>
+        <div class="controls">
+            <span class="label label-important"><h5>保存后大题关联所有评卷任务都将重置</h5></span>
         </div>
-	</form:form>
+    </div>
+    <div class="form-actions">
+        <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
+        <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}"
+           class="btn">返回</a>
+    </div>
+</form:form>
 <script type="text/javascript">
-$("#quetion-add").click(function() { 
-	 var dom ='<div class="control-group"><label class="control-label">大题</label><div class="controls">\
+    $("#quetion-add").click(function () {
+        var dom = '<div class="control-group"><label class="control-label">大题</label><div class="controls">\
 <input name="mainNumber" class="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>\
 <input name="mainTitle" class="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>\
 <input name="scoreList" class="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>\
 &nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>\
 </div></div>';
-	$("#questionDiv").append(dom);
-});
+        $("#questionDiv").append(dom);
+    });
+
+    function questionDelete(obj) {
+        $(obj).parent().parent().remove();
+    }
 
-function questionDelete(obj){
-$(obj).parent().parent().remove();
-}
-$('#btnSubmit').click(function(){
-	var questionDetail = [];
-	var fill = true;
-	$("#questionDiv div div").each(function(){
-		var question = []
-		$(this).children("input").each(function(){
-			var q = $(this).val();
-	        if(q==''){
-	            fill = false;
-	        }
-			question.push(q);
-		});
-		var detail = {
-				mainNumber:question[0],
-				mainTitle:question[1],
-				scoreList:question[2].split(",")
-		};
-	    questionDetail.push(detail);
-	});
-	 if(fill){
-		$('#questionDetail').val(JSON.stringify(questionDetail));
-	    $('#inputForm').submit();
-	 }else{
-		 alert('大题不能为空');
-	 }
-});
+    $('#btnSubmit').click(function () {
+        var questionDetail = [];
+        var fill = true;
+        $("#questionDiv div div").each(function () {
+            var question = []
+            $(this).children("input").each(function () {
+                var q = $(this).val();
+                if (q == '') {
+                    fill = false;
+                }
+                question.push(q);
+            });
+            var detail = {
+                mainNumber: question[0],
+                mainTitle: question[1],
+                scoreList: question[2].split(",")
+            };
+            questionDetail.push(detail);
+        });
+        if (fill) {
+            $('#questionDetail').val(JSON.stringify(questionDetail));
+            $('#inputForm').submit();
+        } else {
+            alert('大题不能为空');
+        }
+    });
 </script>
 </body>
 </html>

+ 141 - 129
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp

@@ -1,163 +1,175 @@
 <%@ 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" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var pictureConfig = '${pictureConfig}';
-			window.localStorage.setItem("pictureConfig",pictureConfig);
-			$("#title").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-			
-			var openDouble = "${group.doubleRate}";
-			if(openDouble!=null&&openDouble>0){
-				$("#openDouble").prop("checked",true);
-				$("#openDouble").attr("disabled","disabled");
-				$(".doubleDiv").show();
-			}else{
-				$("#doubleRate").attr("value","");
-				$("#thirdPolicy").attr("value","");
-				$("#arbitrateThreshold").attr("value","");
-				$(".doubleDiv").hide();
-			}
-			
-			$("#openDouble").change(function() { 
-				if ($("#openDouble").is(':checked')){
-					$(".doubleDiv").show();
-				}else{
-					$("#doubleRate").attr("value","");
-					$("#thirdPolicy").attr("value","");
-					$("#arbitrateThreshold").attr("value","");
-					$(".doubleDiv").hide();
-				}
+    <title>评卷大题修改</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            var pictureConfig = '${pictureConfig}';
+            window.localStorage.setItem("pictureConfig", pictureConfig);
+            $("#title").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
 
-			});
-		});
-	</script>
+            var openDouble = "${group.doubleRate}";
+            if (openDouble != null && openDouble > 0) {
+                $("#openDouble").prop("checked", true);
+                $("#openDouble").attr("disabled", "disabled");
+                $(".doubleDiv").show();
+            } else {
+                $("#doubleRate").attr("value", "");
+                $("#thirdPolicy").attr("value", "");
+                $("#arbitrateThreshold").attr("value", "");
+                $(".doubleDiv").hide();
+            }
+
+            $("#openDouble").change(function () {
+                if ($("#openDouble").is(':checked')) {
+                    $(".doubleDiv").show();
+                } else {
+                    $("#doubleRate").attr("value", "");
+                    $("#thirdPolicy").attr("value", "");
+                    $("#arbitrateThreshold").attr("value", "");
+                    $(".doubleDiv").hide();
+                }
+
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
-		<li class="active"><a href="##">简要修改</a></li>
-		<li><a href="${ctx}/admin/exam/group/edit-full?subjectCode=${group.subjectCode}&number=${group.number}&">重置修改</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/save" method="post" class="form-horizontal">
-		<tags:message content="${message}"/>
-		<form:hidden path="subjectCode"/>
-		<form:hidden path="number"/>
-		<input type="hidden" id="rest" name="reset" value="false"/>
-		<input type="hidden" id="intervalScoreList" name="intervalScoreList" value=""/>
-		<div class="control-group">
-			<label class="control-label">名称</label>
-			<div class="controls">
-				<form:input path="title" htmlEscape="false" class="required" readonly="true"/>
-			</div>
-		</div>
-		<c:if test="${group.status.value==1}">
-		<div class="control-group">
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
+    <li class="active"><a href="##">简要修改</a></li>
+    <li><a href="${ctx}/admin/exam/group/edit-full?subjectCode=${group.subjectCode}&number=${group.number}&">重置修改</a>
+    </li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/save" method="post"
+           class="form-horizontal">
+    <tags:message content="${message}"/>
+    <form:hidden path="subjectCode"/>
+    <form:hidden path="number"/>
+    <input type="hidden" id="rest" name="reset" value="false"/>
+    <input type="hidden" id="intervalScoreList" name="intervalScoreList" value=""/>
+    <div class="control-group">
+        <label class="control-label">名称</label>
+        <div class="controls">
+            <form:input path="title" htmlEscape="false" class="required" readonly="true"/>
+        </div>
+    </div>
+    <c:if test="${group.status.value==1}">
+        <div class="control-group">
             <label class="control-label">试评数量</label>
             <div class="controls">
                 <form:input path="trialCount" htmlEscape="false" min="1" class="required digits" type="number"/>
             </div>
         </div>
-        </c:if>
-		<div class="control-group">
-            <label class="control-label">评卷模式</label>
-            <div class="controls">
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">评卷模式</label>
+        <div class="controls">
             <select name="markMode">
                 <option value="">不限</option>
                 <c:forEach items="${markModeList}" var="item">
-                    <option value="${item}" <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
+                    <option value="${item}"
+                            <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
                 </c:forEach>
             </select>
-            </div>
         </div>
-        <c:if test="${examType!='MULTI_MEDIA'}">
+    </div>
+    <c:if test="${examType!='MULTI_MEDIA'}">
         <div class="control-group">
             <label class="control-label">图片显示</label>
             <div class="controls">
-				<a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}" target="_blank" class="required" id= "configuration">设置</a>
+                <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}"
+                   target="_blank" class="required" id="configuration">设置</a>
             </div>
         </div>
-        </c:if> 
-		<form:input path="picList" class="required" id="picList"  type="hidden"/>
-        <c:forEach items="${questions}" var="question">
+    </c:if>
+    <form:input path="picList" class="required" id="picList" type="hidden"/>
+    <c:forEach items="${questions}" var="question">
         <div class="control-group">
             <label class="control-label">小题${question.subNumber}间隔分</label>
             <div class="controls">
-                <input type="text" class="required interval-score-input" htmlEscape="false" maxlength="10" value="${question.intervalScore}"/>
+                <input type="text" class="required interval-score-input" htmlEscape="false" maxlength="10"
+                       value="${question.intervalScore}"/>
             </div>
         </div>
-        </c:forEach>
-<!-- 		<div class="control-group"> -->
-<!--             <label class="control-label">双评</label> -->
-<!--             <div class="controls"> -->
-<!--                 <input type="checkbox" id="openDouble">开启 -->
-<!--             </div> -->
-<!--         </div> -->
-<!--         <div class="doubleDiv"> -->
-<!--         <div class="control-group"> -->
-<!--             <label class="control-label">双评比例</label> -->
-<!--             <div class="controls"> -->
-<%--                 <form:input path="doubleRate" htmlEscape="false" maxlength="100" class="required" type="number" id="doubleRate"/>*比例范围为0-1 --%>
-<!--             </div> -->
-<!--         </div> -->
-<!--         <div class="control-group"> -->
-<!--             <label class="control-label">仲裁阀值</label> -->
-<!--             <div class="controls"> -->
-<%--                 <form:input path="arbitrateThreshold" htmlEscape="false" maxlength="100" class="required" type="number" id="arbitrateThreshold"/>*阈值为分数 --%>
-<!--             </div> -->
-<!--         </div> -->
-<!--         </div> -->
-		<c:if test="${examType!='MULTI_MEDIA'}">
-		<div class="control-group">
-			<label class="control-label">原卷显示</label>
-			<div class="controls">
-				<input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
-			</div>
-		</div>
-		</c:if>
-        <div class="form-actions">
-            <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
-            <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}" class="btn">返回</a>
+    </c:forEach>
+    <!-- <div class="control-group"> -->
+    <!-- <label class="control-label">双评</label> -->
+    <!-- <div class="controls"> -->
+    <!-- <input type="checkbox" id="openDouble">开启 -->
+    <!-- </div> -->
+    <!-- </div> -->
+    <!-- <div class="doubleDiv"> -->
+    <!-- <div class="control-group"> -->
+    <!-- <label class="control-label">双评比例</label> -->
+    <!-- <div class="controls"> -->
+    <%--                 <form:input path="doubleRate" htmlEscape="false" maxlength="100" class="required" type="number" id="doubleRate"/>*比例范围为0-1 --%>
+    <!-- </div> -->
+    <!-- </div> -->
+    <!-- <div class="control-group"> -->
+    <!-- <label class="control-label">仲裁阀值</label> -->
+    <!-- <div class="controls"> -->
+    <%--                 <form:input path="arbitrateThreshold" htmlEscape="false" maxlength="100" class="required" type="number" id="arbitrateThreshold"/>*阈值为分数 --%>
+    <!-- </div> -->
+    <!-- </div> -->
+    <!-- </div> -->
+    <c:if test="${examType!='MULTI_MEDIA'}">
+        <div class="control-group">
+            <label class="control-label">原卷显示</label>
+            <div class="controls">
+                <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
+            </div>
+        </div>
+        <div class="control-group">
+            <label class="control-label">启用全零分</label>
+            <div class="controls">
+                <input name="enableAllZero" type="checkbox" <c:if test="${group.enableAllZero}">checked</c:if>/>
+            </div>
         </div>
-	</form:form>
+    </c:if>
+    <div class="form-actions">
+        <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
+        <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}" class="btn">返回</a>
+    </div>
+</form:form>
 <script type="text/javascript">
-$('#btnSubmit').click(function(){
-    var array = [];
-    var fill = true;
-    $('.interval-score-input').each(function(){
-        var score = $(this).val();
-        if(score==''){
-            fill = false;
-        }else{
-            array.push(score);
+    $('#btnSubmit').click(function () {
+        var array = [];
+        var fill = true;
+        $('.interval-score-input').each(function () {
+            var score = $(this).val();
+            if (score == '') {
+                fill = false;
+            } else {
+                array.push(score);
+            }
+        });
+        if (fill) {
+            $('#intervalScoreList').val(array.join(','));
+            $('#inputForm').submit();
+        } else {
+            alert('间隔分不能为空');
         }
     });
-    if(fill){
-        $('#intervalScoreList').val(array.join(','));
-        $('#inputForm').submit();
-    }else{
-        alert('间隔分不能为空');
-    }
-});
 </script>
 </body>
 </html>

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

@@ -1,125 +1,135 @@
-<%@ 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" />
+    <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/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}/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 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}/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/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/answer-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/paper-view.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/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/change-name.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/specialTag.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></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/answer-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/paper-view.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/slice-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/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/change-name.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/specialTag.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
 
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-	$(document).ajaxError(function(evt, req, settings){
-		if(req.status==401) {
-			alert("权限失效,请重新登录!");
-			window.location.href = req.statusText;
-       	}
-	});
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ajaxError(function (evt, req, settings) {
+        if (req.status == 401) {
+            alert("权限失效,请重新登录!");
+            window.location.href = req.statusText;
+        }
+    });
 
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userId: '${marker.id}',
-				userName : '${web_user.name}',
-				logoutUrl: '${ctx}/mark/logout',
-				//clearUrl: '${ctx}/mark/clear',
-				<c:if test="${forceMode==false}">
-				switchTrackUrl: '${ctx}/mark/index?mode=track',
-				</c:if>
-				forceSpecialTag : eval('${forceSpecialTag}'.toLowerCase()),
-				<c:if test="${defaultSetting!=null}">
-				defaultSetting: '${defaultSetting}',
-				</c:if>
-				settingSyncUrl: '${ctx}/mark/update-setting',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'mark-status': {
-						simple : false,
-						subjectName : '${subject.displayName}'
-					},
-					'mark-history':{
-						pageSize:10
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false,
-						//showTotalScore:true
-					},
-					<c:if test="${sheetView==true}">
-					'sheet-view' : {
-						server : '${sheetServer}',
-						sheetConfig:'${sheetConfig}'
-					},
-					</c:if>
-					'warning-info': {
-					},
-				 	'thumbnail':{
-					}, 
-					<c:if test="${isFormal==true}">
-					'problem-process':{
-						problemTypes : '${problemTypes}'
-	                },
-					</c:if>	                
-					'change-name':{
-						url : '${ctx}/mark/change-name'
-					},
-					'view-sidebar':{
-						list: [
-							{title:getMessage('mark.sidebar.paper'),  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:getMessage('mark.sidebar.answer'),  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					},
-                    'specialTag':{
-                    }
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/mark/status',
-				getUrl : '${ctx}/mark/gettask',
-				historyUrl : '${ctx}/mark/gethistory',
-				submitUrl : '${ctx}/mark/savetask'
-				//clearUrl : '${ctx}/mark/clear'
-			});
-		});
-	</script>
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${sliceServer}',
+            userId: '${marker.id}',
+            userName: '${web_user.name}',
+            logoutUrl: '${ctx}/mark/logout',
+            //clearUrl: '${ctx}/mark/clear',
+            <c:if test="${forceMode==false}">
+            switchTrackUrl: '${ctx}/mark/index?mode=track',
+            </c:if>
+            forceSpecialTag: eval('${forceSpecialTag}'.toLowerCase()),
+            <c:if test="${defaultSetting!=null}">
+            defaultSetting: '${defaultSetting}',
+            </c:if>
+            settingSyncUrl: '${ctx}/mark/update-setting',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'mark-status': {
+                    simple: false,
+                    subjectName: '${subject.displayName}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                    <c:if test="${enableAllZero==true}">
+                    , enableAllZero: true
+                    </c:if>
+                    //showTotalScore:true
+                },
+                'slice-view': {
+                    server: '${sliceServer}'
+                },
+                <c:if test="${sheetView==true}">
+                'sheet-view': {
+                    server: '${sheetServer}',
+                    sheetConfig: '${sheetConfig}'
+                },
+                </c:if>
+                'warning-info': {},
+                'thumbnail': {},
+                <c:if test="${isFormal==true}">
+                'problem-process': {
+                    problemTypes: '${problemTypes}'
+                },
+                </c:if>
+                'change-name': {
+                    url: '${ctx}/mark/change-name'
+                },
+                'view-sidebar': {
+                    list: [
+                        {
+                            title: getMessage('mark.sidebar.paper'),
+                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                        },
+                        {
+                            title: getMessage('mark.sidebar.answer'),
+                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                        }
+                    ]
+                },
+                'specialTag': {}
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/mark/status',
+            getUrl: '${ctx}/mark/gettask',
+            historyUrl: '${ctx}/mark/gethistory',
+            submitUrl: '${ctx}/mark/savetask'
+            //clearUrl : '${ctx}/mark/clear'
+        });
+    });
+</script>
 </body>
 </html>

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

@@ -1,115 +1,126 @@
-<%@ 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-track/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-track/css/style.css" rel="stylesheet" type="text/css" />
+    <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/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 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 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>
-<script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-track/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/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-track/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/change-name.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/specialTag.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></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>
+    <script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/slice-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-track/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/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-track/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/change-name.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/specialTag.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
 </head>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-	$(document).ajaxError(function(evt, req, settings){
-		if(req.status==401) {
-			alert("权限失效,请重新登录!");
-			 window.location.href = req.statusText;
-       	}
-	});
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ajaxError(function (evt, req, settings) {
+        if (req.status == 401) {
+            alert("权限失效,请重新登录!");
+            window.location.href = req.statusText;
+        }
+    });
 
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userId: '${marker.id}',
-				userName : '${web_user.name}',
-				logoutUrl: '${ctx}/mark/logout',
-				//clearUrl: '${ctx}/mark/clear',
-				<c:if test="${forceMode==false}">
-				switchCommonUrl: '${ctx}/mark/index?mode=common',
-				</c:if>
-				forceSpecialTag : eval('${forceSpecialTag}'.toLowerCase()),
-				<c:if test="${defaultSetting!=null}">
-                defaultSetting: '${defaultSetting}',
-                </c:if>
-                settingSyncUrl: '${ctx}/mark/update-setting',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'mark-status': {
-						simple : false,
-						subjectName : '${subject.displayName}'
-					},
-					'mark-history':{
-						pageSize:10
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false,
-                      	showTotalScore:true
-					},
-					'warning-info': {
-					},
-					<c:if test="${isFormal==true}">
-					'problem-process':{
-						problemTypes : '${problemTypes}'
-	                },
-	                </c:if>
-					'change-name':{
-						url : '${ctx}/mark/change-name'
-					},
-                    'specialTag':{
-                    },
-                    <c:if test="${sheetView==true}">
-					'sheet-view':{
-                        server : '${sheetServer}',
-                        sheetConfig:'${sheetConfig}'
-                    },
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${sliceServer}',
+            userId: '${marker.id}',
+            userName: '${web_user.name}',
+            logoutUrl: '${ctx}/mark/logout',
+            //clearUrl: '${ctx}/mark/clear',
+            <c:if test="${forceMode==false}">
+            switchCommonUrl: '${ctx}/mark/index?mode=common',
+            </c:if>
+            forceSpecialTag: eval('${forceSpecialTag}'.toLowerCase()),
+            <c:if test="${defaultSetting!=null}">
+            defaultSetting: '${defaultSetting}',
+            </c:if>
+            settingSyncUrl: '${ctx}/mark/update-setting',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'mark-status': {
+                    simple: false,
+                    subjectName: '${subject.displayName}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false,
+                    showTotalScore: true
+                    <c:if test="${enableAllZero==true}">
+                    , enableAllZero: true
                     </c:if>
-					'object-view':{
-					    list: [
-					           {title:getMessage('mark.sidebar.paper'),  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-					           {title:getMessage('mark.sidebar.answer'),  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-	                    ]
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/mark/status',
-				getUrl : '${ctx}/mark/gettask',
-				historyUrl : '${ctx}/mark/gethistory',
-				submitUrl : '${ctx}/mark/savetask'
-				//clearUrl : '${ctx}/mark/clear'
-			});
-		});
-	</script>
+                },
+                'warning-info': {},
+                <c:if test="${isFormal==true}">
+                'problem-process': {
+                    problemTypes: '${problemTypes}'
+                },
+                </c:if>
+                'change-name': {
+                    url: '${ctx}/mark/change-name'
+                },
+                'specialTag': {},
+                'slice-view': {
+                    server: '${sliceServer}'
+                },
+                <c:if test="${sheetView==true}">
+                'sheet-view': {
+                    server: '${sheetServer}',
+                    sheetConfig: '${sheetConfig}'
+                },
+                </c:if>
+                'object-view': {
+                    list: [
+                        {
+                            title: getMessage('mark.sidebar.paper'),
+                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                        },
+                        {
+                            title: getMessage('mark.sidebar.answer'),
+                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                        }
+                    ]
+                }
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/mark/status',
+            getUrl: '${ctx}/mark/gettask',
+            historyUrl: '${ctx}/mark/gethistory',
+            submitUrl: '${ctx}/mark/savetask'
+            //clearUrl : '${ctx}/mark/clear'
+        });
+    });
+</script>
 </body>
 </html>

+ 87 - 87
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

@@ -1,96 +1,96 @@
 <%@ 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" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			$("#loginName").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-			$('#role-select').change(function(){
-			    var role = $('#role-select').val();
-			    if(role=='4'){
-			        $('#subject-code-div').show();
-			    }else{
-			        $('#subject-code-div').hide();
-			    }
-			});
-			$('#role-select').trigger('change');
-		});
-	</script>
+    <title>用户管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#loginName").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+            $('#role-select').change(function () {
+                var role = $('#role-select').val();
+                if (role == '4') {
+                    $('#subject-code-div').show();
+                } else {
+                    $('#subject-code-div').hide();
+                }
+            });
+            $('#role-select').trigger('change');
+        });
+    </script>
 </head>
 <body>
-    <ul class="nav nav-tabs">
-        <li><a href="${ctx}/admin/user/list">用户列表</a></li>
-        <li class="active"><a href="##">用户编辑</a></li>
-    </ul>
-	<form:form id="inputForm" modelAttribute="user" action="${ctx}/admin/user/save" method="post" class="form-horizontal">
-		<form:hidden path="id"/>
-		<tags:message content="${message}"/>
-		<div class="control-group">
-            <label class="control-label">登录名</label>
-            <div class="controls">
-                <form:input path="loginName" htmlEscape="false" maxlength="20" class="required"/>
-            </div>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/user/list">用户列表</a></li>
+    <li class="active"><a href="##">用户编辑</a></li>
+</ul>
+<form:form id="inputForm" modelAttribute="user" action="${ctx}/admin/user/save" method="post" class="form-horizontal">
+    <form:hidden path="id"/>
+    <tags:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">登录名</label>
+        <div class="controls">
+            <form:input path="loginName" htmlEscape="false" maxlength="20" class="required"/>
         </div>
-		<div class="control-group">
-			<label class="control-label">名称</label>
-			<div class="controls">
-				<form:input path="name" htmlEscape="false" maxlength="20" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">密码</label>
-			<div class="controls">
-				<form:password path="password" htmlEscape="false" maxlength="20"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">角色</label>
-			<div class="controls">
-			    <select name="role" id="role-select">
-			        <c:forEach items="${roleList}" var="role">
-			        <option value="${role.value}" <c:if test="${role.value==user.role.value}">selected</c:if>>${role.name}</option>
-			        </c:forEach>
-			    </select>
-			</div>
-		</div>
-		<div class="control-group" id="subject-code-div">
-            <label class="control-label">绑定科目</label>
-            <div class="controls">
-                <form:input path="subjectCode" htmlEscape="false" maxlength="30"/>
-            </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">名称</label>
+        <div class="controls">
+            <form:input path="name" htmlEscape="false" maxlength="20" class="required"/>
         </div>
-		<div class="control-group">
-			<label class="control-label">状态</label>
-			<div class="controls">
-			    <select name="enable" id="enable-select">
-			        <option value="true" <c:if test="${user.enable==true}">selected</c:if>>启用</option>
-			        <option value="false" <c:if test="${user.enable==false}">selected</c:if>>禁用</option>
-			    </select>
-			</div>
-		</div>
-		<div class="form-actions">
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
-			&nbsp;
-			<a href="${ctx}/admin/user/list" class="btn">返回</a>
-		</div>
-	</form:form>
+    </div>
+    <div class="control-group">
+        <label class="control-label">密码</label>
+        <div class="controls">
+            <form:password path="password" htmlEscape="false" maxlength="20"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">角色</label>
+        <div class="controls">
+            <select name="role" id="role-select">
+                <c:if test="roleList != null">
+                    <c:forEach items="${roleList}" var="role">
+                        <option value="${role.value}"
+                                <c:if test="${role.value==user.role.value}">selected</c:if>>${role.name}</option>
+                    </c:forEach>
+                </c:if>
+                <c:if test="user.role!=null && roleList==null">
+                    <option value="${user.role.value}">${user.role.name}</option>
+                </c:if>
+            </select>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">状态</label>
+        <div class="controls">
+            <select name="enable" id="enable-select">
+                <option value="true" <c:if test="${user.enable==true}">selected</c:if>>启用</option>
+                <option value="false" <c:if test="${user.enable==false}">selected</c:if>>禁用</option>
+            </select>
+        </div>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+        &nbsp;
+        <a href="${ctx}/admin/user/list" class="btn">返回</a>
+    </div>
+</form:form>
 </body>
 </html>

+ 113 - 100
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userList.jsp

@@ -1,101 +1,114 @@
-<%@ 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>
-    <ul class="nav nav-tabs">
-        <li class="active"><a href="##">用户列表</a></li>
-        <c:if test="${web_user.schoolAdmin==true}">
-        <li><a href="${ctx}/admin/user/add">创建用户</a></li>
-        </c:if>
-    </ul>
-	<form id="searchForm"  action="${ctx}/admin/user/list" 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>
-			<input type="text" name="loginName" value="${query.name}"  maxlength="20" class="input-medium"/>
-			&nbsp;
-			<label>角色</label>
-            <select class="input-medium" name="role" id="role-select">
-                <option value="">不限</option>
-                <c:forEach items="${roleList}" var="role">
-                <option value="${role.value}" <c:if test="${role.value==query.role.value}">selected</c:if>>${role.name}</option>
-                </c:forEach>
-            </select>
-            &nbsp;
-            <label>状态</label>
-            <select class="input-medium" name="enable" id="enable-select">
-                <option value="">不限</option>
-                <option value="true" <c:if test="${query.enable!=null && query.enable==true}">selected</c:if>>启用</option>
-                <option value="false" <c:if test="${query.enable!=null && query.enable==false}">selected</c:if>>禁用</option>
-            </select>
-            &nbsp;
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;
-			<a href="${ctx}/admin/user/add" class="btn">新建</a>
-			</c:if>
-		</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>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${query.result}" var="user">
-			<tr>
-			    <td>${user.loginName}</td>
-				<td>${user.name}</td>
-				<td>${user.role.name}</td>
-				<td>
-				    <c:if test="${user.enable==true}">
-				    启用
-				    </c:if>
-				    <c:if test="${user.enable==false}">
-				    禁用
-                    </c:if>
-				</td>
-				<td>
-				    <c:if test="${web_user.id!=user.id && web_user.schoolAdmin==true && user.role.value!= 6}">
-					<a href="${ctx}/admin/user/edit?id=${user.id}">修改</a>
-					&nbsp;
-					<a href="${ctx}/admin/user/delete?id=${user.id}" data-name="${user.loginName}" class="delete-link">删除</a>
-					</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-<script type="text/javascript">
-$('.delete-link').click(function(){
-    return confirm('确定要删除用户'+$(this).attr('data-name')+'吗?');
-});
-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>
+<%@ 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>
+<ul class="nav nav-tabs">
+    <li class="active"><a href="##">用户列表</a></li>
+    <c:if test="${web_user.schoolAdmin==true}">
+        <li><a href="${ctx}/admin/user/add">创建用户</a></li>
+    </c:if>
+</ul>
+<form id="searchForm" action="${ctx}/admin/user/list" 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>
+        <input type="text" name="loginName" value="${query.name}" maxlength="20" class="input-medium"/>
+        &nbsp;
+        <label>来源</label>
+        <select class="input-medium" name="source" id="source-select">
+            <option value="">不限</option>
+            <c:forEach items="${sourceList}" var="source">
+                <option value="${source.value}"
+                        <c:if test="${source.value==query.source.value}">selected</c:if>>${source.name}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <label>角色</label>
+        <select class="input-medium" name="role" id="role-select">
+            <option value="">不限</option>
+            <c:forEach items="${roleList}" var="role">
+                <option value="${role.value}"
+                        <c:if test="${role.value==query.role.value}">selected</c:if>>${role.name}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <label>状态</label>
+        <select class="input-medium" name="enable" id="enable-select">
+            <option value="">不限</option>
+            <option value="true" <c:if test="${query.enable!=null && query.enable==true}">selected</c:if>>启用</option>
+            <option value="false" <c:if test="${query.enable!=null && query.enable==false}">selected</c:if>>禁用</option>
+        </select>
+        &nbsp;
+        <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;
+            <a href="${ctx}/admin/user/add" class="btn">新建</a>
+        </c:if>
+    </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>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${query.result}" var="user">
+        <tr>
+            <td>${user.loginName}</td>
+            <td>${user.name}</td>
+            <td>${user.source.name}</td>
+            <td>${user.role.name}</td>
+            <td>
+                <c:if test="${user.enable==true}">
+                    启用
+                </c:if>
+                <c:if test="${user.enable==false}">
+                    禁用
+                </c:if>
+            </td>
+            <td>${user.relatedAccount}</td>
+            <td>
+                <c:if test="${web_user.schoolAdmin==true && user.source.value==1}">
+                    <a href="${ctx}/admin/user/edit?id=${user.id}">修改</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;
+    }
+</script>
+</body>
 </html>

+ 128 - 123
stmms-web/src/main/webapp/static/i18n/messages.properties

@@ -1,140 +1,145 @@
 #login
-user.login.title=\u9ad8\u6821\u8003\u8bd5\u7ba1\u7406\u5e73\u53f0
-user.login.admin=\u7ba1\u7406\u5458\u767b\u5f55
-user.login.marker=\u8bc4\u5377\u5458\u767b\u5f55
-user.login.name=\u7528\u6237\u540d
-user.login.password=\u5bc6\u7801
-user.login.submit=\u767b\u5f55
-user.login.error.account=\u5e10\u53f7\u4e0d\u5b58\u5728
-user.login.error.finish=\u8bc4\u5377\u5df2\u7ed3\u675f
-user.login.error.group=\u5927\u9898\u4e0d\u5b58\u5728
-user.login.error.disabled=\u5e10\u53f7\u5df2\u7981\u7528
-user.login.error.password=\u5bc6\u7801\u9519\u8bef
-user.login.error.access=\u7528\u6237\u6ca1\u6709\u8bbf\u95ee\u6743\u9650
+user.login.title=\u9AD8\u6821\u8003\u8BD5\u7BA1\u7406\u5E73\u53F0
+user.login.admin=\u7BA1\u7406\u5458\u767B\u5F55
+user.login.marker=\u8BC4\u5377\u5458\u767B\u5F55
+user.login.name=\u7528\u6237\u540D
+user.login.password=\u5BC6\u7801
+user.login.submit=\u767B\u5F55
+user.login.error.account=\u5E10\u53F7\u4E0D\u5B58\u5728
+user.login.error.finish=\u8BC4\u5377\u5DF2\u7ED3\u675F
+user.login.error.group=\u5927\u9898\u4E0D\u5B58\u5728
+user.login.error.disabled=\u5E10\u53F7\u5DF2\u7981\u7528
+user.login.error.password=\u5BC6\u7801\u9519\u8BEF
+user.login.error.access=\u7528\u6237\u6CA1\u6709\u8BBF\u95EE\u6743\u9650
 #reset
-user.reset.submit=\u786e\u5b9a
-user.reset.logout=\u9000\u51fa
-user.reset.title=\u9996\u6b21\u767b\u5f55\uff0c\u8bf7\u5b8c\u5584\u8d44\u6599
-user.reset.name=\u8f93\u5165\u7528\u6237\u540d
-user.reset.password=\u8f93\u5165\u65b0\u5bc6\u7801
-user.reset.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
-user.reset.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc710\u4e2a\u5b57
-user.reset.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
-user.reset.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d\uff0c\u4e0d\u80fd\u8d85\u8fc78\u4f4d
+user.reset.submit=\u786E\u5B9A
+user.reset.logout=\u9000\u51FA
+user.reset.title=\u9996\u6B21\u767B\u5F55\uFF0C\u8BF7\u5B8C\u5584\u8D44\u6599
+user.reset.name=\u8F93\u5165\u7528\u6237\u540D
+user.reset.password=\u8F93\u5165\u65B0\u5BC6\u7801
+user.reset.password.again=\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801
+user.reset.name.length=\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC710\u4E2A\u5B57
+user.reset.password.same=\u4E24\u6B21\u5BC6\u7801\u8BF7\u4FDD\u6301\u4E00\u81F4
+user.reset.password.length=\u5BC6\u7801\u7684\u957F\u5EA6\u81F3\u5C114\u4F4D\uFF0C\u4E0D\u80FD\u8D85\u8FC78\u4F4D
 #mark-control
-mark.control.assistant=\u5c0f\u52a9\u624b
-mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
-mark.control.mode.common=\u5207\u6362\u5230\u666e\u901a\u6a21\u5f0f
-mark.control.function=\u8bc4\u5377\u529f\u80fd
-mark.control.logout=\u9000\u51fa
-mark.control.init.error=\u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u91cd\u65b0\u52a0\u8f7d
-mark.control.task.not.exist=\u8bc4\u5377\u5927\u9898\u4e0d\u5b58\u5728
-mark.control.task.finish=\u8bc4\u5377\u5df2\u7ed3\u675f
-mark.control.task.null=\u5f53\u524d\u65e0\u8bc4\u5377\u4efb\u52a1
-mark.control.tsak.error=\u8bc4\u5377\u4efb\u52a1\u63d0\u4ea4\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u9875\u9762
+mark.control.assistant=\u5C0F\u52A9\u624B
+mark.control.mode.track=\u5207\u6362\u5230\u8F68\u8FF9\u6A21\u5F0F
+mark.control.mode.common=\u5207\u6362\u5230\u666E\u901A\u6A21\u5F0F
+mark.control.function=\u8BC4\u5377\u529F\u80FD
+mark.control.logout=\u9000\u51FA
+mark.control.init.error=\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u65B0\u52A0\u8F7D
+mark.control.task.not.exist=\u8BC4\u5377\u5927\u9898\u4E0D\u5B58\u5728
+mark.control.task.finish=\u8BC4\u5377\u5DF2\u7ED3\u675F
+mark.control.task.null=\u5F53\u524D\u65E0\u8BC4\u5377\u4EFB\u52A1
+mark.control.tsak.error=\u8BC4\u5377\u4EFB\u52A1\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762
 #status
-mark.status.student.number=\u8003\u751f\u7f16\u53f7
-mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
-mark.status.objective.score=\u5ba2\u89c2\u5f97\u5206
-mark.status.marked.count=\u5df2\u8bc4
-mark.status.unmark.count=\u672a\u8bc4
-mark.status.top.count=\u5206\u914d
-mark.status.progress=\u8fdb\u5ea6
-mark.status.continue=\u7ee7\u7eed
-mark.status.top.count.finish=\u5206\u914d\u4efb\u52a1\u5df2\u8bc4\u5b8c\uff0c\u662f\u5426\u7ee7\u7eed\uff1f
-mark.status.loading=\u6b63\u5728\u52a0\u8f7d...
-mark.status.logout=\u9000\u51fa
+mark.status.student.number=\u8003\u751F\u7F16\u53F7
+mark.status.library.number=\u4EFB\u52A1\u7F16\u53F7
+mark.status.objective.score=\u5BA2\u89C2\u5F97\u5206
+mark.status.marked.count=\u5DF2\u8BC4
+mark.status.unmark.count=\u672A\u8BC4
+mark.status.top.count=\u5206\u914D
+mark.status.progress=\u8FDB\u5EA6
+mark.status.continue=\u7EE7\u7EED
+mark.status.top.count.finish=\u5206\u914D\u4EFB\u52A1\u5DF2\u8BC4\u5B8C\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F
+mark.status.loading=\u6B63\u5728\u52A0\u8F7D...
+mark.status.logout=\u9000\u51FA
 #single-image-view
-mark.single.zoom.in=\u653e\u5927
-mark.single.zoom.out=\u7f29\u5c0f
-mark.single.zoom.fit=\u9002\u5e94
-mark.single.student.answer=\u7b54\u5377
+mark.single.zoom.in=\u653E\u5927
+mark.single.zoom.out=\u7F29\u5C0F
+mark.single.zoom.fit=\u9002\u5E94
+mark.single.student.answer=\u7B54\u5377
 #chang name
-mark.change.name=\u4fee\u6539\u4e2a\u4eba\u4fe1\u606f
-mark.change.press.name=\u8f93\u5165\u7528\u6237\u540d
-mark.change.press.password=\u8f93\u5165\u65b0\u5bc6\u7801
-mark.change.press.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
-mark.change.confirm=\u786e\u5b9a
-mark.change.name.null=\u540d\u5b57\u4e0d\u80fd\u4e3a\u7a7a
-mark.change.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc78\u4e2a\u5b57
-mark.change.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
-mark.change.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d
-mark.change.network.error=\u7f51\u7edc\u901a\u4fe1\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
-mark.change.error=\u4fee\u6539\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
+mark.change.name=\u4FEE\u6539\u4E2A\u4EBA\u4FE1\u606F
+mark.change.press.name=\u8F93\u5165\u7528\u6237\u540D
+mark.change.press.password=\u8F93\u5165\u65B0\u5BC6\u7801
+mark.change.press.password.again=\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801
+mark.change.confirm=\u786E\u5B9A
+mark.change.name.null=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
+mark.change.name.length=\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC78\u4E2A\u5B57
+mark.change.password.same=\u4E24\u6B21\u5BC6\u7801\u8BF7\u4FDD\u6301\u4E00\u81F4
+mark.change.password.length=\u5BC6\u7801\u7684\u957F\u5EA6\u81F3\u5C114\u4F4D
+mark.change.network.error=\u7F51\u7EDC\u901A\u4FE1\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
+mark.change.error=\u4FEE\u6539\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
 #specialTag
-mark.special.tag=\u7279\u6b8a\u6807\u8bb0
-mark.special.back=\u56de\u9000
-mark.special.clear=\u5168\u90e8\u6e05\u9664
-mark.special.underline=\u4e0b\u5212\u7ebf
-mark.special.open=\u6253\u5f00
-mark.special.close=\u5173\u95ed
+mark.special.tag=\u7279\u6B8A\u6807\u8BB0
+mark.special.back=\u56DE\u9000
+mark.special.clear=\u5168\u90E8\u6E05\u9664
+mark.special.underline=\u4E0B\u5212\u7EBF
+mark.special.open=\u6253\u5F00
+mark.special.close=\u5173\u95ED
 #problem-process
-mark.problem=\u95ee\u9898\u5377
-mark.problem.type=\u9009\u62e9\u95ee\u9898\u7c7b\u578b
-mark.problem.confirm=\u786e\u5b9a
-mark.problem.cancel=\u53d6\u6d88
-mark.problem.check=\u8bf7\u9009\u62e9\u95ee\u9898\u5206\u7c7b
+mark.problem=\u95EE\u9898\u5377
+mark.problem.type=\u9009\u62E9\u95EE\u9898\u7C7B\u578B
+mark.problem.confirm=\u786E\u5B9A
+mark.problem.cancel=\u53D6\u6D88
+mark.problem.check=\u8BF7\u9009\u62E9\u95EE\u9898\u5206\u7C7B
 #thumbnail
-mark.thumbnail=\u7f29\u7565\u56fe
-mark.thumbnail.open=\u6253\u5f00
-mark.thumbnail.close=\u5173\u95ed
+mark.thumbnail=\u7F29\u7565\u56FE
+mark.thumbnail.open=\u6253\u5F00
+mark.thumbnail.close=\u5173\u95ED
 #view-sidebar
-mark.sidebar=\u4fa7\u8fb9\u680f
-mark.sidebar.paper=\u8bd5\u5377
-mark.sidebar.answer=\u7b54\u6848
+mark.sidebar=\u4FA7\u8FB9\u680F
+mark.sidebar.paper=\u8BD5\u5377
+mark.sidebar.answer=\u7B54\u6848
 #mark-history
-mark.history.title=\u56de\u8bc4
-mark.history.time=\u65f6\u95f4
-mark.history.number=\u7f16\u53f7
-mark.history.score=\u603b\u5206
-mark.history.search=\u67e5\u627e\u8bd5\u5377
-mark.history.pre=\u524d
-mark.history.success=\u56de\u8bc4\u6210\u529f\uff0c\u603b\u5206\uff1a
-mark.history.problem=\u56de\u8bc4\u6210\u529f\uff0c\u5df2\u63d0\u4ea4\u95ee\u9898\u5377
-mark.history.loading=\u6b63\u5728\u52a0\u8f7d\u8bf7\u7a0d\u5019
-mark.history.error=\u6682\u65f6\u65e0\u6cd5\u8bfb\u53d6\u8bc4\u5377\u5386\u53f2\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
-mark.history.number.error=\u8bf7\u8f93\u5165\u6570\u5b57
+mark.history.title=\u56DE\u8BC4
+mark.history.time=\u65F6\u95F4
+mark.history.number=\u7F16\u53F7
+mark.history.score=\u603B\u5206
+mark.history.search=\u67E5\u627E\u8BD5\u5377
+mark.history.pre=\u524D
+mark.history.success=\u56DE\u8BC4\u6210\u529F\uFF0C\u603B\u5206\uFF1A
+mark.history.problem=\u56DE\u8BC4\u6210\u529F\uFF0C\u5DF2\u63D0\u4EA4\u95EE\u9898\u5377
+mark.history.loading=\u6B63\u5728\u52A0\u8F7D\u8BF7\u7A0D\u5019
+mark.history.error=\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u8BC4\u5377\u5386\u53F2\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
+mark.history.number.error=\u8BF7\u8F93\u5165\u6570\u5B57
 #mark-board
-mark.board.submit=\u63d0\u4ea4
-mark.board.total.score=\u603b\u5206
-mark.board.score.zero=\u5168\u96f6\u5206
-mark.board.pass=\u8df3 \u8fc7
-mark.board.choose.result=\u9009\u505a\u7ed3\u679c
-mark.board.keyboard=\u952e\u76d8\u7ed9\u5206 >>
-mark.board.mouse=<< \u9f20\u6807\u7ed9\u5206
-mark.board.interval=\u95f4\u9694
+mark.board.submit=\u63D0\u4EA4
+mark.board.total.score=\u603B\u5206
+mark.board.score.zero=\u5168\u96F6\u5206
+mark.board.pass=\u8DF3 \u8FC7
+mark.board.choose.result=\u9009\u505A\u7ED3\u679C
+mark.board.keyboard=\u952E\u76D8\u7ED9\u5206 >>
+mark.board.mouse=<< \u9F20\u6807\u7ED9\u5206
+mark.board.interval=\u95F4\u9694
 mark.board.score=\u5206
-mark.board.back=\u56de\u9000
-mark.board.clear.question=\u6e05\u9664\u672c\u9898
-mark.board.clear=\u6e05\u9664\u5168\u5377
-mark.board.question.not.mark=\u5f53\u524d\u4efb\u52a1\u8fd8\u6709\u672a\u7ed9\u5206\u7684\u9898\uff0c\u8bf7\u7ee7\u7eed\u7ed9\u5206
-mark.board.confirm=,\u786e\u8ba4\u63d0\u4ea4\u5417\uff1f
-mark.board.zero.confirm=\u786e\u8ba4\u8981\u63d0\u4ea4\u5168\u96f6\u5206\u5417\uff1f
-mark.board.null=\u65e0
-mark.board.interval.error=\u4e0d\u7b26\u5408\u5206\u503c\u95f4\u9694\u8981\u6c42
-mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
-mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
-mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
+mark.board.back=\u56DE\u9000
+mark.board.clear.question=\u6E05\u9664\u672C\u9898
+mark.board.clear=\u6E05\u9664\u5168\u5377
+mark.board.question.not.mark=\u5F53\u524D\u4EFB\u52A1\u8FD8\u6709\u672A\u7ED9\u5206\u7684\u9898\uFF0C\u8BF7\u7EE7\u7EED\u7ED9\u5206
+mark.board.confirm=,\u786E\u8BA4\u63D0\u4EA4\u5417\uFF1F
+mark.board.zero.confirm=\u786E\u8BA4\u8981\u63D0\u4EA4\u5168\u96F6\u5206\u5417\uFF1F
+mark.board.null=\u65E0
+mark.board.interval.error=\u4E0D\u7B26\u5408\u5206\u503C\u95F4\u9694\u8981\u6C42
+mark.board.gt=\u4E0D\u80FD\u5927\u4E8E
+mark.board.lt=\u4E0D\u80FD\u5C0F\u4E8E
+mark.board.number.error=\u4E0D\u662F\u5408\u6CD5\u6570\u5B57
 #sheet-view
-mark.sheet=\u539f\u56fe
-mark.sheet.check=\u539f\u56fe\u5207\u6362
-mark.sheet.open=\u6253\u5f00
-mark.sheet.close=\u5173\u95ed
+mark.sheet=\u539F\u56FE
+mark.sheet.check=\u539F\u56FE\u5207\u6362
+mark.sheet.open=\u6253\u5F00
+mark.sheet.close=\u5173\u95ED
+#slice-view
+mark.slice=\u5168\u5377
+mark.slice.check=\u5168\u5377\u5207\u6362
+mark.slice.open=\u6253\u5F00
+mark.slice.close=\u5173\u95ED
 #answer-view
-mark.answer=\u6807\u7b54
+mark.answer=\u6807\u7B54
 #warning-info
-mark.warning.try.again=\u8bf7\u70b9\u51fb\u91cd\u8bd5
-mark.warning.force.special.tag=\u5f3a\u5236\u7279\u6b8a\u6807\u8bb0\u5df2\u5f00\u542f\uff0c\u81f3\u5c11\u4f7f\u7528\u4e00\u4e2a\u7279\u6b8a\u6807\u8bb0
-mark.warning.network.error=\u7f51\u7edc\u5f02\u5e38\uff0c\u4efb\u52a1\u63d0\u4ea4\u5931\u8d25
-mark.warning.task.error=\u9886\u53d6\u8bc4\u5377\u4efb\u52a1\u51fa\u9519
-mark.warning.task.finish=\u8bc4\u5377\u4efb\u52a1\u5df2\u5b8c\u6210
-mark.warning.task.loading=\u8bc4\u5377\u4efb\u52a1\u6b63\u5728\u52a0\u8f7d\u4e2d
-mark.warning.close=\u5173\u95ed
-mark.warning.success=\u56de\u8bc4\u6210\u529f\uff0c\u603b\u5206\uff1a
-mark.warning.problem=\u56de\u8bc4\u95ee\u9898\u5377\u6210\u529f
+mark.warning.try.again=\u8BF7\u70B9\u51FB\u91CD\u8BD5
+mark.warning.force.special.tag=\u5F3A\u5236\u7279\u6B8A\u6807\u8BB0\u5DF2\u5F00\u542F\uFF0C\u81F3\u5C11\u4F7F\u7528\u4E00\u4E2A\u7279\u6B8A\u6807\u8BB0
+mark.warning.network.error=\u7F51\u7EDC\u5F02\u5E38\uFF0C\u4EFB\u52A1\u63D0\u4EA4\u5931\u8D25
+mark.warning.task.error=\u9886\u53D6\u8BC4\u5377\u4EFB\u52A1\u51FA\u9519
+mark.warning.task.finish=\u8BC4\u5377\u4EFB\u52A1\u5DF2\u5B8C\u6210
+mark.warning.task.loading=\u8BC4\u5377\u4EFB\u52A1\u6B63\u5728\u52A0\u8F7D\u4E2D
+mark.warning.close=\u5173\u95ED
+mark.warning.success=\u56DE\u8BC4\u6210\u529F\uFF0C\u603B\u5206\uFF1A
+mark.warning.problem=\u56DE\u8BC4\u95EE\u9898\u5377\u6210\u529F
 #json-view
-mark.json.loading=\u6b63\u5728\u52a0\u8f7d\u4e2d
-mark.json.student.answer=\u8003\u751f\u7b54\u6848\uff1a
-mark.json.answer=\u6807\u7b54\uff1a
-mark.json.body=\u9898\u5e72\uff1a
-mark.json.question.number=\u9898\u53f7\uff1a
+mark.json.loading=\u6B63\u5728\u52A0\u8F7D\u4E2D
+mark.json.student.answer=\u8003\u751F\u7B54\u6848\uFF1A
+mark.json.answer=\u6807\u7B54\uFF1A
+mark.json.body=\u9898\u5E72\uFF1A
+mark.json.question.number=\u9898\u53F7\uFF1A

+ 6 - 1
stmms-web/src/main/webapp/static/i18n/messages_en.properties

@@ -96,7 +96,7 @@ mark.history.error=Unable to read the history at this time. Please try again lat
 mark.history.number.error=please press number
 #mark-board
 mark.board.submit=submit
-mark.board.total.score=Score\uff1a
+mark.board.total.score=Score\uFF1A
 mark.board.score.zero=all zero
 mark.board.pass=pass
 mark.board.choose.result=choose result
@@ -120,6 +120,11 @@ mark.sheet=sheet
 mark.sheet.check=check sheet
 mark.sheet.open=open
 mark.sheet.close=close
+#slice-view
+mark.slice=slice
+mark.slice.check=check slice
+mark.slice.open=open
+mark.slice.close=close
 #answer-view
 mark.answer=answer
 #warning-info

+ 126 - 121
stmms-web/src/main/webapp/static/i18n/messages_ja.properties

@@ -1,140 +1,145 @@
 #login
-user.login.title=\u30c7\u30b8\u30bf\u30eb\u63a1\u70b9\u30b7\u30b9\u30c6\u30e0\u3078\u30ed\u30b0\u30a4\u30f3
-user.login.admin=\u7ba1\u7406\u8005\u767b\u9332
-user.login.marker=\u63a1\u70b9\u8005\u767b\u9332
-user.login.name=\u30e6\u30fc\u30b6\u30fc\u540d
-user.login.password=\u30d1\u30b9\u30ef\u30fc\u30c9
-user.login.submit=\u30ed\u30b0\u30a4\u30f3
-user.login.error.account=\u8a72\u5f53\u3059\u308b\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u5b58\u5728\u3057\u307e\u305b\u3093
-user.login.error.finish=\u63a1\u70b9\u4f5c\u696d\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f
-user.login.error.group=\u8a72\u5f53\u3059\u308b\u5927\u554f\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
-user.login.error.disabled=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u73fe\u5728\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
-user.login.error.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
-user.login.error.access=\u30a2\u30af\u30bb\u30b9\u3059\u308b\u6a29\u5229\u304c\u3042\u308a\u307e\u305b\u3093
+user.login.title=\u30C7\u30B8\u30BF\u30EB\u63A1\u70B9\u30B7\u30B9\u30C6\u30E0\u3078\u30ED\u30B0\u30A4\u30F3
+user.login.admin=\u7BA1\u7406\u8005\u767B\u9332
+user.login.marker=\u63A1\u70B9\u8005\u767B\u9332
+user.login.name=\u30E6\u30FC\u30B6\u30FC\u540D
+user.login.password=\u30D1\u30B9\u30EF\u30FC\u30C9
+user.login.submit=\u30ED\u30B0\u30A4\u30F3
+user.login.error.account=\u8A72\u5F53\u3059\u308B\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u5B58\u5728\u3057\u307E\u305B\u3093
+user.login.error.finish=\u63A1\u70B9\u4F5C\u696D\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F
+user.login.error.group=\u8A72\u5F53\u3059\u308B\u5927\u554F\u304C\u5B58\u5728\u3057\u307E\u305B\u3093
+user.login.error.disabled=\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u73FE\u5728\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
+user.login.error.password=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059
+user.login.error.access=\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u6A29\u5229\u304C\u3042\u308A\u307E\u305B\u3093
 #reset
-user.reset.submit=\u78ba\u5b9a
-user.reset.logout=\u30ed\u30b0\u30a2\u30a6\u30c8
-user.reset.title=\u65b0\u898f\u767b\u9332
-user.reset.name=\u30e6\u30fc\u30b6\u30fc\u540d
-user.reset.password=\u30d1\u30b9\u30ef\u30fc\u30c9
-user.reset.password.again=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u5165\u529b
-user.reset.name.length=\u30d1\u30b9\u30ef\u30fc\u30c9\u306f10\u6587\u5b57\u4ee5\u5185\u306b\u3057\u3066\u304f\u3060\u3055\u3044
-user.reset.password.same=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093
-user.reset.password.length=4\u6587\u5b57\u4ee5\u4e0a\u30018\u6587\u5b57\u4ee5\u5185\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044
+user.reset.submit=\u78BA\u5B9A
+user.reset.logout=\u30ED\u30B0\u30A2\u30A6\u30C8
+user.reset.title=\u65B0\u898F\u767B\u9332
+user.reset.name=\u30E6\u30FC\u30B6\u30FC\u540D
+user.reset.password=\u30D1\u30B9\u30EF\u30FC\u30C9
+user.reset.password.again=\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u518D\u5165\u529B
+user.reset.name.length=\u30D1\u30B9\u30EF\u30FC\u30C9\u306F10\u6587\u5B57\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044
+user.reset.password.same=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093
+user.reset.password.length=4\u6587\u5B57\u4EE5\u4E0A\u30018\u6587\u5B57\u4EE5\u5185\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044
 #mark-control
-mark.control.assistant=\u305d\u306e\u4ed6\u306e\u6a5f\u80fd
-mark.control.mode.track=\u90e8\u5206\u63a1\u70b9\u30e2\u30fc\u30c9\u306b\u5207\u308a\u66ff\u3048\u308b
-mark.control.mode.common=\u901a\u5e38\u63a1\u70b9\u30e2\u30fc\u30c9\u306b\u5207\u308a\u66ff\u3048\u308b
-mark.control.function=\u63a1\u70b9\u6a5f\u80fd
+mark.control.assistant=\u305D\u306E\u4ED6\u306E\u6A5F\u80FD
+mark.control.mode.track=\u90E8\u5206\u63A1\u70B9\u30E2\u30FC\u30C9\u306B\u5207\u308A\u66FF\u3048\u308B
+mark.control.mode.common=\u901A\u5E38\u63A1\u70B9\u30E2\u30FC\u30C9\u306B\u5207\u308A\u66FF\u3048\u308B
+mark.control.function=\u63A1\u70B9\u6A5F\u80FD
 mark.control.logout=EXIT
-mark.control.init.error=\u30c7\u30fc\u30bf\u30fc\u66f4\u65b0\u304c\u5931\u6557\u3057\u305f\u306e\u3067\u3001\u518d\u5ea6\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044
-mark.control.task.not.exist=\u8a72\u5f53\u3059\u308b\u5927\u554f\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
-mark.control.task.finish=\u63a1\u70b9\u4f5c\u696d\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f
-mark.control.task.null=\u63a1\u70b9\u5bfe\u8c61\u304c\u3042\u308a\u307e\u305b\u3093
-mark.control.tsak.error=\u63d0\u51fa\u306b\u5931\u6557\u3057\u305f\u306e\u3067\u3001\u518d\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044
+mark.control.init.error=\u30C7\u30FC\u30BF\u30FC\u66F4\u65B0\u304C\u5931\u6557\u3057\u305F\u306E\u3067\u3001\u518D\u5EA6\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044
+mark.control.task.not.exist=\u8A72\u5F53\u3059\u308B\u5927\u554F\u304C\u5B58\u5728\u3057\u307E\u305B\u3093
+mark.control.task.finish=\u63A1\u70B9\u4F5C\u696D\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F
+mark.control.task.null=\u63A1\u70B9\u5BFE\u8C61\u304C\u3042\u308A\u307E\u305B\u3093
+mark.control.tsak.error=\u63D0\u51FA\u306B\u5931\u6557\u3057\u305F\u306E\u3067\u3001\u518D\u5EA6\u8A66\u3057\u3066\u304F\u3060\u3055\u3044
 #status
-mark.status.student.number=\u53d7\u9a13\u8005\u7ba1\u7406\u756a\u53f7
-mark.status.library.number=\u63a1\u70b9\u30bf\u30b9\u30af\u7ba1\u7406\u756a\u53f7
-mark.status.objective.score=\u30de\u30fc\u30af\u63a1\u70b9\u306e\u70b9\u6570
-mark.status.marked.count=\u63a1\u70b9\u30bf\u30b9\u30af\u7d42\u4e86
-mark.status.unmark.count=\u63a1\u70b9\u30bf\u30b9\u30af\u672a\u7d42\u4e86
-mark.status.top.count=\u5272\u308a\u5f53\u3066\u3089\u308c\u305f\u7b54\u6848\u7528\u7d19\u6570
-mark.status.progress=\u9032\u6357\u72b6\u6cc1
-mark.status.continue=\u5f15\u304d\u7d9a\u304d\u63a1\u70b9\u3057\u307e\u3059\u304b
-mark.status.top.count.finish=\u5272\u308a\u5f53\u3066\u3089\u308c\u305f\u30bf\u30b9\u30af\u304c\u5b8c\u6210\u3057\u307e\u3057\u305f\u3002\u5f15\u304d\u7d9a\u304d\u63a1\u70b9\u3057\u307e\u3059\u304b\uff1f
-mark.status.loading=\u30ed\u30fc\u30c9\u4e2d\u2026
-mark.status.logout=\u30ed\u30b0\u30a2\u30a6\u30c8
+mark.status.student.number=\u53D7\u9A13\u8005\u7BA1\u7406\u756A\u53F7
+mark.status.library.number=\u63A1\u70B9\u30BF\u30B9\u30AF\u7BA1\u7406\u756A\u53F7
+mark.status.objective.score=\u30DE\u30FC\u30AF\u63A1\u70B9\u306E\u70B9\u6570
+mark.status.marked.count=\u63A1\u70B9\u30BF\u30B9\u30AF\u7D42\u4E86
+mark.status.unmark.count=\u63A1\u70B9\u30BF\u30B9\u30AF\u672A\u7D42\u4E86
+mark.status.top.count=\u5272\u308A\u5F53\u3066\u3089\u308C\u305F\u7B54\u6848\u7528\u7D19\u6570
+mark.status.progress=\u9032\u6357\u72B6\u6CC1
+mark.status.continue=\u5F15\u304D\u7D9A\u304D\u63A1\u70B9\u3057\u307E\u3059\u304B
+mark.status.top.count.finish=\u5272\u308A\u5F53\u3066\u3089\u308C\u305F\u30BF\u30B9\u30AF\u304C\u5B8C\u6210\u3057\u307E\u3057\u305F\u3002\u5F15\u304D\u7D9A\u304D\u63A1\u70B9\u3057\u307E\u3059\u304B\uFF1F
+mark.status.loading=\u30ED\u30FC\u30C9\u4E2D\u2026
+mark.status.logout=\u30ED\u30B0\u30A2\u30A6\u30C8
 #single-image-view
-mark.single.zoom.in=\u62e1\u5927
-mark.single.zoom.out=\u7e2e\u5c0f
-mark.single.zoom.fit=\u753b\u9762\u30b5\u30a4\u30ba\u306b\u5408\u308f\u305b\u3066\u8868\u793a
-mark.single.student.answer=\u7b54\u6848\u7528\u7d19
+mark.single.zoom.in=\u62E1\u5927
+mark.single.zoom.out=\u7E2E\u5C0F
+mark.single.zoom.fit=\u753B\u9762\u30B5\u30A4\u30BA\u306B\u5408\u308F\u305B\u3066\u8868\u793A
+mark.single.student.answer=\u7B54\u6848\u7528\u7D19
 #chang name
-mark.change.name=\u30e6\u30fc\u30b6\u30fc\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u5165\u529b
-mark.change.press.name=\u30e6\u30fc\u30b6\u30fc\u540d\u5165\u529b
-mark.change.press.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u5165\u529b
-mark.change.press.password.again=\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u5165\u529b
-mark.change.confirm=\u78ba\u5b9a
-mark.change.name.null=\u30e6\u30fc\u30b6\u30fc\u540d\u5165\u529b
-mark.change.name.length=8\u6587\u5b57\u4ee5\u5185\u306b\u3057\u3066\u304f\u3060\u3055\u3044
-mark.change.password.same=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093
-mark.change.password.length=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u6587\u5b57\u6570\u306f\uff14\u6587\u5b57\u4ee5\u4e0a\u304c\u5fc5\u8981\u3067\u3059
-mark.change.network.error=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u4e0d\u5177\u5408\u304c\u751f\u3058\u305f\u305f\u3081\u3001\u3084\u308a\u76f4\u3057\u3066\u4e0b\u3055\u3044
-mark.change.error=\u64cd\u4f5c\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u518d\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044
+mark.change.name=\u30E6\u30FC\u30B6\u30FC\u30CB\u30C3\u30AF\u30CD\u30FC\u30E0\u5165\u529B
+mark.change.press.name=\u30E6\u30FC\u30B6\u30FC\u540D\u5165\u529B
+mark.change.press.password=\u30D1\u30B9\u30EF\u30FC\u30C9\u5165\u529B
+mark.change.press.password.again=\u30D1\u30B9\u30EF\u30FC\u30C9\u518D\u5165\u529B
+mark.change.confirm=\u78BA\u5B9A
+mark.change.name.null=\u30E6\u30FC\u30B6\u30FC\u540D\u5165\u529B
+mark.change.name.length=8\u6587\u5B57\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044
+mark.change.password.same=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093
+mark.change.password.length=\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u6587\u5B57\u6570\u306F\uFF14\u6587\u5B57\u4EE5\u4E0A\u304C\u5FC5\u8981\u3067\u3059
+mark.change.network.error=\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u306E\u4E0D\u5177\u5408\u304C\u751F\u3058\u305F\u305F\u3081\u3001\u3084\u308A\u76F4\u3057\u3066\u4E0B\u3055\u3044
+mark.change.error=\u64CD\u4F5C\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u518D\u5EA6\u8A66\u3057\u3066\u304F\u3060\u3055\u3044
 #specialTag
-mark.special.tag=\u7279\u6b8a\u8a18\u53f7
-mark.special.back=\u623b\u308b
-mark.special.clear=\u3059\u3079\u3066\u306e\u63a1\u70b9\u3092\u524a\u9664
-mark.special.underline=\u30a2\u30f3\u30c0\u30fc\u30e9\u30a4\u30f3
-mark.special.open=\u958b\u304f
-mark.special.close=\u9589\u3058\u308b
+mark.special.tag=\u7279\u6B8A\u8A18\u53F7
+mark.special.back=\u623B\u308B
+mark.special.clear=\u3059\u3079\u3066\u306E\u63A1\u70B9\u3092\u524A\u9664
+mark.special.underline=\u30A2\u30F3\u30C0\u30FC\u30E9\u30A4\u30F3
+mark.special.open=\u958B\u304F
+mark.special.close=\u9589\u3058\u308B
 #problem-process
-mark.problem=\u7b54\u6848\u7528\u7d19\u554f\u984c\u3042\u308a
-mark.problem.type=\u554f\u984c\u30bf\u30a4\u30d7\u3092\u9078\u629e
-mark.problem.confirm=\u78ba\u5b9a
-mark.problem.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb
-mark.problem.check=\u554f\u984c\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044
+mark.problem=\u7B54\u6848\u7528\u7D19\u554F\u984C\u3042\u308A
+mark.problem.type=\u554F\u984C\u30BF\u30A4\u30D7\u3092\u9078\u629E
+mark.problem.confirm=\u78BA\u5B9A
+mark.problem.cancel=\u30AD\u30E3\u30F3\u30BB\u30EB
+mark.problem.check=\u554F\u984C\u30BF\u30A4\u30D7\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044
 #thumbnail
-mark.thumbnail=\u30b5\u30e0\u30cd\u30a4\u30eb\u8868\u793a
-mark.thumbnail.open=\u958b\u304f
-mark.thumbnail.close=\u9589\u3058\u308b
+mark.thumbnail=\u30B5\u30E0\u30CD\u30A4\u30EB\u8868\u793A
+mark.thumbnail.open=\u958B\u304F
+mark.thumbnail.close=\u9589\u3058\u308B
 #view-sidebar
-mark.sidebar=\u30b5\u30a4\u30c9\u30d0\u30fc
-mark.sidebar.paper=\u554f\u984c\u7528\u7d19
-mark.sidebar.answer=\u6a19\u6e96\u89e3\u7b54
+mark.sidebar=\u30B5\u30A4\u30C9\u30D0\u30FC
+mark.sidebar.paper=\u554F\u984C\u7528\u7D19
+mark.sidebar.answer=\u6A19\u6E96\u89E3\u7B54
 #mark-history
-mark.history.title=\u518d\u63a1\u70b9
+mark.history.title=\u518D\u63A1\u70B9
 mark.history.time=\u6642\u9593
-mark.history.number=\u756a\u53f7
-mark.history.score=\u5408\u8a08\u70b9
-mark.history.search=\u7b54\u6848\u7528\u7d19\u306e\u691c\u7d22
-mark.history.pre=\u623b\u308b
-mark.history.success=\u518d\u63a1\u70b9\u7d42\u4e86\u3000\u5408\u8a08\u70b9\uff1a
-mark.history.problem=\u518d\u63a1\u70b9\u7d42\u4e86\u3000\u63d0\u51fa\u6e08\u307f\u3000
-mark.history.loading=\u30ed\u30fc\u30c9\u4e2d\u2026
-mark.history.error=\u63a1\u70b9\u8a18\u9332\u306e\u8aad\u8fbc\u307f\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044
-mark.history.number.error=\u8a8d\u8b58\u3067\u304d\u306a\u3044\u6587\u5b57
+mark.history.number=\u756A\u53F7
+mark.history.score=\u5408\u8A08\u70B9
+mark.history.search=\u7B54\u6848\u7528\u7D19\u306E\u691C\u7D22
+mark.history.pre=\u623B\u308B
+mark.history.success=\u518D\u63A1\u70B9\u7D42\u4E86\u3000\u5408\u8A08\u70B9\uFF1A
+mark.history.problem=\u518D\u63A1\u70B9\u7D42\u4E86\u3000\u63D0\u51FA\u6E08\u307F\u3000
+mark.history.loading=\u30ED\u30FC\u30C9\u4E2D\u2026
+mark.history.error=\u63A1\u70B9\u8A18\u9332\u306E\u8AAD\u8FBC\u307F\u304C\u3067\u304D\u307E\u305B\u3093\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u3082\u3046\u4E00\u5EA6\u8A66\u3057\u3066\u304F\u3060\u3055\u3044
+mark.history.number.error=\u8A8D\u8B58\u3067\u304D\u306A\u3044\u6587\u5B57
 #mark-board
-mark.board.submit=\u63d0\u51fa
-mark.board.total.score=\u5408\u8a08\u70b9
-mark.board.score.zero=\u5408\u8a08\u70b9\uff1a0
-mark.board.pass=\u30b9\u30ad\u30c3\u30d7 
-mark.board.choose.result=\u63a1\u70b9
-mark.board.keyboard=\u30ad\u30fc\u30dc\u30fc\u30c9\u63a1\u70b9 >>
-mark.board.mouse=<< \u30de\u30a6\u30b9\u63a1\u70b9
-mark.board.interval=\u9593\u9694\u8a2d\u5b9a
-mark.board.score=\u70b9\u6570
-mark.board.back=\u623b\u308b
-mark.board.clear.question=\u90e8\u5206\u63a1\u70b9\u524a\u9664
-mark.board.clear=\u5168\u63a1\u70b9\u306e\u524a\u9664
-mark.board.question.not.mark=\u672a\u63a1\u70b9\u306e\u554f\u984c\u304c\u3042\u308a\u307e\u3059
-mark.board.confirm=,\u63d0\u51fa\u3057\u307e\u3059\u304b\uff1f
-mark.board.zero.confirm=\u5408\u8a08\u70b9\u306f0\u3067\u3059\u3002\u63d0\u51fa\u3057\u307e\u3059\u304b\uff1f
+mark.board.submit=\u63D0\u51FA
+mark.board.total.score=\u5408\u8A08\u70B9
+mark.board.score.zero=\u5408\u8A08\u70B9\uFF1A0
+mark.board.pass=\u30B9\u30AD\u30C3\u30D7 
+mark.board.choose.result=\u63A1\u70B9
+mark.board.keyboard=\u30AD\u30FC\u30DC\u30FC\u30C9\u63A1\u70B9 >>
+mark.board.mouse=<< \u30DE\u30A6\u30B9\u63A1\u70B9
+mark.board.interval=\u9593\u9694\u8A2D\u5B9A
+mark.board.score=\u70B9\u6570
+mark.board.back=\u623B\u308B
+mark.board.clear.question=\u90E8\u5206\u63A1\u70B9\u524A\u9664
+mark.board.clear=\u5168\u63A1\u70B9\u306E\u524A\u9664
+mark.board.question.not.mark=\u672A\u63A1\u70B9\u306E\u554F\u984C\u304C\u3042\u308A\u307E\u3059
+mark.board.confirm=,\u63D0\u51FA\u3057\u307E\u3059\u304B\uFF1F
+mark.board.zero.confirm=\u5408\u8A08\u70B9\u306F0\u3067\u3059\u3002\u63D0\u51FA\u3057\u307E\u3059\u304B\uFF1F
 mark.board.null=
-mark.board.interval.error=\u70b9\u6570\u306e\u6700\u5c0f\u9593\u9694\u3068\u4e00\u81f4\u3057\u3066\u3044\u307e\u305b\u3093
-mark.board.gt=\u4ee5\u4e0b
-mark.board.lt=\u4ee5\u4e0a
-mark.board.number.error=\u8a8d\u8b58\u3067\u304d\u306a\u3044\u6587\u5b57
+mark.board.interval.error=\u70B9\u6570\u306E\u6700\u5C0F\u9593\u9694\u3068\u4E00\u81F4\u3057\u3066\u3044\u307E\u305B\u3093
+mark.board.gt=\u4EE5\u4E0B
+mark.board.lt=\u4EE5\u4E0A
+mark.board.number.error=\u8A8D\u8B58\u3067\u304D\u306A\u3044\u6587\u5B57
 #sheet-view
-mark.sheet=\u7b54\u6848\u7528\u7d19
-mark.sheet.check=\u7b54\u6848\u7528\u7d19\u306e\u5207\u66ff
-mark.sheet.open=\u958b\u304f
-mark.sheet.close=\u9589\u3058\u308b
+mark.sheet=\u7B54\u6848\u7528\u7D19
+mark.sheet.check=\u7B54\u6848\u7528\u7D19\u306E\u5207\u66FF
+mark.sheet.open=\u958B\u304F
+mark.sheet.close=\u9589\u3058\u308B
+#slice-view
+mark.slice=\u7B54\u6848\u7528\u7D19
+mark.slice.check=\u7B54\u6848\u7528\u7D19\u306E\u5207\u66FF
+mark.slice.open=\u958B\u304F
+mark.slice.close=\u9589\u3058\u308B
 #answer-view
-mark.answer=\u6a21\u7bc4\u89e3\u7b54
+mark.answer=\u6A21\u7BC4\u89E3\u7B54
 #warning-info
-mark.warning.try.again=\u3084\u308a\u76f4\u3057\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u4e0b\u3055\u3044
-mark.warning.force.special.tag=\u7279\u6b8a\u8a18\u53f7\u6a5f\u80fd\u304c\u30aa\u30f3\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u3067\u3001\u7279\u6b8a\u8a18\u53f7\u3092\u6700\u4f4e\u4e00\u3064\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044
-mark.warning.network.error=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u4e0d\u5177\u5408\u304c\u751f\u3058\u305f\u305f\u3081\u3001\u63d0\u51fa\u304c\u5931\u6557\u3057\u307e\u3057\u305f
-mark.warning.task.error=\u30c7\u30fc\u30bf\u30fc\u306e\u8aad\u8fbc\u307f\u304c\u5931\u6557\u3057\u307e\u3057\u305f
-mark.warning.task.finish=\u63a1\u70b9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f
-mark.warning.task.loading=\u7b54\u6848\u7528\u7d19\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d\u2026
-mark.warning.close=\u9589\u3058\u308b
-mark.warning.success=\u518d\u63a1\u70b9\u7d42\u4e86\u3001\u5408\u8a08\u70b9\uff1a
-mark.warning.problem=\u554f\u984c\u3042\u308a\u306e\u7b54\u6848\u7528\u7d19\u306e\u518d\u63a1\u70b9\u7d42\u4e86
+mark.warning.try.again=\u3084\u308A\u76F4\u3057\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u4E0B\u3055\u3044
+mark.warning.force.special.tag=\u7279\u6B8A\u8A18\u53F7\u6A5F\u80FD\u304C\u30AA\u30F3\u306B\u306A\u3063\u3066\u3044\u308B\u306E\u3067\u3001\u7279\u6B8A\u8A18\u53F7\u3092\u6700\u4F4E\u4E00\u3064\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
+mark.warning.network.error=\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u306E\u4E0D\u5177\u5408\u304C\u751F\u3058\u305F\u305F\u3081\u3001\u63D0\u51FA\u304C\u5931\u6557\u3057\u307E\u3057\u305F
+mark.warning.task.error=\u30C7\u30FC\u30BF\u30FC\u306E\u8AAD\u8FBC\u307F\u304C\u5931\u6557\u3057\u307E\u3057\u305F
+mark.warning.task.finish=\u63A1\u70B9\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F
+mark.warning.task.loading=\u7B54\u6848\u7528\u7D19\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u2026
+mark.warning.close=\u9589\u3058\u308B
+mark.warning.success=\u518D\u63A1\u70B9\u7D42\u4E86\u3001\u5408\u8A08\u70B9\uFF1A
+mark.warning.problem=\u554F\u984C\u3042\u308A\u306E\u7B54\u6848\u7528\u7D19\u306E\u518D\u63A1\u70B9\u7D42\u4E86
 #json-view
-mark.json.loading=\u30ed\u30fc\u30c9\u4e2d\u2026
-mark.json.student.answer=\u53d7\u9a13\u8005\u306e\u56de\u7b54\uff1a
-mark.json.answer=\u6a21\u7bc4\u89e3\u7b54\uff1a
-mark.json.body=\u8a66\u9a13\u554f\u984c\uff1a
-mark.json.question.number=\u8a66\u9a13\u554f\u984c\u756a\u53f7\uff1a
+mark.json.loading=\u30ED\u30FC\u30C9\u4E2D\u2026
+mark.json.student.answer=\u53D7\u9A13\u8005\u306E\u56DE\u7B54\uFF1A
+mark.json.answer=\u6A21\u7BC4\u89E3\u7B54\uFF1A
+mark.json.body=\u8A66\u9A13\u554F\u984C\uFF1A
+mark.json.question.number=\u8A66\u9A13\u554F\u984C\u756A\u53F7\uFF1A

+ 128 - 123
stmms-web/src/main/webapp/static/i18n/messages_zh.properties

@@ -1,140 +1,145 @@
 #login
-user.login.title=\u9ad8\u6821\u8003\u8bd5\u7ba1\u7406\u5e73\u53f0
-user.login.admin=\u7ba1\u7406\u5458\u767b\u5f55
-user.login.marker=\u8bc4\u5377\u5458\u767b\u5f55
-user.login.name=\u7528\u6237\u540d
-user.login.password=\u5bc6\u7801
-user.login.submit=\u767b\u5f55
-user.login.error.account=\u5e10\u53f7\u4e0d\u5b58\u5728
-user.login.error.finish=\u8bc4\u5377\u5df2\u7ed3\u675f
-user.login.error.group=\u5927\u9898\u4e0d\u5b58\u5728
-user.login.error.disabled=\u5e10\u53f7\u5df2\u7981\u7528
-user.login.error.password=\u5bc6\u7801\u9519\u8bef
-user.login.error.access=\u7528\u6237\u6ca1\u6709\u8bbf\u95ee\u6743\u9650
+user.login.title=\u9AD8\u6821\u8003\u8BD5\u7BA1\u7406\u5E73\u53F0
+user.login.admin=\u7BA1\u7406\u5458\u767B\u5F55
+user.login.marker=\u8BC4\u5377\u5458\u767B\u5F55
+user.login.name=\u7528\u6237\u540D
+user.login.password=\u5BC6\u7801
+user.login.submit=\u767B\u5F55
+user.login.error.account=\u5E10\u53F7\u4E0D\u5B58\u5728
+user.login.error.finish=\u8BC4\u5377\u5DF2\u7ED3\u675F
+user.login.error.group=\u5927\u9898\u4E0D\u5B58\u5728
+user.login.error.disabled=\u5E10\u53F7\u5DF2\u7981\u7528
+user.login.error.password=\u5BC6\u7801\u9519\u8BEF
+user.login.error.access=\u7528\u6237\u6CA1\u6709\u8BBF\u95EE\u6743\u9650
 #reset
-user.reset.submit=\u786e\u5b9a
-user.reset.logout=\u9000\u51fa
-user.reset.title=\u9996\u6b21\u767b\u5f55\uff0c\u8bf7\u5b8c\u5584\u8d44\u6599
-user.reset.name=\u8f93\u5165\u7528\u6237\u540d
-user.reset.password=\u8f93\u5165\u65b0\u5bc6\u7801
-user.reset.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
-user.reset.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc710\u4e2a\u5b57
-user.reset.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
-user.reset.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d\uff0c\u4e0d\u80fd\u8d85\u8fc78\u4f4d
+user.reset.submit=\u786E\u5B9A
+user.reset.logout=\u9000\u51FA
+user.reset.title=\u9996\u6B21\u767B\u5F55\uFF0C\u8BF7\u5B8C\u5584\u8D44\u6599
+user.reset.name=\u8F93\u5165\u7528\u6237\u540D
+user.reset.password=\u8F93\u5165\u65B0\u5BC6\u7801
+user.reset.password.again=\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801
+user.reset.name.length=\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC710\u4E2A\u5B57
+user.reset.password.same=\u4E24\u6B21\u5BC6\u7801\u8BF7\u4FDD\u6301\u4E00\u81F4
+user.reset.password.length=\u5BC6\u7801\u7684\u957F\u5EA6\u81F3\u5C114\u4F4D\uFF0C\u4E0D\u80FD\u8D85\u8FC78\u4F4D
 #mark-control
-mark.control.assistant=\u5c0f\u52a9\u624b
-mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
-mark.control.mode.common=\u5207\u6362\u5230\u666e\u901a\u6a21\u5f0f
-mark.control.function=\u8bc4\u5377\u529f\u80fd
-mark.control.logout=\u9000\u51fa
-mark.control.init.error=\u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u91cd\u65b0\u52a0\u8f7d
-mark.control.task.not.exist=\u8bc4\u5377\u5927\u9898\u4e0d\u5b58\u5728
-mark.control.task.finish=\u8bc4\u5377\u5df2\u7ed3\u675f
-mark.control.task.null=\u5f53\u524d\u65e0\u8bc4\u5377\u4efb\u52a1
-mark.control.tsak.error=\u8bc4\u5377\u4efb\u52a1\u63d0\u4ea4\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u9875\u9762
+mark.control.assistant=\u5C0F\u52A9\u624B
+mark.control.mode.track=\u5207\u6362\u5230\u8F68\u8FF9\u6A21\u5F0F
+mark.control.mode.common=\u5207\u6362\u5230\u666E\u901A\u6A21\u5F0F
+mark.control.function=\u8BC4\u5377\u529F\u80FD
+mark.control.logout=\u9000\u51FA
+mark.control.init.error=\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u65B0\u52A0\u8F7D
+mark.control.task.not.exist=\u8BC4\u5377\u5927\u9898\u4E0D\u5B58\u5728
+mark.control.task.finish=\u8BC4\u5377\u5DF2\u7ED3\u675F
+mark.control.task.null=\u5F53\u524D\u65E0\u8BC4\u5377\u4EFB\u52A1
+mark.control.tsak.error=\u8BC4\u5377\u4EFB\u52A1\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762
 #status
-mark.status.student.number=\u8003\u751f\u7f16\u53f7
-mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
-mark.status.objective.score=\u5ba2\u89c2\u5f97\u5206
-mark.status.marked.count=\u5df2\u8bc4
-mark.status.unmark.count=\u672a\u8bc4
-mark.status.top.count=\u5206\u914d
-mark.status.progress=\u8fdb\u5ea6
-mark.status.continue=\u7ee7\u7eed
-mark.status.top.count.finish=\u5206\u914d\u4efb\u52a1\u5df2\u8bc4\u5b8c\uff0c\u662f\u5426\u7ee7\u7eed\uff1f
-mark.status.loading=\u6b63\u5728\u52a0\u8f7d...
-mark.status.logout=\u9000\u51fa
+mark.status.student.number=\u8003\u751F\u7F16\u53F7
+mark.status.library.number=\u4EFB\u52A1\u7F16\u53F7
+mark.status.objective.score=\u5BA2\u89C2\u5F97\u5206
+mark.status.marked.count=\u5DF2\u8BC4
+mark.status.unmark.count=\u672A\u8BC4
+mark.status.top.count=\u5206\u914D
+mark.status.progress=\u8FDB\u5EA6
+mark.status.continue=\u7EE7\u7EED
+mark.status.top.count.finish=\u5206\u914D\u4EFB\u52A1\u5DF2\u8BC4\u5B8C\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F
+mark.status.loading=\u6B63\u5728\u52A0\u8F7D...
+mark.status.logout=\u9000\u51FA
 #single-image-view
-mark.single.zoom.in=\u653e\u5927
-mark.single.zoom.out=\u7f29\u5c0f
-mark.single.zoom.fit=\u9002\u5e94
-mark.single.student.answer=\u7b54\u5377
+mark.single.zoom.in=\u653E\u5927
+mark.single.zoom.out=\u7F29\u5C0F
+mark.single.zoom.fit=\u9002\u5E94
+mark.single.student.answer=\u7B54\u5377
 #chang name
-mark.change.name=\u4fee\u6539\u4e2a\u4eba\u4fe1\u606f
-mark.change.press.name=\u8f93\u5165\u7528\u6237\u540d
-mark.change.press.password=\u8f93\u5165\u65b0\u5bc6\u7801
-mark.change.press.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
-mark.change.confirm=\u786e\u5b9a
-mark.change.name.null=\u540d\u5b57\u4e0d\u80fd\u4e3a\u7a7a
-mark.change.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc78\u4e2a\u5b57
-mark.change.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
-mark.change.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d
-mark.change.network.error=\u7f51\u7edc\u901a\u4fe1\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
-mark.change.error=\u4fee\u6539\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
+mark.change.name=\u4FEE\u6539\u4E2A\u4EBA\u4FE1\u606F
+mark.change.press.name=\u8F93\u5165\u7528\u6237\u540D
+mark.change.press.password=\u8F93\u5165\u65B0\u5BC6\u7801
+mark.change.press.password.again=\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801
+mark.change.confirm=\u786E\u5B9A
+mark.change.name.null=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
+mark.change.name.length=\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC78\u4E2A\u5B57
+mark.change.password.same=\u4E24\u6B21\u5BC6\u7801\u8BF7\u4FDD\u6301\u4E00\u81F4
+mark.change.password.length=\u5BC6\u7801\u7684\u957F\u5EA6\u81F3\u5C114\u4F4D
+mark.change.network.error=\u7F51\u7EDC\u901A\u4FE1\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
+mark.change.error=\u4FEE\u6539\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
 #specialTag
-mark.special.tag=\u7279\u6b8a\u6807\u8bb0
-mark.special.back=\u56de\u9000
-mark.special.clear=\u5168\u90e8\u6e05\u9664
-mark.special.underline=\u4e0b\u5212\u7ebf
-mark.special.open=\u6253\u5f00
-mark.special.close=\u5173\u95ed
+mark.special.tag=\u7279\u6B8A\u6807\u8BB0
+mark.special.back=\u56DE\u9000
+mark.special.clear=\u5168\u90E8\u6E05\u9664
+mark.special.underline=\u4E0B\u5212\u7EBF
+mark.special.open=\u6253\u5F00
+mark.special.close=\u5173\u95ED
 #problem-process
-mark.problem=\u95ee\u9898\u5377
-mark.problem.type=\u9009\u62e9\u95ee\u9898\u7c7b\u578b
-mark.problem.confirm=\u786e\u5b9a
-mark.problem.cancel=\u53d6\u6d88
-mark.problem.check=\u8bf7\u9009\u62e9\u95ee\u9898\u5206\u7c7b
+mark.problem=\u95EE\u9898\u5377
+mark.problem.type=\u9009\u62E9\u95EE\u9898\u7C7B\u578B
+mark.problem.confirm=\u786E\u5B9A
+mark.problem.cancel=\u53D6\u6D88
+mark.problem.check=\u8BF7\u9009\u62E9\u95EE\u9898\u5206\u7C7B
 #thumbnail
-mark.thumbnail=\u7f29\u7565\u56fe
-mark.thumbnail.open=\u6253\u5f00
-mark.thumbnail.close=\u5173\u95ed
+mark.thumbnail=\u7F29\u7565\u56FE
+mark.thumbnail.open=\u6253\u5F00
+mark.thumbnail.close=\u5173\u95ED
 #view-sidebar
-mark.sidebar=\u4fa7\u8fb9\u680f
-mark.sidebar.paper=\u8bd5\u5377
-mark.sidebar.answer=\u7b54\u6848
+mark.sidebar=\u4FA7\u8FB9\u680F
+mark.sidebar.paper=\u8BD5\u5377
+mark.sidebar.answer=\u7B54\u6848
 #mark-history
-mark.history.title=\u56de\u8bc4
-mark.history.time=\u65f6\u95f4
-mark.history.number=\u7f16\u53f7
-mark.history.score=\u603b\u5206
-mark.history.search=\u67e5\u627e\u8bd5\u5377
-mark.history.pre=\u524d
-mark.history.success=\u56de\u8bc4\u6210\u529f\uff0c\u603b\u5206\uff1a
-mark.history.problem=\u56de\u8bc4\u6210\u529f\uff0c\u5df2\u63d0\u4ea4\u95ee\u9898\u5377
-mark.history.loading=\u6b63\u5728\u52a0\u8f7d\u8bf7\u7a0d\u5019
-mark.history.error=\u6682\u65f6\u65e0\u6cd5\u8bfb\u53d6\u8bc4\u5377\u5386\u53f2\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5
-mark.history.number.error=\u8bf7\u8f93\u5165\u6570\u5b57
+mark.history.title=\u56DE\u8BC4
+mark.history.time=\u65F6\u95F4
+mark.history.number=\u7F16\u53F7
+mark.history.score=\u603B\u5206
+mark.history.search=\u67E5\u627E\u8BD5\u5377
+mark.history.pre=\u524D
+mark.history.success=\u56DE\u8BC4\u6210\u529F\uFF0C\u603B\u5206\uFF1A
+mark.history.problem=\u56DE\u8BC4\u6210\u529F\uFF0C\u5DF2\u63D0\u4EA4\u95EE\u9898\u5377
+mark.history.loading=\u6B63\u5728\u52A0\u8F7D\u8BF7\u7A0D\u5019
+mark.history.error=\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u8BC4\u5377\u5386\u53F2\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5
+mark.history.number.error=\u8BF7\u8F93\u5165\u6570\u5B57
 #mark-board
-mark.board.submit=\u63d0\u4ea4
-mark.board.total.score=\u603b\u5206
-mark.board.score.zero=\u5168\u96f6\u5206
-mark.board.pass=\u8df3 \u8fc7
-mark.board.choose.result=\u9009\u505a\u7ed3\u679c
-mark.board.keyboard=\u952e\u76d8\u7ed9\u5206 >>
-mark.board.mouse=<< \u9f20\u6807\u7ed9\u5206
-mark.board.interval=\u95f4\u9694
+mark.board.submit=\u63D0\u4EA4
+mark.board.total.score=\u603B\u5206
+mark.board.score.zero=\u5168\u96F6\u5206
+mark.board.pass=\u8DF3 \u8FC7
+mark.board.choose.result=\u9009\u505A\u7ED3\u679C
+mark.board.keyboard=\u952E\u76D8\u7ED9\u5206 >>
+mark.board.mouse=<< \u9F20\u6807\u7ED9\u5206
+mark.board.interval=\u95F4\u9694
 mark.board.score=\u5206
-mark.board.back=\u56de\u9000
-mark.board.clear.question=\u6e05\u9664\u672c\u9898
-mark.board.clear=\u6e05\u9664\u5168\u5377
-mark.board.question.not.mark=\u5f53\u524d\u4efb\u52a1\u8fd8\u6709\u672a\u7ed9\u5206\u7684\u9898\uff0c\u8bf7\u7ee7\u7eed\u7ed9\u5206
-mark.board.confirm=,\u786e\u8ba4\u63d0\u4ea4\u5417\uff1f
-mark.board.zero.confirm=\u786e\u8ba4\u8981\u63d0\u4ea4\u5168\u96f6\u5206\u5417\uff1f
-mark.board.null=\u65e0
-mark.board.interval.error=\u4e0d\u7b26\u5408\u5206\u503c\u95f4\u9694\u8981\u6c42
-mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
-mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
-mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
+mark.board.back=\u56DE\u9000
+mark.board.clear.question=\u6E05\u9664\u672C\u9898
+mark.board.clear=\u6E05\u9664\u5168\u5377
+mark.board.question.not.mark=\u5F53\u524D\u4EFB\u52A1\u8FD8\u6709\u672A\u7ED9\u5206\u7684\u9898\uFF0C\u8BF7\u7EE7\u7EED\u7ED9\u5206
+mark.board.confirm=,\u786E\u8BA4\u63D0\u4EA4\u5417\uFF1F
+mark.board.zero.confirm=\u786E\u8BA4\u8981\u63D0\u4EA4\u5168\u96F6\u5206\u5417\uFF1F
+mark.board.null=\u65E0
+mark.board.interval.error=\u4E0D\u7B26\u5408\u5206\u503C\u95F4\u9694\u8981\u6C42
+mark.board.gt=\u4E0D\u80FD\u5927\u4E8E
+mark.board.lt=\u4E0D\u80FD\u5C0F\u4E8E
+mark.board.number.error=\u4E0D\u662F\u5408\u6CD5\u6570\u5B57
 #sheet-view
-mark.sheet=\u539f\u56fe
-mark.sheet.check=\u539f\u56fe\u5207\u6362
-mark.sheet.open=\u6253\u5f00
-mark.sheet.close=\u5173\u95ed
+mark.sheet=\u539F\u56FE
+mark.sheet.check=\u539F\u56FE\u5207\u6362
+mark.sheet.open=\u6253\u5F00
+mark.sheet.close=\u5173\u95ED
+#slice-view
+mark.slice=\u5168\u5377
+mark.slice.check=\u5168\u5377\u5207\u6362
+mark.slice.open=\u6253\u5F00
+mark.slice.close=\u5173\u95ED
 #answer-view
-mark.answer=\u6807\u7b54
+mark.answer=\u6807\u7B54
 #warning-info
-mark.warning.try.again=\u8bf7\u70b9\u51fb\u91cd\u8bd5
-mark.warning.force.special.tag=\u5f3a\u5236\u7279\u6b8a\u6807\u8bb0\u5df2\u5f00\u542f\uff0c\u81f3\u5c11\u4f7f\u7528\u4e00\u4e2a\u7279\u6b8a\u6807\u8bb0
-mark.warning.network.error=\u7f51\u7edc\u5f02\u5e38\uff0c\u4efb\u52a1\u63d0\u4ea4\u5931\u8d25
-mark.warning.task.error=\u9886\u53d6\u8bc4\u5377\u4efb\u52a1\u51fa\u9519
-mark.warning.task.finish=\u8bc4\u5377\u4efb\u52a1\u5df2\u5b8c\u6210
-mark.warning.task.loading=\u8bc4\u5377\u4efb\u52a1\u6b63\u5728\u52a0\u8f7d\u4e2d
-mark.warning.close=\u5173\u95ed
-mark.warning.success=\u56de\u8bc4\u6210\u529f\uff0c\u603b\u5206\uff1a
-mark.warning.problem=\u56de\u8bc4\u95ee\u9898\u5377\u6210\u529f
+mark.warning.try.again=\u8BF7\u70B9\u51FB\u91CD\u8BD5
+mark.warning.force.special.tag=\u5F3A\u5236\u7279\u6B8A\u6807\u8BB0\u5DF2\u5F00\u542F\uFF0C\u81F3\u5C11\u4F7F\u7528\u4E00\u4E2A\u7279\u6B8A\u6807\u8BB0
+mark.warning.network.error=\u7F51\u7EDC\u5F02\u5E38\uFF0C\u4EFB\u52A1\u63D0\u4EA4\u5931\u8D25
+mark.warning.task.error=\u9886\u53D6\u8BC4\u5377\u4EFB\u52A1\u51FA\u9519
+mark.warning.task.finish=\u8BC4\u5377\u4EFB\u52A1\u5DF2\u5B8C\u6210
+mark.warning.task.loading=\u8BC4\u5377\u4EFB\u52A1\u6B63\u5728\u52A0\u8F7D\u4E2D
+mark.warning.close=\u5173\u95ED
+mark.warning.success=\u56DE\u8BC4\u6210\u529F\uFF0C\u603B\u5206\uFF1A
+mark.warning.problem=\u56DE\u8BC4\u95EE\u9898\u5377\u6210\u529F
 #json-view
-mark.json.loading=\u6b63\u5728\u52a0\u8f7d\u4e2d
-mark.json.student.answer=\u8003\u751f\u7b54\u6848\uff1a
-mark.json.answer=\u6807\u7b54\uff1a
-mark.json.body=\u9898\u5e72\uff1a
-mark.json.question.number=\u9898\u53f7\uff1a
+mark.json.loading=\u6B63\u5728\u52A0\u8F7D\u4E2D
+mark.json.student.answer=\u8003\u751F\u7B54\u6848\uFF1A
+mark.json.answer=\u6807\u7B54\uFF1A
+mark.json.body=\u9898\u5E72\uFF1A
+mark.json.question.number=\u9898\u53F7\uFF1A

+ 17 - 11
stmms-web/src/main/webapp/static/mark-new/js/modules/mark-board.js

@@ -12,6 +12,7 @@ function MarkBoard(option) {
     this.autoSubmit = option.autoSubmit === false ? false : true;
     this.showScoreBoard = option.showScoreBoard === false ? false : true;
     this.enableSkip = option.enableSkip === true ? true : false;
+    this.enablAllZero = option.enableAllZero === true ? true : false;
 
     this.init();
 
@@ -26,9 +27,9 @@ function MarkBoard(option) {
         this.initByTask(context.task);
     });
     this.markControl.on('history.submit.success', this, function (event, context, eventObject) {
-    	if(context.task != undefined){
-    		this.initByTask(context.task);
-    	}
+        if (context.task != undefined) {
+            this.initByTask(context.task);
+        }
     });
     this.markControl.on('mark.focus.change', this, function (event, context, eventObject) {
         this.onFocusChange();
@@ -172,12 +173,17 @@ MarkBoard.prototype.init = function () {
             'score.board.show': 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();
-    });
+    if (this.enablAllZero) {
+        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();
+        });
+    } else {
+        this.scoreBoard.find('.all-zero-button').hide();
+        this.stepBoard.find('.all-zero-button').hide();
+    }
 
     this.popover = getDom(this.popover_dom, this.markControl).appendTo(this.markControl.container);
     this.popover.css('text-align', 'center');
@@ -423,12 +429,12 @@ MarkBoard.prototype.validateScore = function (step, scoreString) {
     }
     var score = new Number(scoreString);
     if (score < step.min) {
-        this.togglePopover(true, step.min +" " + getMessage("mark.board.lt"), stepDom);
+        this.togglePopover(true, step.min + " " + getMessage("mark.board.lt"), stepDom);
         //alert('当前分数不应小于' + step.min);
         return false;
     }
     if (score > step.max) {
-        this.togglePopover(true, step.max +" " + getMessage("mark.board.gt"), stepDom);
+        this.togglePopover(true, step.max + " " + getMessage("mark.board.gt"), stepDom);
         //alert('当前分数不应大于' + step.max);
         return false;
     }

+ 127 - 0
stmms-web/src/main/webapp/static/mark-new/js/modules/slice-view.js

@@ -0,0 +1,127 @@
+//查看所有原始裁切图模块
+var slice_view = function (option, success) {
+    var object = new SliceView(option);
+    success();
+    return object;
+}
+
+function SliceView(option) {
+    this.markControl = option.markControl;
+    this.server = option.server;
+    this.init();
+
+    this.markControl.on('task.get.success', this, function (event, context, eventObject) {
+        this.render(context.task.pictureUrls);
+    });
+    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();
+    });
+    this.markControl.on('view.sidebar.open', this, function (event, context, eventObject) {
+        if (context.task != undefined) {
+            this.render(context.task.pictureUrls);
+        }
+    });
+    this.markControl.on('view.sidebar.close', this, function (event, context, eventObject) {
+        if (context.task != undefined) {
+            this.render(context.task.pictureUrls);
+        }
+    });
+}
+
+SliceView.prototype.init = function () {
+    var self = this;
+    this.markControl.initMarkFunction();
+    this.container = getDom(this.container_dom, this.markControl).appendTo(this.markControl.container);
+    this.container.width(this.maxWidth);
+
+    this.container.header = getDom(this.container_header_dom, this.markControl).appendTo(this.container);
+    this.container.header.width('100%');
+
+    this.container.content = getDom(this.container_content_dom, this.markControl).appendTo(this.container);
+    this.container.content.width('100%');
+
+    this.container.header.find('.image-close').click(function () {
+        self.toggle(false);
+    });
+
+    this.control = getDom(this.control_dom, this.markControl).appendTo(this.markControl.container.assistant);
+    this.control.find('#show-slice-button').click(function () {
+        self.markControl.container.assistant.hide();
+        self.toggle(true);
+    });
+    this.control.find('#hide-slice-button').click(function () {
+        self.markControl.container.assistant.hide();
+        self.toggle(false);
+    });
+    self.toggle(false);
+}
+
+SliceView.prototype.render = function (urls) {
+    var self = this;
+    self.container.header.find('.image-switch').empty();
+    self.container.content.empty();
+    if (urls != undefined && urls.length > 0) {
+        for (var i = 0; i < urls.length; i++) {
+            var url = urls[i];
+            var id = "slice" + i;
+            var nav = $('<a href="#" data-url="' + url + '" id="' + id + '"><span>' + (i + 1) + '</span></a>').appendTo(this.container.header.find('.image-switch'));
+        }
+        this.container.header.find('.image-switch a').click(function () {
+            var url = this.getAttribute("data-url");
+            var id = this.getAttribute("id");
+            self.renderContent(self.container.content, id);
+        });
+        this.container.header.find('.image-switch a').first().click();
+
+    } else {
+        this.container.hide();
+    }
+}
+
+SliceView.prototype.renderContent = function (content, id) {
+    content.width(this.markControl.container.centerContent.width());
+    content.height(this.markControl.container.centerContent.height());
+    content.empty();
+    var url = document.getElementById(id).getAttribute("data-url");
+    content.append($('<canvas id="slice-canvas"></canvas>'));
+    var image = new Image();
+    image.crossOrigin = '';
+    image.src = this.server + url;
+    image.canvas = document.getElementById('slice-canvas');
+    image.content = content;
+    image.onload = function () {
+        var ctx = image.canvas.getContext("2d");
+        image.canvas.width = Math.min(image.width, image.content.width());
+        var scale = image.canvas.width / image.width;
+        image.canvas.height = image.height * scale;
+        ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, image.canvas.width, image.canvas.height);
+        //this.canvas.toDataURL("image/jpeg");
+    }
+}
+
+SliceView.prototype.toggle = function (show) {
+    if (show == true) {
+        this.show = true;
+        this.container.show();
+    } else {
+        this.show = false;
+        this.container.hide();
+    }
+}
+
+SliceView.prototype.control_dom = '<h3 class="popover-title" data-i18n-text="mark.slice">全卷</h3>\
+<div class="popover-content"><p id="slice-list" class="popover-list">\
+<a href="#" id="show-slice-button" data-i18n-text="mark.slice.open">打开</a><a href="#" id="hide-slice-button" data-i18n-text="mark.slice.close">关闭</a>\
+</p></div>';
+
+SliceView.prototype.container_dom = '<div class="image-view-popover sheet" style=" width:100%; height:100vh;"></div>';
+
+SliceView.prototype.container_header_dom = '<div class="popover-header">\
+    <p class="title" data-i18n-text="mark.slice.check">全卷切换</p>\
+    <p class="image-switch"></p>\
+    <p class="image-close"><img src="{staticServer}/mark-new/images/images-close-b.png" /></p></div>';
+
+SliceView.prototype.container_content_dom = '<div class="popover-cont"></div>';

+ 51 - 44
stmms-web/src/main/webapp/static/mark-track/js/modules/mark-board.js

@@ -1,5 +1,5 @@
 //给分板模块
-var mark_board = function(option, success) {
+var mark_board = function (option, success) {
     var object = new MarkBoard(option);
     success();
     return object;
@@ -11,32 +11,34 @@ function MarkBoard(option) {
     this.needConfirm = option.needConfirm === true ? true : false;
     this.autoSubmit = option.autoSubmit === false ? false : true;
     this.enableSkip = option.enableSkip === true ? true : false;
+    this.enablAllZero = option.enableAllZero === true ? true : false;
+
     this.init(this.markControl.option.forceSpecialTag);
-    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
+    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.markControl.on('task.load.finish', this, function (event, context, eventObject) {
         this.initByTask(context.task);
     });
-    this.markControl.on('history.submit.success', this, function(event, context, eventObject) {
-    	if(context.task != undefined){
-    		this.initByTask(context.task);
-    	}
+    this.markControl.on('history.submit.success', this, function (event, context, eventObject) {
+        if (context.task != undefined) {
+            this.initByTask(context.task);
+        }
     });
-    this.markControl.on('mark.focus.change', this, function(event, context, eventObject) {
+    this.markControl.on('mark.focus.change', this, function (event, context, eventObject) {
         this.onFocusChange();
     });
-    this.markControl.on('special.tag.enable', this, function(event, context, eventObject) {
+    this.markControl.on('special.tag.enable', this, function (event, context, eventObject) {
         this.specialTag = true;
     });
-    this.markControl.on('special.tag.disable', this, function(event, context, eventObject) {
+    this.markControl.on('special.tag.disable', this, function (event, context, eventObject) {
         this.specialTag = false;
     });
-    this.markControl.on('image.click.event', this, function(event, context, track) {
+    this.markControl.on('image.click.event', this, function (event, context, track) {
         if (track != undefined && this.currentStep != undefined &&
             this.currentStep.currentScore != undefined &&
             this.specialTag != true) {
@@ -55,7 +57,7 @@ function MarkBoard(option) {
         }
     });
     //图片重新加载后,恢复显示所有标记
-    this.markControl.on('image.reload.event', this, function(event, context, eventObject) {
+    this.markControl.on('image.reload.event', this, function (event, context, eventObject) {
         for (var i = 0; i < this.stepList.length; i++) {
             var step = this.stepList[i];
             for (var j = 0; j < step.trackList.length; j++) {
@@ -67,7 +69,7 @@ function MarkBoard(option) {
             }
         }
     });
-    this.markControl.on('key.press', this, function(e, context, event) {
+    this.markControl.on('key.press', this, function (e, context, event) {
         var code = event.keyCode;
         //        console.log('key press:' + code);
         var self = this;
@@ -88,7 +90,7 @@ function MarkBoard(option) {
             }
         }
     });
-    this.markControl.on('key.up', this, function(e, context, event) {
+    this.markControl.on('key.up', this, function (e, context, event) {
         var code = event.keyCode;
         //console.log('key up:' + code);
         var self = this;
@@ -112,7 +114,7 @@ function MarkBoard(option) {
     });
 }
 
-MarkBoard.prototype.init = function(forceSpecialTag) {
+MarkBoard.prototype.init = function (forceSpecialTag) {
     var self = this;
     this.stepBoard = getDom(this.step_board_dom, this.markControl).appendTo(this.markControl.container.centerContainer);
     this.stepBoard.height(this.markControl.container.centerContent.height());
@@ -125,24 +127,28 @@ MarkBoard.prototype.init = function(forceSpecialTag) {
     scoreDom.height((this.stepBoard.height() - 153) * 0.5);
     this.stepBoard.scoreContainer = scoreDom.find('ul');
 
-    this.stepBoard.find('.task-submit-button').click(this, function(event) {
+    this.stepBoard.find('.task-submit-button').click(this, function (event) {
         self.onTaskSubmit();
     });
     //给分板上是否显示全零分
-    if (forceSpecialTag === true) {
-        this.stepBoard.find('.all-zero-button').attr("type", "hidden");
+    //if (forceSpecialTag === true) {
+    //    this.stepBoard.find('.all-zero-button').attr("type", "hidden");
+    //}
+    if (this.enablAllZero && forceSpecialTag === false) {
+        this.stepBoard.find('.all-zero-button').click(this, function (event) {
+            self.allZeroSubmit();
+        });
+    } else {
+        this.stepBoard.find('.all-zero-button').hide();
     }
-    this.stepBoard.find('.all-zero-button').click(this, function(event) {
-        self.allZeroSubmit();
-    });
-    this.stepBoard.find('.undo-last-track-button').click(this, function() {
+    this.stepBoard.find('.undo-last-track-button').click(this, function () {
         if (self.currentStep != undefined && self.currentStep.trackList.length > 0) {
             self.currentStep.trackList.pop();
             self.updateStepScore();
             self.refreshTrack();
         }
     });
-    this.stepBoard.find('.clear-current-track-button').click(this, function() {
+    this.stepBoard.find('.clear-current-track-button').click(this, function () {
         if (self.currentStep != undefined) {
             self.currentStep.currentScore = undefined;
             self.currentStep.trackList = [];
@@ -150,7 +156,7 @@ MarkBoard.prototype.init = function(forceSpecialTag) {
             self.refreshTrack();
         }
     });
-    this.stepBoard.find('.clear-all-track-button').click(this, function() {
+    this.stepBoard.find('.clear-all-track-button').click(this, function () {
         if (self.stepList != undefined) {
             for (var i = 0; i < self.stepList.length; i++) {
                 self.stepList[i].currentScore = undefined;
@@ -163,7 +169,7 @@ MarkBoard.prototype.init = function(forceSpecialTag) {
 
 }
 
-MarkBoard.prototype.initByTask = function(task) {
+MarkBoard.prototype.initByTask = function (task) {
     this.task = task;
     this.stepList = task.markStepList;
     this.currentStep = undefined;
@@ -195,7 +201,7 @@ MarkBoard.prototype.initByTask = function(task) {
     }
 }
 
-MarkBoard.prototype.render = function(task) {
+MarkBoard.prototype.render = function (task) {
     if (task != undefined) {
         var self = this;
         this.stepBoard.stepContainer.empty();
@@ -224,7 +230,7 @@ MarkBoard.prototype.render = function(task) {
             dom.find('p').html(step.title);
             dom.find('p').attr('title', step.title);
             dom.find('h2').html(step.markScore != undefined ? step.markScore : '');
-            dom.click(function() {
+            dom.click(function () {
                 self.onStepSelect($(this).attr('data-number'));
             });
             this.stepArray.push(dom);
@@ -242,7 +248,7 @@ MarkBoard.prototype.render = function(task) {
 
 //切换步骤时,重置当前步骤的状态
 //若当前分数未提交,则还原之前已给的分数;若之前还未给分,则清空分数显示
-MarkBoard.prototype.resetCurrentStep = function() {
+MarkBoard.prototype.resetCurrentStep = function () {
     var step = this.currentStep;
     if (step != undefined) {
         if (step.markScore != undefined) {
@@ -256,7 +262,7 @@ MarkBoard.prototype.resetCurrentStep = function() {
     }
 }
 
-MarkBoard.prototype.onStepSelect = function(stepNumber) {
+MarkBoard.prototype.onStepSelect = function (stepNumber) {
     if (stepNumber <= this.stepCount && stepNumber > 0) {
         var self = this;
         // 还是点击当前步骤,不触发任何动作
@@ -289,14 +295,14 @@ MarkBoard.prototype.onStepSelect = function(stepNumber) {
                 dom2.hide();
             }
 
-            dom2.click(function() {
+            dom2.click(function () {
                 self.onScoreClick($(this).attr('data-number'));
             });
         }
     }
 }
 
-MarkBoard.prototype.onNumberInput = function(number) {
+MarkBoard.prototype.onNumberInput = function (number) {
     var self = this;
     if (this.currentStep == undefined) {
         return;
@@ -308,12 +314,12 @@ MarkBoard.prototype.onNumberInput = function(number) {
     if (this.timeoutId != undefined) {
         clearTimeout(this.timeoutId);
     }
-    this.timeoutId = setTimeout(function() {
+    this.timeoutId = setTimeout(function () {
         self.inputTimeout();
     }, this.timeoutSecond * 1000);
 }
 
-MarkBoard.prototype.inputTimeout = function() {
+MarkBoard.prototype.inputTimeout = function () {
     if (this.currentStep != undefined && this.numberInput != undefined && this.numberInput.length > 0) {
         if (this.numberInput.endWith('.')) {
             this.numberInput = this.numberInput + '5';
@@ -324,7 +330,7 @@ MarkBoard.prototype.inputTimeout = function() {
     this.timeoutId = undefined;
 }
 
-MarkBoard.prototype.onScoreClick = function(scoreNumber) {
+MarkBoard.prototype.onScoreClick = function (scoreNumber) {
     if (this.task == undefined || this.currentStep == undefined) {
         return;
     }
@@ -344,7 +350,7 @@ MarkBoard.prototype.onScoreClick = function(scoreNumber) {
     }
 }
 
-MarkBoard.prototype.trySetScore = function(score) {
+MarkBoard.prototype.trySetScore = function (score) {
     var scoreNumber = undefined;
     if (this.currentStep != undefined && score != undefined) {
         for (var i = 0; i < this.currentStep.scoreArray.length; i++) {
@@ -360,7 +366,7 @@ MarkBoard.prototype.trySetScore = function(score) {
     }
 }
 
-MarkBoard.prototype.resetScore = function() {
+MarkBoard.prototype.resetScore = function () {
     if (this.currentStep != undefined) {
         for (var i = 0; i < this.currentStep.scoreArray.length; i++) {
             this.currentStep.scoreArray[i].removeClass('selected');
@@ -369,14 +375,14 @@ MarkBoard.prototype.resetScore = function() {
     }
 }
 
-MarkBoard.prototype.refreshTrack = function() {
+MarkBoard.prototype.refreshTrack = function () {
     if (this.stepList == undefined) {
         return;
     }
     this.markControl.trigger('mark.tag.clear');
 }
 
-MarkBoard.prototype.updateStepScore = function(step) {
+MarkBoard.prototype.updateStepScore = function (step) {
     if (step == undefined) {
         step = this.currentStep;
     }
@@ -415,7 +421,7 @@ MarkBoard.prototype.updateStepScore = function(step) {
     this.updateTotalScore();
 }
 
-MarkBoard.prototype.updateTotalScore = function() {
+MarkBoard.prototype.updateTotalScore = function () {
     if (this.task != undefined) {
         var totalScore = '';
         var finish = true;
@@ -436,7 +442,7 @@ MarkBoard.prototype.updateTotalScore = function() {
     }
 }
 
-MarkBoard.prototype.allZeroSubmit = function() {
+MarkBoard.prototype.allZeroSubmit = function () {
     if (this.task != undefined && this.stepList != undefined && this.stepList.length > 0 && confirm(getMessage("mark.board.zero.confirm"))) {
         for (var i = 0; i < this.stepList.length; i++) {
             this.stepList[i].markFinish = true;
@@ -458,7 +464,7 @@ MarkBoard.prototype.allZeroSubmit = function() {
     }
 }
 
-MarkBoard.prototype.onTaskSubmit = function() {
+MarkBoard.prototype.onTaskSubmit = function () {
     if (this.task == undefined) {
         return;
     }
@@ -481,15 +487,16 @@ MarkBoard.prototype.onTaskSubmit = function() {
     }
     if (!finish) {
         alert(getMessage("mark.board.question.not.mark"));
-    } else if (!this.needConfirm || confirm(getMessage("mark.board.total.score") + totalScore + getMessage("mark.board.confirm") )) {
-        this.task.totalScore = totalScore;"mark.board.total.score"
+    } else if (!this.needConfirm || confirm(getMessage("mark.board.total.score") + totalScore + getMessage("mark.board.confirm"))) {
+        this.task.totalScore = totalScore;
+        "mark.board.total.score"
         this.task.scoreList = scoreList.join(',');
         this.task.trackList = trackList;
         this.markControl.submitTask();
     }
 }
 
-MarkBoard.prototype.onFocusChange = function() {
+MarkBoard.prototype.onFocusChange = function () {
     this.currentStep = null;
 }