郭超 3 лет назад
Сommit
c7059a094b
100 измененных файлов с 5330 добавлено и 0 удалено
  1. 0 0
      .attach_pid31316
  2. 0 0
      .attach_pid31433
  3. 0 0
      .attach_pid31510
  4. 0 0
      .attach_pid3178
  5. 0 0
      .attach_pid31976
  6. 16 0
      .gitignore
  7. 28 0
      mooctest-user-client/pom.xml
  8. 27 0
      mooctest-user-common/pom.xml
  9. 15 0
      mooctest-user-job/pom.xml
  10. 127 0
      mooctest-user-job/src/main/java/cn/iselab/mooctest/user/Application.java
  11. 6 0
      mooctest-user-server/Dockerfile
  12. 321 0
      mooctest-user-server/pom.xml
  13. 120 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/Application.java
  14. 32 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/CorsConfig.java
  15. 25 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/CustomSessionDefaultRedisSerializer.java
  16. 32 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/ErrorPageConfig.java
  17. 61 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/IntegralMap.java
  18. 33 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/MailConfiguration.java
  19. 65 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/MailProperties.java
  20. 49 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/RedisSessionConfiguration.java
  21. 62 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/ThirdPartyAuthConfiguration.java
  22. 53 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/WechatConfiguration.java
  23. 82 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/Converter.java
  24. 14 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/DeleteStatus.java
  25. 11 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/ResponseStatus.java
  26. 42 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/UrlConstants.java
  27. 13 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/VerifyConstants.java
  28. 15 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/WechatUserConstants.java
  29. 69 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/ResponseResult.java
  30. 71 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/Token.java
  31. 35 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/UserInfo.java
  32. 18 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/BankAccountInfoDao.java
  33. 20 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/ConfigurationDao.java
  34. 20 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/IntegralMapper.java
  35. 31 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/MedalMapper.java
  36. 17 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/OperationRecordDao.java
  37. 23 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/User2IntegralDao.java
  38. 23 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/User2MedalDao.java
  39. 34 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserIntegralMapper.java
  40. 76 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserMapper.java
  41. 22 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserThirdPartyDao.java
  42. 31 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserWechatMapper.java
  43. 18 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/VerifyCodeDao.java
  44. 41 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/BankAccountInfo.java
  45. 27 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Configuration.java
  46. 23 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Integral.java
  47. 30 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Medal.java
  48. 36 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/OperationRecord.java
  49. 138 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User.java
  50. 37 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User2Integral.java
  51. 33 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User2Medal.java
  52. 26 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserIntegral.java
  53. 33 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserThirdParty.java
  54. 23 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserWechat.java
  55. 38 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/VerifyCode.java
  56. 83 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/IntegralRPC.java
  57. 97 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/MedalRPC.java
  58. 92 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/UserRPC.java
  59. 31 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/WechatRPC.java
  60. 13 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/BankAccountInfoService.java
  61. 18 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/ConfigurationService.java
  62. 36 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/IntegralService.java
  63. 21 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MailService.java
  64. 29 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MedalService.java
  65. 29 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/ThirdPartyAuthService.java
  66. 37 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/UserService.java
  67. 18 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/VerifyCodeService.java
  68. 22 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/WechatService.java
  69. 29 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/BankAccountInfoServiceImpl.java
  70. 40 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/ConfigurationServiceImpl.java
  71. 139 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/IntegralServiceImpl.java
  72. 133 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MailServiceImpl.java
  73. 73 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MedalServiceImpl.java
  74. 81 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/ThirdPartyAuthServiceImpl.java
  75. 105 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/UserServiceImpl.java
  76. 39 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/VerifyCodeServiceImpl.java
  77. 45 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/WechatServiceImpl.java
  78. 147 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/EncryptionUtil.java
  79. 129 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/HttpClientUtils.java
  80. 116 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/MSUtil.java
  81. 213 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/OSSUtil.java
  82. 69 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/WechatUtil.java
  83. 16 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/BaseController.java
  84. 76 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/IntegralController.java
  85. 329 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/PageController.java
  86. 158 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/TestController.java
  87. 207 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/UserController.java
  88. 22 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/BankAccountInfoVO.java
  89. 37 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/OperationRecordVO.java
  90. 32 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/UserVO.java
  91. 41 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/wrapper/BankAccountInfoVOWrapper.java
  92. 56 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/wrapper/UserVOWrapper.java
  93. 13 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/exception/ConfigurationNotExistException.java
  94. 16 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/exception/HttpBadRequestException.java
  95. 17 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/BaseLogic.java
  96. 34 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/IntegralLogic.java
  97. 29 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/MedalLogic.java
  98. 16 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/ThirdPartyLogic.java
  99. 87 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/UserLogic.java
  100. 18 0
      mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/WechatLogic.java

+ 0 - 0
.attach_pid31316


+ 0 - 0
.attach_pid31433


+ 0 - 0
.attach_pid31510


+ 0 - 0
.attach_pid3178


+ 0 - 0
.attach_pid31976


+ 16 - 0
.gitignore

@@ -0,0 +1,16 @@
+/eclipse
+tmp
+precompiled
+/conf/application.conf
+test-result
+.classpath
+*.launch
+*.classpath
+*.DS_Store
+**.iml
+**.ipr
+**.iws
+**.log
+/log/
+.idea/
+**target/

