ting.yin 5 years ago
parent
commit
14c669f2f5
28 changed files with 1149 additions and 95 deletions
  1. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/DataSyncDao.java
  2. 131 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/DataSync.java
  3. 11 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/DataSyncService.java
  4. 29 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/DataSyncServiceImpl.java
  5. 1 1
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/LockType.java
  6. 3 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java
  7. 158 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java
  8. 164 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java
  9. 116 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/ByteUtil.java
  10. 207 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/HttpUtil.java
  11. 25 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SHA256.java
  12. 12 16
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java
  13. 4 4
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  14. 11 0
      stmms-web/src/main/webapp/WEB-INF/application.properties
  15. 0 1
      stmms-web/src/main/webapp/WEB-INF/language/messages.properties
  16. 0 1
      stmms-web/src/main/webapp/WEB-INF/language/messages_en_US.properties
  17. 0 1
      stmms-web/src/main/webapp/WEB-INF/language/messages_ja_JP.properties
  18. 1 1
      stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml
  19. 88 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/dataSync.jsp
  20. 4 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp
  21. 10 2
      stmms-web/src/main/webapp/static/i18n/messages.properties
  22. 15 7
      stmms-web/src/main/webapp/static/i18n/messages_en.properties
  23. 127 8
      stmms-web/src/main/webapp/static/i18n/messages_ja.properties
  24. 10 2
      stmms-web/src/main/webapp/static/i18n/messages_zh.properties
  25. 4 4
      stmms-web/src/main/webapp/static/mark-json/js/mark-control.js
  26. 4 4
      stmms-web/src/main/webapp/static/mark-new/js/mark-control.js
  27. 0 34
      stmms-web/src/main/webapp/static/mark-new/js/modules/mark-board.js
  28. 4 4
      stmms-web/src/main/webapp/static/mark-track/js/mark-control.js

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/DataSyncDao.java

@@ -0,0 +1,10 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+
+public interface DataSyncDao extends PagingAndSortingRepository<DataSync, Integer>, JpaSpecificationExecutor<DataSync> {
+
+}

+ 131 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/DataSync.java

@@ -0,0 +1,131 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "eb_data_sync")
+public class DataSync implements Serializable {
+
+    private static final long serialVersionUID = 7371535739573217406L;
+
+    @Id
+    private Integer examId;
+
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "create_time")
+    private Date createTime;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    @Column(name = "root_org_id", nullable = false)
+    private String rootOrgId;
+
+    @Column(name = "cloud_exam_id", nullable = false)
+    private Long cloudExamId;
+
+    @Column(name = "subject_code", nullable = false)
+    private String subjectCode;
+
+    @Column(name = "next_id", nullable = false)
+    private Long nextId;
+
+    @Column(name = "url", nullable = false)
+    private String url;
+
+    @Column(name = "finished", nullable = false)
+    private boolean finished;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(String rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public Long getCloudExamId() {
+        return cloudExamId;
+    }
+
+    public void setCloudExamId(Long cloudExamId) {
+        this.cloudExamId = cloudExamId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Long getNextId() {
+        return nextId;
+    }
+
+    public void setNextId(Long nextId) {
+        this.nextId = nextId;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public boolean isFinished() {
+        return finished;
+    }
+
+    public void setFinished(boolean finished) {
+        this.finished = finished;
+    }
+
+}

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/DataSyncService.java

@@ -0,0 +1,11 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+
+public interface DataSyncService {
+
+    DataSync save(DataSync exam);
+
+    DataSync findByExamId(Integer examId);
+
+}

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

@@ -0,0 +1,29 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+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.DataSyncDao;
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
+
+@Service
+public class DataSyncServiceImpl extends BaseQueryService<DataSync> implements DataSyncService {
+
+    @Autowired
+    private DataSyncDao dataSyncDao;
+
+    @Transactional
+    @Override
+    public DataSync save(DataSync dataSync) {
+        return dataSyncDao.save(dataSync);
+    }
+
+    @Override
+    public DataSync findByExamId(Integer examId) {
+        return dataSyncDao.findOne(examId);
+    }
+
+}

+ 1 - 1
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/LockType.java

@@ -3,7 +3,7 @@ package cn.com.qmth.stmms.common.enums;
 public enum LockType {
 public enum LockType {
     GROUP("group"), STUDENT("student"), MARKER("marker"), USER("user"), FORMAL_LIBRARY("formal_library"), TRIAL_LIBRARY(
     GROUP("group"), STUDENT("student"), MARKER("marker"), USER("user"), FORMAL_LIBRARY("formal_library"), TRIAL_LIBRARY(
             "trial_library"), ARBITRATE("arbitrate"), BATCH_QUALITY("batch_quality"), SAVE_SHEET("save_sheet"), SCORE_CALCULATE(
             "trial_library"), ARBITRATE("arbitrate"), BATCH_QUALITY("batch_quality"), SAVE_SHEET("save_sheet"), SCORE_CALCULATE(
-            "score_calculate"), GROUP_LIBRARY("group_library");
+            "score_calculate"), GROUP_LIBRARY("group_library"), DATA_SYNC("data_sync");
 
 
     private String name;
     private String name;
 
 

+ 3 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -67,12 +67,12 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         setIntervalScore(question.getIntervalScore());
         setIntervalScore(question.getIntervalScore());
         setPicList(group != null ? group.getPicList() : "");
         setPicList(group != null ? group.getPicList() : "");
         setDoubleRate(group != null && group.getDoubleRate() != null ? group.getDoubleRate() : 0d);
         setDoubleRate(group != null && group.getDoubleRate() != null ? group.getDoubleRate() : 0d);
-        setArbitrateThreshold(
-                group != null && group.getArbitrateThreshold() != null ? group.getArbitrateThreshold() : 0d);
+        setArbitrateThreshold(group != null && group.getArbitrateThreshold() != null ? group.getArbitrateThreshold()
+                : 0d);
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
                 : ScorePolicy.AVG.getValue());
                 : ScorePolicy.AVG.getValue());
         setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().getName() : "");
         setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().getName() : "");
