Sfoglia il codice sorgente

campus and termianl user complete

huodongdong 7 anni fa
parent
commit
bbb144a1c9
87 ha cambiato i file con 2427 aggiunte e 134 eliminazioni
  1. 1 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/entity/AuthResult.java
  2. 1 1
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/AuthService.java
  3. 1 1
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/SimpleAuthService.java
  4. 11 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java
  5. 36 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/SecurityConfig.java
  6. 3 4
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/WareController.java
  7. 28 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/resource/ResourceController.java
  8. 50 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/CampusController.java
  9. 53 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/TerminalUserController.java
  10. 145 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/proxy/WareServiceProxy.java
  11. 27 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/resource/ResourceService.java
  12. 30 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/CampusService.java
  13. 30 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/TerminalUserService.java
  14. 4 0
      rankin-cms-web/src/main/resources/bootstrap.yml
  15. 46 0
      rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/product/proxy/WareServiceProxyTest.java
  16. 18 0
      rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/user/CampusServiceTest.java
  17. 3 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICode.java
  18. 0 6
      rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/utils.java
  19. 2 2
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/CourseDTO.java
  20. 1 1
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SupportDTO.java
  21. 38 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/resource/ResourceDTO.java
  22. 2 2
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SearchDTO.java
  23. 0 1
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/SearchDTO.java
  24. 41 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CampusDTO.java
  25. 24 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CampusSearchDTO.java
  26. 2 2
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/MerchantDTO.java
  27. 35 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/TerminalUserDTO.java
  28. 4 6
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SearchDTO.java
  29. 7 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/HttpUtil.java
  30. 11 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/JpaSortUtil.java
  31. 8 2
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/ProvinceUtil.java
  32. 18 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/validator/Domain.java
  33. 30 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/validator/DomainValidator.java
  34. 2 2
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/CourseVo.java
  35. 2 1
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/SupportVo.java
  36. 9 4
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/WareVo.java
  37. 38 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/resource/ResourceVo.java
  38. 44 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/CampusVo.java
  39. 41 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/TerminalUserVo.java
  40. 9 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/RecommendController.java
  41. 2 4
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Course.java
  42. 49 0
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Recommend.java
  43. 3 1
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Support.java
  44. 1 33
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Ware.java
  45. 7 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/RecommendRepository.java
  46. 13 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/RecommendService.java
  47. 38 0
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/ListAttributeConverter.java
  48. 3 0
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/TestUtil.java
  49. 2 0
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/ResourceServiceApplication.java
  50. 20 15
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/controller/ResourceController.java
  51. 85 0
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/dto/ResourceDetail.java
  52. 9 0
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/proxy/RemoteResourceProxy.java
  53. 38 6
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/service/ResourceService.java
  54. 35 0
      rankin-resource-service/src/test/java/cn/rankin/resourceservice/service/ResourceServiceTest.java
  55. 4 2
      rankin-user-service/pom.xml
  56. 2 0
      rankin-user-service/src/main/java/cn/rankin/userservice/UserServiceApplication.java
  57. 9 0
      rankin-user-service/src/main/java/cn/rankin/userservice/code/UserServiceAPICode.java
  58. 42 0
      rankin-user-service/src/main/java/cn/rankin/userservice/configuration/FeignConfiguration.java
  59. 159 0
      rankin-user-service/src/main/java/cn/rankin/userservice/controller/CampusController.java
  60. 250 0
      rankin-user-service/src/main/java/cn/rankin/userservice/controller/TerminalUserController.java
  61. 31 0
      rankin-user-service/src/main/java/cn/rankin/userservice/dto/RemoteUser.java
  62. 19 0
      rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserLogin.java
  63. 15 0
      rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserPasswd.java
  64. 17 0
      rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserRegistry.java
  65. 22 6
      rankin-user-service/src/main/java/cn/rankin/userservice/entity/Campus.java
  66. 0 25
      rankin-user-service/src/main/java/cn/rankin/userservice/entity/Counter.java
  67. 5 0
      rankin-user-service/src/main/java/cn/rankin/userservice/entity/Merchant.java
  68. 38 2
      rankin-user-service/src/main/java/cn/rankin/userservice/entity/TerminalUser.java
  69. 24 0
      rankin-user-service/src/main/java/cn/rankin/userservice/proxy/RemoteUserFeign.java
  70. 55 0
      rankin-user-service/src/main/java/cn/rankin/userservice/proxy/RemoteUserProxy.java
  71. 17 0
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/CampusRepository.java
  72. 3 1
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/MerchantRepository.java
  73. 0 1
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/TerminalDeviceRepository.java
  74. 18 0
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/TerminalUserRepository.java
  75. 91 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/CampusService.java
  76. 4 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/MerchantService.java
  77. 13 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalDeviceService.java
  78. 94 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalUserService.java
  79. 18 0
      rankin-user-service/src/main/java/cn/rankin/userservice/utils/Constant.java
  80. 28 0
      rankin-user-service/src/main/java/cn/rankin/userservice/utils/DTOConverter.java
  81. 31 0
      rankin-user-service/src/main/java/cn/rankin/userservice/utils/StudentNo.java
  82. 126 0
      rankin-user-service/src/main/java/cn/rankin/userservice/utils/StudentNumberUtil.java
  83. 4 0
      rankin-user-service/src/main/resources/bootstrap.yml
  84. 36 0
      rankin-user-service/src/test/java/cn/rankin/userservice/proxy/RemoteUserFeignTest.java
  85. 29 0
      rankin-user-service/src/test/java/cn/rankin/userservice/repository/CampusRepositoryTest.java
  86. 24 0
      rankin-user-service/src/test/java/cn/rankin/userservice/repository/MerchantRepositoryTest.java
  87. 39 0
      rankin-user-service/src/test/java/cn/rankin/userservice/service/TerminalUserServiceTest.java

+ 1 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/entity/AuthResult.java

@@ -1,4 +1,4 @@
-package cn.rankin.cmsweb.entity;
+package cn.rankin.apiweb.entity;
 
 import java.io.Serializable;
 

+ 1 - 1
rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/AuthService.java

@@ -1,6 +1,6 @@
 package cn.rankin.apiweb.service.auth;
 
