فهرست منبع

add: 增加首页缓存

guo00guo 5 سال پیش
والد
کامیت
ffe81f37a9
22فایلهای تغییر یافته به همراه295 افزوده شده و 209 حذف شده
  1. 6 0
      site/pom.xml
  2. 2 2
      site/src/main/java/com/mooctest/crowd/site/SiteApplication.java
  3. 0 5
      site/src/main/java/com/mooctest/crowd/site/configuration/RedisSessionConfiguration.java
  4. 167 167
      site/src/main/java/com/mooctest/crowd/site/configuration/ShiroConfiguration.java
  5. 0 0
      site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java
  6. 2 5
      site/src/main/java/com/mooctest/crowd/site/data/dto/IndexInfoDTO.java
  7. 2 2
      site/src/main/java/com/mooctest/crowd/site/data/dto/MyCrowdDTO.java
  8. 2 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/ApplicationTypeVO.java
  9. 2 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/CompetitionVO.java
  10. 2 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdProjectVO.java
  11. 2 2
      site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdTaskVO.java
  12. 3 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/EvolutionAgencyVO.java
  13. 3 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/FieldVO.java
  14. 3 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/PartnerVO.java
  15. 3 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/ResourceVO.java
  16. 3 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/TestTypeVO.java
  17. 2 1
      site/src/main/java/com/mooctest/crowd/site/data/vo/UserVO.java
  18. 32 11
      site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java
  19. 1 2
      site/src/main/java/com/mooctest/crowd/site/service/CommonService.java
  20. 6 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CommonServiceImpl.java
  21. 46 0
      site/src/main/java/com/mooctest/crowd/site/util/CacheUtil.java
  22. 6 1
      site/src/main/resources/application.yml

+ 6 - 0
site/pom.xml

@@ -132,6 +132,12 @@
 			<artifactId>kaptcha</artifactId>
 			<version>2.3.2</version>
 		</dependency>
+		<!-- Spring Cache -->
+<!--		<dependency>-->
+<!--			<groupId>org.springframework.boot</groupId>-->
+<!--			<artifactId>spring-boot-starter-cache</artifactId>-->
+<!--			<version>2.1.3.RELEASE</version>-->
+<!--		</dependency>-->
 	</dependencies>
 
 	<build>

+ 2 - 2
site/src/main/java/com/mooctest/crowd/site/SiteApplication.java

@@ -2,13 +2,13 @@ package com.mooctest.crowd.site;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
+import org.springframework.cache.annotation.EnableCaching;
 
 @SpringBootApplication(scanBasePackages = "com.mooctest.crowd")
+@EnableCaching
 public class SiteApplication {
 
 	public static void main(String[] args) {
 		SpringApplication.run(SiteApplication.class, args);
 	}
-
 }

+ 0 - 5
site/src/main/java/com/mooctest/crowd/site/configuration/RedisSessionConfiguration.java

@@ -3,12 +3,7 @@ package com.mooctest.crowd.site.configuration;
 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.GenericJackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 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;

+ 167 - 167
site/src/main/java/com/mooctest/crowd/site/configuration/ShiroConfiguration.java

