Browse Source

Merge branch 'feature-V2.0' into 'Test'

Feature v2.0

See merge request crowd-2019/crowd-test-service-backend!162
郭超 4 years ago
parent
commit
8f19149787

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

@@ -2,16 +2,27 @@ package com.mooctest.crowd.site;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 @EnableScheduling
+@ServletComponentScan
+@EnableCaching
+@EnableAsync
 @SpringBootApplication(scanBasePackages = "com.mooctest.crowd")
 public class SiteApplication {
 
 	public static void main(String[] args) {
 		SpringApplication.run(SiteApplication.class, args);
 	}
+
+//	@Bean
+//	public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
+//		PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
+//		c.setIgnoreUnresolvablePlaceholders(true);
+//		return c;
+//	}
 }
+

+ 1 - 2
site/src/main/java/com/mooctest/crowd/site/configuration/OSSConfiguration.java

@@ -5,7 +5,6 @@ import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
@@ -29,7 +28,7 @@ public class OSSConfiguration {
     @Value("${oss.bucketName}")
     private String bucketName;
 
-    public String getBaseUrl(){
+    public String getBaseUrl() {
         return "http://"+bucketName+"."+endPoint+"/";
     }
 

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

@@ -1,177 +0,0 @@
-//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;
-////    }
-////
-////    @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 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;
-////    }
-//
-//    /**
-//     * 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;
-//    }
-//
-//    /**
-//     * 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;
-//    }
-//
-//}
-//
-//

+ 3 - 0
site/src/main/java/com/mooctest/crowd/site/data/TaskOperationControl.java

@@ -21,6 +21,7 @@ public class TaskOperationControl {
     private boolean confirmFinish = false;
     private boolean writeReport = false;
     private boolean taskDemonstrate = false;
+    private boolean taskRecommend = false;
 
     public void hasAll(){
         this.receive = true;
@@ -30,6 +31,7 @@ public class TaskOperationControl {
         this.finish = true;
         this.uploadReport = true;
         this.taskDemonstrate = true;
+        this.taskRecommend = true;
     }
 
     public void noAll(){
@@ -41,5 +43,6 @@ public class TaskOperationControl {
         this.uploadReport = false;
         this.writeReport = false;
         this.taskDemonstrate = false;
+        this.taskRecommend = false;
     }
 }

+ 3 - 1
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -1675,12 +1675,14 @@ public class WebMediatorImpl implements ViewMediator {
                     || (user.getRegionalManager() != null && user.getId().equals(project.getRegionalManagerId()))) {
                 if (task.getStatus() < CrowdTestTaskStatus.HAS_RECEIVED) {
                     taskOperationControl.setUpdate(true);
+                    taskOperationControl.setTaskRecommend(true);
                     // 具有配置项,需要在第三方进行填写报告
                     if(endPointPOOptional.isPresent()){
                         taskOperationControl.setWriteReport(true);
                     }
                 }
                 else{
+                    taskOperationControl.setTaskRecommend(true);
                     if ((task.getParticipantHasCommittedCount() == task.getAcceptedCount() && task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (task.getParticipantHasCommittedCount() == task.getParticipantCount() && task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
                         taskOperationControl.setConfirmFinish(true);
                     }
@@ -1688,6 +1690,7 @@ public class WebMediatorImpl implements ViewMediator {
                     taskOperationControl.setFinish(false);
                     if (task.getStatus() == CrowdTestTaskStatus.HAS_FINISHED || task.getStatus() == CrowdTestTaskStatus.HAS_TIME_OUT) {
                         taskOperationControl.setConfirmFinish(false);
+                        taskOperationControl.setTaskRecommend(false);
                     }
                     // 具有配置项,需要在第三方进行填写报告
                     if(endPointPOOptional.isPresent()){
@@ -1699,7 +1702,6 @@ public class WebMediatorImpl implements ViewMediator {
                         }
                     }
                 }
-
             }
             // TODO 已拒绝视图
             //评测机构和测评人员视角

+ 8 - 0
site/src/main/java/com/mooctest/crowd/site/service/FileService.java

@@ -0,0 +1,8 @@
+package com.mooctest.crowd.site.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+public interface FileService {
+
+    String uploadFile(String fileName, MultipartFile file);
+}

+ 40 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/FileServiceImpl.java

@@ -0,0 +1,40 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.site.service.FileService;
+import com.mooctest.crowd.site.util.FileUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author guochao
+ * @date 2020-12-25 14:51
+ */
+@Service
+@ConditionalOnExpression("${feature.client.oss}==false")
+public class FileServiceImpl implements FileService {
+    @Value("${file.save.path}")
+    private String fileSaveRootPath;
+
+    @Override
+    public String uploadFile(String fileName, MultipartFile file) {
+
+        String[] split = fileName.split("/");
+        String fileNameOrigin = "";
+        String fileTypePath = "";
+        if(split.length > 0){
+            fileTypePath = fileName.substring(0, fileName.lastIndexOf('/'));
+            fileNameOrigin = fileName.substring(fileName.lastIndexOf('/') + 1, fileName.length());
+        }
+
+        try {
+            return FileUtil.save(fileSaveRootPath + fileTypePath, file, fileNameOrigin);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 4 - 17
site/src/main/java/com/mooctest/crowd/site/service/impl/OSSUploadServiceImpl.java

@@ -1,16 +1,13 @@
 package com.mooctest.crowd.site.service.impl;
 
-import com.aliyun.oss.OSS;
-import com.aliyun.oss.model.PutObjectResult;
-import com.mooctest.crowd.domain.exception.BaseException;
-import com.mooctest.crowd.site.configuration.OSSConfiguration;
 import com.mooctest.crowd.site.constants.UploadType;
+import com.mooctest.crowd.site.service.FileService;
 import com.mooctest.crowd.site.service.UploadService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
-import java.awt.*;
+
 import java.util.UUID;
 
 /**
@@ -24,9 +21,8 @@ public class OSSUploadServiceImpl implements UploadService {
 
 //    @Autowired
 //    private OSS ossClient;
-
     @Autowired
-    private OSSConfiguration ossConfig;
+    private FileService fileService;
 
     @Override
     public String uploadImage(MultipartFile file, Long userId) {
@@ -80,15 +76,6 @@ public class OSSUploadServiceImpl implements UploadService {
     }
 
     private String doUpload(String fileName, MultipartFile file){
-        OSS ossClient = ossConfig.ossClient();
-        try {
-            PutObjectResult result = ossClient.putObject(ossConfig.getBucketName(), fileName, file.getInputStream());
-            return ossConfig.getBaseUrl()+fileName;
-        } catch (Exception e) {
-            log.error("OSS上传出错!", e);
-            throw new BaseException(e.getMessage());
-        } finally {
-            ossClient.shutdown();
-        }
+        return fileService.uploadFile(fileName, file);
     }
 }

+ 36 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/OssFileServiceImpl.java

@@ -0,0 +1,36 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.aliyun.oss.OSS;
+import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.site.configuration.OSSConfiguration;
+import com.mooctest.crowd.site.service.FileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author guochao
+ * @date 2020-12-25 14:51
+ */
+@Service
+@ConditionalOnExpression("${feature.client.oss}==true")
+public class OssFileServiceImpl implements FileService {
+
+    @Autowired
+    private OSSConfiguration ossConfig;
+
+    @Override
+    public String uploadFile(String fileName, MultipartFile file){
+        OSS ossClient = ossConfig.ossClient();
+        try {
+            ossClient.putObject(ossConfig.getBucketName(), fileName, file.getInputStream());
+            return ossConfig.getBaseUrl()+fileName;
+        } catch (Exception e) {
+            throw new BaseException(e.getMessage());
+        } finally {
+            ossClient.shutdown();
+        }
+
+    }
+}

+ 24 - 2
site/src/main/java/com/mooctest/crowd/site/util/FileUtil.java

@@ -5,8 +5,7 @@ import cn.afterturn.easypoi.excel.entity.ImportParams;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -55,9 +54,32 @@ public class FileUtil {
 
         //exe可执行文件
         FILE_TYPE_MAP.put("4d5a90", "exe");
+    }
 
+    public static String save(String dirPath, MultipartFile inputFile, String fileName) throws IOException {
+        byte[] bs = new byte[1024];
+        int len;
 
+        File saveDir = new File(dirPath);
+        if (!saveDir.exists()) {
+            saveDir.mkdirs();
+        }
+        if(fileName.equals("")){
+            fileName = inputFile.getOriginalFilename();
+        }
+        String saveFilePath = saveDir.getPath() + "/"  + fileName;
+        OutputStream os = new FileOutputStream( saveFilePath );
+        InputStream is = inputFile.getInputStream();
+        while ((len = is.read(bs)) != -1) {
+            os.write(bs, 0, len);
+        }
+
+        os.close();
+        is.close();
+
+        return saveFilePath.replaceAll("\\\\", "/" );
     }
+
     public static boolean checkFile(InputStream inputStream){
         try {
             byte[] headBytes = new byte[3];

+ 35 - 64
site/src/main/resources/application.yml

@@ -1,60 +1,30 @@
 spring:
   profiles:
-#    active: dev-pre
-#    active: dev-online
      active: dev-localhost
   cache:
     guava:
       spec: expireAfterWrite=30s
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-#    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service?useSSL=false&useUnicode=yes&characterEncoding=UTF-8
-#    username: mooctest
-#    password: secr3t!
-    # Keep the connection alive if idle for a long time (needed in production)
     testWhileIdle: true
     validationQuery: SELECT 1
-  # Show or not log for each sql query
   jpa:
     show-sql: true
-  # Hibernate ddl auto (create, create-drop, update)
   hibernate:
     ddl-auto: validate
-    #hbm2ddl.auto: update
-    # Naming strategy
     naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
-  # The SQL dialect makes Hibernate generate better SQL for the chosen database
   properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
-#  redis:
-#    host: 114.55.91.27
-#    pool: 6379
-#    password: '#03#05@ise@mooctest'
-#    jedis:
-#      pool:
-#        max-active: 8
-#        max-idle: 8
-#        max-wait: -1
-#        min-idle: 0
-#    database: 6
   servlet:
     multipart:
       enabled: true
       max-file-size: 100MB
       max-request-size: 100MB
 
-feature-switch:
-  default:
-    role: generalUser
 oss:
-#  accessKeyId: LTAI4Frsvbz6G8RKb9dWDPUz
-#  accessKeySecret: xdxGJuMlrEMMP3ZKY6n0WyZZNZAqrE
   accessKeyId: LTAI4FdrT3HsfdR5edBVN7ws
   accessKeySecret: yroxrpm46DzTyzHrLBZzS3MRNIicP6
   endPoint: oss-cn-hangzhou.aliyuncs.com
   bucketName: mooctest-crowd-service
-#user:
-#  service:
-#    baseUrl: http://111.231.143.6:8081
 
 cache:
   expire:
@@ -67,11 +37,12 @@ green:
     id: 99222
   agency:
     id: 99231
+
 ---
 spring:
-  profiles: dev
+  profiles: private
   datasource:
-    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service-private?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
     username: mooctest
     password: secr3t!
   redis:
@@ -85,9 +56,19 @@ spring:
         max-wait: -1
         min-idle: 0
     database: 6
+
+feature:
+  client:
+    oss: false
+
+file:
+  save:
+    path: /Users/guochao/Desktop/project/data/cofortest/
+
 user:
   service:
-    baseUrl: http://59.42.10.53:8081
+    baseUrl: http://127.0.0.1:8081
+#    baseUrl: http://59.42.10.53:8081
 
 website:
   domain: mooctest.net
@@ -96,7 +77,7 @@ website:
 spring:
   profiles: dev-localhost
   datasource:
-    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service-online?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+    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:
@@ -110,6 +91,11 @@ spring:
         max-wait: -1
         min-idle: 0
     database: 6
+
+feature:
+  client:
+    oss: true
+
 user:
   service:
 #    baseUrl: http://127.0.0.1:8081
@@ -120,13 +106,13 @@ website:
 
 ---
 spring:
-  profiles: dev-pre
+  profiles: pre
   datasource:
     url: jdbc:mysql://101.37.175.111:3306/crowd-test-service-pre?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
     username: mooctest
     password: secr3t!
   redis:
-    host: 59.42.10.53
+    host: 10.18.18.50
     pool: 6379
     password: '#2019@callforttest@!'
     jedis:
@@ -138,19 +124,20 @@ spring:
     database: 6
 user:
   service:
-    baseUrl: http://59.42.10.53:8081
+    baseUrl: http://10.18.18.50:8081
+
+feature:
+  client:
+    oss: true
 
 website:
   domain: mooctest.net
 
-
-
 ---
 spring:
   profiles: dev-online
   datasource:
     url: jdbc:mysql://101.37.175.111:3306/crowd-test-service-online?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
-
     username: mooctest
     password: secr3t!
   redis:
@@ -168,30 +155,9 @@ user:
   service:
     baseUrl: http://59.42.10.53:8081
 
-website:
-  domain: mooctest.net
-
----
-spring:
-  profiles: pre
-  datasource:
-    url: jdbc:mysql://101.37.175.111:3306/crowd-test-service-pre?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
-    username: mooctest
-    password: secr3t!
-  redis:
-    host: 10.18.18.50
-    pool: 6379
-    password: '#2019@callforttest@!'
-    jedis:
-      pool:
-        max-active: 8
-        max-idle: 8
-        max-wait: -1
-        min-idle: 0
-    database: 6
-user:
-  service:
-    baseUrl: http://10.18.18.50:8081
+feature:
+  client:
+    oss: true
 
 website:
   domain: mooctest.net
@@ -214,6 +180,11 @@ spring:
         max-wait: -1
         min-idle: 0
     database: 0
+
+feature:
+  client:
+    oss: true
+
 user:
   service:
     baseUrl: http://user.cofortest.com