Browse Source

add cms web

huodongdong 7 years ago
parent
commit
2ddd9d23e8
100 changed files with 3356 additions and 301 deletions
  1. 16 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/AuthService.java
  2. 30 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/auth/SimpleAuthService.java
  3. 32 5
      rankin-cms-web/pom.xml
  4. 5 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/CmsWebApplication.java
  5. 49 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/aspect/OperationLogAspect.java
  6. 14 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/resolver/NeedUser.java
  7. 34 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/resolver/NeedUserResolver.java
  8. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/code/CmsWebAPICode.java
  9. 60 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/CmsConfiguration.java
  10. 16 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java
  11. 242 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/SecurityConfig.java
  12. 0 10
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/TestController.java
  13. 45 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/CourseController.java
  14. 46 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GroupController.java
  15. 54 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/ItemController.java
  16. 46 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/LessonController.java
  17. 44 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/SupportController.java
  18. 44 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/TagController.java
  19. 50 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/WareController.java
  20. 4 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/resource/ResourceController.java
  21. 49 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/CmsUserController.java
  22. 47 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/MerchantController.java
  23. 89 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/entity/AuthResult.java
  24. 332 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/entity/UserDetails.java
  25. 45 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/CmsAuthenticationProvider.java
  26. 52 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/CmsUserDetailsService.java
  27. 129 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/JwtAuthenticationTokenFilter.java
  28. 110 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/JwtTokenService.java
  29. 0 7
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/ResourceService.java
  30. 30 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/CourseService.java
  31. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/GroupService.java
  32. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/ItemService.java
  33. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/LessonService.java
  34. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/SupportService.java
  35. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/TagService.java
  36. 29 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/WareService.java
  37. 32 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/CmsUserService.java
  38. 30 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/MerchantService.java
  39. 3 0
      rankin-cms-web/src/main/resources/bootstrap.yml
  40. 15 0
      rankin-common-utils/pom.xml
  41. 0 31
      rankin-common-utils/src/main/java/cn/rankin/common/utils/annotation/mvc/ApiVerifyLevel.java
  42. 32 21
      rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICode.java
  43. 0 43
      rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICodeManager.java
  44. 11 11
      rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APIResult.java
  45. 35 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/BaseCode.java
  46. 9 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/Domain.java
  47. 6 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/utils.java
  48. 49 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CmsUserDTO.java
  49. 29 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CmsUserSearchDTO.java
  50. 38 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/MerchantDTO.java
  51. 28 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/MerchantSearchDTO.java
  52. 1 1
      rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/BaseStatusEnum.java
  53. 10 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/GenderEnum.java
  54. 20 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/ReceiptTypeEnum.java
  55. 1 1
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/BeanUtil.java
  56. 89 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/HttpUtil.java
  57. 158 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/util/ProvinceUtil.java
  58. 30 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/GroupVo.java
  59. 13 4
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/ItemVo.java
  60. 54 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/CmsUserVo.java
  61. 45 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/MerchantVo.java
  62. 53 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/web/intercepter/HeaderProcessIntercepter.java
  63. 51 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/web/intercepter/IgnoreOptionsInterceptor.java
  64. 3 3
      rankin-product-service/src/main/java/cn/rankin/productservice/configuration/GlobalExceptionHandler.java
  65. 14 27
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/CourseController.java
  66. 5 5
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/GroupController.java
  67. 8 7
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/ItemController.java
  68. 11 11
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/LessonController.java
  69. 40 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/PackageController.java
  70. 8 8
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/SupportController.java
  71. 11 12
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagController.java
  72. 4 5
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/WareController.java
  73. 6 0
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Item.java
  74. 4 1
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/ItemPrice.java
  75. 0 1
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/LessonWareRelation.java
  76. 4 0
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/Package.java
  77. 42 0
      rankin-product-service/src/main/java/cn/rankin/productservice/entity/PackageItemRelation.java
  78. 25 11
      rankin-product-service/src/main/java/cn/rankin/productservice/proxy/CourseServiceProxy.java
  79. 51 18
      rankin-product-service/src/main/java/cn/rankin/productservice/proxy/ItemServiceProxy.java
  80. 15 2
      rankin-product-service/src/main/java/cn/rankin/productservice/proxy/SupportServiceProxy.java
  81. 7 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/ItemPriceRepository.java
  82. 7 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/PackageItemRelationRepository.java
  83. 7 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/PackageRepository.java
  84. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepositoryImpl.java
  85. 4 4
      rankin-product-service/src/main/java/cn/rankin/productservice/service/CourseService.java
  86. 4 4
      rankin-product-service/src/main/java/cn/rankin/productservice/service/GroupService.java
  87. 15 4
      rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemPriceService.java
  88. 5 8
      rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemService.java
  89. 4 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemTagRelationService.java
  90. 3 3
      rankin-product-service/src/main/java/cn/rankin/productservice/service/LessonService.java
  91. 13 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageItemRelationService.java
  92. 13 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageService.java
  93. 4 7
      rankin-product-service/src/main/java/cn/rankin/productservice/service/SupportService.java
  94. 2 5
      rankin-product-service/src/main/java/cn/rankin/productservice/service/TagService.java
  95. 4 4
      rankin-product-service/src/main/java/cn/rankin/productservice/service/WareService.java
  96. 38 9
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/TestUtil.java
  97. 209 0
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/TreeNode.java
  98. 2 2
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/controller/AliOSSController.java
  99. 4 4
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/controller/ResourceController.java
  100. 0 0
      rankin-resource-service/src/main/java/cn/rankin/resourceservice/service/ResourceService.java

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

@@ -0,0 +1,16 @@
+package cn.rankin.apiweb.service.auth;
+
+import cn.rankin.cmsweb.entity.AuthResult;
+
+public interface AuthService {
+
+    // 鉴权
+    AuthResult auth(String userId, String itemId);
+
+    // 增加时长
+    AuthResult add(String userId, String itemId, Integer day);
+
+    // 缩减时长
+    AuthResult reduce(String userId, String itemId, Integer day);
+
+}

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

@@ -0,0 +1,30 @@
+package cn.rankin.apiweb.service.auth;
+
+import cn.rankin.cmsweb.entity.AuthResult;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SimpleAuthService implements AuthService {
+
+    private final static org.slf4j.Logger log = LoggerFactory.getLogger(SimpleAuthService.class);
+
+    @Override
+    public AuthResult auth(String userId, String itemId) {
+        log.info("auth user: {}, item: {}", userId, itemId);
+        AuthResult auth = new AuthResult(itemId, userId, 0, 0L, null);
+        return auth;
+    }
+
+    @Override
+    public AuthResult add(String userId, String itemId, Integer day) {
+        log.info("add user: {} item: {} day: {}", userId, itemId, day);
+        return new AuthResult(itemId, userId, 0, 0L, null);
+    }
+
+    @Override
+    public AuthResult reduce(String userId, String itemId, Integer day) {
+        log.info("reduce user: {} item: {} day: {}", userId, itemId, day);
+        return new AuthResult(itemId, userId, 0, 0L, null);
+    }
+}

+ 32 - 5
rankin-cms-web/pom.xml

@@ -12,10 +12,10 @@
 	<description>Cms Web For Spring Cloud</description>
 
 	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>1.5.8.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
+        <groupId>cn.rankin</groupId>
+        <artifactId>rankin</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
 	</parent>
 
 	<properties>
@@ -43,17 +43,44 @@
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>
         <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <version>1.16.16</version>
         </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.rankin</groupId>
+            <artifactId>rankin-common-utils</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
 
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
-	</dependencies>
+        <!--httpClient-->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netflix.feign</groupId>
+            <artifactId>feign-httpclient</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+    </dependencies>
 
 	<dependencyManagement>
 		<dependencies>

+ 5 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/CmsWebApplication.java

@@ -2,10 +2,14 @@ package cn.rankin.cmsweb;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.feign.EnableFeignClients;
 
 @EnableFeignClients
-@SpringBootApplication
+@EnableDiscoveryClient
+@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
 public class CmsWebApplication {
 
 	public static void main(String[] args) {

+ 49 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/aspect/OperationLogAspect.java

@@ -0,0 +1,49 @@
+package cn.rankin.cmsweb.assist.aspect;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Aspect
+@Component
+@Order(-100)
+public class OperationLogAspect {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+//    @Autowired
+//    AsyncOperationLogHandler asyncOperationLogHandler;
+//
+//    @Before("execution(* cn.efunbox.cms.controller..*.*Controller.*(..))")
+//    public void doBefore(JoinPoint joinPoint) throws Throwable {
+//        // 接收到请求,记录请求内容
+//        try {
+//            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//            HttpServletRequest request=attributes.getRequest();
+//            if(request.getRequestURL().indexOf("/upload")!=-1){
+//                logger.debug("上传文件 忽略!");
+//                return;
+//            }
+//            //如果是 增删改 才记录入库
+//            if(request.getMethod().equals("POST")|| request.getMethod().equals("PUT")|| request.getMethod().equals("DELETE")|| request.getMethod().equals("TRACE")|| request.getMethod().equals("PATCH")){
+//                UserDetails userDetails = (UserDetails) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT_DETAILS");
+//                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null);
+//                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+//                asyncOperationLogHandler.asyncHandleLog(joinPoint,request,authentication);
+//            }
+//        } catch (Exception e) {
+//            logger.error("日志记录出错!", e);
+//        }
+//    }
+
+}

+ 14 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/resolver/NeedUser.java

@@ -0,0 +1,14 @@
+package cn.rankin.cmsweb.assist.resolver;
+
+import java.lang.annotation.*;
+
+/**
+ * @author tomas
+ * @date 2017-04-17
+ * @what
+ */
+@Target({ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface NeedUser {
+}

+ 34 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/assist/resolver/NeedUserResolver.java

@@ -0,0 +1,34 @@
+package cn.rankin.cmsweb.assist.resolver;
+
+import cn.rankin.cmsweb.entity.UserDetails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.MethodParameter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.support.WebDataBinderFactory;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.ModelAndViewContainer;
+
+/**
+ * @author Tomas
+ * @date 2016-07-17
+ * @what
+ */
+@Component
+public class NeedUserResolver implements HandlerMethodArgumentResolver {
+    private static final Logger logger = LoggerFactory.getLogger(NeedUserResolver.class);
+    public boolean supportsParameter(MethodParameter methodParameter) {
+        return  methodParameter.hasParameterAnnotation(NeedUser.class);
+    }
+
+    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
+        logger.info(String.format("Resolve argument %s.", methodParameter.getParameterName()));
+        if(methodParameter.hasParameterAnnotation(NeedUser.class)){
+            UserDetails userDetails = (UserDetails) nativeWebRequest.getAttribute("SPRING_SECURITY_CONTEXT_DETAILS", WebRequest.SCOPE_SESSION);
+            return  userDetails;
+        }
+        return null;
+    }
+}

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/code/CmsWebAPICode.java

@@ -0,0 +1,29 @@
+package cn.rankin.cmsweb.code;
+
+import cn.rankin.common.utils.api.model.APICode;
+import cn.rankin.common.utils.api.model.BaseCode;
+
+/**
+ * Created by tomas on 2017/5/24.
+ */
+public class CmsWebAPICode extends APICode {
+
+    public final static int _C_USERNAME_PASSWORD_ERROR = 10001;
+    public final static BaseCode USERNAME_PASSWORD_ERROR = new BaseCode(_C_USERNAME_PASSWORD_ERROR, "用户名错误");
+
+    public final static int _C_PASSWORD_ERROR = 10002;
+    public final static BaseCode PASSWORD_ERROR = new BaseCode(_C_PASSWORD_ERROR, "密码错误");
+
+    public final static int _C_INVALID_TOKEN = 10003;
+    public final static BaseCode INVALID_TOKEN = new BaseCode(_C_INVALID_TOKEN, "Token失效");
+
+    public final static int _C_AUTHORIZED_FAILD = 10004;
+    public final static BaseCode AUTHORIZED_FAILD    = new BaseCode(_C_AUTHORIZED_FAILD, "Token认证失败");
+
+    public final static int _C_AUTHORIZED_EXPIRE = 10005;
+    public final static BaseCode AUTHORIZED_EXPIRE = new BaseCode(_C_AUTHORIZED_EXPIRE, "Token失效");
+
+    public final static int _C_MAX_COUNT_SESSION_ERROR = 10006;
+    public final static BaseCode MAX_COUNT_SESSION_ERROR = new BaseCode(_C_MAX_COUNT_SESSION_ERROR, "达到同时最大登录限制");
+
+}

+ 60 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/CmsConfiguration.java

@@ -0,0 +1,60 @@
+package cn.rankin.cmsweb.configuration;
+
+
+import cn.rankin.cmsweb.assist.resolver.NeedUserResolver;
+import cn.rankin.common.utils.web.intercepter.HeaderProcessIntercepter;
+import cn.rankin.common.utils.web.intercepter.IgnoreOptionsInterceptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.List;
+
+/**
+ * 类名:WebConfiguration  <br />
+ *
+ * 功能:Web相关配置
+ *
+ * @author tomas <br />
+ * 创建时间:2016年7月27日 下午3:57:19  <br />
+ * @version 2016年7月27日*/
+@EnableWebMvc
+@Configuration
+public class CmsConfiguration extends WebMvcConfigurerAdapter implements EnvironmentAware {
+	// 日志记录器
+	private static final Logger logger = LoggerFactory.getLogger(CmsConfiguration.class);
+
+	@Autowired
+	private NeedUserResolver needUserResolver;
+
+	// 当前的环境对象
+	protected Environment environment;
+
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new HeaderProcessIntercepter());
+		registry.addInterceptor(new IgnoreOptionsInterceptor());
+	}
+	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
+		// 请求体参数解析器
+//		argumentResolvers.add(new RequestBodyMappingArgumentResolver());
+		argumentResolvers.add(needUserResolver);
+		super.addArgumentResolvers(argumentResolvers);
+	}
+
+	/**
+	 * Set the {@code Environment} that this object runs in.
+	 *
+	 * @param environment
+	 */
+	@Override
+	public void setEnvironment(Environment environment) {
+		this.environment = environment;
+	}
+}

+ 16 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java

@@ -0,0 +1,16 @@
+package cn.rankin.cmsweb.configuration;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.context.annotation.Bean;
+
+public class FeignConfiguration {
+
+    public static class ContentTypeInterceptor implements RequestInterceptor {
+        @Override
+        public void apply(RequestTemplate template) {
+            template.header("Content-Type", "application/json;charset=UTF-8");
+        }
+    }
+
+}

+ 242 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/SecurityConfig.java