@@ -1,177 +1,177 @@
-package com.mooctest.crowd.site.configuration;
-
-import org.apache.shiro.cache.ehcache.EhCacheManager;
-import org.apache.shiro.spring.LifecycleBeanPostProcessor;
-import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
-import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.DependsOn;
-
-/**
- * Shiro configuration
- * Created by Liu on 2017/6/6.
- */
-@Configuration
-public class ShiroConfiguration {
-    /**
-     * LifecycleBeanPostProcessor,这是个DestructionAwareBeanPostProcessor的子类,
-     * 负责org.apache.shiro.util.Initializable类型bean的生命周期的,初始化和销毁。
-     * 主要是AuthorizingRealm类的子类,以及EhCacheManager类。
-     */
-    @Bean(name = "lifecycleBeanPostProcessor")
-    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
-        return new LifecycleBeanPostProcessor();
-    }
-
-    /**
-     * ShiroRealm,这是个自定义的认证类,继承自AuthorizingRealm,
-     * 负责用户的认证和权限的处理,可以参考JdbcRealm的实现。
-     */
-//    @ConditionalOnProperty(prefix = "featureSwitch", name = "client.loginByUserCenter", matchIfMissing = false)
-//    @Bean(name = "shiroRealm")
-//    @DependsOn("lifecycleBeanPostProcessor")
-//    public ShiroRealmAdapt2UserCenter shiroRealmAdapt2UserCenter() {
-//        // System.out.println("\nCreate ShiroRealm Adapt to UserCenter\n");
-//        ShiroRealmAdapt2UserCenter realm = new ShiroRealmAdapt2UserCenter();
-//        return realm;
+//package com.mooctest.crowd.site.configuration;
+//
+//import org.apache.shiro.cache.ehcache.EhCacheManager;
+//import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+//import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+//import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.DependsOn;
+//
+///**
+// * Shiro configuration
+// * Created by Liu on 2017/6/6.
+// */
+//@Configuration
+//public class ShiroConfiguration {
+//    /**
+//     * LifecycleBeanPostProcessor,这是个DestructionAwareBeanPostProcessor的子类,
+//     * 负责org.apache.shiro.util.Initializable类型bean的生命周期的,初始化和销毁。
+//     * 主要是AuthorizingRealm类的子类,以及EhCacheManager类。
+//     */
+//    @Bean(name = "lifecycleBeanPostProcessor")
+//    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+//        return new LifecycleBeanPostProcessor();
 //    }
 //
-//    @Bean(name = "shiroRealm")
+//    /**
+//     * ShiroRealm,这是个自定义的认证类,继承自AuthorizingRealm,
+//     * 负责用户的认证和权限的处理,可以参考JdbcRealm的实现。
+//     */
+////    @ConditionalOnProperty(prefix = "featureSwitch", name = "client.loginByUserCenter", matchIfMissing = false)
+////    @Bean(name = "shiroRealm")
+////    @DependsOn("lifecycleBeanPostProcessor")
+////    public ShiroRealmAdapt2UserCenter shiroRealmAdapt2UserCenter() {
+////        // System.out.println("\nCreate ShiroRealm Adapt to UserCenter\n");
+////        ShiroRealmAdapt2UserCenter realm = new ShiroRealmAdapt2UserCenter();
+////        return realm;
+////    }
+////
+////    @Bean(name = "shiroRealm")
+////    @DependsOn("lifecycleBeanPostProcessor")
+////    public ShiroRealm shiroRealm() {
+////        // System.out.println("\nCreate ShiroRealm don't Adapt to UserCenter\n");
+////        ShiroRealm realm = new ShiroRealm();
+////        return realm;
+////    }
+//
+//    /**
+//     * EhCacheManager,缓存管理,用户登陆成功后,把用户信息和权限信息缓存起来,
+//     * 然后每次用户请求时,放入用户的session中,如果不设置这个bean,每个请求都会查询一次数据库。
+//     */
+//    @Bean(name = "ehCacheManager")
 //    @DependsOn("lifecycleBeanPostProcessor")
-//    public ShiroRealm shiroRealm() {
-//        // System.out.println("\nCreate ShiroRealm don't Adapt to UserCenter\n");
-//        ShiroRealm realm = new ShiroRealm();
-//        return realm;
+//    public EhCacheManager ehCacheManager() {
+//        return new EhCacheManager();
 //    }
-
-    /**
-     * EhCacheManager,缓存管理,用户登陆成功后,把用户信息和权限信息缓存起来,
-     * 然后每次用户请求时,放入用户的session中,如果不设置这个bean,每个请求都会查询一次数据库。
-     */
-    @Bean(name = "ehCacheManager")
-    @DependsOn("lifecycleBeanPostProcessor")
-    public EhCacheManager ehCacheManager() {
-        return new EhCacheManager();
-    }
-
-    /**
-     * SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要的类。
-     */
-//    @Bean(name = "securityManager")
-//    public DefaultWebSecurityManager securityManager(AuthorizingRealm shiroRealm) {
-//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-//        securityManager.setRealm(shiroRealm);
-//        securityManager.setCacheManager(ehCacheManager());
-//        //securityManager.setSessionManager(defaultWebSessionManager());
 //
