Commit de3aca5e authored by 唐峰's avatar 唐峰

Merge branch 'feature-migration-20230628' of...

Merge branch 'feature-migration-20230628' of git.quantgroup.cn:head_group/xyqb-user2 into feature-migration-20230628
parents 19879c56 8159ff73
package cn.quantgroup.xyqb.controller.api.v2;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.model.BehaviorCodeBean;
import cn.quantgroup.xyqb.model.JsonResult;
......@@ -21,10 +22,21 @@ public class BehaviorApiV2Controller {
/**
* 统一获取行为验证码
* @return JsonResult<SMSCodeBean>
* @see <a href="http://yapi.quantgroups.com/project/17/interface/api/65824">统一获取行为验证码</a>
* @see <a href="http://yapi.quantgroups.com/project/17/interface/api/65939">统一获取行为验证码</a>
*/
@PostMapping("/code")
public JsonResult<BehaviorCodeBean> getCode(@Valid @RequestBody BehaviorReq behaviorReq){
return JsonResult.buildSuccessResultGeneric(behaviorContext.generate(behaviorReq));
}
/**
* 统一刷新行为验证码
* @return JsonResult<SMSCodeBean>
* @see <a href="http://yapi.quantgroups.com/project/17/interface/api/66059">统一刷新行为验证码</a>
*/
@PostMapping("/refresh")
public JsonResult<BehaviorCodeBean> refreshCode(@Valid @RequestBody BehaviorRefreshReq behaviorRefreshReq){
return JsonResult.buildSuccessResultGeneric(behaviorContext.refresh(behaviorRefreshReq));
}
}
......@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.controller.api.v2;
import cn.quantgroup.xyqb.controller.req.v2.BatchInfoReq;
import cn.quantgroup.xyqb.controller.req.v2.UserInfoReq;
import cn.quantgroup.xyqb.entity.BaseEntity;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.exception.BizException;
......@@ -56,15 +57,25 @@ public class UserApiV2Controller {
//2、查询
if (userInfoReq.getUserId() != null) {
user = userRepository.findByIdAndTenantId(userInfoReq.getUserId(), sessionStruct.getTenantId());
if (StringUtils.isNotEmpty(userInfoReq.getAppId())) {
wechatUserInfo = wechatService.queryByUserIdAndAppId(userInfoReq.getUserId(), userInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (StringUtils.isNotEmpty(userInfoReq.getUuid())) {
user = userRepository.findByUuidAndTenantId(userInfoReq.getUuid(), sessionStruct.getTenantId());
if (user != null && StringUtils.isNotEmpty(userInfoReq.getAppId())) {
wechatUserInfo = wechatService.queryByUserIdAndAppId(user.getId(), userInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (StringUtils.isNotEmpty(userInfoReq.getPhoneNo())) {
user = userRepository.findByPhoneNoAndTenantId(userInfoReq.getPhoneNo(), sessionStruct.getTenantId());
if (user != null && StringUtils.isNotEmpty(userInfoReq.getAppId())) {
wechatUserInfo = wechatService.queryByUserIdAndAppId(user.getId(), userInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (StringUtils.isNotEmpty(userInfoReq.getAppId()) && StringUtils.isNotEmpty(userInfoReq.getOpenId())) {
wechatUserInfo = wechatService.findWechatUserInfoFromDb(userInfoReq.getOpenId(), userInfoReq.getAppId(), sessionStruct.getTenantId());
......@@ -114,20 +125,31 @@ public class UserApiV2Controller {
//2、查询
if (CollectionUtils.isNotEmpty(batchInfoReq.getUserIds())) {
userList = userRepository.findByIdInAndTenantId(batchInfoReq.getUserIds(), sessionStruct.getTenantId());
if (CollectionUtils.isNotEmpty(userList) && StringUtils.isNotEmpty(batchInfoReq.getAppId())) {
List<Long> uuids = userList.stream().map(BaseEntity::getId).collect(Collectors.toList());
wechatUserInfo = wechatService.queryListByUserIdAndAppId(uuids, batchInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (CollectionUtils.isNotEmpty(batchInfoReq.getUuids())) {
userList = userRepository.findByUuidInAndTenantId(batchInfoReq.getUuids(), sessionStruct.getTenantId());
if (CollectionUtils.isNotEmpty(userList) && StringUtils.isNotEmpty(batchInfoReq.getAppId())) {
List<Long> uuids = userList.stream().map(BaseEntity::getId).collect(Collectors.toList());
wechatUserInfo = wechatService.queryListByUserIdAndAppId(uuids, batchInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (CollectionUtils.isNotEmpty(batchInfoReq.getPhoneNos())) {
userList = userRepository.findByPhoneNoInAndTenantId(batchInfoReq.getPhoneNos(), sessionStruct.getTenantId());
if (CollectionUtils.isNotEmpty(userList) && StringUtils.isNotEmpty(batchInfoReq.getAppId())) {
List<Long> uuids = userList.stream().map(BaseEntity::getId).collect(Collectors.toList());
wechatUserInfo = wechatService.queryListByUserIdAndAppId(uuids, batchInfoReq.getAppId(), sessionStruct.getTenantId());
}
}
if (StringUtils.isNotEmpty(batchInfoReq.getAppId()) && CollectionUtils.isNotEmpty(batchInfoReq.getOpenIds())) {
wechatUserInfo = wechatService.findWechatUserInfoFromDb(batchInfoReq.getOpenIds(), batchInfoReq.getAppId(), sessionStruct.getTenantId());
List<Long> userIds = wechatUserInfo.stream().map(WechatUserInfo::getUserId).collect(Collectors.toList());
;
if (CollectionUtils.isEmpty(wechatUserInfo) || CollectionUtils.isEmpty(userIds)) {
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
......@@ -138,7 +160,6 @@ public class UserApiV2Controller {
if (StringUtils.isNotEmpty(batchInfoReq.getAppId()) && CollectionUtils.isNotEmpty(batchInfoReq.getUnionIds())) {
wechatUserInfo = wechatService.findUnionIdsAndOpenIdAndTenantId(batchInfoReq.getUnionIds(), batchInfoReq.getAppId(), sessionStruct.getTenantId());
List<Long> userIds = wechatUserInfo.stream().map(WechatUserInfo::getUserId).collect(Collectors.toList());
;
if (CollectionUtils.isEmpty(wechatUserInfo) || CollectionUtils.isEmpty(userIds)) {
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
......@@ -151,7 +172,7 @@ public class UserApiV2Controller {
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
return JsonResult.buildSuccessResultGeneric(UserBean.from(userList,wechatUserInfo));
return JsonResult.buildSuccessResultGeneric(UserBean.from(userList, wechatUserInfo));
}
}
package cn.quantgroup.xyqb.controller.req.v2;
import lombok.Data;
@Data
public class BehaviorRefreshReq {
private String id;
private Integer type;
}
package cn.quantgroup.xyqb.controller.v2;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.model.BehaviorCodeBean;
import cn.quantgroup.xyqb.model.JsonResult;
......@@ -27,4 +28,15 @@ public class BehaviorV2Controller {
public JsonResult<BehaviorCodeBean> getCode(@Valid @RequestBody BehaviorReq behaviorReq){
return JsonResult.buildSuccessResultGeneric(behaviorContext.generate(behaviorReq));
}
/**
* 统一刷新行为验证码
* @return JsonResult<SMSCodeBean>
* @see <a href="http://yapi.quantgroups.com/project/17/interface/api/66064">统一刷新行为验证码</a>
*/
@PostMapping("/refresh")
public JsonResult<BehaviorCodeBean> refreshCode(@Valid @RequestBody BehaviorRefreshReq behaviorReq){
return JsonResult.buildSuccessResultGeneric(behaviorContext.refresh(behaviorReq));
}
}
......@@ -31,7 +31,7 @@ public enum BizExceptionEnum {
// 验证码相关 20 开头
FAIL_GENERATE_IMAGE("2001","生成图片失败"),
FAIL_VERIFY_CODE("2002","图形验证码错误"),
FAIL_VERIFY_CODE("2002","图形验证码验证错误"),
UN_EXIT_VERIFY_TYPE("2003","不存在的验证码方式"),
UN_EXIT_VERIFY_CODE("2004","验证模式下验证码参数不能为空"),
EX_GET_VERIFY_CODE("2005","获取验证码失败"),
......
......@@ -24,6 +24,7 @@ public class TokenInterceptor implements HandlerInterceptor {
public TokenInterceptor(ISessionService sessionService) {
this.sessionService = sessionService;
excludes.add("/v2/oauth/login");
excludes.add("/v2/behavior/refresh");
excludes.add("/v2/sms/code");
excludes.add("/v2/sms/verify");
}
......
......@@ -2,19 +2,19 @@ package cn.quantgroup.xyqb.model;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.time.LocalDateTime;
import java.util.*;
@Data
public class UserBean {
private Long userId;
private String openId;
private String appId;
private String unionId;
private List<Wechat> wechatList;
private String phoneNo;
private Long registeredFrom;
......@@ -24,6 +24,17 @@ public class UserBean {
private Boolean enable;
private Integer tenantId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createdAt;
@Builder
@Getter
public static class Wechat {
private String openId;
private String appId;
private String unionId;
}
public static UserBean from(User user, WechatUserInfo wechatUserInfo) {
UserBean userBean = new UserBean();
......@@ -33,10 +44,12 @@ public class UserBean {
userBean.setUuid(user.getUuid());
userBean.setEnable(user.getEnable());
userBean.setTenantId(user.getTenantId());
userBean.setCreatedAt(user.getCreatedAt());
if (wechatUserInfo != null) {
userBean.setOpenId(wechatUserInfo.getOpenId());
userBean.setUnionId(wechatUserInfo.getUnionId());
userBean.setAppId(wechatUserInfo.getAppId());
userBean.setWechatList(Collections.singletonList(Wechat.builder()
.openId(wechatUserInfo.getOpenId())
.unionId(wechatUserInfo.getUnionId())
.appId(wechatUserInfo.getAppId()).build()));
}
return userBean;
}
......@@ -52,14 +65,16 @@ public class UserBean {
userBean.setUuid(user.getUuid());
userBean.setEnable(user.getEnable());
userBean.setTenantId(user.getTenantId());
userBean.setCreatedAt(user.getCreatedAt());
if (CollectionUtils.isNotEmpty(wechatUserInfoList)) {
Optional<WechatUserInfo> optionalWechatUserInfo = wechatUserInfoList.stream().filter(i -> i.getUserId().equals(user.getId())).findFirst();
if (optionalWechatUserInfo.isPresent()) {
WechatUserInfo wechatUserInfo = optionalWechatUserInfo.get();
userBean.setOpenId(wechatUserInfo.getOpenId());
userBean.setUnionId(wechatUserInfo.getUnionId());
userBean.setAppId(wechatUserInfo.getAppId());
userBean.setWechatList(Collections.singletonList(Wechat.builder()
.openId(wechatUserInfo.getOpenId())
.unionId(wechatUserInfo.getUnionId())
.appId(wechatUserInfo.getAppId()).build()));
}
}
result.add(userBean);
......
......@@ -103,6 +103,9 @@ public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Lon
* 通过userId查询相关绑定微信记录
*/
List<WechatUserInfo> findByUserIdAndTenantId(Long userId, Integer tenantId);
WechatUserInfo findByUserIdAndAppIdAndTenantId(Long userId, String appId,Integer tenantId);
List<WechatUserInfo> findByUserIdInAndAppIdAndTenantId(List<Long> userIds,String appId, Integer tenantId);
List<WechatUserInfo> findByPhoneNoAndTenantId(String phoneNo, Integer tenantId);
......
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.exception.BizException;
......@@ -27,6 +28,15 @@ public class BehaviorContext {
}
return behaviorStrategy.generate(behaviorReq);
}
public BehaviorCodeBean refresh(BehaviorRefreshReq behaviorRefreshReq){
BehaviorStrategy behaviorStrategy = behaviorStrategyMap.get(behaviorRefreshReq.getType());
if(behaviorStrategy == null){
throw new BizException(BizExceptionEnum.UN_EXIT_VERIFY_TYPE);
}
return behaviorStrategy.refresh(behaviorRefreshReq);
}
public boolean validate(ValidateBehavior validateBehavior){
BehaviorStrategy behaviorStrategy = behaviorStrategyMap.get(validateBehavior.getType());
......
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.model.BehaviorCodeBean;
......@@ -9,4 +10,6 @@ public interface BehaviorStrategy {
boolean validate(ValidateBehavior validateBehavior);
BehaviorCodeBean generate(BehaviorReq behaviorReq);
BehaviorCodeBean refresh(BehaviorRefreshReq behaviorRefreshReq);
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.entity.GeetestLogEntity;
......@@ -106,4 +107,9 @@ public class GeetestBehaviorStrategy implements BehaviorStrategy {
}
return behaviorCodeBean;
}
@Override
public BehaviorCodeBean refresh(BehaviorRefreshReq behaviorRefreshReq) {
throw new UnsupportedOperationException();
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.constant.UserConstant;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorRefreshReq;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.exception.BizException;
......@@ -9,13 +11,19 @@ import cn.quantgroup.xyqb.model.BehaviorCodeBean;
import cn.quantgroup.xyqb.service.captcha.IQuantgroupCaptchaService;
import cn.quantgroup.xyqb.thirdparty.jcaptcha.AbstractManageableImageCaptchaService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 公司自有验证码模式
......@@ -41,10 +49,10 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy {
@Override
public boolean validate(ValidateBehavior validateBehavior) {
boolean result = quantgroupCaptchaService.validQuantgroupCaptcha(validateBehavior.getData().get(Constants.X_BEHAVIOR_ID),validateBehavior.getData().get(Constants.X_BEHAVIOR_IMAGEVALUE));
if(result){
boolean result = quantgroupCaptchaService.validQuantgroupCaptcha(validateBehavior.getData().get(Constants.X_BEHAVIOR_ID), validateBehavior.getData().get(Constants.X_BEHAVIOR_IMAGEVALUE));
if (result) {
return true;
}else{
} else {
throw new BizException(BizExceptionEnum.FAIL_VERIFY_CODE);
}
}
......@@ -61,4 +69,22 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy {
behaviorCodeBean.setId(challenge.get("imageId"));
return behaviorCodeBean;
}
@Override
public BehaviorCodeBean refresh(BehaviorRefreshReq behaviorRefreshReq) {
BufferedImage challenge = imageCaptchaService.getImageChallengeForID(Constants.IMAGE_CAPTCHA_KEY + behaviorRefreshReq.getId(), Locale.CHINA);
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
ImageIO.write(challenge, UserConstant.IMAGE_FORMAT_PNG, jpegOutputStream);
} catch (IOException e) {
throw new BizException(BizExceptionEnum.FAIL_GENERATE_IMAGE);
}
String imageBase64 = Base64.encodeBase64String(jpegOutputStream.toByteArray());
BehaviorCodeBean behaviorCodeBean = new BehaviorCodeBean();
behaviorCodeBean.setId(behaviorRefreshReq.getId());
behaviorCodeBean.setType(2);
behaviorCodeBean.setQtCode(BehaviorCodeBean.QtCode.builder().imageData(String.format(UserConstant.IMG_BASE64_PATTREN, imageBase64)).build());
redisTemplate.opsForValue().set(Constants.IMAGE_CAPTCHA_REDIS_CACHE_KEY.concat(behaviorRefreshReq.getId()), "1", Constants.IMAGE_CAPTCHA_REDIS_CACHE_TIME_OUT, TimeUnit.MINUTES);
return behaviorCodeBean;
}
}
......@@ -49,6 +49,8 @@ public interface IWechatService {
List<WechatUserInfo> queryListByUserId(Long userId,Integer tenantId);
WechatUserInfo queryByUserIdAndAppId(Long userId,String appId,Integer tenantId);
List<WechatUserInfo> queryListByUserIdAndAppId(List<Long> userIds,String appId,Integer tenantId);
List<WechatUserInfo> queryListByUnionId(String unionId,Integer tenantId);
......
......@@ -281,6 +281,17 @@ public class WechatServiceImpl implements IWechatService {
return weChatUserRepository.findByUserIdAndTenantId(userId,tenantId);
}
@Override
public WechatUserInfo queryByUserIdAndAppId(Long userId,String appId,Integer tenantId){
return weChatUserRepository.findByUserIdAndAppIdAndTenantId(userId,appId,tenantId);
}
@Override
public List<WechatUserInfo> queryListByUserIdAndAppId(List<Long> userIds,String appId,Integer tenantId){
return weChatUserRepository.findByUserIdInAndAppIdAndTenantId(userIds,appId,tenantId);
}
@Override
public List<WechatUserInfo> queryListByUnionId(String unionId,Integer tenantId) {
return weChatUserRepository.findByUnionIdAndTenantId(unionId,tenantId);
......
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