@@ -0,0 +1,242 @@
+package cn.rankin.cmsweb.configuration;
+
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.security.CmsAuthenticationProvider;
+import cn.rankin.cmsweb.security.CmsUserDetailsService;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+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.session.SessionManagementFilter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 安全配置中心
+ *
+ * @author by tomas
+ * @date 2017-06-06 15:30:00
+ */
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = false)//允许进入页面方法前检验
+@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+    private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);
+
+    @Value("${jwt.header}")
+    private String tokenHeader;
+
+    @Value("${jwt.cookie}")
+    private String cookieName;
+
+    @Value("${jwt.expiration}")
+    private Integer expiration;
+
+    @Autowired
+    private JwtTokenService jwtTokenService;
+
+    @Autowired
+    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
+
+    /**
+     * 用户查询服务
+     *
+     * @return
+     */
+    @Bean
+    public UserDetailsService userDetailsService() {
+        return new CmsUserDetailsService();
+    }
+
+    /**
+     * 用户认证 provider
+     *
+     * @return
+     */
+    @Bean
+    public CmsAuthenticationProvider cmsAuthenticationProvider() {
+        return new CmsAuthenticationProvider();
+    }
+
+    /**
+     * 设置那些 URL 忽略权限
+     *
+     * @param web
+     * @throws Exception
+     */
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        HttpUtil.antMatchers(HttpMethod.OPTIONS, "/**");
+        HttpUtil.antMatchers(HttpMethod.GET, "/error", "/login/**", "/logout", "/favicon.ico");
+        HttpUtil.antMatchers(HttpMethod.POST, "/file/**");
+        web.ignoring().requestMatchers(HttpUtil.getMatchersArray());
+
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+
+        // 禁用缓存
+        http.headers().cacheControl();
+
+        http
+                // 分权限验证
+//                .authorizeRequests()
+//                .anyRequest().authenticated()
+//                .and().csrf().disable()
+                .csrf().disable()
+                .authorizeRequests().antMatchers("/login", "/logout", "/favicon.ico", "/error", "/file/**").permitAll()
+                .and().addFilterBefore(jwtAuthenticationTokenFilter, SessionManagementFilter.class);
+
+        http
+                .formLogin().successHandler(new RestAuthenticationSuccessHandler())
+                .failureHandler(new RestAuthenticationFailureHandler())
+                .permitAll()
+                .and()
+                .logout().logoutSuccessHandler(new RestLogoutSuccessHandler())
+                .deleteCookies("JSESSIONID", "JWT_TOKEN")
+                .permitAll();
+        //session 管理
+        http.sessionManagement().maximumSessions(5);
+
+        http.exceptionHandling().authenticationEntryPoint(new RestAuthenticationEntryPoint());
+
+    }
+
+    /**
+     * 自定义 认证密码 和 获取用户 服务
+     *
+     * @param auth
+     * @throws Exception
+     */
+    @Autowired
+    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+        auth
+                .authenticationProvider(cmsAuthenticationProvider())
+                .userDetailsService(userDetailsService());
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManagerBean() throws Exception {
+        return super.authenticationManagerBean();
+    }
+
+    /**
+     * Rest 登陆成功后的处理
+     */
+    public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
+        @Override
+        public void onAuthenticationSuccess(HttpServletRequest request,
+                                            HttpServletResponse response, Authentication authentication)
+                throws ServletException, IOException {
+
+            if (null != authentication.getPrincipal()) {
+                UserDetails userDetails = (UserDetails) authentication.getPrincipal();
+                //兼容 cookie 和 header x-token 验证两种方式
+                Cookie cookie = new Cookie(cookieName, jwtTokenService.generateToken(userDetails.getUsername()));
+                cookie.setPath("/");
+                cookie.setMaxAge(expiration);
+                cookie.isHttpOnly();
+                response.addCookie(cookie);
+                response.addHeader(tokenHeader, jwtTokenService.generateToken(userDetails.getUsername()));
+                //redisService.set(String.format(LOGIN_TOKEN_FORMAT_KEY,userDetails.getUsername()),userDetails,expiration, TimeUnit.SECONDS);
+                HttpUtil.responseOutWithJson(request, response, APIResult.ok(userDetails));
+                clearAuthenticationAttributes(request);
+            }
+
+        }
+    }
+
+    /**
+     * Rest 登录认证失败后的处理
+     */
+
+    public class RestAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
+        @Override
+        public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
+                throws ServletException, IOException {
+
+            logger.error("登录失败 exception={}", exception);
+            saveException(request, exception);
+
+            //密码错误
+            if (exception instanceof BadCredentialsException) {
+                HttpUtil.error(request, response, CmsWebAPICode.PASSWORD_ERROR);
+            }
+            //查询用户出错
+            else if (exception instanceof UsernameNotFoundException) {
+                HttpUtil.error(request, response, CmsWebAPICode.USERNAME_PASSWORD_ERROR);
+            }
+            //查询用户出错
+            else if (exception instanceof SessionAuthenticationException) {
+                HttpUtil.error(request, response, CmsWebAPICode.MAX_COUNT_SESSION_ERROR);
+            } else {
+                HttpUtil.error(request, response, CmsWebAPICode.AUTHORIZED_FAILD);
+            }
+        }
+    }
+
+    /**
+     * Rest 登出成功后的处理
+     */
+
+    public class RestLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
+        @Override
+        public void onLogoutSuccess(HttpServletRequest request,
+                                    HttpServletResponse response, Authentication authentication)
+                throws IOException, ServletException {
+
+            logger.info("登出成功! ");
+            HttpUtil.delCookies(request, response, "JSESSIONID", cookieName);
+            HttpUtil.ok(request, response);
+
+        }
+    }
+
+    /**
+     * Rest 权限不通过的处理
+     */
+    public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
+        @Override
+        public void commence(HttpServletRequest request,
+                             HttpServletResponse response,
+                             AuthenticationException authException) throws IOException {
+            //原生返回 response.sendError(HttpServletResponse.SC_UNAUTHORIZED,"Authentication Failed: " + authException.getMessage());
+            //cookie失效
+            HttpUtil.error(request, response, CmsWebAPICode.ACCESS_DENIED);
+        }
+    }
+}

+ 0 - 10
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/TestController.java

@@ -1,10 +0,0 @@
-package cn.rankin.cmsweb.controller;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class TestController {
-
-}

+ 45 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/CourseController.java

@@ -0,0 +1,45 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.CourseService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.CourseDTO;
+import cn.rankin.common.utils.dto.search.SearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.CourseVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/course")
+public class CourseController {
+
+    @Autowired
+    private CourseService courseService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<CourseVo>> search(SearchDTO searchDTO) {
+        return courseService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<CourseVo> create(@RequestBody CourseDTO courseDTO) {
+        return courseService.create(courseDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<CourseVo> update(@RequestBody CourseDTO courseDTO) {
+        return courseService.update(courseDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("id") String id) {
+        return courseService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<CourseVo> getCourse(@PathVariable("id") String id) {
+        return courseService.getCourse(id);
+    }
+
+}

+ 46 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GroupController.java

@@ -0,0 +1,46 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.GroupService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.GroupDTO;
+import cn.rankin.common.utils.dto.search.GroupSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.GroupVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping(value = "/group")
+public class GroupController {
+
+    @Autowired
+    private GroupService groupService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<GroupVo>> search(GroupSearchDTO searchDTO) {
+        return groupService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<GroupVo> create(@Valid @RequestBody GroupDTO groupDTO) {
+        return groupService.create(groupDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<GroupVo> update(@Valid @RequestBody GroupDTO groupDTO) {
+        return groupService.update(groupDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return groupService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<GroupVo> getGroup(@PathVariable("id") String id) {
+        return groupService.getGroup(id);
+    }
+}

+ 54 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/ItemController.java

@@ -0,0 +1,54 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.product.ItemService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.ItemDTO;
+import cn.rankin.common.utils.dto.search.ItemSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.ItemVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/item")
+public class ItemController {
+
+    @Autowired
+    private ItemService itemService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<ItemVo>> search(@NeedUser UserDetails user, ItemSearchDTO searchDTO) {
+        if (user == null) {
+            return APIResult.error(CmsWebAPICode.ACCESS_DENIED);
+        }
+        if (!user.isPlatForm()) {
+            searchDTO.setMerchantId(user.getMerchantId());
+        }
+        return itemService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<ItemVo> create(@RequestBody ItemDTO itemDTO) {
+        return itemService.create(itemDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<ItemVo> udpate(@RequestBody ItemDTO itemDTO) {
+        return itemService.update(itemDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return itemService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<ItemVo> getItem(@PathVariable("id") String id) {
+        return itemService.getItem(id);
+    }
+
+ }

+ 46 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/LessonController.java

@@ -0,0 +1,46 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.LessonService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.LessonDTO;
+import cn.rankin.common.utils.dto.search.SearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.LessonVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping(value = "/lesson")
+public class LessonController {
+
+    @Autowired
+    private LessonService lessonService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<LessonVo>> getLessonList(SearchDTO searchDTO) {
+        return lessonService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<LessonVo> getLesson(@PathVariable("id") String id) {
+        return lessonService.getLesson(id);
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<LessonVo> create(@Valid @RequestBody LessonDTO lessonDTO) {
+        return lessonService.create(lessonDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<LessonVo> update(@Valid @RequestBody LessonDTO lessonDTO) {
+        return lessonService.update(lessonDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("id") String id) {
+        return lessonService.delete(id);
+    }
+}

+ 44 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/SupportController.java

@@ -0,0 +1,44 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.SupportService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.SupportDTO;
+import cn.rankin.common.utils.dto.search.SearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.SupportVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/support")
+public class SupportController {
+
+    @Autowired
+    private SupportService supportService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<SupportVo>> search(SearchDTO searchDTO) {
+        return supportService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<SupportVo> getSupport(@PathVariable("id") String id) {
+        return supportService.getSupport(id);
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<SupportVo> create(@RequestBody SupportDTO supportDTO) {
+        return supportService.create(supportDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<SupportVo> update(@RequestBody SupportDTO supportDTO) {
+        return supportService.update(supportDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return supportService.delete(id);
+    }
+}

+ 44 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/TagController.java

@@ -0,0 +1,44 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.TagService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.product.TagDTO;
+import cn.rankin.common.utils.dto.search.TagSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.product.TagVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/tag")
+public class TagController {
+
+    @Autowired
+    private TagService tagService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<TagVo>> search(TagSearchDTO searchDTO) {
+        return tagService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<TagVo> getTag(@PathVariable("id") String id) {
+        return tagService.getTag(id);
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<TagVo> create(@RequestBody TagDTO tagDTO) {
+        return tagService.create(tagDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<TagVo> update(@RequestBody TagDTO tagDTO) {
+        return tagService.update(tagDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("id") String id) {
+        return tagService.delete(id);
+    }
+}

+ 50 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/WareController.java

@@ -0,0 +1,50 @@
+package cn.rankin.cmsweb.controller.product;
+
+import cn.rankin.cmsweb.service.product.WareService;
+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.*;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping(value = "/ware")
+public class WareController {
+
+    @Autowired
+    private WareService wareService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<WareVo>> search(SearchDTO searchDTO) {
+        return wareService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<WareVo> create(@Valid @RequestBody WareDTO wareDTO) {
+        return wareService.create(wareDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<WareVo> update(@Valid @RequestBody WareDTO wareDTO) {
+        if (wareDTO.getId() == null) {
+            return APIResult.error(APICode.error("参数错误: id"));
+        }
+        return wareService.update(wareDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("id") String id) {
+        return wareService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<WareVo> getWare(@PathVariable("id") String id) {
+        return wareService.getWare(id);
+    }
+}

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

@@ -0,0 +1,4 @@
+package cn.rankin.cmsweb.controller.resource;
+
+public class ResourceController {
+}

+ 49 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/CmsUserController.java

@@ -0,0 +1,49 @@
+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.CmsUserService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.CmsUserDTO;
+import cn.rankin.common.utils.dto.user.CmsUserSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.user.CmsUserVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/cms/user")
+public class CmsUserController {
+
+    @Autowired
+    private CmsUserService cmsUserService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<CmsUserVo>> search(@NeedUser UserDetails user, CmsUserSearchDTO searchDTO) {
+        if (!user.isPlatForm()) {
+            String merchantId = user.getMerchantId();
+            searchDTO.setMerchantId(merchantId);
+        }
+        return cmsUserService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<CmsUserVo> create(@RequestBody CmsUserDTO userDTO) {
+        return cmsUserService.create(userDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<CmsUserVo> update(@RequestBody CmsUserDTO userDTO) {
+        return cmsUserService.update(userDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
+        return cmsUserService.delete(id);
+    }
+
+}

+ 47 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/MerchantController.java

@@ -0,0 +1,47 @@
+package cn.rankin.cmsweb.controller.user;
+
+import cn.rankin.cmsweb.service.user.MerchantService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.user.MerchantDTO;
+import cn.rankin.common.utils.dto.user.MerchantSearchDTO;
+import cn.rankin.common.utils.util.BeanUtil;
+import cn.rankin.common.utils.vo.user.MerchantVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping(value = "/merchant")
+public class MerchantController {
+
+    @Autowired
+    private MerchantService merchantService;
+
+    @RequestMapping(value = {"", "/list"}, method = RequestMethod.GET)
+    public APIResult<Page<MerchantVo>> getPage(MerchantSearchDTO searchDTO) {
+        return merchantService.search(BeanUtil.convertToMap(searchDTO));
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<MerchantVo> create(@RequestBody @Valid MerchantDTO merchantDTO) {
+        return merchantService.create(merchantDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<MerchantVo> update(@RequestBody @Valid MerchantDTO merchantDTO) {
+        return merchantService.update(merchantDTO);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable String id) {
+        return merchantService.delete(id);
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<MerchantVo> getMerchant(@PathVariable String id) {
+        return merchantService.getMerchant(id);
+    }
+
+}

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

@@ -0,0 +1,89 @@
+package cn.rankin.cmsweb.entity;
+
+import java.io.Serializable;
+
+public class AuthResult implements Serializable {
+
+    private String parentId;
+
+    private String itemId;
+
+    private String userId;
+
+    private Integer type;
+
+    private Long startTime;
+
+    private Long endTime;
+
+    public AuthResult() {
+
+    }
+
+    public AuthResult(String parentId, String itemId, String userId, Integer type, Long startTime, Long endTime) {
+        this.parentId = parentId;
+        this.itemId = itemId;
+        this.userId = userId;
+        this.type = type;
+        this.startTime = startTime;
+        this.endTime = endTime;
+    }
+
+    public AuthResult(String itemId, String userId, Integer type, Long startTime, Long endTime) {
+        this(null, itemId, userId, type, startTime, endTime);
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getItemId() {
+        return itemId;
+    }
+
+    public void setItemId(String itemId) {
+        this.itemId = itemId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getValidTime() {
+        if (startTime == null || endTime == null) {
+            return null;
+        }
+        return endTime - startTime;
+    }
+
+    public Boolean isValid() {
+        if (endTime == null && startTime != null) {
+            return Boolean.TRUE;
+        }
+        return getValidTime() > 0;
+    }
+}

+ 332 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/entity/UserDetails.java

@@ -0,0 +1,332 @@
+package cn.rankin.cmsweb.entity;
+
+import cn.rankin.common.utils.constant.Domain;
+import com.alibaba.fastjson.annotation.JSONField;
+import org.springframework.security.core.CredentialsContainer;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.SpringSecurityCoreVersion;
+import org.springframework.util.Assert;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @author Dreampie
+ * @date 2015-09-18
+ * @what
+ */
+public class UserDetails implements org.springframework.security.core.userdetails.UserDetails, CredentialsContainer {
+
+    private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
+
+    private Set<GrantedAuthority> authorities;
+
+    private boolean accountNonExpired;
+
+    private boolean accountNonLocked;
+
+    private boolean credentialsNonExpired;
+
+    private boolean enabled;
+
+    private String id;
+
+    private String avatar;
+
+    private Date birthday;
+
+    private String code;
+
+    private Integer domain;
+
+    private String merchantId;
+
+    private String merchantName;
+
+    private String mobileNo;
+
+    private String username;
+
+    private String nickName;
+
+    private String password;
+
+    private Boolean isAdmin;
+
+    public UserDetails() {
+        super();
+    }
+
+    /**
+     * Calls the more complex constructor with all boolean arguments set to {@code true}.
+     */
+    public UserDetails(String username, String password, Collection<? extends GrantedAuthority> authorities) {
+        this(username, password, true, true, true, true, authorities);
+    }
+
+    public UserDetails(String username, String password, boolean enabled,
+                       boolean accountNonExpired, boolean credentialsNonExpired,
+                       boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
+
+        if (((username == null) || "".equals(username)) || (password == null)) {
+            throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
+        }
+
+        this.username = username;
+        this.password = password;
+        this.enabled = enabled;
+        this.accountNonExpired = accountNonExpired;
+        this.credentialsNonExpired = credentialsNonExpired;
+        this.accountNonLocked = accountNonLocked;
+        this.authorities = Collections.unmodifiableSet(sortAuthorities(authorities));
+    }
+
+    public UserDetails(Set<GrantedAuthority> authorities, boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, boolean enabled, String id, String username, String avatar, Date birthday, String code, Integer domain, String merchantId, String merchantName, String mobileNo, String nickName, String password, Boolean isAdmin) {
+
+        if (((username == null) || "".equals(username)) || (password == null)) {
+            throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
+        }
+        this.authorities = authorities;
+        this.accountNonExpired = accountNonExpired;
+        this.accountNonLocked = accountNonLocked;
+        this.credentialsNonExpired = credentialsNonExpired;
+        this.enabled = enabled;
+        this.id = id;
+        this.username = username;
+        this.avatar = avatar;
+        this.birthday = birthday;
+        this.code = code;
+        this.domain = domain;
+        this.merchantId = merchantId;
+        this.merchantName=merchantName;
+        this.mobileNo = mobileNo;
+        this.nickName = nickName;
+        this.password = password;
+        this.isAdmin = isAdmin;
+    }
+
+
+    // ~ Methods
+    // ========================================================================================================
+
+    private static SortedSet<GrantedAuthority> sortAuthorities(
+            Collection<? extends GrantedAuthority> authorities) {
+        Assert.notNull(authorities, "Cannot pass a null GrantedAuthority collection");
+        // Ensure array iteration order is predictable (as per
+        // UserDetails.getAuthorities() contract and SEC-717)
+        SortedSet<GrantedAuthority> sortedAuthorities = new TreeSet<GrantedAuthority>(
+                new AuthorityComparator());
+
+        for (GrantedAuthority grantedAuthority : authorities) {
+            Assert.notNull(grantedAuthority,
+                    "GrantedAuthority list cannot contain any null elements");
+            sortedAuthorities.add(grantedAuthority);
+        }
+
+        return sortedAuthorities;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getDomain() {
+        return domain;
+    }
+
+    public void setDomain(Integer domain) {
+        this.domain = domain;
+    }
+
+    public String getMerchantId() {
+        return merchantId;
+    }
+
+    public void setMerchantId(String merchantId) {
+        this.merchantId = merchantId;
+    }
+
+    public String getMerchantName() {
+        return merchantName;
+    }
+
+    public void setMerchantName(String merchantName) {
+        this.merchantName = merchantName;
+    }
+
+    public String getMobileNo() {
+        return mobileNo;
+    }
+
+    public void setMobileNo(String mobileNo) {
+        this.mobileNo = mobileNo;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public Boolean getAdmin() {
+        return isAdmin;
+    }
+
+    public void setAdmin(Boolean admin) {
+        isAdmin = admin;
+    }
+
+    @JSONField(serialize = false)
+    public Collection<GrantedAuthority> getAuthorities() {
+        return authorities;
+    }
+
+    @JSONField(serialize = false)
+    public String getPassword() {
+        return password;
+    }
+
+    @JSONField(serialize = false)
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    @JSONField(serialize = false)
+    public boolean isAccountNonExpired() {
+        return accountNonExpired;
+    }
+
+    @JSONField(serialize = false)
+    public boolean isAccountNonLocked() {
+        return accountNonLocked;
+    }
+
+    @JSONField(serialize = false)
+    public boolean isCredentialsNonExpired() {
+        return credentialsNonExpired;
+    }
+
+    public void eraseCredentials() {
+        password = null;
+    }
+
+
+    /**
+     * Returns {@code true} if the supplied object is a {@code UserDetails} instance with the
+     * same {@code username} value.
+     * <p>
+     * In other words, the objects are equal if they have the same username, representing
+     * the same principal.
+     */
+
+    public boolean equals(Object rhs) {
+        if (rhs instanceof UserDetails) {
+            return username.equals(((UserDetails) rhs).username);
+        }
+        return false;
+    }
+
+    /**
+     * Returns the hashcode of the {@code username}.
+     */
+    @Override
+    public int hashCode() {
+        return username.hashCode();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString()).append(": ");
+        sb.append("Username: ").append(this.username).append("; ");
+        sb.append("Password: [PROTECTED]; ");
+        sb.append("Enabled: ").append(this.enabled).append("; ");
+        sb.append("AccountNonExpired: ").append(this.accountNonExpired).append("; ");
+        sb.append("credentialsNonExpired: ").append(this.credentialsNonExpired)
+                .append("; ");
+        sb.append("AccountNonLocked: ").append(this.accountNonLocked).append("; ");
+
+        if (!authorities.isEmpty()) {
+            sb.append("Granted Authorities: ");
+
+            boolean first = true;
+            for (GrantedAuthority auth : authorities) {
+                if (!first) {
+                    sb.append(",");
+                }
+                first = false;
+
+                sb.append(auth);
+            }
+        } else {
+            sb.append("Not granted any authorities");
+        }
+
+        return sb.toString();
+    }
+
+    public boolean isPlatForm() {
+        if (domain == null) {
+            return false;
+        }
+        return domain.equals(Domain.PLATFORM);
+    }
+
+    private static class AuthorityComparator implements Comparator<GrantedAuthority>,
+            Serializable {
+        private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
+
+        public int compare(GrantedAuthority g1, GrantedAuthority g2) {
+            if (g2.getAuthority() == null) {
+                return -1;
+            }
+
+            if (g1.getAuthority() == null) {
+                return 1;
+            }
+
+            return g1.getAuthority().compareTo(g2.getAuthority());
+        }
+    }
+}

+ 45 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/CmsAuthenticationProvider.java

@@ -0,0 +1,45 @@
+package cn.rankin.cmsweb.security;
+
+import cn.rankin.common.utils.util.SecurityUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+@Component
+public class CmsAuthenticationProvider implements AuthenticationProvider {
+
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private CmsUserDetailsService cmsUserDetailsService;
+
+    @Override
+    public Authentication authenticate(Authentication authentication)
+                                                throws AuthenticationException {
+        String username = authentication.getName();
+        String password = (String) authentication.getCredentials();
+        UserDetails user = cmsUserDetailsService.loadUserByUsername(username);
+        logger.info("password={}, needPassword={}", password, user.getPassword());
+        //密码匹配验证
+        if (SecurityUtil.MD5(password).equals(user.getPassword())) {
+            Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
+            return new UsernamePasswordAuthenticationToken(user, password, authorities);
+        }
+        throw new BadCredentialsException("Wrong password.");
+    }
+
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return true;
+    }
+}

+ 52 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/CmsUserDetailsService.java

@@ -0,0 +1,52 @@
+package cn.rankin.cmsweb.security;
+
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.user.CmsUserService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.vo.user.CmsUserVo;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Component
+public class CmsUserDetailsService implements UserDetailsService {
+
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private CmsUserService cmsUserService;
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        logger.info("loadUserByUsername: {}", username);
+        //TODO: 将来加入权限验证
+        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
+
+        APIResult<CmsUserVo> cmsUserApiResult = cmsUserService.findCmsUserByName(username);
+        if (cmsUserApiResult == null || !cmsUserApiResult.getSuccess() || cmsUserApiResult.getData() == null) {
+            throw new UsernameNotFoundException("用户不存在");
+        }
+
+        CmsUserVo cmsUser = cmsUserApiResult.getData();
+        if (null != cmsUser.getResources()) {
+            cmsUser.getResources().forEach(resouce -> {
+                if (!StringUtils.isEmpty(resouce)) {
+                    GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(resouce.toUpperCase());
+                    grantedAuthorities.add(grantedAuthority);
+                }
+            });
+        }
+        logger.info("grantedAuthorities --> {}", grantedAuthorities);
+        return new UserDetails(grantedAuthorities,true,true,true,true,
+                cmsUser.getId(), cmsUser.getName(), cmsUser.getAvatar(), cmsUser.getBirthday(), null, cmsUser.getDomain(), cmsUser.getMerchantId(), cmsUser.getMerchantName(), cmsUser.getMobile(), cmsUser.getNickName(), cmsUser.getPassword(), cmsUser.getIsAdmin());
+    }
+}

+ 129 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/JwtAuthenticationTokenFilter.java

@@ -0,0 +1,129 @@
+package cn.rankin.cmsweb.security;
+
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.common.utils.util.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.NamedThreadLocal;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.util.WebUtils;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
+
+    private final Logger logger = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class);
+
+    @Autowired
+    private JwtTokenService jwtTokenService;
+
+    @Autowired
+    private CmsUserDetailsService cmsUserDetailsService;
+
+    @Value("${jwt.header:X-Token}")
+    private String tokenHeader;
+
+    @Value("${jwt.cookie:X-Cookie}")
+    private String cookieName;
+
+    @Value("${jwt.expiration:604800}")
+    private Integer expiration;
+
+    private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime");
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
+        startTimeThreadLocal.set(System.currentTimeMillis());//线程绑定变量(该数据只有当前请求的线程可见)
+        logger.info("进入JwtAuthenticationTokenFilter开始 url={} method={}", request.getRequestURI(), request.getMethod());
+        //如果不想走过滤的url  忽略掉
+        if (HttpUtil.ignoreRequest.size()>0){
+            logger.debug("HttpUtil.ignoreRequest" , JSON.toJSONString(HttpUtil.ignoreRequest));
+            for(RequestMatcher matcher: HttpUtil.ignoreRequest){
+                logger.debug("matcher {}  isM {}" , JSON.toJSONString(matcher),matcher.matches(request));
+                if (matcher.matches(request)){
+                    chain.doFilter(request, response);
+                    return;
+                }
+            }
+        }
+
+        if (HttpMethod.OPTIONS.matches(request.getMethod()) || request.getRequestURL().indexOf("favicon.ico")!=-1) {
+            logger.debug("OPTIONS 请求 忽略 返回200");
+            response.setStatus(HttpStatus.OK.value());
+            HttpUtil.ok(request,response);
+            return;
+        }
+
+        String authToken = null;
+        Cookie cookie = WebUtils.getCookie(request, this.cookieName);
+        if (cookie != null && !StringUtils.isEmpty(cookie.getValue())) {
+            authToken = cookie.getValue();
+        }else if(!StringUtils.isEmpty(request.getHeader(this.tokenHeader))){
+            authToken = request.getHeader(this.tokenHeader);
+        }else {
+            HttpUtil.error(request, response, CmsWebAPICode.AUTHORIZED_FAILD);
+            return;
+        }
+
+        //判断先解析 出 username
+        logger.debug("checking authentication for cookie {} authToken {} ", JSON.toJSONString(cookie), authToken);
+        String username = jwtTokenService.getUsernameFromToken(authToken);
+        logger.debug("checking authentication for user " + username);
+        // 如果解析 username 为空 则重新登录
+        if (username != null) {
+            UserDetails userDetails = null;
+            if (request.getSession().getAttribute("SPRING_SECURITY_CONTEXT_DETAILS") instanceof UserDetails ){
+                userDetails=(UserDetails)request.getSession().getAttribute("SPRING_SECURITY_CONTEXT_DETAILS");
+                request.getSession().setMaxInactiveInterval(expiration);
+            }else {
+                userDetails = this.cmsUserDetailsService.loadUserByUsername(username);
+                request.getSession().setMaxInactiveInterval(expiration);
+                request.getSession().setAttribute("SPRING_SECURITY_CONTEXT_DETAILS",userDetails);
+            }
+            //验证 用户名和 token 的有效性
+            if (jwtTokenService.validateToken(authToken, userDetails)) {
+                //默认 cookie 一小时有效 但是我半小时 会更新一次 cookie 信息
+                if((System.currentTimeMillis()+expiration*1000/2)>jwtTokenService.getExpirationDateFromToken(authToken).getTime()){
+                    authToken =  jwtTokenService.generateToken(userDetails.getUsername());
+                    cookie = new Cookie(cookieName,authToken);
+                    cookie.setPath("/");
+                    cookie.setMaxAge(expiration);
+                    cookie.isHttpOnly();
+                    response.addCookie(cookie);
+                    //redisTemplate.opsForValue().set(String.format(LOGIN_TOKEN_FORMAT_KEY,username),userDetails,expiration, TimeUnit.SECONDS);
+                }
+                //正确的情况下 认证成功!
+                chain.doFilter(request, response);
+                logger.info("进入JwtAuthenticationTokenFilter结束 url={}",request.getRequestURI());
+                long endTime = System.currentTimeMillis();
+                long consumeTime = endTime - startTimeThreadLocal.get();
+                if(consumeTime > 500) {
+                    logger.info(" 请求: {} consume {} millis", request.getRequestURI(), consumeTime);
+                }
+                return;
+            }else{
+                HttpUtil.error(request, response, CmsWebAPICode.INVALID_TOKEN);
+                return;
+            }
+        }else {
+            HttpUtil.error(request, response, CmsWebAPICode.INVALID_TOKEN);
+            return;
+        }
+
+    }
+}

+ 110 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/security/JwtTokenService.java

@@ -0,0 +1,110 @@
+package cn.rankin.cmsweb.security;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Jonsy
+ *
+ */
+@Component
+public class JwtTokenService implements Serializable {
+
+    private static final long serialVersionUID = -3301605591108950415L;
+
+    static final String CLAIM_KEY_USERNAME = "sub";
+    static final String CLAIM_KEY_CREATED = "created";
+
+    @Value("${jwt.secret:ohq3TGwT}")
+    private String secret;
+
+    @Value("${jwt.expiration:604800}")
+    private Long expiration;
+
+    public String getUsernameFromToken(String token) {
+        String username;
+        try {
+            final Claims claims = getClaimsFromToken(token);
+            username = claims.getSubject();
+        } catch (Exception e) {
+            username = null;
+        }
+        return username;
+    }
+
+
+    public Date getExpirationDateFromToken(String token) {
+        Date expiration;
+        try {
+            final Claims claims = getClaimsFromToken(token);
+            expiration = claims.getExpiration();
+        } catch (Exception e) {
+            expiration = null;
+        }
+        return expiration;
+    }
+
+
+    private Claims getClaimsFromToken(String token) {
+        Claims claims;
+        try {
+            claims = Jwts.parser()
+                    .setSigningKey(secret)
+                    .parseClaimsJws(token)
+                    .getBody();
+        } catch (Exception e) {
+            claims = null;
+        }
+        return claims;
+    }
+
+    private Date generateExpirationDate() {
+        return new Date(System.currentTimeMillis() + expiration * 1000);
+    }
+
+    private Boolean isTokenExpired(String token) {
+        final Date expiration = getExpirationDateFromToken(token);
+        return expiration.before(new Date());
+    }
+
+    public String generateToken(String userName) {
+        Map<String, Object> claims = new HashMap<>();
+        claims.put(CLAIM_KEY_USERNAME, userName);
+        claims.put(CLAIM_KEY_CREATED, new Date());
+        return generateToken(claims);
+    }
+
+    private String generateToken(Map<String, Object> claims) {
+        return Jwts.builder()
+                .setClaims(claims)
+                .setExpiration(generateExpirationDate())
+                .signWith(SignatureAlgorithm.HS512, secret)
+                .compact();
+    }
+
+    public String refreshToken(String token) {
+        String refreshedToken;
+        try {
+            final Claims claims = getClaimsFromToken(token);
+            claims.put(CLAIM_KEY_CREATED, new Date());
+            refreshedToken = generateToken(claims);
+        } catch (Exception e) {
+            refreshedToken = null;
+        }
+        return refreshedToken;
+    }
+
+    public Boolean validateToken(String token, UserDetails userDetails) {
+        final String username = getUsernameFromToken(token);
+        return (username.equals(userDetails.getUsername())&& !isTokenExpired(token));
+    }
+}

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

@@ -1,7 +0,0 @@
-package cn.rankin.cmsweb.service;
-
-import org.springframework.cloud.netflix.feign.FeignClient;
-
-@FeignClient(name = "${")
-public class ResourceService {
-}

+ 30 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/CourseService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/GroupService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/ItemService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/LessonService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/SupportService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/TagService.java

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

+ 29 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/WareService.java

@@ -0,0 +1,29 @@
+package cn.rankin.cmsweb.service.product;
+
+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.vo.product.WareVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@FeignClient(value = "${service.product.name}")
+public interface WareService {
+
+    @RequestMapping(value = "/ware/list", method = RequestMethod.GET)
+    APIResult<Page<WareVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "/ware", method = RequestMethod.POST)
+    APIResult<WareVo> create(@RequestBody WareDTO wareDTO);
+
+    @RequestMapping(value = "/ware", method = RequestMethod.PUT)
+    APIResult<WareVo> update(@RequestBody WareDTO wareDTO);
+
+    @RequestMapping(value = "/ware/{id}", method = RequestMethod.DELETE)
+    APIResult delete(@PathVariable("id") String id);
+
+    @RequestMapping(value = "/ware/{id}", method = RequestMethod.GET)
+    APIResult<WareVo> getWare(@PathVariable("id") String id);
+}

+ 32 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/CmsUserService.java

@@ -0,0 +1,32 @@
+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.CmsUserDTO;
+import cn.rankin.common.utils.vo.user.CmsUserVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+
+@FeignClient(name = "${service.user.name}")
+public interface CmsUserService {
+
+    @RequestMapping(value = "cms/user", method = RequestMethod.GET)
+    APIResult<CmsUserVo> findCmsUserByName(@RequestParam("name") String userName);
+
+    @RequestMapping(value = "cms/user/list", method = RequestMethod.GET)
+    APIResult<Page<CmsUserVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "cms/user", method = RequestMethod.POST)
+    APIResult<CmsUserVo> create(@RequestBody CmsUserDTO userDTO);
+
+    @RequestMapping(value = "cms/user", method = RequestMethod.PUT)
+    APIResult<CmsUserVo> update(@RequestBody CmsUserDTO userDTO);
+
+    @RequestMapping(value = "cms/user/{id}", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@PathVariable("id") String id);
+
+}
+

+ 30 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/MerchantService.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.MerchantDTO;
+import cn.rankin.common.utils.vo.user.MerchantVo;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@FeignClient(name = "${service.user.name}")
+public interface MerchantService {
+
+    @RequestMapping(value = "merchant/list", method = RequestMethod.GET)
+    APIResult<Page<MerchantVo>> search(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "merchant", method = RequestMethod.POST)
+    APIResult<MerchantVo> create(@RequestBody MerchantDTO merchantDTO);
+
+    @RequestMapping(value = "merchant", method = RequestMethod.PUT)
+    APIResult<MerchantVo> update(@RequestBody MerchantDTO merchantDTO);
+
+    @RequestMapping(value = "merchant/{id}", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@PathVariable("id") String id);
+
+    @RequestMapping(value = "merchant/{id}", method = RequestMethod.GET)
+    APIResult<MerchantVo> getMerchant(@PathVariable("id") String id);
+
+}

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

@@ -6,6 +6,9 @@ spring:
       uri: http://config.rankin.com:8921
       label: master
       profile: dev
+feign:
+  httpclient:
+    enabled: true
 
 server:
   port: 8500

+ 15 - 0
rankin-common-utils/pom.xml

@@ -52,6 +52,21 @@
             <artifactId>lombok</artifactId>
             <version>1.16.16</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>4.3.12.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-web</artifactId>
+            <version>4.2.2.RELEASE</version>
+        </dependency>
 
     </dependencies>
 

+ 0 - 31
rankin-common-utils/src/main/java/cn/rankin/common/utils/annotation/mvc/ApiVerifyLevel.java

@@ -1,31 +0,0 @@
-package cn.rankin.common.utils.annotation.mvc;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 类名:ApiVerifyLevel  <br />
- *
- * 功能:api 接口的 验证拦截力度
- *
- * @author tomas
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ApiVerifyLevel {
-
-	public static String NEED_HEADER ="need_header";
-	public static String NEED_TOKEN ="need_token";
-	public static String NEED_NONE ="ignore_all";
-	/**
-     * 功能:参数名 <br/>
-	 *
-	 * @author tomas <br/>
-	 * @version 2017年10月27日 下午4:45:55 <br/>
-	 */
-	String[] level() default NEED_NONE;
-	
-	
-}

+ 32 - 21
rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICode.java

@@ -1,35 +1,46 @@
 package cn.rankin.common.utils.api.model;
 
-import com.alibaba.fastjson.JSON;
-
 public class APICode {
 
-    private int code;
+    public final static int _C_OK = 200 ;
+    public final static BaseCode OK = new BaseCode(_C_OK, null);
 
-    private String message;
+    public final static int _C_ACCESS_DENIED = 403;
+    public final static BaseCode ACCESS_DENIED  = new BaseCode(_C_ACCESS_DENIED, "访问被拒绝");
 
-    public String getMessage() {
-        return message;
-    }
+    public final static int _C_NOT_FOUND = 404 ;
+    public final static BaseCode NOT_FOUND = new BaseCode(_C_NOT_FOUND, "资源不存在");
 
-    public void setMessage(String message) {
-        this.message = message;
-    }
+    public final static int _C_SERVER_ERROR = 500;
+    public final static BaseCode SERVER_ERROR = new BaseCode(_C_SERVER_ERROR, "请求处理异常");
 
-    public int getCode() {
-        return code;
-    }
+    public final static int _C_PARAMETER_ERROR = 400;
+    public final static BaseCode PARAMETER_ERROR = new BaseCode(_C_PARAMETER_ERROR, "参数错误");
+
+    public final static int _C_REMOTE_SERVER_ERROR = 600;
+    public final static BaseCode REMOTE_SERVER_ERROR = new BaseCode(_C_REMOTE_SERVER_ERROR, "远程服务器错误");
+
+    public final static int _C_ALREADY_EXISTS = 700;
+    public final static BaseCode ALREADY_EXISTS = new BaseCode(_C_ALREADY_EXISTS, "数据已存在");
+
+    public final static int _C_NOT_EXISTS = 800;
+    public final static BaseCode NOT_EXISTS = new BaseCode(_C_NOT_EXISTS, "数据不存在 ");
+
+    public final static int _C_OPERATE_ERROR = 1001;
+    public final static BaseCode OPERATE_ERROR = new BaseCode(_C_OPERATE_ERROR, "操作失败");
+
+    public final static int _C_CAN_NOT_DEL = 1002;
+    public final static BaseCode CAN_NOT_DEL = new BaseCode(_C_CAN_NOT_DEL, "无法删除");
 
-    public APICode() {}
+    // cms flag code
+    public final static int _CMS_WEB_FLAG = 10000;
 
-    public APICode(int code, String message) {
-        this.code = code;
-        this.message = message;
+    public static BaseCode ok(String message) {
+        return new BaseCode(_C_OK, message);
     }
 
-    public static void main(String[] args) {
-        APICode example = new APICode(200, "success");
-        System.out.print(JSON.toJSONString(example));
+    public static BaseCode error(String message) {
+        return new BaseCode(_C_PARAMETER_ERROR, message);
     }
 
-}
+}

+ 0 - 43
rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APICodeManager.java

@@ -1,43 +0,0 @@
-package cn.rankin.common.utils.api.model;
-
-public class APICodeManager {
-
-    public final static int _C_OK = 200 ;
-    public final static APICode OK = new APICode(_C_OK, null);
-
-    public final static int _C_ACCESS_DENIED = 403;
-    public final static APICode ACCESS_DENIED  = new APICode(_C_ACCESS_DENIED, "访问被拒绝");
-
-    public final static int _C_NOT_FOUND = 404 ;
-    public final static APICode NOT_FOUND = new APICode(_C_NOT_FOUND, "资源不存在");
-
-    public final static int _C_SERVER_ERROR = 500;
-    public final static APICode SERVER_ERROR = new APICode(_C_SERVER_ERROR, "请求处理异常");
-
-    public final static int _C_PARAMETER_ERROR = 400;
-    public final static APICode PARAMETER_ERROR = new APICode(_C_PARAMETER_ERROR, "参数错误");
-
-    public final static int _C_REMOTE_SERVER_ERROR = 600;
-    public final static APICode REMOTE_SERVER_ERROR = new APICode(_C_REMOTE_SERVER_ERROR, "远程服务器错误");
-
-    public final static int _C_ALREADY_EXISTS = 700;
-    public final static APICode ALREADY_EXISTS = new APICode(_C_ALREADY_EXISTS, "数据已存在");
-
-    public final static int _C_NOT_EXISTS = 800;
-    public final static APICode NOT_EXISTS = new APICode(_C_NOT_EXISTS, "数据不存在 ");
-
-    public final static int _C_OPERATE_ERROR = 1001;
-    public final static APICode OPERATE_ERROR = new APICode(_C_OPERATE_ERROR, "操作失败");
-
-    public final static int _C_CAN_NOT_DEL = 1002;
-    public final static APICode CAN_NOT_DEL = new APICode(_C_CAN_NOT_DEL, "无法删除");
-
-    public static APICode ok(String message) {
-        return new APICode(_C_OK, message);
-    }
-
-    public static APICode error(String message) {
-        return new APICode(_C_PARAMETER_ERROR, message);
-    }
-
-}

+ 11 - 11
rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/APIResult.java

@@ -17,10 +17,10 @@ public class APIResult<T> implements Serializable {
     public APIResult() {
     }
 
-    public APIResult(APICode apiCode) {
-        this.message = apiCode.getMessage();
+    public APIResult(BaseCode baseCode) {
+        this.message = baseCode.getMessage();
 
-        int code = apiCode.getCode();
+        int code = baseCode.getCode();
         this.code = code;
 
         if (code == 200) {
@@ -28,29 +28,29 @@ public class APIResult<T> implements Serializable {
         }
     }
 
-    private APIResult(APICode apiCode, T data) {
-        this(apiCode);
+    private APIResult(BaseCode baseCode, T data) {
+        this(baseCode);
         this.data = data;
     }
 
     public static APIResult ok() {
-        return new APIResult(APICodeManager.OK);
+        return new APIResult(APICode.OK);
     }
 
     public static APIResult ok(Object value) {
-        return new APIResult(APICodeManager.OK, value);
+        return new APIResult(APICode.OK, value);
     }
 
     public static APIResult ok(String name, Object value) {
-        return new APIResult(APICodeManager.OK, toMap(name, value));
+        return new APIResult(APICode.OK, toMap(name, value));
     }
 
     public static APIResult ok(Map<String, Object> data) {
-        return new APIResult(APICodeManager.OK, data);
+        return new APIResult(APICode.OK, data);
     }
 
-    public static APIResult error(APICode apiCode) {
-        return new APIResult(apiCode);
+    public static APIResult error(BaseCode baseCode) {
+        return new APIResult(baseCode);
     }
 
     public boolean getSuccess() {

+ 35 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/api/model/BaseCode.java

@@ -0,0 +1,35 @@
+package cn.rankin.common.utils.api.model;
+
+import com.alibaba.fastjson.JSON;
+
+public class BaseCode {
+
+    protected int code;
+
+    protected String message;
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public BaseCode() {}
+
+    public BaseCode(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static void main(String[] args) {
+        BaseCode example = new BaseCode(200, "success");
+        System.out.print(JSON.toJSONString(example));
+    }
+
+}

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

@@ -0,0 +1,9 @@
+package cn.rankin.common.utils.constant;
+
+public final class Domain {
+
+    public static final int CP = 1010;
+    public static final int PLATFORM = 2010;
+    public static final int MERCHANT = 3010;
+
+}

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

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

+ 49 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CmsUserDTO.java

@@ -0,0 +1,49 @@
+package cn.rankin.common.utils.dto.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.GenderEnum;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class CmsUserDTO implements Serializable {
+
+    private String id;
+
+    private String name;
+
+    private String nickName;
+
+    private String password;
+
+    private GenderEnum gender;
+
+    private String avatar;
+
+    private Date birthday;
+
+    private String mobile;
+
+    private String mail;
+
+    private String weChat;
+
+    private String qq;
+
+    private String merchantId;
+
+    private String merchantName;
+
+    private Integer domain;
+
+    private Boolean isAdmin;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+}

+ 29 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/CmsUserSearchDTO.java

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

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

@@ -0,0 +1,38 @@
+package cn.rankin.common.utils.dto.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.ReceiptTypeEnum;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class MerchantDTO implements Serializable{
+
+    private String id;
+
+    @NotNull
+    private Integer domain;
+
+    @NotNull
+    private String code;
+
+    private String name;
+
+    private String licenseId;
+
+    private String taxNumber;
+
+    @NotNull
+    private String bankAccount;
+
+    @NotNull
+    private String depositBank;
+
+    @NotNull
+    private ReceiptTypeEnum receiptType;
+
+    @NotNull
+    private BaseStatusEnum status;
+}

+ 28 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/user/MerchantSearchDTO.java

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

+ 1 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/BaseStatusEnum.java

@@ -5,7 +5,7 @@ import java.util.Set;
 
 public enum BaseStatusEnum {
 
-    NORMAL("正常"),DEL("已删除");
+    NORMAL("正常"),DEL("已删除"),DISABLE("禁用");
 
     public static Set<BaseStatusEnum>  show = new HashSet<>();
 

+ 10 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/GenderEnum.java

@@ -0,0 +1,10 @@
+package cn.rankin.common.utils.enums;
+
+public enum GenderEnum {
+    MALE, FEMALE;
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+}

+ 20 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/ReceiptTypeEnum.java

@@ -0,0 +1,20 @@
+package cn.rankin.common.utils.enums;
+
+public enum ReceiptTypeEnum {
+    COMMON("普通"), SPECIAL("专用");
+
+    String name;
+
+    ReceiptTypeEnum(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}

+ 1 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/util/BeanUtil.java

@@ -12,7 +12,7 @@ public class BeanUtil {
 
     private BeanUtil(){}
 
-    public static Map<String, Object> objectToMap(Object obj) {
+    public static Map<String, Object> convertToMap(Object obj) {
         if(obj == null){
             return null;
         }

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

@@ -0,0 +1,89 @@
+package cn.rankin.common.utils.util;
+
+import cn.rankin.common.utils.api.model.BaseCode;
+import cn.rankin.common.utils.api.model.APICode;
+import cn.rankin.common.utils.api.model.APIResult;
+import com.alibaba.fastjson.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by tomas on 2017/6/4.
+ */
+
+public class HttpUtil {
+
+    public  static List<RequestMatcher> ignoreRequest = new ArrayList<>();
+
+    private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
+
+    public static void ok(HttpServletRequest request, HttpServletResponse response) {
+        responseOutWithJson(request, response, APIResult.ok());
+    }
+    public static void error(HttpServletRequest request, HttpServletResponse response, BaseCode code) {
+        if(code.getCode() == APICode._C_OK){
+            responseOutWithJson(request,response, APIResult.ok());
+        }else {
+            responseOutWithJson(request,response, APIResult.error(code));
+        }
+    }
+    public static void responseOutWithJson(HttpServletRequest request, HttpServletResponse response, Object data) {
+        //将实体对象转换为JSON Object转换
+        PrintWriter out = null;
+        try {
+            out = response.getWriter();
+            out.append(JSON.toJSONString(data));
+            logger.info("url= {} 返回JSON ={} ",request.getRequestURI(), JSON.toJSONString(data));
+        } catch (IOException e) {
+            logger.error("request ={} 返回 失败 e={}" ,request.getRequestURI(),e);
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+    public static void delCookies(HttpServletRequest request, HttpServletResponse response, String...  cookies) {
+        for (String cookieName : cookies) {
+            Cookie cookie = new Cookie(cookieName, null);
+            String cookiePath = request.getContextPath();
+            if (!StringUtils.hasLength(cookiePath)) {
+                cookiePath = "/";
+            }
+            cookie.setPath(cookiePath);
+            cookie.setMaxAge(0);
+            response.addCookie(cookie);
+        }
+    }
+
+    public static void antMatchers(HttpMethod httpMethod, String... antPatterns) {
+        String method = httpMethod == null?null:httpMethod.toString();
+        List<RequestMatcher> matchers = new ArrayList();
+        String[] patterns = antPatterns;
+        int length = antPatterns.length;
+
+        for(int i = 0; i < length; ++i) {
+            String pattern = patterns[i];
+            matchers.add(new AntPathRequestMatcher(pattern, method));
+        }
+        ignoreRequest.addAll(matchers);
+    }
+    public static RequestMatcher[] getMatchersArray() {
+       return ignoreRequest.toArray(new RequestMatcher[ignoreRequest.size()]);
+    }
+
+
+
+}

+ 158 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/util/ProvinceUtil.java

@@ -0,0 +1,158 @@
+package cn.rankin.common.utils.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ProvinceUtil {
+
+    public static final String BJ = "11";   // 北京
+
+    public static final String TJ = "12";   // 天津
+
+    public static final String HE = "13";   // 河北
+
+    public static final String SX = "14";   // 山西
+
+    public static final String NM = "15";   // 内蒙古
+
+    public static final String LN = "21";   // 辽宁
+
+    public static final String JL = "22";   // 吉林
+
+    public static final String HL = "23";   // 黑龙江
+
+    public static final String SH = "31";   // 上海
+
+    public static final String JS = "32";   // 江苏
+
+    public static final String ZJ = "33";   // 浙江
+
+    public static final String AH = "34";   // 安徽
+
+    public static final String FJ = "35";   // 福建
+
+    public static final String JX = "36";   // 江西
+
+    public static final String SD = "37";   // 山东
+
+    public static final String HA = "41";   // 河南
+
+    public static final String HB = "42";   // 湖北
+
+    public static final String HN = "43";   // 湖南
+
+    public static final String GD = "44";   // 广东
+
+    public static final String GX = "45";   // 广西
+
+    public static final String HI = "46";   // 海南
+
+    public static final String CQ = "50";   // 重庆
+
+    public static final String SC = "51";   // 四川
+
+    public static final String GZ = "52";   // 贵州
+
+    public static final String YN = "53";   // 云南
+
+    public static final String XZ = "54";   // 西藏
+
+    public static final String SN = "61";   // 陕西
+
+    public static final String GS = "62";   // 甘肃
+
+    public static final String QH = "63";   // 青海
+
+    public static final String NX = "64";   // 宁夏
+
+    public static final String XJ = "65";   // 新疆
+
+    public static final String TW = "71";   // 台湾
+
+    public static final String HK = "81";   // 香港
+
+    public static final String MO = "82";   // 澳门
+
+    public static final Map<String, String> map = new HashMap<String, String>() {
+        {
+            put(BJ, "北京");
+            put(TJ, "天津");
+            put(HE, "河北");
+            put(SX, "山西");
+            put(NM, "内蒙");
+            put(LN, "辽宁");
+            put(JL, "吉林");
+            put(HL, "黑龙");
+            put(SH, "上海");
+            put(JS, "江苏");
+            put(ZJ, "浙江");
+            put(AH, "安徽");
+            put(FJ, "福建");
+            put(JX, "江西");
+            put(SD, "山东");
+            put(HA, "河南");
+            put(HB, "湖北");
+            put(HN, "湖南");
+            put(GD, "广东");
+            put(GX, "广西");
+            put(HI, "海南");
+            put(CQ, "重庆");
+            put(SC, "四川");
+            put(GZ, "贵州");
+            put(YN, "云南");
+            put(XZ, "西藏");
+            put(SN, "陕西");
+            put(GS, "甘肃");
+            put(QH, "青海");
+            put(NX, "宁夏");
+            put(XJ, "新疆");
+            put(TW, "台湾");
+            put(HK, "香港");
+            put(MO, "澳门");
+
+            put("北京", BJ);
+            put("天津", TJ);
+            put("河北", HE);
+            put("山西", SX);
+            put("内蒙", NM);
+            put("辽宁", LN);
+            put("吉林", JL);
+            put("黑龙", HL);
+            put("上海", SH);
+            put("江苏", JS);
+            put("浙江", ZJ);
+            put("安徽", AH);
+            put("福建", FJ);
+            put("江西", JX);
+            put("山东", SD);
+            put("河南", HA);
+            put("湖北", HB);
+            put("湖南", HN);
+            put("广东", GD);
+            put("广西", GX);
+            put("海南", HI);
+            put("重庆", CQ);
+            put("四川", SC);
+            put("贵州", GZ);
+            put("云南", YN);
+            put("西藏", XZ);
+            put("陕西", SN);
+            put("甘肃", GS);
+            put("青海", QH);
+            put("宁夏", NX);
+            put("新疆", XJ);
+            put("台湾", TW);
+            put("香港", HK);
+            put("澳门", MO);
+        }
+    };
+
+    public static String get(String str) {
+        return map.get(str);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(get("河北"));
+        System.out.println(get("13"));
+    }
+}

+ 30 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/GroupVo.java

@@ -0,0 +1,30 @@
+package cn.rankin.common.utils.vo.product;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+public class GroupVo {
+    private String id;
+
+    private String code;
+
+    private String name;
+
+    private String merchantId;
+
+    private Integer sort;
+
+    private BaseStatusEnum status;
+
+    private List<TagVo> tagList;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+}

+ 13 - 4
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/product/ItemVo.java

@@ -1,19 +1,22 @@
 package cn.rankin.common.utils.vo.product;
 
+import cn.rankin.common.utils.dto.product.ItemPriceDTO;
+import cn.rankin.common.utils.dto.product.TagDTO;
 import cn.rankin.common.utils.enums.ItemStatusEnum;
 import cn.rankin.common.utils.enums.ItemTypeEnum;
 import lombok.Data;
 
+import javax.persistence.*;
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
-import java.util.Set;
 
 @Data
 public class ItemVo implements Serializable {
 
     private String id;
 
-    private String courseId;
+    private String subId;
 
     private String code;
 
@@ -27,7 +30,13 @@ public class ItemVo implements Serializable {
 
     private ItemStatusEnum status;
 
-    private List<ItemPriceVo> priceList;
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+
+    private List<ItemPriceDTO> priceList;
+
+    private List<TagDTO> tagList;
 
-    private Set<TagVo> tagList;
 }

+ 54 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/CmsUserVo.java

@@ -0,0 +1,54 @@
+package cn.rankin.common.utils.vo.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.GenderEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+
+@Data
+@ToString
+public class CmsUserVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    private String name;
+
+    private String nickName;
+
+    private String password;
+
+    private GenderEnum gender;
+
+    private String avatar;
+
+    private Date birthday;
+
+    private String mobile;
+
+    private String mail;
+
+    private String weChat;
+
+    private String qq;
+
+    private String merchantId;
+
+    private String merchantName;
+
+    private Integer domain;
+
+    private Boolean isAdmin;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private HashSet<String> resources; //抽出来资源code 集合 contains 判断权限
+}

+ 45 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/vo/user/MerchantVo.java

@@ -0,0 +1,45 @@
+package cn.rankin.common.utils.vo.user;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.ReceiptTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+public class MerchantVo implements Serializable {
+
+    private String id;
+
+    private Integer domain;
+
+    private String code;
+
+    private String name;
+
+    private String licenseId;
+
+    private String taxNumber;
+
+    private String bankAccount;
+
+    // 开户行
+    private String depositBank;
+
+    private ReceiptTypeEnum receiptType;
+
+    private BigDecimal balance = BigDecimal.ZERO;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private List<CmsUserVo> adminList;
+}

+ 53 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/web/intercepter/HeaderProcessIntercepter.java

@@ -0,0 +1,53 @@
+package cn.rankin.common.utils.web.intercepter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by libin on 2015/5/13.
+ */
+@Component
+public class  HeaderProcessIntercepter implements HandlerInterceptor {
+    private static final Logger logger = LoggerFactory.getLogger(HeaderProcessIntercepter.class);
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        logger.debug("enter HeaderProcessIntercepter");
+        String origin = request.getHeader("Origin");
+        String headers = request.getHeader("Access-Control-Request-Headers");
+        if (!StringUtils.isEmpty(headers)) {
+            headers = ", " + headers;
+        } else {
+            headers = "";
+        }
+
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        response.setHeader("Content-Type", "application/json;charset=UTF-8");
+
+        if (!StringUtils.isEmpty(origin)) {
+            response.setHeader("Access-Control-Allow-Origin", origin);
+            response.setHeader("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH");
+            response.setHeader("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);
+            response.setHeader("Access-Control-Allow-Credentials", "true");
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+
+}

+ 51 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/web/intercepter/IgnoreOptionsInterceptor.java

@@ -0,0 +1,51 @@
+package cn.rankin.common.utils.web.intercepter;
+
+import cn.rankin.common.utils.util.HttpUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.NamedThreadLocal;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by libin on 2015/5/13.
+ */
+@Component
+public class IgnoreOptionsInterceptor implements HandlerInterceptor {
+
+    private static final Logger logger = LoggerFactory.getLogger(IgnoreOptionsInterceptor.class);
+
+    private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime");
+
+    // 忽略options请求,默认为true
+    private boolean ignoreOptions = true;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        startTimeThreadLocal.set(System.currentTimeMillis());//线程绑定变量(该数据只有当前请求的线程可见)
+        if (ignoreOptions && HttpMethod.OPTIONS.matches(request.getMethod())) {
+            logger.info("OPTIONS Ignored, return 200");
+            response.setStatus(HttpStatus.OK.value());
+            HttpUtil.ok(request, response);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+    }
+
+
+   }

+ 3 - 3
rankin-product-service/src/main/java/cn/rankin/productservice/configuration/GlobalExceptionHandler.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.configuration;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -14,11 +14,11 @@ public class GlobalExceptionHandler {
 
     @ExceptionHandler(value = MethodArgumentNotValidException.class)
     public APIResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
-        return APIResult.error(APICodeManager.PARAMETER_ERROR);
+        return APIResult.error(APICode.PARAMETER_ERROR);
     }
 
     @ExceptionHandler(NoHandlerFoundException.class)
     public APIResult handleNoHandlerFoundException(NoHandlerFoundException e) {
-        return APIResult.error(APICodeManager.NOT_FOUND);
+        return APIResult.error(APICode.NOT_FOUND);
     }
 }

+ 14 - 27
rankin-product-service/src/main/java/cn/rankin/productservice/controller/CourseController.java

@@ -1,14 +1,13 @@
 package cn.rankin.productservice.controller;
 
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APICode;
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.product.CourseDTO;
 import cn.rankin.common.utils.dto.product.CourseSubRelationDTO;
 import cn.rankin.common.utils.dto.search.SearchDTO;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.enums.BaseOrderEnum;
-import cn.rankin.common.utils.enums.CourseSubTypeEnum;
 import cn.rankin.productservice.entity.*;
 import cn.rankin.productservice.proxy.CourseServiceProxy;
 import cn.rankin.productservice.service.*;
@@ -39,7 +38,7 @@ public class CourseController {
     private ItemService itemService;
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
-    public APIResult<Page<Course>> getWareList(SearchDTO searchDTO) {
+    public APIResult<Page<Course>> search(SearchDTO searchDTO) {
         Course course = new Course();
 
         String code = searchDTO.getCode();
@@ -66,11 +65,11 @@ public class CourseController {
     public APIResult<Course> create(@RequestBody CourseDTO courseDTO) {
         String code = courseDTO.getCode();
         if (StringUtils.isEmpty(code)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         if (courseService.exists(code)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         APIResult<Course> result = courseService.create(courseDTO);
@@ -88,7 +87,7 @@ public class CourseController {
             if (!subResult.getSuccess()) {
                 // 显示回滚
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(subResult.getCode(), subResult.getMessage()));
+                return APIResult.error(new BaseCode(subResult.getCode(), subResult.getMessage()));
             }
             course.setSubItemList(subResult.getData());
         }
@@ -99,7 +98,7 @@ public class CourseController {
             APIResult<List<Support>> supportResult = courseServiceProxy.updateSupportRelation(courseId, supportIdList);
             if (!supportResult.getSuccess()) {
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(supportResult.getCode(), supportResult.getMessage()));
+                return APIResult.error(new BaseCode(supportResult.getCode(), supportResult.getMessage()));
             }
             course.setSupportList(supportResult.getData());
         }
@@ -112,7 +111,7 @@ public class CourseController {
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Course> update(@RequestBody CourseDTO courseDTO) {
         if (courseDTO.getId() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Course> result = courseService.update(courseDTO);
@@ -131,7 +130,7 @@ public class CourseController {
             if (!subResult.getSuccess()) {
                 // 显示回滚
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(subResult.getCode(), subResult.getMessage()));
+                return APIResult.error(new BaseCode(subResult.getCode(), subResult.getMessage()));
             }
             course.setSubItemList(subResult.getData());
         }
@@ -142,7 +141,7 @@ public class CourseController {
             APIResult<List<Support>> supportResult = courseServiceProxy.updateSupportRelation(courseId, supportIdList);
             if (!supportResult.getSuccess()) {
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(supportResult.getCode(), supportResult.getMessage()));
+                return APIResult.error(new BaseCode(supportResult.getCode(), supportResult.getMessage()));
             }
             course.setSupportList(supportResult.getData());
         }
@@ -154,7 +153,7 @@ public class CourseController {
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public APIResult delete(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<List<Item>> itemResult = itemService.findAllBySubId(id);
@@ -162,7 +161,7 @@ public class CourseController {
             return courseService.delete(id);
         }
 
-        APIResult<List<Item>> result = APIResult.error(APICodeManager.CAN_NOT_DEL);
+        APIResult<List<Item>> result = APIResult.error(APICode.CAN_NOT_DEL);
         result.setData(itemResult.getData());
 
         return result;
@@ -172,23 +171,11 @@ public class CourseController {
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public APIResult<Course> getCourse(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
-        APIResult<Course> result = courseService.findById(id);
-        Course course = result.getData();
-        if (!result.getSuccess() || course == null) {
-            return result;
-        }
+        Course result = courseServiceProxy.getCourse(id);
 
-        // subItem set
-        List<CourseSubItemVo> subItemVoList = courseServiceProxy.findSubItemVo(id);
-        course.setSubItemList(subItemVoList);
-
-        // support set
-        List<Support> supportList = courseServiceProxy.findSupportList(id);
-        course.setSupportList(supportList);
-
-        return result;
+        return APIResult.ok(result);
     }
 }

+ 5 - 5
rankin-product-service/src/main/java/cn/rankin/productservice/controller/GroupController.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.controller;
 
-import cn.rankin.common.utils.api.model.APICode;
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.dto.product.GroupDTO;
@@ -90,7 +90,7 @@ public class GroupController {
         if (tagDTOList != null) {
             APIResult<List<Tag>> tagResult = tagService.updateGroupRelation(group.getId(), tagDTOList);
             if (!tagResult.getSuccess()) {
-                return APIResult.error(new APICode(tagResult.getCode(), tagResult.getMessage()));
+                return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
             }
             group.setTagList(tagResult.getData());
         }
@@ -99,7 +99,7 @@ public class GroupController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-    public APIResult<Boolean> delete(@PathVariable String id) {
+    public APIResult<Boolean> delete(@PathVariable("id") String id) {
         APIResult<Boolean> groupResult = groupService.delete(id);
         if (!groupResult.getSuccess()) {
             return groupResult;
@@ -110,7 +110,7 @@ public class GroupController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Group> getGroup(@PathVariable String id) {
+    public APIResult<Group> getGroup(@PathVariable("id") String id) {
         APIResult<Group> result = groupService.findNormalById(id);
         Group group = result.getData();
         if (!result.getSuccess() || group == null) {
@@ -119,7 +119,7 @@ public class GroupController {
 
         APIResult<List<Tag>> tagResult = tagService.findNormalByGroupId(id);
         if (!tagResult.getSuccess()) {
-            return APIResult.error(new APICode(tagResult.getCode(), tagResult.getMessage()));
+            return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
         }
 
         group.setTagList(tagResult.getData());

+ 8 - 7
rankin-product-service/src/main/java/cn/rankin/productservice/controller/ItemController.java

@@ -1,7 +1,7 @@
 package cn.rankin.productservice.controller;
 
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APICode;
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.dto.product.ItemDTO;
@@ -63,7 +63,7 @@ public class ItemController {
     public APIResult<Item> create(@RequestBody ItemDTO itemDTO) {
         String code = itemDTO.getCode();
         if (StringUtils.isEmpty(code) || itemDTO.getMerchantId() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         // 保存商品信息
@@ -82,7 +82,7 @@ public class ItemController {
             if (!tagResult.getSuccess()) {
                 // 显示回滚
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(tagResult.getCode(), tagResult.getMessage()));
+                return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
             }
             item.setTagList(tagResult.getData());
         }
@@ -101,7 +101,7 @@ public class ItemController {
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Item> update(@RequestBody ItemDTO itemDTO) {
         if (itemDTO.getId() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         // 保存商品信息
@@ -118,7 +118,7 @@ public class ItemController {
             APIResult<List<Tag>> tagResult = itemServiceProxy.updateTagRelation(itemId, tagIdList);
             if (!tagResult.getSuccess()) {
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                return APIResult.error(new APICode(tagResult.getCode(), tagResult.getMessage()));
+                return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
             }
             item.setTagList(tagResult.getData());
         }
@@ -136,7 +136,7 @@ public class ItemController {
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public APIResult<Boolean> delete(@PathVariable("id") String itemId) {
         if (itemId == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         return itemService.delete(itemId);
@@ -144,6 +144,7 @@ public class ItemController {
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public APIResult<Item> getItem(@PathVariable("id") String Id) {
-        return null;
+        Item item = itemServiceProxy.loadItem(Id);
+        return APIResult.ok(item);
     }
 }

+ 11 - 11
rankin-product-service/src/main/java/cn/rankin/productservice/controller/LessonController.java

@@ -1,7 +1,7 @@
 package cn.rankin.productservice.controller;
 
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APICode;
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.search.SearchDTO;
 import cn.rankin.common.utils.api.page.Page;
@@ -40,7 +40,7 @@ public class LessonController {
     private WareService wareService;
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
-    public APIResult<Page<Lesson>> getLessonList(SearchDTO searchDTO) {
+    public APIResult<Page<Lesson>> search(SearchDTO searchDTO) {
         Lesson lesson = new Lesson();
 
         String code = searchDTO.getCode();
@@ -64,10 +64,10 @@ public class LessonController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Lesson> getLesson(@PathVariable String id) {
+    public APIResult<Lesson> getLesson(@PathVariable("id") String id) {
 
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Lesson> result = lessonService.findById(id);
@@ -99,7 +99,7 @@ public class LessonController {
     public APIResult<Lesson> create(@Valid @RequestBody LessonDTO lessonDTO) {
         String code = lessonDTO.getCode();
         if (lessonDTO.getId() != null || StringUtils.isEmpty(code)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         // 更新课
@@ -120,7 +120,7 @@ public class LessonController {
         if (!wareResult.getSuccess()) {
             // 显示回滚
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new APICode(wareResult.getCode(), wareResult.getMessage()));
+            return APIResult.error(new BaseCode(wareResult.getCode(), wareResult.getMessage()));
         }
 
         List<Ware> wareList = wareResult.getData();
@@ -136,7 +136,7 @@ public class LessonController {
     public APIResult<Lesson> update(@Valid @RequestBody LessonDTO lessonDTO) {
         String Id = lessonDTO.getId();
         if (Id == null) {
-            return APIResult.error(APICodeManager.error("参数错误: id不能为空"));
+            return APIResult.error(APICode.error("参数错误: id不能为空"));
         }
 
         List<String> wareIdList = lessonDTO.getWareList();
@@ -144,7 +144,7 @@ public class LessonController {
         if (wareIdList != null) {
             APIResult<List<Ware>> wareResult = updateRelation(Id, wareIdList);
             if (!wareResult.getSuccess()) {
-                return APIResult.error(new APICode(wareResult.getCode(), wareResult.getMessage()));
+                return APIResult.error(new BaseCode(wareResult.getCode(), wareResult.getMessage()));
             }else {
                 wareList = wareResult.getData();
             }
@@ -161,7 +161,7 @@ public class LessonController {
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public APIResult delete(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         List<CourseSubRelation> courseSubRelationList = courseSubRelationService.findByLessonId(id);
@@ -178,7 +178,7 @@ public class LessonController {
         });
 
         APIResult<List<Course>> courseResult = courseService.findAllByIds(courseIdList);
-        APIResult<List<Course>> result = APIResult.error(APICodeManager.CAN_NOT_DEL);
+        APIResult<List<Course>> result = APIResult.error(APICode.CAN_NOT_DEL);
         result.setData(courseResult.getData());
 
         return result;
@@ -200,7 +200,7 @@ public class LessonController {
             APIResult<List<Ware>> wareResult = wareService.findByIds(wareIdList);
             wareList = wareResult.getData();
             if (wareList == null || wareList.size() != wareIdList.size()) {
-                return APIResult.error(APICodeManager.error("存在错误的课件"));
+                return APIResult.error(APICode.error("存在错误的课件"));
             }
             lessonWareRelationService.update(lessonId, wareIdList);
         }

+ 40 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/PackageController.java

@@ -0,0 +1,40 @@
+package cn.rankin.productservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.productservice.entity.Package;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "package")
+public class PackageController {
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<Package>> search() {
+        return null;
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public APIResult<Package> getPackage(@PathVariable String id) {
+        return null;
+    }
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<Package> create() {
+        return APIResult.ok();
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<Package> update() {
+        return APIResult.ok();
+    }
+
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable String id) {
+        return APIResult.ok();
+    }
+
+}

+ 8 - 8
rankin-product-service/src/main/java/cn/rankin/productservice/controller/SupportController.java

@@ -1,7 +1,7 @@
 package cn.rankin.productservice.controller;
 
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APICode;
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.dto.search.SearchDTO;
@@ -55,9 +55,9 @@ public class SupportController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Support> getSupport(@PathVariable String id) {
+    public APIResult<Support> getSupport(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Support> result = supportService.findById(id);
@@ -79,7 +79,7 @@ public class SupportController {
     public APIResult<Support> create(@RequestBody SupportDTO supportDTO) {
         String code = supportDTO.getCode();
         if (StringUtils.isEmpty(code)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Support> result = supportService.create(supportDTO);
@@ -92,7 +92,7 @@ public class SupportController {
         APIResult<List<Support>> supportResult = supportServiceProxy.updateSelfRelation(support.getId(), supportIdList);
         if (!supportResult.getSuccess()) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new APICode(supportResult.getCode(), supportResult.getMessage()));
+            return APIResult.error(new BaseCode(supportResult.getCode(), supportResult.getMessage()));
         }
         support.setSupportList(supportResult.getData());
 
@@ -103,7 +103,7 @@ public class SupportController {
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Support> update(@RequestBody SupportDTO supportDTO) {
         if (supportDTO.getId() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Support> result = supportService.update(supportDTO);
@@ -119,7 +119,7 @@ public class SupportController {
 
         APIResult<List<Support>> supportResult = supportServiceProxy.updateSelfRelation(support.getId(), supportIdList);
         if (!supportResult.getSuccess()) {
-            return APIResult.error(new APICode(supportResult.getCode(), supportResult.getMessage()));
+            return APIResult.error(new BaseCode(supportResult.getCode(), supportResult.getMessage()));
         }
         support.setSupportList(supportResult.getData());
 
@@ -129,7 +129,7 @@ public class SupportController {
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
     public APIResult<Boolean> delete(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         return supportService.delete(id);

+ 11 - 12
rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagController.java

@@ -1,7 +1,7 @@
 package cn.rankin.productservice.controller;
 
+import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.api.model.APICode;
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.dto.product.TagDTO;
@@ -22,7 +22,6 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 @Slf4j
@@ -40,7 +39,7 @@ public class TagController {
     private ItemService itemService;
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Tag> getTag(@PathVariable String id) {
+    public APIResult<Tag> getTag(@PathVariable("id") String id) {
         APIResult<Tag> result = tagService.findById(id);
         Tag tag = result.getData();
         if (tag == null) {
@@ -84,7 +83,7 @@ public class TagController {
         APIResult<List<Item>> relationResult = updateTagRelation(tag, itemIdList);
         if (!relationResult.getSuccess()) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new APICode(relationResult.getCode(), relationResult.getMessage()));
+            return APIResult.error(new BaseCode(relationResult.getCode(), relationResult.getMessage()));
         }
         tag.setItemList(relationResult.getData());
 
@@ -96,7 +95,7 @@ public class TagController {
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Tag> update(@RequestBody TagDTO tagDTO) {
         if (tagDTO.getId() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         APIResult<Tag> result = tagService.update(tagDTO);
@@ -110,17 +109,17 @@ public class TagController {
         APIResult<List<Item>> relationResult = updateTagRelation(tag, itemIdList);
         if (!relationResult.getSuccess()) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new APICode(relationResult.getCode(), relationResult.getMessage()));
+            return APIResult.error(new BaseCode(relationResult.getCode(), relationResult.getMessage()));
         }
         tag.setItemList(relationResult.getData());
 
         return tagService.update(tagDTO);
     }
 
-    @RequestMapping(value = "/id", method = RequestMethod.DELETE)
-    public APIResult delete(@PathVariable String id) {
+    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("id") String id) {
         if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         List<ItemTagRelation> relationList = tagRelationService.findAllByTagId(id);
@@ -138,7 +137,7 @@ public class TagController {
 
         List<Item> itemList = itemService.findAllByIds(itemIdList).getData();
 
-        APIResult<List<Item>> result = APIResult.error(APICodeManager.CAN_NOT_DEL);
+        APIResult<List<Item>> result = APIResult.error(APICode.CAN_NOT_DEL);
         result.setData(itemList);
 
         return result;
@@ -148,7 +147,7 @@ public class TagController {
     public APIResult<List<Item>> updateTagRelation(Tag tag, List<String> itemIdList) {
         List<Item> itemList = itemService.findAllByIds(itemIdList).getData();
         if (itemList == null || itemList.size() != itemIdList.size()) {
-            return APIResult.error(APICodeManager.error("itemId不匹配"));
+            return APIResult.error(APICode.error("itemId不匹配"));
         }
 
         TagTypeEnum tagType = tag.getType();
@@ -156,7 +155,7 @@ public class TagController {
         for (int i = 0; i < itemList.size(); i++) {
             Item item = itemList.get(i);
             if (!item.getMerchantId().equals(merchantId) || !EnumUtil.compare(item.getType(), tagType)) {
-                return APIResult.error(APICodeManager.error("类型或渠道商不匹配"));
+                return APIResult.error(APICode.error("类型或渠道商不匹配"));
             }
         }
 

+ 4 - 5
rankin-product-service/src/main/java/cn/rankin/productservice/controller/WareController.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.controller;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.search.SearchDTO;
 import cn.rankin.common.utils.api.page.Page;
@@ -9,7 +9,6 @@ import cn.rankin.common.utils.enums.BaseOrderEnum;
 import cn.rankin.productservice.entity.Lesson;
 import cn.rankin.productservice.entity.LessonWareRelation;
 import cn.rankin.productservice.entity.Ware;
-import cn.rankin.common.utils.enums.WareTypeEnum;
 import cn.rankin.productservice.service.LessonService;
 import cn.rankin.productservice.service.LessonWareRelationService;
 import cn.rankin.productservice.service.WareService;
@@ -37,7 +36,7 @@ public class WareController {
     private LessonService lessonService;
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
-    public APIResult<Page<Ware>> getWareList(SearchDTO searchDTO) {
+    public APIResult<Page<Ware>> search(SearchDTO searchDTO) {
         Ware ware = new Ware();
 
         String code = searchDTO.getCode();
@@ -70,7 +69,7 @@ public class WareController {
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Ware> update(@Valid @RequestBody WareDTO wareDTO) {
         if (wareDTO.getId() == null) {
-            return APIResult.error(APICodeManager.error("参数错误: id"));
+            return APIResult.error(APICode.error("参数错误: id"));
         }
 
         return wareService.update(wareDTO);
@@ -95,7 +94,7 @@ public class WareController {
         );
 
         List<Lesson> lessonList = lessonService.findAllByIds(lessonIds).getData();
-        APIResult<List<Lesson>> result = APIResult.error(APICodeManager.CAN_NOT_DEL);
+        APIResult<List<Lesson>> result = APIResult.error(APICode.CAN_NOT_DEL);
         result.setData(lessonList);
 
         return result;

+ 6 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Item.java

@@ -65,4 +65,10 @@ public class Item implements Serializable {
 //            inverseJoinColumns = {@JoinColumn(name = "tag_id", referencedColumnName = "id", unique = false)})
     @Transient
     private List<Tag> tagList;
+
+    @Transient
+    private Course course;
+
+    @Transient
+    private Support support;
 }

+ 4 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/entity/ItemPrice.java

@@ -32,7 +32,7 @@ public class ItemPrice implements Serializable {
 
     @Column
     @Enumerated(EnumType.ORDINAL)
-    private PriceTypeEnum type;
+    private PriceTypeEnum type = PriceTypeEnum.NORMAL;
 
     @Column
     private Integer duration;
@@ -59,4 +59,7 @@ public class ItemPrice implements Serializable {
     @Column(name = "gmt_modified")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
+
+    @Column(name = "package_id")
+    private String packageId;
 }

+ 0 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/entity/LessonWareRelation.java

@@ -5,7 +5,6 @@ import lombok.Data;
 import lombok.ToString;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 import java.io.Serializable;

+ 4 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/entity/Package.java

@@ -9,6 +9,7 @@ import org.hibernate.annotations.DynamicUpdate;
 import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 @Data
 @ToString
@@ -50,4 +51,7 @@ public class Package 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;
+
+    @Transient
+    private List<Item> itemList;
 }

+ 42 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/entity/PackageItemRelation.java

@@ -0,0 +1,42 @@
+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_package_item_relation", uniqueConstraints = {@UniqueConstraint(columnNames = {"package_id", "item_id"})})
+@DynamicInsert
+@DynamicUpdate
+public class PackageItemRelation implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "package_id")
+    private String packageId;
+
+    @Column(name = "item_id")
+    private String itemId;
+
+    private Integer sort;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_modified")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+
+    @Column(name = "gmt_created")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+}

+ 25 - 11
rankin-product-service/src/main/java/cn/rankin/productservice/proxy/CourseServiceProxy.java

@@ -1,17 +1,11 @@
 package cn.rankin.productservice.proxy;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.product.CourseSubRelationDTO;
 import cn.rankin.common.utils.enums.CourseSubTypeEnum;
-import cn.rankin.productservice.entity.CourseSubRelation;
-import cn.rankin.productservice.entity.CourseSupportRelation;
-import cn.rankin.productservice.entity.Lesson;
-import cn.rankin.productservice.entity.Support;
-import cn.rankin.productservice.service.CourseSubRelationService;
-import cn.rankin.productservice.service.CourseSupportRelationService;
-import cn.rankin.productservice.service.LessonService;
-import cn.rankin.productservice.service.SupportService;
+import cn.rankin.productservice.entity.*;
+import cn.rankin.productservice.service.*;
 import cn.rankin.productservice.vo.CourseSubItemVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -26,6 +20,9 @@ import static cn.rankin.productservice.utils.DTOConverter.convert;
 public class CourseServiceProxy {
 
     @Autowired
+    private CourseService courseService;
+
+    @Autowired
     private CourseSubRelationService courseSubRelationService;
 
     @Autowired
@@ -37,6 +34,23 @@ public class CourseServiceProxy {
     @Autowired
     private SupportService supportService;
 
+    public Course getCourse(String id) {
+        APIResult<Course> result = courseService.findById(id);
+        Course course = result.getData();
+        if (!result.getSuccess() || course == null) {
+            return course;
+        }
+
+        // subItem set
+        List<CourseSubItemVo> subItemVoList = findSubItemVo(id);
+        course.setSubItemList(subItemVoList);
+
+        // support set
+        List<Support> supportList = findSupportList(id);
+        course.setSupportList(supportList);
+        return course;
+    }
+
     // find sub item by courseId
     public List<CourseSubItemVo> findSubItemVo(String courseId) {
         List<CourseSubItemVo> subItemVoList = new ArrayList<>();
@@ -99,7 +113,7 @@ public class CourseServiceProxy {
         APIResult<List<Lesson>> lessonResult = lessonService.findByIds(lessonIdList);
         List<Lesson> lessonList = lessonResult.getData();
         if (lessonList == null || lessonList.size() != lessonIdList.size()) {
-            return APIResult.error(APICodeManager.error("存在错误的课"));
+            return APIResult.error(APICode.error("存在错误的课"));
         }
 
         courseSubRelationService.update(courseId, subRelationDTOList);
@@ -126,7 +140,7 @@ public class CourseServiceProxy {
             APIResult<List<Support>> supportResult = supportService.findByIds(supportIdList);
             supportList = supportResult.getData();
             if (supportList == null || supportList.size() != supportIdList.size()) {
-                return APIResult.error(APICodeManager.error("存在错误的周边"));
+                return APIResult.error(APICode.error("存在错误的周边"));
             }
             courseSupportRelationService.update(courseId, supportIdList);
         }

+ 51 - 18
rankin-product-service/src/main/java/cn/rankin/productservice/proxy/ItemServiceProxy.java

@@ -1,21 +1,16 @@
 package cn.rankin.productservice.proxy;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.product.ItemPriceDTO;
 import cn.rankin.common.utils.enums.EnumUtil;
 import cn.rankin.common.utils.enums.ItemTypeEnum;
-import cn.rankin.productservice.entity.Item;
-import cn.rankin.productservice.entity.ItemPrice;
-import cn.rankin.productservice.entity.Support;
-import cn.rankin.productservice.entity.Tag;
-import cn.rankin.productservice.service.ItemPriceService;
-import cn.rankin.productservice.service.ItemService;
-import cn.rankin.productservice.service.ItemTagRelationService;
-import cn.rankin.productservice.service.TagService;
+import cn.rankin.productservice.entity.*;
+import cn.rankin.productservice.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,26 +30,64 @@ public class ItemServiceProxy {
     @Autowired
     private TagService tagService;
 
+    @Autowired
+    private CourseServiceProxy courseServiceProxy;
+
+    @Autowired
+    private SupportServiceProxy supportServiceProxy;
+
     public Item loadItem(String itemId) {
+        Item item = load(itemId);
+        if (item != null) {
+            List<ItemPrice> priceList = itemPriceService.getItemPrice(itemId);
+            item.setPriceList(priceList);
+        }
+        return item;
+    }
+
+    public Item load(String itemId) {
         Item item = itemService.findOne(itemId);
         if (item == null) {
             return null;
         }
 
+        String subId = item.getSubId();
         ItemTypeEnum itemType = item.getType();
-        if (itemType == ItemTypeEnum.COURSE) {
 
+        if (ItemTypeEnum.COURSE.equals(itemType)) {
+            Course course = courseServiceProxy.getCourse(subId);
+            item.setCourse(course);
+        }else if (ItemTypeEnum.SUPPORT.equals(itemType)) {
+            Support support = supportServiceProxy.getSupport(subId);
+            item.setSupport(support);
         }
 
-        return null;
+        List<Tag> tagList = getTagList(itemId);
+        item.setTagList(tagList);
+
+        return item;
     }
 
-    public List<Support> getSupport(Item item) {
-        return null;
+    public Item loadItem(String itemId, String packageId) {
+        Item item = load(itemId);
+        if (item != null) {
+            List<ItemPrice> priceList = itemPriceService.getItemPrice(itemId, packageId);
+            item.setPriceList(priceList);
+        }
+        return item;
     }
 
-    public List<Tag> getTagList(Item item) {
-        return null;
+    public List<Tag> getTagList(String itemId) {
+        List<ItemTagRelation> itemTagRelationList = tagRelationService.findAllByItemId(itemId);
+        if (CollectionUtils.isEmpty(itemTagRelationList)) {
+            return new ArrayList<>();
+        }
+
+        List<String> tagIdList = new ArrayList<>();
+        itemTagRelationList.forEach( t -> tagIdList.add(t.getTagId()));
+
+        APIResult<List<Tag>> tagResult = tagService.findByIds(tagIdList);
+        return tagResult.getData();
     }
 
     @Transactional
@@ -86,12 +119,12 @@ public class ItemServiceProxy {
             APIResult<List<Tag>> tagResult = tagService.findByIds(tagIdList);
             tagList = tagResult.getData();
             if (tagList == null || tagList.size() != tagIdList.size()) {
-                return APIResult.error(APICodeManager.error("包含错误的标签"));
+                return APIResult.error(APICode.error("包含错误的标签"));
             }
 
             Item item = itemService.findById(itemId).getData();
             if (item == null) {
-                return APIResult.error(APICodeManager.error("商品不存在"));
+                return APIResult.error(APICode.error("商品不存在"));
             }
 
             String merchantId = item.getMerchantId();
@@ -99,7 +132,7 @@ public class ItemServiceProxy {
             for (int i = 0; i < tagList.size(); i++) {
                 Tag tag = tagList.get(i);
                 if (!tag.getMerchantId().equals(merchantId) || !EnumUtil.compare(itemType, tag.getType())) {
-                    return APIResult.error(APICodeManager.error("包含错误的标签"));
+                    return APIResult.error(APICode.error("包含错误的标签"));
                 }
             }
 

+ 15 - 2
rankin-product-service/src/main/java/cn/rankin/productservice/proxy/SupportServiceProxy.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.proxy;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.productservice.entity.Support;
 import cn.rankin.productservice.entity.SupportSelfRelation;
@@ -22,6 +22,19 @@ public class SupportServiceProxy {
     @Autowired
     private SupportSelfRelationService selfRelationService;
 
+    public Support getSupport(String id) {
+        APIResult<Support> result = supportService.findById(id);
+        Support support = result.getData();
+        if (!result.getSuccess() || support == null) {
+            return support;
+        }
+
+        APIResult<List<Support>> supportResult = getRelationSupport(support.getId());
+        support.setSupportList(supportResult.getData());
+
+        return support;
+    }
+
     @Transactional
     public APIResult<List<Support>> updateSelfRelation(String fid, List<String> tids) {
         if (tids == null) {
@@ -33,7 +46,7 @@ public class SupportServiceProxy {
         APIResult<List<Support>> supportResult = supportService.findByIds(tids);
         List<Support> supportList = supportResult.getData();
         if (supportList == null || supportList.size() != tids.size()) {
-            return APIResult.error(APICodeManager.error("存在错误的周边id"));
+            return APIResult.error(APICode.error("存在错误的周边id"));
         }
 
         selfRelationService.update(fid, tids);

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

@@ -1,6 +1,7 @@
 package cn.rankin.productservice.repository;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.PriceTypeEnum;
 import cn.rankin.common.utils.jpa.BasicJpaRepository;
 import cn.rankin.productservice.entity.ItemPrice;
 import org.springframework.data.jpa.repository.Modifying;
@@ -14,6 +15,12 @@ public interface ItemPriceRepository extends BasicJpaRepository<ItemPrice, Strin
 
     List<ItemPrice> findByItemId(String itemId);
 
+    @Query(value = "select p from ItemPrice p where p.itemId = :itemId and p.type = :type and p.status = :status")
+    List<ItemPrice> findByItemIdAndType(@Param("itemId") String itemId, @Param("type") PriceTypeEnum type, @Param("status") BaseStatusEnum status);
+
+    @Query(value = "select p from ItemPrice p where p.itemId = :itemId and p.type = :type and p.status = :status and p.packageId = :packageId")
+    List<ItemPrice> findByTypeAndPackageId(@Param("itemId") String itemId, @Param("type") PriceTypeEnum type, @Param("packageId") String packageId, @Param("status") BaseStatusEnum status);
+
     @Transactional
     @Modifying(clearAutomatically = true)
     @Query(value = "update ItemPrice p set p.status = :status where p.itemId = :itemId")

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

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

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

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

+ 1 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepositoryImpl.java

@@ -20,7 +20,7 @@ public class TagRepositoryImpl {
 
         String name = tag.getName();
         if (name != null) {
-            builder.append(String.format(" and t.name like %s", name));
+            builder.append(String.format(" and t.name like '%s'", name));
         }
 
         String merchantId = tag.getMerchantId();

+ 4 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/service/CourseService.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.CourseDTO;
@@ -48,7 +48,7 @@ public class CourseService {
     public APIResult<Course> create(CourseDTO courseDTO) {
         String code = courseDTO.getCode();
         if (exists(code)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         Course course = DTOConverter.convert(courseDTO);
@@ -72,13 +72,13 @@ public class CourseService {
         if (count > 0) {
             return APIResult.ok(true);
         }
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     public APIResult<Course> findById(String id) {
         Course course = courseRepository.findById(id);
         if (course == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
 
         return APIResult.ok(course);

+ 4 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/service/GroupService.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.GroupDTO;
@@ -27,7 +27,7 @@ public class GroupService {
     public APIResult<Group> findById(String id) {
         Group group = groupRepository.find(id);
         if (group == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
         return APIResult.ok(group);
     }
@@ -35,7 +35,7 @@ public class GroupService {
     public APIResult<Group> findNormalById(String id) {
         Group group = groupRepository.findNormalById(id, BaseStatusEnum.NORMAL);
         if (group == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
         return APIResult.ok(group);
     }
@@ -63,7 +63,7 @@ public class GroupService {
     public APIResult<Group> create(GroupDTO groupDTO) {
         String code = groupDTO.getCode();
         if (exists(code)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         Group group = convert(groupDTO);

+ 15 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemPriceService.java

@@ -1,15 +1,12 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.dto.product.ItemPriceDTO;
 import cn.rankin.common.utils.enums.BaseStatusEnum;
-import cn.rankin.common.utils.util.ListUtil;
-import cn.rankin.productservice.entity.CourseSubRelation;
+import cn.rankin.common.utils.enums.PriceTypeEnum;
 import cn.rankin.productservice.entity.ItemPrice;
 import cn.rankin.productservice.repository.ItemPriceRepository;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -47,6 +44,7 @@ public class ItemPriceService {
             }
             ItemPrice itemPrice = convert(dto);
             itemPrice.setStatus(BaseStatusEnum.NORMAL);
+            itemPrice.setItemId(itemId);
             itemPrice.setSort(i);
             priceList.add(itemPrice);
         }
@@ -64,4 +62,17 @@ public class ItemPriceService {
     public Integer deleteByItemId(String itemId) {
         return priceRepository.deleteByItemId(itemId, BaseStatusEnum.DEL);
     }
+
+    public List<ItemPrice> getItemPrice(String itemId) {
+        return priceRepository.findByItemId(itemId);
+    }
+
+    public List<ItemPrice> getItemPrice(String itemId, PriceTypeEnum type) {
+        return priceRepository.findByItemIdAndType(itemId, type, BaseStatusEnum.NORMAL);
+
+    }
+
+    public List<ItemPrice> getItemPrice(String itemId, String packageId) {
+        return priceRepository.findByTypeAndPackageId(itemId, PriceTypeEnum.PACKAGE, packageId, BaseStatusEnum.NORMAL);
+    }
 }

+ 5 - 8
rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemService.java

@@ -1,19 +1,16 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.ItemDTO;
 import cn.rankin.common.utils.enums.BaseOrderEnum;
-import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.ItemStatusEnum;
-import cn.rankin.common.utils.enums.ItemTypeEnum;
 import cn.rankin.common.utils.util.JpaSortUtil;
 import cn.rankin.productservice.entity.Item;
 import cn.rankin.productservice.repository.*;
 import cn.rankin.productservice.utils.DTOConverter;
 import lombok.extern.slf4j.Slf4j;
-import org.aspectj.weaver.ast.ITestVisitor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -52,7 +49,7 @@ public class ItemService {
         if (!ItemStatusEnum.DEL.equals(item.getStatus())) {
             return APIResult.ok(item);
         }
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     public Item findOne(String itemId) {
@@ -80,7 +77,7 @@ public class ItemService {
         sample.setSubId(itemDTO.getSubId());
         sample.setMerchantId(itemDTO.getMerchantId());
         if (exists(sample)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         // 保存item数据
@@ -96,7 +93,7 @@ public class ItemService {
         if (count > 0) {
             return APIResult.ok(true);
         }
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     @Transactional
@@ -106,7 +103,7 @@ public class ItemService {
         sample.setSubId(itemDTO.getSubId());
         sample.setMerchantId(itemDTO.getMerchantId());
         if (!exists(sample)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         // 保存item数据

+ 4 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemTagRelationService.java

@@ -27,6 +27,10 @@ public class ItemTagRelationService {
         return relationRepository.findByTagId(id, BaseStatusEnum.NORMAL);
     }
 
+    public List<ItemTagRelation> findAllByItemId(String itemId) {
+        return relationRepository.findAllByItemId(itemId);
+    }
+
     @Transactional
     public Integer deleteByItemId(String itemId) {
         return relationRepository.deleteByItemId(itemId, BaseStatusEnum.DEL);

+ 3 - 3
rankin-product-service/src/main/java/cn/rankin/productservice/service/LessonService.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.LessonDTO;
@@ -71,7 +71,7 @@ public class LessonService {
     public APIResult<Lesson> findById(String id) {
         Lesson lesson = lessonRepository.find(id);
         if (lesson == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
 
         return APIResult.ok(lesson);
@@ -86,7 +86,7 @@ public class LessonService {
     public APIResult<Lesson> create(LessonDTO lessonDTO) {
         String code = lessonDTO.getCode();
         if (exists(code)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         Lesson lesson = convert(lessonDTO);

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

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

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

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

+ 4 - 7
rankin-product-service/src/main/java/cn/rankin/productservice/service/SupportService.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.SupportDTO;
@@ -9,11 +9,8 @@ import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.util.JpaSortUtil;
 import cn.rankin.common.utils.util.ListUtil;
 import cn.rankin.productservice.entity.Support;
-import cn.rankin.productservice.entity.SupportSelfRelation;
 import cn.rankin.productservice.repository.SupportRepository;
-import cn.rankin.productservice.repository.SupportSelfRelationRepository;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -70,7 +67,7 @@ public class SupportService {
     public APIResult<Support> create(SupportDTO supportDTO) {
         String code = supportDTO.getCode();
         if (exists(code)) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         Support support = convert(supportDTO);
@@ -94,13 +91,13 @@ public class SupportService {
             return APIResult.ok(true);
         }
 
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     public APIResult<Support> findById(String id) {
         Support support = supportRepository.find(id);
         if (support == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
         return APIResult.ok(support);
     }

+ 2 - 5
rankin-product-service/src/main/java/cn/rankin/productservice/service/TagService.java

@@ -1,12 +1,10 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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.TagDTO;
-import cn.rankin.common.utils.enums.BaseOrderEnum;
 import cn.rankin.common.utils.enums.BaseStatusEnum;
-import cn.rankin.common.utils.util.JpaSortUtil;
 import cn.rankin.productservice.entity.Tag;
 import cn.rankin.productservice.repository.TagRepository;
 import lombok.extern.slf4j.Slf4j;
@@ -16,7 +14,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import static cn.rankin.productservice.utils.DTOConverter.convert;
@@ -77,7 +74,7 @@ public class TagService {
         if (count > 0) {
             return APIResult.ok(true);
         }
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     @Transactional

+ 4 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/service/WareService.java

@@ -1,6 +1,6 @@
 package cn.rankin.productservice.service;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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;
@@ -49,7 +49,7 @@ public class WareService {
     public APIResult<Ware> create(WareDTO wareDTO) {
         Ware ware = convert(wareDTO);
         if (exists(ware.getCode())) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
         Ware result = wareRepository.save(ware);
         return APIResult.ok(result);
@@ -69,13 +69,13 @@ public class WareService {
         if (count > 0) {
             return APIResult.ok(true);
         }
-        return APIResult.error(APICodeManager.NOT_EXISTS);
+        return APIResult.error(APICode.NOT_EXISTS);
     }
 
     public APIResult<Ware> findById(String id) {
         Ware ware = wareRepository.find(id);
         if (ware == null) {
-            return APIResult.error(APICodeManager.NOT_EXISTS);
+            return APIResult.error(APICode.NOT_EXISTS);
         }
         return APIResult.ok(ware);
     }

+ 38 - 9
rankin-product-service/src/main/java/cn/rankin/productservice/utils/TestUtil.java

@@ -1,21 +1,50 @@
 package cn.rankin.productservice.utils;
 
+import com.alibaba.fastjson.JSON;
+
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 
 public class TestUtil {
 
+    public static class Item {
+        private int parent;
+
+        private int sort;
+
+        public int getParent() {
+            return parent;
+        }
+
+        public int getSort() {
+            return parent * 10 + sort;
+        }
+
+
+        public Item(Integer h, Integer l) {
+            this.parent = h;
+            this.sort = l;
+        }
+    }
+
     public static void main(String[] args) {
-        List<String> list1 = new ArrayList<>();
-        list1.add("1");
-        list1.add("2");
+        List<Item> list1 = new ArrayList<>();
+        list1.add(new Item(3, 1));
+        list1.add(new Item(1, 2));
+        list1.add(new Item(2, 1));
+        list1.add(new Item(1, 1));
+        list1.add(new Item(2,2));
+        list1.add(new Item(3, 2));
+        list1.sort(Comparator.comparing(Item::getSort));
+
 
-        List<String> list2 = new ArrayList<>();
-        list2.add("1");
-        list2.add("2");
-        list2.add("3");
+//        List<String> list2 = new ArrayList<>();
+//        list2.add("1");
+//        list2.add("2");
+//        list2.add("3");
 
-        list1.removeAll(list2);
-        System.out.println(list1);
+//        list1.removeAll(list2);
+        System.out.println(JSON.toJSONString(list1));
     }
 }

+ 209 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/utils/TreeNode.java

@@ -0,0 +1,209 @@
+package cn.rankin.productservice.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author list 转 treeNode
+ */
+public class TreeNode {
+
+    private String name;
+    private String parentId;
+    private String title;
+    private String path;
+    @JSONField(serialize=false)
+    private String code;
+
+    private Boolean leaf;
+    private Boolean own;
+    private List<TreeNode> items;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parenrtId) {
+        this.parentId = parenrtId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Boolean getLeaf() {
+        return leaf;
+    }
+
+    public void setLeaf(Boolean leaf) {
+        this.leaf = leaf;
+    }
+
+    public List<TreeNode> getItems() {
+        return items;
+    }
+
+    public void setItems(List<TreeNode> items) {
+        this.items = items;
+    }
+    public Boolean getOwn() {
+        return own;
+    }
+
+    public void setOwn(Boolean own) {
+        this.own = own;
+    }
+
+    public TreeNode() {
+        super();
+    }
+
+    public TreeNode(Long name, Long parentId, String title, String path, String code, Integer leaf,Boolean own) {
+        this.name = String.valueOf(name);
+        this.parentId = String.valueOf(parentId);
+        this.title = title;
+        this.path = path;
+        this.code = code;
+        this.leaf = leaf==2?true:false;
+        this.own = own;
+    }
+    public TreeNode(String name, String parentId, String title, String path, String code, Boolean leaf) {
+        this.name = name;
+        this.parentId = parentId;
+        this.title = title;
+        this.path = path;
+        this.code = code;
+        this.leaf = leaf;
+    }
+
+    public TreeNode(String name, String parentId, String title, String path, String code, Boolean leaf, List<TreeNode> items) {
+        this.name = name;
+        this.parentId = parentId;
+        this.title = title;
+        this.path = path;
+        this.code = code;
+        this.leaf = leaf;
+        this.items = items;
+    }
+
+    public static <T extends TreeNode> List<TreeNode> getTree(List<T> nodeList) {
+        /**
+         * 定义“数组-链表”,该数组链表的每一项相当于一深度为2的小树
+         * Map的key相当于“数组”的某一项,Map的value相当于该key所拥有的“链表”
+         * 这里,key为父节点ID,list为具有相同父节点ID的所有同级子节点实体list(属于该父节点的所有子节点)
+         */
+        Map<String, List<TreeNode>> arrayListMap = new HashMap<String, List<TreeNode>>();
+        TreeNode node=null;
+        for (TreeNode e : nodeList) {
+            // 变量定义务必在循环内,对象是引用,不能重复使用同一个对象变量
+            node = new TreeNode();
+            node.setName(e.getName());
+            node.setTitle(e.getTitle());
+            node.setCode(e.getCode());
+            node.setLeaf(e.getLeaf());
+            node.setPath(e.getPath());
+            node.setOwn(e.getOwn());
+            node.setParentId(e.getParentId());
+            String fatherId = e.getParentId();
+            // 获取当前遍历结点的父ID,并判断该父节点的数组链表项是否存在,如果该“数组项-链表项”不存在,则新建一个,并放入“数组-链表”
+            if (arrayListMap.get(fatherId) == null) {
+                List<TreeNode> list = new ArrayList<TreeNode>();
+                list.add(node);
+                arrayListMap.put(fatherId, list);
+            } else {
+                List<TreeNode> valueList = arrayListMap.get(fatherId);
+                valueList.add(node);
+                arrayListMap.put(fatherId, valueList);
+            }
+            node=null;
+        }
+        // 以上,至此,第一遍遍历完毕,非叶子节点都拥有一个“数组-链表项”,也即“最小的树”已创建完毕
+
+        // 以下,对“数组链表”Map进行遍历,更改“最小的树”的从属关系(更改指针指向),也即把所有小树组装成大树
+        for (Map.Entry<String, List<TreeNode>> entry : arrayListMap.entrySet()) {
+            // 获取当前遍历“数组项-链表项”的链表项,并对链表项进行遍历,从“数组-链表”小树中找到它的子节点,并将该子节点加到该小树的children中
+            List<TreeNode> smallTreeList = new ArrayList<TreeNode>();
+            smallTreeList = entry.getValue();
+            int nodeListSize = smallTreeList.size();
+            for (int i = 0; i < nodeListSize; i++) {
+                String findID = smallTreeList.get(i).getName();
+                List<TreeNode> findList = arrayListMap.get(findID);
+                // 以下操作不能取出对象存放在变量中,否则将破坏树的完整性
+                smallTreeList.get(i).setItems(findList);
+            }
+        }
+        // 获取以0为父Id的链表项,该链表项是根节点实体,里面已封装好各子节点,可以由于多个根节点,即这些根结点的父Id都为0
+        return   arrayListMap.get("0");
+    }
+
+    public static void main(String[] args) {
+
+        List<TreeNode> list=new ArrayList<>();
+        TreeNode  temp =null;
+        for(int i=0; i<5;i++){
+            for (int j=0;j<3;j++){
+                for (int k=0;k<3;k++){
+                    if (i*3+j*3+k==0){
+                        continue;
+                    }
+                    temp= new TreeNode();
+                    if ((i*9+j*3+k)%3==0){
+                        if ((i*9+j*3+k)%9==0){
+                            temp.setParentId(""+i);
+                        }else {
+                            temp.setParentId(""+(i*3+j));
+                        }
+                        temp.setLeaf(false);
+                    }else {
+                        temp.setParentId(""+(i*9+j*3));
+                        temp.setLeaf(true);
+                    }
+                    temp.setName(""+(i*9+j*3+k));
+                    temp.setPath("path"+(i*9+j*3+k));
+                    temp.setTitle("title"+(i*9+j*3+k));
+                    temp.setCode("code"+(i*9+j*3+k));
+                    temp.setOwn(Boolean.TRUE);
+                    System.out.println(JSON.toJSONString(temp));
+                    list.add(temp);
+                    temp=null;
+                }
+            }
+        }
+        List<TreeNode> tree = TreeNode.getTree(list);
+        System.out.println(JSON.toJSONString(tree));
+    }
+}

+ 2 - 2
rankin-resource-service/src/main/java/cn/rankin/resourceservice/controller/AliOSSController.java

@@ -1,6 +1,6 @@
 package cn.rankin.resourceservice.controller;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.resourceservice.vo.OSSSignature;
 import com.aliyun.oss.OSSClient;
@@ -69,7 +69,7 @@ public class AliOSSController {
 
         }catch (Exception e) {
             log.error("OSS Signature error: {}", e);
-            return APIResult.error(APICodeManager.OPERATE_ERROR);
+            return APIResult.error(APICode.OPERATE_ERROR);
         }
 
         return APIResult.ok(signature);

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

@@ -1,6 +1,6 @@
 package cn.rankin.resourceservice.controller;
 
-import cn.rankin.common.utils.api.model.APICodeManager;
+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;
@@ -30,7 +30,7 @@ public class ResourceController {
 
         // 参数错误返回
         if (searchDTO == null || searchDTO.getType() == null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         Integer type = searchDTO.getType();
@@ -61,11 +61,11 @@ public class ResourceController {
     @RequestMapping(method = RequestMethod.POST)
     public APIResult<Resource> create(@RequestBody Resource resource) {
         if (!resource.isRight() || resource.getId() != null) {
-            return APIResult.error(APICodeManager.PARAMETER_ERROR);
+            return APIResult.error(APICode.PARAMETER_ERROR);
         }
 
         if (resourceService.exists(resource.getCode())) {
-            return APIResult.error(APICodeManager.ALREADY_EXISTS);
+            return APIResult.error(APICode.ALREADY_EXISTS);
         }
 
         Resource result = resourceService.save(resource);

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


Some files were not shown because too many files changed in this diff