+ 28 - 0
mooctest-user-client/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>mooctest-user</artifactId>
+        <groupId>cn.iselab.mooctest</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mooctest-user-client</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iselab.mooctest</groupId>
+            <artifactId>mooctest-user-common</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>${spring.boot.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>

+ 27 - 0
mooctest-user-common/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>mooctest-user</artifactId>
+        <groupId>cn.iselab.mooctest</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mooctest-user-common</artifactId>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
mooctest-user-job/pom.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>mooctest-user</artifactId>
+        <groupId>cn.iselab.mooctest</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mooctest-user-job</artifactId>
+
+
+</project>

+ 127 - 0
mooctest-user-job/src/main/java/cn/iselab/mooctest/user/Application.java

@@ -0,0 +1,127 @@
+package cn.iselab.mooctest.user;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
+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.jpa.JpaRepositoriesAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration;
+import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
+import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration;
+import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration;
+import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
+import org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration;
+import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;
+import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
+import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
+import org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration;
+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.web.*;
+import org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午7:12 2018/2/12
+ * @Modified By:
+ */
+@SpringBootApplication(exclude = {
+        ActiveMQAutoConfiguration.class,
+        AopAutoConfiguration.class,
+        BatchAutoConfiguration.class,
+        CloudAutoConfiguration.class,
+        DataSourceAutoConfiguration.class,
+        DataSourceTransactionManagerAutoConfiguration.class,
+        DeviceDelegatingViewResolverAutoConfiguration.class,
+        DeviceResolverAutoConfiguration.class,
+        DispatcherServletAutoConfiguration.class,
+        ElasticsearchRepositoriesAutoConfiguration.class,
+        EmbeddedServletContainerAutoConfiguration.class,
+        ErrorMvcAutoConfiguration.class,
+        FacebookAutoConfiguration.class,
+        FallbackWebSecurityAutoConfiguration.class,
+        FlywayAutoConfiguration.class,
+        FreeMarkerAutoConfiguration.class,
+        GroovyTemplateAutoConfiguration.class,
+        GsonAutoConfiguration.class,
+        HibernateJpaAutoConfiguration.class,
+        HornetQAutoConfiguration.class,
+        HttpEncodingAutoConfiguration.class,
+        HttpMessageConvertersAutoConfiguration.class,
+        HypermediaAutoConfiguration.class,
+        IntegrationAutoConfiguration.class,
+        JacksonAutoConfiguration.class,
+        JerseyAutoConfiguration.class,
+        JmsAutoConfiguration.class,
+        JmxAutoConfiguration.class,
+        JndiConnectionFactoryAutoConfiguration.class,
+        JndiDataSourceAutoConfiguration.class,
+        JpaRepositoriesAutoConfiguration.class,
+        LinkedInAutoConfiguration.class,
+        LiquibaseAutoConfiguration.class,
+        MailSenderAutoConfiguration.class,
+        MessageSourceAutoConfiguration.class,
+        MongoAutoConfiguration.class,
+        MongoRepositoriesAutoConfiguration.class,
+        MultipartAutoConfiguration.class,
+        MustacheAutoConfiguration.class,
+        PersistenceExceptionTranslationAutoConfiguration.class,
+        RabbitAutoConfiguration.class,
+        ReactorAutoConfiguration.class,
+        RepositoryRestMvcAutoConfiguration.class,
+        SecurityAutoConfiguration.class,
+        ServerPropertiesAutoConfiguration.class,
+        SitePreferenceAutoConfiguration.class,
+        SocialWebAutoConfiguration.class,
+        SolrAutoConfiguration.class,
+        SolrRepositoriesAutoConfiguration.class,
+        SpringDataWebAutoConfiguration.class,
+        ThymeleafAutoConfiguration.class,
+        TwitterAutoConfiguration.class,
+        VelocityAutoConfiguration.class,
+        WebMvcAutoConfiguration.class,
+        WebSocketAutoConfiguration.class,
+        XADataSourceAutoConfiguration.class
+})
+public class Application {
+
+    public static void main(String[] args){
+        System.setProperty("org.jboss.logging.provider", "slf4j");
+
+        SpringApplication application = new SpringApplication(Application.class);
+        application.run(args);
+    }
+}

+ 6 - 0
mooctest-user-server/Dockerfile

@@ -0,0 +1,6 @@
+FROM openjdk:alpine
+RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
+EXPOSE 8081
+ADD target/mooctest-user-server.jar /root
+WORKDIR /root
+ENTRYPOINT ["java", "-jar", "-Djava.security.egd=file:/dev/./urandom", "mooctest-user-server.jar"]

+ 321 - 0
mooctest-user-server/pom.xml

@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>mooctest-user</artifactId>
+        <groupId>cn.iselab.mooctest</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mooctest-user-server</artifactId>
+
+    <properties>
+        <spring.boot.version>1.3.8.RELEASE</spring.boot.version>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iselab.mooctest</groupId>
+            <artifactId>user-dubbo-api</artifactId>
+            <version>1.0.28</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>cn.iselab.mooctest</groupId>-->
+            <!--<artifactId>mooctest-user-common</artifactId>-->
+            <!--<version>0.0.1</version>-->
+        <!--</dependency>-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring.boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+            <version>1.3.8.RELEASE</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+            <version>1.3.8.RELEASE</version>
+        </dependency>
+        <!-- SMS dependency -->
+        <dependency>
+            <groupId>cn.iselab</groupId>
+            <artifactId>ronglian-sms</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-redis</artifactId>
+            <version>1.3.8.RELEASE</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.session</groupId>
+            <artifactId>spring-session-data-redis</artifactId>
+            <version>1.1.1.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sourceforge.nekohtml</groupId>
+            <artifactId>nekohtml</artifactId>
+            <version>1.9.22</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <version>${spring.boot.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-web</artifactId>
+            <version>2.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+            <version>${spring.boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <version>${spring.boot.version}</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <version>${spring.boot.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <version>${spring.boot.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-context</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-beans</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.jboss.logging</groupId>
+                    <artifactId>jboss-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.jboss.logging</groupId>
+                    <artifactId>jboss-logging-annotations</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-devtools</artifactId>-->
+            <!--<version>${spring.boot.version}</version>-->
+            <!--<optional>true</optional>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>org.jboss.spec.javax.servlet</groupId>
+            <artifactId>jboss-servlet-api_3.1_spec</artifactId>
+            <version>1.0.0.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.dubbo.springboot</groupId>
+            <artifactId>spring-boot-starter-dubbo</artifactId>
+            <version>1.0.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.javassist</groupId>
+                    <artifactId>javassist</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.101tec</groupId>
+            <artifactId>zkclient</artifactId>
+            <version>0.10</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.6.3</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-annotations</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+            <version>2.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.lmax</groupId>
+            <artifactId>disruptor</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>net.dongliu</groupId>
+            <artifactId>requests</artifactId>
+            <version>4.7.3</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.iselab</groupId>
+            <artifactId>ronglian-sms</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.4.1</version>
+        </dependency>
+        <!-- Apache commons validator -->
+        <dependency>
+            <groupId>commons-validator</groupId>
+            <artifactId>commons-validator</artifactId>
+            <version>1.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+        <!--aliyun -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>Brixton.SR7</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring.boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.6.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+</project>

+ 120 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/Application.java

@@ -0,0 +1,120 @@
+package cn.iselab.mooctest.user;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
+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;
+import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration;
+import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
+import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration;
+import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration;
+import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
+import org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration;
+import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration;
+import org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
+import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
+import org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration;
+import org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration;
+import org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration;
+import org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration;
+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.context.annotation.Bean;
+
+import javax.servlet.MultipartConfigElement;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午6:19 2018/2/12
+ * @Modified By:
+ */
+@SpringBootApplication(exclude = {
+        ActiveMQAutoConfiguration.class,
+        AopAutoConfiguration.class,
+        BatchAutoConfiguration.class,
+        CloudAutoConfiguration.class,
+        DeviceDelegatingViewResolverAutoConfiguration.class,
+        DeviceResolverAutoConfiguration.class,
+        ElasticsearchRepositoriesAutoConfiguration.class,
+        FacebookAutoConfiguration.class,
+        FallbackWebSecurityAutoConfiguration.class,
+        FlywayAutoConfiguration.class,
+        FreeMarkerAutoConfiguration.class,
+        GroovyTemplateAutoConfiguration.class,
+        GsonAutoConfiguration.class,
+        HornetQAutoConfiguration.class,
+        HypermediaAutoConfiguration.class,
+        IntegrationAutoConfiguration.class,
+        JerseyAutoConfiguration.class,
+        JmsAutoConfiguration.class,
+        JmxAutoConfiguration.class,
+        JndiConnectionFactoryAutoConfiguration.class,
+        JndiDataSourceAutoConfiguration.class,
+        LinkedInAutoConfiguration.class,
+        LiquibaseAutoConfiguration.class,
+        MailSenderAutoConfiguration.class,
+        MessageSourceAutoConfiguration.class,
+        MongoAutoConfiguration.class,
+        MongoRepositoriesAutoConfiguration.class,
+        MustacheAutoConfiguration.class,
+        PersistenceExceptionTranslationAutoConfiguration.class,
+        RabbitAutoConfiguration.class,
+        ReactorAutoConfiguration.class,
+        RepositoryRestMvcAutoConfiguration.class,
+        SecurityAutoConfiguration.class,
+        SitePreferenceAutoConfiguration.class,
+        SocialWebAutoConfiguration.class,
+        SolrAutoConfiguration.class,
+        SolrRepositoriesAutoConfiguration.class,
+        // ThymeleafAutoConfiguration.class,
+        TwitterAutoConfiguration.class,
+        VelocityAutoConfiguration.class,
+        WebSocketAutoConfiguration.class,
+        XADataSourceAutoConfiguration.class,
+})
+@MapperScan("cn.iselab.mooctest.user.mapper")
+public class Application {
+
+    public static void main(String[] args){
+        SpringApplication application = new SpringApplication(Application.class);
+        application.setWebEnvironment(true);
+        application.run(args);
+    }
+    @Bean
+    public MultipartConfigElement multipartConfigElement() {
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        //单个文件最大
+        factory.setMaxFileSize("10240KB"); //KB,MB
+        /// 设置总上传数据总大小
+        factory.setMaxRequestSize("102400KB");
+        return factory.createMultipartConfig();
+    }
+}

+ 32 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/CorsConfig.java

@@ -0,0 +1,32 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * @program: mooctest-user
+ * @mail: menduo96@gmail.com
+ * @author: menduo
+ * @create: 2018-11-14 12:34
+ **/
+@Configuration
+public class CorsConfig {
+    // 临时要跨域,临时加的代码
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
+        corsConfiguration.addAllowedHeader("*"); // 允许任何头
+        corsConfiguration.addAllowedMethod("*"); // 允许任何方法(post、get等)
+        return corsConfiguration;
+    }
+
+    @Bean
+    public CorsFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", buildConfig()); // 对接口配置跨域设置
+        return new CorsFilter(source);
+    }
+}

+ 25 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/CustomSessionDefaultRedisSerializer.java

@@ -0,0 +1,25 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-1-28$ 下午4:36$
+ */
+public class CustomSessionDefaultRedisSerializer extends GenericJackson2JsonRedisSerializer {
+    private static final Logger LOG = LoggerFactory.getLogger(CustomSessionDefaultRedisSerializer.class);
+
+    @Override
+    public Object deserialize(byte[] bytes) {
+        Object deserialObj = null;
+        try {
+            deserialObj = super.deserialize(bytes);
+        }catch (Exception e){
+            LOG.warn("deserialize session Object error!", e);
+        }
+        return deserialObj;
+    }
+}

+ 32 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/ErrorPageConfig.java

@@ -0,0 +1,32 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
+import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
+import org.springframework.boot.context.embedded.ErrorPage;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpStatus;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.27 14:54
+ */
+@Configuration
+public class ErrorPageConfig {
+
+    @Bean
+    public EmbeddedServletContainerCustomizer containerCustomizer(){
+        return new EmbeddedServletContainerCustomizer() {
+            @Override
+            public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
+                ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error-400");
+                ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-404");
+                ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-500");
+                configurableEmbeddedServletContainer.addErrorPages(
+                        errorPage400,
+                        errorPage404,
+                        errorPage500);
+            }
+        };
+    }
+}

+ 61 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/IntegralMap.java

@@ -0,0 +1,61 @@
+package cn.iselab.mooctest.user.configure;
+
+import cn.iselab.mooctest.user.model.Integral;
+import cn.iselab.mooctest.user.service.IntegralService;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午9:18 2018/5/23
+ * @Modified By:
+ */
+@Data
+@Component
+public class IntegralMap implements ApplicationContextAware{
+
+    public ConcurrentHashMap<String,Integral> map=new ConcurrentHashMap<>();
+
+    @Autowired
+    IntegralService integralService;
+
+    @Override
+    public void setApplicationContext(ApplicationContext ac){
+        integralService= ac.getBean(IntegralService.class);
+        List<Integral> integrals=integralService.findIntegrals();
+        integrals.forEach(integral -> {
+            if (!map.containsKey(integral.getSource())){
+                map.put(integral.getSource(),integral);
+            }
+        });
+    }
+
+    public Integral get(String event){
+        if (map.containsKey(event)) {
+            return map.get(event);
+        }else {
+            return null;
+        }
+    }
+
+    public Map<String,Integral> reload(){
+        map.clear();
+        List<Integral> integrals=integralService.findIntegrals();
+        integrals.forEach(integral -> {
+            if (!map.containsKey(integral.getSource())){
+                map.put(integral.getSource(),integral);
+            }
+        });
+        return map;
+    }
+}

+ 33 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/MailConfiguration.java

@@ -0,0 +1,33 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 18-12-25$ 下午9:45$
+ */
+@Configuration
+public class MailConfiguration {
+
+    @Autowired
+    private MailProperties mailProperties;
+
+    @Bean
+    public JavaMailSender getJavaMailSender(){
+        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
+        javaMailSender.setProtocol("smtp");
+        javaMailSender.setHost(mailProperties.getHost());
+        javaMailSender.setUsername(mailProperties.getUsername());
+        javaMailSender.setPassword(mailProperties.getPassword());
+//        javaMailSender.setDefaultEncoding(mailProperties.getDefault_encoding());
+        javaMailSender.setDefaultEncoding("UTF-8");
+
+        return javaMailSender;
+    }
+
+}

+ 65 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/MailProperties.java

@@ -0,0 +1,65 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 18-12-25$ 下午9:42$
+ */
+@ConfigurationProperties(prefix = "mail")
+@Component
+public class MailProperties {
+
+    private String host;
+
+    private String username;
+
+    private String password;
+
+    private String default_encoding;
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getDefault_encoding() {
+        return default_encoding;
+    }
+
+    public void setDefault_encoding(String default_encoding) {
+        this.default_encoding = default_encoding;
+    }
+
+    @Override
+    public String toString() {
+        return "EboxEmailProperties{" +
+                "host='" + host + '\'' +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                ", default-encoding='" + default_encoding + '\'' +
+                '}';
+    }
+}

+ 49 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/RedisSessionConfiguration.java

@@ -0,0 +1,49 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
+import org.springframework.session.web.http.CookieSerializer;
+import org.springframework.session.web.http.DefaultCookieSerializer;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-1-22$ 下午3:59$
+ */
+@Configuration
+@EnableRedisHttpSession
+public class RedisSessionConfiguration {
+
+    @Value("${website.domainName}")
+    private String domainName;
+
+    @Bean
+    public CookieSerializer cookieSerializer() {
+        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
+//        serializer.setCookieName("SESSION");
+        serializer.setCookiePath("/");
+        serializer.setDomainName(domainName);
+//        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
+        return serializer;
+    }
+    @Bean
+    RedisSerializer<Object> springSessionDefaultRedisSerializer() {
+        return new CustomSessionDefaultRedisSerializer();
+    }
+
+    // @Bean
+    // RedisTemplate redisTemplate(RedisConnectionFactory factory){
+    //     RedisTemplate redisTemplate = new RedisTemplate();
+    //     RedisSerializer stringSerializer = new StringRedisSerializer();
+    //     redisTemplate.setConnectionFactory(factory);
+    //     redisTemplate.setHashValueSerializer(stringSerializer);
+    //     return redisTemplate;
+    // }
+
+}

+ 62 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/ThirdPartyAuthConfiguration.java

@@ -0,0 +1,62 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-1-9$ 下午2:21$
+ */
+@Configuration
+public class ThirdPartyAuthConfiguration {
+
+    @Value("${github.clientId}")
+    String gitHubClientId;
+
+    @Value("${github.clientSecret}")
+    String gitHubClientSecret;
+
+    @Bean
+    public RestTemplate getRestTemplate(){
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setReadTimeout(5000);
+        factory.setConnectTimeout(5000);
+        RestTemplate restTemplate = new RestTemplate(factory);
+        return restTemplate;
+    }
+
+    @Bean
+    public HttpEntity<String> jsonAcceptHeaders(){
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.set("Accept", MediaType.APPLICATION_JSON.toString());
+        httpHeaders.set(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.toString());
+        HttpEntity<String> entity = new HttpEntity<>(null, httpHeaders);
+        return entity;
+    }
+
+    public String getGitHubClientId() {
+        return gitHubClientId;
+    }
+
+    public void setGitHubClientId(String gitHubClientId) {
+        this.gitHubClientId = gitHubClientId;
+    }
+
+    public String getGitHubClientSecret() {
+        return gitHubClientSecret;
+    }
+
+    public void setGitHubClientSecret(String gitHubClientSecret) {
+        this.gitHubClientSecret = gitHubClientSecret;
+    }
+}

+ 53 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/WechatConfiguration.java

@@ -0,0 +1,53 @@
+package cn.iselab.mooctest.user.configure;
+
+import cn.iselab.mooctest.user.data.Token;
+import cn.iselab.mooctest.user.util.WechatUtil;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Hashtable;
+import java.util.logging.Logger;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午4:35 2018/4/2
+ * @Modified By:
+ */
+@ConfigurationProperties(prefix="wechat")
+@Component
+public class WechatConfiguration {
+    private String appId;
+
+    private String appSecret;
+
+    private Token token;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+
+    public Token getToken(String code) {
+        if (appId != null && appSecret != null) {
+            token = WechatUtil.getToken(appId, appSecret, code);
+        }
+        return token;
+    }
+
+    public void setToken(Token token) {
+        this.token = token;
+    }
+}

+ 82 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/Converter.java

@@ -0,0 +1,82 @@
+package cn.iselab.mooctest.user.constants;
+
+import com.google.common.collect.Maps;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.cglib.beans.BeanCopier;
+
+import java.util.Map;
+
+public class Converter {
+
+    private static Map<CopierIdentity, BeanCopier> copierCache = Maps.newConcurrentMap();
+    private static PrimitiveConverter primitiveConverter = new PrimitiveConverter();
+
+    public static <T> T copy(T target, Object source) {
+        BeanCopier copier = getCopier(source.getClass(), target.getClass());
+        copier.copy(source, target, primitiveConverter);
+        return target;
+    }
+
+    public static <T> T convert(Class<T> targetClass, Object source) {
+        try {
+            T target = targetClass.newInstance();
+            BeanCopier copier = getCopier(source.getClass(), targetClass);
+            copier.copy(source, target, primitiveConverter);
+            return target;
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static BeanCopier getCopier(Class<?> source, Class<?> target) {
+        CopierIdentity identity = new CopierIdentity(source, target);
+        BeanCopier copier;
+        if (copierCache.containsKey(identity)) {
+            copier = copierCache.get(identity);
+        } else {
+            copier = BeanCopier.create(source, target, true);
+            copierCache.putIfAbsent(identity, copier);
+        }
+        return copier;
+    }
+
+    public static class PrimitiveConverter implements org.springframework.cglib.core.Converter {
+        @Override
+        @SuppressWarnings("unchecked")
+        public Object convert(Object value, Class target, Object context) {
+            if (value == null) return null;
+            if (target.equals(String.class)
+                    && !String.class.isAssignableFrom(value.getClass()))
+                return value.toString();
+            if (Number.class.isAssignableFrom(value.getClass())) {
+                Number num = (Number) value;
+                if (target.equals(int.class) || target.equals(Integer.class))
+                    return num.intValue();
+                else if (target.equals(long.class) || target.equals(Long.class))
+                    return num.longValue();
+                else if (target.equals(short.class) || target.equals(Short.class))
+                    return num.shortValue();
+                else if (target.equals(float.class) || target.equals(Float.class))
+                    return num.floatValue();
+                else if (target.equals(double.class) || target.equals(Double.class))
+                    return num.doubleValue();
+                else if (target.equals(byte.class) || target.equals(Byte.class))
+                    return num.byteValue();
+            } else if (target.isAssignableFrom(value.getClass()))
+                return value;
+            return null;
+        }
+    }
+
+    @AllArgsConstructor
+    @Data
+    @EqualsAndHashCode
+    private static class CopierIdentity {
+        private Class<?> source;
+        private Class<?> target;
+    }
+
+}
+

+ 14 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/DeleteStatus.java

@@ -0,0 +1,14 @@
+package cn.iselab.mooctest.user.constants;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午1:40 2018/2/14
+ * @Modified By:
+ */
+public class DeleteStatus {
+
+    public static final boolean IS_DELETED=true;
+
+    public static final boolean IS_NOT_DELETED=false;
+}

+ 11 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/ResponseStatus.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.user.constants;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.20 17:53
+ */
+public class ResponseStatus {
+    public static final Integer SUCCESS = 2000;
+    public static final Integer FAILED = 5000;
+    public static final Integer NOTFOUND = 4000;
+}

+ 42 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/UrlConstants.java

@@ -0,0 +1,42 @@
+package cn.iselab.mooctest.user.constants;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午2:45 2018/2/14
+ * @Modified By:
+ */
+@Component
+public class UrlConstants {
+
+    public static final String API_INTEGRAL="/api/integral";
+
+    public static final String API_MEDAL="/api/medal";
+
+    public static final String PAGE="/page/";
+
+    public static final String API="/api/";
+
+
+    public static String DEFAULT_GOTO="http://www.cofortest.com";
+
+    public static final String GET_GITHUB_LOGIN_ACCESSTOKEN = "https://github.com/login/oauth/access_token?code=CODE&client_id=CLIENTID&client_secret=CLIENTSECRET";
+
+    public static final String GET_GITHUB_USER_INFO = "https://api.github.com/user?access_token=ACCESSTOKEN";
+
+    public static String GO_LOGIN = "http://user.cofortest.com/page/login";
+
+    @Value("${default.goto}")
+    public void setDefaultGoto(String defaultGoto){
+        DEFAULT_GOTO = defaultGoto;
+    }
+
+    @Value("${default.login}")
+    public void setGoLogin(String goLogin){
+        GO_LOGIN = goLogin;
+    }
+
+}

+ 13 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/VerifyConstants.java

@@ -0,0 +1,13 @@
+package cn.iselab.mooctest.user.constants;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 13:10
+ */
+public class VerifyConstants {
+    public static final String SENDER_NAME = "群智服务平台";
+    public static final long TIME_OUT = 1000 * 60 * 5;
+    public static final String SMS_VERI_TEMPLATE_ID = "73686";
+    // public static final String SMS_VERI_TIMEOUT = "30";
+    public static final long MOBILE_VERIFICATION_INTERVAL = 60 * 1000;
+}

+ 15 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/constants/WechatUserConstants.java

@@ -0,0 +1,15 @@
+package cn.iselab.mooctest.user.constants;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午10:55 2018/4/17
+ * @Modified By:
+ */
+public class WechatUserConstants {
+
+
+    public final static int NEW=0;
+
+    public final static int OLD=1;
+}

+ 69 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/ResponseResult.java

@@ -0,0 +1,69 @@
+package cn.iselab.mooctest.user.data;
+
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.20 17:45
+ */
+public class ResponseResult<T> {
+
+    private Integer status;     //响应状态
+    private String msg;         //响应消息
+    private T data;        //响应中的数据
+
+    public ResponseResult(){
+        this.status = ResponseStatus.SUCCESS;
+        this.msg = "";
+        this.data = null;
+    }
+
+    public ResponseResult(Integer status, String msg, T data) {
+        this.status = status;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    public ResponseResult(T data) {
+        this.status = ResponseStatus.SUCCESS;
+        this.msg = "SUCCESS";
+        this.data = data;
+    }
+
+    public ResponseResult(Integer status, String msg){
+        this.status = status;
+        this.msg = msg;
+        this.data = null;
+    }
+
+
+    public void init(Integer status, String msg, T data){
+        this.setData(data);
+        this.setMsg(msg);
+        this.setStatus(status);
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}

+ 71 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/Token.java

@@ -0,0 +1,71 @@
+package cn.iselab.mooctest.user.data;
+
+/**
+ * @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;
+    }
+}

+ 35 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/UserInfo.java

@@ -0,0 +1,35 @@
+package cn.iselab.mooctest.user.data;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午8:57 2018/4/2
+ * @Modified By:
+ */
+@Data
+public class UserInfo {
+
+    private String openid;
+
+    private String nickname;
+
+    private String sex;
+
+    private String thirdPartyId;
+
+    private String headimgurl;
+
+    private String unionid;
+
+    private String country;
+
+    private String province;
+
+    private List<String> privilege;
+
+    private String city;
+}

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/BankAccountInfoDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.BankAccountInfo;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-2-25$ 下午3:26$
+ */
+@Transactional
+public interface BankAccountInfoDao extends CrudRepository<BankAccountInfo, Long>, JpaSpecificationExecutor<BankAccountInfo> {
+    BankAccountInfo findBankAccountInfoByUserId(Long userId);
+}

+ 20 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/ConfigurationDao.java

@@ -0,0 +1,20 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.BankAccountInfo;
+import cn.iselab.mooctest.user.model.Configuration;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+/**
+ * @Description: 配置项
+ * @Author: guochao
+ */
+@Transactional
+public interface ConfigurationDao extends CrudRepository<Configuration, Long>, JpaSpecificationExecutor<Configuration> {
+    Configuration findByName(String name);
+
+    @Override
+    Iterable<Configuration> findAll();
+}

+ 20 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/IntegralMapper.java

@@ -0,0 +1,20 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.Integral;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午9:22 2018/5/23
+ * @Modified By:
+ */
+@Mapper
+public interface IntegralMapper {
+
+    @Select("select * from integral where is_deleted=0")
+    List<Integral> findAll();
+}

+ 31 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/MedalMapper.java

@@ -0,0 +1,31 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.Medal;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午9:22 2018/2/12
+ * @Modified By:
+ */
+@Mapper
+public interface MedalMapper {
+
+    @Select("select * from medal where id=#{id}")
+    Medal findById(long id);
+
+    @Insert("insert into medal(name,description,img_url,type,is_deleted,create_time) values(#{name},#{description},#{imgUrl},#{type},#{isDeleted},#{createTime})")
+    void save(Medal medal);
+
+    @Update("update medal set name=#{name},description=#{description},is_deleted=#{isDeleted} where id=#{id}")
+    void update(Medal medal);
+
+    @Select("select * from medal where name like concat('%',#{keyword},'%') and is_deleted=0")
+    List<Medal> findAll(String keyword);
+}

+ 17 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/OperationRecordDao.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.OperationRecord;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-15 20:57
+ */
+@Transactional
+public interface OperationRecordDao extends CrudRepository<OperationRecord, Long>, JpaSpecificationExecutor<OperationRecord> {
+
+}

+ 23 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/User2IntegralDao.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.User2Integral;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午7:25 2018/2/12
+ * @Modified By:
+ */
+@Transactional
+public interface User2IntegralDao extends CrudRepository<User2Integral, Long> ,JpaSpecificationExecutor<User2Integral> {
+
+    List<User2Integral> findByUserId(long userId);
+
+    List<User2Integral> findByUserIdAndAndTypeAndSource(long userId, long type, String source);
+}

+ 23 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/User2MedalDao.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.User2Medal;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:34 2018/2/13
+ * @Modified By:
+ */
+@Transactional
+public interface User2MedalDao extends CrudRepository<User2Medal, Long> ,JpaSpecificationExecutor<User2Medal>{
+
+    List<User2Medal> findByUserId(long userId);
+
+    List<User2Medal> findByUserIdAndMedalId(long userId,long medalId);
+}

+ 34 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserIntegralMapper.java

@@ -0,0 +1,34 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.UserIntegral;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:40 2018/2/13
+ * @Modified By:
+ */
+@Mapper
+public interface UserIntegralMapper {
+
+    @Select("select * from user_integral where user_id=#{userId}")
+    List<UserIntegral> findByUserId(long userId);
+
+    @Select("select * from user_integral")
+    List<UserIntegral> findAll();
+
+    @Insert("insert into user_integral(user_id,total,enabled,create_time) values(#{userId},#{total},#{enabled},#{createTime})")
+    void save(UserIntegral integral);
+
+    @Update("update user_integral set total=#{total},enabled=#{enabled} where id=#{id}")
+    void update(UserIntegral integral);
+}

+ 76 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserMapper.java

@@ -0,0 +1,76 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.User;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2018-03-04.
+ */
+public interface UserMapper {
+
+    @Select("SELECT * FROM user WHERE id = #{id}")
+    User findById(@Param("id")Long id);
+
+    @Select("SELECT * FROM user WHERE email = #{email}")
+    User findByEmail(String email);
+
+    @Select("SELECT * FROM user WHERE mobile = #{mobile}")
+    User findByMobile(String mobile);
+
+    @Insert("INSERT INTO user(name, password, email, mobile, school ) VALUES(#{name}, #{password}, #{email}, #{mobile}, #{school})")
+    void insert(User user);
+
+    @Update("UPDATE user SET name=#{name} WHERE id=#{id}")
+    void updateName(User user);
+
+    @Update("UPDATE user SET school=#{school}, province=#{province}, city=#{city} WHERE id=#{id}")
+    void updateAddress(User user);
+
+    @Update("UPDATE user SET email=#{email} WHERE id=#{id}")
+    void updateEmail(User user);
+
+    @Update("UPDATE user SET mobile=#{mobile} WHERE id=#{id}")
+    void updateMobile(User user);
+
+    @Update("UPDATE user SET photo_url=#{photoUrl} WHERE id=#{id}")
+    void updatePhotoUrl(User user);
+
+    @Update("UPDATE user SET password=#{password} WHERE id=#{id}")
+    void updatePassword(User user);
+
+    @Update("UPDATE user SET availability=#{availability} WHERE id=#{id}")
+    void updateAvailability(User user);
+
+    @Select("SELECT * FROM user WHERE name LIKE concat('%',#{username},'%') or email LIKE concat('%',#{username},'%')" +
+            "or school LIKE concat('%',#{username},'%') or province LIKE concat('%',#{username},'%') or city LIKE concat('%',#{username},'%')" +
+            "or mobile LIKE concat('%',#{username},'%')")
+    List<User> findByFuzzyName(String name);
+
+    @Select("SELECT * FROM user WHERE email LIKE concat('%',#{username},'%')")
+    List<User> findByFuzzyEmail(String email);
+
+    @Select("SELECT * FROM user WHERE name LIKE concat('%',#{keyword},'%') OR email LIKE CONCAT('%',#{keyword},'%')")
+    List<User> findByFuzzyNameOrEmail(String keyword);
+
+    @Select("SELECT * FROM user WHERE id in (${userIds})")
+    List<User> findAll(@Param("userIds") String userIds);
+
+    @Select({
+            "<script>",
+            "select",
+            "*",
+            "from user",
+            "where id in",
+            "<foreach collection='userIds' item='id' open='(' separator=',' close=')'>",
+            "#{id}",
+            "</foreach>",
+            "</script>"
+    })
+    List<User> findAllUsers(@Param("userIds") List<Long> userIds);
+}

+ 22 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserThirdPartyDao.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.UserThirdParty;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author: xuexb
+ * @CreateDate: 19-1-3$ 下午10:28$
+ */
+@Transactional
+public interface UserThirdPartyDao extends CrudRepository<UserThirdParty, Long>, JpaSpecificationExecutor<UserThirdParty> {
+
+    List<UserThirdParty> findByUserId(Long userId);
+
+    UserThirdParty findByThirdPartyIdentityAndType(String thirdPartyIdentity, String from);
+
+    UserThirdParty findByUserIdAndType(Long userId, String from);
+}

+ 31 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/UserWechatMapper.java

@@ -0,0 +1,31 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.UserWechat;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:01 2018/4/17
+ * @Modified By:
+ */
+@Mapper
+public interface UserWechatMapper {
+
+    @Select("select * from user_wechat where user_id=#{userId}")
+    UserWechat findByUserId(Long userId);
+
+    @Select("select * from user_wechat where open_id=#{openId}")
+    UserWechat findByOpenId(String openId);
+
+    @Select("select * from user_wechat where union_id=#{unionId}")
+    UserWechat findByUnionId(String unionId);
+
+    @Insert("insert into user_wechat(user_id,union_id,open_id,is_delete) values (#{userId},#{unionId},#{openId},#{isDelete})")
+    void save(UserWechat wechat);
+
+    @Insert("update user_wechat set is_delete=#{isDelete}")
+    void update(UserWechat wechat);
+}

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/VerifyCodeDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.VerifyCode;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:16
+ */
+@Transactional
+public interface VerifyCodeDao extends CrudRepository<VerifyCode, Long>, JpaSpecificationExecutor<VerifyCode> {
+
+    VerifyCode findTop1ByTypeAndReceiverOrderByCreateTimeDesc(String type, String receiver);
+}

+ 41 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/BankAccountInfo.java

@@ -0,0 +1,41 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-2-25$ 下午3:20$
+ */
+@Data
+@Entity
+@Table(name = "bank_account_info")
+public class BankAccountInfo {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "user_id")
+    private Long userId ;
+
+    @Column(name = "real_name")
+    private String realName;
+
+    @Column(name = "id_number")
+    private String IDNumber;
+
+    @Column(name = "bank_info")
+    private String bankInfo;
+
+    @Column(name = "bank_card_number")
+    private String bankCardNumber;
+
+    @Column(name = "id_card_front_url")
+    private String IDCardFrontUrl;
+
+    @Column(name = "id_card_back_url")
+    private String IDCardBackUrl;
+}

+ 27 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Configuration.java

@@ -0,0 +1,27 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-15 20:52
+ */
+@Data
+@Entity
+@Table(name = "configuration")
+public class Configuration {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "value")
+    private String value;
+}

+ 23 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Integral.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午5:08 2018/5/23
+ * @Modified By:
+ */
+@Data
+public class Integral {
+
+    private long id;
+
+    private String source;
+
+    private long point;
+
+    private Timestamp createTime;
+}

+ 30 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/Medal.java

@@ -0,0 +1,30 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author ROKG
+ * @Description 勋章表
+ * @Date: Created in 下午7:34 2018/2/12
+ * @Modified By:
+ */
+@Data
+public class Medal {
+
+    private long id;
+
+    private String name;
+
+    private String description;
+
+    private String imgUrl;
+
+    private long type;
+
+    private Timestamp createTime;
+
+    private boolean isDeleted;
+}

+ 36 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/OperationRecord.java

@@ -0,0 +1,36 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-15 20:52
+ */
+@Data
+@Entity
+@Table(name = "operation_record")
+public class OperationRecord {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "ip")
+    private String ip;
+
+    @Column(name = "user_Id")
+    private Long userId;
+
+    @Column(name = "operation")
+    private String operation;
+
+    @Column(name = "resource")
+    private String resource;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+}

+ 138 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User.java

@@ -0,0 +1,138 @@
+package cn.iselab.mooctest.user.model;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * @author sean
+ * @date 2018-03-02.
+ */
+public class User implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String email;
+
+    private String mobile;
+
+    private String password;
+
+    private String school;
+
+    private Timestamp createTime = new Timestamp(System.currentTimeMillis());
+
+    private String photoUrl;
+
+    private String province;
+
+    private String city;
+
+    private Boolean manualCheckValid;
+
+    /**
+     * -1 用户被删除
+     * 0  用户被禁用
+     * 1  用户解除禁用 可以正常使用
+     */
+    private Integer availability;
+
+    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 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 getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getSchool() {
+        return school;
+    }
+
+    public void setSchool(String school) {
+        this.school = school;
+    }
+
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getPhotoUrl() {
+        return photoUrl;
+    }
+
+    public void setPhotoUrl(String photoUrl) {
+        this.photoUrl = photoUrl;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public Boolean getManualCheckValid() {
+        return manualCheckValid;
+    }
+
+    public void setManualCheckValid(Boolean manualCheckValid) {
+        this.manualCheckValid = manualCheckValid;
+    }
+
+    public Integer getAvailability() {
+        return availability;
+    }
+
+    public void setAvailability(Integer availability) {
+        this.availability = availability;
+    }
+}

+ 37 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User2Integral.java

@@ -0,0 +1,37 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author ROKG
+ * @Description 用户获取积分记录表
+ * @Date: Created in 下午7:24 2018/2/12
+ * @Modified By:
+ */
+@Data
+@Entity
+@Table(name = "user_2_integral")
+public class User2Integral {
+
+    @Id
+    @GeneratedValue
+    private long id;
+
+    @Column(name = "user_id")
+    private long userId;
+
+    @Column(name = "points")
+    private long points;
+
+    @Column(name = "type")
+    private long type;
+
+    @Column(name = "source")
+    private String source;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+}

+ 33 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/User2Medal.java

@@ -0,0 +1,33 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author ROKG
+ * @Description 用户获取勋章记录表
+ * @Date: Created in 上午11:30 2018/2/13
+ * @Modified By:
+ */
+@Data
+@Entity
+@Table(name = "user_2_medal")
+public class User2Medal {
+
+    @Id
+    @GeneratedValue
+    private long id;
+
+    @Column(name = "user_id")
+    private long userId;
+
+    @Column(name = "medal_id")
+    private long medalId;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+
+
+}

+ 26 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserIntegral.java

@@ -0,0 +1,26 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author ROKG
+ * @Description 用户积分总和表
+ * @Date: Created in 上午11:36 2018/2/13
+ * @Modified By:
+ */
+@Data
+public class UserIntegral {
+
+    private long id;
+
+    private long userId;
+
+    private long total;
+
+    private boolean enabled;
+
+    private Timestamp createTime;
+}

+ 33 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserThirdParty.java

@@ -0,0 +1,33 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @Description: 第三方登录
+ * @Author: xuexb
+ * @CreateDate: 19-1-3$ 下午4:50$
+ */
+@Data
+@Entity
+@Table(name = "user_third_party")
+public class UserThirdParty {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "user_id")
+    private Long userId;
+
+    @Column(name = "third_party_identity")
+    private String thirdPartyIdentity;
+
+    @Column(name = "type")
+    private String type;
+
+    @Column(name = "is_delete")
+    private int isDelete;
+
+}

+ 23 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/UserWechat.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午10:56 2018/4/17
+ * @Modified By:
+ */
+@Data
+public class UserWechat {
+
+    private long id;
+
+    private long userId;
+
+    private String unionId;
+
+    private String openId;
+
+    private boolean isDelete;
+}

+ 38 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/VerifyCode.java

@@ -0,0 +1,38 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 0:57
+ */
+@Data
+@Entity
+@Table(name = "verify_code")
+public class VerifyCode {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "code")
+    private String code;
+
+    /**
+     * type=email or mobile
+     */
+    @Column(name = "type")
+    private String type;
+
+    @Column(name = "receiver")
+    private String receiver;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+
+    @Column(name = "expired_time")
+    private Timestamp expiredTime;
+}

+ 83 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/IntegralRPC.java

@@ -0,0 +1,83 @@
+package cn.iselab.mooctest.user.rpc;
+
+import cn.iselab.mooctest.rpc.user.api.IntegralService;
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
+import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
+import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
+import cn.iselab.mooctest.user.web.logic.IntegralLogic;
+import com.alibaba.dubbo.config.annotation.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午12:09 2018/2/14
+ * @Modified By:
+ */
+@Service(version = "1.0.0")
+@Component
+public class IntegralRPC implements IntegralService {
+
+    @Autowired
+    IntegralLogic integralLogic;
+
+    /**
+     * save user caught integral
+     * @param dto
+     * @return medalTO
+     */
+    @Override
+    public IntegralCaughtDTO saveIntegralCaught(IntegralCaughtDTO dto){
+        return integralLogic.saveIntegralCaught(dto);
+    }
+
+    /**
+     * get user's integral by time
+     * @param userId user's id
+     * @param startTime
+     * @param endTime
+     * @return medalTO
+     */
+    @Override
+    public List<IntegralCaughtDTO> getIntegralCaughts(long userId, long startTime, long endTime){
+        return integralLogic.getIntegralCaughts(userId,startTime,endTime);
+    }
+
+    /**
+     * get user's integral ranking list
+     * @param keyword search for single task
+     * @return medalTO
+     */
+    @Override
+    public List<UserIntegralDTO> getUserIntegrals(String keyword){
+        return integralLogic.getUserIntegrals(keyword);
+    }
+
+    /**
+     * check if user's event can bring integral
+     * @param dto
+     * @return
+     */
+    @Override
+    public boolean checkIntegral(AddIntegralDTO dto){
+        return integralLogic.addIntegral(dto);
+    }
+
+    /**
+     * get user's integral by userId
+     * @param userId
+     * @return
+     */
+    @Override
+    public UserIntegralDTO getUserIntegral(Long userId){
+        return integralLogic.getUserIntegral(userId);
+    }
+
+    @Override
+    public List<IntegralCaughtDTO> getUserIntegralRecord(long userId, long type, String source) {
+        return integralLogic.getUserIntegralRecord(userId, type, source);
+    }
+}

+ 97 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/MedalRPC.java

@@ -0,0 +1,97 @@
+package cn.iselab.mooctest.user.rpc;
+
+import cn.iselab.mooctest.rpc.user.api.MedalService;
+import cn.iselab.mooctest.rpc.user.data.MedalCaughtDTO;
+import cn.iselab.mooctest.rpc.user.data.MedalDTO;
+import cn.iselab.mooctest.user.web.logic.MedalLogic;
+import com.alibaba.dubbo.config.annotation.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午12:02 2018/2/14
+ * @Modified By:
+ */
+@Service(version = "1.0.0")
+@Component
+public class MedalRPC implements MedalService{
+
+    @Autowired
+    MedalLogic medalLogic;
+
+    /**
+     * save single medal
+     * @param dto
+     * @return medalTO
+     */
+    @Override
+    public MedalDTO saveMedal(MedalDTO dto)
+    {
+        return medalLogic.saveMedal(dto);
+    }
+
+    /**
+     * get single medal
+     * @param medalId
+     * @return
+     */
+    public MedalDTO getMedal(long medalId){
+        return medalLogic.getMedal(medalId);
+    }
+
+    /**
+     * update single medal
+     * @param dto
+     * @return medalCaughtDTO
+     */
+    @Override
+    public MedalDTO updateMedal(MedalDTO dto){
+        return medalLogic.updateMedal(dto);
+    }
+
+    /**
+     * delete single medal
+     * @param medalId medal's id
+     * @return
+     */
+    @Override
+    public void deleteMedal(long medalId){
+        medalLogic.deleteMedal(medalId);
+    }
+
+    /**
+     * get medal list
+     * @param keyword
+     * @return medalTO
+     */
+    @Override
+    public List<MedalDTO> getMedals(String keyword,Long userId){
+        return medalLogic.getMedals(keyword,userId);
+    }
+
+    /**
+     * save user caught medal
+     * @param dto
+     * @return medalCaughtDTO
+     */
+    @Override
+    public MedalCaughtDTO saveMedalCaughtDTO(MedalCaughtDTO dto){
+        return medalLogic.saveMedalCaughtDTO(dto);
+    }
+
+    /**
+     * get user's medals
+     * @param userId user's id
+     * @return medalCaughtDTO
+     */
+    @Override
+    public List<MedalCaughtDTO> getMedalList(long userId){
+        return medalLogic.getMedalList(userId);
+    }
+}

+ 92 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/UserRPC.java

@@ -0,0 +1,92 @@
+package cn.iselab.mooctest.user.rpc;
+
+import cn.iselab.mooctest.rpc.user.api.UserService;
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.user.web.logic.UserLogic;
+import com.alibaba.dubbo.config.annotation.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2018-03-03.
+ */
+@Service(version = "1.0.0")
+@Component
+public class UserRPC implements UserService {
+
+    @Autowired
+    private UserLogic userLogic;
+
+    @Override
+    public UserDTO getUserByEmail(String s) {
+        return userLogic.getUserByEmail(s);
+    }
+
+    @Override
+    public UserDTO getUserByMobile(String s) {
+        return userLogic.getUserByMobile(s);
+    }
+
+    @Override
+    public UserDTO getUserById(Long userId) {
+        return userLogic.getUserById(userId);
+    }
+
+    @Override
+    public Boolean checkPassword(UserDTO userDTO) {
+        return userLogic.checkPassword(userDTO);
+    }
+
+    @Override
+    public UserDTO save(UserDTO userDTO) {
+        return userLogic.save(userDTO);
+    }
+
+    @Override
+    public UserDTO updateUser(UserDTO userDTO) {
+        return userLogic.updateUser(userDTO);
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzyName(UserDTO userDTO) {
+        return userLogic.getUserByFuzzyName(userDTO);
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzyEmail(UserDTO userDTO) {
+        return userLogic.getUserByFuzzyEmail(userDTO);
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzyNameOrEmail(UserDTO userDTO) {
+        return userLogic.getUserByFuzzyNameOrEmail(userDTO);
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzySchool(UserDTO var1){
+        return null;
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzyProvince(UserDTO var1){
+        return null;
+    }
+
+    @Override
+    public List<UserDTO> getUserByFuzzyCity(UserDTO var1){
+        return null;
+    }
+
+    @Override
+    public List<UserDTO> findAll(List<Long> list) {
+        return userLogic.findAll(list);
+    }
+
+    @Override
+    public List<UserDTO> findByEmails(List<String> list) {
+        return userLogic.findByEmails(list);
+    }
+}

+ 31 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/rpc/WechatRPC.java

@@ -0,0 +1,31 @@
+package cn.iselab.mooctest.user.rpc;
+
+import cn.iselab.mooctest.rpc.user.api.WechatService;
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+import cn.iselab.mooctest.user.web.logic.WechatLogic;
+import com.alibaba.dubbo.config.annotation.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午3:26 2018/4/17
+ * @Modified By:
+ */
+@Service(version = "1.0.0")
+public class WechatRPC implements WechatService {
+
+    @Autowired
+    WechatLogic wechatLogic;
+
+    @Override
+    public UserWechatDTO loginByCode(String code){
+        return wechatLogic.getUserByCode(code);
+    }
+
+    @Override
+    public UserDTO setUserWechat(UserWechatDTO dto){
+        return wechatLogic.setUserWechat(dto);
+    }
+}

+ 13 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/BankAccountInfoService.java

@@ -0,0 +1,13 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.BankAccountInfo;
+
+/**
+ * @Author: xuexb
+ * @Date: 2019.2.26 14:56
+ */
+public interface BankAccountInfoService {
+
+    BankAccountInfo setBankAccountInfo(BankAccountInfo info);
+}
+

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/ConfigurationService.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.Configuration;
+import cn.iselab.mooctest.user.web.exception.ConfigurationNotExistException;
+
+import java.util.Map;
+
+
+/**
+ * @author guochao
+ */
+public interface ConfigurationService {
+
+    String getPlatformNameConfiguration() throws ConfigurationNotExistException;
+
+    Map<String, String> getConfiguration();
+}
+

+ 36 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/IntegralService.java

@@ -0,0 +1,36 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.Integral;
+import cn.iselab.mooctest.user.model.User2Integral;
+import cn.iselab.mooctest.user.model.UserIntegral;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:42 2018/2/13
+ * @Modified By:
+ */
+public interface IntegralService {
+
+    UserIntegral findByUserId(long userId);
+
+    UserIntegral saveIntegral(UserIntegral userIntegral);
+
+    UserIntegral updateIntegral(UserIntegral userIntegral);
+
+    List<UserIntegral> findPage(String keyword);
+
+    List<User2Integral> findByTime(long userId, long startTime, long endTime);
+
+    User2Integral saveUser2Integral(User2Integral user2Integral);
+
+    List<Integral> findIntegrals();
+
+    User2Integral findIntegralBySource(String source,long userId);
+
+    List<User2Integral> findUserIntegralCaught(long userId, long type, String source);
+}

+ 21 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MailService.java

@@ -0,0 +1,21 @@
+package cn.iselab.mooctest.user.service;
+
+import javax.mail.MessagingException;
+
+/**
+ * @Description: 发送邮件服务接口
+ * @Author: xuexb
+ * @CreateDate: 18-12-25$ 下午4:53$
+ */
+public interface MailService {
+
+    void sendNormalEmail(String sender, String receiver,
+                         String subject, String content);
+
+    void sendHtmlEmail(String sender, String receiver,
+                         String subject, String content) throws MessagingException;
+
+    void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException;
+
+    void sendArrearsEmail();
+}

+ 29 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MedalService.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.Medal;
+import cn.iselab.mooctest.user.model.User2Medal;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:42 2018/2/13
+ * @Modified By:
+ */
+public interface MedalService {
+
+    Medal saveMedal(Medal medal);
+
+    Medal updateMedal(Medal medal);
+
+    Medal findById(long id);
+
+    User2Medal saveUser2Medal(User2Medal medal);
+
+    User2Medal findByUserIdAndMedalId(long userId, long medalId);
+
+    List<User2Medal> findByPage(long userId);
+
+    List<Medal> findByKeyword(String word);
+}

+ 29 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/ThirdPartyAuthService.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.user.service;
+
+
+import cn.iselab.mooctest.user.data.UserInfo;
+import cn.iselab.mooctest.user.model.UserThirdParty;
+import org.json.JSONObject;
+
+import java.util.List;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-1-8$ 上午1:23$
+ */
+public interface ThirdPartyAuthService {
+
+    String getAccessToken(String url, String code);
+
+    UserInfo getGithubUserInfo(String url, String accessToken);
+
+    UserThirdParty findByThirdIdAndType(String identity, String type);
+
+    UserThirdParty save(UserThirdParty userThirdParty);
+
+    List<UserThirdParty> findByUserId(Long userId);
+
+
+
+}

+ 37 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/UserService.java

@@ -0,0 +1,37 @@
+package cn.iselab.mooctest.user.service;
+
+
+import cn.iselab.mooctest.user.model.OperationRecord;
+import cn.iselab.mooctest.user.model.User;
+
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2018-03-03.
+ */
+public interface UserService {
+
+    User findByEmail(String email);
+
+    User findByMobile(String mobile);
+
+    User register(User user);
+
+    User findById(Long userId);
+
+    User update(User user);
+
+    OperationRecord recordOperation(OperationRecord record);
+
+    List<User> findByFuzzyName(String name);
+
+    List<User> findByFuzzyEmail(String email);
+
+    List<User> findByFuzzyNameOrEmail(String keyword);
+
+    List<User> findAll(List<Long> userIds);
+
+    List<User> findAllByEmails(List<String> emails);
+}
+

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/VerifyCodeService.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.model.VerifyCode;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:27
+ */
+public interface VerifyCodeService {
+
+    VerifyCode getLatestVerifyCode(String type, String receiver);
+
+    VerifyCode saveVerifyCode(VerifyCode verifyCode);
+
+    boolean validateVerifyCode(String type, String receiver, String code);
+
+}

+ 22 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/WechatService.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.UserWechat;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:15 2018/4/17
+ * @Modified By:
+ */
+public interface WechatService {
+
+    UserWechat findByOpenId(String openId);
+
+    UserWechat findByUnionId(String unionId);
+
+    UserWechat findByUserId(Long userId);
+
+    void save(UserWechat wechat);
+
+    void update(UserWechat wechat);
+}

+ 29 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/BankAccountInfoServiceImpl.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.BankAccountInfoDao;
+import cn.iselab.mooctest.user.model.BankAccountInfo;
+import cn.iselab.mooctest.user.service.BankAccountInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xuexb
+ * @Date: 2019.2.26 14:57
+ */
+@Service
+public class BankAccountInfoServiceImpl implements BankAccountInfoService {
+
+    @Autowired
+    BankAccountInfoDao bankAccountInfoDao;
+
+    @Override
+    public BankAccountInfo setBankAccountInfo(BankAccountInfo info) {
+        BankAccountInfo bankAccountInfo = bankAccountInfoDao.findBankAccountInfoByUserId(info.getUserId());
+        if(bankAccountInfo!=null){
+            info.setId(bankAccountInfo.getId());
+            return bankAccountInfoDao.save(info);
+        }else{
+            return bankAccountInfoDao.save(info);
+        }
+    }
+}

+ 40 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/ConfigurationServiceImpl.java

@@ -0,0 +1,40 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.ConfigurationDao;
+import cn.iselab.mooctest.user.model.Configuration;
+import cn.iselab.mooctest.user.service.ConfigurationService;
+import cn.iselab.mooctest.user.web.exception.ConfigurationNotExistException;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.IteratorUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @author guochao
+ */
+@Service
+public class ConfigurationServiceImpl implements ConfigurationService {
+    @Autowired
+    private ConfigurationDao configurationDao;
+
+    @Override
+    public String getPlatformNameConfiguration() throws ConfigurationNotExistException {
+        try{
+            Configuration configuration = configurationDao.findByName("platformName");
+            return configuration.getValue();
+        }catch (Exception e){
+            throw new ConfigurationNotExistException("数据库中无平台名称platformName的配置项");
+        }
+
+    }
+
+    @Override
+    public Map<String, String> getConfiguration() {
+       return Lists.newArrayList(configurationDao.findAll()).stream().collect(Collectors.toMap(configuration -> configuration.getName(), configuration -> configuration.getValue()));
+    }
+}
+

+ 139 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/IntegralServiceImpl.java

@@ -0,0 +1,139 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.IntegralMapper;
+import cn.iselab.mooctest.user.mapper.User2IntegralDao;
+import cn.iselab.mooctest.user.mapper.UserIntegralMapper;
+import cn.iselab.mooctest.user.model.Integral;
+import cn.iselab.mooctest.user.model.User2Integral;
+import cn.iselab.mooctest.user.model.UserIntegral;
+import cn.iselab.mooctest.user.service.IntegralService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.domain.Specifications;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午6:36 2018/2/13
+ * @Modified By:
+ */
+@Service
+public class IntegralServiceImpl implements IntegralService {
+
+    @Autowired
+    UserIntegralMapper userIntegralMapper;
+
+    @Autowired
+    User2IntegralDao user2IntegralDao;
+
+    @Autowired
+    IntegralMapper integralMapper;
+
+    @Override
+    public UserIntegral findByUserId(long userId){
+        List<UserIntegral> userIntegrals= userIntegralMapper.findByUserId(userId);
+        if(userIntegrals!=null && userIntegrals.size()>0){
+            return userIntegrals.get(0);
+        }else {
+            return null;
+        }
+    }
+
+    @Override
+    public UserIntegral saveIntegral(UserIntegral userIntegral){
+        userIntegralMapper.save(userIntegral);
+        return userIntegral;
+    }
+
+    @Override
+    public UserIntegral updateIntegral(UserIntegral userIntegral){
+        userIntegralMapper.update(userIntegral);
+        return userIntegral;
+    }
+
+    @Override
+    public List<UserIntegral> findPage(String keyword){
+        return userIntegralMapper.findAll();
+    }
+
+    @Override
+    public List<User2Integral> findByTime(long userId, long startTime, long endTime){
+        Specifications<User2Integral> where=Specifications.where(getUser2Integral(new Timestamp(startTime),new Timestamp(endTime)));
+        return user2IntegralDao.findAll(where);
+    }
+
+    @Override
+    public User2Integral saveUser2Integral(User2Integral user2Integral){
+        return user2IntegralDao.save(user2Integral);
+    }
+
+    @Override
+    public List<Integral> findIntegrals(){
+        return integralMapper.findAll();
+    }
+
+    @Override
+    public User2Integral findIntegralBySource(String source,long userId){
+        Specifications<User2Integral> where=Specifications.where(checkIntegral(source,userId));
+        List<User2Integral> user2Integrals= user2IntegralDao.findAll(where);
+        return user2Integrals.size()>0?user2Integrals.get(0):null;
+    }
+
+    @Override
+    public List<User2Integral> findUserIntegralCaught(long userId, long type, String source) {
+        return user2IntegralDao.findByUserIdAndAndTypeAndSource(userId, type, source);
+    }
+
+    private Specification<User2Integral> getUser2Integral(Timestamp startTime, Timestamp endTime){
+        return new Specification<User2Integral>() {
+            @Override
+            public Predicate toPredicate(Root<User2Integral> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+                Predicate p=criteriaBuilder.conjunction();
+                p.getExpressions()
+                        .add(criteriaBuilder.lessThan(root.get("createTime"),endTime));
+                p.getExpressions()
+                        .add(criteriaBuilder.greaterThan(root.get("createTime"),startTime));
+                return p;
+            }
+        };
+    }
+
+    private Specification<User2Integral> checkIntegral(String source, long userId){
+        return new Specification<User2Integral>() {
+            @Override
+            public Predicate toPredicate(Root<User2Integral> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+                Predicate p=criteriaBuilder.conjunction();
+                if (source!=null) {
+                    p.getExpressions()
+                            .add(criteriaBuilder.equal(root.get("source"), source));
+                }
+                p.getExpressions()
+                        .add(criteriaBuilder.equal(root.get("userId"),userId));
+                Date date=new Date();
+                SimpleDateFormat time=new SimpleDateFormat("yyyy MM dd");
+                SimpleDateFormat sdfmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Timestamp start,end;
+                try {
+                    start=new Timestamp(time.parse(time.format(date)).getTime());
+                    end=new Timestamp(time.parse(time.format(date)).getTime()+86400000);
+                }catch (ParseException e){
+                    return p;
+                }
+                p.getExpressions()
+                        .add(criteriaBuilder.between(root.get("createTime"),start,end));
+                return p;
+            }
+        };
+    }
+}

+ 133 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MailServiceImpl.java

@@ -0,0 +1,133 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.configure.MailProperties;
+import cn.iselab.mooctest.user.constants.VerifyConstants;
+import cn.iselab.mooctest.user.service.ConfigurationService;
+import cn.iselab.mooctest.user.service.MailService;
+import cn.iselab.mooctest.user.web.exception.ConfigurationNotExistException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Service;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 18-12-25$ 下午5:01$
+ */
+@Service
+public class MailServiceImpl implements MailService {
+
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private JavaMailSender mailSender;
+
+    @Autowired
+    TemplateEngine templateEngine;
+
+    @Autowired
+    MailProperties mailProperties;
+
+    private static ArrayList<String> adminEmails = new ArrayList<>();
+
+    @Autowired
+    private ConfigurationService configurationService;
+
+    // static {
+    //     adminEmails.add("zychen@nju.edu.cn");
+    //     adminEmails.add("chrong.fang@gmail.com");
+    //     adminEmails.add("xujianfeng@mooctest.com");
+    //     adminEmails.add("huangyong@mooctest.com");
+    // }
+    static {
+        adminEmails.add("171256175@qq.com");
+        adminEmails.add("xuexiaobo.dlmu@gmail.com");
+    }
+
+
+    @Override
+    public void sendNormalEmail(String sender, String receiver, String subject, String content) {
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setSubject(subject);
+        message.setText(content);
+        message.setTo(receiver);
+        message.setFrom(sender);
+
+        mailSender.send(message);
+    }
+
+    @Override
+    public void sendHtmlEmail(String sender, String receiver, String subject, String content) throws MessagingException {
+        String senderName = getPlatformName();
+        MimeMessage message = mailSender.createMimeMessage();
+        MimeMessageHelper helper = new MimeMessageHelper(message,true);
+        try {
+            helper.setFrom(sender, senderName);
+        } catch (UnsupportedEncodingException e) {
+            logger.error("设置发件人名称出错", e);
+        }
+        helper.setTo(receiver);
+        helper.setSubject(subject);
+        helper.setText(content, true);
+        mailSender.send(message);
+
+    }
+
+
+
+    @Override
+    public void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException {
+        Context context = new Context();
+        context.setVariable("verifyCode", code);
+        String emailContent = templateEngine.process("email/verify_mail", context);
+
+        String senderName = getPlatformName();
+        sendHtmlEmail(sender,receiver, "【验证码-" + senderName + "】", emailContent);
+    }
+
+    private String getPlatformName() {
+        String senderName = VerifyConstants.SENDER_NAME;
+        try {
+            senderName = configurationService.getPlatformNameConfiguration();
+        } catch (ConfigurationNotExistException e) {
+            e.printStackTrace();
+        }
+        return senderName;
+    }
+
+    @Override
+    public void sendArrearsEmail() {
+        Context context = new Context();
+        context.setVariable("message", "平台所使用的短信服务可能已欠费,请尽快前往充值");
+        context.setVariable("rechargeUrl", "http://www.yuntongxun.com/");
+        String emailContent = templateEngine.process("email/arrears_mail", context);
+        MimeMessage message = mailSender.createMimeMessage();
+        String[] receivers = adminEmails.toArray(new String[adminEmails.size()]);
+
+        String senderName = getPlatformName();
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(message,true);
+            helper.setFrom(mailProperties.getUsername(), senderName);
+            helper.setTo(receivers);
+            helper.setSubject("【" + senderName + "】短信服务欠费通知");
+            helper.setText(emailContent, true);
+        } catch (UnsupportedEncodingException e) {
+            logger.error("设置发件人名称时编码出错", e);
+        } catch (MessagingException e){
+            logger.error("设置发件人信息出错", e);
+        }
+
+        mailSender.send(message);
+    }
+}

+ 73 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MedalServiceImpl.java

@@ -0,0 +1,73 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.MedalMapper;
+import cn.iselab.mooctest.user.mapper.User2MedalDao;
+import cn.iselab.mooctest.user.model.Medal;
+import cn.iselab.mooctest.user.model.User2Medal;
+import cn.iselab.mooctest.user.service.MedalService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午6:52 2018/2/13
+ * @Modified By:
+ */
+@Service
+public class MedalServiceImpl implements MedalService {
+
+    @Autowired
+    MedalMapper medalMapper;
+
+    @Autowired
+    User2MedalDao user2MedalDao;
+
+    @Override
+    public Medal saveMedal(Medal medal){
+        medalMapper.save(medal);
+        return medal;
+    }
+
+    @Override
+    public Medal updateMedal(Medal medal){
+        medalMapper.update(medal);
+        return medal;
+    }
+
+    @Override
+    public Medal findById(long id){
+        return medalMapper.findById(id);
+    }
+
+    @Override
+    public User2Medal saveUser2Medal(User2Medal medal){
+        return user2MedalDao.save(medal);
+    }
+
+    @Override
+    public User2Medal findByUserIdAndMedalId(long userId, long medalId){
+        List<User2Medal> user2Medals = user2MedalDao.findByUserIdAndMedalId(userId,medalId);
+        if(user2Medals!=null && user2Medals.size()>0){
+            return user2Medals.get(0);
+        }else {
+            return null;
+        }
+    }
+
+    @Override
+    public List<User2Medal> findByPage(long userId){
+        return user2MedalDao.findByUserId(userId);
+    }
+
+    @Override
+    public List<Medal> findByKeyword(String word){
+        if (word==null) {
+            word = "";
+        }
+        return medalMapper.findAll(word);
+    }
+
+}

+ 81 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/ThirdPartyAuthServiceImpl.java

@@ -0,0 +1,81 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.configure.ThirdPartyAuthConfiguration;
+import cn.iselab.mooctest.user.data.UserInfo;
+import cn.iselab.mooctest.user.mapper.UserThirdPartyDao;
+import cn.iselab.mooctest.user.model.UserThirdParty;
+import cn.iselab.mooctest.user.service.ThirdPartyAuthService;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+
+
+/**
+ * @Description: 第三方验证服务
+ * @Author: xuexb
+ * @CreateDate: 19-1-8$ 上午1:23$
+ */
+@Service
+public class ThirdPartyAuthServiceImpl implements ThirdPartyAuthService {
+
+    Logger logger = LoggerFactory.getLogger(ThirdPartyAuthServiceImpl.class);
+
+    @Autowired
+    RestTemplate restTemplate;
+
+    @Autowired
+    HttpEntity<String> entity;
+
+    @Autowired
+    UserThirdPartyDao userThirdPartyDao;
+
+    @Override
+    public String getAccessToken(String url, String code) {
+        String result = "";
+        try{
+            url = url.replace("CODE", code);
+            result = restTemplate.exchange(url, HttpMethod.GET, entity, String.class).getBody();
+        }catch (Exception e){
+            logger.error("获取access_token出错", e);
+        }
+        JSONObject object = new JSONObject(result);
+        String accessToken = object.getString("access_token");
+        logger.info("accessToken: "+ accessToken);
+        return accessToken;
+    }
+
+    @Override
+    public UserInfo getGithubUserInfo(String url, String accessToken) {
+        url = url.replace("ACCESSTOKEN", accessToken);
+        String tmp = restTemplate.exchange(url, HttpMethod.GET, entity, String.class).getBody();
+//        String result = restTemplate.getForObject(url ,String.class);
+        JSONObject result = new JSONObject(tmp);
+        UserInfo userInfo = new UserInfo();
+        userInfo.setNickname(result.getString("login"));
+        userInfo.setHeadimgurl(result.getString("avatar_url"));
+        userInfo.setThirdPartyId(""+result.getLong("id"));
+        return userInfo;
+    }
+
+    @Override
+    public UserThirdParty findByThirdIdAndType(String identity, String type) {
+        return userThirdPartyDao.findByThirdPartyIdentityAndType(identity, type);
+    }
+
+    @Override
+    public UserThirdParty save(UserThirdParty userThirdParty) {
+        return userThirdPartyDao.save(userThirdParty);
+    }
+
+    @Override
+    public List<UserThirdParty> findByUserId(Long userId) {
+        return userThirdPartyDao.findByUserId(userId);
+    }
+}

+ 105 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/UserServiceImpl.java

@@ -0,0 +1,105 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.OperationRecordDao;
+import cn.iselab.mooctest.user.mapper.UserMapper;
+import cn.iselab.mooctest.user.model.OperationRecord;
+import cn.iselab.mooctest.user.model.User;
+import cn.iselab.mooctest.user.service.UserService;
+import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sean
+ * @date 2018-03-04.
+ */
+@Service
+@Log
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private OperationRecordDao operationRecordDao;
+
+    @Override
+    public User findByEmail(String email) {
+        return userMapper.findByEmail(email);
+    }
+
+    @Override
+    public User findByMobile(String mobile) {
+        return userMapper.findByMobile(mobile);
+    }
+
+    @Override
+    public User register(User user) {
+        String email = user.getEmail();
+        userMapper.insert(user);
+        log.info(String.format("register user. name=%s, email=%s, mobile=%s, school=%s", user.getName(),
+                user.getEmail(), user.getMobile(), user.getSchool()));
+        user = userMapper.findByEmail(email);
+        return user;
+    }
+
+    @Override
+    public User findById(Long userId) {
+        return userMapper.findById(userId);
+    }
+
+    @Override
+    public User update(User user) {
+        userMapper.updateAddress(user);
+        userMapper.updateAvailability(user);
+        userMapper.updateEmail(user);
+        userMapper.updateMobile(user);
+        userMapper.updatePassword(user);
+        userMapper.updatePhotoUrl(user);
+        userMapper.updateName(user);
+        return userMapper.findById(user.getId());
+    }
+
+    @Override
+    public OperationRecord recordOperation(OperationRecord record) {
+        return operationRecordDao.save(record);
+    }
+
+    @Override
+    public List<User> findByFuzzyName(String name) {
+        return userMapper.findByFuzzyName(name);
+    }
+
+    @Override
+    public List<User> findByFuzzyEmail(String email) {
+        return userMapper.findByFuzzyEmail(email);
+    }
+
+    @Override
+    public List<User> findByFuzzyNameOrEmail(String keyword) {
+        return userMapper.findByFuzzyNameOrEmail(keyword);
+    }
+
+    @Override
+    public List<User> findAll(List<Long> userIds) {
+//        List<User> users = new ArrayList<>();
+//        for (Long id : userIds) {
+//            users.add(userMapper.findById(id));
+//        }
+
+        return userMapper.findAllUsers(userIds);
+    }
+
+    @Override
+    public List<User> findAllByEmails(List<String> emails) {
+        List<User> users = new ArrayList<>();
+        for (String s : emails) {
+            users.add(userMapper.findByEmail(s));
+        }
+        return users;
+    }
+}

+ 39 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/VerifyCodeServiceImpl.java

@@ -0,0 +1,39 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.VerifyCodeDao;
+import cn.iselab.mooctest.user.model.VerifyCode;
+import cn.iselab.mooctest.user.service.VerifyCodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:32
+ */
+@Service
+public class VerifyCodeServiceImpl implements VerifyCodeService {
+
+    @Autowired
+    private VerifyCodeDao verifyCodeDao;
+
+    @Override
+    public VerifyCode getLatestVerifyCode(String type, String receiver) {
+        return verifyCodeDao.findTop1ByTypeAndReceiverOrderByCreateTimeDesc(type, receiver);
+    }
+
+    @Override
+    public VerifyCode saveVerifyCode(VerifyCode verifyCode) {
+        return verifyCodeDao.save(verifyCode);
+    }
+
+    @Override
+    public boolean validateVerifyCode(String type, String receiver, String code) {
+        VerifyCode latestVerifyCode = getLatestVerifyCode(type, receiver);
+        if (latestVerifyCode != null &&
+                latestVerifyCode.getExpiredTime().getTime() > System.currentTimeMillis() &&
+                (latestVerifyCode.getCode().equals(code))){
+            return true;
+        }
+        return false;
+    }
+}

+ 45 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/WechatServiceImpl.java

@@ -0,0 +1,45 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.UserWechatMapper;
+import cn.iselab.mooctest.user.model.UserWechat;
+import cn.iselab.mooctest.user.service.WechatService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:15 2018/4/17
+ * @Modified By:
+ */
+@Service
+public class WechatServiceImpl implements WechatService {
+
+    @Autowired
+    UserWechatMapper wechatMapper;
+
+    @Override
+    public UserWechat findByOpenId(String openId){
+        return wechatMapper.findByOpenId(openId);
+    }
+
+    @Override
+    public UserWechat findByUnionId(String unionId){
+        return wechatMapper.findByUnionId(unionId);
+    }
+
+    @Override
+    public UserWechat findByUserId(Long userId){
+        return wechatMapper.findByUserId(userId);
+    }
+
+    @Override
+    public void save(UserWechat wechat){
+        wechatMapper.save(wechat);
+    }
+
+    @Override
+    public void update(UserWechat wechat){
+        wechatMapper.update(wechat);
+    }
+}

+ 147 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/EncryptionUtil.java

@@ -0,0 +1,147 @@
+package cn.iselab.mooctest.user.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+public class EncryptionUtil {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EncryptionUtil.class);
+
+
+    // 定义 加密算法,可用 DES,DESede,Blowfish
+    private static String Algorithm = "DES";
+    private static String defaultKey = "witest.net";
+
+
+    public static String encryptMD5(String str) {
+        String s = str;
+        if (s == null) {
+            return "";
+        } else {
+            String value = null;
+            MessageDigest md5 = null;
+            try {
+                md5 = MessageDigest.getInstance("MD5");
+            } catch (NoSuchAlgorithmException ex) {
+                LOG.error("", ex);
+            }
+            sun.misc.BASE64Encoder baseEncoder = new sun.misc.BASE64Encoder();
+            try {
+                value = baseEncoder.encode(md5.digest(s.getBytes("utf-8")));
+            } catch (Exception ex) {
+            }
+            return value;
+        }
+    }
+
+    public static String encryptDES(String content) throws Exception {
+        return encryptDES(content, defaultKey);
+    }
+
+    public static String decryptDES(String content) throws Exception {
+        return decryptDES(content, defaultKey);
+    }
+
+
+    /**
+     * Description 根据键值进行加密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    public static String encryptDES(String data, String key) throws Exception {
+        byte[] bt = encryptDES(data.getBytes(), key.getBytes());
+        String strs = new BASE64Encoder().encode(bt);
+        return strs;
+    }
+
+    /**
+     * Description 根据键值进行解密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws IOException
+     * @throws Exception
+     */
+    public static String decryptDES(String data, String key) throws IOException,
+            Exception {
+        if (data == null)
+            return null;
+        BASE64Decoder decoder = new BASE64Decoder();
+        byte[] buf = decoder.decodeBuffer(data);
+        byte[] bt = decryptDES(buf, key.getBytes());
+        return new String(bt);
+    }
+
+    /**
+     * Description 根据键值进行加密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    private static byte[] encryptDES(byte[] data, byte[] key) throws Exception {
+        // 生成一个可信任的随机数源
+        SecureRandom sr = new SecureRandom();
+
+        // 从原始密钥数据创建DESKeySpec对象
+        DESKeySpec dks = new DESKeySpec(key);
+
+        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm);
+        SecretKey securekey = keyFactory.generateSecret(dks);
+
+        // Cipher对象实际完成加密操作
+        Cipher cipher = Cipher.getInstance(Algorithm);
+
+        // 用密钥初始化Cipher对象
+        cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
+
+        return cipher.doFinal(data);
+    }
+
+
+    /**
+     * Description 根据键值进行解密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    private static byte[] decryptDES(byte[] data, byte[] key) throws Exception {
+        // 生成一个可信任的随机数源
+        SecureRandom sr = new SecureRandom();
+
+        // 从原始密钥数据创建DESKeySpec对象
+        DESKeySpec dks = new DESKeySpec(key);
+
+        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm);
+        SecretKey securekey = keyFactory.generateSecret(dks);
+
+        // Cipher对象实际完成解密操作
+        Cipher cipher = Cipher.getInstance(Algorithm);
+
+        // 用密钥初始化Cipher对象
+        cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
+
+        byte[] bytes = cipher.doFinal(data);
+        return bytes;
+    }
+}

+ 129 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/HttpClientUtils.java

@@ -0,0 +1,129 @@
+package cn.iselab.mooctest.user.util;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import ytx.org.apache.http.conn.ssl.X509HostnameVerifier;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.security.GeneralSecurityException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午8:25 2018/4/2
+ * @Modified By:
+ */
+public class HttpClientUtils {
+
+    public static final int connTimeout=10000;
+    public static final int readTimeout=10000;
+    public static final String charset="UTF-8";
+    private static HttpClient client = null;
+
+    static {
+        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
+        cm.setMaxTotal(128);
+        cm.setDefaultMaxPerRoute(128);
+        client = HttpClients.custom().setConnectionManager(cm).build();
+    }
+
+    public static String get(String url, String charset) throws Exception {
+        return get(url, charset, connTimeout, readTimeout);
+    }
+
+    public static String get(String url, String charset, Integer connTimeout,Integer readTimeout)
+            throws ConnectTimeoutException,SocketTimeoutException, Exception {
+
+        HttpClient client = null;
+        HttpGet get = new HttpGet(url);
+        String result = "";
+        try {
+            // 设置参数
+            RequestConfig.Builder customReqConf = RequestConfig.custom();
+            if (connTimeout != null) {
+                customReqConf.setConnectTimeout(connTimeout);
+            }
+            if (readTimeout != null) {
+                customReqConf.setSocketTimeout(readTimeout);
+            }
+            get.setConfig(customReqConf.build());
+
+            HttpResponse res = null;
+
+            if (url.startsWith("https")) {
+                // 执行 Https 请求.
+                client = createSSLInsecureClient();
+                res = client.execute(get);
+            } else {
+                // 执行 Http 请求.
+                client = HttpClientUtils.client;
+                res = client.execute(get);
+            }
+
+            result = IOUtils.toString(res.getEntity().getContent(), charset);
+        } finally {
+            get.releaseConnection();
+            if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) {
+                ((CloseableHttpClient) client).close();
+            }
+        }
+        return result;
+    }
+
+    private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException {
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
+
+                @Override
+                public boolean verify(String arg0, SSLSession arg1) {
+                    return true;
+                }
+
+                @Override
+                public void verify(String host, SSLSocket ssl)
+                        throws IOException {
+                }
+
+                @Override
+                public void verify(String host, X509Certificate cert)
+                        throws SSLException {
+                }
+
+                @Override
+                public void verify(String host, String[] cns,
+                                   String[] subjectAlts) throws SSLException {
+                }
+
+            });
+
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+
+        } catch (GeneralSecurityException e) {
+            throw e;
+        }
+    }
+
+}