-//        return securityManager;
+//    /**
+//     * SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要的类。
+//     */
+////    @Bean(name = "securityManager")
+////    public DefaultWebSecurityManager securityManager(AuthorizingRealm shiroRealm) {
+////        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+////        securityManager.setRealm(shiroRealm);
+////        securityManager.setCacheManager(ehCacheManager());
+////        //securityManager.setSessionManager(defaultWebSessionManager());
+////
+////        return securityManager;
+////    }
+//
+//    /**
+//     * ShiroFilterFactoryBean,是个factorybean,为了生成ShiroFilter。
+//     * 它主要保持了三项数据,securityManager,filters,filterChainDefinitionManager。
+//     */
+////    @Bean(name = "shiroFilter")
+////    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
+////        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+////        shiroFilterFactoryBean.setSecurityManager(securityManager);
+////
+////        Map<String, Filter> filters = new LinkedHashMap<>();
+////        filters.put("authc", new MyAuthorizationFilter());
+////        shiroFilterFactoryBean.setFilters(filters);
+////
+////        Map<String, String> filterChainDefinitionManager = new LinkedHashMap<String, String>();
+////
+////        filterChainDefinitionManager.put("/api/cookie/set", "anon");
+////        filterChainDefinitionManager.put("/api/test/login", "anon");
+////        filterChainDefinitionManager.put("/api/test/register", "anon");
+////        filterChainDefinitionManager.put("/api/featureSwitch", "anon");
+////        filterChainDefinitionManager.put("/api/ossConfiguration","anon");
+////        filterChainDefinitionManager.put("/api/common/tag/**", "authc");
+////        filterChainDefinitionManager.put("/api/common/**", "anon");
+////        filterChainDefinitionManager.put("/api/mobileLogin", "anon");
+////        filterChainDefinitionManager.put("/api/case/nodeList", "anon");
+////        filterChainDefinitionManager.put("/api/exam/**/info","anon");
+////        filterChainDefinitionManager.put("/api/payEmail", "anon");
+////        filterChainDefinitionManager.put("/api/product/send", "anon");
+////
+////        filterChainDefinitionManager.put("/logout", "anon");
+////        filterChainDefinitionManager.put("/api/dev/**", "anon");
+////        filterChainDefinitionManager.put("/api/kibug/plugin/**", "anon");
+////        filterChainDefinitionManager.put("/api/wechat/**", "anon");
+////
+////        filterChainDefinitionManager.put("/api/pythonCommunity/exercise/**", "anon");
+////        filterChainDefinitionManager.put("/api/pythonCommunity/statistic/**", "authc");
+////        filterChainDefinitionManager.put("/api/support/**", "anon");
+////        filterChainDefinitionManager.put("/api/evaluation/**", "authc");
+////
+////        filterChainDefinitionManager.put("/api/onlinejudge/**","anon");
+////
+////        filterChainDefinitionManager.put("/api/codeVisualize/**", "anon");
+////
+////        filterChainDefinitionManager.put("/api/onlinejudge/u/**","authc");
+////        filterChainDefinitionManager.put("/api/sendGetHelpEmail", "anon");
+////        filterChainDefinitionManager.put("/**", "authc");
+////        filterChainDefinitionManager.put("/api/caseExport", "anon");
+////        filterChainDefinitionManager.put("/api/caseImport", "anon");
+////
+////        filterChainDefinitionManager.put("/api/contest/enterWithoutLogin/**", "anon");
+////
+////
+////
+////
+////        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);
+////
+////        shiroFilterFactoryBean.setSuccessUrl("/");
+////        shiroFilterFactoryBean.setLoginUrl("/");
+////        shiroFilterFactoryBean.setUnauthorizedUrl("");
+////        return shiroFilterFactoryBean;
+////    }
+//
+//    /**
+//     * DefaultAdvisorAutoProxyCreator,Spring的一个bean,由Advisor决定对哪些类的方法进行AOP代理。
+//     */
+//    @Bean
+//    @ConditionalOnMissingBean
+//    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+//        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
+//        defaultAAP.setProxyTargetClass(true);
+//        return defaultAAP;
 //    }
