diff --git a/kernel-actuator/pom.xml b/kernel-actuator/pom.xml index c25691790921d6dd13dc368de63ac274a0a01074..b80f83ebfca2b7db608d6f3038135f198e4656bf 100644 --- a/kernel-actuator/pom.xml +++ b/kernel-actuator/pom.xml @@ -5,7 +5,7 @@ cn.stylefeng.roses roses-kernel - 1.2.9 + 1.2.9.7 kernel-actuator diff --git a/kernel-actuator/src/main/java/cn/stylefeng/roses/kernel/actuator/NoneSecurityAutoConfiguration.java b/kernel-actuator/src/main/java/cn/stylefeng/roses/kernel/actuator/NoneSecurityAutoConfiguration.java index 3e69878889c9575b997dac40a9dfe7facbb070cd..2b16f54f282f4c29549fc13868b327f98aeffe7a 100644 --- a/kernel-actuator/src/main/java/cn/stylefeng/roses/kernel/actuator/NoneSecurityAutoConfiguration.java +++ b/kernel-actuator/src/main/java/cn/stylefeng/roses/kernel/actuator/NoneSecurityAutoConfiguration.java @@ -24,7 +24,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur * 默认actuator安全配置 * * @author stylefeng - * @Date 2018/6/26 21:31 + * @since 2018/6/26 21:31 */ @Configuration @ConditionalOnClass(WebSecurityConfigurerAdapter.class) diff --git a/kernel-core/pom.xml b/kernel-core/pom.xml index 644f2b8413cba136f41987a13cc6059edae87c92..a124f12768e4b06f25902a2377810357caddf079 100644 --- a/kernel-core/pom.xml +++ b/kernel-core/pom.xml @@ -7,11 +7,12 @@ cn.stylefeng.roses roses-kernel - 1.2.9 + 1.2.9.7 ../pom.xml kernel-core + 1.2.9.7 jar @@ -22,13 +23,13 @@ cn.stylefeng.roses kernel-model - 1.2.9 + 1.2.9.7 cn.hutool - hutool-core + hutool-all @@ -49,6 +50,10 @@ com.baomidou mybatis-plus + + com.baomidou + mybatis-plus-annotation + org.springframework.boot spring-boot-starter-jdbc @@ -109,5 +114,23 @@ true + + com.google.guava + guava + + + + io.springfox + springfox-swagger2 + + + com.github.xiaoymin + swagger-bootstrap-ui + + + + org.redisson + redisson + \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java index af7f7e97b90348452551d20f66fb0688f0be2d1b..753d7ad75f4212b0d662f455a3285f0311796d50 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java @@ -29,31 +29,38 @@ import static cn.stylefeng.roses.kernel.model.constants.AopSortConstants.REQUEST * 对控制器调用过程中,提供一种RequestData便捷调用的aop * * @author fengshuonan - * @date 2016年11月13日 下午10:15:42 + * @since 2016年11月13日 下午10:15:42 */ @Aspect @Order(REQUEST_DATA_AOP_SORT) public class RequestDataAop { @Pointcut("execution(* *..controller.*.*(..))") - public void cutService() { + public void cutController() { } - @Around("cutService()") + @Pointcut("execution(* *..provider.*.*(..))") + public void cutProvider() { + } + + + @Around("cutProvider()||cutController()") public Object sessionKit(ProceedingJoinPoint point) throws Throwable { - Object[] params = point.getArgs(); + try { + Object[] params = point.getArgs(); - //如果方法有参数并且参数中有RequestData对象,就临时保存RequestData到RequestDataHolder - if (params != null && params.length > 0) { - if (params[0] instanceof RequestData) { - RequestDataHolder.put((RequestData) params[0]); + //如果方法有参数并且参数中有RequestData对象,就临时保存RequestData到RequestDataHolder + if (params != null && params.length > 0) { + if (params[0] instanceof RequestData) { + RequestDataHolder.put((RequestData) params[0]); + } } - } - - // 如果 joint 顺利执行,则清空 RequestDataHolder - Object result = point.proceed(); - RequestDataHolder.remove(); - return result; + // 如果 joint 顺利执行,则清空 RequestDataHolder + Object result = point.proceed(); + return result; + } finally { + RequestDataHolder.remove(); + } } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/BaseController.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/BaseController.java index 2b469c6bc3d653d1d7e0aee0618f876237e11049..b803b0c1c9b56803182d5ee14cf817ea9a264ab5 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/BaseController.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/BaseController.java @@ -37,7 +37,7 @@ import java.util.Objects; * 控制器基类,封装一些控制器常用的方法 * * @author fengshuonan - * @Date 2018/7/23 下午3:45 + * @since 2018/7/23 下午3:45 */ public class BaseController { @@ -107,7 +107,7 @@ public class BaseController { * 返回前台文件流 * * @author fengshuonan - * @date 2017年2月28日 下午2:53:19 + * @since 2017年2月28日 下午2:53:19 */ protected ResponseEntity renderFile(String fileName, String filePath) { try { @@ -122,7 +122,7 @@ public class BaseController { * 返回前台文件流 * * @author fengshuonan - * @date 2017年2月28日 下午2:53:19 + * @since 2017年2月28日 下午2:53:19 */ protected ResponseEntity renderFile(String fileName, byte[] fileBytes) { return renderFile(fileName, new ByteArrayInputStream(fileBytes)); diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/GlobalErrorView.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/GlobalErrorView.java index f03b003bdd8b1589ba9e235685d4c2e02f319d7f..e5b5e82ca328245ca6225de10eb6156c1ad2171c 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/GlobalErrorView.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/controller/GlobalErrorView.java @@ -28,7 +28,7 @@ import java.util.Map; * 错误页面的默认跳转(例如请求404的时候,默认走这个视图解析器) * * @author fengshuonan - * @date 2017-05-21 11:34 + * @since 2017-05-21 11:34 */ public class GlobalErrorView implements View { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/warpper/BaseControllerWrapper.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/warpper/BaseControllerWrapper.java index 828bd16e99b10070e55d3ba147652ad6bd7c480c..da86877544d9952703467cbf13939238f96730c6 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/base/warpper/BaseControllerWrapper.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/base/warpper/BaseControllerWrapper.java @@ -15,7 +15,7 @@ */ package cn.stylefeng.roses.core.base.warpper; -import cn.stylefeng.roses.kernel.model.page.PageResult; +import cn.stylefeng.roses.core.page.PageResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; @@ -25,7 +25,7 @@ import java.util.Map; * 控制器查询结果的包装类基类 * * @author fengshuonan - * @date 2017年2月13日 下午10:49:36 + * @since 2017年2月13日 下午10:49:36 */ public abstract class BaseControllerWrapper { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/AopAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/AopAutoConfiguration.java index c34daa6e733266fba05fd3049b9a29e69a4ca8d7..08160f43aceeee87c962cb24b2e40e4b3523e140 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/AopAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/AopAutoConfiguration.java @@ -16,6 +16,9 @@ package cn.stylefeng.roses.core.config; import cn.stylefeng.roses.core.exception.DefaultExceptionHandler; +import cn.stylefeng.roses.core.exception.DevelopExceptionHandler; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @@ -24,7 +27,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; * 保留类,如果控制器需要些aop在这里写 * * @author fengshuonan - * @date 2016年11月12日 下午4:48:10 + * @since 2016年11月12日 下午4:48:10 */ @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) @@ -34,8 +37,27 @@ public class AopAutoConfiguration { * 默认的异常拦截器 */ @Bean - public DefaultExceptionHandler defaultControllerExceptionHandler() { + @ConditionalOnProperty(value = "spring.profiles.active", havingValue = "produce") + public DefaultExceptionHandler produceExceptionHandler() { return new DefaultExceptionHandler(); } + @Bean + @ConditionalOnProperty(value = "spring.profiles.active", havingValue = "test") + public DevelopExceptionHandler testExceptionHandler() { + return new DevelopExceptionHandler(); + } + + @Bean + @ConditionalOnProperty(value = "spring.profiles.active", havingValue = "dev") + public DevelopExceptionHandler devExceptionHandler() { + return new DevelopExceptionHandler(); + } + + @Bean + @ConditionalOnProperty(value = "spring.profiles.active", havingValue = "local") + public DevelopExceptionHandler localExceptionHandler() { + return new DevelopExceptionHandler(); + } + } \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/DbInitializerAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/DbInitializerAutoConfiguration.java index b65c17b443bc19be8a6885d0980aa713207f66eb..84aeb9313007e544e6f68a93b9070932f39ee263 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/DbInitializerAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/DbInitializerAutoConfiguration.java @@ -23,7 +23,7 @@ import org.springframework.context.annotation.Configuration; * 数据库初始化默认配置 * * @author fengshuonan - * @Date 2018/7/30 下午12:22 + * @since 2018/7/30 下午12:22 */ @Configuration public class DbInitializerAutoConfiguration { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/FastjsonAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/FastjsonAutoConfiguration.java index b00f2de8b0e2af1976012d693092771c27a70fe8..d66e0e6d92757eb4759d33c005c7e7ef56355647 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/FastjsonAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/FastjsonAutoConfiguration.java @@ -35,7 +35,7 @@ import java.util.List; * fastjson配置类 * * @author fengshuonan - * @date 2017-05-23 22:56 + * @since 2017-05-23 22:56 */ @Configuration("defaultFastjsonConfig") @ConditionalOnClass(com.alibaba.fastjson.JSON.class) @@ -61,11 +61,14 @@ public class FastjsonAutoConfiguration { SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect, - SerializerFeature.BrowserCompatible + SerializerFeature.WriteNullListAsEmpty, + SerializerFeature.WriteNullNumberAsZero, + SerializerFeature.WriteNullBooleanAsFalse, + SerializerFeature.WriteNullStringAsEmpty +// SerializerFeature.BrowserCompatible ); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setCharset(Charset.forName("utf-8")); - initOtherValueFilters(fastJsonConfig); return fastJsonConfig; } @@ -99,23 +102,4 @@ public class FastjsonAutoConfiguration { return mediaTypes; } - /** - * 初始化value过滤器 - *

- * 默认的valueFilter是把空的字段转化为空串 - */ - protected void initOtherValueFilters(FastJsonConfig fastJsonConfig) { - - //为空的值转化为空串 - ValueFilter nullValueFilter = (object, name, value) -> { - if (null == value) { - return ""; - } else { - return value; - } - }; - - fastJsonConfig.setSerializeFilters(nullValueFilter); - } - } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisDataSourceAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisDataSourceAutoConfiguration.java index cdb8b5d5df0b4ce2385d55fab4906c8e4d2c11d0..579a761082ab38e7dc57286ce15b22bcc98da4d6 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisDataSourceAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisDataSourceAutoConfiguration.java @@ -17,6 +17,7 @@ package cn.stylefeng.roses.core.config; import cn.stylefeng.roses.core.config.properties.DruidProperties; import com.alibaba.druid.pool.DruidDataSource; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -26,9 +27,10 @@ import org.springframework.context.annotation.Configuration; * MybatisPlus配置 * * @author stylefeng - * @Date 2017/5/20 21:58 + * @since 2017/5/20 21:58 */ @Configuration +@MapperScan(basePackages = {"**.modular.mapper"}) @ConditionalOnProperty(prefix = "spring.datasource", name = "url") public class MybatisDataSourceAutoConfiguration { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisPluginAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisPluginAutoConfiguration.java index 9c7e5e5ecadfa4521046b8e8e17534c4afaf3da8..1c902dd6e4a29e8cf48110108d408be6634fcb60 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisPluginAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/MybatisPluginAutoConfiguration.java @@ -30,7 +30,7 @@ import org.springframework.context.annotation.Configuration; * MybatisPlus配置 * * @author stylefeng - * @Date 2017/5/20 21:58 + * @since 2017/5/20 21:58 */ @Configuration @ConditionalOnProperty(prefix = "spring.datasource", name = "url") @@ -69,6 +69,14 @@ public class MybatisPluginAutoConfiguration { return new OptimisticLockerInterceptor(); } +// /** +// * 逻辑删除mybatis插件 +// */ +// @Bean +// public ISqlInjector sqlInjector() { +// return new LogicSqlInjector(); +// } + /** * 数据库id选择器 */ diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/PropertiesAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/PropertiesAutoConfiguration.java index 036c2993a180df219e86da44d2dceffbea7856e0..45a5e6747af29168701d93bcb4c7cb507b263357 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/PropertiesAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/PropertiesAutoConfiguration.java @@ -25,7 +25,7 @@ import org.springframework.context.annotation.PropertySource; * 默认的配置 * * @author fengshuonan - * @date 2018-01-07 12:33 + * @since 2018-01-07 12:33 */ @Configuration @PropertySource("classpath:/default-config.properties") diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/RedisAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/RedisAutoConfiguration.java index c72e127a4c814d9161440be3b46ab91bca14b63b..f2bbaa99d630507feba0625536cf02ecfa5b44e5 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/RedisAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/RedisAutoConfiguration.java @@ -28,7 +28,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; * redis配置 * * @author fengshuonan - * @date 2017-05-20 23:11 + * @since 2017-05-20 23:11 */ @Configuration @ConditionalOnClass(RedisTemplate.class) diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/UtilAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/UtilAutoConfiguration.java index b7e9756f2b9ea4955448ce4698792e596a06fba8..86f7c482d0df37912bbbff0be8acacea45715345 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/UtilAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/UtilAutoConfiguration.java @@ -23,7 +23,7 @@ import org.springframework.context.annotation.Configuration; * 默认的工具类 * * @author fengshuonan - * @date 2018-01-07 12:33 + * @since 2018-01-07 12:33 */ @Configuration public class UtilAutoConfiguration { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/WebAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/WebAutoConfiguration.java index 063a553cca81a7f4afd95a5cbe57defb16d5fbad..60f003282386e82df275f8259da522d0ea173d34 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/WebAutoConfiguration.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/WebAutoConfiguration.java @@ -39,7 +39,7 @@ import java.util.Date; * 默认web配置 * * @author fengshuonan - * @Date 2018/7/24 下午3:27 + * @since 2018/7/24 下午3:27 */ @Configuration @ConditionalOnBean(ServletContext.class) diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/cache/FastJson2JsonRedisSerializer.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/cache/FastJson2JsonRedisSerializer.java index 6c60fda8c80ed39a0e9a7a5dba0f8e5896510bd3..28907d65d0119d8a4f9123888499299dbe38f0cc 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/cache/FastJson2JsonRedisSerializer.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/cache/FastJson2JsonRedisSerializer.java @@ -26,7 +26,7 @@ import java.nio.charset.Charset; * fastjson redis序列化器 * * @author fengshuonan - * @Date 2017/11/7 上午9:20 + * @since 2017/11/7 上午9:20 */ public class FastJson2JsonRedisSerializer implements RedisSerializer { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/AppNameProperties.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/AppNameProperties.java index 071ce536c3382d060de8a7340d95f109b4f8a2a3..bc6c1b4bc0b845e5829f6fd2f6347506c937eb81 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/AppNameProperties.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/AppNameProperties.java @@ -21,7 +21,7 @@ import lombok.Data; * 应用名称属性spring.application.name * * @author fengshuonan - * @Date 2018/5/8 下午2:24 + * @since 2018/5/8 下午2:24 */ @Data public class AppNameProperties { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/DruidProperties.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/DruidProperties.java index 45708aada26cdc6277d3a31155c03e913ad6bdad..874168f75047cf6884efe2a9178c22c0780f21b9 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/DruidProperties.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/properties/DruidProperties.java @@ -26,7 +26,7 @@ import java.util.Properties; *

说明:类中属性包含默认值的不要在这里修改,应该在"application.yml"中配置

* * @author fengshuonan - * @date 2017-05-21 11:18 + * @since 2017-05-21 11:18 */ @Data public class DruidProperties { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonAutoConfiguration.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..dc1d72e6f1be2505d224be4dee4aeab1ae30cd1c --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonAutoConfiguration.java @@ -0,0 +1,89 @@ +package cn.stylefeng.roses.core.config.redisson; + +import cn.stylefeng.roses.core.util.redisson.DistributedLocker; +import cn.stylefeng.roses.core.util.redisson.RedissLockUtil; +import cn.stylefeng.roses.core.util.redisson.RedissonDistributedLocker; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.redisson.config.SentinelServersConfig; +import org.redisson.config.SingleServerConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * Redisson+springboot 自动配置类 + */ +@Configuration +@ConditionalOnClass(Config.class) +@EnableConfigurationProperties(RedissonProperties.class) +@ConditionalOnProperty(value = "redisson.enabled", havingValue = "true") +public class RedissonAutoConfiguration { + + @Autowired + private RedissonProperties redssionProperties; + + /** + * 哨兵模式自动装配 + * + * @return + */ + @Bean + @ConditionalOnProperty(name = "redisson.master-name") + RedissonClient redissonSentinel() { + Config config = new Config(); + SentinelServersConfig serverConfig = config.useSentinelServers().addSentinelAddress(redssionProperties.getSentinelAddresses()) + .setMasterName(redssionProperties.getMasterName()) + .setTimeout(redssionProperties.getTimeout()) + .setMasterConnectionPoolSize(redssionProperties.getMasterConnectionPoolSize()) + .setSlaveConnectionPoolSize(redssionProperties.getSlaveConnectionPoolSize()); + + if (redssionProperties.getPassword() != null && !"".equals(redssionProperties.getPassword())) { + serverConfig.setPassword(redssionProperties.getPassword()); + } + return Redisson.create(config); + } + + /** + * 单机模式自动装配 + * + * @return + */ + @Bean + @ConditionalOnProperty(name = "redisson.address") + RedissonClient redissonSingle() { + Config config = new Config(); + SingleServerConfig serverConfig = config.useSingleServer() + .setAddress(redssionProperties.getAddress()) + .setTimeout(redssionProperties.getTimeout()) + .setConnectionPoolSize(redssionProperties.getConnectionPoolSize()) + .setConnectionMinimumIdleSize(redssionProperties.getConnectionMinimumIdleSize()); + + if (redssionProperties.getPassword() != null && !"".equals(redssionProperties.getPassword())) { + serverConfig.setPassword(redssionProperties.getPassword()); + } + + return Redisson.create(config); + + } + + /** + * 装配locker类,并将实例注入到RedissLockUtil中 + * + * @return + */ + @Bean + DistributedLocker distributedLocker(RedissonClient redissonClient) { + RedissonDistributedLocker locker = new RedissonDistributedLocker(); + locker.setRedissonClient(redissonClient); + RedissLockUtil.setLocker(locker); + return locker; + } + +} diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonProperties.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..b09e3694578a37e00c7acf9f8174b57ddd40f33e --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/config/redisson/RedissonProperties.java @@ -0,0 +1,100 @@ +package cn.stylefeng.roses.core.config.redisson; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * redisson属性装配类 + */ +@ConfigurationProperties(prefix = "redisson") +public class RedissonProperties { + + private int timeout = 3000; + + private String address; + + private String password; + + private int connectionPoolSize = 64; + + private int connectionMinimumIdleSize = 10; + + private int slaveConnectionPoolSize = 250; + + private int masterConnectionPoolSize = 250; + + private String[] sentinelAddresses; + + private String masterName; + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public int getSlaveConnectionPoolSize() { + return slaveConnectionPoolSize; + } + + public void setSlaveConnectionPoolSize(int slaveConnectionPoolSize) { + this.slaveConnectionPoolSize = slaveConnectionPoolSize; + } + + public int getMasterConnectionPoolSize() { + return masterConnectionPoolSize; + } + + public void setMasterConnectionPoolSize(int masterConnectionPoolSize) { + this.masterConnectionPoolSize = masterConnectionPoolSize; + } + + public String[] getSentinelAddresses() { + return sentinelAddresses; + } + + public void setSentinelAddresses(String sentinelAddresses) { + this.sentinelAddresses = sentinelAddresses.split(","); + } + + public String getMasterName() { + return masterName; + } + + public void setMasterName(String masterName) { + this.masterName = masterName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public int getConnectionPoolSize() { + return connectionPoolSize; + } + + public void setConnectionPoolSize(int connectionPoolSize) { + this.connectionPoolSize = connectionPoolSize; + } + + public int getConnectionMinimumIdleSize() { + return connectionMinimumIdleSize; + } + + public void setConnectionMinimumIdleSize(int connectionMinimumIdleSize) { + this.connectionMinimumIdleSize = connectionMinimumIdleSize; + } +} diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestDataHolder.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestDataHolder.java index 76586ec7ce19b2c3d447ecb641c0cb412d290f94..25c1dd1f1442eddf23d7e7f1890f231562d22f8b 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestDataHolder.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestDataHolder.java @@ -22,7 +22,7 @@ import cn.stylefeng.roses.core.reqres.request.RequestData; * 请求数据的临时容器 * * @author fengshuonan - * @date 2018-05-04 11:33 + * @since 2018-05-04 11:33 */ public class RequestDataHolder { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestNoContext.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestNoContext.java index abf2082e9a8c827e6ea5aba348bed3e9c4242528..3231c66106cbf50bcfe7b6debe3983cbe04070f8 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestNoContext.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/context/RequestNoContext.java @@ -27,7 +27,7 @@ import javax.servlet.http.HttpServletRequest; * 获取当前请求的请求号,没有请求号则生成空串 * * @author fengshuonan - * @date 2018-05-09-下午6:25 + * @since 2018-05-09-下午6:25 */ @Slf4j public class RequestNoContext { @@ -55,6 +55,10 @@ public class RequestNoContext { */ public static String getRequestNoByRequestParam(Object[] params) { + String requestNo = getRequestNoByHttpHeader(); + if (!ToolUtil.isEmpty(requestNo)) { + return requestNo; + } if (params == null || params.length <= 0) { return ""; } else { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataMessageConvert.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataMessageConvert.java index b856fb6c84f5c3544aaaef7cbb4de23105e694ee..5ff75e9388582d7a720818ee083dbfa27d11643e 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataMessageConvert.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataMessageConvert.java @@ -40,7 +40,7 @@ import java.util.Set; * 请求数据统一转化为RequestData * * @author fengshuonan - * @Date 2018/2/21 20:57 + * @since 2018/2/21 20:57 */ @Slf4j public class RequestDataMessageConvert extends AbstractGenericHttpMessageConverter { @@ -51,7 +51,7 @@ public class RequestDataMessageConvert extends AbstractGenericHttpMessageConvert @Override public boolean canRead(Type type, Class contextClass, MediaType mediaType) { if (type instanceof Class) { - return ((Class) type).isAssignableFrom(RequestData.class); + return RequestData.class.isAssignableFrom((Class) type); } else { return false; } @@ -59,11 +59,7 @@ public class RequestDataMessageConvert extends AbstractGenericHttpMessageConvert @Override public boolean canWrite(Type type, Class clazz, MediaType mediaType) { - if (type instanceof Class) { - return ((Class) type).isAssignableFrom(RequestData.class); - } else { - return false; - } + return super.canWrite(clazz, mediaType); } @Override @@ -78,7 +74,7 @@ public class RequestDataMessageConvert extends AbstractGenericHttpMessageConvert @Override public Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { - return readMap(inputMessage); + return readMap(clazz, inputMessage); } @Override @@ -88,10 +84,10 @@ public class RequestDataMessageConvert extends AbstractGenericHttpMessageConvert @Override public Object read(Type type, Class contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { - return readMap(inputMessage); + return readMap(type, inputMessage); } - private Object readMap(HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { + private Object readMap(Type type, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { //请求流转化为字符串 String requestBody = IoUtil.read(inputMessage.getBody(), "UTF-8"); @@ -102,35 +98,18 @@ public class RequestDataMessageConvert extends AbstractGenericHttpMessageConvert } HttpServletRequest request = HttpContext.getRequest(); - return getRequestData(requestBody, request); + return getRequestData(type, requestBody, request); } - private Object getRequestData(String requestBody, HttpServletRequest request) { - RequestData requestData = new RequestData(); + private Object getRequestData(Type type, String requestBody, HttpServletRequest request) { + JSONObject jsonObject = JSON.parseObject(requestBody); + RequestData requestData = jsonObject.toJavaObject(type); if (request != null) { requestData.setIp(request.getRemoteHost()); requestData.setUrl(request.getServletPath()); } - requestData.setData(clearWhiteSpace(requestBody)); + requestData.setData(jsonObject); return requestData; } - - private JSONObject clearWhiteSpace(String requestBody) { - JSONObject jsonObject = JSON.parseObject(requestBody); - if (jsonObject != null) { - Set> entries = jsonObject.entrySet(); - for (Map.Entry entry : entries) { - Object value = entry.getValue(); - if (value instanceof String) { - value = ((String) value).trim(); - jsonObject.put(entry.getKey(), value); - } - } - return jsonObject; - } else { - return null; - } - } - } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataTypeMethodProcessor.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataTypeMethodProcessor.java index 7959ced9386400c79f6848136b25a5bc0e93295d..34f8d4c9aaec5db8fe414aeaea1054b3e404ce64 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataTypeMethodProcessor.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/converter/RequestDataTypeMethodProcessor.java @@ -26,7 +26,7 @@ import java.util.List; * 请求转化处理器 * * @author stylefeng - * @Date 2018/5/15 22:02 + * @since 2018/5/15 22:02 */ public class RequestDataTypeMethodProcessor extends RequestResponseBodyMethodProcessor { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScope.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScope.java index 7b7a577193c2f71837752a307639b9742cbfc3ea..98d27f92f5f3fb05431d9b2cb04acd71b6fe908c 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScope.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScope.java @@ -6,7 +6,7 @@ import java.util.List; * 数据范围 * * @author fengshuonan - * @date 2017-07-23 22:19 + * @since 2017-07-23 22:19 */ public class DataScope { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScopeInterceptor.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScopeInterceptor.java index 51a4c0a1017067d32c18d88bf439488627c0a4e2..a8a9f9babc01e80062810e70f843de8e37703e5a 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScopeInterceptor.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/datascope/DataScopeInterceptor.java @@ -20,7 +20,7 @@ import java.util.Properties; * 数据范围的拦截器 * * @author fengshuonan - * @date 2017-07-23 21:26 + * @since 2017-07-23 21:26 */ @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) public class DataScopeInterceptor implements Interceptor { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/db/DbInitializer.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/db/DbInitializer.java index 665e9e2951bea8ffaef841a62fcf2c20f790f973..56f0f0d4f724153708550585a6138bfeb824d549 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/db/DbInitializer.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/db/DbInitializer.java @@ -37,7 +37,7 @@ import static cn.stylefeng.roses.kernel.model.exception.enums.CoreExceptionEnum. * 数据库初始化,可初始化表,校验字段,校验表名是否存在等 * * @author fengshuonan - * @date 2018-07-29 22:05 + * @since 2018-07-29 22:05 */ @Slf4j @Getter @@ -61,7 +61,7 @@ public abstract class DbInitializer { * 初始化数据库 * * @author fengshuonan - * @Date 2018/7/30 上午10:30 + * @since 2018/7/30 上午10:30 */ public void dbInit() { @@ -80,7 +80,7 @@ public abstract class DbInitializer { * 初始化表结构 * * @author fengshuonan - * @Date 2018/7/30 上午10:24 + * @since 2018/7/30 上午10:24 */ private void initTable() { @@ -110,7 +110,7 @@ public abstract class DbInitializer { * 校验实体和对应表结构是否有不一致的 * * @author fengshuonan - * @Date 2018/7/30 上午10:24 + * @since 2018/7/30 上午10:24 */ private void fieldsValidate() { @@ -152,7 +152,7 @@ public abstract class DbInitializer { * 反射获取类的所有字段 * * @author fengshuonan - * @Date 2018/7/30 上午10:06 + * @since 2018/7/30 上午10:06 */ private List getClassFields() { Class entityClass = this.getEntityClass(); @@ -169,7 +169,7 @@ public abstract class DbInitializer { * 获取表的字段 * * @author stylefeng - * @Date 2018/7/29 22:49 + * @since 2018/7/29 22:49 */ private String showColumnsSql() { return "SHOW COLUMNS FROM " + this.getTableName(); @@ -179,7 +179,7 @@ public abstract class DbInitializer { * 获取表的初始化语句 * * @author stylefeng - * @Date 2018/7/29 22:10 + * @since 2018/7/29 22:10 */ protected abstract String getTableInitSql(); @@ -187,7 +187,7 @@ public abstract class DbInitializer { * 获取表的名称 * * @author stylefeng - * @Date 2018/7/29 22:10 + * @since 2018/7/29 22:10 */ protected abstract String getTableName(); @@ -195,7 +195,7 @@ public abstract class DbInitializer { * 获取表对应的实体 * * @author stylefeng - * @Date 2018/7/29 22:49 + * @since 2018/7/29 22:49 */ protected abstract Class getEntityClass(); } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/db/listener/InitTableListener.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/db/listener/InitTableListener.java index bc1483b8e1f5c4deb1663429fd3e3a0e60387ec2..7c86129176ed226b6cdd0e785e18ac1c1563c6fb 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/db/listener/InitTableListener.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/db/listener/InitTableListener.java @@ -27,7 +27,7 @@ import java.util.Map; * 初始化 创建字典表 * * @author wangzhongqiang - * @date 2018/4/23 9:57 + * @since 2018/4/23 9:57 */ @Slf4j public class InitTableListener implements ApplicationListener, Ordered { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/DBID.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/DBID.java index 6d4339fb36aa4fcd4895681c37687192bf03099b..e5d70b56dad5fc111bd4ca8f2de7c23851ddd3b1 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/DBID.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/DBID.java @@ -4,7 +4,7 @@ package cn.stylefeng.roses.core.dbid; * 用于标识mapping.xml中不同数据库的标识 * * @author fengshuonan - * @Date 2019/3/30 22:24 + * @since 2019/3/30 22:24 */ public class DBID { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/GunsDatabaseIdProvider.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/GunsDatabaseIdProvider.java index a74856ad2ee62b8c7b63d92bd23bf5a139599a5c..8422357fd798aa81e8f9bc2af6df109a8ee97461 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/GunsDatabaseIdProvider.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/dbid/GunsDatabaseIdProvider.java @@ -10,7 +10,7 @@ import java.util.Properties; * 数据库id选择器 * * @author fengshuonan - * @Date 2019/3/30 22:26 + * @since 2019/3/30 22:26 */ public class GunsDatabaseIdProvider implements DatabaseIdProvider { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DefaultExceptionHandler.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DefaultExceptionHandler.java index 48560dea6c4418d84c6c4af150d2a1d244debf4d..1f6a5181c11956ad290bb723f2c509c8d5d743fc 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DefaultExceptionHandler.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DefaultExceptionHandler.java @@ -17,10 +17,9 @@ package cn.stylefeng.roses.core.exception; import cn.stylefeng.roses.core.reqres.response.ErrorResponseData; import cn.stylefeng.roses.core.reqres.response.ResponseData; -import cn.stylefeng.roses.kernel.model.exception.ApiServiceException; -import cn.stylefeng.roses.kernel.model.exception.RequestEmptyException; -import cn.stylefeng.roses.kernel.model.exception.ServiceException; +import cn.stylefeng.roses.kernel.model.exception.*; import cn.stylefeng.roses.kernel.model.exception.enums.CoreExceptionEnum; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; @@ -36,14 +35,13 @@ import static cn.stylefeng.roses.kernel.model.constants.AopSortConstants.DEFAULT * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截) * * @author fengshuonan - * @date 2016年11月12日 下午3:19:56 + * @since 2016年11月12日 下午3:19:56 */ @ControllerAdvice @Order(DEFAULT_EXCEPTION_HANDLER_SORT) +@Slf4j public class DefaultExceptionHandler { - private Logger log = LoggerFactory.getLogger(this.getClass()); - /** * 拦截各个服务的具体异常 */ @@ -78,6 +76,28 @@ public class DefaultExceptionHandler { return new ErrorResponseData(e.getCode(), e.getErrorMessage()); } + /** + * 拦截未授权的异常 + */ + @ExceptionHandler(UnauthorizedException.class) + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ResponseBody + public ResponseData unauthorizedError(UnauthorizedException e) { + log.error("未授权异常:", e); + return new ErrorResponseData(e.getCode(), e.getMessage()); + } + + /** + * 拦截无权限的异常 + */ + @ExceptionHandler(ForbiddenException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + @ResponseBody + public ResponseData forbiddenError(ForbiddenException e) { + log.error("无权限异常:", e); + return new ErrorResponseData(e.getCode(), e.getMessage()); + } + /** * 拦截未知的运行时异常 */ diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DevelopExceptionHandler.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DevelopExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..28ab311d57c1630cd7e3c210ea6895375b3f0eab --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/exception/DevelopExceptionHandler.java @@ -0,0 +1,117 @@ +/** + * Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com) + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.stylefeng.roses.core.exception; + +import cn.stylefeng.roses.core.reqres.response.ErrorResponseData; +import cn.stylefeng.roses.core.reqres.response.ResponseData; +import cn.stylefeng.roses.core.util.HttpContext; +import cn.stylefeng.roses.kernel.model.exception.*; +import cn.stylefeng.roses.kernel.model.exception.enums.CoreExceptionEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import javax.servlet.http.HttpServletRequest; + +import static cn.stylefeng.roses.kernel.model.constants.AopSortConstants.DEFAULT_EXCEPTION_HANDLER_SORT; + +/** + * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截) + * + * @author pony + * @since 2019年09月06日 + */ +@ControllerAdvice +@Order(DEFAULT_EXCEPTION_HANDLER_SORT) +@Slf4j +public class DevelopExceptionHandler { + + /** + * 拦截各个服务的具体异常 + */ + @ExceptionHandler(ApiServiceException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ResponseBody + public ResponseData apiService(ApiServiceException e) { + log.error("服务具体异常:", e); + ErrorResponseData errorResponseData = getErrorResponse(e.getCode(), e.getErrorMessage()); + errorResponseData.setExceptionClazz(e.getExceptionClassName()); + return errorResponseData; + } + + /** + * 拦截请求为空的异常 + */ + @ExceptionHandler(RequestEmptyException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ResponseBody + public ResponseData emptyRequest(RequestEmptyException e) { + return getErrorResponse(e.getCode(), e.getErrorMessage()); + } + + /** + * 拦截业务异常 + */ + @ExceptionHandler(ServiceException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ResponseBody + public ResponseData notFount(ServiceException e) { + log.info("业务异常:", e); + return getErrorResponse(e.getCode(), e.getErrorMessage()); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ResponseBody + public ResponseData serverError(Exception e) { + log.error("运行时异常:", e); + return getErrorResponse(CoreExceptionEnum.SERVICE_ERROR.getCode(), e.getMessage()); + } + + /** + * 拦截未授权的异常 + */ + @ExceptionHandler(UnauthorizedException.class) + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ResponseBody + public ResponseData unauthorizedError(UnauthorizedException e) { + log.error("未授权异常:", e); + return getErrorResponse(e.getCode(), e.getMessage()); + } + + /** + * 拦截无权限的异常 + */ + @ExceptionHandler(ForbiddenException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + @ResponseBody + public ResponseData forbiddenError(ForbiddenException e) { + log.error("无权限异常:", e); + return getErrorResponse(e.getCode(), e.getMessage()); + } + + private ErrorResponseData getErrorResponse(Integer code, String message) { + ErrorResponseData error = new ErrorResponseData(code, "requestNo:" + HttpContext.getRequestNo() + "," + message); + return error; + } +} diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignErrorDecoder.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignErrorDecoder.java index c6e9deabc2b650923b1f3c3858b48c9355761df5..70f11a5dd04cd36632ee9d67e847db9e18cd8027 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignErrorDecoder.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignErrorDecoder.java @@ -35,7 +35,7 @@ import java.lang.reflect.InvocationTargetException; * roses自己的feign错误解码器(为了feign接收到错误的返回,转化成roses可识别的ServiceException) * * @author stylefeng - * @Date 2018/4/20 23:14 + * @since 2018/4/20 23:14 */ @Slf4j public class RosesFeignErrorDecoder implements ErrorDecoder { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignHeaderProcessInterceptor.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignHeaderProcessInterceptor.java index 70f3a41cba4ad42f371a5bc813940ad13592cd0c..fb2c508c9ac76d10d5a2a54fbf331d6b9ab1414f 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignHeaderProcessInterceptor.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/feign/RosesFeignHeaderProcessInterceptor.java @@ -27,7 +27,7 @@ import java.util.Enumeration; * feign远程调用添加header的过滤器 * * @author fengshuonan - * @date 2018-05-07-下午7:25 + * @since 2018-05-07-下午7:25 */ @Slf4j public class RosesFeignHeaderProcessInterceptor implements RequestInterceptor { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/metadata/CustomMetaObjectHandler.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/metadata/CustomMetaObjectHandler.java index a816582755466867592974ef9540c583087560b0..eba16750de058ee7bce2a135973842bb06cc5b5c 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/metadata/CustomMetaObjectHandler.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/metadata/CustomMetaObjectHandler.java @@ -29,7 +29,7 @@ import java.util.Date; * 注意默认获取的userId为空 * * @author fengshuonan - * @Date 2018/7/4 下午12:42 + * @since 2018/7/4 下午12:42 */ public class CustomMetaObjectHandler implements MetaObjectHandler { @@ -68,6 +68,15 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { } catch (ReflectionException e) { //没有此字段,则不处理 } + + Object createUserName = getFieldValByName(getCreateUserNameFieldName(), metaObject); + if (createUserName == null) { + + //获取当前登录用户姓名 + Object accountName = getUserName(); + + setFieldValByName(getCreateUserNameFieldName(), accountName, metaObject); + } } @Override @@ -77,31 +86,44 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { } catch (ReflectionException e) { //没有此字段,则不处理 } +// Object updateUser = getFieldValByName(getUpdateUserFieldName(), metaObject); +// if (updateUser == null) { + try { + //获取当前登录用户 + Object accountId = getUserUniqueId(); - Object updateUser = null; + setFieldValByName(getUpdateUserFieldName(), accountId, metaObject); + } catch (ReflectionException e) { + //没有此字段,则不处理 + } +// } + +// Object updateUserName = getFieldValByName(getUpdateUserNameFieldName(), metaObject); +// if (updateUserName == null) { try { - updateUser = getFieldValByName(getUpdateUserFieldName(), metaObject); - if (updateUser == null) { - Object accountId = getUserUniqueId(); - setFieldValByName(getUpdateUserFieldName(), accountId, metaObject); - } + //获取当前登录用户姓名 + Object accountName = getUserName(); + + setFieldValByName(getUpdateUserNameFieldName(), accountName, metaObject); } catch (ReflectionException e) { //没有此字段,则不处理 } +// } + } /** * 获取逻辑删除字段的名称(非数据库中字段名称) */ - protected String getDeleteFlagFieldName() { - return "delFlag"; + public static String getDeleteFlagFieldName() { + return "DELETED"; } /** * 获取逻辑删除字段的默认值 */ - protected Object getDefaultDelFlagValue() { - return "N"; + public static Object getDefaultDelFlagValue() { + return 0; } /** @@ -118,6 +140,13 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { return "createUser"; } + /** + * 获取创建用户姓名字段的名称(非数据库中字段名称) + */ + protected String getCreateUserNameFieldName() { + return "createUserName"; + } + /** * 获取更新时间字段的名称(非数据库中字段名称) */ @@ -132,10 +161,24 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { return "updateUser"; } + /** + * 获取更新用户姓名字段的名称(非数据库中字段名称) + */ + private String getUpdateUserNameFieldName() { + return "updateUserName"; + } + /** * 获取用户唯一id(注意默认获取的用户唯一id为空,如果想填写则需要继承本类) */ protected Object getUserUniqueId() { + return 0L; + } + + /** + * 获取用户名称(注意默认获取的用户名称为空,如果想填写则需要继承本类) + */ + protected Object getUserName() { return ""; } } \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DataSourceContextHolder.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DataSourceContextHolder.java index 2da0d1dcaec29b331ee636e464a752361db5877f..850217ca74021ff3eef5a1e72247b3d7f5c1b01c 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DataSourceContextHolder.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DataSourceContextHolder.java @@ -4,11 +4,11 @@ package cn.stylefeng.roses.core.mutidatasource; * datasource的上下文 * * @author fengshuonan - * @date 2017年3月5日 上午9:10:58 + * @since 2017年3月5日 上午9:10:58 */ public class DataSourceContextHolder { - private static final ThreadLocal contextHolder = new ThreadLocal(); + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal(); /** * 设置数据源类型 @@ -16,20 +16,20 @@ public class DataSourceContextHolder { * @param dataSourceType 数据库类型 */ public static void setDataSourceType(String dataSourceType) { - contextHolder.set(dataSourceType); + CONTEXT_HOLDER.set(dataSourceType); } /** * 获取数据源类型 */ public static String getDataSourceType() { - return contextHolder.get(); + return CONTEXT_HOLDER.get(); } /** * 清除数据源类型 */ public static void clearDataSourceType() { - contextHolder.remove(); + CONTEXT_HOLDER.remove(); } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DynamicDataSource.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DynamicDataSource.java index cd1e5417285a83774ad0171e9ba107ed6edd45ee..05cb4612cfd270163a21af3a6271533393d65df7 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DynamicDataSource.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/DynamicDataSource.java @@ -6,7 +6,7 @@ import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; * 动态数据源 * * @author fengshuonan - * @date 2017年3月5日 上午9:11:49 + * @since 2017年3月5日 上午9:11:49 */ public class DynamicDataSource extends AbstractRoutingDataSource { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/annotion/DataSource.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/annotion/DataSource.java index df1cb35d528a0017b34e8f77dd7ff0a02af82abc..2c30095de653ac004d68799b0a0edc0c697f3ede 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/annotion/DataSource.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/annotion/DataSource.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; * 多数据源标识 * * @author fengshuonan - * @date 2017年3月5日 上午9:44:24 + * @since 2017年3月5日 上午9:44:24 */ @Inherited @Retention(RetentionPolicy.RUNTIME) diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/aop/MultiSourceExAop.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/aop/MultiSourceExAop.java index e413bd4ebeba9d0b9cb2da93bb2ff0d63b93d3f5..93689e8b8f48de64bb9499c63a2ec6b0cd7a03e1 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/aop/MultiSourceExAop.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/aop/MultiSourceExAop.java @@ -18,7 +18,7 @@ import java.lang.reflect.Method; * 多数据源切换的aop * * @author fengshuonan - * @date 2017年3月5日 上午10:22:16 + * @since 2017年3月5日 上午10:22:16 */ @Aspect public class MultiSourceExAop implements Ordered { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/mybatis/OptionalSqlSessionTemplate.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/mybatis/OptionalSqlSessionTemplate.java index 188310500d535dd7d1f016003b4acd25054e42f6..52b508cd7c55da7f5fbb8f015346feaa0660fa59 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/mybatis/OptionalSqlSessionTemplate.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/mutidatasource/mybatis/OptionalSqlSessionTemplate.java @@ -23,7 +23,7 @@ import static org.mybatis.spring.SqlSessionUtils.*; * 动态获取SqlSessionFactory,根据DataSourceContextHolder * * @author fengshuonan - * @Date 2019/3/16 6:31 PM + * @since 2019/3/16 6:31 PM */ public class OptionalSqlSessionTemplate extends SqlSessionTemplate { @@ -67,10 +67,12 @@ public class OptionalSqlSessionTemplate extends SqlSessionTemplate { } } + @Override public ExecutorType getExecutorType() { return this.executorType; } + @Override public PersistenceExceptionTranslator getPersistenceExceptionTranslator() { return this.exceptionTranslator; } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageFactory.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageFactory.java index 27bfb972895febba5955d98ebc2b21a7838af1bc..0018ddbdaac531a8abbece171309ae62cd2b66cc 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageFactory.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageFactory.java @@ -19,9 +19,9 @@ import cn.stylefeng.roses.core.context.RequestDataHolder; import cn.stylefeng.roses.core.reqres.request.RequestData; import cn.stylefeng.roses.core.util.HttpContext; import cn.stylefeng.roses.core.util.ToolUtil; -import cn.stylefeng.roses.kernel.model.page.PageQuery; import cn.stylefeng.roses.kernel.model.util.ValidateUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.base.CaseFormat; import javax.servlet.http.HttpServletRequest; @@ -30,7 +30,7 @@ import javax.servlet.http.HttpServletRequest; * 默认分页参数构建 * * @author fengshuonan - * @date 2017年11月15日13:52:16 + * @since 2017年11月15日13:52:16 */ public class PageFactory { @@ -63,7 +63,7 @@ public class PageFactory { * 默认规则的分页 * * @author fengshuonan - * @Date 2018/7/23 下午4:11 + * @since 2018/7/23 下午4:11 */ public static Page defaultPage() { @@ -96,6 +96,7 @@ public class PageFactory { if (ToolUtil.isEmpty(orderByField)) { return page; } + orderByField = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, orderByField); if (ToolUtil.isEmpty(sort)) { // 默认降序 page.setDesc(orderByField); @@ -113,7 +114,7 @@ public class PageFactory { * 自定义参数的分页 * * @author fengshuonan - * @Date 2018/7/23 下午4:11 + * @since 2018/7/23 下午4:11 */ public static Page createPage(PageQuery pageQuery) { @@ -148,7 +149,7 @@ public class PageFactory { * 获取参数值,通过param或从requestBody中取 * * @author fengshuonan - * @Date 2018/7/25 下午1:12 + * @since 2018/7/25 下午1:12 */ private static String getFieldValue(HttpServletRequest request, String fieldName) { String parameter = request.getParameter(fieldName); @@ -165,7 +166,7 @@ public class PageFactory { } } } else { - return null; + return parameter; } } } diff --git a/kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageQuery.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageQuery.java similarity index 71% rename from kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageQuery.java rename to kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageQuery.java index 3e346d7b78ee3ac322722d0e810f0f6e32369868..99ace04bceb16c5e2ce33b97a439e03705bf8365 100644 --- a/kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageQuery.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageQuery.java @@ -13,37 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.stylefeng.roses.kernel.model.page; +package cn.stylefeng.roses.core.page; +import cn.stylefeng.roses.core.reqres.request.RequestQuery; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 分页查询的请求参数封装 * * @author fengshuonan - * @date 2017-11-08-上午11:18 + * @since 2017-11-08-上午11:18 */ @Data -public class PageQuery { +public class PageQuery extends RequestQuery { /** * 每页的条数 */ + @ApiModelProperty(value = "每页的条数", example = "10") private Integer pageSize; /** * 页编码(第几页) */ + @ApiModelProperty(value = "页编码(第几页)", example = "1") private Integer pageNo; /** * 排序方式(asc 或者 desc) */ + @ApiModelProperty(value = "排序方式(asc 或者 desc)", example = "desc") private String sort; /** * 排序的字段名称 */ + @ApiModelProperty(value = "排序的字段名称", example = "id") private String orderByField; public PageQuery() { diff --git a/kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageResult.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageResult.java similarity index 61% rename from kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageResult.java rename to kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageResult.java index be6c58b61bbbaa8f15e1308f155dd9428b6a8b49..c6a0b8b3a23b82fbdcf24cba9555a781a6ec8be8 100644 --- a/kernel-model/src/main/java/cn/stylefeng/roses/kernel/model/page/PageResult.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/page/PageResult.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.stylefeng.roses.kernel.model.page; +package cn.stylefeng.roses.core.page; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.Data; import java.io.Serializable; @@ -25,27 +25,36 @@ import java.util.List; * 封装分页结果集 * * @author stylefeng - * @Date 2018/7/22 23:00 + * @since 2018/7/22 23:00 */ @Data public class PageResult implements Serializable { private static final long serialVersionUID = -4071521319254024213L; - private Integer page = 1;// 要查找第几页 - private Integer pageSize = 20;// 每页显示多少条 - private Integer totalPage = 0;// 总页数 + private Long page = 1L;// 要查找第几页 + private Long pageSize = 20L;// 每页显示多少条 + private Long totalPage = 0L;// 总页数 private Long totalRows = 0L;// 总记录数 private List rows;// 结果集 public PageResult() { } - public PageResult(Page page) { + public PageResult(IPage page) { this.setRows(page.getRecords()); this.setTotalRows(page.getTotal()); - this.setPage((int) page.getCurrent()); - this.setPageSize((int) page.getSize()); + this.setPage(page.getCurrent()); + this.setPageSize(page.getSize()); + this.setTotalPage(page.getPages()); + } + + public PageResult(List rows, Long page, Long pageSize, Long totalRows, Long totalPage) { + this.setRows(rows); + this.setTotalRows(totalRows); + this.setPage(page); + this.setPageSize(pageSize); + this.setTotalPage(totalPage); } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestData.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestData.java index e42ae2cc274ea5a95f43bb0380eccbe4bc7427bd..b246052ce3ead0c611213901977f84ce9f3a7da1 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestData.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestData.java @@ -17,8 +17,10 @@ package cn.stylefeng.roses.core.reqres.request; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; +import cn.stylefeng.roses.kernel.model.api.base.AbstractBaseRequest; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -28,28 +30,36 @@ import java.util.*; * 响应结果封装 * * @author fengshuonan - * @Date 2018/2/11 23:04 + * @since 2018/2/11 23:04 */ @Data -public class RequestData implements Serializable { +public class RequestData extends AbstractBaseRequest implements Serializable { private static final long serialVersionUID = 9081406366569775542L; /** * 封装前端请求的json数据 */ + @ApiModelProperty(hidden = true) private JSONObject data; /** * 客户端请求的ip */ + @ApiModelProperty(hidden = true) private String ip; /** * 客户端请求的地址 */ + @ApiModelProperty(hidden = true) private String url; +// private Class getTClass() { +// Class tClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; +// return tClass; +// } + /** * 解析请求json为指定类 */ diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestQuery.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestQuery.java new file mode 100644 index 0000000000000000000000000000000000000000..5970d9733855d943fb43659232b37921da02e425 --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/request/RequestQuery.java @@ -0,0 +1,82 @@ +package cn.stylefeng.roses.core.reqres.request; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.google.common.base.CaseFormat; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Collection; + +public class RequestQuery extends RequestData { + + public Wrapper buildWrapper(Class clazz) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (TableInfoHelper.getTableInfo(clazz).isLogicDelete()) { + TableFieldInfo field = TableInfoHelper.getTableInfo(clazz).getFieldList().stream().filter(TableFieldInfo::isLogicDelete).findFirst().get(); + queryWrapper.eq(field.getColumn(), field.getLogicNotDeleteValue()); + } + + Field[] fields = this.getClass().getDeclaredFields(); + try { + for (Field f : fields) { + String fieldName = f.toString().substring(f.toString().lastIndexOf(".") + 1); //取出属性名称 + String[] splitFieldName = fieldName.split("_"); + if (splitFieldName.length == 2) { + String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); + Method method = this.getClass().getMethod("get" + methodName); + Object val = method.invoke(this);//取出属性值 + if (val == null) { + continue; + } + String columnName = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, splitFieldName[1]); + switch (splitFieldName[0].toLowerCase()) { + case "eq": + queryWrapper.eq(columnName, val); + break; + case "ne": + queryWrapper.ne(columnName, val); + break; + case "gt": + queryWrapper.gt(columnName, val); + break; + case "ge": + queryWrapper.ge(columnName, val); + break; + case "lt": + queryWrapper.lt(columnName, val); + break; + case "le": + queryWrapper.le(columnName, val); + break; + case "like": + queryWrapper.like(columnName, val); + break; + case "likel": + queryWrapper.likeLeft(columnName, val); + break; + case "liker": + queryWrapper.likeRight(columnName, val); + break; + case "in": + queryWrapper.in(columnName, (Collection) val); + break; + case "notin": + queryWrapper.notIn(columnName, (Collection) val); + break; + default: + break; + } + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + return queryWrapper; + } +} diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ErrorResponseData.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ErrorResponseData.java index 1f1e83a70d3944694e215695b6a318f06b419392..d6ef50d4418a5d3d1e32f2c04a5f5e0daeeb41ef 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ErrorResponseData.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ErrorResponseData.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com) *

* Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,10 +22,10 @@ import lombok.Data; * 请求失败的返回 * * @author stylefeng - * @Date 2018/1/4 22:39 + * @since 2018/1/4 22:39 */ @Data -public class ErrorResponseData extends ResponseData { +public class ErrorResponseData extends ResponseData { /** * 异常的具体类名称 @@ -40,7 +40,7 @@ public class ErrorResponseData extends ResponseData { super(false, code, message, null); } - public ErrorResponseData(Integer code, String message, Object object) { - super(false, code, message, object); + public ErrorResponseData(Integer code, String message, T t) { + super(false, code, message, t); } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ResponseData.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ResponseData.java index abca2162f5787126cc4a33946a5225668cf4ec7f..7273fc9003a585a3e489435d1629ca7c6515964a 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ResponseData.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/ResponseData.java @@ -22,10 +22,10 @@ import lombok.Data; * 返回给前台的通用包装 * * @author stylefeng - * @Date 2018/1/4 22:37 + * @since 2018/1/4 22:37 */ @Data -public class ResponseData { +public class ResponseData { public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功"; @@ -53,39 +53,39 @@ public class ResponseData { /** * 响应对象 */ - private Object data; + private T data; public ResponseData() { } - public ResponseData(Boolean success, Integer code, String message, Object data) { + public ResponseData(Boolean success, Integer code, String message, T data) { this.success = success; this.code = code; this.message = message; this.data = data; } - public static SuccessResponseData success() { - return new SuccessResponseData(); + public static ResponseData success() { + return new SuccessResponseData(); } - public static SuccessResponseData success(Object object) { - return new SuccessResponseData(object); + public static ResponseData success(T t) { + return new SuccessResponseData(t); } - public static SuccessResponseData success(Integer code, String message, Object object) { - return new SuccessResponseData(code, message, object); + public static ResponseData success(Integer code, String message, T t) { + return new SuccessResponseData(code, message, t); } - public static ErrorResponseData error(String message) { + public static ResponseData error(String message) { return new ErrorResponseData(message); } - public static ErrorResponseData error(Integer code, String message) { - return new ErrorResponseData(code, message); + public static ResponseData error(Integer code, String message) { + return new ErrorResponseData(code, message); } - public static ErrorResponseData error(Integer code, String message, Object object) { - return new ErrorResponseData(code, message, object); + public static ResponseData error(Integer code, String message, T t) { + return new ErrorResponseData(code, message, t); } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/SuccessResponseData.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/SuccessResponseData.java index 149c450f3a9ac0673a47cdc1d2c7f9e0aeeeca46..05c80ac073e4a616e94a52693d514e9f5312d5d9 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/SuccessResponseData.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/reqres/response/SuccessResponseData.java @@ -19,19 +19,19 @@ package cn.stylefeng.roses.core.reqres.response; * 请求成功的返回 * * @author stylefeng - * @Date 2018/1/4 22:38 + * @since 2018/1/4 22:38 */ -public class SuccessResponseData extends ResponseData { +public class SuccessResponseData extends ResponseData { public SuccessResponseData() { super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); } - public SuccessResponseData(Object object) { - super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); + public SuccessResponseData(T t) { + super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, t); } - public SuccessResponseData(Integer code, String message, Object object) { - super(true, code, message, object); + public SuccessResponseData(Integer code, String message, T t) { + super(true, code, message, t); } } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/DefaultTreeBuildFactory.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/DefaultTreeBuildFactory.java index d18c92951595a0fbe0f09de1c77efc8636cce363..fb05bfa77bb4153c69cde9d8b8625b60a18729a8 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/DefaultTreeBuildFactory.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/DefaultTreeBuildFactory.java @@ -26,7 +26,7 @@ import java.util.List; * 默认递归工具类,用于遍历有父子关系的节点,例如菜单树,字典树等等 * * @author fengshuonan - * @Date 2018/7/25 下午5:59 + * @since 2018/7/25 下午5:59 */ @Data public class DefaultTreeBuildFactory extends AbstractTreeBuildFactory { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/abst/AbstractTreeBuildFactory.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/abst/AbstractTreeBuildFactory.java index 75018865d970ad754c9b6623e51f0f2497d91cf5..e2ca2b8302c7e0ca2d573105d7a363f722af8971 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/abst/AbstractTreeBuildFactory.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/treebuild/abst/AbstractTreeBuildFactory.java @@ -21,7 +21,7 @@ import java.util.List; * 树构建的抽象类,定义构建tree的基本步骤 * * @author fengshuonan - * @Date 2018/7/25 下午5:59 + * @since 2018/7/25 下午5:59 */ public abstract class AbstractTreeBuildFactory { @@ -29,7 +29,7 @@ public abstract class AbstractTreeBuildFactory { * 树节点构建整体过程 * * @author fengshuonan - * @Date 2018/7/26 上午9:45 + * @since 2018/7/26 上午9:45 */ public List doTreeBuild(List nodes) { @@ -47,7 +47,7 @@ public abstract class AbstractTreeBuildFactory { * 构建之前的处理工作 * * @author fengshuonan - * @Date 2018/7/26 上午10:10 + * @since 2018/7/26 上午10:10 */ protected abstract List beforeBuild(List nodes); @@ -55,7 +55,7 @@ public abstract class AbstractTreeBuildFactory { * 具体的构建过程 * * @author fengshuonan - * @Date 2018/7/26 上午10:11 + * @since 2018/7/26 上午10:11 */ protected abstract List executeBuilding(List nodes); @@ -63,7 +63,7 @@ public abstract class AbstractTreeBuildFactory { * 构建之后的处理工作 * * @author fengshuonan - * @Date 2018/7/26 上午10:11 + * @since 2018/7/26 上午10:11 */ protected abstract List afterBuild(List nodes); } \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/FileUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/FileUtil.java index 01dd0a43adcd23fbaa0b1c9f09b77c97695de6c0..ecaa2fade36d322dbebdefe3c8b62a81217e04f6 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/FileUtil.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/FileUtil.java @@ -30,7 +30,7 @@ import java.nio.channels.FileChannel; * NIO方式读取文件 * * @author stylefeng - * @Date 2018/1/4 23:09 + * @since 2018/1/4 23:09 */ public class FileUtil { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpContext.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpContext.java index 2a5256835ec51e82102c48b33dd5b213fc97d8ad..8f45576a2f65f3233349511217cf227bd43f66af 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpContext.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpContext.java @@ -15,9 +15,12 @@ */ package cn.stylefeng.roses.core.util; +import cn.stylefeng.roses.kernel.model.constants.RosesConstants; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Enumeration; @@ -28,7 +31,7 @@ import java.util.Map; * 快捷获取HttpServletRequest,HttpServletResponse * * @author stylefeng - * @Date 2018/1/4 21:24 + * @since 2018/1/4 21:24 */ public class HttpContext { @@ -36,7 +39,7 @@ public class HttpContext { * 获取请求的ip地址 * * @author fengshuonan - * @Date 2018/7/23 下午3:44 + * @since 2018/7/23 下午3:44 */ public static String getIp() { HttpServletRequest request = HttpContext.getRequest(); @@ -51,7 +54,7 @@ public class HttpContext { * 获取当前请求的Request对象 * * @author fengshuonan - * @Date 2018/7/23 下午3:44 + * @since 2018/7/23 下午3:44 */ public static HttpServletRequest getRequest() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); @@ -66,7 +69,7 @@ public class HttpContext { * 获取当前请求的Response对象 * * @author fengshuonan - * @Date 2018/7/23 下午3:44 + * @since 2018/7/23 下午3:44 */ public static HttpServletResponse getResponse() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); @@ -81,7 +84,7 @@ public class HttpContext { * 获取所有请求的值 * * @author fengshuonan - * @Date 2018/7/23 下午3:44 + * @since 2018/7/23 下午3:44 */ public static Map getRequestParameters() { HashMap values = new HashMap<>(); @@ -98,4 +101,69 @@ public class HttpContext { return values; } + public static Cookie getCookie(String name) { + HttpServletRequest request = getRequest(); + Cookie[] cookies = request.getCookies(); + if (null != cookies) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals(name)) { + return cookie; + } + } + } + return null; + } + + /* + * 先判断header中是否有Authorization字段, + * 如果header中没有这个字段,则检查请求参数中是否带token, + * 如果任意一个地方有这个值,则返回这个值 + * 两个地方都没有token,则抛出没有登录用户异常 + */ + public static String getRequestToken() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + + //如果请求是在http环境下,则有request对象 + String authorization = request.getHeader("Authorization"); + if (ToolUtil.isNotEmpty(authorization)) { + //去掉token前缀 + Integer splitSpace = authorization.indexOf(' '); + if (splitSpace > -1) + return authorization.substring(splitSpace); + return authorization; + } + String token = request.getParameter("token"); + if (ToolUtil.isNotEmpty(token)) { + return token; + } + Cookie cookie = getCookie("token"); + if (cookie != null) { + return cookie.getValue(); + } + return null; + } + + /* + * 获取请求唯一标识 + * */ + public static String getRequestNo() { + HttpServletRequest request = HttpContext.getRequest(); + //默认从请求头部获取 Request-No + String requestNo = request.getHeader(RosesConstants.REQUEST_NO_HEADER_NAME); + if (ToolUtil.isEmpty(requestNo)) { + // 从响应头部获取 + HttpServletResponse response = HttpContext.getResponse(); + requestNo = response.getHeader(RosesConstants.REQUEST_NO_HEADER_NAME); + if (ToolUtil.isEmpty(requestNo)) { + //生成唯一请求号uuid + requestNo = IdWorker.getIdStr(); + } + } + + return requestNo; + } + } diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpSessionContext.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpSessionContext.java index e751df1b856b5a38374799368c635e661a7b2263..b50d293c7307c9de62e7b44a47d180e818aef6ae 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpSessionContext.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/HttpSessionContext.java @@ -21,7 +21,7 @@ import javax.servlet.http.HttpSession; * 非Controller中获取当前session的工具类 * * @author fengshuonan - * @date 2016年11月28日 上午10:24:31 + * @since 2016年11月28日 上午10:24:31 */ public class HttpSessionContext { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MD5Util.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MD5Util.java index f938b3d01ba378cc16f13cf0a5e6e0380316948a..c5efb7eac136487b25008e950230abf90c7c2325 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MD5Util.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MD5Util.java @@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException; * MD5加密类(封装jdk自带的md5加密方法) * * @author fengshuonan - * @date 2016年12月2日 下午4:14:22 + * @since 2016年12月2日 下午4:14:22 */ public class MD5Util { @@ -26,8 +26,9 @@ public class MD5Util { private static String encodeHex(byte[] bytes) { StringBuffer buffer = new StringBuffer(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { - if (((int) bytes[i] & 0xff) < 0x10) + if (((int) bytes[i] & 0xff) < 0x10) { buffer.append("0"); + } buffer.append(Long.toString((int) bytes[i] & 0xff, 16)); } return buffer.toString(); diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MvcAdapter.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MvcAdapter.java index c76dc128739fe6e3b9d027c87d1213468d506ad4..707ae2deced6a63b7eea5fff2c1767c30056eb49 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MvcAdapter.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/MvcAdapter.java @@ -31,7 +31,7 @@ import java.util.List; * 统一请求转化器默认配置 * * @author fengshuonan - * @Date 2018/2/24 14:39 + * @since 2018/2/24 14:39 */ public class MvcAdapter { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/NumUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/NumUtil.java index 273a9cc1c12be8dd433ba5c9d94f046d2eaecc90..8857372318178c25889af3159765905c88e7c743 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/NumUtil.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/NumUtil.java @@ -9,7 +9,7 @@ import java.text.NumberFormat; * 数字格式化的类 * * @author fengshuonan - * @date 2016年11月30日 下午5:58:40 + * @since 2016年11月30日 下午5:58:40 */ public class NumUtil { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/RenderUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/RenderUtil.java index c16fbad049adfaccb5c81512d6963c0a696616f1..98b30f9aab0207a3ebfed16e64c43f073ea0f987 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/RenderUtil.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/RenderUtil.java @@ -27,7 +27,7 @@ import java.io.PrintWriter; * 渲染工具类 * * @author fengshuonan - * @date 2017-08-25 14:13 + * @since 2017-08-25 14:13 */ public class RenderUtil { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SpringContextHolder.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SpringContextHolder.java index 73012e6521398986044bccea48237d2377908387..7167c664d691b45bade1ba0bb42189b7c5b2e677 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SpringContextHolder.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SpringContextHolder.java @@ -23,7 +23,7 @@ import org.springframework.context.ApplicationContextAware; * Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean * * @author fengshuonan - * @date 2016年11月27日 下午3:32:11 + * @since 2016年11月27日 下午3:32:11 */ public class SpringContextHolder implements ApplicationContextAware { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SqlUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SqlUtil.java index d3c831abdcd732cdc87410b59b73becfeb198987..059a66e0e41c59ab83ec3a6df8300416e374a51b 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SqlUtil.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/SqlUtil.java @@ -22,7 +22,7 @@ import java.util.List; * sql语句工具类 * * @author fengshuonan - * @date 2016年12月6日 下午1:01:54 + * @since 2016年12月6日 下午1:01:54 */ public class SqlUtil { diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/ToolUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/ToolUtil.java index 43534d18a158d87618fe6f83cb7f43a800d066c5..f000184e085d93f4e8c2001d46a0135966ea1625 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/ToolUtil.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/ToolUtil.java @@ -42,7 +42,7 @@ import java.util.Random; * 高频方法集合 * * @author fengshuonan - * @Date 2018/3/18 21:55 + * @since 2018/3/18 21:55 */ public class ToolUtil extends ValidateUtil { @@ -55,7 +55,7 @@ public class ToolUtil extends ValidateUtil { * 获取随机字符,自定义长度 * * @author fengshuonan - * @Date 2018/3/18 21:55 + * @since 2018/3/18 21:55 */ public static String getRandomString(int length) { String base = "abcdefghijklmnopqrstuvwxyz0123456789"; @@ -72,7 +72,7 @@ public class ToolUtil extends ValidateUtil { * md5加密(加盐) * * @author fengshuonan - * @Date 2018/3/18 21:56 + * @since 2018/3/18 21:56 */ public static String md5Hex(String password, String salt) { return md5Hex(password + salt); @@ -82,7 +82,7 @@ public class ToolUtil extends ValidateUtil { * md5加密(不加盐) * * @author fengshuonan - * @Date 2018/3/18 21:56 + * @since 2018/3/18 21:56 */ public static String md5Hex(String str) { try { @@ -90,10 +90,11 @@ public class ToolUtil extends ValidateUtil { byte[] bs = md5.digest(str.getBytes()); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < bs.length; i++) { - if (Integer.toHexString(0xFF & bs[i]).length() == 1) + if (Integer.toHexString(0xFF & bs[i]).length() == 1) { md5StrBuff.append("0").append(Integer.toHexString(0xFF & bs[i])); - else + } else { md5StrBuff.append(Integer.toHexString(0xFF & bs[i])); + } } return md5StrBuff.toString(); } catch (Exception e) { @@ -105,7 +106,7 @@ public class ToolUtil extends ValidateUtil { * 过滤掉掉字符串中的空白 * * @author fengshuonan - * @Date 2018/3/22 15:16 + * @since 2018/3/22 15:16 */ public static String removeWhiteSpace(String value) { if (isEmpty(value)) { @@ -119,7 +120,7 @@ public class ToolUtil extends ValidateUtil { * 获取某个时间间隔以前的时间 时间格式:yyyy-MM-dd HH:mm:ss * * @author stylefeng - * @Date 2018/5/8 22:05 + * @since 2018/5/8 22:05 */ public static String getCreateTimeBefore(int seconds) { long currentTimeInMillis = Calendar.getInstance().getTimeInMillis(); @@ -132,7 +133,7 @@ public class ToolUtil extends ValidateUtil { * 获取异常的具体信息 * * @author fengshuonan - * @Date 2017/3/30 9:21 + * @since 2017/3/30 9:21 * @version 2.0 */ public static String getExceptionMsg(Throwable e) { @@ -153,7 +154,7 @@ public class ToolUtil extends ValidateUtil { * 获取应用名称 * * @author fengshuonan - * @Date 2018/5/12 上午10:24 + * @since 2018/5/12 上午10:24 */ public static String getApplicationName() { try { @@ -175,22 +176,22 @@ public class ToolUtil extends ValidateUtil { * 获取ip地址 * * @author fengshuonan - * @Date 2018/5/15 下午6:36 + * @since 2018/5/15 下午6:36 */ public static String getIP() { try { - StringBuilder IFCONFIG = new StringBuilder(); + StringBuilder ifconfig = new StringBuilder(); for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) { - IFCONFIG.append(inetAddress.getHostAddress().toString() + "\n"); + ifconfig.append(inetAddress.getHostAddress().toString() + "\n"); } } } - return IFCONFIG.toString(); + return ifconfig.toString(); } catch (SocketException ex) { ex.printStackTrace(); @@ -207,7 +208,7 @@ public class ToolUtil extends ValidateUtil { * 拷贝属性,为null的不拷贝 * * @author fengshuonan - * @Date 2018/7/25 下午4:41 + * @since 2018/7/25 下午4:41 */ public static void copyProperties(Object source, Object target) { BeanUtil.copyProperties(source, target, CopyOptions.create().setIgnoreNullValue(true).ignoreError()); @@ -217,7 +218,7 @@ public class ToolUtil extends ValidateUtil { * 判断是否是windows操作系统 * * @author stylefeng - * @Date 2017/5/24 22:34 + * @since 2017/5/24 22:34 */ public static Boolean isWinOs() { String os = System.getProperty("os.name"); @@ -232,7 +233,7 @@ public class ToolUtil extends ValidateUtil { * 获取临时目录 * * @author stylefeng - * @Date 2017/5/24 22:35 + * @since 2017/5/24 22:35 */ public static String getTempPath() { return System.getProperty("java.io.tmpdir"); @@ -242,7 +243,7 @@ public class ToolUtil extends ValidateUtil { * 把一个数转化为int * * @author fengshuonan - * @Date 2017/11/15 下午11:10 + * @since 2017/11/15 下午11:10 */ public static Integer toInt(Object val) { if (val instanceof Double) { @@ -258,7 +259,7 @@ public class ToolUtil extends ValidateUtil { * 是否为数字 * * @author fengshuonan - * @Date 2017/11/15 下午11:10 + * @since 2017/11/15 下午11:10 */ public static boolean isNum(Object obj) { try { @@ -273,7 +274,7 @@ public class ToolUtil extends ValidateUtil { * 获取项目路径 * * @author fengshuonan - * @Date 2017/11/15 下午11:10 + * @since 2017/11/15 下午11:10 */ public static String getWebRootPath(String filePath) { try { @@ -295,7 +296,7 @@ public class ToolUtil extends ValidateUtil { * 获取文件后缀名 不包含点 * * @author fengshuonan - * @Date 2017/11/15 下午11:10 + * @since 2017/11/15 下午11:10 */ public static String getFileSuffix(String fileWholeName) { if (ToolUtil.isEmpty(fileWholeName)) { @@ -309,7 +310,7 @@ public class ToolUtil extends ValidateUtil { * 判断一个对象是否是时间类型 * * @author stylefeng - * @Date 2017/4/18 12:55 + * @since 2017/4/18 12:55 */ public static String dateType(Object o) { if (o instanceof Date) { @@ -323,7 +324,7 @@ public class ToolUtil extends ValidateUtil { * 当前时间 * * @author stylefeng - * @Date 2017/5/7 21:56 + * @since 2017/5/7 21:56 */ public static String currentTime() { return DateUtil.formatDateTime(new Date()); diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/DistributedLocker.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/DistributedLocker.java new file mode 100644 index 0000000000000000000000000000000000000000..84b38972befe0e61772708608f00f0ad87878872 --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/DistributedLocker.java @@ -0,0 +1,14 @@ +package cn.stylefeng.roses.core.util.redisson; + +import java.util.concurrent.TimeUnit; + +public interface DistributedLocker { + + void lock(String lockKey); + + void unlock(String lockKey); + + void lock(String lockKey, int timeout); + + void lock(String lockKey, TimeUnit unit, int timeout); +} diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissLockUtil.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissLockUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..e738698d0658ae835e03b4ebfca0b8e83fe198c6 --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissLockUtil.java @@ -0,0 +1,46 @@ +package cn.stylefeng.roses.core.util.redisson; + +import java.util.concurrent.TimeUnit; + + +/** + * redis分布式锁工具类 + * + * @author ko + */ +public class RedissLockUtil { + private static DistributedLocker redissLock; + + public static void setLocker(DistributedLocker locker) { + redissLock = locker; + } + + public static void lock(String lockKey) { + redissLock.lock(lockKey); + } + + public static void unlock(String lockKey) { + redissLock.unlock(lockKey); + } + + /** + * 带超时的锁 + * + * @param lockKey + * @param timeout 超时时间 单位:秒 + */ + public static void lock(String lockKey, int timeout) { + redissLock.lock(lockKey, timeout); + } + + /** + * 带超时的锁 + * + * @param lockKey + * @param unit 时间单位 + * @param timeout 超时时间 + */ + public static void lock(String lockKey, TimeUnit unit, int timeout) { + redissLock.lock(lockKey, unit, timeout); + } +} \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissonDistributedLocker.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissonDistributedLocker.java new file mode 100644 index 0000000000000000000000000000000000000000..e1f1ae829984e3759326319e745d5d5fe478296d --- /dev/null +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/util/redisson/RedissonDistributedLocker.java @@ -0,0 +1,43 @@ +package cn.stylefeng.roses.core.util.redisson; + +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +public class RedissonDistributedLocker implements DistributedLocker { + + private RedissonClient redissonClient; + + @Override + public void lock(String lockKey) { + RLock lock = redissonClient.getLock(lockKey); + lock.lock(); + } + + @Override + public void unlock(String lockKey) { + RLock lock = redissonClient.getLock(lockKey); + if (lock.isLocked()) { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + @Override + public void lock(String lockKey, int leaseTime) { + RLock lock = redissonClient.getLock(lockKey); + lock.lock(leaseTime, TimeUnit.SECONDS); + } + + @Override + public void lock(String lockKey, TimeUnit unit, int timeout) { + RLock lock = redissonClient.getLock(lockKey); + lock.lock(timeout, unit); + } + + public void setRedissonClient(RedissonClient redissonClient) { + this.redissonClient = redissonClient; + } +} \ No newline at end of file diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/xss/WafKit.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/xss/WafKit.java index 0f01459ffd9ade456699924866fa5d47e58df0e5..458bab0e4874829072757b2ead33126a1c555946 100644 --- a/kernel-core/src/main/java/cn/stylefeng/roses/core/xss/WafKit.java +++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/xss/WafKit.java @@ -17,11 +17,13 @@ package cn.stylefeng.roses.core.xss; import java.util.regex.Pattern; +import static java.util.regex.Pattern.*; + /** * Web防火墙工具类 *

* @author hubin - * @Date 2014-5-8 + * @since 2014-5-8 */ public class WafKit { @@ -43,7 +45,7 @@ public class WafKit { rlt = value.replaceAll("", ""); // Avoid anything between script tags - Pattern scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); + Pattern scriptPattern = compile("", CASE_INSENSITIVE); rlt = scriptPattern.matcher(rlt).replaceAll(""); // Avoid anything in a src='...' type of expression @@ -56,35 +58,35 @@ public class WafKit { rlt = scriptPattern.matcher(rlt).replaceAll("");*/ // Remove any lonesome tag - scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); + scriptPattern = compile("", CASE_INSENSITIVE); rlt = scriptPattern.matcher(rlt).replaceAll(""); // Remove any lonesome