+ 116 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/MSUtil.java

@@ -0,0 +1,116 @@
+package cn.iselab.mooctest.user.util;
+
+import cn.iselab.mooctest.user.constants.VerifyConstants;
+import com.cloopen.rest.sdk.CCPRestSmsSDK;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 13:02
+ */
+@Component
+public class MSUtil {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MSUtil.class);
+
+    private static String accountSid;
+
+    private static String accountToken;
+
+    private static String appId;
+
+    @Value("${mobile.accountSid}")
+    public void setAccountSid(String accountSid) {
+        MSUtil.accountSid = accountSid;
+    }
+
+    @Value("${mobile.accountToken}")
+    public void setAccountToken(String accountToken) {
+        MSUtil.accountToken = accountToken;
+    }
+
+    @Value("${mobile.appId}")
+    public void setAppId(String appId) {
+        MSUtil.appId = appId;
+    }
+
+    /**
+     * @param receiver
+     * @return null if failed vericode if success
+     */
+    public static String sendSmsVerification(String receiver, String veriCode) {
+
+        // send short message by invoking SDK
+        // HashMap<String, Object> result = sendSMSSDK(receiver, VerifyConstants.SMS_VERI_TEMPLATE_ID, veriCode, "5分钟");
+        HashMap<String, Object> result = sendSMSSDK(receiver, "73686", veriCode, "5");
+        // Check return result to see if process success
+        if ("000000".equals(result.get("statusCode"))) {
+            // success
+
+            return (String)result.get("statusCode");
+        } else {
+            // fail, output stats code and message
+            LOG.error("[SMS] Sending short message to " + receiver + " failed.");
+            LOG.error("[SMS] SMS Error code=" + result.get("statusCode") + "  with information= "
+                    + result.get("statusMsg"));
+
+            return (String)result.get("statusCode");
+        }
+    }
+
+    private static HashMap<String, Object> sendSMSSDK(String receiver, String templateID, String... args) {
+        HashMap<String, Object> result = null;
+
+        // Initialize SDK
+        CCPRestSmsSDK restAPI = new CCPRestSmsSDK();
+
+        // Initialize remote server and port
+        // * Sandbox: restAPI.init("sandboxapp.cloopen.com", "8883");
+        // * Production: restAPI.init("app.cloopen.com", "8883");
+        restAPI.init("app.cloopen.com", "8883");
+
+        // Initialize ACCOUNT SID & AUTH TOKEN
+        // * Can be found by viewing developer's account in `Console` on
+        // * website(http://www.yuntongxun.com)
+        // restAPI.setAccount("aaf98f89521b91a301522abe22af1760", "356fff5595a14e32a2bc2856cc0f0f5a");
+        restAPI.setAccount(accountSid, accountToken);
+        // Initialize Target
+        // * Can be found in Console:
+        // * "Application - application list - specific app"
+        restAPI.setAppId(appId);
+
+        // Send SMS
+        // * @Parameters
+        // * @Parameter(0)
+        // * phone number of receiver(split by ',', can support at most 100
+        // numbers)
+        // * @Parameter(1)
+        // * template id(by default 1), can be found in `Console`
+        // * @Parameter(2)
+        // * An array consists of {verify_code, timeout}
+        result = restAPI.sendTemplateSMS(receiver, templateID, args);
+
+        LOG.error("[SMS] SMS Verification result=" + result);
+
+        return result;
+    }
+
+    public static String generateRandomVeriCode() {
+        int veriCode = (int) Math.round(100000 + Math.random() * 899999);
+        return String.valueOf(veriCode);
+    }
+
+    public static boolean isMobileNO(String mobiles) {
+        Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9])|(14[5,7])| (17[0,1,3,5-8]))\\d{8}$");
+        Matcher m = p.matcher(mobiles);
+        return m.matches();
+    }
+
+}