-
-    /**
-     * ShiroFilterFactoryBean,是个factorybean,为了生成ShiroFilter。
-     * 它主要保持了三项数据,securityManager,filters,filterChainDefinitionManager。
-     */
-//    @Bean(name = "shiroFilter")
-//    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
-//        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
-//        shiroFilterFactoryBean.setSecurityManager(securityManager);
-//
-//        Map<String, Filter> filters = new LinkedHashMap<>();
-//        filters.put("authc", new MyAuthorizationFilter());
-//        shiroFilterFactoryBean.setFilters(filters);
-//
-//        Map<String, String> filterChainDefinitionManager = new LinkedHashMap<String, String>();
-//
-//        filterChainDefinitionManager.put("/api/cookie/set", "anon");
-//        filterChainDefinitionManager.put("/api/test/login", "anon");
-//        filterChainDefinitionManager.put("/api/test/register", "anon");
-//        filterChainDefinitionManager.put("/api/featureSwitch", "anon");
-//        filterChainDefinitionManager.put("/api/ossConfiguration","anon");
-//        filterChainDefinitionManager.put("/api/common/tag/**", "authc");
-//        filterChainDefinitionManager.put("/api/common/**", "anon");
-//        filterChainDefinitionManager.put("/api/mobileLogin", "anon");
-//        filterChainDefinitionManager.put("/api/case/nodeList", "anon");
-//        filterChainDefinitionManager.put("/api/exam/**/info","anon");
-//        filterChainDefinitionManager.put("/api/payEmail", "anon");
-//        filterChainDefinitionManager.put("/api/product/send", "anon");
-//
-//        filterChainDefinitionManager.put("/logout", "anon");
-//        filterChainDefinitionManager.put("/api/dev/**", "anon");
-//        filterChainDefinitionManager.put("/api/kibug/plugin/**", "anon");
-//        filterChainDefinitionManager.put("/api/wechat/**", "anon");
-//
-//        filterChainDefinitionManager.put("/api/pythonCommunity/exercise/**", "anon");
-//        filterChainDefinitionManager.put("/api/pythonCommunity/statistic/**", "authc");
-//        filterChainDefinitionManager.put("/api/support/**", "anon");
-//        filterChainDefinitionManager.put("/api/evaluation/**", "authc");
-//
-//        filterChainDefinitionManager.put("/api/onlinejudge/**","anon");
-//
-//        filterChainDefinitionManager.put("/api/codeVisualize/**", "anon");
-//
-//        filterChainDefinitionManager.put("/api/onlinejudge/u/**","authc");
-//        filterChainDefinitionManager.put("/api/sendGetHelpEmail", "anon");
-//        filterChainDefinitionManager.put("/**", "authc");
-//        filterChainDefinitionManager.put("/api/caseExport", "anon");
-//        filterChainDefinitionManager.put("/api/caseImport", "anon");
-//
-//        filterChainDefinitionManager.put("/api/contest/enterWithoutLogin/**", "anon");
-//
 //
+//    /**
+//     * AuthorizationAttributeSourceAdvisor,shiro里实现的Advisor类,
+//     * 内部使用AopAllianceAnnotationsAuthorizingMethodInterceptor来拦截用以下注解的方法。
+//     */
+////    @Bean
+////    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+////        AuthorizationAttributeSourceAdvisor aASA = new AuthorizationAttributeSourceAdvisor();
+////        aASA.setSecurityManager(securityManager);
+////        return aASA;
+////    }
+//
+////    @Bean(name = "sessionDao")
+////    public MySessionDao sessionDao() {
+////        MySessionDao sessionDao = new MySessionDao();
+////        sessionDao.setSessionIdGenerator(new JavaUuidSessionIdGenerator());
+//////        sessionDao.setSessionIdGenerator(JavaUuidSessionIdGenerator);
+////        return sessionDao;
+////    }
+//
+//    @Bean(name = "sessionManager")
+//    public DefaultWebSessionManager defaultWebSessionManager() {
+//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+//        sessionManager.setCacheManager(ehCacheManager());
+//        sessionManager.setGlobalSessionTimeout(1800000);//超时时间
+//        sessionManager.setSessionValidationSchedulerEnabled(true);//定时清除无效的session
+//        sessionManager.setSessionValidationInterval(1800000);//半个小时清理一次失效的session
+//        sessionManager.setDeleteInvalidSessions(true);//删除无效的session
+////        sessionManager.setSessionDAO(sessionDao());
+//        return sessionManager;
+//    }
 //