-import cn.rankin.cmsweb.entity.AuthResult;
+import cn.rankin.apiweb.entity.AuthResult;
 
 public interface AuthService {
 

+ 1 - 1
rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/SimpleAuthService.java

@@ -1,6 +1,6 @@
 package cn.rankin.apiweb.service.auth;
 
-import cn.rankin.cmsweb.entity.AuthResult;
+import cn.rankin.apiweb.entity.AuthResult;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 

+ 11 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java

@@ -2,15 +2,25 @@ package cn.rankin.cmsweb.configuration;
 
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
+@Slf4j
+@Configuration
 public class FeignConfiguration {
 
     public static class ContentTypeInterceptor implements RequestInterceptor {
         @Override
         public void apply(RequestTemplate template) {
-            template.header("Content-Type", "application/json;charset=UTF-8");
+            template.header("Content-Type", "application/json");
+            log.info("add header content type");
         }
     }
 
+    @Bean
+    public ContentTypeInterceptor contentTypeInterceptor() {
+        return new ContentTypeInterceptor();
+    }
+
 }

+ 36 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/SecurityConfig.java

@@ -8,6 +8,7 @@ import cn.rankin.cmsweb.security.JwtAuthenticationTokenFilter;
 import cn.rankin.cmsweb.security.JwtTokenService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.util.HttpUtil;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +35,8 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa
 import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
 import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
 import org.springframework.security.web.authentication.session.SessionAuthenticationException;
+import org.springframework.security.web.header.Header;
+import org.springframework.security.web.header.HeaderWriter;
 import org.springframework.security.web.session.SessionManagementFilter;
 
 import javax.servlet.ServletException;
@@ -41,6 +44,8 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 安全配置中心
@@ -71,6 +76,33 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
 
+    public static class StaticHeadersWriter implements HeaderWriter {
+
+        private final static List<Header> headers = new ArrayList<>();
+
+        static {
+            headers.add(new Header("Access-Control-Allow-Origin", "*"));
+            headers.add(new Header("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH"));
+            headers.add(new Header("Access-Control-Allow-Headers", "Origin, X-Token, Authentication, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-control "));
+            headers.add(new Header("Access-Control-Allow-Credentials", "true"));
+        }
+
+        @Override
+        public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
+            for (Header header : headers) {
+                for (String value : header.getValues()) {
+                    response.addHeader(header.getName(), value);
+                }
+            }
+
+            String origin = request.getHeader("Origin");
+            if (!StringUtils.isEmpty(origin)) {
+                response.setHeader("Access-Control-Allow-Origin", origin);
+            }
+        }
+    }
+
+
     /**
      * 用户查询服务
      *
@@ -110,7 +142,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
     protected void configure(HttpSecurity http) throws Exception {
 
         // 禁用缓存
-        http.headers().cacheControl();
+        http.
+                headers().cacheControl()
+                .and().addHeaderWriter(new StaticHeadersWriter());
 
         http
                 // 分权限验证
@@ -239,4 +273,5 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
             HttpUtil.error(request, response, CmsWebAPICode.ACCESS_DENIED);
         }
     }
+
 }

+ 3 - 4
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/WareController.java

@@ -1,12 +1,11 @@
 package cn.rankin.cmsweb.controller.product;
 
-import cn.rankin.cmsweb.service.product.WareService;
+import cn.rankin.cmsweb.service.product.proxy.WareServiceProxy;
 import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.dto.product.WareDTO;
 import cn.rankin.common.utils.dto.search.SearchDTO;
-import cn.rankin.common.utils.util.BeanUtil;
 import cn.rankin.common.utils.vo.product.WareVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -18,11 +17,11 @@ import javax.validation.Valid;
 public class WareController {
 
     @Autowired
-    private WareService wareService;
+    private WareServiceProxy wareService;
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     public APIResult<Page<WareVo>> search(SearchDTO searchDTO) {
-        return wareService.search(BeanUtil.convertToMap(searchDTO));
+        return wareService.search(searchDTO);
     }
 
     @RequestMapping(method = RequestMethod.POST)

+ 28 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/resource/ResourceController.java

@@ -1,4 +1,32 @@
 package cn.rankin.cmsweb.controller.resource;
 
+import cn.rankin.cmsweb.service.resource.ResourceService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.resource.ResourceSearchDTO;
+import cn.rankin.common.utils.dto.resource.ResourceDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.resource.ResourceVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/resource")
 public class ResourceController {
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @RequestMapping(value = "/list")
+    public APIResult<Page<ResourceVo>> search(ResourceSearchDTO resourceSearchDTO) {
+        return resourceService.search(BeanUtil.convertToMap(resourceSearchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<ResourceVo> create(@RequestBody ResourceDTO resourceDTO) {
+        return resourceService.create(resourceDTO);
+    }
 }

+ 50 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/CampusController.java

@@ -0,0 +1,50 @@
+package cn.rankin.cmsweb.controller.user;
+
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.user.CampusService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.CampusDTO;
+import cn.rankin.common.utils.dto.user.CampusSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.user.CampusVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/campus")
+public class CampusController {
+
+    @Autowired
+    private CampusService campusService;
+
+    @RequestMapping(value = {"/list", "/"}, method = RequestMethod.GET)
+    public APIResult<Page<CampusVo>> search(@NeedUser UserDetails user, CampusSearchDTO campusSearchDTO) {
+        if (!user.isPlatForm()) {
+            String merchantId = user.getMerchantId();
+            campusSearchDTO.setMerchantId(merchantId);
+        }
+        return campusService.search(BeanUtil.convertToMap(campusSearchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<CampusVo> create(@RequestBody CampusDTO campusDTO) {
+        return campusService.create(campusDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<CampusVo> update(@RequestBody CampusDTO campusDTO) {
+        return campusService.update(campusDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return campusService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<CampusVo> getCampus(@PathVariable("id") String id) {
+        return campusService.getCampus(id);
+    }
+}

+ 53 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/TerminalUserController.java

@@ -0,0 +1,53 @@
+package cn.rankin.cmsweb.controller.user;
+
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.user.TerminalUserService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.TerminalUserDTO;
+import cn.rankin.common.utils.dto.user.TerminalUserSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.user.TerminalUserVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping(value = "/user")
+public class TerminalUserController {
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<TerminalUserVo>> search(@NeedUser UserDetails user, TerminalUserSearchDTO searchDTO) {
+        if (!user.isPlatForm()) {
+            String merchantId = user.getMerchantId();
+            searchDTO.setMerchantId(merchantId);
+        }
+
+        return terminalUserService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<TerminalUserVo> create(@RequestBody TerminalUserDTO terminalUserDTO) {
+        return terminalUserService.create(terminalUserDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<TerminalUserVo> update(@RequestBody TerminalUserDTO terminalUserDTO) {
+        return terminalUserService.update(terminalUserDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return terminalUserService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<TerminalUserVo> getUser(@PathVariable("id") String id) {
+        return terminalUserService.getUser(id);
+    }
+}

+ 145 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/proxy/WareServiceProxy.java

@@ -0,0 +1,145 @@
+package cn.rankin.cmsweb.service.product.proxy;
+
+import cn.rankin.cmsweb.service.product.WareService;
+import cn.rankin.cmsweb.service.resource.ResourceService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.WareDTO;
+import cn.rankin.common.utils.dto.search.SearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.WareVo;
+import cn.rankin.common.utils.vo.resource.ResourceVo;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class WareServiceProxy {
+
+    @Autowired
+    private WareService wareService;
+
+    @Autowired
+    private ResourceService resourceService;
+
+    public APIResult<Page<WareVo>> search(SearchDTO searchDTO) {
+        Map<String, Object> params = BeanUtil.convertToMap(searchDTO);
+        APIResult<Page<WareVo>> result = wareService.search(params);
+        if (result.getSuccess()) {
+            List<WareVo> wareVoList = result.getData().getList();
+            setWareUrl(wareVoList);
+            log.info(JSON.toJSONString(wareVoList));
+        }
+        return result;
+    }
+
+    public APIResult<WareVo> create(WareDTO wareDTO) {
+        APIResult<WareVo> result = wareService.create(wareDTO);
+        if (result.getSuccess()) {
+            WareVo wareVo = result.getData();
+            setWareUrl(wareVo);
+        }
+        return result;
+    }
+
+    public APIResult<WareVo> update(WareDTO wareDTO) {
+        APIResult<WareVo> result = wareService.update(wareDTO);
+        if (result.getSuccess()) {
+            WareVo wareVo = result.getData();
+            setWareUrl(wareVo);
+        }
+        return result;
+    }
+
+    public APIResult delete(String id) {
+        return wareService.delete(id);
+    }
+
+    public APIResult<WareVo> getWare(String id) {
+        APIResult<WareVo> result = wareService.getWare(id);
+        if (result.getSuccess()) {
+            WareVo wareVo = result.getData();
+            setWareUrl(wareVo);
+        }
+        return result;
+    }
+
+    public Map<String, ResourceVo> getResourceMap(List<String> idList) {
+        Map<String, ResourceVo> resourceVoMap = new HashMap<>();
+        if (CollectionUtils.isEmpty(idList)) {
+            return resourceVoMap;
+        }
+
+        APIResult<Map<String, ResourceVo>> apiResult = resourceService.getBatch(idList);
+        if (!apiResult.getSuccess()) {
+            log.warn("get resource map error!");
+            return resourceVoMap;
+        }else if (apiResult.getData() == null) {
+            log.warn("get resource map empty");
+            return resourceVoMap;
+        }
+
+        return apiResult.getData();
+    }
+
+    public void setWareUrl(List<WareVo> wareVoList) {
+        if (wareVoList == null) {
+            return;
+        }
+
+        List<String> idList = new ArrayList<>();
+        wareVoList.forEach(e -> {
+            List<String> resourceIdList = e.getResourceList();
+            if (!CollectionUtils.isEmpty(resourceIdList)) {
+                idList.addAll(resourceIdList);
+            }
+        });
+
+        Map<String, ResourceVo> resourceVoMap = getResourceMap(idList);
+
+        for (WareVo wareVo : wareVoList) {
+            List<String> resourceIdList = wareVo.getResourceList();
+            if (CollectionUtils.isEmpty(resourceIdList)) break;
+
+            List<ResourceVo> resourceVoList = new ArrayList<>();
+            for (String resourceId : resourceIdList) {
+                ResourceVo resourceVo = resourceVoMap.get(resourceId);
+                if (resourceVo != null) {
+                    resourceVoList.add(resourceVo);
+                }
+            }
+            wareVo.setResourceVoList(resourceVoList);
+        }
+    }
+
+    public void setWareUrl(WareVo wareVo) {
+        if (wareVo == null || wareVo.getResourceList() == null) {
+            return;
+        }
+
+        List<String> resourceIdList = wareVo.getResourceList();
+        if (CollectionUtils.isEmpty(resourceIdList)) {
+            return;
+        }
+
+        Map<String, ResourceVo> resourceVoMap = getResourceMap(resourceIdList);
+
+        List<ResourceVo> resourceVoList = new ArrayList<>();
+        for (String resourceId : resourceIdList) {
+            ResourceVo resourceVo = resourceVoMap.get(resourceId);
+//            ResourceVo resourceVo = (ResourceVo) resourceVoMap.values().toArray()[0];
+            if (resourceVo != null) {
+                resourceVoList.add(resourceVo);
+            }
+        }
+        wareVo.setResourceVoList(resourceVoList);
+    }
+}

+ 27 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/resource/ResourceService.java

@@ -0,0 +1,27 @@
+package cn.rankin.cmsweb.service.resource;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.resource.ResourceDTO;
+import cn.rankin.common.utils.vo.resource.ResourceVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(value = "${service.resource.name}")
+public interface ResourceService {
+
+    @RequestMapping(value = "/resource/list")
+    APIResult<Page<ResourceVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "/resource", method = RequestMethod.POST)
+    APIResult<ResourceVo> create(@RequestBody ResourceDTO resourceDTO);
+
+    @RequestMapping(value = "/resource/batch", method = RequestMethod.GET)
+    APIResult<Map<String, ResourceVo>> getBatch(@RequestParam("id") List<String> ids);
+}

+ 30 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/CampusService.java

@@ -0,0 +1,30 @@
+package cn.rankin.cmsweb.service.user;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.CampusDTO;
+import cn.rankin.common.utils.vo.user.CampusVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@FeignClient(name = "${service.user.name}")
+public interface CampusService {
+
+    @RequestMapping(value = "/campus/list", method = RequestMethod.GET)
+    APIResult<Page<CampusVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "/campus", method = RequestMethod.POST)//, consumes = MediaType.APPLICATION_JSON_VALUE)//, consumes = "application/json")
+    APIResult<CampusVo> create(@RequestBody CampusDTO campusDTO);
+
+    @RequestMapping(value = "/campus", method = RequestMethod.PUT)
+    APIResult<CampusVo> update(@RequestBody CampusDTO campusDTO);
+
+    @RequestMapping(value = "/campus/{id}", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@PathVariable("id") String id);
+
+    @RequestMapping(value = "/campus/{id}", method = RequestMethod.GET)
+    APIResult<CampusVo> getCampus(@PathVariable("id") String id);
+}

+ 30 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/TerminalUserService.java

@@ -0,0 +1,30 @@
+package cn.rankin.cmsweb.service.user;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.TerminalUserDTO;
+import cn.rankin.common.utils.vo.user.TerminalUserVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@FeignClient(name = "${service.user.name}")
+public interface TerminalUserService {
+
+    @RequestMapping(value = "/user/list", method = RequestMethod.GET)
+    APIResult<Page<TerminalUserVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "/user", method = RequestMethod.POST)
+    APIResult<TerminalUserVo> create(@RequestBody TerminalUserDTO userDTO);
+
+    @RequestMapping(value = "/user", method = RequestMethod.PUT)
+    APIResult<TerminalUserVo> update(@RequestBody TerminalUserDTO userDTO);
+
+    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@PathVariable("id") String id);
+
+    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
+    APIResult<TerminalUserVo> getUser(@PathVariable("id") String id);
+
+}

+ 4 - 0
rankin-cms-web/src/main/resources/bootstrap.yml

@@ -12,3 +12,7 @@ feign:
 
 server:
   port: 8500
+
+#logging:
+#  level:
+#    root: debug

+ 46 - 0
rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/product/proxy/WareServiceProxyTest.java

@@ -0,0 +1,46 @@
+package cn.rankin.cmsweb.service.product.proxy;
+
+import cn.rankin.cmsweb.CmsWebApplication;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.search.SearchDTO;
+import cn.rankin.common.utils.vo.product.WareVo;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = CmsWebApplication.class)
+public class WareServiceProxyTest {
+
+//    @Autowired
+//    private WareServiceProxy wareService;
+    @Test
+    public void search() throws Exception {
+//        SearchDTO searchDTO = new SearchDTO();
+//        APIResult<Page<WareVo>> result = wareService.search(searchDTO);
+//        log.info(JSON.toJSONString(result));
+    }
+
+    @Test
+    public void create() throws Exception {
+    }
+
+    @Test
+    public void update() throws Exception {
+    }
+
+    @Test
+    public void delete() throws Exception {
+    }
+
+    @Test
+    public void getWare() throws Exception {
+    }
+
+}

+ 18 - 0
rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/user/CampusServiceTest.java

@@ -0,0 +1,18 @@
+package cn.rankin.cmsweb.service.user;
+
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static org.junit.Assert.*;
+
+public class CampusServiceTest {
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    @Test
+    public void create() throws Exception {
+
+    }
+
+}

+ 3 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICode.java

@@ -35,6 +35,9 @@ public class APICode {
     // cms flag code
     public final static int _CMS_WEB_FLAG = 10000;
 
+    // user flag code
+    public final static int _USER_SERVICE_FLAG = 20000;
+
     public static BaseCode ok(String message) {
         return new BaseCode(_C_OK, message);
     }

+ 0 - 6
rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/utils.java

@@ -1,6 +0,0 @@
-package cn.rankin.common.utils.constant;
-
-public final class utils {
-
-    public static final int APP_CODE = 1502;
-}

+ 2 - 2
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/CourseDTO.java

@@ -23,9 +23,9 @@ public class CourseDTO implements Serializable {
 
     private String keyword;
 
-    private String cvImgList;
+    private String coverUrl;
 
-    private String bgImgList;
+    private String bgUrl;
 
     private BaseStatusEnum status;
 

+ 1 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SupportDTO.java

@@ -21,7 +21,7 @@ public class SupportDTO implements Serializable {
 
     private String detail;
 
-    private String imgList;
+    private List<String> imgList;
 
     private BaseStatusEnum status;
 

+ 38 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/resource/ResourceDTO.java

@@ -0,0 +1,38 @@
+package cn.rankin.common.utils.dto.resource;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class ResourceDTO implements Serializable {
+
+    private String id;
+
+    private String code;
+
+    private String name;
+
+    private Integer type;
+
+    private String format;
+
+    private String quality;
+
+    private Long size;
+
+    private String path;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private String url;
+
+}

+ 2 - 2
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SearchDTO.java

@@ -1,11 +1,11 @@
-package cn.rankin.common.utils.dto.product;
+package cn.rankin.common.utils.dto.resource;
 
 import lombok.Data;
 
 import java.io.Serializable;
 
 @Data
-public class SearchDTO implements Serializable {
+public class ResourceSearchDTO implements Serializable {
 
     private String code;
 

+ 0 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/SearchDTO.java

@@ -1,7 +1,6 @@
 package cn.rankin.common.utils.dto.search;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
-import cn.rankin.common.utils.enums.WareTypeEnum;
 import lombok.Data;
 
 import java.io.Serializable;

+ 41 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CampusDTO.java

@@ -0,0 +1,41 @@
+package cn.rankin.common.utils.dto.user;
+
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class CampusDTO implements Serializable {
+
+    private String id;
+
+    private String code;
+
+    @NotNull
+    private String merchantId;
+
+    @NotNull
+    private String provinceCode;
+
+    private String cityName;
+
+    private String zoneName;
+
+    private Integer serialNo;
+
+    private String contactName;
+
+    private String mobile;
+
+    private String address;
+
+    private String bankAccount;
+
+    // 开户行
+    private String depositBank;
+
+}

+ 24 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CampusSearchDTO.java

@@ -0,0 +1,24 @@
+package cn.rankin.common.utils.dto.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class CampusSearchDTO implements Serializable {
+
+    private String name;
+
+    private String merchantId;
+
+    private String sort;
+
+    private Integer by;
+
+    private Integer pageNo = 1;
+
+    private Integer pageSize = 10;
+}

+ 2 - 2
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/MerchantDTO.java

@@ -2,9 +2,11 @@ package cn.rankin.common.utils.dto.user;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.ReceiptTypeEnum;
+import cn.rankin.common.utils.validator.Domain;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 
 @Data
@@ -12,10 +14,8 @@ public class MerchantDTO implements Serializable{
 
     private String id;
 
-    @NotNull
     private Integer domain;
 
-    @NotNull
     private String code;
 
     private String name;

+ 35 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/TerminalUserDTO.java

@@ -0,0 +1,35 @@
+package cn.rankin.common.utils.dto.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+@ToString
+public class TerminalUserDTO implements Serializable {
+
+    private String id;
+
+    private String code;
+
+    private String password;
+
+    private Integer serialNo;
+
+    private String campusId;
+
+    private String name;
+
+    private BaseStatusEnum status;
+
+    private String merchantId;
+
+    private String merchantName;
+
+    private String contactName;
+
+    private String mobile;
+}

+ 4 - 6
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/product/SearchDTO.java

@@ -1,17 +1,17 @@
-package cn.rankin.common.utils.dto.product;
+package cn.rankin.common.utils.dto.user;
 
 import lombok.Data;
 
 import java.io.Serializable;
 
 @Data
-public class SearchDTO implements Serializable {
+public class TerminalUserSearchDTO implements Serializable {
 
     private String code;
 
-    private String name;
+    private String campusId;
 
-    private Integer type;
+    private String merchantId;
 
     private String sort;
 
@@ -20,6 +20,4 @@ public class SearchDTO implements Serializable {
     private Integer pageNo = 1;
 
     private Integer pageSize = 10;
-
 }
-

+ 7 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/util/HttpUtil.java

@@ -84,6 +84,13 @@ public class HttpUtil {
        return ignoreRequest.toArray(new RequestMatcher[ignoreRequest.size()]);
     }
 
+    public static String getClientIp(HttpServletRequest request) {
+        String ip = request.getHeader("x-forwarded-for");
+        if (StringUtils.isEmpty(ip)) {
+            return null;
+        }
 
+        return ip.split(",")[0];
+    }
 
 }

+ 11 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/util/JpaSortUtil.java

@@ -26,4 +26,15 @@ public class JpaSortUtil {
 
         return new Sort(sorts);
     }
+
+    public static String toString(LinkedHashMap<String, BaseOrderEnum> sortMap) {
+        if (CollectionUtils.isEmpty(sortMap)) {
+            return null;
+        }
+
+        StringBuilder builder = new StringBuilder("");
+        sortMap.forEach((prop, order) -> builder.append("," + prop + order.name()));
+
+        return builder.toString().substring(1);
+    }
 }

+ 8 - 2
rankin-common-utils/src/main/java/cn/rankin/common/utils/util/ProvinceUtil.java

@@ -152,7 +152,13 @@ public class ProvinceUtil {
     }
 
     public static void main(String[] args) {
-        System.out.println(get("河北"));
-        System.out.println(get("13"));
+//        System.out.println(get("河北"));
+//        System.out.println(get("13"));
+        打印测试();
+    }
+
+    public static void 打印测试() {
+        String 输出 = "中文函数调用测试";
+        System.out.println(输出);
     }
 }

+ 18 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/validator/Domain.java

@@ -0,0 +1,18 @@
+package cn.rankin.common.utils.validator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+@Constraint(validatedBy = DomainValidator.class)
+@Documented
+@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Domain {
+
+    String message() default "错误的domain值";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 30 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/validator/DomainValidator.java

@@ -0,0 +1,30 @@
+package cn.rankin.common.utils.validator;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Arrays;
+import java.util.List;
+
+public class DomainValidator implements ConstraintValidator<Domain, Integer> {
+
+    public final static List<Integer> VALID_DOMAIN;
+
+    static {
+        Integer[] domains = {
+                cn.rankin.common.utils.constant.Domain.CP,
+                cn.rankin.common.utils.constant.Domain.MERCHANT,
+                cn.rankin.common.utils.constant.Domain.PLATFORM
+        };
+        VALID_DOMAIN = Arrays.asList(domains);
+    }
+
+    public void initialize(Domain domain) {}
+
+    public boolean isValid(Integer value, ConstraintValidatorContext context) {
+        if (VALID_DOMAIN.contains(value)) {
+            return true;
+        }
+
+        return false;
+    }
+}

+ 2 - 2
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/CourseVo.java

@@ -23,9 +23,9 @@ public class CourseVo implements Serializable {
 
     private String keyword;
 
-    private String cvImgIds;
+    private String coverUrl;
 
-    private String bgImgIds;
+    private String bgUrl;
 
     private BaseStatusEnum status;
 

+ 2 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/SupportVo.java

@@ -4,6 +4,7 @@ import cn.rankin.common.utils.enums.BaseStatusEnum;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Set;
 
 @Data
@@ -21,7 +22,7 @@ public class SupportVo implements Serializable {
 
     private String detail;
 
-    private String imgIds;
+    private List<String> imgList;
 
     private BaseStatusEnum status;
 

+ 9 - 4
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/WareVo.java

@@ -2,9 +2,12 @@ package cn.rankin.common.utils.vo.product;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.WareTypeEnum;
+import cn.rankin.common.utils.vo.resource.ResourceVo;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
 
 @Data
 public class WareVo implements Serializable {
@@ -17,15 +20,17 @@ public class WareVo implements Serializable {
 
     private String digest;
 
-    private WareTypeEnum type;
+    private List<String> resourceList;
 
-    private String playUrl;
-
-    private String imgIds;
+    private List<ResourceVo> resourceVoList;
 
     private String cpId;
 
     private Integer sort;
 
     private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
 }

+ 38 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/resource/ResourceVo.java

@@ -0,0 +1,38 @@
+package cn.rankin.common.utils.vo.resource;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class ResourceVo implements Serializable {
+
+    private String id;
+
+    private String code;
+
+    private String name;
+
+    private Integer type;
+
+    private String format;
+
+    private String quality;
+
+    private Long size;
+
+    private String path;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private String url;
+
+}

+ 44 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/CampusVo.java

@@ -0,0 +1,44 @@
+package cn.rankin.common.utils.vo.user;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class CampusVo implements Serializable {
+    private String id;
+
+    private String code;
+
+    private String merchantId;
+
+    private String provinceCode;
+
+    private String cityName;
+
+    private String zoneName;
+
+    private Integer serialNo;
+
+    private String contactName;
+
+    private String mobile;
+
+    private String address;
+
+    private String bankAccount;
+
+    // 开户行
+    private String depositBank;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private String name;
+
+    private String merchantName;
+}

+ 41 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/TerminalUserVo.java

@@ -0,0 +1,41 @@
+package cn.rankin.common.utils.vo.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class TerminalUserVo implements Serializable {
+
+    private String id;
+
+    private String campusId;
+
+    private String name;
+
+    private String code;
+
+    private String password;
+
+    private Integer serialNo;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private String merchantId;
+
+    private String remoteUid;
+
+    private String merchantName;
+
+    private String contactName;
+
+    private String mobile;
+}

+ 9 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/RecommendController.java

@@ -0,0 +1,9 @@
+package cn.rankin.productservice.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/recommend")
+public class RecommendController {
+}

+ 2 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Course.java

@@ -43,11 +43,9 @@ public class Course implements Serializable{
     @Column
     private String keyword;
 
-    @Column(name = "cv_img_list")
-    private String cvImgList;
+    private String coverUrl;
 
-    @Column(name = "bg_img_list")
-    private String bgImgList;
+    private String bgUrl;
 
     @Column
     @Enumerated(EnumType.ORDINAL)

+ 49 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Recommend.java

@@ -0,0 +1,49 @@
+package cn.rankin.productservice.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+@Entity
+@Table(name = "lj_recommend", uniqueConstraints = {@UniqueConstraint(columnNames = {"merchant_id", "item_id"})})
+@DynamicInsert
+@DynamicUpdate
+public class Recommend implements Serializable {
+    /**
+     * 推荐
+     */
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    private String id;
+
+    @Column(name = "merchant_id")
+    private String merchantId;
+
+    @Column(name = "item_id")
+    private String itemId;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="type")
+    private BaseStatusEnum type;
+
+    @Column(name="sort")
+    private Integer sort;
+
+    @Column(name = "gmt_created")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+
+}