+ 213 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/OSSUtil.java

@@ -0,0 +1,213 @@
+package cn.iselab.mooctest.user.util;
+
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.PutObjectResult;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.UUID;
+
+@Component
+public class OSSUtil {
+    private static OSSClient instance;
+
+    private OSSUtil() {
+    }
+
+    /**
+     * 单例
+     * @return  OSS工具类实例
+     */
+    private OSSClient getOSSClient() {
+        if (instance == null) {
+            synchronized (OSSUtil.class) {
+                if (instance == null) {
+                    instance = new OSSClient(OSS_END_POINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
+                }
+            }
+        }
+        return instance;
+    }
+
+    //定义日志
+    private static Logger logger = LoggerFactory.getLogger(OSSUtil.class);
+
+    //OSS 的地址
+    @Value("${oss.endPoint}")
+    private String OSS_END_POINT;
+
+    //OSS 的key值
+    @Value("${oss.accessKeyId}")
+    private String OSS_ACCESS_KEY_ID;
+
+    //OSS 的secret值
+    @Value("${oss.accessKeySecret}")
+    private String OSS_ACCESS_KEY_SECRET;
+
+    //OSS 的bucket名字
+    @Value("${oss.bucketName}")
+    private String OSS_BUCKET_NAME;
+
+    //设置URL过期时间为10年
+    private Date OSS_URL_EXPIRATION = DateUtils.addDays(new Date(), 365 * 10);
+
+    //文件路径的枚举
+    public enum FileDirType {
+        BANKINFO("bankinfo/");
+        private String dir;
+
+        FileDirType(String dir) {
+            this.dir = dir;
+        }
+
+        @JsonValue
+        public String getDir() {
+            return dir;
+        }
+    }
+
+    /**
+     * 上传文件---去除URL中的?后的时间戳
+     * @param file 文件
+     * @param fileDir 上传到OSS上文件的路径
+     * @return 文件的访问地址
+     */
+    public String upload(MultipartFile file, FileDirType fileDir) {
+        this.createBucket();
+        String fileName = this.uploadFile(file, fileDir);
+        String fileOssURL = this.getImgUrl(fileName, fileDir);
+        int firstChar = fileOssURL.indexOf("?");
+        if (firstChar > 0) {
+            fileOssURL = fileOssURL.substring(0, firstChar);
+        }
+        return fileOssURL;
+    }
+
+
+    /**
+     * 当Bucket不存在时创建Bucket
+     *
+     * @throws OSSException 异常
+     * @throws ClientException Bucket命名规则:
+     *                         1.只能包含小写字母、数字和短横线,
+     *                         2.必须以小写字母和数字开头和结尾
+     *                         3.长度在3-63之间
+     */
+    private void createBucket() {
+        try {
+            logger.info("\n\n"+OSS_BUCKET_NAME+"\n\n");
+            if (!this.getOSSClient().doesBucketExist(OSS_BUCKET_NAME)) {//判断是否存在该Bucket,不存在时再重新创建
+                this.getOSSClient().createBucket(OSS_BUCKET_NAME);
+            }
+        } catch (Exception e) {
+            logger.error("{}", "创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");
+            throw new RuntimeException("创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");
+        }
+    }
+
+
+    /**
+     * 上传到OSS服务器  如果同名文件会覆盖服务器上的
+     * @param file 文件
+     * @param fileDir  上传到OSS上文件的路径
+     * @return 文件的访问地址
+     */
+    private String uploadFile(MultipartFile file, FileDirType fileDir) {
+        String fileName = String.format(
+                "%s.%s",
+                UUID.randomUUID().toString(),
+                FilenameUtils.getExtension(file.getOriginalFilename()));
+        try (InputStream inputStream = file.getInputStream()) {
+            //创建上传Object的Metadata
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentLength(inputStream.available());
+            objectMetadata.setCacheControl("no-cache");
+            objectMetadata.setHeader("Pragma", "no-cache");
+            objectMetadata.setContentType(getContentType(FilenameUtils.getExtension("." + file.getOriginalFilename())));
+            objectMetadata.setContentDisposition("inline;filename=" + fileName);
+            //上传文件
+            logger.info("\n\n"+OSS_BUCKET_NAME+"\n\n");
+            PutObjectResult putResult = this.getOSSClient().putObject(OSS_BUCKET_NAME, fileDir.getDir() + fileName, inputStream, objectMetadata);
+            return fileName;
+        } catch (Exception e) {
+            logger.error("{}", "上传文件失败");
+            throw new RuntimeException("上传文件失败");
+        }
+    }
+
+
+    /**
+     * 获得文件路径
+     * @param fileUrl  文件的URL
+     * @param fileDir  文件在OSS上的路径
+     * @return 文件的路径
+     */
+    private String getImgUrl(String fileUrl, FileDirType fileDir) {
+        if (StringUtils.isEmpty(fileUrl)) {
+            logger.error("{}", "文件地址为空");
+            throw new RuntimeException("文件地址为空");
+        }
+        String[] split = fileUrl.split("/");
+
+        //获取oss图片URL失败
+        URL url = this.getOSSClient().generatePresignedUrl(OSS_BUCKET_NAME, fileDir.getDir() + split[split.length - 1], OSS_URL_EXPIRATION);
+        if (url == null) {
+            logger.error("{}", "获取oss文件URL失败");
+            throw new RuntimeException("获取oss文件URL失败");
+        }
+        return url.toString();
+    }
+
+    /**
+     * 判断OSS服务文件上传时文件的contentType
+     *
+     * @param FilenameExtension 文件后缀
+     * @return 后缀
+     */
+    private String getContentType(String FilenameExtension) {
+        if (FilenameExtension.equalsIgnoreCase("bmp")) {
+            return "image/bmp";
+        }
+        if (FilenameExtension.equalsIgnoreCase("gif")) {
+            return "image/gif";
+        }
+        if (FilenameExtension.equalsIgnoreCase("jpeg") ||
+                FilenameExtension.equalsIgnoreCase("jpg") ||
+                FilenameExtension.equalsIgnoreCase("png")) {
+            return "image/jpeg";
+        }
+        if (FilenameExtension.equalsIgnoreCase("html")) {
+            return "text/html";
+        }
+        if (FilenameExtension.equalsIgnoreCase("txt")) {
+            return "text/plain";
+        }
+        if (FilenameExtension.equalsIgnoreCase("vsd")) {
+            return "application/vnd.visio";
+        }
+        if (FilenameExtension.equalsIgnoreCase("pptx") ||
+                FilenameExtension.equalsIgnoreCase("ppt")) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (FilenameExtension.equalsIgnoreCase("docx") ||
+                FilenameExtension.equalsIgnoreCase("doc")) {
+            return "application/msword";
+        }
+        if (FilenameExtension.equalsIgnoreCase("xml")) {
+            return "text/xml";
+        }
+        return "image/jpeg";
+    }
+}

+ 69 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/WechatUtil.java

@@ -0,0 +1,69 @@
+package cn.iselab.mooctest.user.util;
+
+import cn.iselab.mooctest.rpc.user.data.WechatUserInfoDTO;
+import cn.iselab.mooctest.user.data.Token;
+import cn.iselab.mooctest.user.data.UserInfo;
+import com.google.gson.Gson;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午4:41 2018/4/2
+ * @Modified By:
+ */
+public class WechatUtil {
+
+    protected final static Logger LOG = LoggerFactory.getLogger(WechatUtil.class);
+
+    public final static String base_url="https://api.weixin.qq.com/sns/";
+
+    public final static String token_url=base_url+"oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+
+    public final static String refresh_url=base_url+"oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
+
+    public final static String user_info_url=base_url+"userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
+
+    public static Token getToken(String appId, String appSecret, String code) {
+        Token token = new Token();
+        LOG.info("Ready to get the token");
+        String result="";
+        try {
+            String url = token_url.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
+            result = HttpClientUtils.get(url.toString(), "UTF-8");
+        }catch (Exception e){
+            LOG.error("获取token失败:"+e.getMessage());
+        }
+        JSONObject object=new JSONObject(result);
+        try {
+            LOG.info(object.toString());
+            token.setAccessToken(object.getString("access_token"));
+            token.setExpiresIn(object.getInt("expires_in"));
+            token.setRefresh_token(object.getString("refresh_token"));
+            token.setOpenId(object.getString("openid"));
+        }catch (Exception e){
+            LOG.error("获取token失败 errcode:" + object.getInt("errcode") + " errmsg:" + object.getString("errmsg"));
+        }
+        return token;
+    }
+
+
+
+    public static WechatUserInfoDTO getWxUser(String accessToken, String openid){
+        Gson gson=new Gson();
+        String result="";
+        try {
+            String url = user_info_url.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);
+            result = HttpClientUtils.get(url.toString(), "UTF-8");
+        }catch (Exception e){
+            LOG.error("获取token失败:"+e.getMessage());
+        }
+        WechatUserInfoDTO userInfo=gson.fromJson(result,WechatUserInfoDTO.class);
+        System.out.println("openId:"+userInfo.getOpenid());
+        System.out.println("unionId:"+userInfo.getUnionid());
+        System.out.println("nickname:"+userInfo.getNickname());
+        return userInfo;
+    }
+}