+//}
 //
-//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);
 //
-//        shiroFilterFactoryBean.setSuccessUrl("/");
-//        shiroFilterFactoryBean.setLoginUrl("/");
-//        shiroFilterFactoryBean.setUnauthorizedUrl("");
-//        return shiroFilterFactoryBean;
-//    }
-
-    /**
-     * DefaultAdvisorAutoProxyCreator,Spring的一个bean,由Advisor决定对哪些类的方法进行AOP代理。
-     */
-    @Bean
-    @ConditionalOnMissingBean
-    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
-        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
-        defaultAAP.setProxyTargetClass(true);
-        return defaultAAP;
-    }
-
-    /**
-     * AuthorizationAttributeSourceAdvisor,shiro里实现的Advisor类,
-     * 内部使用AopAllianceAnnotationsAuthorizingMethodInterceptor来拦截用以下注解的方法。
-     */
-//    @Bean
-//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
-//        AuthorizationAttributeSourceAdvisor aASA = new AuthorizationAttributeSourceAdvisor();
-//        aASA.setSecurityManager(securityManager);
-//        return aASA;
-//    }
-
-//    @Bean(name = "sessionDao")
-//    public MySessionDao sessionDao() {
-//        MySessionDao sessionDao = new MySessionDao();
-//        sessionDao.setSessionIdGenerator(new JavaUuidSessionIdGenerator());
-////        sessionDao.setSessionIdGenerator(JavaUuidSessionIdGenerator);
-//        return sessionDao;
-//    }
-
-    @Bean(name = "sessionManager")
-    public DefaultWebSessionManager defaultWebSessionManager() {
-        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
-        sessionManager.setCacheManager(ehCacheManager());
-        sessionManager.setGlobalSessionTimeout(1800000);//超时时间
-        sessionManager.setSessionValidationSchedulerEnabled(true);//定时清除无效的session
-        sessionManager.setSessionValidationInterval(1800000);//半个小时清理一次失效的session
-        sessionManager.setDeleteInvalidSessions(true);//删除无效的session
-//        sessionManager.setSessionDAO(sessionDao());
-        return sessionManager;
-    }
-
-}
-
-

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java


+ 2 - 5
site/src/main/java/com/mooctest/crowd/site/data/dto/IndexInfoDTO.java

@@ -3,6 +3,7 @@ package com.mooctest.crowd.site.data.dto;
 import com.mooctest.crowd.site.data.vo.*;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -10,8 +11,7 @@ import java.util.List;
  * @Date: 2019.7.15 20:15
  */
 @Data