+ 3 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Support.java

@@ -1,6 +1,7 @@
 package cn.rankin.productservice.entity;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.productservice.utils.ListAttributeConverter;
 import lombok.Data;
 import lombok.ToString;
 import org.hibernate.annotations.DynamicInsert;
@@ -39,7 +40,8 @@ public class Support implements Serializable {
     private String detail;
 
     @Column(name = "img_list")
-    private String imgList;
+    @Convert(converter = ListAttributeConverter.class)
+    private List<String> imgList;
 
     @Column
     @Enumerated(EnumType.ORDINAL)

+ 1 - 33
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Ware.java

@@ -2,6 +2,7 @@ package cn.rankin.productservice.entity;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.WareTypeEnum;
+import cn.rankin.productservice.utils.ListAttributeConverter;
 import lombok.Data;
 import lombok.ToString;
 import org.apache.commons.lang.StringUtils;
@@ -55,38 +56,5 @@ public class Ware implements Serializable{
     @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
-
-    // Attribute converter: List to String
-    public static class ListAttributeConverter implements AttributeConverter<List<String>, String> {
-
-        @Override
-        public String convertToDatabaseColumn(List<String> attr) {
-            Long start = System.currentTimeMillis();
-            if (attr == null || attr.size() == 0) {
-                return "";
-            }
-
-            StringBuilder builder = new StringBuilder("");
-            attr.forEach( s -> builder.append(s + ","));
-            String value = builder.toString();
-
-            return value.substring(0, value.length()-1);
-        }
-
-        @Override
-        public List<String> convertToEntityAttribute(String value) {
-            if (StringUtils.isEmpty(value)) {
-                return new ArrayList<>();
-            }
-
-            List<String> attr = new ArrayList<>();
-            for (String s: value.split(",")) {
-                attr.add(s);
-            }
-
-            return attr;
-        }
-    }
-
 }
 

+ 7 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/repository/RecommendRepository.java

@@ -0,0 +1,7 @@
+package cn.rankin.productservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.productservice.entity.Recommend;
+
+public interface RecommendRepository extends BasicJpaRepository<Recommend, String> {
+}

+ 13 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/RecommendService.java

@@ -0,0 +1,13 @@
+package cn.rankin.productservice.service;
+
+import cn.rankin.productservice.repository.RecommendRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RecommendService {
+
+    @Autowired
+    private RecommendRepository recommendRepository;
+
+}

+ 38 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/utils/ListAttributeConverter.java

@@ -0,0 +1,38 @@
+package cn.rankin.productservice.utils;
+
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ListAttributeConverter implements AttributeConverter<List<String>, String> {
+
+    @Override
+    public String convertToDatabaseColumn(List<String> attr) {
+        Long start = System.currentTimeMillis();
+        if (attr == null || attr.size() == 0) {
+            return "";
+        }
+
+        StringBuilder builder = new StringBuilder("");
+        attr.forEach(s -> builder.append(s + ","));
+        String value = builder.toString();
+
+        return value.substring(0, value.length() - 1);
+    }
+
+    @Override
+    public List<String> convertToEntityAttribute(String value) {
+        if (StringUtils.isEmpty(value)) {
+            return new ArrayList<>();
+        }
+
+        List<String> attr = new ArrayList<>();
+        for (String s : value.split(",")) {
+            attr.add(s);
+        }
+
+        return attr;
+    }
+}

+ 3 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/utils/TestUtil.java

@@ -1,6 +1,7 @@
 package cn.rankin.productservice.utils;
 
 import com.alibaba.fastjson.JSON;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -46,5 +47,7 @@ public class TestUtil {
 
 //        list1.removeAll(list2);
         System.out.println(JSON.toJSONString(list1));
+        List<String> id = null;
+        System.out.println(CollectionUtils.isEmpty(id));
     }
 }