+ 16 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/BaseController.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.user.web.ctrl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:42 2018/2/13
+ * @Modified By:
+ */
+public class BaseController {
+
+    protected final Logger LOG = LoggerFactory.getLogger(getClass());
+
+}

+ 76 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/IntegralController.java

@@ -0,0 +1,76 @@
+package cn.iselab.mooctest.user.web.ctrl;
+
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
+import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
+import cn.iselab.mooctest.rpc.user.data.MedalDTO;
+import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
+import cn.iselab.mooctest.user.configure.IntegralMap;
+import cn.iselab.mooctest.user.constants.UrlConstants;
+import cn.iselab.mooctest.user.model.Integral;
+import cn.iselab.mooctest.user.web.logic.IntegralLogic;
+import cn.iselab.mooctest.user.web.logic.MedalLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午7:28 2018/2/12
+ * @Modified By:
+ */
+@RestController
+public class IntegralController extends BaseController{
+
+    @Autowired
+    IntegralLogic integralLogic;
+
+    @Autowired
+    MedalLogic medalLogic;
+
+    @Autowired
+    IntegralMap integralMap;
+
+    @RequestMapping(value = UrlConstants.API_INTEGRAL,method = RequestMethod.GET)
+    public List<IntegralCaughtDTO> getIntegrals(@RequestParam(value = "userId")Long userId,
+                                                @RequestParam(value = "startTime")Long startTime,
+                                                @RequestParam(value = "endTime")Long endTime,
+                                                HttpServletRequest request){
+        Integer activePage = Integer.parseInt(request.getHeader("activePage"));
+        Integer rowsOnPage = Integer.parseInt(request.getHeader("rowsOnPage"));
+        Sort sort=new Sort(Sort.Direction.DESC,"total");
+        Pageable pageable=new PageRequest(activePage-1, rowsOnPage,sort);
+        return integralLogic.getIntegralCaughts(userId,startTime,endTime);
+    }
+
+    @RequestMapping(value = UrlConstants.API_MEDAL,method = RequestMethod.GET)
+    public List<MedalDTO> getIntegrals(@RequestParam(value = "userId")Long userId,
+                                       @RequestParam(value = "keyword",required = false)String keyword,
+                                       HttpServletRequest request){
+        return medalLogic.getMedals(keyword,userId);
+    }
+
+    @RequestMapping(value = UrlConstants.API_MEDAL,method = RequestMethod.DELETE)
+    public MedalDTO getIntegrals(@RequestParam(value = "medalId")Long medalId,
+                                       HttpServletRequest request){
+        return medalLogic.getMedal(medalId);
+    }
+
+    @RequestMapping(value = UrlConstants.API_INTEGRAL,method = RequestMethod.PUT)
+    public Map<String, Integral> getIntegrals(){
+        return integralLogic.reloadIntegralMap();
+    }
+
+    @RequestMapping(value = "test",method = RequestMethod.GET)
+    public Map<String, Integral> getIntegralMap(){
+        return integralMap.getMap();
+    }
+}

