Commit c90be062 authored by hezhen's avatar hezhen

Merge branch 'base-modify' of http://113.105.137.151:22280/youjj/cloud-platform into base-modify

parents 43d42d0c 2352b240
...@@ -13,12 +13,10 @@ import org.aspectj.lang.annotation.Pointcut; ...@@ -13,12 +13,10 @@ import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method; import java.lang.reflect.Method;
......
...@@ -2,6 +2,10 @@ package com.github.wxiaoqi.security.admin.rest; ...@@ -2,6 +2,10 @@ package com.github.wxiaoqi.security.admin.rest;
import com.github.wxiaoqi.security.admin.biz.UserBusinessBiz; import com.github.wxiaoqi.security.admin.biz.UserBusinessBiz;
import com.github.wxiaoqi.security.admin.bo.UserTeamMemberBo; import com.github.wxiaoqi.security.admin.bo.UserTeamMemberBo;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil;
import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.vo.PageDataVO; import com.github.wxiaoqi.security.common.vo.PageDataVO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -10,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -10,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/** /**
* @author libin * @author libin
* @version 1.0 * @version 1.0
...@@ -20,12 +26,24 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -20,12 +26,24 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/team") @RequestMapping("/team")
public class UserBussinessController { public class UserBussinessController {
@Autowired
private UserAuthUtil userAuthUtil;
@Autowired
private UserAuthConfig userAuthConfig;
@Autowired @Autowired
private UserBusinessBiz businessBiz; private UserBusinessBiz businessBiz;
@GetMapping("/teams") @GetMapping("/teams")
public ObjectRestResponse<PageDataVO<UserTeamMemberBo>> sda(@RequestParam("userId") Integer userId,@RequestParam("pageNo") Integer pageNo,@RequestParam("pageSize") Integer pageSize){ public ObjectRestResponse<PageDataVO<UserTeamMemberBo>> findTeamPage(@RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize, HttpServletRequest request){
PageDataVO<UserTeamMemberBo> teamMemberBoPageDataVO = businessBiz.findTeamMemberPageByUserId(userId, pageNo, pageSize); try {
IJWTInfo infoFromToken = userAuthUtil.getInfoFromToken(userAuthConfig.getToken(request));
PageDataVO<UserTeamMemberBo> teamMemberBoPageDataVO = businessBiz.findTeamMemberPageByUserId(Integer.valueOf(infoFromToken.getId()), pageNo, pageSize);
return ObjectRestResponse.succ(teamMemberBoPageDataVO); return ObjectRestResponse.succ(teamMemberBoPageDataVO);
} catch (Exception e) {
throw new BaseException(e);
}
} }
} }
...@@ -4,6 +4,6 @@ ...@@ -4,6 +4,6 @@
<select id="selectByLeaderId" resultType="com.github.wxiaoqi.security.admin.entity.AppUserRelation"> <select id="selectByLeaderId" resultType="com.github.wxiaoqi.security.admin.entity.AppUserRelation">
select `parent_id` as `parentId`,`user_id`as `userId`,`bind_time` as `bindTime` from `app_user_relation` where `parent_id`=#{leaderId} and `is_del`=0; select `parent_id` as `parentId`,`user_id`as `userId`,`bind_time` as `bindTime` from `app_user_relation` where `parent_id`=#{leaderId} and `is_del`=0
</select> </select>
</mapper> </mapper>
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<select id="accquireIncomeByMemberIds" resultType="com.github.wxiaoqi.security.admin.bo.UserIncomeBo"> <select id="accquireIncomeByMemberIds" resultType="com.github.wxiaoqi.security.admin.bo.UserIncomeBo">
SELECT DISTINCT SELECT DISTINCT
source_id, `source_id`as userId,
(( SELECT SUM(commission) FROM `app_user_selling_water` WHERE source_id=ausw.source_id AND `status` = 0 AND `waiting` = 1 ) (( SELECT SUM(commission) FROM `app_user_selling_water` WHERE source_id=ausw.source_id AND `status` = 0 AND `waiting` = 1 )
- ( SELECT SUM(commission) FROM `app_user_selling_water` WHERE source_id=ausw.source_id AND `status` = 1 AND `waiting` = 1 )) as `income` - ( SELECT SUM(commission) FROM `app_user_selling_water` WHERE source_id=ausw.source_id AND `status` = 1 AND `waiting` = 1 )) as `income`
FROM FROM
......
...@@ -92,6 +92,9 @@ public class CampsiteShopPageDTO implements Serializable { ...@@ -92,6 +92,9 @@ public class CampsiteShopPageDTO implements Serializable {
@ApiModelProperty(value = "创建时间", hidden = true) @ApiModelProperty(value = "创建时间", hidden = true)
private Long crtTime; private Long crtTime;
@ApiModelProperty(value = "電話")
private String phone;
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) { if (this == o) {
......
...@@ -98,4 +98,6 @@ public class CampsiteShopPageVo implements Serializable { ...@@ -98,4 +98,6 @@ public class CampsiteShopPageVo implements Serializable {
@ApiModelProperty(value = "创建时间", hidden = true) @ApiModelProperty(value = "创建时间", hidden = true)
private Long crtTime; private Long crtTime;
@ApiModelProperty(value = "電話")
private String phone;
} }
...@@ -17,6 +17,7 @@ import org.springframework.stereotype.Controller; ...@@ -17,6 +17,7 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author libin * @author libin
...@@ -32,7 +33,6 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp ...@@ -32,7 +33,6 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp
@ApiOperation("分页查询营地列表") @ApiOperation("分页查询营地列表")
@GetMapping("/app/unauth/shops") @GetMapping("/app/unauth/shops")
@IgnoreClientToken
public ObjectRestResponse<PageDataVO<CampsiteShopVo>> findCampsiteShopPageByType(@RequestParam(value = "type", required = false) Integer type, public ObjectRestResponse<PageDataVO<CampsiteShopVo>> findCampsiteShopPageByType(@RequestParam(value = "type", required = false) Integer type,
@RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo, @RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", required = false, defaultValue = "6") Integer pageSize) { @RequestParam(value = "pageSize", required = false, defaultValue = "6") Integer pageSize) {
...@@ -48,7 +48,6 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp ...@@ -48,7 +48,6 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp
*/ */
@ApiOperation("查询营地详情") @ApiOperation("查询营地详情")
@GetMapping("/app/unauth/shop") @GetMapping("/app/unauth/shop")
@IgnoreClientToken
public ObjectRestResponse<CampsiteShopDetailVo> findCampsiteShopDetailById(@RequestParam("id") Integer id, @RequestParam("longitude") Double longitude, @RequestParam("latitude") Double latitude) { public ObjectRestResponse<CampsiteShopDetailVo> findCampsiteShopDetailById(@RequestParam("id") Integer id, @RequestParam("longitude") Double longitude, @RequestParam("latitude") Double latitude) {
CampsiteShopDetailVo campsiteShopDetailVo = getBaseBiz().findCampsiteShopDetailById(id, longitude, latitude); CampsiteShopDetailVo campsiteShopDetailVo = getBaseBiz().findCampsiteShopDetailById(id, longitude, latitude);
return ObjectRestResponse.succ(campsiteShopDetailVo); return ObjectRestResponse.succ(campsiteShopDetailVo);
...@@ -61,4 +60,5 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp ...@@ -61,4 +60,5 @@ public class CampsiteShopController extends BaseController<CampsiteShopBiz, Camp
return getBaseBiz().getAllByHome(page,limit); return getBaseBiz().getAllByHome(page,limit);
} }
} }
\ No newline at end of file
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<!--根据类型查询全部--> <!--根据类型查询全部-->
<select id="findAllCampsiteShopsByType" resultType="com.xxfc.platform.campsite.dto.CampsiteShopPageDTO"> <select id="findAllCampsiteShopsByType" resultType="com.xxfc.platform.campsite.dto.CampsiteShopPageDTO">
select cs.id as `id`,cs.name as `name`,cs.logo as `logo`,cs.url as `url`,cs.province_name as `provinceName`,cs.city_name as `cityName`, select cs.id as `id`,cs.name as `name`,cs.logo as `logo`,cs.url as `url`,cs.province_name as `provinceName`,cs.city_name as `cityName`,cs.service_phone as `phone`,
cs.longitude as `longitude`,cs.latitude as `latitude`,cs.hot as `hot`,cs.crt_time as `crtTime`,ct.id as `storeId`,ct.name as `storeTypeName` cs.longitude as `longitude`,cs.latitude as `latitude`,cs.hot as `hot`,cs.crt_time as `crtTime`,ct.id as `storeId`,ct.name as `storeTypeName`
FROM `campsite_shop_tag` cst FROM `campsite_shop_tag` cst
left JOIN `campsite_shop` cs on cst.shop_id=cs.id left JOIN `campsite_shop` cs on cst.shop_id=cs.id
......
package com.xxfc.platform.common.annotaion;
import java.lang.annotation.*;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/8 15:26
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface LoginUser {
}
package com.xxfc.platform.common.annotaion;
import com.xxfc.platform.common.util.RedisLock;
import java.lang.annotation.*;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/8 15:26
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface NoRepeatSubmit {
long timeout() default 10;
String pre() default "";
RedisLock.ExpireTimeUnitEnum exptunit() default RedisLock.ExpireTimeUnitEnum.EXPIRETIME;
}
package com.xxfc.platform.common.annotaion;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RateLimit {
}
package com.xxfc.platform.common.aop;
import com.xxfc.platform.common.annotaion.NoRepeatSubmit;
import com.xxfc.platform.common.msg.ApiResult;
import com.xxfc.platform.common.msg.PageApiResult;
import com.xxfc.platform.common.util.RedisLock;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/8 21:04
*/
@Aspect
@Component
@Slf4j
public class NoRepeatSubmitAop {
@Value("${auth.user.token-header:Authorization}")
private String tokenHeader;
private static final String NO_REPEAT_SUBMIT_PREKEY = "no:submit";
@Autowired
private RedisLock redisLock;
@Pointcut("@annotation(noRepeatSubmit)")
public void noRepeateSubmitExpress(NoRepeatSubmit noRepeatSubmit) {}
@Around("noRepeateSubmitExpress(noRepeatSubmit)")
public Object noRepeateSubmitAround(ProceedingJoinPoint proceedingJoinPoint, NoRepeatSubmit noRepeatSubmit) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
String uri = request.getRequestURI();
String token = request.getHeader(tokenHeader);
String lockKey = String.format("%s%s:%s:%s", StringUtils.isEmpty(noRepeatSubmit.pre()) ? "" : noRepeatSubmit.pre() + ":", NO_REPEAT_SUBMIT_PREKEY, token, uri);
boolean tryLock = redisLock.tryLock(lockKey, uri, noRepeatSubmit.exptunit(), noRepeatSubmit.timeout());
Object result = null;
if (tryLock) {
log.info("tryLock success, key=【{}】,接口地址:uri=【{}】", lockKey, uri);
try {
result = proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
redisLock.releaseLock(lockKey, uri);
log.info("releassLock success,key=【{}】,接口地址:uri=【{}】", lockKey, uri);
}
return result;
} else {
log.info("tryLock fail key=【{}】", lockKey);
return ApiResult.fail(100001, "获取锁失败");
}
}
}
package com.xxfc.platform.common.aop;
import cn.hutool.core.util.ArrayUtil;
import com.github.wxiaoqi.security.common.annotation.BeanValid;
import com.github.wxiaoqi.security.common.annotation.SimpleValid;
import com.xxfc.platform.common.msg.ApiResult;
import lombok.Data;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Objects;
import java.util.Set;
/**
* @author libin
* @version 1.0
* @description 切面验证
* @data 2019/6/13 13:46
*/
@Aspect
@Data
public class ValidParamAop {
/**
* 复合类型验证器
*/
private Validator validator;
/**
* 简单类型验证器
*/
private ExecutableValidator executableValidator;
@Pointcut("execution(* com.xxfc.platform..rest..*(..))")
public void validatorExpress(){}
@Around("validatorExpress()")
public Object validatorAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable{
//获取方法的所有参数
Object[] args = proceedingJoinPoint.getArgs();
if (ArrayUtil.isEmpty(args)){
//没有参数,不用验证
return proceedingJoinPoint.proceed();
}
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
Method currentMethod = methodSignature.getMethod();
Parameter[] parameters = currentMethod.getParameters();
boolean hashSimpleValid = false;
int argLength = args.length;
for (int i =0;i<argLength;i++){
BeanValid beanValidAnnotation = parameters[i].getDeclaredAnnotation(BeanValid.class);
if (Objects.nonNull(beanValidAnnotation)){
if (args[i].getClass().isArray()){
Object[] arrayArg =(Object[])args[i];
for (Object item:arrayArg){
Set<ConstraintViolation<Object>> validateResult = this.validator.validate(item, beanValidAnnotation.value());
if (!validateResult.isEmpty()){
String message = validateResult.iterator().next().getMessage();
return ApiResult.fail(400,message);
}
}
}else {
Set<ConstraintViolation<Object>> validateResult = this.validator.validate(args[i], beanValidAnnotation.value());
if (!validateResult.isEmpty()){
String message = validateResult.iterator().next().getMessage();
return ApiResult.fail(400,message);
}
}
continue;
}
if (!hashSimpleValid){
SimpleValid simpleValidAnnotation = parameters[i].getDeclaredAnnotation(SimpleValid.class);
if (Objects.nonNull(simpleValidAnnotation)){
hashSimpleValid = true;
}
}
}
if (hashSimpleValid){
Object target = proceedingJoinPoint.getTarget();
Set<ConstraintViolation<Object>> validResult = this.executableValidator.validateParameters(target, currentMethod, args);
if(!validResult.isEmpty()){
String message = validResult.iterator().next().getMessage();
return ApiResult.fail(400,message);
}
}
return proceedingJoinPoint.proceed();
}
}
package com.xxfc.platform.common.config;
import com.github.wxiaoqi.security.common.support.aop.ValidParamAop;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableValidator;
/**
* @author libin
* @version 1.0
* @description 验证器validator
* @data 2019/6/13 13:48
*/
@Configuration
public class ValidatorConfig {
/**
* 复合类型所用的验证器
* @return Validator
*/
@Bean
public Validator validator(){
// .failFast( true ) 为设置快速错误模式,默认为false
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.failFast( true )
.buildValidatorFactory();
return validatorFactory.getValidator();
}
/**
* 简单类型所用的验证器
* @return ExecutableValidator
*/
@Bean
public ExecutableValidator executableValidator() {
return validator().forExecutables();
}
/**
* 装配验证器切面
* @param validator Bean验证器
* @param executableValidator 简单类型验证器
* @return ValidParamAop
*/
@Bean
public ValidParamAop validAop(Validator validator, ExecutableValidator executableValidator) {
ValidParamAop validParamAop = new ValidParamAop();
validParamAop.setValidator(validator);
validParamAop.setExecutableValidator(executableValidator);
return validParamAop;
}
}
package com.xxfc.platform.common.config;
import com.xxfc.platform.common.resover.LoginUserParamResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/9 17:29
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private LoginUserParamResolver loginUserParamResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginUserParamResolver);
}
}
package com.xxfc.platform.common.msg;
import lombok.Data;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/9 16:55
*/
@Data
public class ApiResult<T> extends BaseApiResult<T> {
private ApiResult(long code, String msg, T data, boolean successResponse, String requestId) {
super(code,msg,data,successResponse,requestId);
}
public static <T> ApiResult<T> ok() {
return new ApiResult(200, "ok", "ok", true, "0");
}
public static <T> ApiResult<T> ok(T data) {
return new ApiResult(200, "ok", data, true, "0");
}
public static <T> ApiResult<T> ok(T data, String requestId) {
return new ApiResult(200, "ok", data, true, requestId);
}
}
package com.xxfc.platform.common.msg;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/9 17:55
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseApiResult<T> implements Serializable {
private static final long serialVersionUID = 1L;
protected long code;
protected String msg;
protected T data;
protected boolean successResponse;
protected String requestId;
public static <T> BaseApiResult<T> fail() {
return new BaseApiResult(400, "fail", "fail", false, "0");
}
public static <T> BaseApiResult<T> fail(String msg) {
return new BaseApiResult(400, msg, "fail", false, "0");
}
public static <T> BaseApiResult<T> fail(long code, String msg) {
return new BaseApiResult(code, msg, "fail", false, "0");
}
}
package com.xxfc.platform.common.msg;
import lombok.Data;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/9 17:45
*/
@Data
public class PageApiResult<T> extends BaseApiResult<T> {
private PageInfo pageInfo;
private PageApiResult(long code, String msg, T data, boolean successResponse, String requestId, PageInfo pageInfo) {
super(code, msg, data, successResponse, requestId);
this.pageInfo = pageInfo;
}
public static <T> PageApiResult<T> ok() {
return new PageApiResult(200, "ok", "ok", true, "0", PageInfo.createEmptyPageInfo());
}
public static <T> PageApiResult<T> ok(T data, PageInfo pageInfo) {
return new PageApiResult(200, "ok", data, true, "0", pageInfo);
}
public static <T> PageApiResult<T> ok(T data, PageInfo pageInfo, String requestId) {
return new PageApiResult(200, "ok", data, true, requestId, pageInfo);
}
@Data
static class PageInfo {
private Integer page;
private Integer pageSize;
private Integer total;
private PageInfo(){}
private PageInfo(Integer page, Integer pageSize, Integer total) {
this.page = page;
this.pageSize = pageSize;
this.total = total;
}
public static PageInfo createEmptyPageInfo() {
return new PageInfo();
}
public static PageInfo createPageInfo(Integer page, Integer pageSize, Integer total) {
return new PageInfo(page,pageSize,total);
}
}
}
package com.xxfc.platform.common.resover;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.xxfc.platform.common.annotaion.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/8 20:17
*/
@ConditionalOnBean(value = UserFeign.class)
@Component
public class LoginUserParamResolver implements HandlerMethodArgumentResolver {
@Value("${auth.user.token-header:Authorization}")
private String tokenHeader;
@Autowired
private UserFeign userFeign;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(LoginUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
String token = request.getHeader(tokenHeader);
Class<?> parameterType = parameter.getParameterType();
if (AppUserDTO.class.equals(parameterType)){
return userFeign.userDetailByToken(token).getData();
}
if (UserDTO.class.equals(parameterType)){
return userFeign.userinfoByToken(token).getData();
}
return null;
}
}
package com.xxfc.platform.common.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import java.util.Collections;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/8 21:02
*/
@Component
public class RedisLock {
private static final Long RELEASE_SUCCESS = 1L;
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
/**
* if get(key) == value return del(key)
*/
private static final String RELEASE_LOCK_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 该加锁方法仅针对单实例 Redis 可实现分布式加锁
* 对于 Redis 集群则无法使用
* <p>
* 支持重复,线程安全
*
* @param lockKey 加锁键
* @param clientId 加锁客户端唯一标识(采用UUID)
* @param seconds 锁过期时间
* @return
*/
public boolean tryLock(String lockKey, String clientId, ExpireTimeUnitEnum expireTimeEnum,long seconds) {
return redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> {
Jedis jedis = (Jedis) redisConnection.getNativeConnection();
String result = jedis.set(lockKey, clientId, SET_IF_NOT_EXIST, expireTimeEnum.getUnit(), seconds);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
});
}
/**
* 与 tryLock 相对应,用作释放锁
*
* @param lockKey
* @param clientId
* @return
*/
public boolean releaseLock(String lockKey, String clientId) {
return redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> {
Jedis jedis = (Jedis) redisConnection.getNativeConnection();
Object result = jedis.eval(RELEASE_LOCK_SCRIPT, Collections.singletonList(lockKey),
Collections.singletonList(clientId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
});
}
public enum ExpireTimeUnitEnum {
/**
* 当前设置 过期时间单位, EX = seconds; PX = milliseconds
*/
EXPIRETIME("EX"),
PXPIRETIME("PX");
ExpireTimeUnitEnum(String unit) {
this.unit = unit;
}
String unit;
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment