提交 7b42ba3e authored 作者: liupengfei's avatar liupengfei

--no commit message

上级 849aa409
package com.zrqx.core.commons.aspect;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
/**
*
* @author lpf
* @date 2018年12月26日下午5:25:20
*/
@Aspect
@Order(1)
@Configuration
public class TxAdviceInterceptor {
private static final int TX_METHOD_TIMEOUT = 120;
public static final String AOP_POINTCUT_EXPRESSION = "(execution(* com.zrqx..service..*Impl.*(..)))";
@Autowired
private PlatformTransactionManager transactionManager;
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionInterceptor txAdvice() {
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
/*只读事务,不做更新操作*/
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED );
/*当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务*/
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
requiredTx.setRollbackRules(
Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
requiredTx.setTimeout(TX_METHOD_TIMEOUT);
Map<String, TransactionAttribute> txMap = new HashMap<>();
txMap.put("add*", requiredTx);
txMap.put("save*", requiredTx);
txMap.put("insert*", requiredTx);
txMap.put("update*", requiredTx);
txMap.put("batch*", requiredTx);
txMap.put("delete*", requiredTx);
txMap.put("get*", readOnlyTx);
txMap.put("query*", readOnlyTx);
txMap.put("select*", readOnlyTx);
txMap.put("page*", readOnlyTx);
txMap.put("list*", readOnlyTx);
source.setNameMap( txMap );
TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
return txAdvice;
}
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
//return new DefaultPointcutAdvisor(pointcut, txAdvice);
}
}
\ No newline at end of file
package com.zrqx.core.commons.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zrqx.core.enums.EnvironmentEnum;
import com.zrqx.core.enums.env.EnvironmentInterface;
import com.zrqx.core.enums.env.impl.ProductEnvironmentImpl;
import com.zrqx.core.enums.env.impl.TestEnvironmentImpl;
/**
* 根据环境或者服务名称有效的类
* @author lpf
* @date 2019年5月15日下午3:58:54
*/
@Data
@Configuration
public class ConfigServerParams {
/** 服务环境 {@link EnvironmentEnum} */
@Value("${server.environment}")
private String env;
@Bean
public EnvironmentInterface environmentInterface(){
if (isTest()) {
return new TestEnvironmentImpl();
}
return new ProductEnvironmentImpl();
}
public boolean isTest(){
return EnvironmentEnum.TEST.getCode().equals(env);
}
}
package com.zrqx.core.commons.config;
import java.lang.reflect.Method;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* redis 配置类
* @author pc
*
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
/*@SuppressWarnings("rawtypes")
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
// 设置缓存过期时间
// rcm.setDefaultExpiration(60);//秒
return rcm;
}*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
//.entryTtl(Duration.ofHours(1)) // 设置缓存有效期一小时
;
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// key序列化方式,但是如果方法上有Long等非String类型的话,会报类型转换错误
// 所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer
RedisSerializer<String> redisSerializer = new StringRedisSerializer();// Long类型不可以会出现异常信息;
redisTemplate.setKeySerializer(redisSerializer);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
\ No newline at end of file
package com.zrqx.core.commons.config;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.core.convert.converter.Converter;
/**
* 字符串转换为Date
* @author lpf
* @date 2018年7月10日下午4:02:01
*/
public class StringToDateConverter implements Converter<String, Date> {
private static final List<String> formarts = new ArrayList<String>(4);
static{
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd HH:mm:ss");
}
@Override
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}$")){
return parseDate(source, formarts.get(0));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return parseDate(source, formarts.get(1));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(2));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(3));
}else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
public Date parseDate(String dateStr, String format) {
Date date=null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = (Date) dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
}
package com.zrqx.core.commons.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import com.zrqx.core.enums.env.EnvironmentInterface;
import com.zrqx.core.util.spring.SpringContextUtils;
/**
* 访问地址
* http://ip:port/swagger-ui.html
最常用的5个注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
其它若干
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiClass
@ApiError
@ApiErrors
@ApiParamImplicit
@ApiParamsImplicit
*/
@EnableSwagger2
@Configuration
public class Swagger2Config {
@Value("${spring.application.name}")
private String serverName;
@Autowired
private EnvironmentInterface environmentInterface;
@Bean
public Docket createRestApi() {
return environmentInterface.createRestApi(apiInfo());
}
//构建 api文档的详细信息函数
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title(serverName + " 测试使用 Swagger2 构建RESTful API")
//描述
.description(serverName + "服务 API 描述")
//创建人
//.contact(new Contact("", "www.baidu.com", "cxinchang@126.com"))
//版本号
.version("4.0")
.build();
}
}
\ No newline at end of file
package com.zrqx.core.commons.config;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.support.FormattingConversionServiceFactoryBean;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.zrqx.core.commons.interceptor.InterceptorConfig;
import com.zrqx.core.constant.sysuser.SysUserRequestPath;
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
/**
* 跨域支持
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowCredentials(false).maxAge(3600);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new InterceptorConfig()).addPathPatterns(SysUserRequestPath.BG + "/**")
.excludePathPatterns(SysUserRequestPath.BG+SysUserRequestPath.PERMISSIONS+SysUserRequestPath.LOGIN);
}
@Bean
public Converter<String, Date> stringToDateConverter() {
StringToDateConverter conver = new StringToDateConverter();
return conver;
}
@Bean
public FormattingConversionServiceFactoryBean conversionService() {
FormattingConversionServiceFactoryBean bean = new FormattingConversionServiceFactoryBean();
Set<Converter<?, ?>> set = new HashSet<Converter<?, ?>>();
set.add(stringToDateConverter());
bean.setConverters(set);
return bean;
}
public ConfigurableWebBindingInitializer webBindingInitializer(@Autowired ConfigurableWebBindingInitializer config) {
config.setConversionService(conversionService().getObject());
return config;
}
}
package com.zrqx.core.commons.interceptor;
import com.zrqx.core.enums.ResponseCodeEnum;
import com.zrqx.core.enums.env.EnvironmentInterface;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.exception.ExceptionUtils;
import com.zrqx.core.util.response.CallBack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
/**
* 异常处理通知
* @author lpf
* @date 2019年10月29日上午11:01:49
*/
@ControllerAdvice
public class CustomExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
@Autowired
private EnvironmentInterface environmentInterface;
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Object handlerException(HttpServletRequest request,HttpServletResponse response,Exception e){
e.printStackTrace();
String errorMsg = ExceptionUtils.getMessage("请求地址:" + request.getRequestURI() +";", e);
logger.error(errorMsg, e);
return CallBack.exception(errorMsg);
}
@ExceptionHandler(BaseException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request,HttpServletResponse response,BaseException e){
logger.error(e.getMessage(), e);
String errorMsg = ExceptionUtils.getMessage("请求地址:" + request.getRequestURI() +";", e);
return CallBack.baseException(errorMsg);
}
@ExceptionHandler(SQLException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Object handlerException(HttpServletRequest request, SQLException e){
logger.error("数据库异常:"+e.getMessage(),e);
String errorMsg = environmentInterface.handlerException(request, e);
return CallBack.exception(errorMsg);
}
}
\ No newline at end of file
package com.zrqx.core.commons.interceptor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.RequestInterceptor;
import feign.RequestTemplate;
@Component
public class CustomRequestInterceptor implements RequestInterceptor {
@Autowired
private ObjectMapper objectMapper;
@Override
public void apply(RequestTemplate template) {
// feign 不支持 GET 方法传 POJO, json body转query
if (template.method().equals("GET") && template.body() != null) {
try {
JsonNode jsonNode = objectMapper.readTree(template.body());
template.body(null);
Map<String, Collection<String>> queries = new HashMap<>();
buildQuery(jsonNode, "", queries);
template.queries(queries);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
if (!jsonNode.isContainerNode()) { // 叶子节点
if (jsonNode.isNull()) {
return;
}
Collection<String> values = queries.get(path);
if (null == values) {
values = new ArrayList<>();
queries.put(path, values);
}
values.add(jsonNode.asText());
return;
}
if (jsonNode.isArray()) { // 数组节点
Iterator<JsonNode> it = jsonNode.elements();
while (it.hasNext()) {
buildQuery(it.next(), path, queries);
}
} else {
Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
while (it.hasNext()) {
Map.Entry<String, JsonNode> entry = it.next();
if (StringUtils.hasText(path)) {
buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
} else { // 根节点
buildQuery(entry.getValue(), entry.getKey(), queries);
}
}
}
}
}
package com.zrqx.core.commons.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* Feign配置
* 使用FeignClient进行服务间调用,传递headers信息
* @author lw
* @date 2018年10月17日下午2:48:44
*/
@Component
@Configuration
public class FeignHeaderInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
// 前台token
if(request.getHeader("Y-Token") != null){
requestTemplate.header("Y-Token", request.getHeader("Y-Token"));
}
// 后台token
if(request.getHeader("X-Token") != null){
requestTemplate.header("X-Token", request.getHeader("X-Token"));
}
// 请求标识
if(request.getHeader("sign") != null){
requestTemplate.header("sign", request.getHeader("sign"));
}
}
}
}
package com.zrqx.core.commons.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class InterceptorConfig implements HandlerInterceptor{
private static final Logger logger = LoggerFactory.getLogger(InterceptorConfig.class);
/**
* 进入controller层之前拦截请求
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info("--------------处理请求之前的处理操作---------------");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
logger.info("--------------处理请求完成后视图渲染之前的处理操作---------------");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.info("---------------视图渲染之后的操作--------------------------");
}
}
\ No newline at end of file
package com.zrqx.core.commons.lcn;
/**
* create by lorne on 2017/11/18
*/
// @Service
public class TxManagerHttpRequestServiceImpl {}/*implements TxManagerHttpRequestService{
private static final Logger log = LoggerFactory.getLogger(TxManagerHttpRequestServiceImpl.class);
@Override
public String httpGet(String url) {
log.info("httpGet-start");
String res = HttpUtils.get(url);
log.info("httpGet-end");
return res;
}
@Override
public String httpPost(String url, String params) {
log.info("httpPost-start");
String res = HttpUtils.post(url,params);
log.info("httpPost-end");
return res;
}
}*/
package com.zrqx.core.commons.lcn;
/**
* create by lorne on 2017/11/18
*/
// @Service
public class TxManagerTxUrlServiceImpl {} /*implements TxManagerTxUrlService{
private static final Logger log = LoggerFactory.getLogger(TxManagerTxUrlServiceImpl.class);
@Value("${tm.manager.url}")
private String url;
@Override
public String getTxUrl() {
log.info("load tm.manager.url ");
return url;
}
}
*/
\ No newline at end of file
package com.zrqx.core.commons.lcn;
//@Aspect
//@Component
public class TxTransactionInterceptor {}/*implements Ordered {
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
@Autowired
private TxManagerInterceptor txManagerInterceptor;
@Around(TxAdviceInterceptor.AOP_POINTCUT_EXPRESSION)
public Object around(ProceedingJoinPoint point)throws Throwable{
return txManagerInterceptor.around(point);
}
}*/
package com.zrqx.core.commons.redis;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.JsonUtil.JsonUtil;
import com.zrqx.core.util.datatype.StringUtils;
/**
* redis 基础操作类
* @author lpf
* @date 2019年10月29日上午9:21:31
*/
public abstract class BaseRedis {
private final static Logger log = LoggerFactory.getLogger(BaseRedis.class);
protected StringRedisTemplate stringRedisTemplate;
private final String SET_ERROR = "redis 存储信息时错误";
private final String GET_NULL_ERROR = "redis获取信息时为空;";
protected abstract void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate);
/**
* 添加到redis
* @param token
* Key
* @param obj
* Value
* @param timeout
* 过期时间
* @param unit
* TimeUnitEnum 时间格式
* @throws IOException
*/
public void set(String token, Object obj, long timeout,TimeUnit unit) throws BaseException {
try {
stringRedisTemplate.opsForValue().set(token,fmtObj(obj),timeout,unit);
} catch (Exception e) {
this.exception(SET_ERROR, e);
}
}
public void set(String token, Object obj, long timeout) throws IOException {
try {
stringRedisTemplate.opsForValue().set(token,fmtObj(obj),timeout,TimeUnit.SECONDS);
} catch (Exception e) {
this.exception(SET_ERROR, e);
}
}
private void exception(String error, Exception e) throws BaseException{
log.error(error, e);
throw new BaseException(error, e);
}
public String fmtObj(Object obj) throws IOException {
return obj instanceof String ? obj.toString():JsonUtil.bean2Json(obj);
}
public Set<String> keys(String k) {
if (StringUtils.isBlank(k)) {
return new HashSet<String>();
}
return stringRedisTemplate.keys(k);
}
/**
* 获取全部keys
* @return
* @author lpf
* @date: 2019年10月29日 上午11:00:10
*/
public Set<String> keys(){
return this.keys("*");
}
/**
* 根据key删除redis中的数据
* @param key 不能为null
* @throws IOException
*/
public void delete(String key){
stringRedisTemplate.delete(key);
}
public void deletePattern(String key) {
Set<String> set = keys(key);
set.forEach(this :: delete);
}
/**
* 更换redis库
* @param num
* @author lpf
* @date: 2019年10月29日 上午9:46:39
*/
public void updateDatebase(int num) {
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) stringRedisTemplate.getConnectionFactory();
jedisConnectionFactory.setDatabase(num);
stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);
}
/**
* 查询key 的值
* @param key
* @return
* @author lpf
* @date: 2019年10月29日 上午9:49:53
*/
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
public <T> T get(String key, Class<T> clazz) {
String value = this.get(key);
if (StringUtils.isBlank(value)) {
String error = GET_NULL_ERROR + "key:" + key;
this.exception(error, new NullPointerException(error));
}
try {
return JsonUtil.json2Bean(value, clazz);
} catch (Exception e) {
this.exception(GET_NULL_ERROR + "解析JSON失败,value:"+ value + ";class:" + clazz, e);
}
return null;
}
}
package com.zrqx.core.commons.redis;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.form.member.fg.permissions.LoginMemberInfo;
import com.zrqx.core.model.sysuser.user.User;
/**
* Redis消息管理 ,调用时不能用多线程调用
* @author lpf
*/
@Component
public class Redis extends BaseRedis{
@Override
protected void setStringRedisTemplate(@Autowired StringRedisTemplate stringRedisTemplate) {
super.stringRedisTemplate = stringRedisTemplate;
}
private final String FG_TOKEN = "y-token";
private final String BG_TOKEN = "x-token";
public String getBgToken() {
return this.getToken(BG_TOKEN);
}
public String getFgToken() {
return this.getToken(FG_TOKEN);
}
public User getUser() {
return super.get(getBgToken(), User.class);
}
public LoginMemberInfo getMember() {
return super.get(getFgToken(), LoginMemberInfo.class);
}
public String getToken(String tokenName) {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
String token = null;
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
if(key.toLowerCase().equals(tokenName)){
token=request.getHeader(key);
}
}
if (token == null) {
throw new BaseException("请求头:" + tokenName + "为空,获取不到用户");
}
return token;
}
}
package com.zrqx.core.enums;
import com.zrqx.core.constant.resource.ValidateMessage;
import com.zrqx.core.exception.ParameterValidateException;
import com.zrqx.core.exception.BaseException;
public enum BooleanStatusEnum {
......@@ -33,7 +33,7 @@ public enum BooleanStatusEnum {
return true;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
/**
......@@ -51,7 +51,7 @@ public enum BooleanStatusEnum {
return BooleanStatusEnum.name;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
/**
......@@ -69,7 +69,7 @@ public enum BooleanStatusEnum {
return BooleanStatusEnum.code;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
public String getCode() {
......
package com.zrqx.core.enums;
import java.util.HashMap;
import java.util.stream.Stream;
import com.zrqx.core.enums.interfaces.EnumsInterface;
/**
* 0:测试环境
* 1:生产环境
* @author lpf
* @date 2019年3月22日上午10:04:17
*/
public enum EnvironmentEnum implements EnumsInterface<String>{
/** 测试环境 */
TEST("0","测试环境"),
/** 生产环境 */
PRODUCT("1","生产环境");
//状态码
private final String code;
private final String name;
private static final HashMap<String,String> MAP = new HashMap<String,String>();
static {
stream().forEach(e -> {
MAP.put(e.code, e.name);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public static Stream<EnvironmentEnum> stream(){
return Stream.of(values());
}
private EnvironmentEnum(String code, String name) {
this.code = code;
this.name = name;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public static boolean isExist(String code) {
return stream().anyMatch(e -> e.code.equals(code));
}
/**
* 通过ID获取中文名称
* @param code
* @return
*/
public static String getName(String code) {
return stream().filter(e -> e.code.equals(code)).findFirst().map(e -> e.name).orElse(null);
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public static HashMap<String, String> getMap() {
return MAP;
}
}
package com.zrqx.core.enums;
import com.zrqx.core.constant.resource.ValidateMessage;
import com.zrqx.core.exception.ParameterValidateException;
import com.zrqx.core.exception.BaseException;
/**
* 链接类型枚举
......@@ -37,7 +37,7 @@ public enum LinkTypeEnum {
return true;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
/**
......@@ -55,7 +55,7 @@ public enum LinkTypeEnum {
return LinkTypeEnum.name;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
/**
......@@ -73,7 +73,7 @@ public enum LinkTypeEnum {
return LinkTypeEnum.code;
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
public String getCode() {
......
......@@ -10,20 +10,14 @@ package com.zrqx.core.enums;
*/
public enum ResponseCodeEnum {
/** 0,操作成功" */
OK(0,"操作成功"),
/** 200 ,操作成功" */
OK(200,"操作成功"),
/** -1,操作失败" */
FAIL(-1,"操作失败"),
/** -2,验证不通过" */
VALIDATE(-2,"验证不通过"),
/** -3,服务器异常" */
EXCEPTION(-3,"服务器异常"),
/** -4 接口调用 参数类型转换异常*/
BIND_EXCEPTION(-4,"不合法的参数"),
/** -5 接口调用缺少必填参数 */
MISS_EXCEPTION(-5,"缺少必填参数"),
/** -6 登录过期或未登录 */
NO_LOGIN(-6,"请重新登录");
/** 500,服务器异常" */
EXCEPTION(500,"服务器异常"),
/** 600, BaseException */
BASE_EXCEPTION(600, "BaseException");
private final int code;
private final String msg;
private ResponseCodeEnum(int code, String msg) {
......
package com.zrqx.core.enums.env;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import com.zrqx.core.commons.config.ConfigServerParams;
import com.zrqx.core.enums.EnvironmentEnum;
import com.zrqx.core.enums.interfaces.EnumsBindBean;
/**
* {@link ConfigServerParams}
* 服务环境绑定的操作
* @author lpf
* @date 2019年3月22日上午11:34:19
*/
public interface EnvironmentInterface extends EnumsBindBean<EnvironmentEnum> {
/**
* swaager-ui对象
* @return
* @author lpf
* @date: 2019年3月22日 下午1:42:20
*/
Docket createRestApi(ApiInfo info);
/**
* sql异常处理方案 测试环境需要返回出去,生产环境sql异常不能返回出去。
* @param request
* @param e
* @return
* @author lpf
* @date: 2019年10月29日 上午11:48:40
*/
String handlerException(HttpServletRequest request, SQLException e);
/**
* 生成样书申请编码
* 测试环境: ZRQX + YS + 2随机字母 + yyyyMMddHHmmssSSSS
* 生产环境: YS + 2随机字母 + yyyyMMddHHmmssSSSS
* @return
* @author lpf
* @date: 2019年5月15日 下午3:27:13
*/
String createSampleBookApplyCode();
/**
* 生成订单号
* Z + 2随机字母 + yyyyMMddHHmmssSSSS
* @return
* @author lpf
* @date: 2019年8月7日 上午9:47:38
*/
String createOrderCode();
}
package com.zrqx.core.enums.env.impl;
import java.util.function.Consumer;
import com.zrqx.core.enums.env.EnvironmentInterface;
import com.zrqx.core.util.datatype.CodeUtils;
import com.zrqx.core.util.datatype.StringUtil;
public abstract class AbstractEnvironment implements EnvironmentInterface {
@Override
public String createSampleBookApplyCode() {
return this.initRandomOrderCode(b -> b.append("YS"));
}
@Override
public String createOrderCode() {
return this.initRandomOrderCode(b -> b.append(StringUtil.getRandomEnSign(1,2,0)));
}
/**
* 基础生成编码规则
* 测试环境: ZRQX + 2随机字母 + yyyyMMddHHmmssSSSS
* 生产环境: 2随机字母 + yyyyMMddHHmmssSSSS
* @return
* @author ydm
* @date: 2018年8月13日 下午2:31:44
*/
protected String initRandomOrderCode(Consumer<StringBuffer> before) {
Consumer<StringBuffer> first = this :: beforeCreateCode;
Consumer<StringBuffer> joinConsumer = first.andThen(before);
return CodeUtils.beforeInitRandomOrderCode(joinConsumer);
}
/**
* 创建编码之前执行程序, 返回值用于拼接到编码上(返回值+创建编码)
* @return
* @author lpf
* @date: 2019年5月15日 下午3:31:18
*/
protected abstract void beforeCreateCode(StringBuffer code);
}
package com.zrqx.core.enums.env.impl;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import com.zrqx.core.enums.EnvironmentEnum;
import com.zrqx.core.enums.ResponseCodeEnum;
import com.zrqx.core.enums.env.EnvironmentInterface;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.model.sysuser.user.User;
/**
* 生产环境绑定操作
* @author lpf
* @date 2019年3月22日上午11:40:41
*/
public class ProductEnvironmentImpl extends AbstractEnvironment{
@Override
public List<EnvironmentEnum> getEnums() {
return Arrays.asList(EnvironmentEnum.PRODUCT);
}
@Override
public Docket createRestApi(ApiInfo info) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(info)
.select()
//为当前包路径 不存在的包路径
.apis(RequestHandlerSelectors.basePackage("com.zrqx.prod"))
.paths(PathSelectors.any())
.build();
}
@Override
protected void beforeCreateCode(StringBuffer code) {
}
@Override
public String handlerException(HttpServletRequest request, SQLException e) {
return null;
}
}
package com.zrqx.core.enums.env.impl;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zrqx.core.enums.EnvironmentEnum;
import com.zrqx.core.util.exception.ExceptionUtils;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* 测试环境操作
* @author lpf
* @date 2019年3月22日上午11:35:54
*/
public class TestEnvironmentImpl extends AbstractEnvironment {
private static final Logger logger = LoggerFactory.getLogger(TestEnvironmentImpl.class);
@Override
public List<EnvironmentEnum> getEnums() {
return Arrays.asList(EnvironmentEnum.TEST);
}
@Override
public Docket createRestApi(ApiInfo info) {
//添加head参数start
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<Parameter>();
tokenPar.name("y-token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
ParameterBuilder tokenPar1 = new ParameterBuilder();
tokenPar1.name("x-token").description("后台令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
pars.add(tokenPar1.build());
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(info)
.select()
//为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.zrqx"))
.paths(PathSelectors.any())
.build()
.globalOperationParameters(pars);
}
@Override
protected void beforeCreateCode(StringBuffer code) {
code.append("Z");
}
@Override
public String handlerException(HttpServletRequest request, SQLException e) {
return ExceptionUtils.getMessage("请求地址:" + request.getRequestURI() +";", e);
}
}
......@@ -4,7 +4,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import com.zrqx.core.exception.BusinessValidateException;
import com.zrqx.core.exception.BaseException;
/**
* 订单发票状态<br>
......@@ -95,7 +95,7 @@ public enum OrderInvoiceStatusEnum {
public static boolean isCanMake(String status){
if (status == null) {
// 抛异常,需核实是否进行了初始化开票状态
throw new BusinessValidateException("OrderInvoiceStatusEnum#isCanMake开票状态为空");
throw new BaseException("OrderInvoiceStatusEnum#isCanMake开票状态为空");
}
List<OrderInvoiceStatusEnum> canMakeList = canMake();
for (OrderInvoiceStatusEnum can : canMakeList) {
......
......@@ -3,7 +3,7 @@ package com.zrqx.core.enums.resource;
import java.util.HashMap;
import com.zrqx.core.constant.resource.ValidateMessage;
import com.zrqx.core.exception.ParameterValidateException;
import com.zrqx.core.exception.BaseException;
/**
* 医著高级查询----筛选
......@@ -104,7 +104,7 @@ public enum EbookOptionEnum {
return bookTypeEnum.getCode();
}
}
throw new ParameterValidateException(ValidateMessage.STATUS_EXCEPTION);
throw new BaseException(ValidateMessage.STATUS_EXCEPTION);
}
public String getCode() {
......
package com.zrqx.core.enums.sql;
import java.util.HashMap;
import java.util.stream.Stream;
import com.zrqx.core.enums.interfaces.EnumsInterface;
import com.zrqx.core.enums.sql.impl.LikeSqlCondition;
import com.zrqx.core.enums.sql.impl.ListSqlCondition;
import com.zrqx.core.enums.sql.impl.RegexpSqlCondition;
import com.zrqx.core.enums.sql.impl.SimpleSqlCondition;
import com.zrqx.core.exception.BaseException;
/**
* sql 条件枚举
* @author lpf
* @date 2019年7月31日下午4:43:10
*/
public enum SqlConditionEnum implements EnumsInterface<String>{
/** equal to 等于 */
EQ("=", "eq", SimpleSqlCondition.getInstance()),
/** less than 小于 */
LT("&lt;", "lt", SimpleSqlCondition.getInstance()),
/** greater than 大于 */
GT("&gt;", "gt", SimpleSqlCondition.getInstance()),
/** less than or equal to 小于等于 */
LE("&lt;=", "le", SimpleSqlCondition.getInstance()),
/** greater than or equal to 大于等于 */
GE("&gt;=", "ge", SimpleSqlCondition.getInstance()),
/** not equal to 不等于 &lt;&gt; */
NE("!=", "ne", SimpleSqlCondition.getInstance()),
/** in */
IN("in", "in", ListSqlCondition.getInstance()),
/** not in */
NIN("not in", "nin", ListSqlCondition.getInstance()),
/** all like */
LIKE("like", "like", LikeSqlCondition.getInstance()),
/** right like */
RIGHT_LIKE("like","rlike", LikeSqlCondition.getInstance()),
/** left like */
LEFT_LIKE("like", "llike", LikeSqlCondition.getInstance()),
/** REGEXP */
REGEXP("REGEXP","regexp", RegexpSqlCondition.getInstance());
/**
* regular: SqlConditionEnum
*/
private static final HashMap<String,SqlConditionEnum> MAP = new HashMap<String,SqlConditionEnum>();
/** 数据库关键字 */
private final String key;
/** 正则匹配内容 */
private final String regular;
private final SqlConditionInterface fun;
private SqlConditionEnum(String key, String regular,SqlConditionInterface fun) {
this.key = key;
this.regular = regular;
this.fun = fun;
}
static {
stream().forEach(e -> {
MAP.put(e.regular, e);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public static Stream<SqlConditionEnum> stream(){
return Stream.of(values());
}
/**
* 根据正则匹配查找枚举
* @param regular
* @return
* @author lpf
* @date: 2019年7月31日 下午5:13:00
*/
public static SqlConditionEnum get(String regular) {
SqlConditionEnum result = MAP.get(regular);
if (result == null) {
throw new BaseException("根据regular获取SqlConditionEnum为空:"+ regular);
}
return result;
}
public String getKey() {
return key;
}
public String getRegular() {
return regular;
}
@Override
public String getCode() {
return regular;
}
@Override
public String getName() {
return key;
}
public SqlConditionInterface getFun() {
return fun;
}
}
package com.zrqx.core.enums.sql;
import com.zrqx.core.enums.interfaces.EnumsBindBean;
/**
* sql操作 行为接口
* @author lpf
* @date 2019年8月1日下午2:27:39
*/
public interface SqlConditionInterface extends EnumsBindBean<SqlConditionEnum> {
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
String apply(SqlConditionEnum en, String column, String attr);
}
package com.zrqx.core.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.zrqx.core.enums.sql.SqlConditionEnum;
import com.zrqx.core.enums.sql.SqlConditionInterface;
import com.zrqx.core.mapper.BaseMapper;
public class LikeSqlCondition implements SqlConditionInterface{
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.LIKE,SqlConditionEnum.RIGHT_LIKE,SqlConditionEnum.LEFT_LIKE);
}
/**
* like(m.name,query.name)
* "<if test = '" + NOTBLANK + "(query.name)'> "
" and m.name like concat('%',#{query.name},'%') "
" </if> "
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(java.lang.String, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:01:30
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.NOTBLANK);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" concat(");
if (SqlConditionEnum.LIKE.equals(en) || SqlConditionEnum.LEFT_LIKE.equals(en)) {
sb.append("'%',");
}
sb.append(" #{");
sb.append(attr);
sb.append("}");
if (SqlConditionEnum.LIKE.equals(en) || SqlConditionEnum.RIGHT_LIKE.equals(en)) {
sb.append(",'%'");
}
sb.append(")");
sb.append(" </if>");
return sb.toString();
}
private LikeSqlCondition(){}
public static LikeSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final LikeSqlCondition LAZY = new LikeSqlCondition();
}
}
package com.zrqx.core.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.zrqx.core.enums.sql.SqlConditionEnum;
import com.zrqx.core.enums.sql.SqlConditionInterface;
import com.zrqx.core.mapper.BaseMapper;
/**
* 解析list操作
* @author lpf
* @date 2019年8月1日下午2:35:45
*/
public class ListSqlCondition implements SqlConditionInterface{
/**
* in notin
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:37:16
*/
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.IN, SqlConditionEnum.NIN);
}
/**
* in(m.type, query.type)
* <if test=' LIST_NOT_EMPTY ( query.type )'>
AND query.type in
<foreach item='item' index='index' collection= 'query.type' open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:18:58
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.LIST_NOT_EMPTY);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" <foreach item='item' index='index' collection= '");
sb.append(attr);
sb.append("' open='(' separator=',' close=')'> ");
sb.append("#{item}");
sb.append(" </foreach>");
sb.append(" </if>");
return sb.toString();
}
private ListSqlCondition(){}
public static ListSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final ListSqlCondition LAZY = new ListSqlCondition();
}
}
package com.zrqx.core.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.zrqx.core.enums.sql.SqlConditionEnum;
import com.zrqx.core.enums.sql.SqlConditionInterface;
import com.zrqx.core.mapper.BaseMapper;
public class RegexpSqlCondition implements SqlConditionInterface{
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.REGEXP);
}
/**
*
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:30:48
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.LIST_NOT_EMPTY);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" REPLACE(<foreach item='item' index='index' collection= '");
sb.append(attr);
sb.append("' open='(' separator=',' close=')'> ");
sb.append("^#{item}");
sb.append(" </foreach>,' ','') ");
sb.append(" </if>");
return sb.toString();
}
private RegexpSqlCondition(){}
public static RegexpSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final RegexpSqlCondition LAZY = new RegexpSqlCondition();
}
}
package com.zrqx.core.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.zrqx.core.enums.sql.SqlConditionEnum;
import com.zrqx.core.enums.sql.SqlConditionInterface;
import com.zrqx.core.mapper.BaseMapper;
/**
* 简单操作
* @author lpf
* @date 2019年8月1日下午2:35:27
*/
public class SimpleSqlCondition implements SqlConditionInterface{
/**
* = < > <= >= !=
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:33:27
*/
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.EQ,
SqlConditionEnum.LT,
SqlConditionEnum.GT,
SqlConditionEnum.LE,
SqlConditionEnum.GE,
SqlConditionEnum.NE);
}
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.NOTBLANK);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" #{");
sb.append(attr);
sb.append("} </if>");
return sb.toString();
}
private SimpleSqlCondition(){}
public static SimpleSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final SimpleSqlCondition LAZY = new SimpleSqlCondition();
}
}
package com.zrqx.core.exception;
import com.zrqx.core.enums.ResponseCodeEnum;
/**
* 业务验证异常
* @author lpf
* @date 2018年8月10日下午4:28:59
*/
public class BusinessValidateException extends BaseException {
/**
*
*/
private static final long serialVersionUID = 1L;
//无参构造方法
public BusinessValidateException() {
super(ResponseCodeEnum.VALIDATE.getCode(), ResponseCodeEnum.VALIDATE.getMsg());
}
//有参的构造方法
public BusinessValidateException(String message) {
super(ResponseCodeEnum.VALIDATE.getCode(),message);
}
//有参的构造方法
public BusinessValidateException(int code, String message){
super(code , message);
}
//有参的构造方法
public BusinessValidateException(ResponseCodeEnum res){
super(res);
}
}
package com.zrqx.core.exception;
import com.zrqx.core.enums.ResponseCodeEnum;
/**
* 登陆验证异常
* @author ycw
* @date 2018年12月26日下午2:28:59
*/
public class LoginValidateException extends BaseException {
/**
*
*/
private static final long serialVersionUID = 1L;
//无参构造方法
public LoginValidateException() {
super(ResponseCodeEnum.NO_LOGIN.getCode(), ResponseCodeEnum.NO_LOGIN.getMsg());
}
//有参的构造方法
public LoginValidateException(String message) {
super(ResponseCodeEnum.NO_LOGIN.getCode(),message);
}
//有参的构造方法
public LoginValidateException(int code, String message){
super(code , message);
}
//有参的构造方法
public LoginValidateException(ResponseCodeEnum res){
super(res);
}
}
package com.zrqx.core.exception;
import com.zrqx.core.enums.ResponseCodeEnum;
/**
* 参数校验异常
* @author lpf
* @date 2018年5月30日上午10:00:58
*/
public class ParameterValidateException extends BaseException{
private static final long serialVersionUID = 1L;
//无参构造方法
public ParameterValidateException(){
super(ResponseCodeEnum.VALIDATE.getCode(), ResponseCodeEnum.VALIDATE.getMsg());
}
//有参的构造方法
public ParameterValidateException(String message){
super(ResponseCodeEnum.VALIDATE.getCode(), message);
}
//有参的构造方法
public ParameterValidateException(int code, String message){
super(code , message);
}
//有参的构造方法
public ParameterValidateException(ResponseCodeEnum res){
super(res);
}
}
package com.zrqx.core.mapper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
import org.apache.ibatis.session.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zrqx.core.enums.sql.SqlConditionEnum;
public class SqlXMLLanguageDriver extends XMLLanguageDriver{
private static final Logger logger = LoggerFactory.getLogger(SqlXMLLanguageDriver.class);
private static String REGULAR;
static {
logger.info("生成则表达式");
// String regular = "(eq|like|nin|regexp)\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)";
StringBuffer sb = new StringBuffer("(");
SqlConditionEnum.stream().forEach(s -> {
sb.append(s.getRegular());
sb.append("|");
});
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
sb.append("\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)");
REGULAR = sb.toString();
logger.info("匹配sql正则" + REGULAR);
}
@Override
public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {
logger.info("configuration:" + configuration+";script:" + script + ";parameterType:" + parameterType);
logger.info("sql script:" + script);
String afterScript = this.apply(script);
logger.info("fmt script: " + afterScript);
return super.createSqlSource(configuration, afterScript, parameterType);
}
public String apply(String script){
Pattern pattern = Pattern.compile(REGULAR, Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(script);
StringBuffer sb = new StringBuffer();
while (m.find()) {
// 操作
String con = m.group(1);
SqlConditionEnum en = SqlConditionEnum.get(con.toLowerCase());
String column = m.group(2);
String attr = m.group(3);
String str = en.getFun().apply(en, column, attr);
m.appendReplacement(sb, str);
}
m.appendTail(sb);
return sb.toString();
}
}
package com.zrqx.core.util.datatype;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.function.Consumer;
import com.zrqx.core.util.datatype.StringUtil;
/**
* 单号生成工具类
* @author lpf
* @date 2019年1月11日下午2:30:19
*/
public class CodeUtils {
/**
* 生成编码之前插入
* @param before
* @return
* @author lpf
* @date: 2019年5月15日 下午3:38:01
*/
public static String beforeInitRandomOrderCode(Consumer<StringBuffer> before) {
return initRandomOrderCode(before, b -> {});
}
/**
* 生成编码之后插入
* @param after
* @return
* @author lpf
* @date: 2019年5月15日 下午3:38:12
*/
public static String afterInitRandomOrderCode(Consumer<StringBuffer> after) {
return initRandomOrderCode(b -> {}, after);
}
/**
* 基础生成编码规则
* 测试环境: ZRQX + 2随机字母 + yyyyMMddHHmmssSSSS
* 生产环境: 2随机字母 + yyyyMMddHHmmssSSSS
* @return
* @author ydm
* @date: 2018年8月13日 下午2:31:44
*/
public static String initRandomOrderCode(Consumer<StringBuffer> before, Consumer<StringBuffer> after) {
StringBuffer result = new StringBuffer();
before.accept(result);
// result.append(StringUtil.getRandomEnSign(1,2,0));
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
result.append(sdf.format(new Date()));
after.accept(result);
return result.toString();
}
}
package com.zrqx.core.util.datatype;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 字符串的一些公共方法
* @ClassName: StringUtils
* @author
* @date 2014-7-14 上午11:14:00
*
*/
public class StringUtils extends org.apache.commons.lang3.StringUtils{
private final static String[] agent = { "Android", "iPhone", "iPod","iPad", "Windows Phone", "MQQBrowser" };
private final static String[] enletters = {"a","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","t","u","v","w","x","y","z"};
public static boolean isNotBlank(Integer value){
return value != null;
}
/**
* 判断User-Agent 是不是来自于手机
* @param ua
* @return
*/
public static boolean checkAgentIsMobile(String ua) {
boolean flag = false;
if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) {
// 排除 苹果桌面系统
if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) {
for (String item : agent) {
if (ua.contains(item)) {
flag = true;
break;
}
}
}
}
return flag;
}
/**
* 给定指定字符串res,去除字符串首尾的指定字符c
* @Title: trim
* @param res 原字符串
* @param c 要删除的字符,只删除首尾,且不能截取Unicode 大于 'A'的字符
* @return
* @return String 返回类型
* @author
* @date 2014-7-14 上午11:21:21
*/
public static String trim(String res,char c) {
int count = res.toCharArray().length;
int len = res.toCharArray().length;
int st = 0;
int off = 0; /* avoid getfield opcode */
char[] val = res.toCharArray(); /* avoid getfield opcode */
while ((st < len) && (val[off + st] <= c)) {
st++;
}
while ((st < len) && (val[off + len - 1] <= c)) {
len--;
}
return ((st > 0) || (len < count)) ? res.substring(st, len) : res;
}
/**
* 获取setter方法名称
* @Title: getSetterMethodName
* @param key
* @return
* @return String 返回类型
* @author
* @date 2014年7月24日 下午3:43:22
*/
public static String getMethodName(String begin,String key) {
StringBuilder result = new StringBuilder(begin);
result.append(key.substring(0,1).toUpperCase()).append(key.substring(1));
return result.toString();
}
/**
* 获取随机英文字符串
* @param caseType 1大写,其他小写
* @param length 返回字符串长度
* @param hasRepeat 是否包含重复字符 1包含0不包含
* @return
* @author ydm
* @date: 2018年7月11日 上午11:33:25
*/
public static String getRandomEnSign(int caseType,int length,int hasRepeat){
StringBuffer resultBuffer = new StringBuffer();
for(int i = 0 ; i < length ; i ++ ){
int x=1+(int)(Math.random()*enletters.length-1);
if(hasRepeat * 1 == 0){
if(resultBuffer.toString().toLowerCase().indexOf(enletters[x].toLowerCase())>0){
continue;
}
}
resultBuffer.append(caseType*1==1 ? enletters[x].toUpperCase() : enletters[x].toLowerCase());
}
return resultBuffer.toString();
}
public static Object checkNull(Object obj) {
Class<? extends Object> clazz = obj.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 可访问私有变量
field.setAccessible(true);
// 获取属性类型
String type = field.getGenericType().toString();
// 如果type是类类型,则前面包含"class ",后面跟类名
if ("class java.lang.String".equals(type)) {
// 将属性的首字母大写
String methodName = field.getName().replaceFirst(field.getName().substring(0, 1),
field.getName().substring(0, 1).toUpperCase());
System.out.println(methodName);
try {
Method methodGet = clazz.getMethod("get" + methodName);
// 调用getter方法获取属性值
String str = (String) methodGet.invoke(obj);
if (str==null) {
// Method methodSet = clazz.getMethod("set" +
// methodName, new Class[] { String.class });
// methodSet.invoke(o, new Object[] { "" });
System.out.println(field.getType()); // class java.lang.String
// 如果为null的String类型的属性则重新复制为空字符串
field.set(obj, field.getType().getConstructor(field.getType()).newInstance(""));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return obj;
}
}
package com.zrqx.core.util.exception;
import java.util.Date;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 异常工具类
* @author lpf
* @date 2019年8月22日下午4:19:03
*/
public class ExceptionUtils {
/**
* 获取异常的异常栈全部信息
* @param e
* @return
* @author lpf
* @date: 2019年8月22日 下午4:30:18
*/
public static String getMessage(Exception e){
StringBuffer result = Stream.of(e.getStackTrace())
.map(StackTraceElement :: toString)
.map(s -> {
StringBuffer sb = new StringBuffer(s);
sb.append("<br>");
return sb;
}).collect(Collectors.reducing(StringBuffer :: append))
.orElseGet(() -> new StringBuffer("ExceptionUtils#getMessage组装异常信息失败;"));
return "异常时间:" + new Date().toLocaleString() + "<br>" + result.toString();
}
public static String getMessage(String before, Exception e) {
return before + ExceptionUtils.getMessage(e);
}
}
......@@ -34,38 +34,33 @@ public class CallBack<T> implements Serializable {
}
public CallBack(ResponseCodeEnum en) {
this(en.getCode());
if (!ResponseCodeEnum.OK.equals(en)) {
this.status = false;
}
}
public CallBack(){
}
public static <T> CallBack<T> create(ResponseCodeEnum en,T data){
public static <T> CallBack<T> create(ResponseCodeEnum en,T data, String message){
CallBack<T> back = new CallBack<T>(en);
if (back.code == 0) {
back.data = data;
}else{
back.status = false;
if(data != null){
back.msg = data.toString();
}
}
return back;
}
public static <T> CallBack<T> create(int code, T data,String message) {
CallBack<T> back = new CallBack<T>();
back.code = code;
if(ResponseCodeEnum.OK.getCode()!=code){
back.status=false;
}
back.data = data;
back.msg = message;
return back;
}
public static <T> CallBack<T> create(ResponseCodeEnum en,T data){
return create(en, data, null);
}
public static <T> CallBack<T> create(ResponseCodeEnum en){
return create(en,null);
}
public static <T> CallBack<T> createMsg(ResponseCodeEnum en, String message) {
return create(en, null, message);
}
public static <T> CallBack<T> success() {
return create(ResponseCodeEnum.OK, null);
}
......@@ -75,33 +70,31 @@ public class CallBack<T> implements Serializable {
}
public static <T> CallBack<T> success(T data,String message) {
return create(ResponseCodeEnum.OK.getCode(),data, message);
return create(ResponseCodeEnum.OK, data, message);
}
public static <T> CallBack<T> fail(T data) {
return fail(ResponseCodeEnum.FAIL, data);
public static <T> CallBack<T> fail(String message) {
return createMsg(ResponseCodeEnum.FAIL, message);
}
public static <T> CallBack<T> fail() {
return fail(null);
}
public static <T> CallBack<T> fail(ResponseCodeEnum en , T data) {
return create(en,data);
}
public static <T> CallBack<T> fail(int code, T data) {
return create(code,data,null);
}
public static <T> CallBack<T> fail(int code, T data , String message) {
return create(code,data,message);
}
public static <T> CallBack<T> exception(String message) {
return createMsg(ResponseCodeEnum.EXCEPTION, message);
}
public static <T> CallBack<T> exception() {
return exception(null);
}
public static <T> CallBack<T> baseException(String message){
return createMsg(ResponseCodeEnum.BASE_EXCEPTION, message);
}
public boolean isStatus() {
return this.status;
}
public T getData(){
return this.data;
}
......@@ -110,10 +103,10 @@ public class CallBack<T> implements Serializable {
return this.timestamp;
}
public void setStatus(boolean status) {
this.status = status;
}
public void setCode(int code) {
this.code = code;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论