+ 329 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/PageController.java

@@ -0,0 +1,329 @@
+package cn.iselab.mooctest.user.web.ctrl;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+import cn.iselab.mooctest.rpc.user.data.WechatUserInfoDTO;
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+import cn.iselab.mooctest.user.constants.UrlConstants;
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.data.UserInfo;
+import cn.iselab.mooctest.user.model.UserThirdParty;
+import cn.iselab.mooctest.user.service.ThirdPartyAuthService;
+import cn.iselab.mooctest.user.service.UserService;
+import cn.iselab.mooctest.user.util.EncryptionUtil;
+import cn.iselab.mooctest.user.web.data.UserVO;
+import cn.iselab.mooctest.user.web.logic.ThirdPartyLogic;
+import cn.iselab.mooctest.user.web.logic.UserLogic;
+import cn.iselab.mooctest.user.web.logic.WechatLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.net.URLDecoder;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.21 11:51
+ */
+@Controller
+public class PageController extends BaseController{
+
+    @Autowired
+    UserLogic userLogic;
+
+    @Autowired
+    ThirdPartyLogic thirdPartyLogic;
+
+    @Autowired
+    ThirdPartyAuthService thirdPartyAuthService;
+
+    @Autowired
+    WechatLogic wechatLogic;
+
+    @Value("${redirect.url}")
+    private String redirectUrl;
+
+
+    @RequestMapping(value = UrlConstants.PAGE + "login", method = RequestMethod.GET)
+    public String login(@RequestParam(value = "redirect", required = false)String redirect, HttpServletRequest request){
+        LOG.info("redirect:" + redirect);
+        String redirectUrl = "";
+        try {
+            redirectUrl = URLDecoder.decode(redirect, "UTF-8");
+        } catch (Exception e) {
+            LOG.error("redirectUrl 解码出错", e);
+            redirectUrl = null;
+        }
+        if (redirectUrl==null || redirectUrl.isEmpty() || !redirectUrl.startsWith("http")){
+            if (request.getSession().getAttribute("redirectURL")==null)
+                redirectUrl = UrlConstants.DEFAULT_GOTO;
+            else
+                redirectUrl = (String) request.getSession().getAttribute(("redirectURL"));
+        }
+        HttpSession session = request.getSession();
+        session.setAttribute("redirectURL", redirectUrl);
+        LOG.info("RedirectUrl: " + redirectUrl);
+        if (session.getAttribute("userId") != null){
+            LOG.info("用户已登录!用户ID"+session.getAttribute("userId"));
+            return "redirect: "+redirectUrl;
+        }
+        return "login";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "dologin", method = RequestMethod.POST)
+    public String checkLogin(Model model, UserDTO user, HttpServletRequest request, HttpServletResponse response){
+        ResponseResult<UserDTO> result = new ResponseResult<UserDTO>();
+        String password = EncryptionUtil.encryptMD5(user.getPassword());
+        user.setPassword(password);
+        result = userLogic.checkPWD(user);
+        if (result.getStatus().equals(ResponseStatus.SUCCESS)) {
+            HttpSession session = request.getSession();
+            session.setAttribute("userId", ((UserDTO)result.getData()).getId()+"");
+            session.setAttribute("userName", ((UserDTO)result.getData()).getEmail());
+            // return "redirect:http://www.mooctest.net/api/test/login";
+            LOG.info("(String)session.getAttribute(redirectURL) " + (String)session.getAttribute("redirectURL"));
+//            String afterLogin = session.getAttribute("redirectURL")==null?
+//                    UrlConstants.DEFAULT_GOTO:(String)session.getAttribute("redirectURL");
+            userLogic.recordLoginAction(request, ((UserDTO)result.getData()).getId() , "password");
+            LOG.info("redirectURL: "+redirectUrl);
+            LOG.info("userId: "+ session.getAttribute("userId"));
+            return "redirect:" + redirectUrl;
+        }
+        else{
+            model.addAttribute("result", result);
+            return "login";
+        }
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "mobile/login", method = RequestMethod.GET)
+    public String mobileLogin(){
+        return "mobile_login";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "mobile/dologin", method = RequestMethod.POST)
+    public String checkMobileLogin(Model model, UserVO userVO, HttpServletRequest request){
+        ResponseResult<UserDTO> result = userLogic.loginByMobile(userVO);
+        model.addAttribute("result", result);
+        if (result.getStatus() != ResponseStatus.SUCCESS){
+            return "mobile_login";
+        }
+        HttpSession session = request.getSession();
+        session.setAttribute("userId", ((UserDTO)result.getData()).getId()+"");
+        session.setAttribute("userName", ((UserDTO)result.getData()).getEmail());
+        userLogic.recordLoginAction(request, ((UserDTO)result.getData()).getId(), "mobile");
+        String redirectURL = (String) request.getSession().getAttribute("redirectURL");
+        redirectURL = redirectURL==null?UrlConstants.DEFAULT_GOTO:redirectURL;
+        return "redirect:"+redirectURL;
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "register", method = RequestMethod.GET)
+    public String register(){
+        return "register";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "doregister", method = RequestMethod.POST)
+    public String doRegister(Model model, UserVO userVO, HttpServletRequest request){
+        ResponseResult<UserDTO> result = new ResponseResult<>();
+        result = userLogic.registerAccount(userVO);
+        if (result.getStatus() != ResponseStatus.SUCCESS){
+            model.addAttribute("result", result);
+            return "register";
+        }
+        model.addAttribute("href", UrlConstants.GO_LOGIN);
+        return "success_page";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "login/github", method = RequestMethod.GET)
+    public String loginByGithub(@RequestParam("code")String code, Model model, HttpServletRequest request){
+        ResponseResult<Object> result = new ResponseResult<>();
+        LOG.info("code: " + code);
+        result = thirdPartyLogic.loginByGithub(code, request);
+        if (result.getStatus()==ResponseStatus.NOTFOUND){
+            UserInfo userInfo = (UserInfo) result.getData();
+            model.addAttribute("thirdPartyName", userInfo.getNickname());
+            model.addAttribute("thirdPartyId", userInfo.getThirdPartyId());
+            model.addAttribute("headImg", userInfo.getHeadimgurl());
+            model.addAttribute("from", "github");
+            return "third_party_bind";
+        }
+        HttpSession session = request.getSession();
+        UserDTO user = userLogic.getUserById(((UserThirdParty)result.getData()).getUserId());
+        session.setAttribute("userId", user.getId()+"");
+        session.setAttribute("userName", user.getEmail());
+        userLogic.recordLoginAction(request, user.getId(), "github");
+        String redirectUrl = (String)request.getSession().getAttribute("redirectURL");
+        if (redirectUrl==null || redirectUrl.isEmpty())
+            redirectUrl = UrlConstants.DEFAULT_GOTO;
+        return "redirect:"+redirectUrl;
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "login/wechat", method = RequestMethod.GET)
+    public String loginByWechat(@RequestParam("code")String code, Model model, HttpServletRequest request){
+        LOG.info("wechat_code: " + code);
+        UserWechatDTO userWechatDTO = wechatLogic.getUserByCode(code);
+        if(userWechatDTO.getType()==UserWechatDTO.NEW){
+            model.addAttribute("headImg",userWechatDTO.getUserInfo().getHeadimgurl());
+            model.addAttribute("thirdPartyName",userWechatDTO.getUserInfo().getNickname());
+            model.addAttribute("unionid",userWechatDTO.getUserInfo().getUnionid());
+            model.addAttribute("openid",userWechatDTO.getUserInfo().getOpenid());
+            model.addAttribute("from","wechat");
+            return "third_party_bind";
+        }
+        HttpSession session = request.getSession();
+        session.setAttribute("userId", userWechatDTO.getUser().getId()+"");
+        session.setAttribute("userName", userWechatDTO.getUser().getEmail());
+        userLogic.recordLoginAction(request,userWechatDTO.getUser().getId(), "wechat");
+        String redirectUrl = (String) session.getAttribute("redirectURL");
+        if (redirectUrl==null || redirectUrl.isEmpty())
+            redirectUrl = UrlConstants.DEFAULT_GOTO;
+        return "redirect:"+redirectUrl;
+    }
+
+
+
+    @RequestMapping(value = UrlConstants.PAGE + "thirdParty/bind", method = RequestMethod.POST)
+    public String thirdPartyBind(UserVO userVO, Model model, HttpServletRequest request){
+        UserVO user = userVO;
+        LOG.info(userVO.toString());
+        user.setPassword(EncryptionUtil.encryptMD5(user.getPassword()));
+        ResponseResult<UserDTO> result = userLogic.checkPWD(user);
+        if (result.getStatus()!=ResponseStatus.SUCCESS){
+            model.addAttribute("result", result);
+            model.addAttribute("thirdPartyName", userVO.getThirdPartyName());
+            model.addAttribute("thirdPartyId", userVO.getThirdPartyId());
+            model.addAttribute("headImg", userVO.getHeadImgUrl());
+            model.addAttribute("from", userVO.getFrom());
+            model.addAttribute("openid", userVO.getOpenid());
+            model.addAttribute("unionid", userVO.getUnionid());
+            return "third_party_bind";
+        }
+        UserDTO userToBind = (UserDTO) result.getData();
+        if(userVO.getFrom()=="wechat"){
+            UserWechatDTO userWechatDTO = new UserWechatDTO();
+            userWechatDTO.setUser(userToBind);
+            WechatUserInfoDTO wechatUserInfoDTO = new WechatUserInfoDTO();
+            wechatUserInfoDTO.setUnionid(userVO.getUnionid());
+            wechatUserInfoDTO.setOpenid(userVO.getOpenid());
+            userWechatDTO.setUserInfo(wechatUserInfoDTO);
+            wechatLogic.setUserWechat(userWechatDTO);
+            userLogic.recordUserOperation(request, userToBind.getId(), "bind to third party", "wechat");
+            userLogic.recordLoginAction(request, userToBind.getId(), "wechat");
+        }else {
+            UserThirdParty userThirdParty = new UserThirdParty();
+            userThirdParty.setThirdPartyIdentity(userVO.getThirdPartyId());
+            userThirdParty.setUserId(userToBind.getId());
+            userThirdParty.setType(userVO.getFrom());
+            userThirdParty.setIsDelete(0);
+            LOG.info(userThirdParty.getUserId()+"--"+userThirdParty.getThirdPartyIdentity()+"---"+userThirdParty.getType());
+            thirdPartyAuthService.save(userThirdParty);
+            userLogic.recordUserOperation(request, userToBind.getId(), "bind to third party", userThirdParty.getType());
+            userLogic.recordLoginAction(request, userToBind.getId(), userThirdParty.getType());
+        }
+        HttpSession session = request.getSession();
+        session.setAttribute("userId", ((UserDTO)result.getData()).getId()+"");
+        session.setAttribute("userName", ((UserDTO)result.getData()).getEmail());
+        String redirectUrl = (String)request.getSession().getAttribute("redirectURL");
+        if (redirectUrl==null || redirectUrl.isEmpty())
+            redirectUrl = UrlConstants.DEFAULT_GOTO;
+        return "redirect:"+redirectUrl;
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "uploadBankInfo", method = RequestMethod.GET)
+    public String uploadBankInfo(@RequestParam(value = "redirect", required = false)String redirect, Model model, HttpServletRequest request){
+        if (request.getSession().getAttribute("userId")==null){
+            model.addAttribute("message", "请登录后再进行操作!");
+            return "error_page";
+        }
+        if (redirect==null){
+            redirect = request.getSession().getAttribute("redirectURL")==null ?
+                    UrlConstants.DEFAULT_GOTO : (String) request.getSession().getAttribute("redirectURL");
+        } else{
+            try {
+                redirect = URLDecoder.decode(redirect, "UTF-8");
+            } catch (Exception e) {
+                LOG.error("redirectUrl 解码出错", e);
+                redirect = UrlConstants.DEFAULT_GOTO;
+            }
+        }
+        request.getSession().setAttribute("redirectURL", redirect);
+        return "upload_card_info";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "forgetPassword/mobile", method = RequestMethod.GET)
+    public String forgetPassword(){
+        return "forget_password_mobile";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "forgetPassword/email", method = RequestMethod.GET)
+    public String forgetPasswordByEmail(){
+        return "forget_password_email";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "forgetPassword/check/{type}", method = RequestMethod.POST)
+    public String foregetPasswordCheck(@PathVariable("type") String type, UserVO userVO, Model model){
+        ResponseResult<UserVO> result = userLogic.checkVerifyCode(userVO, type);
+        if (result.getStatus()!=ResponseStatus.SUCCESS){
+            model.addAttribute("result", result);
+            return "forget_password_"+type;
+        }
+        model.addAttribute("user", (UserVO)result.getData());
+        return "forget_password_reset";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "update/password", method = RequestMethod.GET)
+    public String updatePassword(@RequestParam(value = "redirect", required = false)String redirect, Model model, HttpServletRequest request){
+        if (request.getSession().getAttribute("userId")==null){
+            model.addAttribute("message", "请前往登录后再进行操作");
+            return "error_page";
+        }
+        userLogic.saveRedirectUrl(redirect, request);
+        return "reset_password";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "update/email", method = RequestMethod.GET)
+    public String updateEmail(Model model, HttpServletRequest request){
+        if (request.getSession().getAttribute("userId")==null){
+            model.addAttribute("message", "请前往登录后再进行操作");
+            return "error_page";
+        }
+        return "reset_email";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "update/mobile", method = RequestMethod.GET)
+    public String updateMobile(Model model, HttpServletRequest request){
+        if (request.getSession().getAttribute("userId")==null){
+            model.addAttribute("message", "请前往登录后再进行操作");
+            return "error_page";
+        }
+        return "reset_mobile";
+    }
+
+    @RequestMapping(value = UrlConstants.PAGE + "operation/success", method = RequestMethod.GET)
+    public String operationSuccess(Model model){
+        model.addAttribute("message", "操作成功!");
+        return "success_page";
+    }
+
+    @RequestMapping("error-404")
+    public String toPage404(Model model){
+        model.addAttribute("message", "老铁,你的页面飞走了!\n404 Not Fount");
+        return "error_page";
+    }
+
+    @RequestMapping("error-400")
+    public String toPage400(Model model){
+        model.addAttribute("message", "对不起,你的请求出错了!\n400 Bad Request");
+        return "error_page";
+    }
+
+    @RequestMapping("error-500")
+    public String toPage500(Model model){
+        model.addAttribute("message", "大侠,系统出现了错误!\n500 Error");
+        return "error_page";
+    }
+}