-        setTrialCount(group.getTrialCount());
+        setTrialCount(group != null ? group.getTrialCount() : 0);
     }
     }
 
 
     public ExamQuestion transform() {
     public ExamQuestion transform() {

+ 158 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java

@@ -0,0 +1,158 @@
+package cn.com.qmth.stmms.admin.exam;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
+import cn.com.qmth.stmms.admin.thread.DataSyncThread;
+import cn.com.qmth.stmms.admin.utils.HttpUtil;
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
+
+@Controller
+@RequestMapping("/admin/exam/data/sync")
+public class DataSyncController extends BaseExamController {
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
+    @Qualifier("task-executor")
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
+    @Autowired
+    private LockService lockService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private DataSyncService dataSyncService;
+
+    @Value("${qmth.examcloud.host}")
+    private String host;
+
+    @Value("${qmth.examcloud.port}")
+    private String port;
+
+    @Value("${qmth.examcloud.rootOrgId}")
+    private String rootOrgId;
+
+    @Value("${qmth.examcloud.appId}")
+    private String appId;
+
+    @Value("${qmth.examcloud.secretKey}")
+    private String secretKey;
+
+    @Value("${qmth.examcloud.subject.uri}")
+    private String subjectUri;
+
+    @Value("${qmth.examcloud.student.uri}")
+    private String studentUri;
+
+    @Value("${qmth.examcloud.pageSize}")
+    private Integer pageSize;
+
+    @Value("${file.root}")
+    private String baseDir;
+
+    @RequestMapping
+    public ModelAndView index(HttpServletRequest request) {
+        int examId = getSessionExamId(request);
+        ModelAndView view = new ModelAndView("modules/exam/dataSync");
+        view.addObject("running", lockService.isLocked(LockType.DATA_SYNC, examId));
+        view.addObject("host", host);
+        view.addObject("port", port);
+        view.addObject("rootOrgId", rootOrgId);
+        view.addObject("subjectUri", subjectUri);
+        view.addObject("studentUri", studentUri);
+        return view;
+    }
+
+    @RequestMapping(value = "/start", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView sync1(HttpServletRequest request, DataSync dataSync) {
+        int examId = getSessionExamId(request);
+        if (lockService.trylock(LockType.DATA_SYNC, examId)) {
+            DataSyncThread thread = new DataSyncThread(dataSync, secretKey, appId, pageSize, baseDir, lockService,
+                    dataSyncService, examService, studentService);
+            taskExecutor.submit(thread);
+        }
+        return new ModelAndView("redirect:/admin/exam/dataSync");
+    }
+
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView exportFile(String url, HttpServletRequest request, HttpServletResponse response,
+            RedirectAttributes redirectAttributes) {
+        int examId = getSessionExamId(request);
+        DataSync sync = dataSyncService.findByExamId(examId);
+        List<SubjectiveQuestionDTO> list = getPaperStruct(url, sync.getCloudExamId());
+        try {
+            new ExportExcel("主观题数据", SubjectiveQuestionDTO.class, 2).setDataList(list).write(response, "主观题数据.xlsx")
+                    .dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导出数据失败!失败信息:" + e.getMessage());
+        }
+        return new ModelAndView("redirect:/admin/exam");
+    }
+
+    private List<SubjectiveQuestionDTO> getPaperStruct(String url, Long cloudExamId) {
+        List<SubjectiveQuestionDTO> list = new ArrayList<SubjectiveQuestionDTO>();
+
+        HttpUtil subjectHttp = new HttpUtil(url, secretKey, appId, rootOrgId);
+        JSONObject datas = new JSONObject();
+        datas.accumulate("examId", cloudExamId);
+        String subjectResult = subjectHttp.httpAction(null, datas.toString());
+        JSONObject subjectJson = JSONObject.fromObject(subjectResult);
+        JSONArray subjectArray = subjectJson.getJSONArray("paperStructList");
+        for (int i = 0; i < subjectArray.size(); i++) {
+            JSONObject subject = subjectArray.getJSONObject(i);
+            JSONArray questionArray = subject.getJSONArray("questions");
+            for (int j = 0; j < questionArray.size(); j++) {
+                JSONObject question = questionArray.getJSONObject(i);
+                SubjectiveQuestionDTO questionDTO = new SubjectiveQuestionDTO();
+                questionDTO.setSubjectCode(subject.getString("subjectCode"));
+                questionDTO.setSubjectName(subject.getString("subjectName"));
+                questionDTO.setMainNumber(question.getInt("mainNumber"));
+                questionDTO.setTitle(question.getString("mainTitle"));
+                questionDTO.setSubNumber(question.getInt("subNumber"));
+                questionDTO.setTotalScore(question.getDouble("totalScore"));
+                list.add(questionDTO);
+            }
+        }
+        return list;
+    }
+}

+ 164 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java

@@ -0,0 +1,164 @@
+package cn.com.qmth.stmms.admin.thread;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cn.com.qmth.stmms.admin.utils.HttpUtil;
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+
+public class DataSyncThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(DataSyncThread.class);
+
+    private DataSync dataSync;
+
+    private ExamStudentService studentService;
+
+    private ExamService examService;
+
+    private LockService lockService;
+
+    private DataSyncService dataSyncService;
+
+    private Integer pageSize;
+
+    private String baseDir;
+
+    private HttpUtil subjectHttp;
+
+    private HttpUtil studentHttp;
+
+    public static final String PAPER_STRUCT = "paperStructList";
+
+    public static final String SUBJECT_CODE = "subjectCode";
+
+    public static final String SUBJECT_NAME = "subjectName";
+
+    public static final String DATA_LIST = "dataList";
+
+    public static final String START_ID = "startId";
+
+    public static final String NEXT_ID = "nextId";
+
+    public static final String DEFAULT_NULL = "#";
+
+    public static final String SIZE = "size";
+
+    public DataSyncThread(DataSync dataSync, String secretKey, String appId, Integer pageSize, String baseDir,
+            LockService lockService, DataSyncService dataSyncService, ExamService examService,
+            ExamStudentService studentService) {
+        this.dataSync = dataSync;
+        this.lockService = lockService;
+        this.dataSyncService = dataSyncService;
+        this.examService = examService;
+        this.studentService = studentService;
+        this.pageSize = pageSize;
+        this.baseDir = baseDir;
+        this.subjectHttp = new HttpUtil(dataSync.getUrl(), secretKey, appId, dataSync.getRootOrgId());
+        this.studentHttp = new HttpUtil(dataSync.getUrl(), secretKey, appId, dataSync.getRootOrgId());
+    }
+
+    @Override
+    public void run() {
+        log.info("start data sync for examId=" + dataSync.getExamId());
+        try {
+            // 获取考试信息
+            Exam exam = examService.findById(dataSync.getExamId());
+            DataSync sync = dataSyncService.findByExamId(dataSync.getExamId());
+            if (sync == null) {
+                sync = dataSync;
+            }
+            JSONObject datas = new JSONObject();
+            datas.accumulate("examId", dataSync.getCloudExamId());
+            String subjectResult = subjectHttp.httpAction(null, datas.toString());
+            JSONObject subjectJson = JSONObject.fromObject(subjectResult);
+            JSONArray subjectArray = subjectJson.getJSONArray(PAPER_STRUCT);
+            for (int i = 0; i < subjectArray.size(); i++) {
+                JSONObject subject = subjectArray.getJSONObject(i);
+                String subjectCode = subject.getString(SUBJECT_CODE);
+                String subjectName = subject.getString(SUBJECT_NAME);
+                Long startId = 0L;
+                while (startId != null) {
+                    datas.accumulate(SUBJECT_CODE, subjectCode);
+                    datas.accumulate(START_ID, startId);
+                    datas.accumulate(SIZE, pageSize);
+                    String studentResult = studentHttp.httpAction(null, datas.toString());
+
+                    JSONObject studentJson = JSONObject.fromObject(studentResult);
+
+                    Long nextId = studentJson.getLong(NEXT_ID);
+                    if (startId == nextId) {
+                        startId = null;
+                    } else {
+                        startId = nextId;
+                    }
+
+                    JSONArray studentArray = studentJson.getJSONArray(DATA_LIST);
+                    List<ExamStudent> list = new ArrayList<ExamStudent>();
+                    for (int j = 0; j < studentArray.size(); j++) {
+                        JSONObject student = studentArray.getJSONObject(i);
+                        ExamStudent examStudent = new ExamStudent();
+                        examStudent.setExamId(dataSync.getExamId());
+                        examStudent.setStudentCode(student.getString("studentCode"));
+                        examStudent.setName(student.getString("name"));
+                        examStudent.setCollege(DEFAULT_NULL);
+                        examStudent.setClassName(DEFAULT_NULL);
+                        examStudent.setTeacher(DEFAULT_NULL);
+                        examStudent.setCampusName(DEFAULT_NULL);
+                        examStudent.setSubjectCode(subjectCode);
+                        examStudent.setSubjectName(subjectName);
+                        examStudent.setExamNumber(student.getString("examNumber"));
+
+                        examStudent.setSchoolId(exam.getSchoolId());
+                        examStudent.setAbsent(false);
+                        examStudent.setUpload(false);
+                        examStudent.setException(false);
+                        examStudent.setSliceCount(0);
+                        examStudent.setSheetCount(0);
+                        examStudent.setObjectiveScore(0d);
+                        examStudent.setSubjectiveScore(0d);
+
+                        list.add(examStudent);
+
+                        String answerJson = student.getString("subjectives");
+                        File file = new File(baseDir
+                                + PictureUrlBuilder.getAnswerJson(exam.getId(), subjectCode, null,
+                                        examStudent.getExamNumber()));
+                        FileOutputStream fos = new FileOutputStream(file);
+                        fos.write(answerJson.getBytes());
+                        fos.close();
+                    }
+                    studentService.batchSave(list);
+                    dataSync.setUpdateTime(new Date());
+                    dataSync.setNextId(nextId);
+                    dataSync.setSubjectCode(subjectCode);
+                    dataSyncService.save(dataSync);
+                }
+            }
+            dataSync.setFinished(true);
+            dataSyncService.save(dataSync);
+        } catch (Exception e) {
+            log.error("data sync exception for examId=" + dataSync.getExamId(), e);
+        } finally {
+            lockService.unlock(LockType.DATA_SYNC, dataSync.getExamId());
+            log.info("finish data sync for examId=" + dataSync.getExamId());
+        }
+    }
+}

+ 116 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/ByteUtil.java

@@ -0,0 +1,116 @@
+package cn.com.qmth.stmms.admin.utils;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+/**
+ * 字节转换工具
+ *
+ * @author WANGWEI
+ * @date 2018年4月27日
+ */
+public class ByteUtil {
+	public final static short UNSIGNED_MAX_VALUE = (Byte.MAX_VALUE * 2) + 1;
+
+	private ByteUtil() {
+	}
+
+	public static int unsignedPromote(byte b) {
+		return b & 0xff;
+	}
+
+	public static String toHexAscii(byte b) {
+		StringWriter sw = new StringWriter(2);
+		addHexAscii(b, sw);
+		return sw.toString();
+	}
+
+	public static String toLowercaseHexAscii(byte b) {
+		StringWriter sw = new StringWriter(2);
+		addLowercaseHexAscii(b, sw);
+		return sw.toString();
+	}
+
+	public static String toHexAscii(byte[] bytes) {
+		int len = bytes.length;
+		StringWriter sw = new StringWriter(len * 2);
+		for (int i = 0; i < len; ++i)
+			addHexAscii(bytes[i], sw);
+		return sw.toString();
+	}
+
+	public static String toLowercaseHexAscii(byte[] bytes) {
+		int len = bytes.length;
+		StringWriter sw = new StringWriter(len * 2);
+		for (int i = 0; i < len; ++i)
+			addLowercaseHexAscii(bytes[i], sw);
+		return sw.toString();
+	}
+
+	public static byte[] fromHexAscii(String s) throws NumberFormatException {
+		try {
+			int len = s.length();
+			if ((len % 2) != 0)
+				throw new NumberFormatException("Hex ascii must be exactly two digits per byte.");
+
+			int out_len = len / 2;
+			byte[] out = new byte[out_len];
+			int i = 0;
+			StringReader sr = new StringReader(s);
+			while (i < out_len) {
+				int val = (16 * fromHexDigit(sr.read())) + fromHexDigit(sr.read());
+				out[i++] = (byte) val;
+			}
+			return out;
+		} catch (IOException e) {
+			throw new InternalError("IOException reading from StringReader?!?!");
+		}
+	}
+
+	static void addHexAscii(byte b, StringWriter sw) {
+		int ub = unsignedPromote(b);
+		int h1 = ub / 16;
+		int h2 = ub % 16;
+		sw.write(toHexDigit(h1));
+		sw.write(toHexDigit(h2));
+	}
+
+	static void addLowercaseHexAscii(byte b, StringWriter sw) {
+		int ub = unsignedPromote(b);
+		int h1 = ub / 16;
+		int h2 = ub % 16;
+		sw.write(toLowercaseHexDigit(h1));
+		sw.write(toLowercaseHexDigit(h2));
+	}
+
+	private static int fromHexDigit(int c) throws NumberFormatException {
+		if (c >= 0x30 && c < 0x3A)
+			return c - 0x30;
+		else if (c >= 0x41 && c < 0x47)
+			return c - 0x37;
+		else if (c >= 0x61 && c < 0x67)
+			return c - 0x57;
+		else
+			throw new NumberFormatException('\'' + c + "' is not a valid hexadecimal digit.");
+	}
+
+	private static char toHexDigit(int h) {
+		char out;
+		if (h <= 9)
+			out = (char) (h + 0x30);
+		else
+			out = (char) (h + 0x37);
+		return out;
+	}
+
+	private static char toLowercaseHexDigit(int h) {
+		char out;
+		if (h <= 9)
+			out = (char) (h + 0x30);
+		else
+			out = (char) (h + 0x57);
+		return out;
+	}
+
+}

+ 207 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/HttpUtil.java

@@ -0,0 +1,207 @@
+package cn.com.qmth.stmms.admin.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Map;
+
+import net.sf.json.JSONObject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HttpUtil {
+
+    private static Logger log = LoggerFactory.getLogger(HttpUtil.class);
+
+    /** 默认的编码格式 */
+    public static final String DEFAULT_CHARSET = "UTF-8";
+
+    public static final String CONTENT_TYPE = "Content-Type";
+
+    public static final String APPLICATION_JSON = "application/json;charset=utf-8";
+
+    public static final String METHOD_POST = "POST";
+
+    public static final String ACCESS_TOKEN = "Access-Token";
+
+    public static final String TIMESTAMP = "timestamp";
+
+    public static final String ROOT_ORG_ID = "rootOrgId";
+
+    public static final String APP_ID = "appId";
+
+    // 请求地址
+    protected String uri = null;
+
+    protected String secretKey = null;
+
+    protected String appId = null;
+
+    protected String rootOrgId = null;
+
+    public HttpUtil(String uri, String secretKey, String appId, String rootOrgId) {
+        this.uri = uri;
+        this.secretKey = secretKey;
+        this.appId = appId;
+        this.rootOrgId = rootOrgId;
+    }
+
+    /**
+     * 
+     * @param params
+     *            headers参数
+     * @param datas
+     *            requestParams参数
+     * @return
+     */
+    public String httpAction(Map<String, String> params, String datas) {
+        String result = null;
+        HttpURLConnection conn = null;
+        OutputStream os = null;
+        InputStream is = null;
+
+        try {
+            // 获取链接
+            URL url = new URL(uri);
+            conn = (HttpURLConnection) url.openConnection();
+
+            long timestamp = System.currentTimeMillis();
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(rootOrgId).append(appId).append(timestamp).append(secretKey);
+
+            byte[] bytes = SHA256.encode(sb.toString());
+            String accessToken = ByteUtil.toHexAscii(bytes);
+
+            conn.setRequestMethod(METHOD_POST);
+            conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON);
+            // conn.setRequestProperty("accept", "application/json");
+            // 设置鉴权
+            conn.setRequestProperty(ACCESS_TOKEN, accessToken);
+            // 机构
+            conn.setRequestProperty(APP_ID, appId);
+            conn.setRequestProperty(ROOT_ORG_ID, rootOrgId);
+            // 设置时间
+            conn.setRequestProperty(TIMESTAMP, String.valueOf(timestamp));
+
+            conn.setUseCaches(false);
+            conn.setDoOutput(true);
+
+            // 设置额外的参数
+            if (params != null && !params.isEmpty()) {
+
+                for (Map.Entry<String, String> param : params.entrySet()) {
+                    conn.setRequestProperty(param.getKey(), param.getValue());
+                }
+            }
+            // 创建链接
+            conn.connect();
+            // 设置请求参数
+            if (datas != null) {
+                os = conn.getOutputStream();
+                os.write(datas.getBytes());
+                os.flush();
+            }
+
+            result = getResult(conn);
+        } catch (IOException e) {
+            log.error("Http connection error!", e);
+            e.printStackTrace();
+            // 操作失败
+            return null;
+        } finally {
+            try {
+                if (os != null) {
+                    os.close();
+                    os = null;
+                }
+                if (is != null) {
+                    is.close();
+                    is = null;
+                }
+            } catch (IOException e) {
+                log.error("Http connection error!", e);
+            }
+
+            if (conn != null) {
+                conn.disconnect();
+                conn = null;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 获得连接请求的返回数据
+     * 
+     * @param conn
+     * 
+     * @return 字符串
+     */
+    private String getResult(HttpURLConnection conn) throws IOException {
+
+        StringBuilder text = new StringBuilder();
+
+        InputStream is = null;
+        InputStreamReader sr = null;
+        BufferedReader br = null;
+
+        int code = conn.getResponseCode();
+
+        try {
+            is = code >= 400 ? conn.getErrorStream() : conn.getInputStream();
+
+            sr = new InputStreamReader(is, DEFAULT_CHARSET);
+            br = new BufferedReader(sr);
+
+            char[] chars = new char[4096];
+            int length = 0;
+
+            while ((length = br.read(chars)) != -1) {
+                text.append(chars, 0, length);
+            }
+        } finally {
+            if (br != null) {
+                br.close();
+                br = null;
+            }
+            if (sr != null) {
+                sr.close();
+                sr = null;
+            }
+            if (is != null) {
+                is.close();
+                is = null;
+            }
+        }
+        if (code >= 400) {
+            throw new IOException(text.toString());
+        }
+        return text.toString();
+    }
+
+    public static void main(String[] args) {
+        HttpUtil subjectHttp = new HttpUtil(
+                "http://ecs-test.qmth.com.cn:8007/api/exchange/outer/question/getSubjectivePaperStruct", "123456",
+                "11", "17128");
+        JSONObject json = new JSONObject();
+        json.accumulate("examId", 57);
+        String subjectJson = subjectHttp.httpAction(null, json.toString());
+        System.out.println(subjectJson);
+
+        HttpUtil studentHttp = new HttpUtil(
+                "http://ecs-test.qmth.com.cn:8007/api/exchange/outer/question/getSubjectiveQuestion", "123456", "11",
+                "17128");
+        json.accumulate("subjectCode", "CSKC");
+        json.accumulate("startId", 0);
+        json.accumulate("size", 50);
+        String studentJson = studentHttp.httpAction(null, json.toString());
+        System.out.println(studentJson);
+    }
+}

+ 25 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SHA256.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.admin.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * SHA256加密
+ * 
+ * @author WANGWEI
+ *
+ */
+public class SHA256 {
+
+	public static byte[] encode(String str) {
+		MessageDigest messageDigest;
+		try {
+			messageDigest = MessageDigest.getInstance("SHA-256");
+		} catch (NoSuchAlgorithmException e) {
+			throw new RuntimeException(e);
+		}
+		messageDigest.update(str.getBytes());
+		return messageDigest.digest();
+	}
+
+}

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

@@ -1,23 +1,18 @@
 package cn.com.qmth.stmms.common.controller;
 package cn.com.qmth.stmms.common.controller;
 
 
 import java.util.Date;
 import java.util.Date;
-import java.util.Locale;
 import java.util.UUID;
 import java.util.UUID;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
-import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.i18n.SessionLocaleResolver;
 
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 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.model.Marker;
@@ -81,27 +76,27 @@ public class LoginController {
 
 
                     new WebUser(u.getId(), u.getRole(), webToken).writeToSession(session);
                     new WebUser(u.getId(), u.getRole(), webToken).writeToSession(session);
 
 
-                    if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN || u.getRole() == Role.SUBJECT_HEADER
-                            || u.getRole() == Role.SCHOOL_VIEWER) {
+                    if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN
+                            || u.getRole() == Role.SUBJECT_HEADER || u.getRole() == Role.SCHOOL_VIEWER) {
                         ModelAndView modelAndView = new ModelAndView("redirect:admin/home");
                         ModelAndView modelAndView = new ModelAndView("redirect:admin/home");
                         return modelAndView;
                         return modelAndView;
                     } else {
                     } else {
                         ModelAndView view = new ModelAndView("modules/sys/login");
                         ModelAndView view = new ModelAndView("modules/sys/login");
-                        view.addObject("message", "用户没有访问权限");
+                        view.addObject("message", "user.login.error.access");
                         view.addObject("showType", showType);
                         view.addObject("showType", showType);
                         view.addObject("indexLogo", indexLogo);
                         view.addObject("indexLogo", indexLogo);
                         return view;
                         return view;
                     }
                     }
                 } else {
                 } else {
                     ModelAndView modelAndView = new ModelAndView("modules/sys/login");
                     ModelAndView modelAndView = new ModelAndView("modules/sys/login");
-                    modelAndView.addObject("message", "密码错误");
+                    modelAndView.addObject("message", "user.login.error.password");
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("indexLogo", indexLogo);
                     modelAndView.addObject("indexLogo", indexLogo);
                     return modelAndView;
                     return modelAndView;
                 }
                 }
             } else {
             } else {
                 ModelAndView modelAndView = new ModelAndView("modules/sys/login");
                 ModelAndView modelAndView = new ModelAndView("modules/sys/login");
-                modelAndView.addObject("message", "无此用户");
+                modelAndView.addObject("message", "user.login.error.account");
                 modelAndView.addObject("showType", showType);
                 modelAndView.addObject("showType", showType);
                 modelAndView.addObject("indexLogo", indexLogo);
                 modelAndView.addObject("indexLogo", indexLogo);
                 return modelAndView;
                 return modelAndView;
@@ -111,26 +106,27 @@ public class LoginController {
             if (marker != null) {
             if (marker != null) {
                 ModelAndView modelAndView = new ModelAndView("modules/sys/login");
                 ModelAndView modelAndView = new ModelAndView("modules/sys/login");
                 if (!marker.getPassword().equals(user.getPassword())) {
                 if (!marker.getPassword().equals(user.getPassword())) {
-                    modelAndView.addObject("message", "密码错误");
+                    modelAndView.addObject("message", "user.login.error.password");
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("indexLogo", indexLogo);
                     modelAndView.addObject("indexLogo", indexLogo);
                     return modelAndView;
                     return modelAndView;
                 }
                 }
                 if (marker.isEnable() == false) {
                 if (marker.isEnable() == false) {
-                    modelAndView.addObject("message", "帐号已禁用");
+                    modelAndView.addObject("message", "user.login.error.disabled");
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("indexLogo", indexLogo);
                     modelAndView.addObject("indexLogo", indexLogo);
                     return modelAndView;
                     return modelAndView;
                 }
                 }
-                MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+                MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber());
                 if (group == null) {
                 if (group == null) {
-                    modelAndView.addObject("message", "大题不存在");
+                    modelAndView.addObject("message", "user.login.error.group");
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("indexLogo", indexLogo);
                     modelAndView.addObject("indexLogo", indexLogo);
                     return modelAndView;
                     return modelAndView;
                 }
                 }
                 if (group.getStatus() == MarkStatus.FINISH) {
                 if (group.getStatus() == MarkStatus.FINISH) {
-                    modelAndView.addObject("message", "评卷已结束");
+                    modelAndView.addObject("message", "user.login.error.finish");
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("showType", showType);
                     modelAndView.addObject("indexLogo", indexLogo);
                     modelAndView.addObject("indexLogo", indexLogo);
                     return modelAndView;
                     return modelAndView;
@@ -150,7 +146,7 @@ public class LoginController {
             }
             }
 
 
             ModelAndView view = new ModelAndView("modules/sys/login");
             ModelAndView view = new ModelAndView("modules/sys/login");
-            view.addObject("message", "帐号不存在");
+            view.addObject("message", "user.login.error.account");
             view.addObject("showType", showType);
             view.addObject("showType", showType);
             view.addObject("indexLogo", indexLogo);
             view.addObject("indexLogo", indexLogo);
             return view;
             return view;

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

@@ -291,11 +291,11 @@ public class MarkController extends BaseController {
             if (group == null) {
             if (group == null) {
                 task = new Task();
                 task = new Task();
                 task.setExist(false);
                 task.setExist(false);
-                task.setMessage("评卷大题不存在");
+                task.setMessage("mark.control.task.not.exist");
             } else if (group.getStatus() == MarkStatus.FINISH) {
             } else if (group.getStatus() == MarkStatus.FINISH) {
                 task = new Task();
                 task = new Task();
                 task.setExist(false);
                 task.setExist(false);
-                task.setMessage("评卷已结束");
+                task.setMessage("mark.control.task.finish");
             } else if (group.getStatus() == MarkStatus.TRIAL) {
             } else if (group.getStatus() == MarkStatus.TRIAL) {
                 task = getTrialTask(marker);
                 task = getTrialTask(marker);
             } else if (group.getStatus() == MarkStatus.FORMAL) {
             } else if (group.getStatus() == MarkStatus.FORMAL) {
@@ -304,7 +304,7 @@ public class MarkController extends BaseController {
             if (task == null) {
             if (task == null) {
                 task = new Task();
                 task = new Task();
                 task.setExist(false);
                 task.setExist(false);
-                task.setMessage("当前无评卷任务");
+                task.setMessage("mark.control.task.null");
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("get task error", e);
             log.error("get task error", e);
@@ -386,7 +386,7 @@ public class MarkController extends BaseController {
         result.accumulate("success", success);
         result.accumulate("success", success);
         result.accumulate("status", status(request));
         result.accumulate("status", status(request));
         if (!success) {
         if (!success) {
-            result.accumulate("message", "评卷任务提交失败,请刷新页面");
+            result.accumulate("message", "mark.control.tsak.error");
         }
         }
         return result;
         return result;
     }
     }

+ 11 - 0
stmms-web/src/main/webapp/WEB-INF/application.properties

@@ -47,3 +47,14 @@ marker.showBtnImportAndBtnUpdateImport=false
 marker.forceMode=
 marker.forceMode=
 ##\u9996\u9875\u53EF\u9009\u7684logo\u6587\u4EF6
 ##\u9996\u9875\u53EF\u9009\u7684logo\u6587\u4EF6
 index.logo=
 index.logo=
+
+##qmth.config
+qmth.examcloud.host=http://ecs-test.qmth.com.cn
+qmth.examcloud.port=8007
+qmth.examcloud.rootOrgId=0
+qmth.examcloud.appId=11
+qmth.examcloud.secretKey=123456
+qmth.examcloud.pageSize=50
+qmth.examcloud.subject.uri=/api/exchange/outer/paper/getSubjectivePaperStruct
+qmth.examcloud.student.uri=/api/exchange/outer/question/getSubjectiveQuestion
+

+ 0 - 1
stmms-web/src/main/webapp/WEB-INF/language/messages.properties

@@ -1 +0,0 @@
-user.login=\u767B\u5F55

+ 0 - 1
stmms-web/src/main/webapp/WEB-INF/language/messages_en_US.properties

@@ -1 +0,0 @@
-user.login=login

+ 0 - 1
stmms-web/src/main/webapp/WEB-INF/language/messages_ja_JP.properties

@@ -1 +0,0 @@
-user.login=login_JP

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml

@@ -167,6 +167,6 @@
     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
         <property name="defaultEncoding" value="UTF-8"/>
         <property name="defaultEncoding" value="UTF-8"/>
-        <property name="basenames" value="/WEB-INF/language/messages"/>
+        <property name="basenames" value="/static/i18n/messages"/>
     </bean>
     </bean>
 </beans> 
 </beans> 

+ 88 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/dataSync.jsp

@@ -0,0 +1,88 @@
+<%@ 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" %>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			$("#name").focus();
+			var pictureConfig = '${pictureConfig}';
+			window.localStorage.setItem("pictureConfig",pictureConfig);
+			$("#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>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/admin/exam-list">考试列表</a></li>
+		<li class="active"><a href="##">数据同步</a></li>
+	</ul><br/>
+	<form:form id="inputForm" modelAttribute="exam" action="${ctx}/admin/exam/data/sync" 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="name" htmlEscape="false" maxlength="200" class="required"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">类型</label>
+			<div class="controls">
+				<select class="input-small" name="type" disabled="disabled" id="examType">
+                	 <option value="${exam.type.value}">${exam.type.name}</option>
+            	</select>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">强制标记</label>
+			<div class="controls">
+				<input name="forceSpecialTag" type="checkbox" <c:if test="${exam.forceSpecialTag}">checked</c:if>/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">及格分</label>
+			<div class="controls">
+				<input name="passScore" type="number" value="${exam.passScore }"class="required" oninput="if(value<0)value=0"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">优秀分</label>
+			<div class="controls">
+				<input name="excellentScore" type="number" value="${exam.excellentScore }" class="required" oninput="if(value<0)value=0"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">状态</label>
+			<div class="controls">
+				<select class="input-small" name="StatusValue">
+                <c:forEach items="${statusList}" var="item">
+                	 <option value="${item.value}" <c:if test="${item.value==exam.status.value}">selected</c:if>>${item.name}</option>
+                </c:forEach>
+            </select>
+			</div>
+		</div>
+		<div class="form-actions">
+			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+			&nbsp;
+			<a href="${ctx}/admin/exam-list" class="btn"/>返回</a>
+		</div>
+	</form:form>
+</body>
+</html>

+ 4 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <html>
 <head>
 <head>
-    <title><spring:message code="user.login"/></title>
+    <title><spring:message code="user.login.submit"/></title>
     <meta name="decorator" content="default"/>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <link rel="stylesheet" href="${ctxStatic}/common/login.css">
     <link rel="stylesheet" href="${ctxStatic}/common/login.css">
@@ -57,9 +57,11 @@
                         <input type="password" class="form-control required" id="password" name="password" placeholder="请输入密码"
                         <input type="password" class="form-control required" id="password" name="password" placeholder="请输入密码"
                                autocomplete="off" data-i18n-placeholder="user.login.password"/>
                                autocomplete="off" data-i18n-placeholder="user.login.password"/>
                     </div>
                     </div>
+                    <c:if test="${message != null }">
                     <div class="point <c:if test="${message != null }"></c:if><c:if test="${message == null }">hide</c:if>">
                     <div class="point <c:if test="${message != null }"></c:if><c:if test="${message == null }">hide</c:if>">
-                        <em class="error">${message }</em>
+                        <em class="error"><spring:message code="${message }"/></em>
                     </div>
                     </div>
+                    </c:if>
                     <div class="login-btn"><input class="opacity" type="submit" value="登 录" data-i18n-value="user.login.submit"/></div>
                     <div class="login-btn"><input class="opacity" type="submit" value="登 录" data-i18n-value="user.login.submit"/></div>
                 </form>
                 </form>
             </div>
             </div>

+ 10 - 2
stmms-web/src/main/webapp/static/i18n/messages.properties

@@ -5,6 +5,12 @@ user.login.marker=\u8bc4\u5377\u5458\u767b\u5f55
 user.login.name=\u7528\u6237\u540d
 user.login.name=\u7528\u6237\u540d
 user.login.password=\u5bc6\u7801
 user.login.password=\u5bc6\u7801
 user.login.submit=\u767b\u5f55
 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
 #mark-control
 #mark-control
 mark.control.assistant=\u5c0f\u52a9\u624b
 mark.control.assistant=\u5c0f\u52a9\u624b
 mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
 mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
@@ -12,6 +18,10 @@ mark.control.mode.common=\u5207\u6362\u5230\u666e\u901a\u6a21\u5f0f
 mark.control.function=\u8bc4\u5377\u529f\u80fd
 mark.control.function=\u8bc4\u5377\u529f\u80fd
 mark.control.logout=\u9000\u51fa
 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.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
 #status
 mark.status.student.number=\u8003\u751f\u7f16\u53f7
 mark.status.student.number=\u8003\u751f\u7f16\u53f7
 mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
 mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
@@ -92,8 +102,6 @@ mark.board.interval.error=\u4e0d\u7b26\u5408\u5206\u503c\u95f4\u9694\u8981\u6c42
 mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
 mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
 mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
 mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
 mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
 mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
-mark.board.step.error=\u5fc5\u987b\u9009\u62e9\u4e00\u9898\u5206\u53d1\uff01
-mark.board.step.same=\u4e0d\u80fd\u91cd\u65b0\u5206\u53d1\u5230\u540c\u4e00\u9898\uff01
 #sheet-view
 #sheet-view
 mark.sheet=\u539f\u56fe
 mark.sheet=\u539f\u56fe
 mark.sheet.check=\u539f\u56fe\u5207\u6362
 mark.sheet.check=\u539f\u56fe\u5207\u6362

+ 15 - 7
stmms-web/src/main/webapp/static/i18n/messages_en.properties

@@ -1,10 +1,16 @@
 #login
 #login
-user.login.title=College Management
+user.login.title=Marking System
 user.login.admin=Admin
 user.login.admin=Admin
 user.login.marker=Marker
 user.login.marker=Marker
 user.login.name=username
 user.login.name=username
 user.login.password=password
 user.login.password=password
 user.login.submit=Login
 user.login.submit=Login
+user.login.error.account=Account does not exist
+user.login.error.finish=marking is finish
+user.login.error.group=the question group is not exist
+user.login.error.disabled=Account disabled
+user.login.error.password=Password error
+user.login.error.access=User does not have access
 #mark-control
 #mark-control
 mark.control.assistant=Assistant
 mark.control.assistant=Assistant
 mark.control.mode.track=Track Mode
 mark.control.mode.track=Track Mode
@@ -12,12 +18,16 @@ mark.control.mode.common=Common Mode
 mark.control.function=Marking function
 mark.control.function=Marking function
 mark.control.logout=logout
 mark.control.logout=logout
 mark.control.init.error=Initialization failed, please refresh the page!
 mark.control.init.error=Initialization failed, please refresh the page!
+mark.control.task.not.exist=the task question is not exist
+mark.control.task.finish=the marking is finished
+mark.control.task.null=There is no task now
+mark.control.tsak.error=task submit failed, please refresh the page!
 #status
 #status
 mark.status.student.number=student number
 mark.status.student.number=student number
 mark.status.library.number=task number
 mark.status.library.number=task number
 mark.status.objective.score=objective score
 mark.status.objective.score=objective score
-mark.status.marked.count=marked
-mark.status.unmark.count=unmark
+mark.status.marked.count=done
+mark.status.unmark.count=todo
 mark.status.top.count=assigned
 mark.status.top.count=assigned
 mark.status.progress=progress
 mark.status.progress=progress
 mark.status.continue=continue
 mark.status.continue=continue
@@ -87,13 +97,11 @@ mark.board.clear=clear all
 mark.board.question.not.mark=There are still questions not mark, please continue
 mark.board.question.not.mark=There are still questions not mark, please continue
 mark.board.confirm=,Are you sure to submit?
 mark.board.confirm=,Are you sure to submit?
 mark.board.zero.confirm=Are you sure to submit all zero?
 mark.board.zero.confirm=Are you sure to submit all zero?
-mark.board.null=blank
+mark.board.null=
 mark.board.interval.error=score interval error
 mark.board.interval.error=score interval error
 mark.board.gt=cannot be greater than
 mark.board.gt=cannot be greater than
 mark.board.lt=cannot be less than
 mark.board.lt=cannot be less than
 mark.board.number.error=not a number
 mark.board.number.error=not a number
-mark.board.step.error=must be choose a question\uff01
-mark.board.step.same=Can't redistribute to the same question!
 #sheet-view
 #sheet-view
 mark.sheet=sheet
 mark.sheet=sheet
 mark.sheet.check=check sheet
 mark.sheet.check=check sheet
@@ -103,7 +111,7 @@ mark.sheet.close=close
 mark.answer=answer
 mark.answer=answer
 #warning-info
 #warning-info
 mark.warning.try.again=please click try again
 mark.warning.try.again=please click try again
-mark.warning.force.special.tag=Force special tag is onen, please use at least one special tag
+mark.warning.force.special.tag=Force special tag is open, please use at least one tag
 mark.warning.network.error=network error,get task failed
 mark.warning.network.error=network error,get task failed
 mark.warning.task.error=get task failed
 mark.warning.task.error=get task failed
 mark.warning.task.finish=marking task finished
 mark.warning.task.finish=marking task finished

+ 127 - 8
stmms-web/src/main/webapp/static/i18n/messages_ja.properties

@@ -1,8 +1,127 @@
-user.login.admin=Admin
-user.login.marker=Marker
-user.login.name=username
-user.login.password=password
-user.login.submit=Login
-user.logout=logout
-
-mark.progress=progress
+#login
+user.login.title=\u30de\u30fc\u30ad\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0
+user.login.admin=\u7ba1\u7406\u4eba\u767b\u9332
+user.login.marker=\u63a1\u70b9\u54e1\u767b\u9332
+user.login.name=\u30e6\u30fc\u30b6\u30fc\u30cd\u30fc\u30e0
+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=\u30de\u30fc\u30ad\u30f3\u30b0\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f
+user.login.error.group=\u8a72\u5f53\u3059\u308b\u30b0\u30eb\u30fc\u30d7\u306f\u5b58\u5728\u3057\u307e\u305b\u3093
+user.login.error.disabled=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u7981\u6b62\u3055\u308c\u305f
+user.login.error.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u30a8\u30e9\u30fc
+user.login.error.access=\u30e6\u30fc\u30b6\u30fc\u306f\u30b7\u30b9\u30c6\u30e0\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u6a29\u9650\u3092\u6301\u3061\u307e\u305b\u3093
+#mark-control
+mark.control.assistant=\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8
+mark.control.mode.track=\u8ecc\u8de1\u30e2\u30fc\u30c9\u3078
+mark.control.mode.common=\u30ce\u30fc\u30de\u30eb\u30e2\u30fc\u30c9\u3078
+mark.control.function=\u30de\u30fc\u30ad\u30f3\u30b0\u529f\u80fd
+mark.control.logout=\u30ed\u30b0\u30a2\u30a6\u30c8
+mark.control.init.error=\u521d\u671f\u5316\u5931\u6557\u3057\u305f\u306e\u3067\u3001\u30a6\u30a7\u30d6\u30da\u30fc\u30b8\u3092\u30ea\u30ed\u30fc\u30c9\u4e0b\u3055\u3044
+mark.control.task.not.exist=\u8a72\u5f53\u3059\u308b\u984c\u76ee\u306f\u898b\u5f53\u305f\u308a\u307e\u305b\u3093
+mark.control.task.finish=\u30de\u30fc\u30ad\u30f3\u30b0\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f
+mark.control.task.null=\u8a72\u5f53\u3059\u308b\u30bf\u30b9\u30af\u306f\u898b\u5f53\u305f\u308a\u307e\u305b\u3093
+mark.control.tsak.error=\u30bf\u30b9\u30af\u306e\u63d0\u51fa\u306f\u5931\u6557\u3057\u305f\u3001\u30a6\u30a7\u30d6\u30da\u30fc\u30b8\u3092\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\u4e0b\u3055\u3044
+#status
+mark.status.student.number=\u53d7\u9a13\u751f\u756a\u53f7
+mark.status.library.number=\u30bf\u30b9\u30af\u756a\u53f7
+mark.status.objective.score=\u30aa\u30d6\u30b8\u30a7\u30af\u30c6\u30a3\u30d6\u30b9\u30b3\u30a2
+mark.status.marked.count=\u63a1\u70b9\u6e08\u307f
+mark.status.unmark.count=\u63a1\u70b9\u306a\u3057
+mark.status.top.count=\u5272\u308a\u5f53\u3066
+mark.status.progress=\u9032\u5ea6
+mark.status.continue=\u7d9a\u884c\u3059\u308b
+mark.status.top.count.finish=\u5272\u308a\u5f53\u3066\u305f\u4efb\u52d9\u304c\u5b8c\u6210\u3057\u305f\u306e\u3067\u3001\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f
+mark.status.loading=\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0...
+mark.status.logout=\u30ed\u30b0\u30a2\u30a6\u30c8
+#single-image-view
+mark.single.zoom.in=\u30ba\u30fc\u30e0\u30a4\u30f3
+mark.single.zoom.out=\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
+mark.single.zoom.fit=\u9069\u5fdc
+mark.single.student.answer=\u8a66\u9a13\u7528\u7d19
+#chang name
+mark.change.name=\u500b\u4eba\u60c5\u5831\u306e\u5909\u66f4
+mark.change.press.name=\u30e6\u30fc\u30b6\u30fc\u30cd\u30fc\u30e0\u3092\u5165\u529b\u4e0b\u3055\u3044
+mark.change.press.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u4e0b\u3055\u3044
+mark.change.press.password.again=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u518d\u3073\u5165\u529b\u4e0b\u3055\u3044
+mark.change.confirm=\u78ba\u5b9a
+mark.change.name.null=\u30e6\u30fc\u30b6\u30fc\u30cd\u30fc\u30e0\u306f\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+mark.change.name.length=\u30e6\u30fc\u30b6\u30fc\u30cd\u30fc\u30e0\u306e\u9577\u3055\u306f8\u6841\u3092\u8d85\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093
+mark.change.password.same=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u4e00\u81f4\u3057\u3066\u4e0b\u3055\u3044
+mark.change.password.length=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u9577\u3055\u306f\u5c11\u306a\u304f\u3068\u3082\uff14\u6841
+mark.change.network.error=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3078\u306e\u901a\u4fe1\u304c\u5931\u6557\u3057\u305f\uff0c\u5f8c\u3067\u3084\u308a\u76f4\u3057\u3066\u4e0b\u3055\u3044
+mark.change.error=\u5909\u66f4\u304c\u5931\u6557\u3057\u305f\uff0c\u5f8c\u3067\u3084\u308a\u76f4\u3057\u3066\u4e0b\u3055\u3044
+#specialTag
+mark.special.tag=\u7279\u6b8a\u306a\u76ee\u5370
+mark.special.back=\u30d0\u30c3\u30af
+mark.special.clear=\u3059\u3079\u3066\u30af\u30fc\u30ea\u30a2
+mark.special.underline=\u30a2\u30f3\u30c0\u30fc\u30e9\u30a4\u30f3
+mark.special.open=\u30aa\u30fc\u30d7\u30f3
+mark.special.close=\u30af\u30ed\u30fc\u30ba
+#problem-process
+mark.problem=\u554f\u984c\u30bf\u30a4\u30d7
+mark.problem.type=\u554f\u984c\u30bf\u30a4\u30d7\u306e\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
+mark.thumbnail.open=\u30aa\u30fc\u30d7\u30f3
+mark.thumbnail.close=\u30af\u30ed\u30fc\u30ba
+#view-sidebar
+mark.sidebar=\u30b5\u30a4\u30c9\u30d0\u30fc
+#mark-history
+mark.history.title=\u30ec\u30d3\u30e5\u30fc
+mark.history.time=\u6642\u9593
+mark.history.number=\u756a\u53f7
+mark.history.score=\u7dcf\u5f97\u70b9
+mark.history.search=\u8a66\u9a13\u7528\u7d19\u306e\u691c\u7d22
+mark.history.pre=\u524d\u3078
+mark.history.success=\u30ec\u30d3\u30e5\u30fc\u6210\u529f\uff0c\u7dcf\u5f97\u70b9\uff1a
+mark.history.problem=\u30ec\u30d3\u30e5\u30fc\u6210\u529f\uff0c\u554f\u984c\u7528\u7d19\u306e\u63d0\u51fa\u304c\u6210\u529f\u3057\u305f
+mark.history.loading=\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0
+mark.history.error=\u63a1\u70b9\u306e\u8a18\u9332\u306f\u3057\u3070\u3089\u304f\u8aad\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\uff0c\u5f8c\u3067\u3084\u308a\u76f4\u3057\u3066\u4e0b\u3055\u3044
+#mark-board
+mark.board.submit=\u63d0\u51fa
+mark.board.total.score=\u7dcf\u5f97\u70b9
+mark.board.score.zero=\u7dcf\u5f97\u70b9\u306f\uff10\u306b\u3059\u308b
+mark.board.pass=\u30b9\u30ad\u30c3\u30d7 
+mark.board.choose.result=\u9078\u629e\u7d50\u679c
+mark.board.keyboard=\u30ad\u30fc\u30dc\u30fc\u30c9\u3067\u63a1\u70b9 >>
+mark.board.mouse=<< \u30de\u30a6\u30b9\u3067\u63a1\u70b9
+mark.board.interval=\u9593\u9694
+mark.board.score=\u30b9\u30b3\u30a2
+mark.board.back=\u30d0\u30c3\u30af
+mark.board.clear.question=\u5f53\u9762\u306e\u984c\u76ee\u306e\u5f97\u70b9\u3092\u30af\u30fc\u30ea\u30a2\u3059\u308b
+mark.board.clear.question=\u7dcf\u5f97\u70b9\u3092\u30af\u30fc\u30ea\u30a2\u3059\u308b
+mark.board.question.not.mark=\u5f53\u9762\u306e\u30bf\u30b9\u30af\u306f\u307e\u3060\u63a1\u70b9\u3057\u3066\u3044\u306a\u3044\u984c\u76ee\u304c\u3042\u308b\u306e\u3067\uff0c\u63a1\u70b9\u3057\u3066\u4e0b\u3055\u3044\u3002
+mark.board.confirm=,\u63d0\u51fa\u3059\u308b\u304b\uff1f
+mark.board.zero.confirm=\u7dcf\u5f97\u70b9\u306f\uff10\u3067\u63d0\u51fa\u3059\u308b\u304b\uff1f
+mark.board.null=
+mark.board.interval.error=\u9593\u9694\u30b9\u30b3\u30a2\u306b\u5408\u308f\u306a\u3044
+mark.board.gt=\u5927\u306a\u308a
+mark.board.lt=\u5c0f\u306a\u308a
+mark.board.number.error=\u6570\u5b57\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+mark.board.step.error=\u5fc5\u987b\u9009\u62e9\u4e00\u9898\u5206\u53d1\uff01
+mark.board.step.same=\u4e0d\u80fd\u91cd\u65b0\u5206\u53d1\u5230\u540c\u4e00\u9898\uff01
+#sheet-view
+mark.sheet=\u539f\u56f3
+mark.sheet.check=\u539f\u56f3\u306e\u5207\u308a\u66ff\u3048
+mark.sheet.open=\u30aa\u30fc\u30d7\u30f3
+mark.sheet.close=\u30af\u30ed\u30fc\u30ba
+#answer-view
+mark.answer=\u6b63\u89e3
+#warning-info
+mark.warning.try.again=\u3084\u308a\u76f4\u3057\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u4e0b\u3055\u3044\uff01
+mark.warning.force.special.tag=\u7279\u6b8a\u306a\u76ee\u5370\u306e\u5f37\u5236\u6a5f\u80fd\u304c\u4f7f\u7528\u3057\u305f\uff0c\u4e00\u3064\u4ee5\u4e0a\u306e\u7279\u6b8a\u306a\u76ee\u5370\u3092\u4f7f\u7528\u3057\u3066\u4e0b\u3055\u3044
+mark.warning.network.error=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7570\u5e38\uff0c\u30bf\u30b9\u30af\u306e\u63d0\u51fa\u304c\u5931\u8d25\u3057\u305f
+mark.warning.task.error=\u30bf\u30b9\u30af\u306e\u53d6\u5f97\u304c\u5931\u6557\u3057\u305f
+mark.warning.task.finish=\u3059\u3079\u3066\u306e\u30bf\u30b9\u30af\u306f\u5b8c\u6210\u3057\u305f
+mark.warning.task.loading=\u30bf\u30b9\u30af\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0
+mark.warning.close=\u30af\u30ed\u30fc\u30ba
+#json-view
+mark.json.loading=\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0
+mark.json.student.answer=\u53d7\u9a13\u751f\u306e\u7b54\u3048\uff1a
+mark.json.answer=\u6b63\u89e3\uff1a
+mark.json.body=\u984c\u76ee\uff1a
+mark.json.question.number=\u984c\u76ee\u306e\u756a\u53f7\uff1a

+ 10 - 2
stmms-web/src/main/webapp/static/i18n/messages_zh.properties

@@ -5,6 +5,12 @@ user.login.marker=\u8bc4\u5377\u5458\u767b\u5f55
 user.login.name=\u7528\u6237\u540d
 user.login.name=\u7528\u6237\u540d
 user.login.password=\u5bc6\u7801
 user.login.password=\u5bc6\u7801
 user.login.submit=\u767b\u5f55
 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
 #mark-control
 #mark-control
 mark.control.assistant=\u5c0f\u52a9\u624b
 mark.control.assistant=\u5c0f\u52a9\u624b
 mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
 mark.control.mode.track=\u5207\u6362\u5230\u8f68\u8ff9\u6a21\u5f0f
@@ -12,6 +18,10 @@ mark.control.mode.common=\u5207\u6362\u5230\u666e\u901a\u6a21\u5f0f
 mark.control.function=\u8bc4\u5377\u529f\u80fd
 mark.control.function=\u8bc4\u5377\u529f\u80fd
 mark.control.logout=\u9000\u51fa
 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.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
 #status
 mark.status.student.number=\u8003\u751f\u7f16\u53f7
 mark.status.student.number=\u8003\u751f\u7f16\u53f7
 mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
 mark.status.library.number=\u4efb\u52a1\u7f16\u53f7
@@ -92,8 +102,6 @@ mark.board.interval.error=\u4e0d\u7b26\u5408\u5206\u503c\u95f4\u9694\u8981\u6c42
 mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
 mark.board.gt=\u4e0d\u80fd\u5927\u4e8e
 mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
 mark.board.lt=\u4e0d\u80fd\u5c0f\u4e8e
 mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
 mark.board.number.error=\u4e0d\u662f\u5408\u6cd5\u6570\u5b57
-mark.board.step.error=\u5fc5\u987b\u9009\u62e9\u4e00\u9898\u5206\u53d1\uff01
-mark.board.step.same=\u4e0d\u80fd\u91cd\u65b0\u5206\u53d1\u5230\u540c\u4e00\u9898\uff01
 #sheet-view
 #sheet-view
 mark.sheet=\u539f\u56fe
 mark.sheet=\u539f\u56fe
 mark.sheet.check=\u539f\u56fe\u5207\u6362
 mark.sheet.check=\u539f\u56fe\u5207\u6362

+ 4 - 4
stmms-web/src/main/webapp/static/mark-json/js/mark-control.js

@@ -464,7 +464,7 @@ MarkControl.prototype.prefetch = function () {
                     markControl.trigger('task.prefetch.success');
                     markControl.trigger('task.prefetch.success');
                 }
                 }
             }, function (task) {
             }, function (task) {
-                context.prefetchStatus = task.message;
+                context.prefetchStatus = getMessage(task.message);
                 context.prefetching = false;
                 context.prefetching = false;
                 markControl.trigger('task.prefetch.none');
                 markControl.trigger('task.prefetch.none');
             }, function () {
             }, function () {
@@ -599,7 +599,7 @@ MarkControl.prototype.submitTask = function (submitUrl) {
                     markControl.trigger('task.submit.success');
                     markControl.trigger('task.submit.success');
                 }
                 }
             }, function (message) {
             }, function (message) {
-                markControl.trigger('task.submit.error', message);
+                markControl.trigger('task.submit.error', getMessage(message));
             });
             });
         } else if (submitUrl != undefined && submitUrl.length > 0) {
         } else if (submitUrl != undefined && submitUrl.length > 0) {
             //未定义任务引擎,依赖定义/传入的提交地址
             //未定义任务引擎,依赖定义/传入的提交地址
@@ -613,11 +613,11 @@ MarkControl.prototype.submitTask = function (submitUrl) {
                     if (result.success == true) {
                     if (result.success == true) {
                         markControl.trigger('task.submit.success');
                         markControl.trigger('task.submit.success');
                     } else {
                     } else {
-                        markControl.trigger('task.submit.error', result.message);
+                        markControl.trigger('task.submit.error', getMessage(result.message));
                     }
                     }
                 },
                 },
                 error: function (message) {
                 error: function (message) {
-                    markControl.trigger('task.submit.error', message);
+                    markControl.trigger('task.submit.error', getMessage(message));
                 }
                 }
             });
             });
         } else {
         } else {

+ 4 - 4
stmms-web/src/main/webapp/static/mark-new/js/mark-control.js

@@ -462,7 +462,7 @@ MarkControl.prototype.prefetch = function() {
                     markControl.trigger('task.prefetch.success');
                     markControl.trigger('task.prefetch.success');
                 }
                 }
             }, function(task) {
             }, function(task) {
-                context.prefetchStatus = task.message;
+                context.prefetchStatus = getMessage(task.message);
                 context.prefetching = false;
                 context.prefetching = false;
                 markControl.trigger('task.prefetch.none');
                 markControl.trigger('task.prefetch.none');
             }, function() {
             }, function() {
@@ -599,7 +599,7 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                     markControl.trigger('task.submit.success');
                     markControl.trigger('task.submit.success');
                 }
                 }
             }, function(message) {
             }, function(message) {
-                markControl.trigger('task.submit.error', message);
+                markControl.trigger('task.submit.error', getMessage(message));
             });
             });
         } else if (submitUrl != undefined && submitUrl.length > 0) {
         } else if (submitUrl != undefined && submitUrl.length > 0) {
             //未定义任务引擎,依赖定义/传入的提交地址
             //未定义任务引擎,依赖定义/传入的提交地址
@@ -613,11 +613,11 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                     if (result.success == true) {
                     if (result.success == true) {
                         markControl.trigger('task.submit.success');
                         markControl.trigger('task.submit.success');
                     } else {
                     } else {
-                        markControl.trigger('task.submit.error', result.message);
+                        markControl.trigger('task.submit.error', getMessage(result.message));
                     }
                     }
                 },
                 },
                 error: function(message) {
                 error: function(message) {
-                    markControl.trigger('task.submit.error', message);
+                    markControl.trigger('task.submit.error', getMessage(message));
                 }
                 }
             });
             });
         } else {
         } else {

+ 0 - 34
stmms-web/src/main/webapp/static/mark-new/js/modules/mark-board.js

@@ -151,40 +151,6 @@ MarkBoard.prototype.init = function () {
             markBoard.onTaskSubmit();
             markBoard.onTaskSubmit();
         }
         }
     });
     });
