Quellcode durchsuchen

Merge branch 'Test' into feature-contest-data

# Conflicts:
#	mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GroupServiceImpl.java
张双江 vor 7 Jahren
Ursprung
Commit
8dd687f8d0
100 geänderte Dateien mit 4708 neuen und 445 gelöschten Zeilen
  1. 968 0
      mooctest-site-common/src/main/java/cn/iselab/mooctest/site/thrift/MooctestSiteThrift.java
  2. 12 0
      mooctest-site-common/src/main/thrift/MooctestSite.thrift
  3. 3 0
      mooctest-site-common/src/main/thrift/RpcBase.thrift
  4. 7 11
      mooctest-site-server/pom.xml
  5. 24 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/Application.java
  6. 6 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/McNodeCallBack.java
  7. 6 12
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/MutationCallBack.java
  8. 17 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AccountConstants.java
  9. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AnswerWayConstants.java
  10. 8 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AppConstants.java
  11. 0 15
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/CookieConsts.java
  12. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/PageConstants.java
  13. 12 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/PrivilegeConstants.java
  14. 12 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/ProjectConstants.java
  15. 8 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/UrlConstants.java
  16. 9 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/CryptKeys.java
  17. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/NodeType.java
  18. 9 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/SessionKey.java
  19. 28 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/TaskStatus.java
  20. 29 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/UserType.java
  21. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/AppCreateEvent.java
  22. 19 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/EventsListener.java
  23. 25 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/ReportCreateEvent.java
  24. 0 29
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/initialize/InitExamSchedulerMap.java
  25. 1063 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/template/MailTemplates.java
  26. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ErrorResult.java
  27. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ResponseMessage.java
  28. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ResponseWrapper.java
  29. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/StatusCode.java
  30. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/SuccessResult.java
  31. 22 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ApplicationStartup.java
  32. 91 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/AuthFilterConfiguration.java
  33. 0 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ClientFeatureConfiguration.java
  34. 0 27
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/FileUploadConfiguration.java
  35. 2 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RequestLoggerAutoConfiguration.java
  36. 41 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RpcServerConfiguration.java
  37. 12 10
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/realm/ShiroRealm.java
  38. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AdminDao.java
  39. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/App2UserDao.java
  40. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AppDao.java
  41. 1 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AssignedTaskDao.java
  42. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Case2BugDao.java
  43. 58 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseDao.java
  44. 3 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseExtendsDao.java
  45. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Competition2TaskDao.java
  46. 95 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestDao.java
  47. 11 33
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ExamDao.java
  48. 37 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GroupDao.java
  49. 39 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ManagerDao.java
  50. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ManagerSubsiteFeatureDao.java
  51. 7 7
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/MonitorDao.java
  52. 3 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/PaperDao.java
  53. 6 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/SubsiteDao.java
  54. 15 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/SubsiteFeatureDao.java
  55. 7 8
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetDao.java
  56. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetDevDao.java
  57. 0 10
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetExtendsDao.java
  58. 15 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetWebDao.java
  59. 6 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Task2CaseDao.java
  60. 58 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TaskDao.java
  61. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Worker2ContestDao.java
  62. 61 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/WorkerDao.java
  63. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/custom/GenericUserDao.java
  64. 82 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/custom/UserDao.java
  65. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/AppStatisDao.java
  66. 22 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/ApplicationDao.java
  67. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/BugDao.java
  68. 22 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/MobileClientDao.java
  69. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/instancePermission/AppPermissionDao.java
  70. 0 21
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/instancePermission/TargetPermissionDao.java
  71. 56 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/AuthResult.java
  72. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/PageData.java
  73. 0 73
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/wechat/Token.java
  74. 67 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Admin.java
  75. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/App.java
  76. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/App2User.java
  77. 196 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Case.java
  78. 10 63
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/CaseExtends.java
  79. 80 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Contest.java
  80. 55 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/DevTarget.java
  81. 68 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/EmailTask.java
  82. 5 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Group.java
  83. 179 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Manager.java
  84. 78 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ManagerSubsiteFeature.java
  85. 34 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/SubsiteFeature.java
  86. 0 25
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/TargetExtends.java
  87. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Task.java
  88. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Task2Case.java
  89. 56 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/WebTarget.java
  90. 167 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Worker.java
  91. 46 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Worker2Contest.java
  92. 59 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromDev/BaseData.java
  93. 20 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/AppStatis.java
  94. 167 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/Application.java
  95. 12 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/CaseItem.java
  96. 62 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/MobileClient.java
  97. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/TaskFromKibug.java
  98. 6 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/instancePermission/AppPermission.java
  99. 49 46
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/Oauth2/impl/ExamServiceImpl2.java
  100. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/RpcHandler.java

+ 968 - 0
mooctest-site-common/src/main/java/cn/iselab/mooctest/site/thrift/MooctestSiteThrift.java

@@ -0,0 +1,968 @@
+/**
+ * Autogenerated by Thrift Compiler (0.9.2)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package cn.iselab.mooctest.site.thrift;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import javax.annotation.Generated;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2016-12-17")
+public class MooctestSiteThrift {
+
+  public interface Iface {
+
+    public String sayHi(String name) throws org.apache.thrift.TException;
+
+  }
+
+  public interface AsyncIface {
+
+    public void sayHi(String name, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
+
+  }
+
+  public static class Client extends org.apache.thrift.TServiceClient implements Iface {
+    public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {
+      public Factory() {}
+      public Client getClient(org.apache.thrift.protocol.TProtocol prot) {
+        return new Client(prot);
+      }
+      public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {
+        return new Client(iprot, oprot);
+      }
+    }
+
+    public Client(org.apache.thrift.protocol.TProtocol prot)
+    {
+      super(prot, prot);
+    }
+
+    public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {
+      super(iprot, oprot);
+    }
+
+    public String sayHi(String name) throws org.apache.thrift.TException
+    {
+      send_sayHi(name);
+      return recv_sayHi();
+    }
+
+    public void send_sayHi(String name) throws org.apache.thrift.TException
+    {
+      sayHi_args args = new sayHi_args();
+      args.setName(name);
+      sendBase("sayHi", args);
+    }
+
+    public String recv_sayHi() throws org.apache.thrift.TException
+    {
+      sayHi_result result = new sayHi_result();
+      receiveBase(result, "sayHi");
+      if (result.isSetSuccess()) {
+        return result.success;
+      }
+      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "sayHi failed: unknown result");
+    }
+
+  }
+  public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {
+    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {
+      private org.apache.thrift.async.TAsyncClientManager clientManager;
+      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;
+      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {
+        this.clientManager = clientManager;
+        this.protocolFactory = protocolFactory;
+      }
+      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {
+        return new AsyncClient(protocolFactory, clientManager, transport);
+      }
+    }
+
+    public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {
+      super(protocolFactory, clientManager, transport);
+    }
+
+    public void sayHi(String name, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
+      checkReady();
+      sayHi_call method_call = new sayHi_call(name, resultHandler, this, ___protocolFactory, ___transport);
+      this.___currentMethod = method_call;
+      ___manager.call(method_call);
+    }
+
+    public static class sayHi_call extends org.apache.thrift.async.TAsyncMethodCall {
+      private String name;
+      public sayHi_call(String name, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+        super(client, protocolFactory, transport, resultHandler, false);
+        this.name = name;
+      }
+
+      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
+        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("sayHi", org.apache.thrift.protocol.TMessageType.CALL, 0));
+        sayHi_args args = new sayHi_args();
+        args.setName(name);
+        args.write(prot);
+        prot.writeMessageEnd();
+      }
+
+      public String getResult() throws org.apache.thrift.TException {
+        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {
+          throw new IllegalStateException("Method call not finished!");
+        }
+        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
+        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
+        return (new Client(prot)).recv_sayHi();
+      }
+    }
+
+  }
+
+  public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class.getName());
+    public Processor(I iface) {
+      super(iface, getProcessMap(new HashMap<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));
+    }
+
+    protected Processor(I iface, Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {
+      super(iface, getProcessMap(processMap));
+    }
+
+    private static <I extends Iface> Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> getProcessMap(Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {
+      processMap.put("sayHi", new sayHi());
+      return processMap;
+    }
+
+    public static class sayHi<I extends Iface> extends org.apache.thrift.ProcessFunction<I, sayHi_args> {
+      public sayHi() {
+        super("sayHi");
+      }
+
+      public sayHi_args getEmptyArgsInstance() {
+        return new sayHi_args();
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public sayHi_result getResult(I iface, sayHi_args args) throws org.apache.thrift.TException {
+        sayHi_result result = new sayHi_result();
+        result.success = iface.sayHi(args.name);
+        return result;
+      }
+    }
+
+  }
+
+  public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncProcessor.class.getName());
+    public AsyncProcessor(I iface) {
+      super(iface, getProcessMap(new HashMap<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));
+    }
+
+    protected AsyncProcessor(I iface, Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {
+      super(iface, getProcessMap(processMap));
+    }
+
+    private static <I extends AsyncIface> Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {
+      processMap.put("sayHi", new sayHi());
+      return processMap;
+    }
+
+    public static class sayHi<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, sayHi_args, String> {
+      public sayHi() {
+        super("sayHi");
+      }
+
+      public sayHi_args getEmptyArgsInstance() {
+        return new sayHi_args();
+      }
+
+      public AsyncMethodCallback<String> getResultHandler(final AsyncFrameBuffer fb, final int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new AsyncMethodCallback<String>() { 
+          public void onComplete(String o) {
+            sayHi_result result = new sayHi_result();
+            result.success = o;
+            try {
+              fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);
+              return;
+            } catch (Exception e) {
+              LOGGER.error("Exception writing to internal frame buffer", e);
+            }
+            fb.close();
+          }
+          public void onError(Exception e) {
+            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
+            org.apache.thrift.TBase msg;
+            sayHi_result result = new sayHi_result();
+            {
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());
+            }
+            try {
+              fcall.sendResponse(fb,msg,msgType,seqid);
+              return;
+            } catch (Exception ex) {
+              LOGGER.error("Exception writing to internal frame buffer", ex);
+            }
+            fb.close();
+          }
+        };
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public void start(I iface, sayHi_args args, org.apache.thrift.async.AsyncMethodCallback<String> resultHandler) throws TException {
+        iface.sayHi(args.name,resultHandler);
+      }
+    }
+
+  }
+
+  public static class sayHi_args implements org.apache.thrift.TBase<sayHi_args, sayHi_args._Fields>, java.io.Serializable, Cloneable, Comparable<sayHi_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHi_args");
+
+    private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)1);
+
+    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+    static {
+      schemes.put(StandardScheme.class, new sayHi_argsStandardSchemeFactory());
+      schemes.put(TupleScheme.class, new sayHi_argsTupleSchemeFactory());
+    }
+
+    private String name; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      NAME((short)1, "name");
+
+      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+      static {
+        for (_Fields field : EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 1: // NAME
+            return NAME;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final String _fieldName;
+
+      _Fields(short thriftId, String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData("name", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      metaDataMap = Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHi_args.class, metaDataMap);
+    }
+
+    public sayHi_args() {
+    }
+
+    public sayHi_args(
+      String name)
+    {
+      this();
+      this.name = name;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public sayHi_args(sayHi_args other) {
+      if (other.isSetName()) {
+        this.name = other.name;
+      }
+    }
+
+    public sayHi_args deepCopy() {
+      return new sayHi_args(this);
+    }
+
+    @Override
+    public void clear() {
+      this.name = null;
+    }
+
+    public String getName() {
+      return this.name;
+    }
+
+    public void setName(String name) {
+      this.name = name;
+    }
+
+    public void unsetName() {
+      this.name = null;
+    }
+
+    /** Returns true if field name is set (has been assigned a value) and false otherwise */
+    public boolean isSetName() {
+      return this.name != null;
+    }
+
+    public void setNameIsSet(boolean value) {
+      if (!value) {
+        this.name = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+      switch (field) {
+      case NAME:
+        if (value == null) {
+          unsetName();
+        } else {
+          setName((String)value);
+        }
+        break;
+
+      }
+    }
+
+    public Object getFieldValue(_Fields field) {
+      switch (field) {
+      case NAME:
+        return getName();
+
+      }
+      throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new IllegalArgumentException();
+      }
+
+      switch (field) {
+      case NAME:
+        return isSetName();
+      }
+      throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof sayHi_args)
+        return this.equals((sayHi_args)that);
+      return false;
+    }
+
+    public boolean equals(sayHi_args that) {
+      if (that == null)
+        return false;
+
+      boolean this_present_name = true && this.isSetName();
+      boolean that_present_name = true && that.isSetName();
+      if (this_present_name || that_present_name) {
+        if (!(this_present_name && that_present_name))
+          return false;
+        if (!this.name.equals(that.name))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      List<Object> list = new ArrayList<Object>();
+
+      boolean present_name = true && (isSetName());
+      list.add(present_name);
+      if (present_name)
+        list.add(name);
+
+      return list.hashCode();
+    }
+
+    @Override
+    public int compareTo(sayHi_args other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = Boolean.valueOf(isSetName()).compareTo(other.isSetName());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetName()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+    }
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder("sayHi_args(");
+      boolean first = true;
+
+      sb.append("name:");
+      if (this.name == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.name);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class sayHi_argsStandardSchemeFactory implements SchemeFactory {
+      public sayHi_argsStandardScheme getScheme() {
+        return new sayHi_argsStandardScheme();
+      }
+    }
+
+    private static class sayHi_argsStandardScheme extends StandardScheme<sayHi_args> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, sayHi_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 1: // NAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.name = iprot.readString();
+                struct.setNameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, sayHi_args struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.name != null) {
+          oprot.writeFieldBegin(NAME_FIELD_DESC);
+          oprot.writeString(struct.name);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class sayHi_argsTupleSchemeFactory implements SchemeFactory {
+      public sayHi_argsTupleScheme getScheme() {
+        return new sayHi_argsTupleScheme();
+      }
+    }
+
+    private static class sayHi_argsTupleScheme extends TupleScheme<sayHi_args> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, sayHi_args struct) throws org.apache.thrift.TException {
+        TTupleProtocol oprot = (TTupleProtocol) prot;
+        BitSet optionals = new BitSet();
+        if (struct.isSetName()) {
+          optionals.set(0);
+        }
+        oprot.writeBitSet(optionals, 1);
+        if (struct.isSetName()) {
+          oprot.writeString(struct.name);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, sayHi_args struct) throws org.apache.thrift.TException {
+        TTupleProtocol iprot = (TTupleProtocol) prot;
+        BitSet incoming = iprot.readBitSet(1);
+        if (incoming.get(0)) {
+          struct.name = iprot.readString();
+          struct.setNameIsSet(true);
+        }
+      }
+    }
+
+  }
+
+  public static class sayHi_result implements org.apache.thrift.TBase<sayHi_result, sayHi_result._Fields>, java.io.Serializable, Cloneable, Comparable<sayHi_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHi_result");
+
+    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRING, (short)0);
+
+    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+    static {
+      schemes.put(StandardScheme.class, new sayHi_resultStandardSchemeFactory());
+      schemes.put(TupleScheme.class, new sayHi_resultTupleSchemeFactory());
+    }
+
+    private String success; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      SUCCESS((short)0, "success");
+
+      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+      static {
+        for (_Fields field : EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 0: // SUCCESS
+            return SUCCESS;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final String _fieldName;
+
+      _Fields(short thriftId, String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      metaDataMap = Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHi_result.class, metaDataMap);
+    }
+
+    public sayHi_result() {
+    }
+
+    public sayHi_result(
+      String success)
+    {
+      this();
+      this.success = success;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public sayHi_result(sayHi_result other) {
+      if (other.isSetSuccess()) {
+        this.success = other.success;
+      }
+    }
+
+    public sayHi_result deepCopy() {
+      return new sayHi_result(this);
+    }
+
+    @Override
+    public void clear() {
+      this.success = null;
+    }
+
+    public String getSuccess() {
+      return this.success;
+    }
+
+    public void setSuccess(String success) {
+      this.success = success;
+    }
+
+    public void unsetSuccess() {
+      this.success = null;
+    }
+
+    /** Returns true if field success is set (has been assigned a value) and false otherwise */
+    public boolean isSetSuccess() {
+      return this.success != null;
+    }
+
+    public void setSuccessIsSet(boolean value) {
+      if (!value) {
+        this.success = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+      switch (field) {
+      case SUCCESS:
+        if (value == null) {
+          unsetSuccess();
+        } else {
+          setSuccess((String)value);
+        }
+        break;
+
+      }
+    }
+
+    public Object getFieldValue(_Fields field) {
+      switch (field) {
+      case SUCCESS:
+        return getSuccess();
+
+      }
+      throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new IllegalArgumentException();
+      }
+
+      switch (field) {
+      case SUCCESS:
+        return isSetSuccess();
+      }
+      throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof sayHi_result)
+        return this.equals((sayHi_result)that);
+      return false;
+    }
+
+    public boolean equals(sayHi_result that) {
+      if (that == null)
+        return false;
+
+      boolean this_present_success = true && this.isSetSuccess();
+      boolean that_present_success = true && that.isSetSuccess();
+      if (this_present_success || that_present_success) {
+        if (!(this_present_success && that_present_success))
+          return false;
+        if (!this.success.equals(that.success))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      List<Object> list = new ArrayList<Object>();
+
+      boolean present_success = true && (isSetSuccess());
+      list.add(present_success);
+      if (present_success)
+        list.add(success);
+
+      return list.hashCode();
+    }
+
+    @Override
+    public int compareTo(sayHi_result other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSuccess()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+      }
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder("sayHi_result(");
+      boolean first = true;
+
+      sb.append("success:");
+      if (this.success == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.success);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class sayHi_resultStandardSchemeFactory implements SchemeFactory {
+      public sayHi_resultStandardScheme getScheme() {
+        return new sayHi_resultStandardScheme();
+      }
+    }
+
+    private static class sayHi_resultStandardScheme extends StandardScheme<sayHi_result> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, sayHi_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 0: // SUCCESS
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.success = iprot.readString();
+                struct.setSuccessIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, sayHi_result struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.success != null) {
+          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
+          oprot.writeString(struct.success);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class sayHi_resultTupleSchemeFactory implements SchemeFactory {
+      public sayHi_resultTupleScheme getScheme() {
+        return new sayHi_resultTupleScheme();
+      }
+    }
+
+    private static class sayHi_resultTupleScheme extends TupleScheme<sayHi_result> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, sayHi_result struct) throws org.apache.thrift.TException {
+        TTupleProtocol oprot = (TTupleProtocol) prot;
+        BitSet optionals = new BitSet();
+        if (struct.isSetSuccess()) {
+          optionals.set(0);
+        }
+        oprot.writeBitSet(optionals, 1);
+        if (struct.isSetSuccess()) {
+          oprot.writeString(struct.success);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, sayHi_result struct) throws org.apache.thrift.TException {
+        TTupleProtocol iprot = (TTupleProtocol) prot;
+        BitSet incoming = iprot.readBitSet(1);
+        if (incoming.get(0)) {
+          struct.success = iprot.readString();
+          struct.setSuccessIsSet(true);
+        }
+      }
+    }
+
+  }
+
+}

+ 12 - 0
mooctest-site-common/src/main/thrift/MooctestSite.thrift

@@ -0,0 +1,12 @@
+namespace java cn.iselab.mooctest.site.thrift
+
+include "RpcBase.thrift"
+
+service MooctestSiteThrift {
+
+    string sayHi(
+        1: string name
+    )
+
+}
+

+ 3 - 0
mooctest-site-common/src/main/thrift/RpcBase.thrift

@@ -0,0 +1,3 @@
+namespace java cn.iselab.mooctest.site.thrift
+
+exception DataNotFoundException {}

+ 7 - 11
mooctest-site-server/pom.xml

@@ -13,11 +13,17 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.4.1</version>
+        </dependency>
+
         <!--dubbo-service-api-->
         <dependency>
             <groupId>cn.iselab.mooctest</groupId>
             <artifactId>user-dubbo-api</artifactId>
-            <version>1.0.20</version>
+            <version>1.0.21</version>
         </dependency>
 
         <dependency>
@@ -190,16 +196,6 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
-        </dependency>
-        <!-- zookeeper 依赖的健康检查的jar,所以需要引入actuator这个依赖 -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
-            <version>${spring.boot.version}</version>
-        </dependency>
-        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.38</version>

+ 24 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/Application.java

@@ -1,10 +1,12 @@
 package cn.iselab.mooctest.site;
 
+import cn.iselab.mooctest.site.configure.ApplicationStartup;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.aop.AopAutoConfiguration;
 import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration;
+import org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration;
 import org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration;
 import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration;
 import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration;
@@ -42,11 +44,15 @@ import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration;
 import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
 import org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration;
 import org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration;
+import org.springframework.boot.context.embedded.MultipartConfigFactory;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
+import javax.servlet.MultipartConfigElement;
+
 /**
  * @author liuzicong
  */
@@ -54,6 +60,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
         ActiveMQAutoConfiguration.class,
         AopAutoConfiguration.class,
         BatchAutoConfiguration.class,
+        CloudAutoConfiguration.class,
         DeviceDelegatingViewResolverAutoConfiguration.class,
         DeviceResolverAutoConfiguration.class,
         ElasticsearchRepositoriesAutoConfiguration.class,
@@ -97,10 +104,27 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableCaching
 @EnableAsync
 public class Application {
+
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(Application.class);
+
         // To disabled web environment, change `true` to `false`
         application.setWebEnvironment(true);
+        application.addListeners(new ApplicationStartup());
         application.run(args);
     }
+
+    /**
+     * 文件上传配置
+     * @return
+     */
+    @Bean
+    public MultipartConfigElement multipartConfigElement() {
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        //单个文件最大
+        factory.setMaxFileSize("100MB"); //KB,MB
+        /// 设置总上传数据总大小
+        factory.setMaxRequestSize("500MB");
+        return factory.createMultipartConfig();
+    }
 }

+ 6 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/McNodeCallBack.java

@@ -1,16 +1,19 @@
 package cn.iselab.mooctest.site.common.acyncTask;
 
 import cn.iselab.mooctest.site.common.constant.MutationResultType;
+import cn.iselab.mooctest.site.models.Grade;
 import cn.iselab.mooctest.site.service.AssignedTaskService;
 import cn.iselab.mooctest.site.service.CalculateScoreService;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.service.TargetGraphService;
 import cn.iselab.mooctest.site.service.common.MongoAPIService;
 import cn.iselab.mooctest.site.service.fromDev.AnalysisService;
-import cn.iselab.mooctest.site.data.GeneralGradeDTO;
+import cn.iselab.mooctest.site.web.data.forInternalUse.GeneralGradeDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CaughtNodeDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.TargetGraphDTO;
+import cn.iselab.mooctest.site.web.data.forMongo.graph.Category;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
+import cn.iselab.mooctest.site.web.logic.impl.GeneralCalculateScoreComponent;
 import com.google.gson.Gson;
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -32,6 +35,7 @@ import java.util.stream.Collectors;
  * @Modified By:
  */
 @Component