+ 2 - 0
rankin-resource-service/src/main/java/cn/rankin/resourceservice/ResourceServiceApplication.java

@@ -3,10 +3,12 @@ package cn.rankin.resourceservice;
 import cn.rankin.common.utils.jpa.SimpleJpaRepository;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.feign.EnableFeignClients;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @EnableFeignClients
+@EnableDiscoveryClient
 @SpringBootApplication
 @EnableJpaRepositories(repositoryBaseClass = SimpleJpaRepository.class)
 public class ResourceServiceApplication {

+ 20 - 15
rankin-resource-service/src/main/java/cn/rankin/resourceservice/controller/ResourceController.java

@@ -3,7 +3,7 @@ package cn.rankin.resourceservice.controller;
 import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
-import cn.rankin.common.utils.dto.product.SearchDTO;
+import cn.rankin.common.utils.dto.resource.ResourceSearchDTO;
 import cn.rankin.resourceservice.entity.Resource;
 import cn.rankin.resourceservice.entity.ResourceType;
 import cn.rankin.resourceservice.service.ResourceService;
@@ -11,10 +11,10 @@ import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @RestController
@@ -25,35 +25,35 @@ public class ResourceController {
     private ResourceService resourceService;
 
     @RequestMapping(value = "/list")
-    public APIResult<Page<Resource>> search(SearchDTO searchDTO) {
-        log.info(JSON.toJSONString(searchDTO));
+    public APIResult<Page<Resource>> search(ResourceSearchDTO resourceSearchDTO) {
+        log.info(JSON.toJSONString(resourceSearchDTO));
 
         // 参数错误返回
-        if (searchDTO == null || searchDTO.getType() == null) {
+        if (resourceSearchDTO == null || resourceSearchDTO.getType() == null) {
             return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
-        Integer type = searchDTO.getType();
+        Integer type = resourceSearchDTO.getType();
         if (type.intValue() == ResourceType.IMG) {
             // 图片本地取
             Resource resource = new Resource();
 
-            String code = searchDTO.getCode();
+            String code = resourceSearchDTO.getCode();
             if (!StringUtils.isEmpty(code)) {
                 resource.setCode("%" + code.trim() + "%");
             }
 
-            String name = searchDTO.getName();
+            String name = resourceSearchDTO.getName();
             if (!StringUtils.isEmpty(name)) {
                 resource.setCode("%" + name.trim() + "%");
             }
-            return resourceService.search(resource, searchDTO.getPageNo(), searchDTO.getPageSize());
+            return resourceService.search(resource, resourceSearchDTO.getPageNo(), resourceSearchDTO.getPageSize());
         }else {
             // 其他去云平台
-            if (searchDTO.getCode() != null) {
-                return resourceService.findRemoteByCode(searchDTO.getCode());
+            if (resourceSearchDTO.getCode() != null) {
+                return resourceService.findRemoteByCode(resourceSearchDTO.getCode());
             }else {
-                return resourceService.findRemotePage(searchDTO);
+                return resourceService.findRemotePage(resourceSearchDTO);
             }
         }
     }
@@ -72,4 +72,9 @@ public class ResourceController {
 
         return APIResult.ok(result);
     }
+
+    @RequestMapping(value = "/batch", method = RequestMethod.GET)
+    public APIResult<Map<String, Resource>> getBatch(@RequestParam("id") List<String> ids) {
+        return resourceService.findMixByIds(ids);
+    }
 }

+ 85 - 0
rankin-resource-service/src/main/java/cn/rankin/resourceservice/dto/ResourceDetail.java

@@ -0,0 +1,85 @@
+package cn.rankin.resourceservice.dto;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.resourceservice.entity.Resource;
+import cn.rankin.resourceservice.entity.ResourceType;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class ResourceDetail implements Serializable {
+
+    private String rid;
+
+    private String no;
+
+    private String title;
+
+    private Integer type;
+
+    private String id;
+
+    private String bucket;
+
+    private String format;
+
+    private Long size;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private BaseStatusEnum status;
+
+    private String fullPath;
+
+    // 清晰度, {fluent, standard, high, superclear}
+    private String quality;
+
+    // 类型
+    private Integer dataRate;
+
+    public Resource toNativeResource() {
+        if (type.intValue() == ResourceType.AUDIO) {
+            return toNativeAudio();
+        } else if (type.intValue() == ResourceType.VIDEO) {
+            return toNativeVideo();
+        }
+        return null;
+    }
+
+    public Resource toNativeVideo() {
+        Resource resource = new Resource();
+        resource.setId(id);
+        resource.setCode(no);
+        resource.setName(title);
+        resource.setType(type);
+        resource.setUrl(fullPath);
+        resource.setFormat(format);
+        resource.setQuality(quality);
+        resource.setSize(size);
+        resource.setStatus(status);
+        resource.setGmtCreated(createTime);
+        resource.setGmtModified(updateTime);
+        return resource;
+    }
+
+    public Resource toNativeAudio() {
+        Resource resource = new Resource();
+        resource.setId(id);
+        resource.setCode(no);
+        resource.setName(title);
+        resource.setType(type);
+        resource.setUrl(fullPath);
+        resource.setFormat(format);
+        resource.setSize(size);
+        resource.setStatus(status);
+        resource.setGmtCreated(createTime);
+        resource.setGmtModified(updateTime);
+        return resource;
+    }
+}

+ 9 - 0
rankin-resource-service/src/main/java/cn/rankin/resourceservice/proxy/RemoteResourceProxy.java

@@ -2,6 +2,7 @@ package cn.rankin.resourceservice.proxy;
 
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.resourceservice.dto.ResourceDetail;
 import cn.rankin.resourceservice.dto.ResourceRemote;
 import org.springframework.cloud.netflix.feign.FeignClient;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
 import java.util.Map;
 
 @FeignClient(value = "remote-resource", url = "${remote.resource.url}")
@@ -19,4 +21,11 @@ public interface RemoteResourceProxy {
 
     @RequestMapping(value = "rcenter/v1/resources/no/{code}", method = RequestMethod.GET)
     APIResult<ResourceRemote> findByCode(@PathVariable("code") String code);
+
+//    @RequestMapping(value = "rcenter/v1/resources", method = RequestMethod.GET)
+//    APIResult<List<ResourceRemote>> getBatch(@RequestParam("ids") List<String> ids);
+
+    @RequestMapping(value = "rcenter/v1/resources/files", method = RequestMethod.GET)
+    APIResult<List<ResourceDetail>> getBatch(@RequestParam("ids") List<String> ids);
+
 }

+ 38 - 6
rankin-resource-service/src/main/java/cn/rankin/resourceservice/service/ResourceService.java

@@ -3,7 +3,8 @@ package cn.rankin.resourceservice.service;
 import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
-import cn.rankin.common.utils.dto.product.SearchDTO;
+import cn.rankin.common.utils.dto.resource.ResourceSearchDTO;
+import cn.rankin.resourceservice.dto.ResourceDetail;
 import cn.rankin.resourceservice.dto.ResourceRemote;
 import cn.rankin.resourceservice.entity.Resource;
 import cn.rankin.resourceservice.proxy.RemoteResourceProxy;
@@ -16,6 +17,7 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @Service
@@ -57,13 +59,43 @@ public class ResourceService {
         return APIResult.ok(page);
     }
 
-    public APIResult<Page<Resource>> findRemotePage(SearchDTO searchDTO) {
+    public APIResult<Map<String, Resource>> findMixByIds(List<String> ids) {
+        Map<String, Resource> resourceMap = new HashMap<>();
+
+        // 取本地
+        List<Resource> nativeResourceList = resourceRepository.findByIds(ids);
+        nativeResourceList.forEach(resource -> {
+            initResourceUrl(resource);
+            resourceMap.put(resource.getId(), resource);
+        });
+
+        // 本地取够了不取了
+        if (nativeResourceList.size() == ids.size() && nativeResourceList.size() > 0) {
+            return APIResult.ok(resourceMap);
+        }
+
+        // 取远程
+        APIResult<List<ResourceDetail>> remoteResult = resourceProxy.getBatch(ids);
+        if (remoteResult.getSuccess() && remoteResult.getData() != null) {
+            List<ResourceDetail> remoteList = remoteResult.getData();
+            remoteList.forEach(remote -> {
+                Resource resource = remote.toNativeResource();
+                resourceMap.put(resource.getId(), resource);
+            });
+        } else {
+            log.error("remote resource empty or error!");
+        }
+
+        return APIResult.ok(resourceMap);
+    }
+
+    public APIResult<Page<Resource>> findRemotePage(ResourceSearchDTO resourceSearchDTO) {
         APIResult<Page<ResourceRemote>> result = resourceProxy.findPage(new HashMap<String, Object>(){
             {
-                this.put("title", searchDTO.getName());
-                this.put("pageNum", searchDTO.getPageNo());
-                this.put("pageSize", searchDTO.getPageSize());
-                this.put("type", searchDTO.getType());
+                this.put("title", resourceSearchDTO.getName());
+                this.put("pageNum", resourceSearchDTO.getPageNo());
+                this.put("pageSize", resourceSearchDTO.getPageSize());
+                this.put("type", resourceSearchDTO.getType());
             }
         });
 

+ 35 - 0
rankin-resource-service/src/test/java/cn/rankin/resourceservice/service/ResourceServiceTest.java

@@ -0,0 +1,35 @@
+package cn.rankin.resourceservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.resourceservice.ResourceServiceApplication;
+import cn.rankin.resourceservice.entity.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = ResourceServiceApplication.class)
+public class ResourceServiceTest {
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @Test
+    public void findMixByIds() throws Exception {
+        List<String> testIds = new ArrayList<>();
+        testIds.add("ffff957e-cab5-11e7-9771-080027fcfc4b");
+        testIds.add("ffff957e-cab5-11e7-9771-080027fcfc4b");
+        testIds.add("ffff957e-cab5-11e7-9771-080027fcfc4b");
+        testIds.add("1");
+//        APIResult<Map<String, Resource>> result = resourceService.findMixByIds(testIds);
+    }
+
+}

+ 4 - 2
rankin-user-service/pom.xml

@@ -42,8 +42,10 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-
-
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-feign</artifactId>
+        </dependency>
         <dependency>
             <groupId>cn.rankin</groupId>
             <artifactId>rankin-common-utils</artifactId>

+ 2 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/UserServiceApplication.java

@@ -4,9 +4,11 @@ import cn.rankin.common.utils.jpa.SimpleJpaRepository;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @EnableDiscoveryClient
+@EnableFeignClients
 @SpringBootApplication
 @EnableJpaRepositories(repositoryBaseClass = SimpleJpaRepository.class)
 public class UserServiceApplication {

+ 9 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/code/UserServiceAPICode.java

@@ -5,4 +5,13 @@ import cn.rankin.common.utils.api.model.BaseCode;
 
 public class UserServiceAPICode extends APICode {
 
+    public final static int _C_CAMPUS_NO_ERROR = 20001;
+    public final static BaseCode CAMPUS_NO_ERROR = new BaseCode(_C_CAMPUS_NO_ERROR, "生成校区编号错误");
+
+    public final static int _C_REMOTE_USER_REGISTER_ERROR = 21001;
+    public final static BaseCode REMOTE_USER_REGISTER_ERROR = new BaseCode(_C_REMOTE_USER_REGISTER_ERROR, "远程注册用户失败");
+
+    public final static int _C_REMOTE_USER_LOGIN_ERROR = 21001;
+    public final static BaseCode REMOTE_USER_LOGIN_ERROR = new BaseCode(_C_REMOTE_USER_LOGIN_ERROR, "远程登录用户失败");
+
 }

+ 42 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/configuration/FeignConfiguration.java

@@ -0,0 +1,42 @@
+package cn.rankin.userservice.configuration;
+
+import cn.rankin.common.utils.util.UUIDUtil;
+import cn.rankin.userservice.utils.Constant;
+import feign.Logger;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Configuration
+public class FeignConfiguration {
+
+    public static class FeignHeaderInterceptor implements RequestInterceptor {
+        // 设置公共头参数
+        @Override
+        public void apply(RequestTemplate requestTemplate) {
+            requestTemplate.header("bizCode", "0129");
+            requestTemplate.header("requestId", UUIDUtil.getUUID());
+            requestTemplate.header("appCode", Constant.APP_CODE);
+            requestTemplate.header("platform", "3");
+            requestTemplate.header("os", "0");
+            requestTemplate.header("dist", "1112");
+            requestTemplate.header("terminal", "mobile");
+            log.info("run header interceptor");
+        }
+    }
+
+    @Bean
+    public FeignHeaderInterceptor feignHeaderInterceptor() {
+        return new FeignHeaderInterceptor();
+    }
+
+    @Bean
+    public Logger.Level feignLoggerLevel() {
+
+        return Logger.Level.HEADERS;
+
+    }
+}

+ 159 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/controller/CampusController.java

@@ -0,0 +1,159 @@
+package cn.rankin.userservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.CampusDTO;
+import cn.rankin.common.utils.dto.user.CampusSearchDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.entity.Campus;
+import cn.rankin.userservice.entity.Merchant;
+import cn.rankin.userservice.service.CampusService;
+import cn.rankin.userservice.service.MerchantService;
+import cn.rankin.userservice.utils.StudentNo;
+import cn.rankin.userservice.utils.StudentNumberUtil;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.*;
+
+@RestController
+@RequestMapping(value = "/campus")
+public class CampusController {
+
+    @Autowired
+    private MerchantService merchantService;
+
+    @Autowired
+    private CampusService campusService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<Campus>> search(CampusSearchDTO searchDTO) {
+        Campus campus = new Campus();
+
+        String name = searchDTO.getName();
+        if (!StringUtils.isEmpty(name)) {
+            campus.setName("%" + name + "%");
+        }
+
+        String merchantId = searchDTO.getMerchantId();
+        if (!StringUtils.isEmpty(merchantId)) {
+            campus.setMerchantId(merchantId);
+        }
+
+        // sort
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+
+        APIResult<Page<Campus>> apiResult = campusService.search(campus, searchDTO.getPageNo(), searchDTO.getPageSize(), sort);
+        if (apiResult.getSuccess() && apiResult.getData() != null) {
+            List<Campus> campusList = apiResult.getData().getList();
+            setMerchantName(campusList);
+
+        }
+
+        return apiResult;
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<Campus> getCampus(String id) {
+        APIResult<Campus> result = campusService.getCampus(id);
+        if (result.getSuccess() && result.getData() != null) {
+            Campus campus = result.getData();
+            setMerchantName(campus);
+        }
+
+        return result;
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<Campus> create(@RequestBody @Valid CampusDTO campusDTO) {
+        String merchantId = campusDTO.getMerchantId();
+        if (StringUtils.isEmpty(merchantId)) {
+            return APIResult.error(UserServiceAPICode.error("缺少渠道id"));
+        }
+
+        Merchant merchant = merchantService.findOne(merchantId);
+        if (merchant == null) {
+            return APIResult.error(UserServiceAPICode.error("渠道不存在"));
+        }
+
+        String provinceCode = campusDTO.getProvinceCode();
+        if (StringUtils.isEmpty(provinceCode)) {
+            return APIResult.error(UserServiceAPICode.PARAMETER_ERROR);
+        }
+
+        Integer serialNo = campusService.getSerialNo(merchantId, provinceCode);
+
+        StudentNo studentNo = StudentNumberUtil.getStudentNo(merchant.getCode(), provinceCode, serialNo);
+        if (studentNo == null) {
+            return APIResult.error(UserServiceAPICode.CAMPUS_NO_ERROR);
+        }
+
+        campusDTO.setSerialNo(serialNo);
+        campusDTO.setCode(studentNo.getCampusNo());
+
+        APIResult<Campus> result = campusService.create(campusDTO);
+        if (result.getSuccess()) {
+            Campus campus = result.getData();
+            setMerchantName(campus);
+        }
+
+        return result;
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<Campus> update(@RequestBody @Valid CampusDTO campusDTO) {
+        String id = campusDTO.getId();
+        if (StringUtils.isEmpty(id)) {
+            return APIResult.error(UserServiceAPICode.PARAMETER_ERROR);
+        }
+
+        APIResult<Campus> result = campusService.update(campusDTO);
+        if (result.getSuccess()) {
+            Campus campus = result.getData();
+            setMerchantName(campus);
+        }
+
+        return result;
+    }
+
+    public void setMerchantName(List<Campus> campusList) {
+        if (CollectionUtils.isEmpty(campusList)) {
+            return;
+        }
+
+        Set<String> merchantIdSet = new HashSet<>();
+        campusList.forEach(campus -> merchantIdSet.add(campus.getMerchantId()));
+
+        if (merchantIdSet.size() == 0) {
+            return;
+        }
+        List<String> merchantIdList = new ArrayList<>();
+        merchantIdList.addAll(merchantIdSet);
+        Map<String, Merchant> merchantMap = merchantService.getMerchantMap(merchantIdList);
+
+        for (Campus campus : campusList) {
+            String merchantId = campus.getMerchantId();
+            Merchant merchant = merchantMap.get(merchantId);
+            campus.setMerchantName(merchant.getName());
+        }
+    }
+
+    public void setMerchantName(Campus campus) {
+        if (campus == null) {
+            return;
+        }
+
+        Merchant merchant = merchantService.findOne(campus.getMerchantId());
+        if (merchant != null) {
+            campus.setMerchantName(merchant.getName());
+        }
+    }
+}

+ 250 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/controller/TerminalUserController.java

@@ -0,0 +1,250 @@
+package cn.rankin.userservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.TerminalUserDTO;
+import cn.rankin.common.utils.dto.user.TerminalUserSearchDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.common.utils.util.HttpUtil;
+import cn.rankin.common.utils.util.SecurityUtil;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.dto.RemoteUser;
+import cn.rankin.userservice.entity.Campus;
+import cn.rankin.userservice.entity.Merchant;
+import cn.rankin.userservice.entity.TerminalUser;
+import cn.rankin.userservice.proxy.RemoteUserProxy;
+import cn.rankin.userservice.service.CampusService;
+import cn.rankin.userservice.service.MerchantService;
+import cn.rankin.userservice.service.TerminalUserService;
+import cn.rankin.userservice.utils.StudentNumberUtil;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/user")
+public class TerminalUserController {
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private MerchantService merchantService;
+
+    @Autowired
+    private RemoteUserProxy remoteUserProxy;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<TerminalUser>> search(TerminalUserSearchDTO terminalUserSearchDTO) {
+        TerminalUser terminalUser = new TerminalUser();
+
+        String code = terminalUserSearchDTO.getCode();
+        String campusId = terminalUserSearchDTO.getCampusId();
+        if (!StringUtils.isEmpty(code)) {
+            terminalUser.setCode("%" + code + "%");
+        }else if (!StringUtils.isEmpty(campusId)) {
+            terminalUser.setCampusId(campusId);
+        }
+
+        String merchantId = terminalUserSearchDTO.getMerchantId();
+        if (!StringUtils.isEmpty(merchantId)) {
+            terminalUser.setMerchantId(merchantId);
+        }
+
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+
+        APIResult<Page<TerminalUser>> result = terminalUserService.search(terminalUser, terminalUserSearchDTO.getPageNo(), terminalUserSearchDTO.getPageSize(), sort);
+        if (result.getSuccess()) {
+            List<TerminalUser> terminalUserList = result.getData().getList();
+            setUserInfo(terminalUserList);
+        }
+
+        return result;
+    }
+
+    @Transactional
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<TerminalUser> create(HttpServletRequest request, @RequestBody @Valid TerminalUserDTO terminalUserDTO) {
+        String campusId = terminalUserDTO.getCampusId();
+        if (StringUtils.isEmpty(campusId)) {
+            return APIResult.error(UserServiceAPICode.PARAMETER_ERROR);
+        }
+
+        Campus campus = campusService.findOne(campusId);
+        if (campus == null) {
+            return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+        }
+
+        String merchantId = campus.getMerchantId();
+        Merchant merchant = merchantService.findOne(merchantId);
+
+        if (merchant == null) {
+            return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+        }
+
+        // 开始生成学号
+        Integer serialNo = terminalUserService.getSerialNo(campusId);
+        String code = StudentNumberUtil.getStudentNo(campus.getCode(), serialNo);
+
+        // 设置学号
+        terminalUserDTO.setCode(code);
+        terminalUserDTO.setSerialNo(serialNo);
+        terminalUserDTO.setMerchantId(merchantId);
+
+        // 设置名字
+        String name = terminalUserDTO.getName();
+        if (StringUtils.isEmpty(name)) {
+            terminalUserDTO.setName(StudentNumberUtil.toChinese(serialNo, "教室"));
+        }
+
+        // 存储数据库
+        APIResult<TerminalUser> result = terminalUserService.create(terminalUserDTO);
+        if (!result.getSuccess()) {
+            return result;
+        }
+
+        TerminalUser terminalUser = result.getData();
+        setUserInfo(terminalUser, campus, merchant);
+
+        // 远程注册
+        APIResult<RemoteUser> remoteUserAPIResult = remoteUserProxy.register(terminalUser, HttpUtil.getClientIp(request), "0");
+        if (!remoteUserAPIResult.getSuccess()) {
+            log.error(JSON.toJSONString(remoteUserAPIResult));
+            return APIResult.error(UserServiceAPICode.REMOTE_USER_REGISTER_ERROR);
+        }
+
+        // 再存储远程uid
+        terminalUserService.addUid(terminalUser.getId(), remoteUserAPIResult.getData().getUid());
+
+        return result;
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<TerminalUser> update(HttpServletRequest request, @RequestBody TerminalUserDTO terminalUserDTO) {
+        String id = terminalUserDTO.getId();
+        if (StringUtils.isEmpty(id)) {
+            return APIResult.error(UserServiceAPICode.PARAMETER_ERROR);
+        }
+
+        TerminalUser terminalUser = terminalUserService.findOne(id);
+        if (terminalUser == null) {
+            return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+        }
+
+        String newPassword = terminalUserDTO.getPassword();
+        if (!StringUtils.isEmpty(newPassword)) {
+            String prePassword = terminalUser.getPassword();
+            if (!prePassword.equals(newPassword)) {
+                APIResult result = remoteUserProxy.changePassword(terminalUser, newPassword, HttpUtil.getClientIp(request), "0");
+                if (!result.getSuccess()) {
+                    return result;
+                }
+            }
+        }
+
+        APIResult<TerminalUser> result = terminalUserService.update(terminalUserDTO);
+        if (result.getSuccess()) {
+            setUserInfo(result.getData());
+        }
+
+        return result;
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<TerminalUser> getUser(@PathVariable("id") String id) {
+        TerminalUser terminalUser = terminalUserService.findOne(id);
+        if (terminalUser == null) {
+            return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+        }
+
+        setUserInfo(terminalUser);
+        return APIResult.ok(terminalUser);
+    }
+
+    // 禁用终端用户
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return terminalUserService.delete(id);
+    }
+
+    public static void setUserInfo(TerminalUser terminalUser, Campus campus, Merchant merchant) {
+        if (terminalUser == null) {
+            return;
+        }
+
+        if (campus != null) {
+            terminalUser.setContactName(campus.getContactName());
+            terminalUser.setMobile(campus.getMobile());
+            terminalUser.setCampusName(campus.getName());
+        }
+
+        if (merchant != null) {
+            terminalUser.setMerchantName(merchant.getName());
+        }
+    }
+
+    public void setUserInfo(TerminalUser terminalUser) {
+        if (terminalUser == null) {
+            return;
+        }
+
+        Campus campus = campusService.findOne(terminalUser.getCampusId());
+        if (campus != null) {
+            terminalUser.setContactName(campus.getContactName());
+            terminalUser.setMobile(campus.getMobile());
+            terminalUser.setCampusName(campus.getName());
+        }
+
+        Merchant merchant = merchantService.findOne(campus.getMerchantId());
+        if (merchant != null) {
+            terminalUser.setMerchantName(merchant.getName());
+        }
+    }
+
+    public void setUserInfo(List<TerminalUser> terminalUserList) {
+        if (CollectionUtils.isEmpty(terminalUserList)) {
+            return;
+        }
+
+        List<String> campusIdList = new ArrayList<>();
+        List<String> merchantIdList = new ArrayList<>();
+
+        terminalUserList.forEach(terminalUser -> {
+            campusIdList.add(terminalUser.getCampusId());
+            merchantIdList.add(terminalUser.getMerchantId());
+        });
+
+        Map<String, Campus> campusMap = campusService.getCampusMap(campusIdList);
+        Map<String, Merchant> merchantMap = merchantService.getMerchantMap(merchantIdList);
+
+        for (TerminalUser terminalUser : terminalUserList) {
+            Campus campus = campusMap.get(terminalUser.getCampusId());
+            if (campus != null) {
+                terminalUser.setContactName(campus.getContactName());
+                terminalUser.setMobile(campus.getMobile());
+                terminalUser.setCampusName(campus.getName());
+            }
+
+            Merchant merchant = merchantMap.get(terminalUser.getMerchantId());
+            if (merchant != null) {
+                terminalUser.setMerchantName(merchant.getName());
+            }
+        }
+    }
+}

+ 31 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/dto/RemoteUser.java

@@ -0,0 +1,31 @@
+package cn.rankin.userservice.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class RemoteUser implements Serializable {
+
+    private String token;
+
+    private String eid;
+
+    private String uid;
+
+    private Long expiration;
+
+    private String registerAppCode;
+
+    private String registerAppVer;
+
+    private Integer registerPlatform;
+
+    private String registerEntry;
+
+    private String registerEntryType;
+
+    private Long createTime;
+}

+ 19 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserLogin.java

@@ -0,0 +1,19 @@
+package cn.rankin.userservice.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class UserLogin implements Serializable {
+
+    private String entry;
+
+    private Integer entryType;
+
+    private String passwd;
+
+    private Boolean ckpasswd = false;
+}

+ 15 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserPasswd.java

@@ -0,0 +1,15 @@
+package cn.rankin.userservice.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class UserPasswd implements Serializable {
+
+    private String token;
+
+    private String passwd;
+}

+ 17 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/dto/UserRegistry.java

@@ -0,0 +1,17 @@
+package cn.rankin.userservice.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class UserRegistry implements Serializable {
+
+    private String entry;
+
+    private Integer entryType;
+
+    private String passwd;
+}

+ 22 - 6
rankin-user-service/src/main/java/cn/rankin/userservice/entity/Campus.java

@@ -1,19 +1,21 @@
 package cn.rankin.userservice.entity;
 
 import cn.rankin.common.utils.util.ProvinceUtil;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.ToString;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
 
 import javax.persistence.*;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.util.Date;
 
 @Data
 @ToString
 @Entity
-@Table(name = "campus")
+@Table(name = "campus", uniqueConstraints = {@UniqueConstraint(columnNames = {"merchant_id", "serial_no"})})
 @DynamicInsert
 @DynamicUpdate
 public class Campus implements Serializable {
@@ -21,10 +23,13 @@ public class Campus implements Serializable {
     @Id
     private String id;
 
-    @Column(name = "merchant_id")
+    @Column(updatable = false)
+    private String code;
+
+    @Column(name = "merchant_id", updatable = false, nullable = false)
     private String merchantId;
 
-    @Column(name = "province_code")
+    @Column(name = "province_code", updatable = false, nullable = false)
     private String provinceCode;
 
     @Column(name = "city_name")
@@ -33,16 +38,25 @@ public class Campus implements Serializable {
     @Column(name = "zone_name")
     private String zoneName;
 
+    @Column(name = "serial_no", updatable = false, nullable = false)
     private Integer serialNo;
 
-    @Column(name = "contact_name", nullable = false)
+    @Column(name = "contact_name")
     private String contactName;
 
     @Column(nullable = false)
+    @Pattern(regexp = "^[1][3,4,5,7,8,9][0-9]{9}$")
     private String mobile;
 
     private String address;
 
+    @Column(name = "bank_account")
+    private String bankAccount;
+
+    // 开户行
+    @Column(name = "deposit_bank")
+    private String depositBank;
+
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtCreated;
@@ -51,12 +65,15 @@ public class Campus implements Serializable {
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
 
-    @Transient
     private String name;
 
     @Transient
     private String merchantName;
 
+    public void setName() {
+        this.name = getName();
+    }
+
     public String getName() {
         String pName = ProvinceUtil.get(provinceCode);
         if (pName != null) {
@@ -64,5 +81,4 @@ public class Campus implements Serializable {
         }
         return null;
     }
-
 }

+ 0 - 25
rankin-user-service/src/main/java/cn/rankin/userservice/entity/Counter.java

@@ -1,25 +0,0 @@
-package cn.rankin.userservice.entity;
-
-import lombok.Data;
-import lombok.ToString;
-import org.hibernate.annotations.DynamicInsert;
-import org.hibernate.annotations.DynamicUpdate;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-
-@Data
-@ToString
-@Entity
-@Table(name = "counter")
-@DynamicInsert
-@DynamicUpdate
-public class Counter implements Serializable {
-
-    @Id
-    private String id;  // 计数标识id
-
-    private Integer number;
-}

+ 5 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/entity/Merchant.java

@@ -2,12 +2,15 @@ package cn.rankin.userservice.entity;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.ReceiptTypeEnum;
+import cn.rankin.common.utils.validator.Domain;
+import cn.rankin.userservice.utils.Constant;
 import lombok.Data;
 import lombok.ToString;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
 
 import javax.persistence.*;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
@@ -23,9 +26,11 @@ public class Merchant implements Serializable {
     @Id
     private String id;
 
+    @Domain
     private Integer domain;
 
     @Column(unique = true, updatable = false)
+    @Pattern(regexp = Constant.MRegEx)
     private String code;
 
     private String name;

+ 38 - 2
rankin-user-service/src/main/java/cn/rankin/userservice/entity/TerminalUser.java

@@ -1,5 +1,7 @@
 package cn.rankin.userservice.entity;
 
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 import lombok.ToString;
 import org.hibernate.annotations.DynamicInsert;
@@ -20,12 +22,23 @@ public class TerminalUser implements Serializable {
     @Id
     private String id;
 
+    @Column(name = "campus_id", updatable = false, nullable = false)
+    private String campusId;
+
     private String name;
 
+    @Column(unique = true, nullable = false, updatable = false)
     private String code;
 
-    @ManyToOne
-    private Campus campus;
+    @JsonIgnore
+    @Column(nullable = false)
+    private String password;
+
+    @Column(name = "serial_no", nullable = false, updatable = false)
+    private Integer serialNo;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
 
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
@@ -34,4 +47,27 @@ public class TerminalUser implements Serializable {
     @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
+
+    @Column(name = "merchant_id", updatable = false, nullable = false)
+    private String merchantId;
+
+    @Column(name = "uid")
+    private String uid;
+
+    @Transient
+    private String merchantName;
+
+    @Transient
+    private String contactName;
+
+    @Transient
+    private String mobile;
+
+    @Transient
+    private String campusName;
+
+    public void setCampusName(String campusName) {
+        this.campusName = String.format("%s-%s", campusName, name);
+    }
+
 }

+ 24 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/proxy/RemoteUserFeign.java

@@ -0,0 +1,24 @@
+package cn.rankin.userservice.proxy;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.userservice.dto.RemoteUser;
+import cn.rankin.userservice.dto.UserLogin;
+import cn.rankin.userservice.dto.UserPasswd;
+import cn.rankin.userservice.dto.UserRegistry;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@FeignClient(name = "user-remote", url = "${remote.user.url}")
+public interface RemoteUserFeign {
+
+    @RequestMapping(value = "/ucenter/v1/users", method = RequestMethod.POST)
+    APIResult<RemoteUser> register(@RequestBody UserRegistry user, @RequestHeader("userIp") String userIp, @RequestHeader("appVer") String appVer);
+
+    @RequestMapping(value = "/ucenter/v1/users/token", method = RequestMethod.POST)
+    APIResult<List<RemoteUser>> login(@RequestBody UserLogin user, @RequestParam("userIp") String userIp, @RequestHeader("appVer") String appVer);
+
+    @RequestMapping(value = "/ucenter/v1/users/{uid}/passwd", method = RequestMethod.POST)
+    APIResult<Object> passwd(@PathVariable("uid") String userId, @RequestBody UserPasswd userPasswd, @RequestParam("userIpd") String userIp, @RequestHeader("appVer") String appVer);
+}

+ 55 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/proxy/RemoteUserProxy.java

@@ -0,0 +1,55 @@
+package cn.rankin.userservice.proxy;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.dto.RemoteUser;
+import cn.rankin.userservice.dto.UserLogin;
+import cn.rankin.userservice.dto.UserPasswd;
+import cn.rankin.userservice.dto.UserRegistry;
+import cn.rankin.userservice.entity.TerminalUser;
+import cn.rankin.userservice.utils.Constant;
+import cn.rankin.userservice.utils.DTOConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class RemoteUserProxy {
+
+    @Autowired
+    private RemoteUserFeign remoteUserFeign;
+
+    public APIResult<RemoteUser> register(TerminalUser terminalUser, String userIp, String appVer) {
+        UserRegistry user = DTOConverter.convert(terminalUser);
+        return remoteUserFeign.register(user, userIp, appVer);
+    }
+
+    public APIResult<RemoteUser> login(TerminalUser terminalUser, String userIp, String appVer) {
+        UserLogin userLogin = new UserLogin();
+        userLogin.setEntry(terminalUser.getCode());
+        userLogin.setEntryType(Constant.EntryType.EID);
+        userLogin.setPasswd(terminalUser.getPassword());
+        APIResult<List<RemoteUser>> result = remoteUserFeign.login(userLogin, userIp, appVer);
+        if (result.getSuccess()) {
+            return APIResult.ok(result.getData().get(0));
+        }
+        return APIResult.error(UserServiceAPICode.error(result.getMessage()));
+    }
+
+    public APIResult changePassword(TerminalUser terminalUser, String newPassword, String userIp, String appVer) {
+        APIResult<RemoteUser> remoteUserAPIResult = login(terminalUser, userIp, appVer);
+        if (!remoteUserAPIResult.getSuccess() || remoteUserAPIResult.getData() == null) {
+            return APIResult.error(UserServiceAPICode.REMOTE_USER_LOGIN_ERROR);
+        }
+
+        RemoteUser user = remoteUserAPIResult.getData();
+
+        UserPasswd userPasswd = new UserPasswd();
+        userPasswd.setToken(user.getToken());
+        userPasswd.setPasswd(newPassword);
+
+        APIResult result = remoteUserFeign.passwd(terminalUser.getUid(), userPasswd, userIp, appVer);
+        return result;
+    }
+}

+ 17 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/repository/CampusRepository.java

@@ -0,0 +1,17 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.userservice.entity.Campus;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface CampusRepository extends BasicJpaRepository<Campus, String> {
+
+    @Query(value = "select max(c.serialNo) from Campus c where c.merchantId = :merchantId and c.provinceCode = :provinceCode")
+    Integer findMaxNo(@Param("merchantId") String merchantId, @Param("provinceCode") String proviceCode);
+
+    List<Campus> findByNameLike(String name);
+
+}

+ 3 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/repository/MerchantRepository.java

@@ -19,7 +19,9 @@ public interface MerchantRepository  extends BasicJpaRepository<Merchant, String
 	List<Merchant> findByIdIn(List<String> ids);
 
 	Merchant findByIdAndStatus(String id, BaseStatusEnum status);
-    
+
+	Merchant findByName(String name);
+
     @Transactional
     @Modifying(clearAutomatically = true)
     @Query("update Merchant m set m.status = :status where m.id in (:ids) ")

+ 0 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/repository/TerminalDeviceRepository.java

@@ -22,5 +22,4 @@ public interface TerminalDeviceRepository extends BasicJpaRepository<TerminalDev
     @Query(value = "update TerminalDevice t set t.bind = 0 where t.userId = :userId")
     int unbind(@Param("userId") String userId);
 
-
 }

+ 18 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/repository/TerminalUserRepository.java

@@ -0,0 +1,18 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.userservice.entity.TerminalUser;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+public interface TerminalUserRepository extends BasicJpaRepository<TerminalUser, String> {
+
+    @Query(value = "select max(t.serialNo) from TerminalUser t where t.campusId = :campusId")
+    Integer findMaxNo(@Param("campusId") String campusId);
+
+    @Modifying(clearAutomatically = true)
+    @Query(value = "update TerminalUser t set t.status = :status where t.id = :id")
+    Integer updateStatusById(@Param("status") BaseStatusEnum status, @Param("id") String id);
+}

+ 91 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/CampusService.java

@@ -0,0 +1,91 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.CampusDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.common.utils.util.JpaSortUtil;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.entity.Campus;
+import cn.rankin.userservice.entity.Merchant;
+import cn.rankin.userservice.repository.CampusRepository;
+import cn.rankin.userservice.repository.MerchantRepository;
+import cn.rankin.userservice.utils.StudentNo;
+import cn.rankin.userservice.utils.StudentNumberUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import static cn.rankin.userservice.utils.DTOConverter.convert;
+
+@Slf4j
+@Service
+public class CampusService {
+
+    @Autowired
+    private CampusRepository campusRepository;
+
+    public Integer getSerialNo(String merchantId, String pCode) {
+        Integer serialNo = campusRepository.findMaxNo(merchantId, pCode);
+        if (serialNo == null) {
+            return 1;
+        }
+        return serialNo + 1;
+    }
+
+    public Campus findOne(String id) {
+        return campusRepository.findOne(id);
+    }
+
+    public Map<String, Campus> getCampusMap(List<String> idList) {
+        List<Campus> campusList = campusRepository.findByIds(idList);
+
+        Map<String, Campus> map = new HashMap<>();
+        campusList.forEach(campus -> map.put(campus.getId(), campus));
+
+        return map;
+    }
+
+    public APIResult<Page<Campus>> search(Campus campus, Integer pageNo, Integer pageSize, LinkedHashMap<String, BaseOrderEnum> sort) {
+        Long count = campusRepository.count(campus);
+        Page<Campus> page = new Page<>(count, pageNo, pageSize);
+
+        if (count == 0) {
+            return APIResult.ok(page);
+        }
+
+        List<Campus> campusList = campusRepository.find(campus, page.getStart(), page.getPageSize(), JpaSortUtil.sort(sort));
+        page.setList(campusList);
+
+        return APIResult.ok(page);
+    }
+
+    public APIResult<Campus> getCampus(String campusId) {
+        Campus campus = campusRepository.find(campusId);
+        if (campus != null) {
+            return APIResult.ok(campus);
+        }
+        return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+    }
+
+    @Transactional
+    public APIResult<Campus> create(CampusDTO campusDTO) {
+        Campus campus = convert(campusDTO);
+        Campus result = campusRepository.save(campus);
+        return APIResult.ok(result);
+    }
+
+    @Transactional
+    public APIResult<Campus> update(CampusDTO campusDTO) {
+        Campus campus = convert(campusDTO);
+        Campus result = campusRepository.update(campus);
+
+        return APIResult.ok(result);
+    }
+}

+ 4 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/MerchantService.java

@@ -115,4 +115,8 @@ public class MerchantService {
     public Merchant findOne(String id) {
         return merchantRepository.find(id);
     }
+
+    public Merchant findMerchantByName(String name) {
+        return merchantRepository.findByName(name);
+    }
 }

+ 13 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalDeviceService.java

@@ -0,0 +1,13 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.userservice.repository.TerminalDeviceRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TerminalDeviceService {
+
+    @Autowired
+    private TerminalDeviceRepository terminalDeviceRepository;
+
+}

+ 94 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalUserService.java

@@ -0,0 +1,94 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.TerminalUserDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.util.JpaSortUtil;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.entity.TerminalUser;
+import cn.rankin.userservice.repository.TerminalUserRepository;
+import cn.rankin.userservice.utils.DTOConverter;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import static cn.rankin.userservice.utils.DTOConverter.convert;
+
+@Service
+public class TerminalUserService {
+
+    @Autowired
+    private TerminalUserRepository terminalUserRepository;
+
+    public Integer getSerialNo(String campusId) {
+        Integer serialNo = terminalUserRepository.findMaxNo(campusId);
+        if (serialNo == null) {
+            return 1;
+        }
+
+        return serialNo + 1;
+    }
+
+    public TerminalUser findOne(String id) {
+        return terminalUserRepository.find(id);
+    }
+
+    public APIResult<Page<TerminalUser>> search(TerminalUser terminalUser, Integer pageNo, Integer pageSize, LinkedHashMap<String, BaseOrderEnum> sort) {
+        Long count = terminalUserRepository.count(terminalUser);
+        Page<TerminalUser> page = new Page<>(count, pageNo, pageSize);
+        if (count == 0) {
+            return APIResult.ok(page);
+        }
+
+        List<TerminalUser> terminalUserList = terminalUserRepository.find(terminalUser, page.getStart(), pageSize, JpaSortUtil.sort(sort));
+        page.setList(terminalUserList);
+
+        return APIResult.ok(page);
+    }
+
+    @Transactional
+    public APIResult<TerminalUser> create(TerminalUserDTO terminalUserDTO) {
+        TerminalUser terminalUser = convert(terminalUserDTO);
+        String newPassword = terminalUserDTO.getPassword();
+        if (StringUtils.isEmpty(newPassword)) {
+            return APIResult.error(UserServiceAPICode.PARAMETER_ERROR);
+        }
+
+        // md5加密密码, 因需要登录远程用户中心, 只能明文存储
+        //terminalUser.setPassword(SecurityUtil.MD5(newPassword));
+        TerminalUser result = terminalUserRepository.save(terminalUser);
+
+        return APIResult.ok(result);
+    }
+
+    @Transactional
+    public APIResult<TerminalUser> update(TerminalUserDTO terminalUserDTO) {
+        TerminalUser terminalUser = DTOConverter.convert(terminalUserDTO);
+        TerminalUser result = terminalUserRepository.update(terminalUser);
+        return APIResult.ok(result);
+    }
+
+    @Transactional
+    public APIResult<Boolean> delete(String id) {
+        Integer count = terminalUserRepository.updateStatusById(BaseStatusEnum.DISABLE, id);
+        if (count > 0) {
+            return APIResult.ok(true);
+        }
+        return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+    }
+
+    public void addUid(String id, String uid) {
+        TerminalUser user = new TerminalUser();
+        user.setId(id);
+        user.setUid(uid);
+        terminalUserRepository.update(user);
+    }
+
+}

+ 18 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/utils/Constant.java

@@ -0,0 +1,18 @@
+package cn.rankin.userservice.utils;
+
+public class Constant {
+
+    public final static String APP_CODE = "1502";
+
+    public final static String MRegEx = "^\\d{4}$";
+
+    public final static class EntryType {
+        // {0,1,2} eid, mobile, wechatid
+        public final static int EID = 0;
+
+        public final static int MOBILE = 1;
+
+        public final static int WECHAT = 2;
+    }
+
+}

+ 28 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/utils/DTOConverter.java

@@ -1,9 +1,16 @@
 package cn.rankin.userservice.utils;
 
+import cn.rankin.common.utils.dto.user.CampusDTO;
 import cn.rankin.common.utils.dto.user.CmsUserDTO;
 import cn.rankin.common.utils.dto.user.MerchantDTO;
+import cn.rankin.common.utils.dto.user.TerminalUserDTO;
+import cn.rankin.common.utils.util.SecurityUtil;
+import cn.rankin.userservice.dto.UserRegistry;
+import cn.rankin.userservice.entity.Campus;
 import cn.rankin.userservice.entity.CmsUser;
 import cn.rankin.userservice.entity.Merchant;
+import cn.rankin.userservice.entity.TerminalUser;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
 
 public class DTOConverter {
@@ -19,4 +26,25 @@ public class DTOConverter {
         BeanUtils.copyProperties(userDTO, user);
         return user;
     }
+
+    public static Campus convert(CampusDTO campusDTO) {
+        Campus campus = new Campus();
+        BeanUtils.copyProperties(campusDTO, campus);
+        campus.setName();
+        return campus;
+    }
+
+    public static TerminalUser convert(TerminalUserDTO terminalUserDTO) {
+        TerminalUser terminalUser = new TerminalUser();
+        BeanUtils.copyProperties(terminalUserDTO, terminalUser);
+        return terminalUser;
+    }
+
+    public static UserRegistry convert(TerminalUser terminalUser) {
+        UserRegistry userRegistry = new UserRegistry();
+        userRegistry.setEntry(terminalUser.getCode());
+        userRegistry.setEntryType(Constant.EntryType.EID);
+        userRegistry.setPasswd(terminalUser.getPassword());
+        return userRegistry;
+    }
 }

+ 31 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/utils/StudentNo.java

@@ -0,0 +1,31 @@
+package cn.rankin.userservice.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+@AllArgsConstructor
+public class StudentNo implements Serializable {
+
+    private String appCode;
+
+    private String merchantCode;
+
+    private String provinceCode;
+
+    private Integer campusNo;
+
+    private Integer roomNo;
+
+    public String getStudentNo() {
+        return String.format("%s%s%s%02d%03d", appCode, merchantCode, provinceCode, campusNo, roomNo);
+    }
+
+    public String getCampusNo() {
+        return String.format("%s%s%s%02d", appCode, merchantCode, provinceCode, campusNo);
+    }
+}

+ 126 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/utils/StudentNumberUtil.java

@@ -0,0 +1,126 @@
+package cn.rankin.userservice.utils;
+
+import cn.rankin.common.utils.util.ProvinceUtil;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.security.access.method.P;
+
+import java.io.Serializable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static sun.plugin.cache.FileVersion.regEx;
+
+/* 学号构成:
+    左 -> 右
+    4位: App编码, 1502
+    4位: 渠道编码
+    2位: 省份编码
+    2位: 校区流水号, 递增
+    3位: 教室流水号, 递增
+*/
+public class StudentNumberUtil {
+
+    public final static String APP_CODE = Constant.APP_CODE;
+
+    public final static String MRegEx = Constant.MRegEx;
+
+    public final static int MAX_CAMPUS = 99;    // 校区目前最多限制两位
+
+    public final static int MAX_ROOM = 999; // 教室最多三位
+
+    public final static String[] LOW = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
+    public final static String[] HIGH = { "十", "百", "千", "万"};
+
+    public static boolean isValidCampusNo(Integer campusNo) {
+        if (0 < campusNo && campusNo <= MAX_CAMPUS) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean isValidRoomNo(Integer roomNo) {
+        if (roomNo > 0 && roomNo <= MAX_ROOM) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean isValidMerchantCode(String mCode) {
+        Pattern pattern = Pattern.compile(MRegEx);
+        Matcher matcher = pattern.matcher(mCode);
+        return matcher.matches();
+    }
+
+    public static StudentNo getStudentNo(String merchantCode, String pCode, Integer campusNo, Integer roomNo) {
+        if (!isValidCampusNo(campusNo) || !isValidRoomNo(roomNo) || ProvinceUtil.get(pCode) == null
+                || !isValidMerchantCode(merchantCode)) {
+            return null;
+        }
+
+        return new StudentNo(APP_CODE, merchantCode, pCode, campusNo, roomNo);
+    }
+
+    public static StudentNo getStudentNo(String merchantCode, String pCode, Integer campusNo) {
+        if (!isValidCampusNo(campusNo) || ProvinceUtil.get(pCode) == null || !isValidMerchantCode(merchantCode)) {
+            return null;
+        }
+
+        return new StudentNo(APP_CODE, merchantCode, pCode, campusNo, null);
+    }
+
+    public static String getStudentNo(String campusCode, Integer roomNo) {
+        if (roomNo == null || StringUtils.isEmpty(campusCode)) {
+            return null;
+        }
+        return String.format("%s%03d", campusCode, roomNo);
+    }
+
+    public static void main(String[] args) {
+//        StudentNo a = getStudentNo("0222", "11", 99);
+//        System.out.println(a.getCampusNo());
+        int[] a = {0, 1, 9, 10, 11, 19, 50, 71, 99, 100, 101, 120, 121, 301, 501, 900, 901, 999, 1000, 10000, 10001, 11001, 11100, 11101, 11110, 11111};
+//        System.out.println('9' - '0');
+        for (int i : a) {
+            System.out.println(toChinese(i));
+        }
+    }
+
+    public static String toChinese(Integer value, String prefix) {
+        return prefix + toChinese(value);
+    }
+    /*
+    10000以内的整数转化汉字
+     */
+    public static String toChinese(Integer value) {
+        String string = String.valueOf(value);
+
+        String result = new String("");
+
+        if (value == 0) {
+            return  "零";
+        }else if (value > 0 && value <= 10) {
+            result = LOW[value];
+        }else if (value > 10 && value <= 20) {
+            result = HIGH[0] + LOW[value % 10];
+        }else {
+            int n = string.length();
+            for (int i = 0; i < string.length(); i++) {
+                int num = string.charAt(i) - '0';
+                if (i != n-1 && num != 0) {
+                    result += LOW[num] + HIGH[n - 2 - i];
+                }else {
+                    if (!LOW[num].equals("零") || !result.endsWith("零")) {
+                        result += LOW[num];
+                    }
+                }
+            }
+        }
+
+        if (result.endsWith("零")) {
+            result = result.substring(0, result.length() - 1);
+        }
+
+        return result;
+    }
+
+}

+ 4 - 0
rankin-user-service/src/main/resources/bootstrap.yml

@@ -7,5 +7,9 @@ spring:
       label: master
       profile: dev
 
+#logging:
+#  level:
+#    root: debug
+
 server:
   port: 8400

+ 36 - 0
rankin-user-service/src/test/java/cn/rankin/userservice/proxy/RemoteUserFeignTest.java

@@ -0,0 +1,36 @@
+package cn.rankin.userservice.proxy;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.userservice.dto.RemoteUser;
+import cn.rankin.userservice.dto.UserRegistry;
+import cn.rankin.userservice.UserServiceApplication;
+import com.alibaba.fastjson.JSON;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = UserServiceApplication.class)
+public class RemoteUserFeignTest {
+
+    @Autowired
+    private RemoteUserFeign remoteUserFeign;
+
+    @Test
+    public void signup() throws Exception {
+        UserRegistry user = new UserRegistry();
+        user.setEntry("150223211102006");
+        user.setEntryType(0);
+        user.setPasswd("test");
+        int i = 0;
+        while (i < 3) {
+            APIResult<RemoteUser> resp = remoteUserFeign.register(user, "120.120.110.1", "8.8");
+            System.out.println(JSON.toJSONString(resp));
+            i ++;
+        }
+    }
+
+}

+ 29 - 0
rankin-user-service/src/test/java/cn/rankin/userservice/repository/CampusRepositoryTest.java

@@ -0,0 +1,29 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.userservice.UserServiceApplication;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = UserServiceApplication.class)
+public class CampusRepositoryTest {
+
+    @Autowired
+    private CampusRepository campusRepository;
+
+    @Test
+    public void findMaxNo() {
+        Integer max = campusRepository.findMaxNo("1749ad85c0494c27a7cf2b6f10cd064", "11");
+    }
+
+    @Test
+    public void format() {
+        String s = String.format("%02d", 9);
+        System.out.println(s);
+    }
+
+}

+ 24 - 0
rankin-user-service/src/test/java/cn/rankin/userservice/repository/MerchantRepositoryTest.java

@@ -0,0 +1,24 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.userservice.UserServiceApplication;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = UserServiceApplication.class)
+public class MerchantRepositoryTest {
+    @Autowired
+    private MerchantRepository merchantRepository;
+    @Test
+    public void findByNameLike() throws Exception {
+//        List<String> idList = merchantRepository.findByNameLike("%贝尔%");
+    }
+
+}

+ 39 - 0
rankin-user-service/src/test/java/cn/rankin/userservice/service/TerminalUserServiceTest.java

@@ -0,0 +1,39 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.userservice.UserServiceApplication;
+import cn.rankin.userservice.entity.TerminalUser;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = UserServiceApplication.class)
+public class TerminalUserServiceTest {
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    @Test
+    public void search() throws Exception {
+        List<String> idList = new ArrayList<>();
+        idList.add("34d5f9b5012042a396d907133189fb92");
+        idList.add("6787bf758c5c4c64b57d0d8d0958d50e");
+//        APIResult<Page<TerminalUser>> result = terminalUserService.search(idList, 1, 1, new LinkedHashMap<String, BaseOrderEnum>() {
+//            {
+//                this.put("gmt_modified", BaseOrderEnum.DESC);
+//            }
+//        });
+    }
+
+}