-public class IndexInfoDTO {
-
+public class IndexInfoDTO implements Serializable {
     private List<TestTypeVO> testTypeList;
     private List<ApplicationTypeVO> applicationTypeList;
     private List<ApplicationTypeVO> applicationTypeRank;
@@ -22,7 +22,4 @@ public class IndexInfoDTO {
     private List<ResourceVO> resourceList;
     private List<EvolutionAgencyVO> residentAgencyList;
     private List<PartnerVO> partnerList;
-//    private List<String> imgList;
-//    private List<CrowdTaskVO> hotTaskList;
-//    private List<PieChartDataVO> systemStatistics;
 }

+ 2 - 2
site/src/main/java/com/mooctest/crowd/site/data/dto/MyCrowdDTO.java

@@ -2,10 +2,10 @@ package com.mooctest.crowd.site.data.dto;
 
 import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
-import com.mooctest.crowd.site.data.vo.PieChartDataVO;
 import com.mooctest.crowd.site.data.vo.UserVO;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -13,7 +13,7 @@ import java.util.List;
  * @Date: 2019.7.15 20:17
  */
 @Data
-public class MyCrowdDTO {
+public class MyCrowdDTO implements Serializable {
     private UserVO userVO;
     private List<CrowdTaskVO> unfinishedTasks;
     private List<CrowdTaskVO> finishedTasks;

+ 2 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/ApplicationTypeVO.java

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -14,7 +15,7 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class ApplicationTypeVO {
+public class ApplicationTypeVO implements Serializable {
     private String code;
     private String name;
     private Long count;

+ 2 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/CompetitionVO.java

@@ -3,6 +3,7 @@ package com.mooctest.crowd.site.data.vo;
 import com.mooctest.crowd.domain.domainobject.Competition;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.sql.Timestamp;
 
 /**
@@ -10,7 +11,7 @@ import java.sql.Timestamp;
  * @date 2019/7/6 17:54
  */
 @Data
-public class CompetitionVO {
+public class CompetitionVO implements Serializable {
     private Long id;
     private String name;
     private String linkUrl;

+ 2 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdProjectVO.java

@@ -7,6 +7,7 @@ import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.List;
@@ -18,7 +19,7 @@ import java.util.Map;
  */
 @Data
 @NoArgsConstructor
-public class CrowdProjectVO {
+public class CrowdProjectVO implements Serializable {
 
     private String id;
     private String name;

+ 2 - 2
site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdTaskVO.java

@@ -1,11 +1,11 @@
 package com.mooctest.crowd.site.data.vo;
 
-import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTaskAcceptStatus;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTaskStatus;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.sql.Timestamp;
 import java.text.DateFormat;
 import java.text.ParseException;
@@ -19,7 +19,7 @@ import static com.mooctest.crowd.site.data.vo.CrowdTestProjectVO.getDistanceTime
  * @Date: 2019.7.15 20:36
  */
 @Data
-public class CrowdTaskVO {
+public class CrowdTaskVO implements Serializable {
 
     private long id;
     private String projectId;

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/EvolutionAgencyVO.java

@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * @Author: xuexb
  * @Date: 2019.7.17 10:12
@@ -12,7 +14,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class EvolutionAgencyVO {
+public class EvolutionAgencyVO implements Serializable {
     private Long id;
     private Long userId;
     private String logo;

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/FieldVO.java

@@ -3,12 +3,14 @@ package com.mooctest.crowd.site.data.vo;
 import com.mooctest.crowd.domain.domainobject.Field;
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author guochao
  * @date 2019/7/6 17:54
  */
 @Data
-public class FieldVO {
+public class FieldVO implements Serializable {
     private String code;
     private String name;
 

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/PartnerVO.java

@@ -3,12 +3,14 @@ package com.mooctest.crowd.site.data.vo;
 import com.mooctest.crowd.domain.domainobject.Partner;
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author guochao
  * @date 2019/7/6 17:54
  */
 @Data
-public class PartnerVO {
+public class PartnerVO implements Serializable {
     private Long id;
     private String name;
     private String imageUrl;

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/ResourceVO.java

@@ -3,12 +3,14 @@ package com.mooctest.crowd.site.data.vo;
 import com.mooctest.crowd.domain.domainobject.Resource;
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author guochao
  * @date 2019/7/6 17:54
  */
 @Data
-public class ResourceVO {
+public class ResourceVO implements Serializable {
     private String code;
     private String name;
 

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/TestTypeVO.java

@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * @author guochao
  * @date 2019/7/6 17:54
@@ -12,7 +14,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class TestTypeVO {
+public class TestTypeVO implements Serializable {
     private String code;
     private String name;
 

+ 2 - 1
site/src/main/java/com/mooctest/crowd/site/data/vo/UserVO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.beans.BeanUtils;
 
+import java.io.Serializable;
 import java.sql.Date;
 
 /**
@@ -15,7 +16,7 @@ import java.sql.Date;
  */
 @Data
 @NoArgsConstructor
-public class UserVO {
+public class UserVO implements Serializable {
     private Long id;
     private String name;
     private String userName;

+ 32 - 11
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -136,19 +136,24 @@ public class WebMediatorImpl implements ViewMediator {
         Pageable pageable = PageRequest.of(0, 3);
         int top = 3;
         //获取热门众测
-        List<ApplicationTypeVO> applicationTypeRanks = projectDao.findTotalCountOfApplicationType(pageable).stream().map(rankInfos -> {
+        List<ApplicationTypeVO> applicationTypeRank = projectDao.findTotalCountOfApplicationType(pageable).stream().map(rankInfos -> {
             ApplicationType applicationType = commonRepo.getApplicationTypeByAppCode(rankInfos.getCode());
             ApplicationTypeVO applicationTypeVO = new ApplicationTypeVO(applicationType);
             applicationTypeVO.setCount(rankInfos.getCount());
             return applicationTypeVO;
         }).filter(Objects::nonNull).collect(Collectors.toList());
+        List<ApplicationTypeVO> applicationTypeRanks = new ArrayList<>();
         if (applicationTypeRanks.size() > top) {
-            applicationTypeRanks = applicationTypeRanks.subList(0, top);
+            for(int i = 0; i < top; i++){
+                applicationTypeRanks.add(applicationTypeRank.get(i));
+            }
+        }else{
+            applicationTypeRanks = applicationTypeRank;
         }
 
         //获取机构排名
         String agencyName = agencyDao.findById(Long.parseLong(agencyId)).get().getEvaluationAgencyName();
-        List<EvolutionAgencyVO> agencyRanks = taskToUserDao.findTotalCountOfUser().stream().map(rankInfo -> {
+        List<EvolutionAgencyVO> agencyRank = taskToUserDao.findTotalCountOfUser().stream().map(rankInfo -> {
             EvaluationAgencyPO agency = agencyDao.findByUserId(rankInfo.getEntityId());
             if (agency != null && !agency.getEvaluationAgencyName().equals(agencyName)) {
                 EvolutionAgencyVO agencyVO = new EvolutionAgencyVO();
@@ -161,12 +166,17 @@ public class WebMediatorImpl implements ViewMediator {
             }
             return null;
         }).filter(Objects::nonNull).collect(Collectors.toList());
-        if (agencyRanks.size() > top) {
-            agencyRanks = agencyRanks.subList(0, top);
+        List<EvolutionAgencyVO> agencyRanks = new ArrayList<>();
+        if (agencyRank.size() > top) {
+            for(int i = 0; i < top; i++){
+                agencyRanks.add(agencyRank.get(i));
+            }
+        }else{
+            agencyRanks = agencyRank;
         }
 
         //获取众测人员排名
-        List<UserVO> userRanks = taskToUserDao.findTotalCountOfUser().stream().map(rankInfo -> {
+        List<UserVO> userRank = taskToUserDao.findTotalCountOfUser().stream().map(rankInfo -> {
             EvaluationAgencyPO agency = agencyDao.findByUserId(rankInfo.getEntityId());
             if (agency != null && agency.getEvaluationAgencyName().equals(agencyName)) {
                 User user = userRepo.getByID(agency.getUserId());
@@ -176,16 +186,27 @@ public class WebMediatorImpl implements ViewMediator {
             }
             return null;
         }).filter(Objects::nonNull).collect(Collectors.toList());
-        if (userRanks.size() > top) {
-            userRanks = userRanks.subList(0, top);
+        List<UserVO> userRanks = new ArrayList<>();
+        if (userRank.size() > top) {
+            for(int i = 0; i < top; i++){
+                userRanks.add(userRank.get(i));
+            }
+        }else{
+            userRanks = userRank;
         }
 
         // 获取大赛信息
         List<Competition> competitionList = commonRepo.getAllCompetition();
+        List<Competition> competitionLists = new ArrayList<>();
         if (competitionList.size() > top) {
-            competitionList = competitionList.subList(0, top);
+            for(int i = 0; i < top; i++){
+                competitionLists.add(competitionList.get(i));
+            }
+        }else{
+            competitionLists = competitionList;
         }
-        List<CompetitionVO> competitionVOS = competitionList.stream().map(competition -> {
+
+        List<CompetitionVO> competitionVOS = competitionLists.stream().map(competition -> {
             CompetitionVO competitionVO = new CompetitionVO(competition);
             return competitionVO;
         }).sorted(Comparator.comparing(CompetitionVO::getStartTime).reversed()).collect(Collectors.toList());
@@ -341,7 +362,7 @@ public class WebMediatorImpl implements ViewMediator {
                 CrowdProjectVO projectVO = new CrowdProjectVO(project);
                 List<CrowdTestTaskPO> tasksOfProject = taskDao.findByCrowdTestProjectCodeAndIsDeleted(project.getCode(), DeletedStatus.isNotDeleted);
                 if (tasksOfProject != null && tasksOfProject.stream().anyMatch(task -> task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
-                    log.info("\n\n需要处理!!!\n\n");
+//                    log.info("\n\n需要处理!!!\n\n");
                     projectVO.setNeedHandle(true);
                 }
                 return projectVO;

+ 1 - 2
site/src/main/java/com/mooctest/crowd/site/service/CommonService.java

@@ -10,7 +10,6 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 @Service
@@ -19,7 +18,7 @@ public interface CommonService {
 
     MyCrowdDTO getPersonCrowd(Long userId);
 
-    IndexInfoDTO getIndexInfos(HttpServletRequest request);
+    IndexInfoDTO getIndexInfos(Long userId);
 
     IndexPageDTO getIndexPageInfo(Pageable pageable, Map<String, String> extraCondition, String keyword, int deletedStatus);
 

+ 6 - 3
site/src/main/java/com/mooctest/crowd/site/service/impl/CommonServiceImpl.java

@@ -13,11 +13,11 @@ import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.CommonService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 @Service
@@ -38,6 +38,9 @@ public class CommonServiceImpl implements CommonService {
     @Autowired
     private CommonRepo commonRepo;
 
+//    @Autowired
+//    private CacheUtil cacheUtil;
+
     @Override
     public IndexDTO getIndexInfo() {
         return viewMediator.renderIndex();
@@ -49,9 +52,9 @@ public class CommonServiceImpl implements CommonService {
     }
 
     @Override
-    public IndexInfoDTO getIndexInfos(HttpServletRequest request) {
+    @Cacheable(value = "indexInfo",key = "#userId")
+    public IndexInfoDTO getIndexInfos(Long userId){
         IndexInfoDTO indexInfoDTO = viewMediator.renderIndexInfos();
-//        request.getSession().setAttribute("indexInfo", indexInfoDTO);
         return indexInfoDTO;
     }
 

+ 46 - 0
site/src/main/java/com/mooctest/crowd/site/util/CacheUtil.java

@@ -0,0 +1,46 @@
+package com.mooctest.crowd.site.util;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.mooctest.crowd.site.data.dto.IndexInfoDTO;
+import com.mooctest.crowd.site.mediator.ViewMediator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpSession;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created on 2018/10/19
+ */
+@Component
+public class CacheUtil {
+
+    @Autowired
+    private ViewMediator viewMediator;
+
+    @Value("${cache.expire.duration}")
+    long expireDuration;
+
+    private Cache<HttpSession, IndexInfoDTO> indexInfoCache;
+
+    @PostConstruct
+    private void init(){
+      indexInfoCache = CacheBuilder
+                .newBuilder()
+                .maximumSize(1000)
+                .expireAfterAccess(expireDuration, TimeUnit.MINUTES)
+                .build();
+    }
+
+    public IndexInfoDTO getIndexInfoCache(HttpSession session) throws ExecutionException {
+        return indexInfoCache.get(session, () -> viewMediator.renderIndexInfos());
+    }
+
+    public void setIndexInfoCache(HttpSession session, IndexInfoDTO indexInfoDTO){
+        indexInfoCache.put(session, indexInfoDTO);
+    }
+}

+ 6 - 1
site/src/main/resources/application.yml

@@ -54,7 +54,12 @@ oss:
 #  service:
 #    baseUrl: http://111.231.143.6:8081
 
+cache:
+  expire:
+    duration: 60
+
 agency: 7
+
 ---
 spring:
   profiles: dev
@@ -84,7 +89,7 @@ website:
 spring:
   profiles: dev-localhost
   datasource:
-    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service?useSSL=false&useUnicode=yes&characterEncoding=UTF-8
+    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
     username: mooctest
     password: secr3t!
   redis:

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است