+ 158 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/TestController.java

@@ -0,0 +1,158 @@
+package cn.iselab.mooctest.user.web.ctrl;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.user.configure.ThirdPartyAuthConfiguration;
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+import cn.iselab.mooctest.user.constants.UrlConstants;
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.model.VerifyCode;
+import cn.iselab.mooctest.user.service.MailService;
+import cn.iselab.mooctest.user.service.VerifyCodeService;
+import cn.iselab.mooctest.user.util.OSSUtil;
+import cn.iselab.mooctest.user.web.data.BankAccountInfoVO;
+import cn.iselab.mooctest.user.web.data.UserVO;
+import cn.iselab.mooctest.user.web.logic.UserLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.mail.MessagingException;
+import javax.servlet.http.HttpServletRequest;
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.24 19:11
+ */
+@RestController
+public class TestController extends BaseController{
+
+    @Autowired
+    MailService mailService;
+
+    @Autowired
+    VerifyCodeService verifyCodeService;
+
+    @Autowired
+    UserLogic userLogic;
+
+    @Autowired
+    ThirdPartyAuthConfiguration authConfiguration;
+
+    @Autowired
+    OSSUtil ossUtil;
+
+    @RequestMapping(value = "/test/first", method = RequestMethod.GET)
+    public Map<String, Object> firstResp(HttpServletRequest request){
+        Map<String, Object> map = new HashMap<>();
+        request.getSession().setAttribute("msg", "hello world");
+        map.put("requestURL", request.getRequestURL());
+        return map;
+    }
+
+    @RequestMapping(value = "/test/sessions", method = RequestMethod.GET)
+    public Object sessions(HttpServletRequest request){
+        Map<String, Object> map = new HashMap<>();
+        map.put("sessionsID", request.getSession().getId());
+        map.put("message", request.getSession().getAttribute("msg"));
+        return map;
+    }
+
+    @RequestMapping(value = "/test/mail", method = RequestMethod.POST)
+    public ResponseResult<Object> sendMail(UserDTO userDTO){
+        ResponseResult<Object> result = new ResponseResult<>();
+        LOG.info("\nreceiver: "+userDTO.getEmail()+"\n");
+        try {
+            mailService.sendVerifyEmail("diors_po@126.com", "171256175@qq.com", "1234");
+            result.init(ResponseStatus.SUCCESS, "发送成功", null);
+        } catch (MessagingException e) {
+            result.init(ResponseStatus.FAILED, "发送失败", null);
+            LOG.error("发送邮件出错",e);
+        }
+        return result;
+    }
+
+    @RequestMapping(value = "/test/error", method = RequestMethod.GET)
+    public ModelAndView errorPage(Model model){
+        model.addAttribute("message","老铁, 你的页面飞走了~");
+        return new ModelAndView("error_page");
+    }
+
+    @RequestMapping(value = "/test/success", method = RequestMethod.GET)
+    public ModelAndView successPage(Model model){
+        model.addAttribute("message","老铁, 你注册成功了~");
+        return new ModelAndView("success_page");
+    }
+
+    @RequestMapping(value = "/test/register", method = RequestMethod.GET)
+    public ModelAndView registerPage(){
+        // ResponseResult<Object> result = new ResponseResult<>();
+        // result.init(1000, "哈哈哈哈哈", null);
+        // model.addAttribute("result", result);
+        return new ModelAndView("register");
+    }
+
+
+    @RequestMapping(value = "/test/veirycode", method = RequestMethod.PUT)
+    public String testCode(@RequestBody VerifyCode verifyCode){
+        String type = verifyCode.getType();
+        String receiver = verifyCode.getReceiver();
+        verifyCode.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        verifyCode.setExpiredTime(new Timestamp(System.currentTimeMillis()+10000));
+        verifyCode.setCode("123321");
+        Long id = verifyCodeService.saveVerifyCode(verifyCode).getId();
+        return "id===="+id;
+    }
+
+    @RequestMapping(value = "/test/mobilecode", method = RequestMethod.GET)
+    public ResponseResult<String> mobileCode(UserDTO userDTO){
+        return userLogic.sendMobileVerfication(userDTO);
+    }
+
+    @RequestMapping(value = "/test/emails", method = RequestMethod.GET)
+    public void mails(){
+            mailService.sendArrearsEmail();
+    }
+
+    @RequestMapping(value = "/test/findpwd", method = RequestMethod.GET)
+    public ModelAndView findpwd(){
+        return new ModelAndView("forget_password");
+    }
+
+    @RequestMapping(value = "/test/resetpage", method = RequestMethod.GET)
+    public ModelAndView resetPage(){
+        ModelAndView modelAndView = new ModelAndView();
+        UserVO userVO = new UserVO();
+        userVO.setEmail("171333333@qq.com");
+        userVO.setVerifyCode("sdlkfjlsfksld");
+        modelAndView.setViewName("forget_password_reset");
+        modelAndView.addObject("user", userVO);
+        return modelAndView;
+    }
+
+    @RequestMapping(value = "/test/github/appinfo", method = RequestMethod.GET)
+    public String githubInfo(){
+        return "client_id: " + authConfiguration.getGitHubClientId()
+                + "client_secret: "+authConfiguration.getGitHubClientSecret();
+    }
+
+    @RequestMapping(value = "/test/upload/page", method = RequestMethod.GET)
+    public ModelAndView uploadBankInfo(){
+        return new ModelAndView("upload_card_info");
+    }
+
+    @RequestMapping(value = "/test/upload/bankinfo", method = RequestMethod.POST)
+    public String doUpload(BankAccountInfoVO infoVO){
+        String str = ossUtil.upload(infoVO.getID_card_back(), OSSUtil.FileDirType.BANKINFO);
+        return str;
+    }
+
+    @RequestMapping(value = "/test/url", method = RequestMethod.GET)
+    public String tttttt(){
+        return UrlConstants.GO_LOGIN + "\n" + UrlConstants.DEFAULT_GOTO;
+    }
+
+}

+ 207 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/UserController.java