-    this.scoreBoard.find('#resetBtn').click(this, function (event) {
-        var markBoard = event.data;
-        var selectedBlockId = $(".block-id-list  option:selected").val();
-        if (markBoard.task != undefined) {
-            if (markBoard.task.blockId == selectedBlockId) {
-                alert(getMessage("mark.board.step.same"));
-                return false;
-            } else if (selectedBlockId == 0) {
-                alert(getMessage("mark.board.step.error"));
-                return false;
-            } else {
-                markBoard.task.reset = true;
-                markBoard.task.blockId = selectedBlockId;
-                markBoard.onTaskSubmit();
-            }
-        }
-    });
-    $('#resetBtn').click(this, function (event) {
-        var markBoard = event.data;
-        var selectedBlockId = $(".block-id-list  option:selected").val();
-        if (markBoard.task != undefined) {
-            if (markBoard.task.blockId == selectedBlockId) {
-                alert(getMessage("mark.board.step.same"));
-                return false;
-            } else if (selectedBlockId == 0) {
-                alert(getMessage("mark.board.step.error"));
-                return false;
-            } else {
-                markBoard.task.reset = true;
-                markBoard.task.blockId = selectedBlockId;
-                markBoard.onTaskSubmit();
-            }
-        }
-    });
     if (this.enableSkip) {
     if (this.enableSkip) {
         this.scoreBoard.find('#task-pass-button').show();
         this.scoreBoard.find('#task-pass-button').show();
         this.scoreBoard.find('#task-pass-button').click(this, function (event) {
         this.scoreBoard.find('#task-pass-button').click(this, function (event) {

+ 4 - 4
stmms-web/src/main/webapp/static/mark-track/js/mark-control.js

@@ -466,7 +466,7 @@ MarkControl.prototype.prefetch = function() {
                     markControl.trigger('task.prefetch.success');
                     markControl.trigger('task.prefetch.success');
                 }
                 }
             }, function(task) {
             }, function(task) {
-                context.prefetchStatus = task.message;
+                context.prefetchStatus = getMessage(task.message);
                 context.prefetching = false;
                 context.prefetching = false;
                 markControl.trigger('task.prefetch.none');
                 markControl.trigger('task.prefetch.none');
             }, function() {
             }, function() {
@@ -614,7 +614,7 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                 markControl.trigger('mark.specialTag.success');
                 markControl.trigger('mark.specialTag.success');
                 // markControl.getTask();
                 // markControl.getTask();
             }, function(message) {
             }, function(message) {
-                markControl.trigger('task.submit.error', message);
+                markControl.trigger('task.submit.error',getMessage( message));
             });
             });
         } else if (submitUrl != undefined && submitUrl.length > 0) {
         } else if (submitUrl != undefined && submitUrl.length > 0) {
             // 未定义任务引擎,依赖定义/传入的提交地址
             // 未定义任务引擎,依赖定义/传入的提交地址
@@ -629,11 +629,11 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                         markControl.trigger('mark.specialTag.success');
                         markControl.trigger('mark.specialTag.success');
                         // markControl.getTask();
                         // markControl.getTask();
                     } else {
                     } else {
-                        markControl.trigger('task.submit.error', result.message);
+                        markControl.trigger('task.submit.error', getMessage(result.message));
                     }
                     }
                 },
                 },
                 error: function(message) {
                 error: function(message) {
-                    markControl.trigger('task.submit.error', message);
+                    markControl.trigger('task.submit.error', getMessage(message));
                 }
                 }
             });
             });
         } else {
         } else {