+@Scope("prototype")
 public class McNodeCallBack implements AsyncTaskCallBack{
 
     @Autowired
@@ -112,7 +116,7 @@ public class McNodeCallBack implements AsyncTaskCallBack{
                             .filter(caughtNodeDTO -> caughtNodeDTO.getCategory().equals(category))
                             .collect(Collectors.toList());
                     long catchNum = dtoList.parallelStream().map(dto-> dto.getIfCatch() == true).count();
-                    double score = dtoList.size() == 0 ? 0 : (double) catchNum / dtoList.size();
+                    double score = dtoList.size() == 0 ? 0 : (double) catchNum / dtoList.size() * 100;
                     GeneralGradeDTO gradeDTO=new GeneralGradeDTO();
                     gradeDTO.setCaseId(caseId);
                     gradeDTO.setScore(score);

+ 6 - 12
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/MutationCallBack.java

@@ -1,7 +1,6 @@
 package cn.iselab.mooctest.site.common.acyncTask;
 
 import cn.iselab.mooctest.site.common.constant.MutationResultType;
-import cn.iselab.mooctest.site.models.Grade;
 import cn.iselab.mooctest.site.rpc.dev.data.MutationDTO;
 import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.service.common.MongoAPIService;
@@ -10,7 +9,7 @@ import cn.iselab.mooctest.site.web.data.forMongo.MutationForMongoDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CaughtNodeDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.TargetGraphDTO;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
-
+import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
 import com.google.gson.Gson;
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -19,7 +18,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -56,6 +54,9 @@ public class MutationCallBack implements AsyncTaskCallBack {
     @Autowired
     GeneralCalculateScoreService generalCalculateScoreService;
 
+    @Autowired
+    GeneralCalculateScoreLogic generalCalculateScoreLogic;
+
     @Override
     public void onSuccess(Map<String,String> context,String result) {
         LOG.info("------------------- mutation onSuccess -------------------");
@@ -131,16 +132,9 @@ public class MutationCallBack implements AsyncTaskCallBack {
             CaughtNodeDTO dto = gson.fromJson(obj.toString(), CaughtNodeDTO.class);
             dtos.add(dto);
         }
-        long catchNum = dtos.stream().filter(caughtNodeDTO -> caughtNodeDTO.getIfCatch() == true).count();
-        double mutationScore = dtos.size() == 0 ? 0 : (double) catchNum / dtos.size();
-        generalCalculateScoreService.updateTypeGrade(userId,examId,caseId,dtos.get(0).getCategory(),mutationScore);
-        List<Grade> grades = analysisService.saveMutationScore(userId, examId, caseId, mutationScore);
-        if (grades != null && !grades.isEmpty()) {
-            calculateScoreService.calculatePersonalDevScore(examId, caseId, userId);
-            calculateSocreLogic.calculateExamScoreAuto(examId, userId);
-        }
         calculateSocreLogic.catchNode(examId, caseId, userId, String.valueOf(System.currentTimeMillis()), dtos);
-
+        generalCalculateScoreLogic.calculateScore(examId,caseId,userId);
+        calculateSocreLogic.calculateExamScoreAuto(examId,userId);
     }
 
     private void processMetaNode(String result, long targetId){

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AccountConstants.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.site.common.constant;
+
+public class AccountConstants {
+    public static final int WORKER_LEVEL_INCOMPLETE = -1;
+    public static final Integer MANAGER_LEVEL_INCOMPLETE = -1;
+
+    /**
+     * Verification timeout
+     */
+    public static final int VERI_TIMEOUT_SEC = Integer.parseInt(SmsConstants.SMS_VERI_TIMEOUT) * 60;
+
+    public static final long FORGET_PASSWD_TIMEOUT = 1000 * 60 * 60 * 12;
+
+    public static final int DEFAULT_TASK_NUM = 1;
+    public static final int DEFAULT_GROUP_SIZE = 50;
+    public static final int DEFAULT_GROUP_NUM = 5;
+}

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AnswerWayConstants.java

@@ -1,5 +1,16 @@
 package cn.iselab.mooctest.site.common.constant;
 
+import cn.iselab.mooctest.site.dao.SubsiteDao;
+import cn.iselab.mooctest.site.models.Subsite;
+import cn.iselab.mooctest.site.service.common.SubsiteService;
+import cn.iselab.mooctest.site.service.common.impl.SubsiteServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
 /**
  * Created by Liu on 2017/1/3.
  */

+ 8 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/AppConstants.java

@@ -0,0 +1,8 @@
+package cn.iselab.mooctest.site.common.constant;
+
+/**
+ * Created by Liu on 2017/3/21.
+ */
+public class AppConstants {
+    public static final int APP_VERIFIED = 1;
+}

+ 0 - 15
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/CookieConsts.java

@@ -1,15 +0,0 @@
-package cn.iselab.mooctest.site.common.constant;
-
-/**
- * @author sean
- * @date 2017-03-18.
- */
-public class CookieConsts {
-
-    public static final String COOKIE_DOMAIN = ".mooctest.net";
-
-    public static final int MAX_AGE_CAPTCHA = 300;
-
-    public static final String COOKIE_CAPTCHA = "captcha";
-
-}

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/PageConstants.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.site.common.constant;
+
+/**
+ * Created by Liu on 2017/1/3.
+ */
+public class PageConstants {
+    /**
+     * Pagination
+     */
+    public static final int PAGE_SIZE = 10;
+}

+ 12 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/PrivilegeConstants.java

@@ -0,0 +1,12 @@
+package cn.iselab.mooctest.site.common.constant;
+
+/**
+ * Created by Liu on 2017/3/21.
+ */
+public class PrivilegeConstants {
+    public static final int SUPER_GROUP_ID = 0;
+
+    public static final int SUPER_MANAGER_ID = 13;
+
+    public static final String SUPER_MANAGER_NAME = "陈振宇";
+}

+ 12 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/ProjectConstants.java

@@ -0,0 +1,12 @@
+package cn.iselab.mooctest.site.common.constant;
+
+/**
+ * @author liuzicong
+ */
+public class ProjectConstants {
+
+    public static String PROJECT_NAME = "mooctest-site";
+
+
+
+}

+ 8 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/UrlConstants.java

@@ -9,8 +9,16 @@ public class UrlConstants {
     // public static final String API = "/account/{client:api|iphone|ipad|android}";
 
     public static final String API_COMMON = "/api/common/";
+    public static final String API_MANAGER = "/api/manager/";
+    public static final String API_WORKER = "/api/worker/";
+    public static final String API_ADMIN = "/api/admin/";
+    public static final String API_INTERNAL = "/api/internal/";
     public static final String API_WECHAT = "/api/wechat/";
+    public static final String API_CLIENT = "/api/client/";
     public static final String API_KIBUG = "/api/kibug/";
+    public static final String API_USER = "/api/user/";
+
+    public static final String HOSTNAME = "http://mooctest.net/";
 
     public static final String API_DEV = "/api/dev/";
     public static final String API_TARGET = "/api/target/";

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/CryptKeys.java

@@ -0,0 +1,9 @@
+package cn.iselab.mooctest.site.common.enums;
+
+/**
+ * Created by jessiechen on 2016/10/24.
+ */
+public interface CryptKeys {
+    String REPORT_ID_KEY = "jessiechen123report";
+    String PLUGIN_SCERET = "witest.net";
+}

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/NodeType.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.site.common.enums;
+
+public enum NodeType {
+    MUTATION("mutation"), APFD("apfd");
+    private String type;
+
+    private NodeType(String type) {
+        this.type = type;
+    }
+
+}

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/SessionKey.java

@@ -0,0 +1,9 @@
+package cn.iselab.mooctest.site.common.enums;
+
+/**
+ * Created by Liu on 2017/6/5.
+ */
+public enum SessionKey {
+    ID,
+    IDENTITY
+}

+ 28 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/TaskStatus.java

@@ -0,0 +1,28 @@
+package cn.iselab.mooctest.site.common.enums;
+
+public enum TaskStatus {
+	UPCOMING(0), ONGOING(1), FINISHED(2);
+
+	private int _value;
+
+	TaskStatus(int Value) {
+		this._value = Value;
+	}
+
+	public int getValue() {
+		return _value;
+	}
+
+	public static TaskStatus fromInt(int i) {
+		for (TaskStatus b : TaskStatus.values()) {
+			if (b.getValue() == i) {
+				return b;
+			}
+		}
+		return null;
+	}
+	
+	public String toString(){
+		return String.valueOf(this._value);
+	}
+}

+ 29 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/UserType.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.site.common.enums;
+
+public enum UserType {
+
+    ADMIN(0), MANAGER(1), WORKER(2), ALL(3);
+
+    private int _value;
+
+    UserType(int Value) {
+        this._value = Value;
+    }
+
+    public int getValue() {
+        return _value;
+    }
+
+    public static UserType fromInt(int i) {
+        for (UserType b : UserType.values()) {
+            if (b.getValue() == i) {
+                return b;
+            }
+        }
+        return null;
+    }
+
+    public String toString() {
+        return String.valueOf(this._value);
+    }
+}

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/AppCreateEvent.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.site.common.event;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+@AllArgsConstructor
+public class AppCreateEvent implements Event {
+
+    private long applicationId;
+
+    public static AppCreateEvent create(long applicationId) {
+        return new AppCreateEvent(applicationId);
+    }
+
+    @Override
+    public String getDescription() {
+        return String.format("statistics id: %s", applicationId);
+    }
+
+}

+ 19 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/EventsListener.java

@@ -6,6 +6,8 @@ import cn.iselab.mooctest.site.service.CompetitionService;
 import cn.iselab.mooctest.site.service.ContestMentorService;
 import cn.iselab.mooctest.site.service.GroupService;
 import cn.iselab.mooctest.site.service.TargetService;
+import cn.iselab.mooctest.site.service.fromKibug.StatisService;
+import cn.iselab.mooctest.site.service.instancePermission.AppPermissionService;
 import cn.iselab.mooctest.site.web.logic.CaseLogic;
 import cn.iselab.mooctest.site.web.logic.ExamLogic;
 import cn.iselab.mooctest.site.web.logic.TargetLogic;
@@ -21,6 +23,9 @@ public class EventsListener implements InitializingBean {
     private EventUtil eventUtil;
 
     @Autowired
+    private StatisService statisService;
+
+    @Autowired
     private ContestMentorService instructorService;
 
     @Autowired
@@ -47,18 +52,29 @@ public class EventsListener implements InitializingBean {
     }
 
     @Subscribe
+    public void statisApp(AppCreateEvent event) throws Exception {
+        statisService.create(event.getApplicationId());
+
+    }
+
+    @Subscribe
+    public void statisReport(ReportCreateEvent event) throws Exception {
+        statisService.statAppTesterMobile(event.getApplicationId(), event.getModel(), event.getOs(), 1);
+    }
+
+    @Subscribe
     public void updateContestMentorPermission(UpdateContestMentorEvent event) throws Exception {
         instructorService.updateContestMentorPermission(event.getQualificationId(), event.getTeacherEmails());
     }
 
     @Subscribe
     public void afterAddTask2Competition(AddTask2CompetitionEvent event) throws Exception {
-        instructorService.addContestMentorPermission(event.getCompetitionId(), event.getTaskId());
+        instructorService.addContestMentorPermission(event.getCompetitionId(),event.getTaskId());
     }
 
     @Subscribe
     public void publicityTarget(PublicityTargetEvent publicityTargetEvent) throws Exception {
-        targetLogic.updateTarget(publicityTargetEvent.getTargetId(), null, true);
+        targetLogic.updateTarget(publicityTargetEvent.getTargetId(),null,true);
     }
 
     @Subscribe
@@ -69,7 +85,7 @@ public class EventsListener implements InitializingBean {
     @Subscribe
     public void afterEnterCompetition(EnterCompetitionEvent enterCompetitionEvent) throws Exception {
         Competition competition = competitionService.getCompetiton(enterCompetitionEvent.getCompetitionId());
-        if (competition.getStatus() > 0) {
+        if(competition.getStatus() > 0) {
             Competition2Task competition2Task = competitionService.getCompetition2TaskbyCompetitionIdAndIndex(
                     enterCompetitionEvent.getCompetitionId(), competition.getStatus());
             Long groupId = examLogic.getExamById(competition2Task.getTaskId()).getGroupIds().get(0);

+ 25 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/ReportCreateEvent.java

@@ -0,0 +1,25 @@
+package cn.iselab.mooctest.site.common.event;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+@AllArgsConstructor
+public class ReportCreateEvent implements Event {
+
+    private long applicationId;
+    private String model;
+    private String os;
+
+    public static ReportCreateEvent create(long applicationId, String model, String os) {
+        return new ReportCreateEvent(applicationId, model, os);
+    }
+
+    @Override
+    public String getDescription() {
+        return String.format("statistics id: %s model: %s, value: %s", applicationId, model, os);
+    }
+
+}

+ 0 - 29
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/initialize/InitExamSchedulerMap.java

@@ -1,29 +0,0 @@
-package cn.iselab.mooctest.site.common.initialize;
-
-import cn.iselab.mooctest.site.util.BeanFactory;
-import cn.iselab.mooctest.site.web.ctrl.ExamController;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
-import org.springframework.stereotype.Component;
-
-/**
- * Created by tangshanshan on 2018/4/17.
- */
-@Component
-@ConditionalOnExpression("${featureSwitch.server.initExamScheduler}==true")
-public class InitExamSchedulerMap implements InitializingBean{
-    @Autowired
-    private BeanFactory beanFactory;
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        System.out.println("-----------------------------------------------------------------------------------------");
-        System.out.println("listener");
-        ExamController examController = (ExamController)beanFactory.getBean(ExamController.class);
-        examController.updateStatusForAllTask();
-        examController.startInitExamSchedulerMap();
-        System.out.println("exam scheduler map initialized");
-        System.out.println("-----------------------------------------------------------------------------------------");
-    }
-}

+ 1063 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/template/MailTemplates.java

@@ -0,0 +1,1063 @@
+package cn.iselab.mooctest.site.common.template;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+
+public class MailTemplates {
+
+	public static String getResetPasswordTemplate(String name, String resetLink){
+		return resetPasswordTemplate.replace("#resetLink#", resetLink).replace("#realname#", name);
+	}	
+	
+	public static String getBindEmailTemplate(String name, String resetLink){
+		return bindEmailTemplate.replace("#resetLink#", resetLink).replace("#realname#", name);
+	}		
+
+
+	public static String getManagerRegisterNoticeTemplate(String name,
+			String reviewerEmail, String auditTemplate, String hostname) {
+		return managerRegisterNoticeTemplate.replace("#realname#", name).replace("#reviewerEmail#", reviewerEmail).replace("#auditTemplate#", auditTemplate).replace("#hostname#", hostname);
+	}
+		
+	private static final String resetPasswordTemplate = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />" + 
+			"<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0;\">" + 
+			"<title>重置密码</title>" + 
+			"<style type=\"text/css\">" + 
+			"div, p, a, li, td { -webkit-text-size-adjust:none; }" + 
+			".ReadMsgBody" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			".ExternalClass" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			"body{width: 100%; height: 100%; background-color: #ffffff; margin:0; padding:0; -webkit-font-smoothing: antialiased;}" + 
+			"html{width: 100%;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novalight';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_nova_rgregular'; src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novasemibold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {" + 
+			"	font-family: 'proxima_nova_rgbold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"	" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novablack';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {font-family: 'proxima_novathin';src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"p {padding: 0!important; margin-top: 0!important; margin-right: 0!important; margin-bottom: 0!important; margin-left: 0!important; }" + 
+			".hover:hover {opacity:0.85;filter:alpha(opacity=85);}" + 
+			".image77 img {width: 77px; height: auto;}" + 
+			".avatar125 img {width: 125px; height: auto;}" + 
+			".icon61 img {width: 61px; height: auto;}" + 
+			".image75 img {width: 75px; height: auto;}" + 
+			".icon18 img {width: 18px; height: auto;}" + 
+			"</style>" + 
+			"<!-- @media only screen and (max-width: 640px) " + 
+			"		   {*/" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 640px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		" + 
+			"} </style>" + 
+			"<!--" + 
+			"@media only screen and (max-width: 479px) " + 
+			"		   {" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 479px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		table[class=full] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		.erase {display: none;}" + 
+			"				" + 
+			"		}" + 
+			"} </style>" + 
+			"<!-- Notification 6 -->" + 
+			"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full2\"  bgcolor=\"#303030\"style=\"background-color: rgb(48, 48, 48);\">" + 
+			"	<tr>" + 
+			"		<td style=\"background-image: url(" + UrlConstants.HOSTNAME + "/public/images/mail/not4_bg_image.jpg); -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; background-position: center center; background-repeat: no-repeat;\" id=\"not6\">" +
+			"		" + 
+			"			" + 
+			"			<!-- Mobile Wrapper -->" + 
+			"			<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\">" + 
+			"				<tr>" + 
+			"					<td width=\"100%\">" + 
+			"					" + 
+			"						<div class=\"sortable_inner ui-sortable\">" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"			" + 
+			"						<!-- Start Top -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#4edeb5\" style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; background-color: #3581C1;\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\" class=\"image75\">" + 
+			"									" + 
+			"									<!-- Header Text --> " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"										<tr>" + 
+			"											<td width=\"100%\"><span ><img editable=\"true\" src=\"" + UrlConstants.HOSTNAME + "/public/images/mail/image_77px_not2.png\" width=\"75\" alt=\"\" border=\"0\" ></span></td>" + 
+			"										</tr>" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 23px; color: rgb(63, 67, 69); line-height: 30px; font-weight: 100;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_novathin', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>Hi  #realname#, </singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(63, 67, 69); line-height: 24px;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>感谢您使用慕测平台产品,请点击以下链接重置密码: </singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"40\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<!----------------- Button Center ----------------->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td>" + 
+			"												<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\"> " + 
+			"													<tr> " + 
+			"														<td align=\"center\" height=\"45\"bgcolor=\"#4edeb5\" style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding-left: 30px; padding-right: 30px; font-weight: bold; font-family: Helvetica, Arial, sans-serif; color: rgb(255, 255, 255); background-color: #3581C1;\">" + 
+			"															<multiline><!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgbold', Helvetica; font-weight: normal;\"><!--<![endif]-->" + 
+			"																<a href=\"#resetLink#\" style=\"color: rgb(255, 255, 255); font-size: 15px; text-decoration: none; line-height: 34px; width: 100%;\">重置密码</a>" + 
+			"															<!--[if !mso]><!--></span><!--<![endif]--></multiline>" + 
+			"														</td> " + 
+			"													</tr> " + 
+			"												</table> " + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table><!----------------- End Button Center ----------------->" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"35\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(63, 67, 69); line-height: 24px;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><multiline>欢迎您随时给出反馈和建议!" + 
+			"												<br><br>" + 
+			"												感谢您的支持!" + 
+			"												<br>" + 
+			"												Mooctest.net慕测平台" + 
+			"													" + 
+			"												</multiline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"style=\"border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; background-color: rgb(255, 255, 255);\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"50\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"																	" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(255, 255, 255); line-height: 24px; font-style: italic;\">" + 
+			"									<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]-->Copyright mooctest.net <!--<![endif]--></span><!--[if !mso]><!-->" + 
+			"									" + 
+			"									" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"29\"></td>" + 
+			"							</tr>" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"1\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						</div>" + 
+			"						" + 
+			"					</td>" + 
+			"				</tr>" + 
+			"			</table>" + 
+			"			" + 
+			"		</div>" + 
+			"		</td>" + 
+			"	</tr>" + 
+			"</table><!-- End Notification 6 -->" + 
+			"</div>	<style>body{ background: none !important; } </style>";
+	
+	
+	private static final String bindEmailTemplate = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />" + 
+			"<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0;\">" + 
+			"<title>绑定邮箱</title>" + 
+			"<style type=\"text/css\">" + 
+			"div, p, a, li, td { -webkit-text-size-adjust:none; }" + 
+			".ReadMsgBody" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			".ExternalClass" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			"body{width: 100%; height: 100%; background-color: #ffffff; margin:0; padding:0; -webkit-font-smoothing: antialiased;}" + 
+			"html{width: 100%;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novalight';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_nova_rgregular'; src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novasemibold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {" + 
+			"	font-family: 'proxima_nova_rgbold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"	" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novablack';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {font-family: 'proxima_novathin';src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"p {padding: 0!important; margin-top: 0!important; margin-right: 0!important; margin-bottom: 0!important; margin-left: 0!important; }" + 
+			".hover:hover {opacity:0.85;filter:alpha(opacity=85);}" + 
+			".image77 img {width: 77px; height: auto;}" + 
+			".avatar125 img {width: 125px; height: auto;}" + 
+			".icon61 img {width: 61px; height: auto;}" + 
+			".image75 img {width: 75px; height: auto;}" + 
+			".icon18 img {width: 18px; height: auto;}" + 
+			"</style>" + 
+			"<!-- @media only screen and (max-width: 640px) " + 
+			"		   {*/" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 640px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		" + 
+			"} </style>" + 
+			"<!--" + 
+			"@media only screen and (max-width: 479px) " + 
+			"		   {" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 479px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		table[class=full] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		.erase {display: none;}" + 
+			"				" + 
+			"		}" + 
+			"} </style>" + 
+			"<!-- Notification 6 -->" + 
+			"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full2\"  bgcolor=\"#303030\"style=\"background-color: rgb(48, 48, 48);\">" + 
+			"	<tr>" + 
+			"		<td style=\"background-image: url(" + UrlConstants.HOSTNAME + "/public/images/mail/not4_bg_image.jpg); -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; background-position: center center; background-repeat: no-repeat;\" id=\"not6\">" + 
+			"		" + 
+			"			" + 
+			"			<!-- Mobile Wrapper -->" + 
+			"			<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\">" + 
+			"				<tr>" + 
+			"					<td width=\"100%\">" + 
+			"					" + 
+			"						<div class=\"sortable_inner ui-sortable\">" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"			" + 
+			"						<!-- Start Top -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#4edeb5\" style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; background-color: #3581C1;\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\" class=\"image75\">" + 
+			"									" + 
+			"									<!-- Header Text --> " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"										<tr>" + 
+			"											<td width=\"100%\"><span ><img editable=\"true\" src=\"" + UrlConstants.HOSTNAME + "/public/images/mail/not6_icon75px.png\" width=\"75\" alt=\"\" border=\"0\" ></span></td>" + 
+			"										</tr>" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 23px; color: rgb(63, 67, 69); line-height: 30px; font-weight: 100;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_novathin', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>Hi  #realname#, </singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"30\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(63, 67, 69); line-height: 24px;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>感谢您使用慕测平台产品,请点击以下链接确认绑定邮箱: </singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"40\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<!----------------- Button Center ----------------->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td>" + 
+			"												<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\"> " + 
+			"													<tr> " + 
+			"														<td align=\"center\" height=\"45\"bgcolor=\"#4edeb5\" style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding-left: 30px; padding-right: 30px; font-weight: bold; font-family: Helvetica, Arial, sans-serif; color: rgb(255, 255, 255); background-color: #3581C1;\">" + 
+			"															<multiline><!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgbold', Helvetica; font-weight: normal;\"><!--<![endif]-->" + 
+			"																<a href=\"#resetLink#\" style=\"color: rgb(255, 255, 255); font-size: 15px; text-decoration: none; line-height: 34px; width: 100%;\">确认绑定邮箱</a>" + 
+			"															<!--[if !mso]><!--></span><!--<![endif]--></multiline>" + 
+			"														</td> " + 
+			"													</tr> " + 
+			"												</table> " + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table><!----------------- End Button Center ----------------->" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"35\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(63, 67, 69); line-height: 24px;\">" + 
+			"												<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><multiline>欢迎您随时给出反馈和建议!" + 
+			"												<br><br>" + 
+			"												感谢您的支持!" + 
+			"												<br>" + 
+			"												Mooctest.net慕测平台" + 
+			"													" + 
+			"												</multiline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" bgcolor=\"#ffffff\"style=\"border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; background-color: rgb(255, 255, 255);\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"								 " + 
+			"									<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter2\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" height=\"50\"></td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"																	" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(255, 255, 255); line-height: 24px; font-style: italic;\">" + 
+			"									<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]-->Copyright mooctest.net <!--<![endif]--></span><!--[if !mso]><!-->" + 
+			"									" + 
+			"									" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile2\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"29\"></td>" + 
+			"							</tr>" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"1\"></td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						</div>" + 
+			"						" + 
+			"					</td>" + 
+			"				</tr>" + 
+			"			</table>" + 
+			"			" + 
+			"		</div>" + 
+			"		</td>" + 
+			"	</tr>" + 
+			"</table><!-- End Notification 6 -->" + 
+			"</div>	<style>body{ background: none !important; } </style>";
+
+
+	private static String managerRegisterNoticeTemplate = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />" + 
+			"<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0;\">" + 
+			"<title>Notify</title>" + 
+			"<style type=\"text/css\">" + 
+			"div, p, a, li, td { -webkit-text-size-adjust:none; }" + 
+			".ReadMsgBody" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			".ExternalClass" + 
+			"{width: 100%; background-color: #ffffff;}" + 
+			"body{width: 100%; height: 100%; background-color: #ffffff; margin:0; padding:0; -webkit-font-smoothing: antialiased;}" + 
+			"html{width: 100%;}" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novalight';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-light-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" +  
+			"@font-face {" + 
+			"    font-family: 'proxima_nova_rgregular'; src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-regular-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" +  
+			"@font-face {" + 
+			"    font-family: 'proxima_novasemibold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-semibold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {" + 
+			"	font-family: 'proxima_nova_rgbold';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-bold-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"	" + 
+			"@font-face {" + 
+			"    font-family: 'proxima_novablack';src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/titan/font/proximanova-black-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" + 
+			"    " + 
+			"@font-face {font-family: 'proxima_novathin';src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot');src: url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.eot?#iefix') format('embedded-opentype'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.woff') format('woff'),url('http://rocketway.net/themebuilder/template/templates/mason/font/proximanova-thin-webfont.ttf') format('truetype');font-weight: normal;font-style: normal;}" +   
+			"p {padding: 0!important; margin-top: 0!important; margin-right: 0!important; margin-bottom: 0!important; margin-left: 0!important; }" +   
+			".hover:hover {opacity:0.85;filter:alpha(opacity=85);}" +   
+			".image77 img {width: 77px; height: auto;}" + 
+			".avatar125 img {width: 125px; height: auto;}" + 
+			".icon61 img {width: 61px; height: auto;}" + 
+			".image75 img {width: 75px; height: auto;}" + 
+			".icon18 img {width: 18px; height: auto;}" +   
+			"</style>" +  
+			"<!-- @media only screen and (max-width: 640px) " + 
+			"		   {*/" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 640px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		" + 
+			"} </style>" + 
+			"<!--" +   
+			"@media only screen and (max-width: 479px) " + 
+			"		   {" + 
+			"		   -->" + 
+			"<style type=\"text/css\"> @media only screen and (max-width: 479px){" + 
+			"		body{width:auto!important;}" + 
+			"		table[class=full2] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile2] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter2] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		table[class=full] {width: 100%!important; clear: both; }" + 
+			"		table[class=mobile] {width: 100%!important; padding-left: 20px; padding-right: 20px; clear: both; }" + 
+			"		table[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=fullCenter] {width: 100%!important; text-align: center!important; clear: both; }" + 
+			"		td[class=pad15] {width: 100%!important; padding-left: 15px; padding-right: 15px; clear: both;}" + 
+			"		.erase {display: none;}" + 
+			"				" + 
+			"		}" + 
+			"} </style>" +     
+			"<!-- Notification 3 -->" + 
+			"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\"  bgcolor=\"#303030\"style=\"background-color: rgb(48, 48, 48);\">" + 
+			"	<tr>" + 
+			"		<td style=\"background-image: url(" + UrlConstants.HOSTNAME + "/public/images/mail/not6_bg_image.jpg); -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; background-position: center center; background-repeat: no-repeat; background-color: #23282b;\" id=\"not3\">" + 
+			"		" + 
+			"			" + 
+			"			<!-- Mobile Wrapper -->" + 
+			"			<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"				<tr>" + 
+			"					<td width=\"100%\">" + 
+			"					" + 
+			"						<div class=\"sortable_inner ui-sortable\">" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						</div>" + 
+			"						" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\" bgcolor=\"#ffffff\"style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; -webkit-box-shadow: rgba(68, 68, 68, 0.6) 5px 5px 5px; box-shadow: rgba(68, 68, 68, 0.2) 0px 0px 7px; background-color: rgb(255, 255, 255);\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" valign=\"middle\">" + 
+			"									" + 
+			"									" + 
+			"									<div class=\"sortable_inner ui-sortable\">" + 
+			"									<!-- Start Top -->" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\" bgcolor=\"#ffffff\"style=\"border-top-left-radius: 5px; border-top-right-radius: 5px; background-color: rgb(255, 255, 255);\" object=\"drag-module-small\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"												" + 
+			"												<!-- Header Text --> " + 
+			"												<table width=\"300\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" height=\"30\"></td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"											" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" height=\"40\"></td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"											" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter\">" + 
+			"													<tr>" + 
+			"														<td valign=\"middle\" width=\"100%\" style=\"text-align: center; font-family: Helvetica, Arial, sans-serif; font-size: 43px; color: rgb(63, 67, 69); line-height: 48px;\"class=\"fullCenter\" >" + 
+			"															<!--[if !mso]><!--><span style=\"font-family: 'proxima_novasemibold', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>欢迎</singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"											" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" style=\"text-align: center; border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;\" class=\"fullCenter\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" height=\"45\"></td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"30\"></td>" + 
+			"																</tr>" + 
+			"																<tr>" + 
+			"																	<td valign=\"middle\" width=\"100%\" style=\"text-align: center; font-family: Helvetica, Arial, sans-serif; font-size: 30px; color: white; line-height: 34px;\"class=\"fullCenter\" >" + 
+			"																		<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><singleline>#realname#, 欢迎使用慕测平台!</singleline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"																	</td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"30\"></td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																" + 
+			"																<tr>" + 
+			"																	<td valign=\"middle\" width=\"100%\" style=\"text-align: left; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: white; line-height: 24px;\"class=\"fullCenter\" >" + 
+			"																		<!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]--><multiline>在正式使用系统之前,我们可能需要验证您的身份。" + 
+			"																		<br>" + 
+			"																		<br>" + 
+			"																		在下面的链接中有一份身份验证文档的模板,请您填写完毕后由所在单位盖章,将扫描件以邮件形式发送给 </multiline><!--[if !mso]><!--></span><!--<![endif]-->" + 
+			"																	</td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"40\"></td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<!----------------- Button Center ----------------->" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																" + 
+			"																<tr>" + 
+			"																	<td>" + 
+			"																		<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"> " + 
+			"																			<tr> " + 
+			"																				<td align=\"center\" height=\"40\"bgcolor=\"#f0f0f0\" style=\"border-top-left-radius: 20px; border-top-right-radius: 20px; border-bottom-right-radius: 20px; border-bottom-left-radius: 20px; padding-left: 22px; padding-right: 22px; font-weight: bold; font-family: Helvetica, Arial, sans-serif; color: rgb(34, 32, 32); background-color: rgb(352, 352, 352);\">" + 
+			"																					<multiline><!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]-->" + 
+			"																						<a href=\"#\" style=\"color: rgb(34, 32, 32); font-size: 16px; text-decoration: none; line-height: 34px; width: 100%;\" >#reviewerEmail#</a>" + 
+			"																					<!--[if !mso]><!--></span><!--<![endif]--></multiline>" + 
+			"																				</td> " + 
+			"																			</tr> " + 
+			"																		</table> " + 
+			"																	</td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table><!----------------- End Button Center ----------------->" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"15\"></td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																" + 
+			"																<!----------------- Button Center ----------------->" + 
+			"																<tr>" + 
+			"																	<td>" + 
+			"																		<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"> " + 
+			"																			<tr> " + 
+			"																				<td align=\"center\" height=\"40\"bgcolor=\"#3f4345\" style=\"border-top-left-radius: 20px; border-top-right-radius: 20px; border-bottom-right-radius: 20px; border-bottom-left-radius: 20px; padding-left: 22px; padding-right: 22px; font-weight: bold; font-family: Helvetica, Arial, sans-serif; color: rgb(255, 255, 255); background-color: rgb(63, 67, 69);\">" + 
+			"																					<multiline><!--[if !mso]><!--><span style=\"font-family: 'proxima_nova_rgregular', Helvetica; font-weight: normal;\"><!--<![endif]-->" + 
+			"																						<a href=\"#auditTemplate#\" style=\"color: rgb(255, 255, 255); font-size: 16px; text-decoration: none; line-height: 34px; width: 100%;\">身份证明模板</a>" + 
+			"																					<!--[if !mso]><!--></span><!--<![endif]--></multiline>" + 
+			"																				</td> " + 
+			"																			</tr> " + 
+			"																		</table> " + 
+			"																	</td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"40\"></td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"class=\"pad15\" style=\"background-color: #3581C1;\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																<tr>" + 
+			"																	<td valign=\"middle\" width=\"100%\" style=\"text-align: center; font-family: Helvetica, Arial, sans-serif; font-size: 14px; color: #3f4345; line-height: 24px;\" class=\"fullCenter\" >" + 
+			"																		<multiline><!--[if !mso]><!--><span style=\"font-family: proxima_nova_rgregular, Helvetica; font-weight: normal; color: white;\"><!--<![endif]-->使用慕测其它功能,请点击<!--[if !mso]><!--></span><!--<![endif]--> " + 
+			"																		<!--[if !mso]><!--><span style=\"font-family: 'proxima_novasemibold', Helvetica; font-weight: normal;\"><!--<![endif]--><a href=\"#hostname#\" style=\"color: white;\">主页</a><!--[if !mso]><!--></span><!--<![endif]--></multiline>" + 
+			"																	</td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"object=\"drag-module-small\" style=\"background-color: rgb(255, 255, 255);\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" bgcolor=\"#fdba30\"style=\"border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; background-color: #3581C1;\" class=\"pad15\">" + 
+			"														" + 
+			"															<table width=\"352\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\">" + 
+			"																" + 
+			"																<tr>" + 
+			"																	<td width=\"100%\" height=\"40\"></td>" + 
+			"																</tr>" + 
+			"															</table>" + 
+			"														</td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"												" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table>" + 
+			"									" + 
+			"									<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" bgcolor=\"#ffffff\"style=\"border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; background-color: rgb(255, 255, 255);\" object=\"drag-module-small\">" + 
+			"										<tr>" + 
+			"											<td width=\"100%\" valign=\"middle\">" + 
+			"													" + 
+			"												<table width=\"420\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"mobile\">" + 
+			"													<tr>" + 
+			"														<td width=\"100%\" height=\"50\"></td>" + 
+			"													</tr>" + 
+			"												</table>" + 
+			"																				" + 
+			"											</td>" + 
+			"										</tr>" + 
+			"									</table><!-- End Top -->" + 
+			"									</div>" + 
+			"									" + 
+			"								</td>" + 
+			"							</tr>" + 
+			"						</table>" + 
+			"						" + 
+			"						<div class=\"sortable_inner ui-sortable\">" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"30\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						" + 
+			"						<!-- Space -->" + 
+			"						<table width=\"600\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\" class=\"full\" object=\"drag-module-small\">" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"50\"></td>" + 
+			"							</tr>" + 
+			"							<tr>" + 
+			"								<td width=\"100%\" height=\"1\"></td>" + 
+			"							</tr>" + 
+			"						</table><!-- End Space -->" + 
+			"						</div>" + 
+			"			" + 
+			"					</td>" + 
+			"				</tr>" + 
+			"			</table>" + 
+			"			" + 
+			"		</div>" + 
+			"		</td>" + 
+			"	</tr>" + 
+			"</table><!-- End Notification 3 -->" + 
+			"</div>	<style>body{ background: none !important; } </style>";
+
+}

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/response/ErrorResult.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ErrorResult.java

@@ -1,4 +1,4 @@
-package cn.iselab.mooctest.site.web.response;
+package cn.iselab.mooctest.site.common.web;
 
 import javax.servlet.http.HttpServletResponse;
 import java.lang.reflect.Field;

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/response/ResponseMessage.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ResponseMessage.java

@@ -1,4 +1,4 @@
-package cn.iselab.mooctest.site.web.response;
+package cn.iselab.mooctest.site.common.web;
 
 /**
  * Created by jessiechen on 2016/10/11.

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/response/ResponseWrapper.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/ResponseWrapper.java

@@ -1,4 +1,4 @@
-package cn.iselab.mooctest.site.web.response;
+package cn.iselab.mooctest.site.common.web;
 
 
 import lombok.Data;

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/response/StatusCode.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/StatusCode.java

@@ -1,4 +1,4 @@
-package cn.iselab.mooctest.site.web.response;
+package cn.iselab.mooctest.site.common.web;
 
 /**
  * Created by luyanliang on 15-7-7.

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/response/SuccessResult.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/web/SuccessResult.java

@@ -1,4 +1,4 @@
-package cn.iselab.mooctest.site.web.response;
+package cn.iselab.mooctest.site.common.web;
 
 import java.util.HashMap;
 

+ 22 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ApplicationStartup.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.site.configure;
+
+import cn.iselab.mooctest.site.web.ctrl.ExamController;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+
+/**
+ * Created by csc on 2017/7/25.
+ */
+public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent event)
+    {
+        System.out.println("-----------------------------------------------------------------------------------------");
+        System.out.println("listener");
+        ExamController examController = event.getApplicationContext().getBean(ExamController.class);
+        examController.updateStatusForAllTask();
+        examController.startInitExamSchedulerMap();
+        System.out.println("exam scheduler map initialized");
+        System.out.println("-----------------------------------------------------------------------------------------");
+    }
+}

+ 91 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/AuthFilterConfiguration.java

@@ -0,0 +1,91 @@
+package cn.iselab.mooctest.site.configure;
+
+import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.web.constants.FilterConsts;
+import cn.iselab.mooctest.site.web.filter.*;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.embedded.FilterRegistrationBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2017-03-18.
+ */
+@Configuration
+public class AuthFilterConfiguration {
+
+    @Bean(name = "authFilterConfig")
+    @ConfigurationProperties(prefix = "auth")
+    public FilterConfig createAuthFilterConfig() {
+        return new FilterConfig();
+    }
+
+    @Bean
+    public FilterRegistrationBean registerAuthFilter(AuthFilter authFilter,
+                                                     @Qualifier("authFilterConfig") FilterConfig filterConfig) {
+
+        authFilter.setEscapeUrls(filterConfig.getEscapeUrls());
+
+        FilterRegistrationBean bean = new FilterRegistrationBean(authFilter);
+        bean.addUrlPatterns(UrlConstants.API_WORKER + "*");
+        bean.addUrlPatterns(UrlConstants.API_COMMON + "*");
+        bean.addUrlPatterns(UrlConstants.API_MANAGER + "*");
+        bean.addUrlPatterns(UrlConstants.API_ADMIN + "*");
+        bean.setOrder(FilterConsts.ORDER_AUTH);
+
+        return bean;
+    }
+
+    @Bean
+    public FilterRegistrationBean registerWorkerAuthFilter(WorkerAuthFilter workerAuthFilter) {
+        FilterRegistrationBean bean = new FilterRegistrationBean(workerAuthFilter);
+        bean.addUrlPatterns(UrlConstants.API_WORKER + "*");
+        bean.addUrlPatterns(UrlConstants.API_COMMON + "*");
+        bean.setOrder(FilterConsts.ORDER_AUTH_WORKER);
+        return bean;
+    }
+
+    @Bean
+    public FilterRegistrationBean registerManagerAuthFilter(ManagerAuthFilter managerAuthFilter) {
+        FilterRegistrationBean bean = new FilterRegistrationBean(managerAuthFilter);
+        bean.addUrlPatterns(UrlConstants.API_MANAGER + "*");
+        bean.addUrlPatterns(UrlConstants.API_COMMON + "*");
+        bean.setOrder(FilterConsts.ORDER_AUTH_MANAGER);
+        return bean;
+    }
+
+    @Bean
+    public FilterRegistrationBean registerAdminAuthFilter(AdminAuthFilter adminAuthFilter) {
+        FilterRegistrationBean bean = new FilterRegistrationBean(adminAuthFilter);
+        bean.addUrlPatterns(UrlConstants.API_ADMIN + "*");
+        bean.addUrlPatterns(UrlConstants.API_COMMON + "*");
+        bean.setOrder(FilterConsts.ORDER_AUTH_ADMIN);
+        return bean;
+    }
+
+    @Bean
+    public FilterRegistrationBean registerApiHeaderFilter(ApiHeaderFilter apiHeaderFilter) {
+        FilterRegistrationBean bean = new FilterRegistrationBean(apiHeaderFilter);
+        bean.addUrlPatterns(UrlConstants.API_INTERNAL + "*");
+        return bean;
+    }
+
+    private class FilterConfig {
+
+        private List<String> escapeUrls;
+
+        public List<String> getEscapeUrls() {
+            return escapeUrls;
+        }
+
+        public void setEscapeUrls(List<String> escapeUrls) {
+            this.escapeUrls = escapeUrls;
+        }
+    }
+
+}
+

+ 0 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ClientFeatureConfiguration.java

@@ -15,5 +15,4 @@ public class ClientFeatureConfiguration {
     private boolean email;
     private boolean oss;
     private boolean webide;
-    private boolean wechat;
 }

+ 0 - 27
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/FileUploadConfiguration.java

@@ -1,27 +0,0 @@
-package cn.iselab.mooctest.site.configure;
-
-import org.springframework.boot.context.embedded.MultipartConfigFactory;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.servlet.MultipartConfigElement;
-
-/**
- * Created by tangshanshan on 2018/4/17.
- */
-@Configuration
-public class FileUploadConfiguration {
-    /**
-     * 文件上传配置
-     * @return
-     */
-    @Bean
-    public MultipartConfigElement multipartConfigElement() {
-        MultipartConfigFactory factory = new MultipartConfigFactory();
-        //单个文件最大
-        factory.setMaxFileSize("100MB"); //KB,MB
-        /// 设置总上传数据总大小
-        factory.setMaxRequestSize("500MB");
-        return factory.createMultipartConfig();
-    }
-}

+ 2 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RequestLoggerAutoConfiguration.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.configure;
 
 import cn.iselab.mooctest.site.logger.RequestLogger;
+import cn.iselab.mooctest.site.web.constants.FilterConsts;
 import cn.iselab.mooctest.site.web.filter.RequestLoggingFilter;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -34,7 +35,7 @@ public class RequestLoggerAutoConfiguration {
     @Bean
     public FilterRegistrationBean registrationBean(RequestLoggingFilter requestLoggingFilter) {
         FilterRegistrationBean bean = new FilterRegistrationBean(requestLoggingFilter);
-        bean.setOrder(Integer.MAX_VALUE);
+        bean.setOrder(FilterConsts.ORDER_AUTH);
         return bean;
     }
 

+ 41 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RpcServerConfiguration.java

@@ -0,0 +1,41 @@
+package cn.iselab.mooctest.site.configure;
+
+import com.taocoder.ourea.core.config.ThriftServerConfig;
+import com.taocoder.ourea.core.config.ZkConfig;
+import com.taocoder.ourea.core.provider.ServiceProviderFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @auther liuzicong
+ */
+@Configuration
+@ConditionalOnProperty(name = "rpcServer.enabled", matchIfMissing = true)
+public class RpcServerConfiguration {
+
+    private Logger LOG = LoggerFactory.getLogger(getClass());
+
+    @Bean(name = "zkConfig")
+    public ZkConfig zkConfig(@Value("${rpcServer.zkAddress}") String zkAddress) {
+        LOG.info("Using zkAddress {}", zkAddress);
+        return new ZkConfig(zkAddress);
+    }
+
+
+    @Bean
+    @ConfigurationProperties(prefix = "rpcServer")
+    public ThriftServerConfig serverConfig() {
+        return new ThriftServerConfig();
+    }
+
+    @Bean
+    public ServiceProviderFactory serviceProviderFactory() {
+        return new ServiceProviderFactory();
+    }
+
+}

+ 12 - 10
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/realm/ShiroRealm.java

@@ -42,7 +42,7 @@ public class ShiroRealm extends AuthorizingRealm {
     private MobileVerificationService mobileVerificationService;
 
     @Autowired
-    private TargetPermissionService targetPermissionService;
+    private AppPermissionService appPermissionService;
 
     @Autowired
     private TaskPermissionService taskPermissionService;
@@ -156,9 +156,9 @@ public class ShiroRealm extends AuthorizingRealm {
             CasePermission casePermission = (CasePermission) permission;
             return checkCasePermission(casePermission);
         }
-        if (permission instanceof TargetPermission) {
-            TargetPermission targetPermission = (TargetPermission) permission;
-            return checkTargetPermission(targetPermission);
+        if (permission instanceof AppPermission) {
+            AppPermission appPermission = (AppPermission) permission;
+            return checkAppPermission(appPermission);
         }
         if (permission instanceof GroupPermission) {
             GroupPermission groupPermission = (GroupPermission) permission;
@@ -186,14 +186,16 @@ public class ShiroRealm extends AuthorizingRealm {
         return taskPermissions.stream().anyMatch(tp -> tp.implies(taskPermission));
     }
 
-    private Boolean checkTargetPermission(TargetPermission targetPermission) {
-        List<TargetPermission> targetPermissions = targetPermissionService.getByUserIdAndInstanceId(targetPermission.getId(),
-                targetPermission.getInstanceId());
-        return targetPermissions.stream().anyMatch(ap -> ap.implies(targetPermission));
+    private Boolean checkAppPermission(AppPermission appPermission) {
+        List<AppPermission> appPermissions = appPermissionService.getByUserIdAndInstanceId(appPermission.getUserId(),
+                appPermission.getInstanceId());
+//        if (appPermissions.stream().anyMatch(ap-> ap.getUserId().equals(0) && ap.getOperation().equals("*")
+//                || ap.getOperation().equals(appPermission.getOperation()))){
+//            return true;
+//        }
+        return appPermissions.stream().anyMatch(ap -> ap.implies(appPermission));
     }
 
-
-
     private Boolean checkCasePermission(CasePermission casePermission) {
         List<CasePermission> casePermissions = casePermissionService.getByUserIdAndInstanceId(casePermission.getUserId(),
                 casePermission.getInstanceId());

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AdminDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Admin;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author liuzicong
+ */
+@Transactional
+public interface AdminDao extends CrudRepository<Admin, Long> {
+
+    Admin findByEmail(String email);
+
+    Admin findByMobile(String mobile);
+
+}

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Target2UserDao.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/App2UserDao.java

@@ -1,10 +1,10 @@
 package cn.iselab.mooctest.site.dao;
 
-import cn.iselab.mooctest.site.models.Target2User;
+import cn.iselab.mooctest.site.models.App2User;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-public interface Target2UserDao extends PagingAndSortingRepository<Target2User,Long>, JpaSpecificationExecutor<Target2User>, CrudRepository<Target2User,Long> {
+public interface App2UserDao extends PagingAndSortingRepository<App2User,Long>, JpaSpecificationExecutor<App2User>, CrudRepository<App2User,Long> {
 
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AppDao.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.App;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2017-03-11.
+ */
+
+@Transactional
+public interface AppDao extends CrudRepository<App, Long>{
+
+    @Query("SELECT app FROM App app WHERE app.ownerId = :ownerId")
+    List<App> findAppsByOwnerId(@Param("ownerId") long ownerId);
+}

+ 1 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AssignedTaskDao.java

@@ -7,7 +7,6 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Propagation;
 
 import javax.transaction.Transactional;
 import java.util.List;
@@ -15,7 +14,7 @@ import java.util.List;
 /**
  * Created by Liu on 2016/12/27.
  */
-@Transactional()
+@Transactional
 public interface AssignedTaskDao extends PagingAndSortingRepository<AssignedTask, Long> {
 
     List<AssignedTask> findByTaskIdAndWorkerId(long taskId, long workerId);

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Case2BugDao.java

@@ -18,7 +18,7 @@ public interface Case2BugDao extends CrudRepository<Bug, Integer> {
     @Query("SELECT COUNT(b) from Bug b")
     Integer getTotalBugs();
 
-    @Query("SELECT c.id, c.name, COUNT(b.id) FROM CaseExtends c, Bug b, CaseTake ct " +
+    @Query("SELECT c.id, c.name, COUNT(b.id) FROM Case c, Bug b, CaseTake ct " +
             "WHERE b.caseTakeId = ct.id " +
             "AND ct.caseId = c.id GROUP BY c.id")
     List<Bug2CaseVO> getBugGroupByCase();

+ 58 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseDao.java

@@ -0,0 +1,58 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Case;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * Created by sean on 16/12/24.
+ */
+@Transactional
+public interface CaseDao extends PagingAndSortingRepository<Case, Long>,JpaSpecificationExecutor<Case> {
+
+    @Query("SELECT c FROM Case c WHERE c.subjectId = :subjectId AND c.deleted = 0")
+    Iterable<Case> findBySubjectId(long subjectId);
+
+    List<Case> findByManagerId(long managerId);
+
+    @Query("SELECT c FROM Case c WHERE c.visible = TRUE AND c.deleted = 0")
+    List<Case> findPublicCases();
+
+    @Query("SELECT c FROM Case c WHERE c.managerId = :managerId AND c.visible = FALSE AND c.deleted = 0")
+    List<Case> findPrivateCasesbyManagerId(@Param("managerId") long managerId);
+
+    @Query("SELECT c FROM Case c WHERE c.subjectId = :subjectId AND c.visible = :visible")
+    List<Case> findBySubjectIdAndPublic(@Param("subjectId") long subjectId, @Param("visible") boolean visible);
+
+    @Query("SELECT c FROM Case c , Subject s " +
+            "WHERE s.id = c.subjectId " +
+            "And s.subsiteId = :subsiteId " +
+            "AND c.caseId = :subsiteCaseId")
+    Case findBySubsiteIdAndSubsiteCaseId(@Param("subsiteId") long subsiteId, @Param("subsiteCaseId") String subsiteCaseId);
+
+    @Query("SELECT c FROM Case c " +
+            "WHERE c.subjectId = :subjectId " +
+            "AND c.visible = :visible " +
+            "AND c.managerId = :managerId")
+    List<Case> findBySubjectIdAndPublicAndUploaderId(@Param("subjectId") long subjectId,
+                                                     @Param("visible") boolean visible,
+                                                     @Param("managerId") Long managerId);
+
+    @Query("SELECT c FROM Case c, Task2Case t2c WHERE c.id = t2c.caseId AND t2c.taskId = :taskId")
+    List<Case> findByTaskId(@Param("taskId") long taskId);
+
+    @Query("SELECT c FROM Case c, Subsite ss, Subject sj " +
+            "WHERE c.managerId = :managerId " +
+            "AND c.subjectId = sj.id " +
+            "AND sj.subsiteId = ss.id " +
+            "AND ss.id = :subsiteId")
+    List<Case> findCasesBySubsiteId(@Param("subsiteId") long subsiteId, @Param("managerId") long managerId);
+
+
+    List<Case> findByCaseId(String id);
+}

+ 3 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseExtendsDao.java

@@ -2,18 +2,17 @@ package cn.iselab.mooctest.site.dao;
 
 import cn.iselab.mooctest.site.models.CaseExtends;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.PagingAndSortingRepository;
-import org.springframework.data.repository.query.Param;
 
 import javax.transaction.Transactional;
 import java.util.List;
 
 /**
- * Created by sean on 16/12/24.
+ * Created by shanshan on 2017/6/28.
  */
 @Transactional
-public interface CaseExtendsDao extends PagingAndSortingRepository<CaseExtends, Long>,JpaSpecificationExecutor<CaseExtends> {
+public interface CaseExtendsDao  extends PagingAndSortingRepository<CaseExtends, Long>,JpaSpecificationExecutor<CaseExtends> {
 
     List<CaseExtends> findByAppId(long appId);
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Competition2TaskDao.java

@@ -1,10 +1,12 @@
 package cn.iselab.mooctest.site.dao;
 
 import cn.iselab.mooctest.site.models.Competition2Task;
+import cn.iselab.mooctest.site.models.Task;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.transaction.Transactional;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Created by tangshanshan on 2017/11/3.

+ 95 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestDao.java

@@ -0,0 +1,95 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Contest;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * Created by lishuying on 17/3/30.
+ */
+@Transactional
+public interface ContestDao extends CrudRepository<Contest, Long> {
+
+    List<Contest> findByYear(String year);
+
+    Contest findByYearAndType(String year, Integer type);
+
+    @Query("SELECT c FROM Contest c WHERE c.id IN " +
+            "(SELECT distinct w2c.contestId FROM Worker2Contest w2c " +
+            "WHERE w2c.workerId=?1)")
+    List<Contest> findByWorkerId(long workerId);
+
+    @Query("SELECT w.location, COUNT(distinct w.id) from Worker w, Worker2Contest w2c " +
+            "WHERE w.id = w2c.workerId " +
+            "GROUP BY w.location ORDER BY COUNT(distinct w.id) DESC")
+    List<Object[]> CountAllByLocation();
+
+    @Query("SELECT w.location, COUNT(distinct w.id) from Worker w, Worker2Contest w2c " +
+            "WHERE w.id = w2c.workerId AND w2c.contestId = :contestId " +
+            "GROUP BY w.location ORDER BY COUNT(distinct w.id) DESC")
+    List<Object[]> CountByLocation(@Param("contestId") Long contestId);
+
+    @Query("SELECT w.information, COUNT(distinct w.id) from Worker w, Worker2Contest w2c " +
+            "WHERE w.id = w2c.workerId " +
+            "GROUP BY w.information ORDER BY COUNT(distinct w.id) DESC")
+    List<Object[]> CountAllBySchool();
+
+    @Query("SELECT w.information, COUNT(distinct w.id) from Worker w, Worker2Contest w2c " +
+            "WHERE w.id = w2c.workerId AND w2c.contestId = :contestId " +
+            "GROUP BY w.information ORDER BY COUNT(distinct w.id) DESC")
+    List<Object[]> CountBySchool(@Param("contestId") Long contestId);
+
+    @Query("SELECT w.location, COUNT(distinct w.id) FROM Worker w, AssignedTask at " +
+            "WHERE at.taskId in (404,414,415,416,421) " +
+            "AND w.id = at.workerId " +
+            "AND at.score != 0 " +
+            "GROUP BY w.location " +
+            "ORDER BY COUNT(distinct w.id) DESC")
+    List<Object[]> CountByActive();
+
+    @Query(value = "SELECT uni_loc FROM university WHERE uni_name = :university", nativeQuery = true)
+    String findAreaByUniversity(@Param("university") String university);
+
+    @Query("SELECT u.school, COUNT(distinct u.id) FROM User u, Group2Worker g2w " +
+            "WHERE u.id = g2w.participantId " +
+            "AND g2w.groupId in(309, 310, 311, 312, 313, 314) " +
+            "GROUP BY u.school ORDER BY COUNT(distinct u.id) DESC")
+    List<Object[]> CountAllBySchoolOfFall();
+
+
+
+    @Query("SELECT u.school, COUNT(distinct u.id) FROM User u, Group2Worker g2w " +
+            "WHERE u.id = g2w.participantId " +
+            "AND g2w.groupId = :groupId " +
+            "GROUP BY u.school ORDER BY COUNT(distinct u.id) DESC")
+    List<Object[]> CountBySchoolOfFall(@Param("groupId") Long groupId);
+
+    @Query("SELECT un.location, COUNT(distinct u.id) FROM User u, AssignedTask at, University un " +
+            "WHERE at.taskId in(953,931,930,915,872) " +
+            "AND u.id = at.participantId " +
+            "AND at.score != 0 " +
+            "AND u.school LIKE un.name " +
+            "GROUP BY un.location " +
+            "ORDER BY COUNT(distinct u.id) DESC")
+    List<Object[]> CountByActiveofFall();
+
+    @Query("SELECT un.location, COUNT(distinct u.id) FROM University un, User u, Group2Worker g2w " +
+            "WHERE u.id = g2w.participantId " +
+            "AND g2w.groupId in(309, 310, 311, 312, 313, 314) " +
+            "AND u.school LIKE un.name " +
+            "GROUP BY un.location " +
+            "ORDER BY COUNT(distinct u.id) DESC")
+    List<Object[]> CountAllByLocationOfFall();
+
+    @Query("SELECT un.location, COUNT(distinct u.id) FROM University un, User u, Group2Worker g2w " +
+            "WHERE u.id = g2w.participantId " +
+            "AND g2w.groupId = :groupId " +
+            "AND u.school LIKE un.name " +
+            "GROUP BY un.location " +
+            "ORDER BY COUNT(distinct u.id) DESC")
+    List<Object[]> CountByLocationOfFall(@Param("groupId") Long groupId);
+}

+ 11 - 33
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ExamDao.java

@@ -1,6 +1,6 @@
 package cn.iselab.mooctest.site.dao;
 
-import cn.iselab.mooctest.site.models.Exam;
+import cn.iselab.mooctest.site.models.Task;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specifications;
@@ -18,50 +18,28 @@ import java.util.List;
  * Created by major on 2017/6/23.
  */
 @Transactional
-public interface ExamDao extends PagingAndSortingRepository<Exam, Long>, JpaSpecificationExecutor<Exam> {
+public interface ExamDao extends PagingAndSortingRepository<Task, Long>, JpaSpecificationExecutor<Task> {
 
-    Page<Exam> findBygroupSet_Id(Long groupId, Pageable pageable);
+    Page<Task> findBygroupSet_Id(Long groupId,Pageable pageable);
 
-    List<Exam> findByOwnerId(Long ownerId);
+    List<Task> findByOwnerId(Long ownerId);
 
-    Page<Exam> findByOwnerId(long organizerId, Specifications<Exam> where, Pageable pageable);
+    Page<Task> findByOwnerId(long organizerId, Specifications<Task> where, Pageable pageable);
 
     @Modifying
-    @Query("update Exam t set t.status = :status where t.id= :id")
+    @Query("update Task t set t.status = :status where t.id= :id")
     void updateStatusById(@Param("id") long id, @Param("status") int status);
 
     @Query("select t " +
-            "from Exam t " +
+            "from Task t " +
             "where t.status in (0, 1)")
-    List<Exam> findStatus0And1();
+    List<Task> findStatus0And1();
 
-    List<Exam> findAll();
+    List<Task> findAll();
 
-    List<Exam> findByName(String name);
+    List<Task> findByName(String name);
 
     @Query("select taskId from Task2Group where groupId in " +
-            "(select tg.groupId from Exam t, Task2Group tg where t.type=:type and t.id=tg.taskId )")
+            "(select tg.groupId from Task t, Task2Group tg where t.type=:type and t.id=tg.taskId )")
     List<Long> findContestAndExerciseId(@Param("type")Byte type);
-
-
-    @Query("SELECT t FROM Exam t, Task2Group t2g " +
-            "WHERE t2g.groupId = :groupId " +
-            "AND t.id = t2g.taskId")
-    List<Exam> findTaskListByGroupId(@Param("groupId") long groupId);
-
-    @Query("SELECT t FROM Exam t, Task2Group t2g " +
-            "WHERE t2g.groupId = :groupId " +
-            "AND t.id = t2g.taskId")
-    List<Exam> findTaskListInGroup(@Param("groupId") long groupId);
-
-    @Modifying
-    @Query(value = "INSERT INTO AssignedTask" +
-            "(taskId, workerId, managerId, content, name, result, score) " +
-            "VALUES " +
-            "(:taskId, :workerId, :managerId, :content, :name, :result, :score)", nativeQuery = true)
-    void addAssignedTask(@Param("taskId") long taskId, @Param("workerId") long workerId, @Param("managerId") long managerId,
-                         @Param("content") String content, @Param("name") String name, @Param("result") String result,
-                         @Param("score") double score);
-
-    int countByManagerId(long managerId);
 }

+ 37 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GroupDao.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.dao;
 
 import cn.iselab.mooctest.site.models.Group;
 import cn.iselab.mooctest.site.models.User;
+import cn.iselab.mooctest.site.models.Worker;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
@@ -21,6 +22,8 @@ import java.util.List;
 @Transactional
 public interface GroupDao extends PagingAndSortingRepository<Group, Long> {
 
+//    Page<Worker> GroupMemeberList(long groupId, Pageable pageable);
+
     List<Group> findByManagerId(long managerId);
     List<Group> findByOwnerId(long ownerId);
 
@@ -75,11 +78,45 @@ public interface GroupDao extends PagingAndSortingRepository<Group, Long> {
             "AND g2w.workerId = :participantId ")
     List<Group> findByExamIdAndParticipantId(@Param("examId") long examId, @Param("participantId") long participantId);
 
+    @Query("SELECT w " +
+            "FROM Worker w " +
+            "WHERE w.id IN( " +
+            " SELECT g2w.workerId " +
+            " FROM Group2Worker g2w " +
+            " WHERE g2w.groupId=:groupId)")
+    Page<Worker> getWorkersByGroupId(@Param("groupId") long groupId, Pageable pageable);
 
     @Query("SELECT u FROM User u WHERE u.id IN(" +
             "SELECT g2w.participantId FROM Group2Worker g2w WHERE g2w.groupId=:groupId)")
     List<User> getUserByGroupId(@Param("groupId") long groupId);
 
+    @Query("SELECT w " +
+            "FROM Worker w " +
+            "WHERE w.id IN( " +
+            " SELECT g2w.workerId " +
+            " FROM Group2Worker g2w " +
+            " WHERE g2w.groupId=:groupId)")
+    List<Worker> getWorkersByGroupId(@Param("groupId") long groupId);
+
+    @Query("SELECT w " +
+            "FROM Group2Worker g2w, Worker w " +
+            "WHERE g2w.groupId=:groupId " +
+            "AND w.id=g2w.workerId " +
+            "AND w.name like '%:name%'")
+    List<Worker> findWorker(@Param("groupId") long groupId, @Param("name") String name);
+
+    /**
+     * Check if worker exists in certain group
+     *
+     * @param groupId
+     * @param workerId
+     * @return
+     */
+    @Query("SELECT w FROM Worker w, Group2Worker g2w " +
+            "WHERE g2w.groupId= :groupId " +
+            "AND g2w.workerId= :workerId " +
+            "AND w.id = g2w.workerId")
+    Worker findWorkerInGroup(@Param("groupId") long groupId, @Param("workerId") long workerId);
     @Query("SELECT u " +
             "FROM User u " +
             "WHERE u.id IN( " +

+ 39 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ManagerDao.java

@@ -0,0 +1,39 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Manager;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+
+/**
+ * Created by sean on 16/12/22.
+ */
+@Transactional
+public interface ManagerDao extends PagingAndSortingRepository<Manager, Long> {
+
+    Manager findByName(String name);
+
+    Manager findById(long id);
+
+    Manager findByMobile(String mobile);
+
+    Manager findByEmail(String email);
+
+    @Query("SELECT m FROM Manager m WHERE m.email = :account OR m.mobile = :account")
+    Manager findByAccount(@Param("account") String account);
+
+//    @Modifying
+//    @Query("UPDATE Task2AssistantManagerService t2am " +
+//            "SET t2am.status = :status " +
+//            "WHERE t2am.managerId = :managerId " +
+//            "AND t2am.taskId = :taskId")
+//    Manager updateAssistantManager(@Param("managerId") long managerId,
+//                                   @Param("taskId") long taskId, @Param("status") int status);
+
+    @Query("SELECT COUNT(g) FROM Group g WHERE g.managerId = :managerId")
+    int currGroupNum(@Param("managerId") long managerId);
+
+}

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ManagerSubsiteFeatureDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.ManagerSubsiteFeature;
+import cn.iselab.mooctest.site.models.MobileVerification;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @author guoyc
+ * @date 2017-03-27 4:15 PM.
+ */
+@Transactional
+public interface ManagerSubsiteFeatureDao extends CrudRepository<ManagerSubsiteFeature, Long> {
+
+    List<ManagerSubsiteFeature> findByManagerId(long managerId);
+}

+ 7 - 7
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/MonitorDao.java

@@ -28,24 +28,24 @@ public interface MonitorDao extends CrudRepository<User, Long>{
     @Query("SELECT COUNT(DISTINCT u2r.userId) FROM User2Role u2r, User u WHERE u2r.roleId = 4 AND u2r.userId = u.id")
     Integer getContestMentorNumbers();
 
-    @Query("SELECT COUNT(t) FROM Exam t")
+    @Query("SELECT COUNT(t) FROM Task t")
     Integer getTotalExam();
 
-    @Query("SELECT COUNT(t) FROM Exam t WHERE t.status = 0 AND t.beginTime < t.endTime")
+    @Query("SELECT COUNT(t) FROM Task t WHERE t.status = 0 AND t.beginTime < t.endTime")
     Integer getUpComingExam();
 
-    @Query("SELECT COUNT(t) FROM Exam t WHERE t.status = 1 AND t.beginTime < t.endTime")
+    @Query("SELECT COUNT(t) FROM Task t WHERE t.status = 1 AND t.beginTime < t.endTime")
     Integer getOnGoingExam();
 
-    @Query("SELECT COUNT(t) FROM Exam t WHERE (t.status = 2 OR t.status = 3 )AND t.beginTime < t.endTime")
+    @Query("SELECT COUNT(t) FROM Task t WHERE (t.status = 2 OR t.status = 3 )AND t.beginTime < t.endTime")
     Integer getFinishedExam();
 
-    @Query("SELECT COUNT(c) FROM CaseExtends c WHERE c.deleted = false")
+    @Query("SELECT COUNT(c) FROM Case c WHERE c.deleted = false")
     Integer getTotalCases();
 
-    @Query("SELECT COUNT(c) FROM CaseExtends c WHERE c.deleted = false AND c.visible = true ")
+    @Query("SELECT COUNT(c) FROM Case c WHERE c.deleted = false AND c.visible = true ")
     Integer getPublicCaseNumbers();
 
-    @Query("SELECT COUNT(c) FROM CaseExtends c WHERE c.deleted = false AND c.visible = false ")
+    @Query("SELECT COUNT(c) FROM Case c WHERE c.deleted = false AND c.visible = false ")
     Integer getPersonalCaseNumbers();
 }

+ 3 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/PaperDao.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.dao;
 
+import cn.iselab.mooctest.site.models.CaseExtends;
 import cn.iselab.mooctest.site.models.Paper;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -19,10 +20,10 @@ public interface PaperDao extends PagingAndSortingRepository<Paper, Long>, JpaSp
 
     Paper findById(long paperId);
 
-    @Query("select p from Paper p,Paper2Case t2c where t2c.caseId=:caseId and t2c.taskId=p.id and p.isDeleted=0 and p.isPublic=1")
+    @Query("select p from Paper p,Task2Case t2c where t2c.caseId=:caseId and t2c.taskId=p.id and p.isDeleted=0 and p.isPublic=1")
     Page<Paper> findByCaseId(@Param("caseId") Long caseId, Pageable pageable);
 
-    @Query("select p from Paper p,Paper2Case t2c where t2c.caseId=:caseId and t2c.taskId=p.id and p.isDeleted=0 and p.isPublic=0 " +
+    @Query("select p from Paper p,Task2Case t2c where t2c.caseId=:caseId and t2c.taskId=p.id and p.isDeleted=0 and p.isPublic=0 " +
             "and p.ownerId=:ownerId")
     Page<Paper> findByCaseIdPrivate(@Param("caseId") Long caseId,
                                     @Param("ownerId") Long ownerId, Pageable pageable);

+ 6 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/SubsiteDao.java

@@ -1,6 +1,6 @@
 package cn.iselab.mooctest.site.dao;
 
-import cn.iselab.mooctest.site.models.CaseExtends;
+import cn.iselab.mooctest.site.models.Case;
 import cn.iselab.mooctest.site.models.Subsite;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
@@ -19,19 +19,19 @@ public interface SubsiteDao extends CrudRepository<Subsite, Long> {
 
     Subsite findByName(String name);
 
-    @Query("SELECT c FROM CaseExtends c, Subject s " +
+    @Query("SELECT c FROM Case c, Subject s " +
             "WHERE s.subsiteId = :subsiteId " +
             "AND c.subjectId = s.id " +
             "AND c.visible = true " +
             "AND c.deleted = false")
-    List<CaseExtends> getPublicCasesBySubsiteId(@Param("subsiteId") long subsiteId);
+    List<Case> getPublicCasesBySubsiteId(@Param("subsiteId") long subsiteId);
 
-    @Query("SELECT c FROM CaseExtends c, Subject s " +
+    @Query("SELECT c FROM Case c, Subject s " +
             "WHERE s.subsiteId = :subsiteId " +
             "AND c.subjectId = s.id " +
             "AND c.managerId = :managerId " +
             "AND c.visible = false " +
             "AND c.deleted = false")
-    List<CaseExtends> getPrivateCasesBySubsiteIdAndManagerId(@Param("subsiteId") long subsiteId,
-                                                             @Param("managerId") long managerId);
+    List<Case> getPrivateCasesBySubsiteIdAndManagerId(@Param("subsiteId") long subsiteId,
+                                                      @Param("managerId") long managerId);
 }

+ 15 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/SubsiteFeatureDao.java

@@ -0,0 +1,15 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.SubsiteFeature;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author guoyc
+ * @date 2017-03-30 3:46 PM.
+ */
+@Transactional
+public interface SubsiteFeatureDao extends CrudRepository<SubsiteFeature, Long>{
+
+}

+ 7 - 8
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetDao.java

@@ -1,9 +1,12 @@
 package cn.iselab.mooctest.site.dao;
 
 
-import cn.iselab.mooctest.site.models.Target;
+import cn.iselab.mooctest.site.models.App;
+import cn.iselab.mooctest.site.web.data.TargetVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specifications;
+import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
@@ -11,17 +14,13 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
 
 import javax.transaction.Transactional;
-import java.util.List;
 
 /**
  * Created by ROGK on 2017/6/26.
  */
 @Transactional
-public interface TargetDao extends PagingAndSortingRepository<Target,Long>, JpaSpecificationExecutor<Target>, CrudRepository<Target,Long> {
+public interface TargetDao extends PagingAndSortingRepository<App,Long>, JpaSpecificationExecutor<App>, CrudRepository<App,Long> {
 
-    @Query("SELECT a from Target a WHERE a.ownerId=:ownerId OR a.visible= 1")
-    Page<Target> findByOwnerId(@Param("ownerId")long ownerId, Pageable pageable);
-
-    @Query("SELECT app FROM Target app WHERE app.ownerId = :ownerId")
-    List<Target> findAppsByOwnerId(@Param("ownerId") long ownerId);
+    @Query("SELECT a from App a WHERE a.ownerId=:ownerId OR a.visible= 1")
+    Page<App> findByOwnerId(@Param("ownerId")long ownerId, Pageable pageable);
 }

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetDevDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.DevTarget;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+
+/**
+ * Created by ROGK on 2017/7/18.
+ */
+@Transactional
+public interface TargetDevDao extends CrudRepository<DevTarget,Long>{
+
+    @Query("SELECT a FROM DevTarget a WHERE a.uploadedCaseId=:uploadCaseId")
+    DevTarget findByUploadedCaseId(@Param("uploadCaseId") long uploadCaseId);
+}

+ 0 - 10
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetExtendsDao.java

@@ -1,10 +0,0 @@
-package cn.iselab.mooctest.site.dao;
-
-import cn.iselab.mooctest.site.models.TargetExtends;
-import org.springframework.data.repository.CrudRepository;
-
-import java.util.List;
-
-public interface TargetExtendsDao extends CrudRepository<TargetExtends, Long> {
-    List<TargetExtends> findByTargetId(Long targetId);
-}

+ 15 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TargetWebDao.java

@@ -0,0 +1,15 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.WebTarget;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+/**
+ * Created by ROGK on 2017/9/4.
+ */
+@Transactional
+public interface TargetWebDao extends CrudRepository<WebTarget,Long>{
+
+    WebTarget findBySuperId(long superId);
+}

+ 6 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Paper2CaseDao.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Task2CaseDao.java

@@ -1,6 +1,6 @@
 package cn.iselab.mooctest.site.dao;
 
-import cn.iselab.mooctest.site.models.Paper2Case;
+import cn.iselab.mooctest.site.models.Task2Case;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -13,14 +13,14 @@ import java.util.List;
  * @date 2017-03-08.
  */
 @Transactional
-public interface Paper2CaseDao extends CrudRepository<Paper2Case, Long> {
+public interface Task2CaseDao extends CrudRepository<Task2Case, Long> {
 
-    Paper2Case findByTaskIdAndCaseId(long taskId, long caseId);
+    Task2Case findByTaskIdAndCaseId(long taskId, long caseId);
 
-    List<Paper2Case> findByTaskId(long taskId);
+    List<Task2Case> findByTaskId(long taskId);
 
-    @Query("SELECT MAX(t2c.caseIndex) FROM Paper2Case t2c WHERE t2c.taskId = :taskId")
+    @Query("SELECT MAX(t2c.caseIndex) FROM Task2Case t2c WHERE t2c.taskId = :taskId")
     Integer findMaxCaseIndexByTaskId(@Param("taskId") long taskId);
 
-    List<Paper2Case> findByCaseId(long caseId);
+    List<Task2Case> findByCaseId(long caseId);
 }

+ 58 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/TaskDao.java

@@ -0,0 +1,58 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Task;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * Created by Liu on 2016/12/27.
+ */
+@Transactional
+public interface TaskDao extends CrudRepository<Task, Long> {
+
+    List<Task> findByManagerId(long managerId);
+
+    @Query("SELECT t " +
+            "FROM Task t " +
+            "WHERE t.id IN( " +
+            " SELECT at.taskId " +
+            " FROM AssignedTask at " +
+            " WHERE at.workerId=:workerId)")
+    List<Task> findByWorkerId(@Param("workerId") long workerId);
+
+    @Query("SELECT t FROM Task t, Task2Group t2g " +
+            "WHERE t2g.groupId = :groupId " +
+            "AND t.id = t2g.taskId")
+    List<Task> findTaskListByGroupId(@Param("groupId") long groupId);
+
+    @Query("SELECT t FROM Task t, Task2Group t2g " +
+            "WHERE t2g.groupId = :groupId " +
+            "AND t.id = t2g.taskId")
+    List<Task> findTaskListInGroup(@Param("groupId") long groupId);
+
+    @Modifying
+    @Query(value = "INSERT INTO AssignedTask" +
+            "(taskId, workerId, managerId, content, name, result, score) " +
+            "VALUES " +
+            "(:taskId, :workerId, :managerId, :content, :name, :result, :score)", nativeQuery = true)
+    void addAssignedTask(@Param("taskId") long taskId, @Param("workerId") long workerId, @Param("managerId") long managerId,
+                         @Param("content") String content, @Param("name") String name, @Param("result") String result,
+                         @Param("score") double score);
+
+    @Query("SELECT COUNT(t) FROM Task t WHERE t.beginTime > NOW()")
+    int getUpComingTaskCount();
+
+    @Query("SELECT COUNT(t) FROM Task t WHERE t.beginTime < NOW() AND t.endTime >NOW()")
+    int getOnGoingTaskCount();
+
+    @Query("SELECT COUNT(t) FROM Task t WHERE t.endTime < NOW()")
+    int getFinishedTaskCount();
+
+    int countByManagerId(long managerId);
+
+}

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Worker2ContestDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Worker2Contest;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.*;
+
+/**
+ * Created by lishuying on 17/3/30.
+ */
+@Transactional
+public interface Worker2ContestDao extends CrudRepository<Worker2Contest, Long> {
+
+    List<Worker2Contest> findByWorkerId(long workerId);
+
+
+}

+ 61 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/WorkerDao.java

@@ -0,0 +1,61 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.Worker;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * Created by sean on 16/12/22.
+ */
+public interface WorkerDao extends PagingAndSortingRepository<Worker, Long> {
+
+    Worker findByEmail(String email);
+
+    Worker findByMobile(String mobile);
+
+    List<Worker> findByName(@Param("name") String name);
+
+    @Query("SELECT w FROM Worker w WHERE w.email = :account OR w.mobile = :account")
+    Worker findByAccount(@Param("account") String account);
+
+    @Query("SELECT w FROM Worker w WHERE w.email = :email OR w.mobile = :mobile")
+    Worker findByAccount(@Param("email") String email, @Param("mobile") String mobile);
+
+    /**
+     * get workerList of certain group order by workerId desc
+     *
+     * @param groupId
+     * @return
+     */
+    @Query("SELECT w " +
+            "FROM Worker w " +
+            "WHERE w.id in " +
+            "(SELECT g2w.workerId " +
+            "FROM Group2Worker g2w " +
+            "WHERE g2w.groupId=:groupId )" +
+            "ORDER BY w.id DESC")
+    List<Worker> getWorkerListSortByDesc(long groupId);
+
+    @Query("SELECT w FROM Worker w, Group2Worker g2w " +
+            "WHERE g2w.groupId = :groupId " +
+            "AND w.id = g2w.workerId ")
+    List<Worker> getWorkerList(@Param("groupId") long groupId);
+
+    @Modifying
+    @Transactional
+    @Query(value = "INSERT INTO group_2_worker (worker_id, group_id) VALUES(:workerId, :groupId)", nativeQuery = true)
+    void joinGroup(@Param("workerId") long workerId, @Param("groupId") long groupId);
+
+    @Transactional
+    @Query(value = "SELECT * " +
+            "FROM worker w " +
+            "WHERE w.id in " +
+            "(SELECT distinct w2c.worker_id " +
+            "FROM worker_2_contest w2c)", nativeQuery = true)
+    List<Worker> getContestWorkerList();
+}

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/custom/GenericUserDao.java

@@ -0,0 +1,10 @@
+package cn.iselab.mooctest.site.dao.custom;
+
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by Liu on 2016/12/27.
+ */
+@Repository
+public class GenericUserDao {
+}

+ 82 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/custom/UserDao.java

@@ -0,0 +1,82 @@
+package cn.iselab.mooctest.site.dao.custom;
+
+import cn.iselab.mooctest.site.common.enums.UserType;
+import cn.iselab.mooctest.site.dao.AdminDao;
+import cn.iselab.mooctest.site.dao.ManagerDao;
+import cn.iselab.mooctest.site.dao.WorkerDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by Liu on 2016/12/27.
+ */
+@Repository
+public class UserDao {
+
+    @Autowired
+    private ManagerDao managerDao;
+    @Autowired
+    private WorkerDao workerDao;
+    @Autowired
+    private AdminDao adminDao;
+
+    public Object searchByEmail(String email, UserType type){
+        switch(type){
+            case ALL:
+                return searchByEmail(email);
+            case MANAGER:
+                return managerDao.findByEmail(email);
+            case WORKER:
+                return workerDao.findByEmail(email);
+            case ADMIN:
+                return adminDao.findByEmail(email);
+            default:
+                return null;
+        }
+    }
+
+    public Object searchByEmail(String email){
+        // The search sequence is manager -> worker -> admin
+        Object user = managerDao.findByEmail(email);
+        if (user != null){
+            return user;
+        }
+        user = workerDao.findByEmail(email);
+        if (user != null){
+            return user;
+        }
+
+        return adminDao.findByEmail(email);
+    }
+
+    public Object searchByMobile(String mobile, UserType type){
+        switch(type){
+            case ALL:
+                return searchByMobile(mobile);
+            case MANAGER:
+                return managerDao.findByMobile(mobile);
+            case WORKER:
+                return workerDao.findByMobile(mobile);
+            case ADMIN:
+                return adminDao.findByMobile(mobile);
+            default:
+                return null;
+        }
+    }
+
+    public Object searchByMobile(String mobile){
+        Object user = managerDao.findByMobile(mobile);
+        if (user != null){
+            return user;
+        }
+        user = workerDao.findByMobile(mobile);
+        if (user != null){
+            return user;
+        }
+
+        return adminDao.findByMobile(mobile);
+    }
+
+
+
+}

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/AppStatisDao.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.site.dao.fromKibug;
+
+
+import cn.iselab.mooctest.site.models.fromKibug.AppStatis;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+@Transactional
+public interface AppStatisDao  extends CrudRepository<AppStatis, Long> {
+}

+ 22 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/ApplicationDao.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.site.dao.fromKibug;
+
+import cn.iselab.mooctest.site.models.fromKibug.Application;
+import cn.iselab.mooctest.site.models.fromKibug.ManagerScore;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+
+@Transactional
+public interface ApplicationDao extends PagingAndSortingRepository<Application, Long>,JpaSpecificationExecutor<Application>,CrudRepository<Application, Long> {
+
+    @Query("SELECT application FROM Application application WHERE application.uploadedCaseId= :uploaderCaseId")
+    Application getApplicationByUploadedCaseId(@Param("uploaderCaseId") long uploaderCaseId);
+
+   List<Application> getAppsByUploadedCaseId(long uploaderCaseId);
+}

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/BugDao.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.dao.fromKibug;
 
+import cn.iselab.mooctest.site.models.fromKibug.Application;
 import cn.iselab.mooctest.site.models.fromKibug.Bug;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.repository.PagingAndSortingRepository;

+ 22 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/fromKibug/MobileClientDao.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.site.dao.fromKibug;
+
+import cn.iselab.mooctest.site.models.Case;
+import cn.iselab.mooctest.site.models.fromKibug.IncrementId;
+import cn.iselab.mooctest.site.models.fromKibug.MobileClient;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * Created by NJUta on 2017/6/1.
+ */
+@Transactional
+public interface MobileClientDao  extends CrudRepository<MobileClient, Long> {
+    @Query("SELECT m FROM MobileClient m WHERE m.platform = :platform order by version desc")
+    Page<MobileClient> getLastestMobileClient(@Param("platform") short platform, Pageable page);
+}

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/instancePermission/AppPermissionDao.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.site.dao.instancePermission;
+
+import cn.iselab.mooctest.site.models.instancePermission.AppPermission;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2017-07-12.
+ */
+@Transactional
+public interface AppPermissionDao extends CrudRepository<AppPermission, Long> {
+
+    List<AppPermission> findByUserId(Long userId);
+
+    List<AppPermission> findByUserIdAndInstanceId(Long userId, Long instanceId);
+
+    List<AppPermission> findByInstanceId(Long instanceId);
+}

+ 0 - 21
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/instancePermission/TargetPermissionDao.java

@@ -1,21 +0,0 @@
-package cn.iselab.mooctest.site.dao.instancePermission;
-
-import cn.iselab.mooctest.site.models.instancePermission.TargetPermission;
-import org.springframework.data.repository.CrudRepository;
-
-import javax.transaction.Transactional;
-import java.util.List;
-
-/**
- * @author sean
- * @date 2017-07-12.
- */
-@Transactional
-public interface TargetPermissionDao extends CrudRepository<TargetPermission, Long> {
-
-    List<TargetPermission> findByUserId(Long userId);
-
-    List<TargetPermission> findByUserIdAndInstanceId(Long userId, Long instanceId);
-
-    List<TargetPermission> findByInstanceId(Long instanceId);
-}

+ 56 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/AuthResult.java

@@ -0,0 +1,56 @@
+package cn.iselab.mooctest.site.data;
+
+import cn.iselab.mooctest.site.web.cookie.persistent.PersistentCookie;
+import cn.iselab.mooctest.site.web.cookie.session.SessionCookie;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author sean
+ * @date 2017-03-19.
+ */
+public class AuthResult {
+
+    private boolean success = false;
+
+    private List<String> cookiesToRemove = new ArrayList<>();
+
+    private Map<String, PersistentCookie> persistentCookiesToAdd = new HashMap<>();
+
+    private Map<String, SessionCookie> sessionCookiesToAdd = new HashMap<>();
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public List<String> getCookiesToRemove() {
+        return cookiesToRemove;
+    }
+
+    public void setCookiesToRemove(List<String> cookiesToRemove) {
+        this.cookiesToRemove = cookiesToRemove;
+    }
+
+    public Map<String, PersistentCookie> getPersistentCookiesToAdd() {
+        return persistentCookiesToAdd;
+    }
+
+    public void setPersistentCookiesToAdd(Map<String, PersistentCookie> persistentCookiesToAdd) {
+        this.persistentCookiesToAdd = persistentCookiesToAdd;
+    }
+
+    public Map<String, SessionCookie> getSessionCookiesToAdd() {
+        return sessionCookiesToAdd;
+    }
+
+    public void setSessionCookiesToAdd(Map<String, SessionCookie> sessionCookiesToAdd) {
+        this.sessionCookiesToAdd = sessionCookiesToAdd;
+    }
+}

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/PageData.java

@@ -36,7 +36,7 @@ public class PageData<T> {
         this.setLast(activePage == this.getTotalPages());
     }
     public <S> PageData<S> map(Converter<? super T, ? extends S> converter) {
-        PageData pageData = cn.iselab.mooctest.site.util.data.Converter.convert(PageData.class, this);
+        PageData pageData = cn.iselab.mooctest.site.web.util.Converter.convert(PageData.class, this);
         pageData.setContent(this.getConvertedContent(converter));
         return pageData;
     }

+ 0 - 73
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/wechat/Token.java

@@ -1,73 +0,0 @@
-package cn.iselab.mooctest.site.data.wechat;
-
-import java.util.Date;
-
-/**
- * @Author ROKG
- * @Description
- * @Date: Created in 下午4:38 2018/4/2
- * @Modified By:
- */
-public class Token {
-
-    // 接口访问凭证
-    private String accessToken;
-    // 凭证有效期,单位:秒
-    private int expiresIn;
-    private Long createTime;
-
-    private String refresh_token;
-
-    private String openId;
-
-    public Token() {
-        createTime = System.currentTimeMillis();
-    }
-
-    public Long getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Long createTime) {
-        this.createTime = createTime;
-    }
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public int getExpiresIn() {
-        return expiresIn;
-    }
-
-    public void setExpiresIn(int expiresIn) {
-        this.expiresIn = expiresIn;
-    }
-
-    public boolean isValid() {
-        if ((System.currentTimeMillis() - createTime) < (expiresIn - 100) * 1000) {
-            return true;
-        }
-        return false;
-    }
-
-    public String getRefresh_token() {
-        return refresh_token;
-    }
-
-    public void setRefresh_token(String refresh_token) {
-        this.refresh_token = refresh_token;
-    }
-
-    public String getOpenId() {
-        return openId;
-    }
-
-    public void setOpenId(String openId) {
-        this.openId = openId;
-    }
-}

+ 67 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Admin.java

@@ -0,0 +1,67 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by sean on 16/12/19.
+ */
+@Entity
+@Table(name = "admin")
+public class Admin {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "email")
+    private String email;
+
+    @Column(name = "mobile")
+    private String mobile;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "password")
+    private String password;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}
+

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Target.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/App.java

@@ -7,8 +7,8 @@ import java.sql.Timestamp;
  * Created by sean on 17/2/25.
  */
 @Entity
-@Table(name = "target")
-public class Target {
+@Table(name = "app")
+public class App {
 
     public static final int UPLOADED = 0;
     public static final int APPROVED = 1;

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Target2User.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/App2User.java

@@ -7,8 +7,8 @@ import java.sql.Timestamp;
 
 @Data
 @Entity
-@Table(name = "target_user")
-public class Target2User {
+@Table(name = "app_user")
+public class App2User {
     public static final int UPLOADED = 0;
     public static final int APPROVED = 1;
     public static final int REJECTED = 2;

+ 196 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Case.java

@@ -0,0 +1,196 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * Created by sean on 16/12/19.
+ */
+
+@EqualsAndHashCode(exclude = "createTime")
+@Entity
+@Inheritance(strategy = InheritanceType.JOINED)
+@Table(name = "case_entity")
+public class Case {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "content")
+    private String content;
+
+    @Column(name = "domain")
+    private Integer domain;
+
+    @Column(name = "difficulty")
+    private Integer difficulty;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "url")
+    private String url;
+
+    @Column(name = "create_time")
+    private Timestamp createTime = new Timestamp(System.currentTimeMillis());
+
+    //case_id:子站中case可能存的是字符串
+    @Column(name = "case_id")
+    private String caseId;
+
+    @Column(name = "app_id")
+    private Long appId;
+
+    //是否有提示
+    @Column(name = "hint")
+    private Integer hint;
+
+    @Column(name = "is_public")
+    private Boolean visible = true;
+
+    @Column(name = "uploader_id")
+    private Long managerId;
+
+    @Column(name = "subject_id")
+    private Long subjectId;
+
+    @Column(name = "is_deleted")
+    private Boolean deleted = false;
+
+    @Column(name = "owner_id")
+    private Long ownerId;
+
+    public Long getOwnerId() {
+        return ownerId;
+    }
+
+    public void setOwnerId(Long ownerId) {
+        this.ownerId = ownerId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getDomain() {
+        return domain;
+    }
+
+    public void setDomain(Integer domain) {
+        this.domain = domain;
+    }
+
+    public Integer getDifficulty() {
+        return difficulty;
+    }
+
+    public void setDifficulty(Integer difficulty) {
+        this.difficulty = difficulty;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCaseId() {
+        return caseId;
+    }
+
+    public void setCaseId(String caseId) {
+        this.caseId = caseId;
+    }
+
+    public Integer getHint() {
+        return hint;
+    }
+
+    public void setHint(Integer hint) {
+        this.hint = hint;
+    }
+
+    public Boolean getVisible() {
+        return visible;
+    }
+
+    public void setVisible(Boolean visible) {
+        this.visible = visible;
+    }
+
+    public Long getManagerId() {
+        return managerId;
+    }
+
+    public void setManagerId(Long managerId) {
+        this.managerId = managerId;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Boolean getDeleted() {
+        return deleted;
+    }
+
+    public void setDeleted(Boolean deleted) {
+        this.deleted = deleted;
+    }
+
+    public void setAppId(Long appId){
+        this.appId=appId;
+    }
+
+    public Long getAppId(){
+        return this.appId;
+    }
+}
+

+ 10 - 63
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/CaseExtends.java

@@ -3,77 +3,24 @@ package cn.iselab.mooctest.site.models;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import javax.persistence.*;
-import java.sql.Timestamp;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
 
 /**
- * Created by sean on 16/12/19.
+ * Created by shanshan on 2017/6/28.
  */
-
-@EqualsAndHashCode(exclude = "createTime")
-@Entity
-@Inheritance(strategy = InheritanceType.JOINED)
-@Table(name = "case_entity")
+@EqualsAndHashCode(callSuper=true)
 @Data
-public class CaseExtends {
-    @Id
-    @GeneratedValue
-    private Long id;
-
-    @Column(name = "name")
-    private String name;
-
-    @Column(name = "content")
-    private String content;
-
-    @Column(name = "domain")
-    private Integer domain;
-
-    @Column(name = "difficulty")
-    private Integer difficulty;
-
-    @Column(name = "description")
-    private String description;
-
-    @Column(name = "url")
-    private String url;
-
-    @Column(name = "create_time")
-    private Timestamp createTime = new Timestamp(System.currentTimeMillis());
-
-    //case_id:子站中case可能存的是字符串
-    @Column(name = "case_id")
-    private String caseId;
-
-    @Column(name = "app_id")
-    private Long appId;
-
-    //是否有提示
-    @Column(name = "hint")
-    private Integer hint;
-
-    @Column(name = "is_public")
-    private Boolean visible = true;
-
-    @Column(name = "uploader_id")
-    private Long managerId;
-
-    @Column(name = "subject_id")
-    private Long subjectId;
-
-    @Column(name = "is_deleted")
-    private Boolean deleted = false;
-
-    @Column(name = "owner_id")
-    private Long ownerId;
-
+@Entity
+@Table(name = "case_extends")
+public class CaseExtends extends Case{
+    @Column(name = "target_id")
+    private Long targetId;
     @Column(name = "platform")
     private Short platform;
-
     @Column(name = "subsite_id")
     private Long answerWay;
-
     @Column(name = "properties")
     private String properties;
 }
-

+ 80 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Contest.java

@@ -0,0 +1,80 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by lishuying on 17/3/30.
+ */
+
+@Entity
+@Table(name = "contest")
+public class Contest {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "year")
+    private String year;
+
+    // 1为个人赛,2为团体赛
+    @Column(name = "type")
+    private Integer type;
+
+    @Column(name = "group_id")
+    private Long groupId;
+
+    @Column(name = "group_manager")
+    private String groupManager;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getYear() {
+        return year;
+    }
+
+    public void setYear(String year) {
+        this.year = year;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getGroupManager() {
+        return groupManager;
+    }
+
+    public void setGroupManager(String groupManager) {
+        this.groupManager = groupManager;
+    }
+}

+ 55 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/DevTarget.java

@@ -0,0 +1,55 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by ROGK on 2017/7/18.
+ */
+@Entity
+@Table(name = "target_dev")
+public class DevTarget {
+    @Id
+    @GeneratedValue
+    private long id;
+
+    @Column(name = "upload_case_id")
+    private Long uploadedCaseId;
+
+    @Column(name = "end_time_millis")
+    private Long endTimeMillis;
+
+    @Column(name = "language")
+    private String language;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public Long getUploadedCaseId() {
+        return uploadedCaseId;
+    }
+
+    public void setUploadedCaseId(long uploadedCaseId) {
+        this.uploadedCaseId = uploadedCaseId;
+    }
+
+    public Long getEndTimeMillis() {
+        return endTimeMillis;
+    }
+
+    public void setEndTimeMillis(long endTimeMillis) {
+        this.endTimeMillis = endTimeMillis;
+    }
+
+    public String getLanguage() {
+        return language;
+    }
+
+    public void setLanguage(String language) {
+        this.language = language;
+    }
+}

+ 68 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/EmailTask.java

@@ -0,0 +1,68 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by sean on 16/12/20.
+ */
+
+@Entity
+@Table(name = "email_task")
+public class EmailTask {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "receiver")
+    private String receiver;
+
+    @Column(name = "subject")
+    private String subject;
+
+    @Column(name = "content")
+    private String content;
+
+    @Column(name = "try_times")
+    private Integer tryTimes;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getReceiver() {
+        return receiver;
+    }
+
+    public void setReceiver(String receiver) {
+        this.receiver = receiver;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getTryTimes() {
+        return tryTimes;
+    }
+
+    public void setTryTimes(Integer tryTimes) {
+        this.tryTimes = tryTimes;
+    }
+}

+ 5 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Group.java

@@ -36,7 +36,7 @@ public class Group {
     @ManyToMany
     @JoinTable(name = "task_2_group", joinColumns = @JoinColumn(name = "group_id"),
             inverseJoinColumns = @JoinColumn(name = "task_id"))
-    private Set<Exam> examSet;
+    private Set<Task> taskSet;
 
     public Long getOwnerId() {
         return ownerId;
@@ -86,12 +86,12 @@ public class Group {
         this.managerId = managerId;
     }
 
-    public Set<Exam> getExamSet() {
-        return examSet;
+    public Set<Task> getTaskSet() {
+        return taskSet;
     }
 
-    public void setExamSet(Set<Exam> examSet) {
-        this.examSet = examSet;
+    public void setTaskSet(Set<Task> taskSet) {
+        this.taskSet = taskSet;
     }
 
     public void setIsActive(Boolean isActive){

+ 179 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Manager.java

@@ -0,0 +1,179 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+import java.sql.Time;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "manager")
+public class Manager {
+
+    public static final int STATUS_REJECTED = -1;
+    public static final int STATUS_APPROVED = 1;
+    public static final int STATUS_UNDER_REVIEW = 0;
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "email")
+    private String email;
+
+    @Column(name = "mobile")
+    private String mobile;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "password")
+    private String password;
+
+    @Column(name = "information")
+    private String information;
+
+    @Column(name = "openid")
+    private String openid;
+
+    @Column(name = "status")
+    private Integer status;
+
+    @Column(name = "level")
+    private Integer level;
+
+    @Column(name = "avatar")
+    private String avatar;
+
+    @Column(name = "expire_time")
+    private Timestamp expireTime;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+
+    @Column(name = "group_num")
+    private Integer groupNum;
+
+    @Column(name = "group_size")
+    private Integer groupSize;
+
+    @Column(name = "task_num")
+    private Integer taskNum;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getInformation() {
+        return information;
+    }
+
+    public void setInformation(String information) {
+        this.information = information;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Timestamp getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Timestamp expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Integer getGroupNum() {
+        return groupNum;
+    }
+
+    public void setGroupNum(Integer groupNum) {
+        this.groupNum = groupNum;
+    }
+
+    public Integer getGroupSize() {
+        return groupSize;
+    }
+
+    public void setGroupSize(Integer groupSize) {
+        this.groupSize = groupSize;
+    }
+
+    public Integer getTaskNum() {
+        return taskNum;
+    }
+
+    public void setTaskNum(Integer taskNum) {
+        this.taskNum = taskNum;
+    }
+
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+}

+ 78 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ManagerSubsiteFeature.java

@@ -0,0 +1,78 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * Created by sean on 17/2/25.
+ */
+@Entity
+@Table(name = "manager_2_subsite_feature")
+public class ManagerSubsiteFeature {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "expire_time")
+    private Timestamp expireTime;
+
+    @Column(name = "feature_id")
+    private Long featureId;
+
+    @Column(name = "manager_id")
+    private Long managerId;
+
+    @Column(name = "subsite_id")
+    private Long subsiteId;
+
+    @Column(name = "owner_id")
+    private Long ownerId;
+
+    public Long getOwnerId() {
+        return ownerId;
+    }
+
+    public void setOwnerId(Long ownerId) {
+        this.ownerId = ownerId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Timestamp getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Timestamp expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Long getFeatureId() {
+        return featureId;
+    }
+
+    public void setFeatureId(Long featureId) {
+        this.featureId = featureId;
+    }
+
+    public Long getManagerId() {
+        return managerId;
+    }
+
+    public void setManagerId(Long managerId) {
+        this.managerId = managerId;
+    }
+
+    public Long getSubsiteId() {
+        return subsiteId;
+    }
+
+    public void setSubsiteId(Long subsiteId) {
+        this.subsiteId = subsiteId;
+    }
+}

+ 34 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/SubsiteFeature.java

@@ -0,0 +1,34 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by sean on 17/2/25.
+ */
+@Entity
+@Table(name = "subsite_feature")
+public class SubsiteFeature {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "name")
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 0 - 25
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/TargetExtends.java

@@ -1,25 +0,0 @@
-package cn.iselab.mooctest.site.models;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import javax.persistence.*;
-
-@Data
-@Entity
-@Table(name = "target_extends")
-public class TargetExtends{
-
-    @Id
-    @GeneratedValue
-    private Long id;
-
-    @Column(name = "target_id")
-    private Long targetId;
-
-    @Column(name = "property_name")
-    private String propertyName;
-
-    @Column(name = "property_value")
-    private String  propertyValue;
-}

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Exam.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Task.java

@@ -11,8 +11,8 @@ import java.util.Set;
  */
 @Entity
 @EqualsAndHashCode(of={"id"})
-@Table(name = "exam")
-public class Exam {
+@Table(name = "task")
+public class Task {
 
     public static final Integer STATUS_UPCOMING = 0;
     public static final Integer STATUS_ONGOING = 1;

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Paper2Case.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Task2Case.java

@@ -7,8 +7,8 @@ import javax.persistence.*;
  */
 
 @Entity
-@Table(name = "paper_2_case")
-public class Paper2Case {
+@Table(name = "task_2_case")
+public class Task2Case {
 
     @Id
     @GeneratedValue

+ 56 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/WebTarget.java

@@ -0,0 +1,56 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by ROGK on 2017/9/4.
+ */
+@Entity
+@Table(name = "target_web")
+public class WebTarget {
+
+    @Id
+    @GeneratedValue
+    private long id;
+
+    @Column(name = "super_id")
+    private Long superId;
+
+    @Column(name = "end_time_millis")
+    private Long endTimeMillis;
+
+    @Column(name = "category")
+    private String category;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public Long getSuperId() {
+        return superId;
+    }
+
+    public void setSuperId(long superId) {
+        this.superId = superId;
+    }
+
+    public Long getEndTimeMillis() {
+        return endTimeMillis;
+    }
+
+    public void setEndTimeMillis(long endTimeMillis) {
+        this.endTimeMillis = endTimeMillis;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+}

+ 167 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Worker.java

@@ -0,0 +1,167 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * Created by sean on 16/12/19.
+ */
+@Entity
+@Table(name = "worker")
+public class Worker {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "email")
+    private String email;
+
+    @Column(name = "mobile")
+    private String mobile;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "password")
+    private String password;
+
+    @Column(name = "openid")
+    private String openid;
+
+    @Column(name = "level")
+    private Integer level;
+
+    @Column(name = "avatar")
+    private String avatar;
+
+    @Column(name = "information")
+    private String information;
+
+    @Column(name = "teacher_name")
+    private String teacherName;
+
+    @Column(name = "teacher_email")
+    private String teacherEmail;
+
+    @Column(name = "school_year")
+    private Integer schoolYear;
+
+    @Column(name = "location")
+    private String location;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getInformation() {
+        return information;
+    }
+
+    public void setInformation(String information) {
+        this.information = information;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherEmail() {
+        return teacherEmail;
+    }
+
+    public void setTeacherEmail(String teacherEmail) {
+        this.teacherEmail = teacherEmail;
+    }
+
+    public Integer getSchoolYear() {
+        return schoolYear;
+    }
+
+    public void setSchoolYear(Integer schoolYear) {
+        this.schoolYear = schoolYear;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+}

+ 46 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Worker2Contest.java

@@ -0,0 +1,46 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.*;
+
+/**
+ * Created by lishuying on 17/3/30.
+ */
+
+@Entity
+@Table(name = "worker_2_contest")
+public class Worker2Contest {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "worker_id")
+    private Long workerId;
+
+    @Column(name = "contest_id")
+    private Long contestId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkerId() {
+        return workerId;
+    }
+
+    public void setWorkerId(Long workerId) {
+        this.workerId = workerId;
+    }
+
+    public Long getContestId() {
+        return contestId;
+    }
+
+    public void setContestId(Long contestId) {
+        this.contestId = contestId;
+    }
+}

+ 59 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromDev/BaseData.java

@@ -0,0 +1,59 @@
+package cn.iselab.mooctest.site.models.fromDev;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author AlanDelip
+ */
+public class BaseData {
+
+    @Override
+    public String toString() {
+
+        Class clazz = getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        String fieldFormat = "%s=%s, ";
+        String format = "%s[%s]";
+
+        Method[] methods = clazz.getMethods();
+        Map<String, Method> methodMap = new HashMap<>();
+        for (Method method : methods) {
+            if (method.getName().startsWith("get") && Modifier.isPublic(method.getModifiers())) {
+                methodMap.put(method.getName().toLowerCase(), method);
+            }
+        }
+
+        StringBuilder fieldsSB = new StringBuilder();
+        for (Field field : fields) {
+            String fieldName = field.getName();
+            String fieldValueStr = null;
+            try {
+                Method m = methodMap.get("get" + fieldName.toLowerCase());
+                if (m == null) {
+                    continue;
+                }
+                fieldValueStr = String.valueOf(m.invoke(this));
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                fieldValueStr = null;
+                e.printStackTrace();
+            }
+            fieldsSB.append(String.format(fieldFormat, fieldName, fieldValueStr));
+        }
+
+        String fieldsStr = fieldsSB.toString();
+        if (fieldsStr.lastIndexOf(", ") != -1) {
+            fieldsStr = fieldsStr.substring(0, fieldsStr.lastIndexOf(", "));
+        }
+
+        return String.format(format, clazz.getSimpleName(), fieldsStr);
+
+    }
+
+}
+

+ 20 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/AppStatis.java

@@ -0,0 +1,20 @@
+package cn.iselab.mooctest.site.models.fromKibug;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Data
+@Entity
+@Table(name = "application_statis")
+public class AppStatis {
+    @Id
+    private long id;
+    @Column(name = "device_model_statis")
+    private String deviceModelStatis;
+    @Column(name = "device_os_statis")
+    private String deviceOsStatis;
+}

+ 167 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/Application.java

@@ -0,0 +1,167 @@
+package cn.iselab.mooctest.site.models.fromKibug;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import javax.persistence.*;
+
+/**
+ * Created by NJUta on 2017/5/26.
+ */
+@JsonIgnoreProperties({"managerId", "createTimeMillis", "extra", "from"})
+@Entity
+@Table(name = "application")
+public class Application {
+    @Id
+    private long id;
+    @Column(name = "manager_id")
+    private long managerId;
+    /**
+     * 与慕测上传的原始需求相对应的外键
+     */
+    @Column(name = "uploaded_case_id")
+    private long uploadedCaseId;
+    @Column(name = "name")
+    private String name;
+    @Column(name = "platform")
+    private short platform;
+    @Column(name = "category")
+    private String category;
+    @Column(name = "icon_location")
+    private String iconLocation;
+    @Column(name = "app_location")
+    private String appLocation;
+    @Column(name = "require_location")
+    private String requireLocation;
+    @Column(name = "launch_data")
+    private String launchData;
+    @Column(name = "create_time_millis")
+    private long createTimeMillis;
+    @Column(name = "end_time_millis")
+    private long endTimeMillis;
+    @Column(name = "test_type")
+    private short testType;
+    @Column(name = "status")
+    private short status;
+    @Column(name = "from_cloud")
+    private int fromCloud;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getManagerId() {
+        return managerId;
+    }
+
+    public void setManagerId(long managerId) {
+        this.managerId = managerId;
+    }
+
+    public long getUploadedCaseId() {
+        return uploadedCaseId;
+    }
+
+    public void setUploadedCaseId(long uploadedCaseId) {
+        this.uploadedCaseId = uploadedCaseId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public short getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(short platform) {
+        this.platform = platform;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public String getIconLocation() {
+        return iconLocation;
+    }
+
+    public void setIconLocation(String iconLocation) {
+        this.iconLocation = iconLocation;
+    }
+
+    public String getAppLocation() {
+        return appLocation;
+    }
+
+    public void setAppLocation(String appLocation) {
+        this.appLocation = appLocation;
+    }
+
+    public String getRequireLocation() {
+        return requireLocation;
+    }
+
+    public void setRequireLocation(String requireLocation) {
+        this.requireLocation = requireLocation;
+    }
+
+    public String getLaunchData() {
+        return launchData;
+    }
+
+    public void setLaunchData(String launchData) {
+        this.launchData = launchData;
+    }
+
+    public long getCreateTimeMillis() {
+        return createTimeMillis;
+    }
+
+    public void setCreateTimeMillis(long createTimeMillis) {
+        this.createTimeMillis = createTimeMillis;
+    }
+
+    public long getEndTimeMillis() {
+        return endTimeMillis;
+    }
+
+    public void setEndTimeMillis(long endTimeMillis) {
+        this.endTimeMillis = endTimeMillis;
+    }
+
+    public short getTestType() {
+        return testType;
+    }
+
+    public void setTestType(short testType) {
+        this.testType = testType;
+    }
+
+    public short getStatus() {
+        return status;
+    }
+
+    public void setStatus(short status) {
+        this.status = status;
+    }
+
+    public int getFromCloud() {
+        return fromCloud;
+    }
+
+    public void setFromCloud(int fromCloud) {
+        this.fromCloud = fromCloud;
+    }
+}

+ 12 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/CaseItem.java

@@ -0,0 +1,12 @@
+package cn.iselab.mooctest.site.models.fromKibug;
+
+import lombok.Data;
+
+/**
+ * Created by jessiechen on 2016/10/13.
+ */
+@Data
+public class CaseItem {
+    private long id;
+    private boolean taken;
+}

+ 62 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/MobileClient.java

@@ -0,0 +1,62 @@
+package cn.iselab.mooctest.site.models.fromKibug;
+
+import javax.persistence.*;
+
+/**
+ * Created by NJUta on 2017/5/26.
+ */
+@Entity
+@Table(name = "mobile_client")
+public class MobileClient {
+    @Id
+    @GeneratedValue
+    private int id;
+    @Column(name = "platform")
+    private short platform;
+    @Column(name = "url")
+    private String url;
+    @Column(name = "version")
+    private float version;
+    @Column(name = "description")
+    private String description;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public short getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(short platform) {
+        this.platform = platform;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public float getVersion() {
+        return version;
+    }
+
+    public void setVersion(float version) {
+        this.version = version;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/fromKibug/TaskFromKibug.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.site.models.fromKibug;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by NJUta on 2017/6/1.
+ */
+@Data
+public class TaskFromKibug {
+    private long id;
+    private String name;
+    private String information;
+    private int duration;
+    private String managerName;
+    private long managerId;
+    private String beginTime;
+    private String endTime;
+    private String subsite;
+    private List<String> groups;
+    private List<CaseItem> caseList;
+}

+ 6 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/instancePermission/TargetPermission.java → mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/instancePermission/AppPermission.java

@@ -10,8 +10,8 @@ import java.sql.Timestamp;
  * @date 2017-07-12.
  */
 @Entity
-@Table(name = "target_permission")
-public class TargetPermission implements Permission {
+@Table(name = "app_permission")
+public class AppPermission implements Permission {
     @Id
     @GeneratedValue
     private Long id;
@@ -73,10 +73,10 @@ public class TargetPermission implements Permission {
         return String.join(":", userId.toString(), "app", operation, instanceId.toString());
     }
 
-    public TargetPermission() {
+    public AppPermission() {
     }
 
-    public TargetPermission(String permissionString) {
+    public AppPermission(String permissionString) {
         this.setParts(permissionString);
     }
 
@@ -89,9 +89,9 @@ public class TargetPermission implements Permission {
 
     @Override
     public boolean implies(Permission p) {
-        if (!(p instanceof TargetPermission)) return false;
+        if (!(p instanceof AppPermission)) return false;
 
-        TargetPermission other = (TargetPermission) p;
+        AppPermission other = (AppPermission) p;
 
         boolean isImplies = true;
 

+ 49 - 46
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/Oauth2/impl/ExamServiceImpl2.java

@@ -4,7 +4,7 @@ import cn.iselab.mooctest.site.common.constant.Constants;
 import cn.iselab.mooctest.site.common.constant.OwningPartyConstants;
 import cn.iselab.mooctest.site.dao.Exam2CaseDao;
 import cn.iselab.mooctest.site.dao.OpenId2UserIdDao;
-import cn.iselab.mooctest.site.dao.Paper2CaseDao;
+import cn.iselab.mooctest.site.dao.Task2CaseDao;
 import cn.iselab.mooctest.site.dao.UserDao;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.rpc.oauth2.api.ExamService;
@@ -12,8 +12,8 @@ import cn.iselab.mooctest.site.rpc.oauth2.data.*;
 import cn.iselab.mooctest.site.service.AssignedTaskService;
 import cn.iselab.mooctest.site.service.ExamStatusService;
 import cn.iselab.mooctest.site.service.PaperService;
+import cn.iselab.mooctest.site.service.TaskService;
 import cn.iselab.mooctest.site.service.instancePermission.PaperPermissionService;
-import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.web.data.fromDev.PluginResultVO;
 import cn.iselab.mooctest.site.web.data.fromKibug.ReportScriptResultVO;
 import cn.iselab.mooctest.site.web.data.fromKibug.ReportVO;
@@ -21,6 +21,7 @@ import cn.iselab.mooctest.site.web.logic.ExamLogic;
 import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import cn.iselab.mooctest.site.web.logic.ReportLogic;
 import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
+import cn.iselab.mooctest.site.web.util.Converter;
 import com.alibaba.dubbo.config.annotation.Service;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.json.JSONArray;
@@ -35,7 +36,7 @@ import java.util.List;
 /**
  * Created by shanshan on 2017/8/14.
  */
-@Service(version = Constants.OAUTH2APIVERSION, timeout = 12000)
+@Service(version = Constants.OAUTH2APIVERSION, timeout = 12000 )
 @Component
 public class ExamServiceImpl2 implements ExamService {
     @Autowired
@@ -53,10 +54,12 @@ public class ExamServiceImpl2 implements ExamService {
     @Autowired
     private PaperService paperService;
     @Autowired
-    private Paper2CaseDao paper2CaseDao;
+    private Task2CaseDao task2CaseDao;
     @Autowired
     private Exam2CaseDao exam2CaseDao;
     @Autowired
+    private TaskService taskService;
+    @Autowired
     private ExamStatusService examStatusService;
     @Autowired
     private UserDao userDao;
@@ -67,7 +70,7 @@ public class ExamServiceImpl2 implements ExamService {
 
     @Override
     public TaskVO getCaseList(Long userId, Long taskId, Long subsiteId) throws Exception {
-        if (!examLogic.checkTaskViewPermission(userId, taskId)) {
+        if(!examLogic.checkTaskViewPermission(userId, taskId)){
             throw new UnauthorizedException("no permission for task");
         }
         PluginResultVO vo = pluginLogic.getCaseList(userId, taskId);
@@ -82,16 +85,16 @@ public class ExamServiceImpl2 implements ExamService {
 
     @Override
     public KibugCaseVO getKibugCase(Long userId, Long taskId, Long caseId) throws Exception {
-        if (!examLogic.checkTaskViewPermission(userId, taskId)) {
+        if(!examLogic.checkTaskViewPermission(userId, taskId)){
             throw new UnauthorizedException("no permission for task");
         }
-        cn.iselab.mooctest.site.web.data.fromKibug.KibugCaseVO kibugCaseVO = pluginLogic.getKibugCase(userId, taskId, caseId);
+        cn.iselab.mooctest.site.web.data.fromKibug.KibugCaseVO kibugCaseVO = pluginLogic.getKibugCase(userId,taskId,caseId);
         return Converter.convert(KibugCaseVO.class, kibugCaseVO);
     }
 
     @Override
     public Long createReport(ReportVO4Oauth vo) throws Exception {
-        if (!examLogic.checkTaskViewPermission(vo.getWorkerId(), vo.getTaskId())) {
+        if(!examLogic.checkTaskViewPermission(vo.getWorkerId(), vo.getTaskId())){
             throw new UnauthorizedException("no permission for task");
         }
         ReportVO reportVO = Converter.convert(ReportVO.class, vo);
@@ -100,10 +103,10 @@ public class ExamServiceImpl2 implements ExamService {
 
     @Override
     public void updateReport(ReportVO4Oauth vo) throws Exception {
-        if (vo.getId() == null) {
+        if(vo.getId()==null){
             throw new IllegalArgumentException("no reportId");
         }
-        if (!examLogic.checkTaskViewPermission(vo.getWorkerId(), vo.getTaskId())) {
+        if(!examLogic.checkTaskViewPermission(vo.getWorkerId(), vo.getTaskId())){
             throw new UnauthorizedException("no permission for task");
         }
         ReportVO reportVO = Converter.convert(ReportVO.class, vo);
@@ -121,55 +124,55 @@ public class ExamServiceImpl2 implements ExamService {
         long taskId = taskResultDTO.getTask_id();
 
         HashMap<Long, String> caseNameMap = taskResultDTO.getTask_case_list();
-        Exam exam = null;
+        Task task = null;
         long participantId;
         boolean needCreatePaper = true;
-        if (assignedTaskService.getAssignedTasks(taskId).size() > 0) {
+        if(assignedTaskService.getAssignedTasks(taskId).size() > 0) {
             needCreatePaper = false;
         }
-        for (ScoreDetails scoreDetails : taskResultDTO.getScoreDetails()) {
+        for(ScoreDetails scoreDetails: taskResultDTO.getScoreDetails()) {
             OpenId2UserId openId2UserId = openId2UserIdDao.findByOpenId(scoreDetails.getOpen_id());
             participantId = openId2UserId.getUserId();
             try {
-                exam = examService.getExamByIdAndParticipantIdIfPermited(taskId, openId2UserId.getUserId());
+                task = examService.getExamByIdAndParticipantIdIfPermited(taskId, openId2UserId.getUserId());
             } catch (UnauthorizedException exception) {
 
                 continue;
             }
-            this.saveAssignedTask(participantId, scoreDetails, exam, caseNameMap);
+            this.saveAssignedTask(participantId, scoreDetails, task, caseNameMap);
         }
-        if (exam != null && needCreatePaper) {
-            Paper paper = this.savePaperAndPaper2Case(exam.getName(), caseNameMap);
+        if(task != null && needCreatePaper) {
+            Paper paper = this.savePaperAndPaper2Case(task.getName(), caseNameMap);
             this.saveExam2PaperAndExam2Case(paper, taskId, caseNameMap);
             this.updateTaskStatus(taskId);
         }
 
         // insert data into assignedtask
-        // new paper for the exam (paper and paper2case)
+        // new paper for the task (paper and paper2case)
         // copy cases to exam (savetask2exam)
-        // update status of exam
+        // update status of task
         return true;
     }
 
-    private AssignedTask saveAssignedTask(long participantId, ScoreDetails scoreDetails, Exam exam, HashMap<Long, String> caseNameMap) {
-        AssignedTask assignedTask = assignedTaskService.getAssignedTask(exam.getId(), participantId);
-        if (assignedTask == null) {
+    private AssignedTask saveAssignedTask(long participantId, ScoreDetails scoreDetails, Task task, HashMap<Long, String> caseNameMap) {
+        AssignedTask assignedTask = assignedTaskService.getAssignedTask(task.getId(), participantId);
+        if(assignedTask == null) {
             assignedTask = new AssignedTask();
         }
         assignedTask.setWorkerId(participantId);
-        assignedTask.setName(exam.getName());
-        assignedTask.setTaskId(exam.getId());
-        assignedTask.setManagerId(exam.getManagerId());
+        assignedTask.setName(task.getName());
+        assignedTask.setTaskId(task.getId());
+        assignedTask.setManagerId(task.getManagerId());
         assignedTask.setContent("");
         assignedTask.setScore((scoreDetails.getScore()));
-        assignedTask.setOwnerId(exam.getOwnerId());
+        assignedTask.setOwnerId(task.getOwnerId());
         assignedTask.setParticipantId(participantId);
 
         JSONObject assignedResults = new JSONObject();
         JSONObject assignedResultObj = new JSONObject();
 
-        for (CaseDetailDTO caseDetailDTO : scoreDetails.getDetail()) {
-            JSONObject caseDetail = new JSONObject();
+        for(CaseDetailDTO caseDetailDTO: scoreDetails.getDetail()) {
+            JSONObject caseDetail =  new JSONObject();
             caseDetail.put("id", caseDetailDTO.getCase_id());
             caseDetail.put("maxScore", caseDetailDTO.getScore());
             JSONArray scores = new JSONArray();
@@ -181,37 +184,37 @@ public class ExamServiceImpl2 implements ExamService {
         }
         assignedResultObj.put("results", assignedResults);
         assignedTask.setResult(assignedResultObj.toString());
-        return assignedTaskService.saveOrUpdateAssignedTask(assignedTask);
+        return  assignedTaskService.saveOrUpdateAssignedTask(assignedTask);
     }
 
     private Paper savePaperAndPaper2Case(String paperName, HashMap<Long, String> caseNameMap) {
         Paper paper = new Paper();
-        paper.setName(paperName + "试卷");
+        paper.setName(paperName+"试卷");
         User thirdUser = userDao.findByEmail(OwningPartyConstants.THIRDEMAIL);
-        if (thirdUser != null) {
+        if(thirdUser != null) {
             paper.setOwnerId(new Long(thirdUser.getId()));
-        } else {
+        }else {
             paper.setOwnerId(-1L);
         }
         paper = paperService.createOrUpdate(paper);
         paperPermissionService.publishPaper(paper.getId());
 
-        for (Long id : caseNameMap.keySet()) {
-            Paper2Case paper2Case = new Paper2Case();
-            paper2Case.setTaskId(paper.getId());
-            paper2Case.setAutoSelect(true);
-            paper2Case.setCaseId(id);
-            paper2Case.setCaseIndex(0);
-            paper2Case.setCount(1);
-            paper2Case.setWeight(0.0);
-            paper2CaseDao.save(paper2Case);
+        for(Long id: caseNameMap.keySet()) {
+            Task2Case task2Case = new Task2Case();
+            task2Case.setTaskId(paper.getId());
+            task2Case.setAutoSelect(true);
+            task2Case.setCaseId(id);
+            task2Case.setCaseIndex(0);
+            task2Case.setCount(1);
+            task2Case.setWeight(0.0);
+            task2CaseDao.save(task2Case);
         }
         return paper;
     }
 
     private void saveExam2PaperAndExam2Case(Paper paper, long taskId, HashMap<Long, String> nameCaseMap) {
         examService.saveExam2Paper(taskId, paper.getId());
-        for (Long id : nameCaseMap.keySet()) {
+        for(Long id: nameCaseMap.keySet()) {
             Exam2Case exam2Case = new Exam2Case();
             exam2Case.setCaseId(id);
             exam2Case.setExamId(taskId);
@@ -222,12 +225,12 @@ public class ExamServiceImpl2 implements ExamService {
     }
 
     public void updateTaskStatus(long taskId) {
-        Exam exam = examService.getTask(taskId);
-        examStatusService.updateStatus(exam);
+        Task task = taskService.getTask(taskId);
+        examStatusService.updateStatus(task);
         return;
     }
 
-    public String getSumbitSignature(String path, Long examId, Long caseId, Long workerId, String fileName) {
-        return ossLogic.getSubmitSiganature(path, examId, caseId, workerId, fileName);
+    public String getSumbitSignature(String path,Long examId,Long caseId,Long workerId,String fileName){
+        return ossLogic.getSubmitSiganature(path,examId,caseId,workerId,fileName);
     }
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/RpcHandler.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.site.rpc;
+
+import cn.iselab.mooctest.site.thrift.MooctestSiteThrift;
+import org.apache.thrift.TException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author liuzicong
+ */
+@Service
+public class RpcHandler implements MooctestSiteThrift.Iface {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RpcHandler.class);
+
+    @Override
+    public String sayHi(String name) throws TException {
+        return "Hello, " + name;
+    }
+}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.