@@ -0,0 +1,207 @@
+package cn.iselab.mooctest.user.web.ctrl;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+import cn.iselab.mooctest.user.constants.UrlConstants;
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.model.OperationRecord;
+import cn.iselab.mooctest.user.model.User;
+import cn.iselab.mooctest.user.util.EncryptionUtil;
+import cn.iselab.mooctest.user.util.OSSUtil;
+import cn.iselab.mooctest.user.web.data.BankAccountInfoVO;
+import cn.iselab.mooctest.user.web.data.OperationRecordVO;
+import cn.iselab.mooctest.user.web.data.UserVO;
+import cn.iselab.mooctest.user.web.exception.ConfigurationNotExistException;
+import cn.iselab.mooctest.user.web.logic.UserLogic;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.websocket.Session;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author sean
+ * @date 2018-03-05.
+ */
+@Slf4j
+@RestController
+public class UserController extends BaseController {
+
+    @Autowired
+    private UserLogic userLogic;
+
+    @Autowired
+    private OSSUtil ossUtil;
+
+    @RequestMapping(value = UrlConstants.API + "user/{id:\\d+}", method = RequestMethod.GET)
+    public UserDTO getUserById(@PathVariable("id") Long id) {
+        return userLogic.getUserById(id);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "userByEmail/{email:.+}", method = RequestMethod.GET)
+    public UserDTO getUserByEmail(@PathVariable("email") String email) {
+        log.info("Email: " + email);
+        UserDTO userByEmail = userLogic.getUserByEmail(email);
+        return userByEmail;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "user", method = RequestMethod.POST)
+    public UserDTO save(@RequestBody UserDTO userDTO) {
+        return userLogic.save(userDTO);
+    }
+
+
+    @RequestMapping(value = UrlConstants.API + "login", method = RequestMethod.POST)
+    public ResponseResult<UserDTO> checkLogin(@RequestBody UserDTO user, HttpServletRequest request, HttpServletResponse response) {
+        String password = EncryptionUtil.encryptMD5(user.getPassword());
+        user.setPassword(password);
+        ResponseResult<UserDTO> result = userLogic.checkPWD(user);
+        if (result.getStatus() == ResponseStatus.SUCCESS) {
+            HttpSession session = request.getSession();
+            session.setAttribute("userId", ((UserDTO) result.getData()).getId() + "");
+            // return "redirect:http://www.mooctest.net/api/test/login";
+        }
+        return result;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "logout", method = RequestMethod.GET)
+    public ResponseResult<Object> logout(HttpServletRequest request) {
+        ResponseResult<Object> result = new ResponseResult<Object>();
+        Object userId = request.getSession().getAttribute("userId");
+        if (userId != null) {
+            request.getSession().removeAttribute("userId");
+            request.getSession().invalidate();
+            result.init(ResponseStatus.SUCCESS, "用户成功退出", userId);
+            LOG.info("用户成功退出--userId--" + (String) userId);
+        } else {
+            result.init(ResponseStatus.FAILED, "用户未登录", null);
+            LOG.info(result.getMsg());
+        }
+        return result;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "mobile/login", method = RequestMethod.GET)
+    public ResponseResult<Object> mobileLogin(UserVO userVO, HttpServletRequest request) {
+        return null;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "verify/mail", method = RequestMethod.PUT)
+    public ResponseResult<String> sendVerifyEmail(UserDTO userDTO) {
+        ResponseResult<String> result = new ResponseResult<>();
+        result = userLogic.sendVerifyEmail(userDTO);
+        return result;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "verify/mobile", method = RequestMethod.PUT)
+    public ResponseResult<String> sendVerifyMobileMessage(UserDTO userDTO) {
+        return userLogic.sendMobileVerfication(userDTO);
+    }
+
+    /**
+     * 非本项目的登录注册界面中的邮箱验证码获取,此时需要传值为json格式
+     *
+     * @param userDTO
+     * @return
+     */
+    @RequestMapping(value = UrlConstants.API + "verify/mail/new", method = RequestMethod.PUT)
+    public ResponseResult<String> sendVerifyEmailNew(@RequestBody UserDTO userDTO) {
+        return userLogic.sendVerifyEmail(userDTO);
+    }
+
+    /**
+     * 非本项目的登录注册界面中的手机验证码获取,此时需要传值为json格式
+     *
+     * @param userDTO
+     * @return
+     */
+    @RequestMapping(value = UrlConstants.API + "verify/mobile/new", method = RequestMethod.PUT)
+    public ResponseResult<String> sendVerifyMobileMessageNew(@RequestBody UserDTO userDTO) {
+        return userLogic.sendMobileVerfication(userDTO);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "password/reset", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> resetPassword(@RequestBody UserVO userVO) {
+        return userLogic.resetPassword(userVO);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "user/password", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> updatePassword(@RequestBody UserVO userVO, HttpServletRequest request) {
+        return userLogic.updateUserPassword(userVO, request);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "user/password/new", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> updatePasswordNew(@RequestBody UserVO userVO, HttpServletRequest request) {
+        return userLogic.updateUserPasswordNew(userVO, request);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "user/email", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> updateEmail(@RequestBody UserVO userVO, HttpServletRequest request) {
+        ResponseResult<UserVO> responseResult = userLogic.updateUserEmail(userVO, request);
+        return responseResult;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "user/mobile", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> updateMobile(@RequestBody UserVO userVO, HttpServletRequest request) {
+        return userLogic.updateUserMobile(userVO, request);
+    }
+
+    /**
+     * 验证旧手机号和验证码
+     *
+     * @param userVO
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = UrlConstants.API + "user/old/mobile", method = RequestMethod.PUT)
+    public ResponseResult<UserVO> verifyOldMobile(@RequestBody UserVO userVO, HttpServletRequest request) {
+        return userLogic.verifyOldMobile(userVO, request);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "bankInfo", method = RequestMethod.POST)
+    public ModelAndView setBankInfo(BankAccountInfoVO infoVO, HttpServletRequest request) {
+        ResponseResult<Object> result = userLogic.setBankInfo(infoVO, request);
+        if (result.getStatus() == ResponseStatus.SUCCESS) {
+            // return new ModelAndView("redirect:"+(String) request.getSession().getAttribute("redirectURL"));
+            userLogic.recordUserOperation(request, Long.parseLong((String) request.getSession().getAttribute("userId")), "Upload Bank Info", "user center");
+            return new ModelAndView("success_page").addObject("message", "银行账户信息上传成功!");
+        }
+        ModelAndView modelAndView = new ModelAndView("error_page");
+        modelAndView.addObject("message", result.getMsg());
+        return modelAndView;
+    }
+
+    @RequestMapping(value = UrlConstants.API + "operation_record", method = RequestMethod.POST)
+    public void recordUserOperation(@RequestBody OperationRecordVO recordVO) {
+        userLogic.recordUserOperation(recordVO.toOperationRecord());
+    }
+
+
+//    /**
+//     * 获取平台名称
+//     * @return
+//     */
+//    @RequestMapping(value = UrlConstants.API + "getPlatformName", method = RequestMethod.GET)
+//    public String getPlatformName() throws ConfigurationNotExistException {
+//        return userLogic.getPlatformName();
+//    }
+
+    /**
+     * 获取平台名称
+     * @return
+     */
+    @RequestMapping(value = "/page" + UrlConstants.API + "configuration", method = RequestMethod.GET)
+    public Map<String, String> getConfiguration() {
+        return userLogic.getConfiguration();
+    }
+}

+ 22 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/BankAccountInfoVO.java

@@ -0,0 +1,22 @@
+package cn.iselab.mooctest.user.web.data;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Author: xuexb
+ * @Date: 2019.2.26 11:28
+ */
+@Data
+public class BankAccountInfoVO {
+    private String real_name;
+    private Long user_id;
+    private String id_number;
+    private String bank_info;
+    private String bank_card_number;
+    private String id_card_front_url;
+    private String id_card_back_url;
+
+    private MultipartFile ID_card_front;
+    private MultipartFile ID_card_back;
+}

+ 37 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/OperationRecordVO.java

@@ -0,0 +1,37 @@
+package cn.iselab.mooctest.user.web.data;
+
+import cn.iselab.mooctest.user.model.OperationRecord;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+import java.sql.Timestamp;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-15 22:19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OperationRecordVO {
+
+    private Long id;
+    private String ip;
+    private Long userId;
+    private String operation;
+    private String resource;
+    private Timestamp createTime;
+
+    public OperationRecordVO(OperationRecord record){
+        BeanUtils.copyProperties(record, this);
+    }
+
+    public OperationRecord toOperationRecord(){
+        OperationRecord record = new OperationRecord();
+        BeanUtils.copyProperties(this, record);
+        return record;
+    }
+}

+ 32 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/UserVO.java

@@ -0,0 +1,32 @@
+package cn.iselab.mooctest.user.web.data;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 14:02
+ */
+@Data
+public class UserVO extends UserDTO {
+   private String verifyCode;
+
+   private String password2;
+
+   private String oldPassword;
+
+   private String thirdPartyId;
+
+   private String thirdPartyName;
+
+   private String headImgUrl;
+
+   private String from;
+
+   private String openid;
+
+   private String unionid;
+}

+ 41 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/wrapper/BankAccountInfoVOWrapper.java

@@ -0,0 +1,41 @@
+package cn.iselab.mooctest.user.web.data.wrapper;
+
+import cn.iselab.mooctest.user.model.BankAccountInfo;
+import cn.iselab.mooctest.user.web.data.BankAccountInfoVO;
+import cn.iselab.mooctest.user.web.wrapper.BaseWrapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xuexb
+ * @Date: 2019.2.26 11:28
+ */
+@Service
+public class BankAccountInfoVOWrapper extends BaseWrapper<BankAccountInfoVO, BankAccountInfo> {
+    @Override
+    public BankAccountInfoVO wrap(BankAccountInfo info) {
+        BankAccountInfoVO bankAccountInfoVO = new BankAccountInfoVO();
+
+        bankAccountInfoVO.setUser_id(info.getUserId());
+        bankAccountInfoVO.setBank_card_number(info.getBankCardNumber());
+        bankAccountInfoVO.setBank_info(info.getBankInfo());
+        bankAccountInfoVO.setId_number(info.getIDNumber());
+        bankAccountInfoVO.setReal_name(info.getRealName());
+        bankAccountInfoVO.setId_card_front_url(info.getIDCardFrontUrl());
+        bankAccountInfoVO.setId_card_back_url(info.getIDCardBackUrl());
+        return bankAccountInfoVO;
+    }
+
+    @Override
+    public BankAccountInfo unwrap(BankAccountInfoVO data) {
+        BankAccountInfo bankAccountInfo = new BankAccountInfo();
+
+        bankAccountInfo.setBankCardNumber(data.getBank_card_number());
+        bankAccountInfo.setBankInfo(data.getBank_card_number());
+        bankAccountInfo.setIDCardBackUrl(data.getId_card_back_url());
+        bankAccountInfo.setIDCardFrontUrl(data.getId_card_front_url());
+        bankAccountInfo.setIDNumber(data.getId_number());
+        bankAccountInfo.setRealName(data.getReal_name());
+        bankAccountInfo.setUserId(data.getUser_id());
+        return bankAccountInfo;
+    }
+}

+ 56 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/data/wrapper/UserVOWrapper.java

@@ -0,0 +1,56 @@
+package cn.iselab.mooctest.user.web.data.wrapper;
+
+import cn.iselab.mooctest.user.model.User;
+import cn.iselab.mooctest.user.web.data.UserVO;
+import cn.iselab.mooctest.user.web.wrapper.BaseWrapper;
+import org.springframework.stereotype.Service;
+
+import java.sql.Timestamp;
+
+/**
+ * @Description: 作用描述
+ * @Author: xuexb
+ * @CreateDate: 19-1-2$ 上午2:21$
+ */
+@Service
+public class UserVOWrapper extends BaseWrapper<UserVO, User> {
+
+    @Override
+    public UserVO wrap(User user) {
+        UserVO userVO = new UserVO();
+
+        userVO.setAvailability(user.getAvailability());
+        userVO.setCity(user.getCity());
+        userVO.setCreateTime(user.getCreateTime().getTime());
+        userVO.setEmail(user.getEmail());
+        userVO.setId(user.getId());
+        userVO.setManualCheckValid(user.getManualCheckValid());
+        userVO.setMobile(user.getMobile());
+        userVO.setName(user.getName());
+        userVO.setPassword(user.getPassword());
+        userVO.setPhotoUrl(user.getPhotoUrl());
+        userVO.setProvince(user.getProvince());
+        userVO.setSchool(user.getSchool());
+        return userVO;
+    }
+
+    @Override
+    public User unwrap(UserVO data) {
+        User user = new User();
+
+        user.setSchool(data.getSchool());
+        user.setProvince(data.getProvince());
+        user.setPhotoUrl(data.getPhotoUrl());
+        user.setAvailability(data.getAvailability());
+        user.setCity(data.getCity());
+        user.setCreateTime(new Timestamp(data.getCreateTime()));
+        user.setEmail(data.getEmail());
+        user.setId(data.getId());
+        user.setManualCheckValid(data.getManualCheckValid());
+        user.setMobile(data.getMobile());
+        user.setName(data.getName());
+        user.setPassword(data.getPassword());
+
+        return user;
+    }
+}

+ 13 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/exception/ConfigurationNotExistException.java

@@ -0,0 +1,13 @@
+package cn.iselab.mooctest.user.web.exception;
+
+import cn.iselab.mooctest.user.model.Configuration;
+
+/**
+ * @author guochao
+ * @date 2020-12-30 19:35
+ */
+public class ConfigurationNotExistException extends Exception{
+    public ConfigurationNotExistException(String msg){
+        super(msg);
+    }
+}

+ 16 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/exception/HttpBadRequestException.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.user.web.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * @author sean
+ * @date 2017-03-19.
+ */
+@ResponseStatus(code = HttpStatus.BAD_REQUEST)
+public class HttpBadRequestException extends RuntimeException {
+
+    public HttpBadRequestException(String message) {
+        super(message);
+    }
+}

+ 17 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/BaseLogic.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午11:05 2018/2/13
+ * @Modified By:
+ */
+public class BaseLogic {
+
+    protected final Logger LOG = LoggerFactory.getLogger(getClass());
+
+}

+ 34 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/IntegralLogic.java

@@ -0,0 +1,34 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
+import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
+import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
+import cn.iselab.mooctest.user.model.Integral;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午11:05 2018/2/13
+ * @Modified By:
+ */
+public interface IntegralLogic {
+
+    IntegralCaughtDTO saveIntegralCaught(IntegralCaughtDTO dto);
+
+    List<IntegralCaughtDTO> getIntegralCaughts(long userId, long startTime, long endTime);
+
+    List<UserIntegralDTO> getUserIntegrals(String keyword);
+
+    UserIntegralDTO getUserIntegral(Long userId);
+
+    boolean addIntegral(AddIntegralDTO dto);
+
+    Map<String,Integral> reloadIntegralMap();
+
+    List<IntegralCaughtDTO> getUserIntegralRecord(long userId, long type, String source);
+}

+ 29 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/MedalLogic.java

@@ -0,0 +1,29 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import cn.iselab.mooctest.rpc.user.data.MedalCaughtDTO;
+import cn.iselab.mooctest.rpc.user.data.MedalDTO;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午11:05 2018/2/13
+ * @Modified By:
+ */
+public interface MedalLogic {
+
+    MedalDTO saveMedal(MedalDTO dto);
+
+    MedalDTO getMedal(long medalId);
+
+    MedalDTO updateMedal(MedalDTO dto);
+
+    void deleteMedal(long medalId);
+
+    List<MedalDTO> getMedals(String keyword, Long userId);
+
+    MedalCaughtDTO saveMedalCaughtDTO(MedalCaughtDTO dto);
+
+    List<MedalCaughtDTO> getMedalList(long userId);
+}

+ 16 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/ThirdPartyLogic.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.data.UserInfo;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description:
+ * @Author: xuexb
+ * @CreateDate: 19-1-4$ 下午12:11$
+ */
+public interface ThirdPartyLogic {
+    ResponseResult<Object> loginByGithub(String code, HttpServletRequest request);
+
+}

+ 87 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/UserLogic.java

@@ -0,0 +1,87 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+import cn.iselab.mooctest.user.data.ResponseResult;
+import cn.iselab.mooctest.user.model.OperationRecord;
+import cn.iselab.mooctest.user.web.data.BankAccountInfoVO;
+import cn.iselab.mooctest.user.web.data.UserVO;
+import cn.iselab.mooctest.user.web.exception.ConfigurationNotExistException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author sean
+ * @date 2018-03-04.
+ */
+public interface UserLogic {
+
+    UserDTO getUserByEmail(String s);
+
+    UserDTO getUserByMobile(String s);
+
+    UserDTO getUserById(Long userId);
+
+    Boolean checkPassword(UserDTO userDTO);
+
+    ResponseResult<UserDTO> checkPWD(UserDTO userDTO);
+
+    UserDTO save(UserDTO userDTO);
+
+    UserDTO updateUser(UserDTO userDTO);
+
+    List<UserDTO> getUserByFuzzyName(UserDTO userDTO);
+
+    List<UserDTO> getUserByFuzzyEmail(UserDTO userDTO);
+
+    List<UserDTO> getUserByFuzzyNameOrEmail(UserDTO userDTO);
+
+    List<UserDTO> findAll(List<Long> userIds);
+
+    List<UserDTO> findByEmails(List<String> emails);
+
+    ResponseResult<UserDTO> registerAccount(UserVO userVO);
+
+    ResponseResult<String> sendVerifyEmail(UserDTO userDTO);
+
+    ResponseResult<String> sendMobileVerfication(UserDTO userDTO);
+
+    ResponseResult<UserDTO> loginByMobile(UserVO userVO);
+
+    ResponseResult<UserVO> checkVerifyCode(UserVO userVO, String type);
+
+    ResponseResult<UserVO> resetPassword(UserVO userVO);
+
+    ResponseResult<UserVO> updateUserPassword(UserVO userVO, HttpServletRequest request);
+
+    ResponseResult<UserVO> updateUserPasswordNew(UserVO userVO, HttpServletRequest request);
+
+    ResponseResult<UserVO> updateUserEmail(UserVO userVO, HttpServletRequest request);
+
+    ResponseResult<UserVO> updateUserMobile(UserVO userVO, HttpServletRequest request);
+
+    ResponseResult<UserVO> verifyOldMobile(UserVO userVO, HttpServletRequest request);
+
+    ResponseResult<Object> setBankInfo(BankAccountInfoVO infoVO, HttpServletRequest request);
+
+    void saveRedirectUrl(String redirect, HttpServletRequest request);
+
+    void recordLoginAction(HttpServletRequest request, Long userId, String resource);
+
+    void recordLogoutAction(HttpServletRequest request, Long userId, String resource);
+
+    void recordUserOperation(HttpServletRequest request, Long userId, String operation, String resource);
+
+    void recordUserOperation(OperationRecord record);
+
+    void recordUserOperation(String ip, Long userId, String operation, String resource);
+
+    Boolean isLogin(HttpServletRequest request);
+
+    String getPlatformName() throws ConfigurationNotExistException;
+
+    Map<String, String> getConfiguration();
+}

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/WechatLogic.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.web.logic;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 上午11:11 2018/4/17
+ * @Modified By:
+ */
+public interface WechatLogic {
+
+    UserWechatDTO getUserByCode(String code);
+
+    UserDTO setUserWechat(UserWechatDTO dto);
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов