feat:认证
This commit is contained in:
1 parent
6985ee98e6
commit
fc83656496
27 files changed
+322
-62
No files matched your search
+1
@@ -63,6 +63,7 @@ public interface MemberErrorCode {
|
||||
ErrorCode RATING_SCORE_NOT_NULL = new ErrorCode(2_001_000_003, "评价分数不能为空");
|
||||
ErrorCode VIEW_RECORD_NOT_EXISTS = new ErrorCode(2_001_000_004, "用户查看记录不存在");
|
||||
ErrorCode COM_AUTH_NOT_EXISTS = new ErrorCode(2_001_000_005, "通用认证不存在");
|
||||
ErrorCode COM_AUTH_EXISTS = new ErrorCode(2_001_000_005, "正在认证中,请勿重复发起");
|
||||
ErrorCode THIRD_AUTH_START_ERROR = new ErrorCode(2_001_000_006, "第三方认证发起失败");
|
||||
|
||||
//========== 用户图片、视频资源管理 1-004-013-000 ==========
|
||||
|
||||
+4
-1
@@ -50,7 +50,7 @@ public class ThirdFaceVerifyServiceImpl implements ThirdFaceVerifyService {
|
||||
request.setFaceContrastPictureUrl(dto.getFaceVerifyUrl());
|
||||
// 配置
|
||||
request.setCallbackToken(thirdAlConfig.getFaceVerifyCallbackToken());
|
||||
request.setCallbackUrl(thirdAlConfig.getFaceVerifyCallbackUrl());
|
||||
request.setCallbackUrl(thirdAlConfig.getFaceVerifyCallbackUrl() + "/admin-api/third-callback/face-verify");
|
||||
|
||||
InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request);
|
||||
if (ObjectUtil.isEmpty(response)) {
|
||||
@@ -117,6 +117,9 @@ public class ThirdFaceVerifyServiceImpl implements ThirdFaceVerifyService {
|
||||
}
|
||||
ThirdFindFaceVerifyResVo result = new ThirdFindFaceVerifyResVo();
|
||||
DescribeFaceVerifyResponseBody body = response.getBody();
|
||||
if (ObjectUtil.notEqual(body.getCode(), "200")) {
|
||||
result.setErrorMessage(body.getMessage());
|
||||
}
|
||||
DescribeFaceVerifyResponseBody.DescribeFaceVerifyResponseBodyResultObject resultObject = body.getResultObject();
|
||||
BeanUtil.toBean(resultObject, ThirdFindFaceVerifyResVo.class);
|
||||
return result;
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ public class ThirdFaceVerifyResVO {
|
||||
private String certifyUrl;
|
||||
|
||||
public boolean isPass() {
|
||||
return ObjectUtil.isAllNotEmpty(certifyId, certifyUrl);
|
||||
return ObjectUtil.isAllNotEmpty(certifyId);
|
||||
}
|
||||
|
||||
public boolean isFail() {
|
||||
|
||||
-5
@@ -8,11 +8,6 @@ import lombok.Data;
|
||||
@Data
|
||||
public class ThirdFindFaceVerifyReqVo {
|
||||
|
||||
/**
|
||||
* 认证场景ID
|
||||
*/
|
||||
private Long SceneId;
|
||||
|
||||
/**
|
||||
* 实人认证唯一标识
|
||||
*/
|
||||
|
||||
+5
@@ -37,6 +37,11 @@ public class ThirdFindFaceVerifyResVo {
|
||||
*/
|
||||
private String MaterialInfo;
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*/
|
||||
private String errorMessage;
|
||||
|
||||
/**
|
||||
* 验证通过
|
||||
*/
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.recent.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class OperationStatusVo {
|
||||
|
||||
@Schema(description = "用户id")
|
||||
private Long memberId;
|
||||
|
||||
@Schema(description = "是否点赞")
|
||||
private Boolean isLike = false;
|
||||
|
||||
}
|
||||
+17
@@ -19,9 +19,15 @@ public class RecentPageResVo extends RecentDO {
|
||||
@Schema(description = "操作统计相关")
|
||||
private OperationTotal operationTotal;
|
||||
|
||||
@Schema(description = "操作相关状态")
|
||||
private OperationStatusVo operationStatus;
|
||||
|
||||
@Schema(description = "用户tag")
|
||||
private List<MemberTag> memberTagList;
|
||||
|
||||
@Schema(description = "用户相册")
|
||||
private List<RecentPageResVo.MemberPhoto> MemberPhotoList;
|
||||
|
||||
@Schema(description = "距离(km)")
|
||||
private Double distance;
|
||||
|
||||
@@ -92,4 +98,15 @@ public class RecentPageResVo extends RecentDO {
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class MemberPhoto {
|
||||
|
||||
@Schema(description = "资源类型")
|
||||
private String resourceType;
|
||||
|
||||
@Schema(description = "资源地址")
|
||||
private String address;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+3
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.controller.admin.thirdcallback;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
||||
import cn.iocoder.yudao.module.member.client.service.ThirdFaceVerifyService;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFindFaceVerifyReqVo;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFindFaceVerifyResVo;
|
||||
@@ -38,6 +39,7 @@ public class ThirdCallbackController {
|
||||
@GetMapping("/face-verify")
|
||||
@Operation(summary = "人脸认证回调")
|
||||
@PermitAll
|
||||
@TenantIgnore
|
||||
public void faceVerify(FaceVerifyCallbackReqVo query) {
|
||||
log.info("人脸认证回调,params={}", JSONUtil.toJsonStr(query));
|
||||
if (!ObjectUtil.isAllNotEmpty(query.getCallbackToken(), query.getCertifyId(), query.getPassed())) {
|
||||
@@ -61,6 +63,7 @@ public class ThirdCallbackController {
|
||||
return;
|
||||
}
|
||||
ComAuthDO updateObj = new ComAuthDO();
|
||||
updateObj.setFailReason(faceVerifyRes.getErrorMessage());
|
||||
if (faceVerifyRes.isPassed()) {
|
||||
updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK_PASS.getType());
|
||||
}
|
||||
|
||||
+2
-2
@@ -28,14 +28,14 @@ public class AppComAuthController {
|
||||
|
||||
@PostMapping("/create-man-auth")
|
||||
@Operation(summary = "创建男性认证")
|
||||
public CommonResult<Long> createManAuth(@Valid @RequestBody CreateManAuthReqVo dto) {
|
||||
public CommonResult<ComAuthDO> createManAuth(@Valid @RequestBody CreateManAuthReqVo dto) {
|
||||
dto.setMemberId(getLoginUserId());
|
||||
return success(comAuthService.createManAuth(dto));
|
||||
}
|
||||
|
||||
@PostMapping("/create-woman-auth")
|
||||
@Operation(summary = "创建女性认证")
|
||||
public CommonResult<Long> createWomanAuth(@Valid @RequestBody CreateWomanAuthReqVo dto) {
|
||||
public CommonResult<ComAuthDO> createWomanAuth(@Valid @RequestBody CreateWomanAuthReqVo dto) {
|
||||
dto.setMemberId(getLoginUserId());
|
||||
return success(comAuthService.createWomanAuth(dto));
|
||||
}
|
||||
|
||||
+1
-6
@@ -9,11 +9,6 @@ import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageResVo
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.viewrecord.vo.ViewRecordPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.recent.vo.*;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserInfoRespVO;
|
||||
import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.viewrecord.ViewRecordDO;
|
||||
import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum;
|
||||
import cn.iocoder.yudao.module.member.service.recent.RecentService;
|
||||
import cn.iocoder.yudao.module.member.service.recent.ViewRecordService;
|
||||
@@ -132,7 +127,7 @@ public class AppRecentController {
|
||||
@GetMapping("/getById")
|
||||
@Operation(summary = "根据id查询用户信息")
|
||||
public CommonResult<RecentPageResVo> getUserInfoById(@RequestParam("id") Long id) {
|
||||
RecentPageResVo user = recentService.getRecentUserByUserId(id);
|
||||
RecentPageResVo user = recentService.getRecentUserByUserId(getLoginUserId(), id);
|
||||
return success(user);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ public class ComAuthDO extends BaseDO {
|
||||
/**
|
||||
* 认证类型编号
|
||||
*/
|
||||
private Long bizId;
|
||||
private String bizId;
|
||||
|
||||
/**
|
||||
* 认证图片或视频
|
||||
|
||||
+2
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.dal.mysql.photo;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageResVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.photo.vo.*;
|
||||
@@ -32,4 +33,5 @@ public interface PhotoMapper extends BaseMapperX<PhotoDO> {
|
||||
.orderByAsc(PhotoDO::getId));
|
||||
}
|
||||
|
||||
void getByUserId(RecentPageResVo.MemberVo member);
|
||||
}
|
||||
+3
-4
@@ -7,10 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationTotalGroupRecentRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.*;
|
||||
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppEvaluateDetailResVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO;
|
||||
@@ -50,4 +47,6 @@ public interface OperationMapper extends BaseMapperX<OperationDO> {
|
||||
OperationTotalGroupRecentRespVO totalGroupRecentByUser(@Param("userId") Long userId);
|
||||
|
||||
AppEvaluateDetailResVo evaluateDetail(@Param("userId") Long userid);
|
||||
|
||||
List<OperationStatusVo> getOperationStatus(@Param("operationUserId") Long operationUserId, @Param("userIdList") List<Long> userIdList);
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package cn.iocoder.yudao.module.member.job.thirdAuth;
|
||||
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
||||
import cn.iocoder.yudao.module.member.service.comauth.ComAuthService;
|
||||
import cn.iocoder.yudao.module.member.service.comauth.ComAuthServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 轮训阿里云人脸认证Job
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ThirdFaceFaceVerifyJob implements JobHandler {
|
||||
|
||||
@Resource
|
||||
private ComAuthService comAuthService;
|
||||
|
||||
@Override
|
||||
@TenantJob
|
||||
public String execute(String param) throws Exception {
|
||||
int i = comAuthService.faceVerifyRound();
|
||||
return String.format("轮训阿里云人脸认证Job %s 个", i);
|
||||
}
|
||||
|
||||
}
|
||||
+7
-2
@@ -22,12 +22,12 @@ public interface ComAuthService {
|
||||
/**
|
||||
* 创建男性认证
|
||||
*/
|
||||
Long createManAuth(@Valid CreateManAuthReqVo dto);
|
||||
ComAuthDO createManAuth(@Valid CreateManAuthReqVo dto);
|
||||
|
||||
/**
|
||||
* 创建女性认证
|
||||
*/
|
||||
Long createWomanAuth(@Valid CreateWomanAuthReqVo dto);
|
||||
ComAuthDO createWomanAuth(@Valid CreateWomanAuthReqVo dto);
|
||||
|
||||
/**
|
||||
* 更新用户认证
|
||||
@@ -53,4 +53,9 @@ public interface ComAuthService {
|
||||
* 获得用户认证分页
|
||||
*/
|
||||
PageResult<ComAuthDO> getAuthPage(ComAuthPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 轮训人脸认证
|
||||
*/
|
||||
int faceVerifyRound();
|
||||
}
|
||||
+82
-9
@@ -1,11 +1,14 @@
|
||||
package cn.iocoder.yudao.module.member.service.comauth;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.member.client.service.ThirdFaceVerifyService;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFaceVerifyReqVO;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFaceVerifyResVO;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFindFaceVerifyReqVo;
|
||||
import cn.iocoder.yudao.module.member.client.vo.thirdfaceverify.ThirdFindFaceVerifyResVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.comauth.vo.ComAuthPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.comauth.vo.ComAuthSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.comauth.vo.CreateManAuthReqVo;
|
||||
@@ -17,7 +20,6 @@ import cn.iocoder.yudao.module.member.enums.auth.MemberComAuthEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.MemberErrorCode;
|
||||
import cn.iocoder.yudao.module.member.enums.auth.MemberComAuthStatusEnum;
|
||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -30,6 +32,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
@@ -64,10 +71,11 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createManAuth(CreateManAuthReqVo dto) {
|
||||
public ComAuthDO createManAuth(CreateManAuthReqVo dto) {
|
||||
isStartAuth(dto.getMemberId());
|
||||
// 新增
|
||||
ComAuthDO saveObj = new ComAuthDO();
|
||||
saveObj.setBizId(dto.getMemberId());
|
||||
saveObj.setAuthMemberId(dto.getMemberId());
|
||||
saveObj.setBizType(MemberComAuthEnum.MAN_MEMBER_TRUE.getType());
|
||||
saveObj.setAuthStatus("WAITING");
|
||||
saveObj.setAuthStatus(MemberComAuthStatusEnum.WAIT_AUTH.getType());
|
||||
@@ -83,8 +91,8 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
updateObj.setAuthExtraJson(authExtraJson);
|
||||
authMapper.updateById(updateObj);
|
||||
// 发起认证
|
||||
startAuth(saveObj, authExtraJson);
|
||||
return saveObj.getId();
|
||||
getSelf().startAuth(saveObj, authExtraJson);
|
||||
return authMapper.selectById(saveObj.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,10 +100,11 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createWomanAuth(CreateWomanAuthReqVo dto) {
|
||||
public ComAuthDO createWomanAuth(CreateWomanAuthReqVo dto) {
|
||||
isStartAuth(dto.getMemberId());
|
||||
// 新增auth
|
||||
ComAuthDO saveObj = new ComAuthDO();
|
||||
saveObj.setBizId(dto.getMemberId());
|
||||
saveObj.setAuthMemberId(dto.getMemberId());
|
||||
saveObj.setBizType(MemberComAuthEnum.WOMAN_MEMBER_TRUE.getType());
|
||||
saveObj.setAuthStatus(MemberComAuthStatusEnum.WAIT_AUTH.getType());
|
||||
saveObj.setAuthPic(dto.getAuthPic());
|
||||
@@ -115,13 +124,27 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
updateObj.setAuthExtraJson(authExtraJson);
|
||||
authMapper.updateById(updateObj);
|
||||
// 发起认证
|
||||
startAuth(saveObj, authExtraJson);
|
||||
return saveObj.getId();
|
||||
getSelf().startAuth(saveObj, authExtraJson);
|
||||
return authMapper.selectById(saveObj.getId());
|
||||
}
|
||||
|
||||
public void isStartAuth(Long userId) {
|
||||
ComAuthDO userAuth = getSelf().getUserAuth(userId);
|
||||
if (ObjectUtil.isEmpty(userAuth)) return;
|
||||
if (ObjectUtil.isEmpty(userAuth)) {
|
||||
throw exception(MemberErrorCode.COM_AUTH_NOT_EXISTS);
|
||||
}
|
||||
List<String> isStartEnumList = Arrays.asList(MemberComAuthStatusEnum.WAIT_AUTH.getType(), MemberComAuthStatusEnum.CHECK.getType());
|
||||
if (ObjectUtil.isNotEmpty(userAuth.getBizId()) && !isStartEnumList.contains(userAuth.getAuthStatus())) {
|
||||
return;
|
||||
}
|
||||
throw exception(MemberErrorCode.COM_AUTH_EXISTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起认证
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void startAuth(ComAuthDO auth, String metaInfoJson) {
|
||||
ThirdFaceVerifyReqVO dto = new ThirdFaceVerifyReqVO();
|
||||
dto.setCode(String.valueOf(auth.getId()));
|
||||
@@ -132,6 +155,14 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
if (ObjectUtil.isEmpty(thirdRes) || thirdRes.isFail()) {
|
||||
throw exception(MemberErrorCode.THIRD_AUTH_START_ERROR);
|
||||
}
|
||||
if (thirdRes.isPass()) {
|
||||
// 更新auth
|
||||
ComAuthDO updateObj = new ComAuthDO();
|
||||
updateObj.setId(auth.getId());
|
||||
updateObj.setBizId(thirdRes.getCertifyId());
|
||||
updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK.getType());
|
||||
authMapper.updateById(updateObj);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,10 +218,52 @@ public class ComAuthServiceImpl implements ComAuthService {
|
||||
return authMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮训人脸认证
|
||||
*/
|
||||
@Override
|
||||
public int faceVerifyRound() {
|
||||
List<ComAuthDO> faceVerifyList = authMapper.selectList(new LambdaQueryWrapperX<ComAuthDO>()
|
||||
.eq(ComAuthDO::getAuthStatus, MemberComAuthStatusEnum.CHECK.getType())
|
||||
.isNotNull(ComAuthDO::getBizId)
|
||||
);
|
||||
if (ObjectUtil.isEmpty(faceVerifyList)) {
|
||||
return 0;
|
||||
}
|
||||
int totalSync = 0;
|
||||
List<ComAuthDO> updateList = new ArrayList<>();
|
||||
for (ComAuthDO auth : faceVerifyList) {
|
||||
ComAuthDO entity = new ComAuthDO();
|
||||
entity.setId(auth.getId());
|
||||
entity.setAuthTime(LocalDateTime.now());
|
||||
|
||||
ThirdFindFaceVerifyReqVo dto = new ThirdFindFaceVerifyReqVo();
|
||||
dto.setCertifyId(auth.getBizId());
|
||||
ThirdFindFaceVerifyResVo res = thirdFaceVerifyService.findFaceVerify(dto);
|
||||
entity.setFailReason(res.getErrorMessage());
|
||||
if (ObjectUtil.isEmpty(res)) {
|
||||
continue;
|
||||
}
|
||||
if (res.isPassed()) {
|
||||
entity.setAuthStatus(MemberComAuthStatusEnum.CHECK_PASS.getType());
|
||||
}
|
||||
if (res.isNotPassed()) {
|
||||
entity.setAuthStatus(MemberComAuthStatusEnum.CHECK_FAIL.getType());
|
||||
}
|
||||
totalSync++;
|
||||
updateList.add(entity);
|
||||
}
|
||||
return totalSync;
|
||||
}
|
||||
|
||||
private void validateAuthExists(Long id) {
|
||||
if (authMapper.selectById(id) == null) {
|
||||
throw exception(MemberErrorCode.COM_AUTH_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
private ComAuthServiceImpl getSelf() {
|
||||
return SpringUtil.getBean(getClass());
|
||||
}
|
||||
|
||||
}
|
||||
+8
@@ -3,11 +3,14 @@ package cn.iocoder.yudao.module.member.service.photo;
|
||||
import javax.validation.*;
|
||||
|
||||
import cn.iocoder.yudao.module.member.controller.admin.photo.vo.*;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageResVo;
|
||||
import cn.iocoder.yudao.module.member.controller.app.photo.vo.AppCountResVo;
|
||||
import cn.iocoder.yudao.module.member.controller.app.photo.vo.AppUploadReqVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户相册 Service 接口
|
||||
*/
|
||||
@@ -48,6 +51,11 @@ public interface PhotoService {
|
||||
*/
|
||||
PhotoDO getPhoto(Long id);
|
||||
|
||||
/**
|
||||
* 根据用户id获取用户相册
|
||||
*/
|
||||
List<PhotoDO> getByUserId(Long userId);
|
||||
|
||||
/**
|
||||
* 获得用户相册分页
|
||||
*/
|
||||
|
||||
+14
@@ -24,6 +24,8 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.photo.PhotoMapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
@@ -115,6 +117,18 @@ public class PhotoServiceImpl implements PhotoService {
|
||||
return photoMapper.selectById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户id获取用户相册
|
||||
*/
|
||||
@Override
|
||||
public List<PhotoDO> getByUserId(Long userId) {
|
||||
return photoMapper.selectList(new LambdaQueryWrapperX<PhotoDO>()
|
||||
.eq(PhotoDO::getMemberId, userId)
|
||||
.orderByDesc(PhotoDO::getMemberId)
|
||||
.orderByDesc(PhotoDO::getCreateTime)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<PhotoDO> getPhotoPage(PhotoPageReqVO pageReqVO) {
|
||||
return photoMapper.selectPage(pageReqVO);
|
||||
|
||||
+10
-2
@@ -1,16 +1,18 @@
|
||||
package cn.iocoder.yudao.module.member.service.recent;
|
||||
|
||||
import javax.validation.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatusVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 朋友圈操作 Service 接口
|
||||
*
|
||||
* @author 聊天交友
|
||||
*/
|
||||
public interface OperationService {
|
||||
|
||||
@@ -39,4 +41,10 @@ public interface OperationService {
|
||||
*/
|
||||
PageResult<OperationRespVO> getOperationPage(OperationPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 查询朋友圈操作状态
|
||||
*/
|
||||
List<OperationStatusVo> getOperationStatus(Long operateUserId, List<Long> userList);
|
||||
|
||||
OperationStatusVo getOperationStatus(Long operateUserId, Long userList);
|
||||
}
|
||||
+25
@@ -1,19 +1,27 @@
|
||||
package cn.iocoder.yudao.module.member.service.recent;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatusVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper;
|
||||
import cn.iocoder.yudao.module.member.enums.MemberErrorCode;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
@@ -70,4 +78,21 @@ public class OperationServiceImpl implements OperationService {
|
||||
return operationMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询朋友圈操作状态
|
||||
*/
|
||||
@Override
|
||||
public List<OperationStatusVo> getOperationStatus(Long operateUserId, List<Long> list) {
|
||||
return operationMapper.getOperationStatus(operateUserId, list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OperationStatusVo getOperationStatus(Long operateUserId, Long userList) {
|
||||
List<OperationStatusVo> list = operationMapper.getOperationStatus(operateUserId, Arrays.asList(userList));
|
||||
if (ObjectUtil.isNotEmpty(list) && list.size() == 1) {
|
||||
return list.get(0);
|
||||
}
|
||||
return new OperationStatusVo();
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -85,7 +85,7 @@ public interface RecentService {
|
||||
/**
|
||||
* 查询朋友圈用户
|
||||
*/
|
||||
RecentPageResVo getRecentUserByUserId(Long userId);
|
||||
RecentPageResVo getRecentUserByUserId(Long operateUserId, Long userId);
|
||||
|
||||
/**
|
||||
* 朋友圈我喜欢的、喜欢我的等总数统计
|
||||
|
||||
+48
-7
@@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentLikeReqV
|
||||
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateReqVo;
|
||||
import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.location.LocationDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.photo.PhotoMapper;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
||||
@@ -23,12 +25,15 @@ import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum;
|
||||
import cn.iocoder.yudao.module.member.service.location.LocationService;
|
||||
import cn.iocoder.yudao.module.member.client.service.ThirdAuthService;
|
||||
import cn.iocoder.yudao.module.member.service.photo.PhotoService;
|
||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.mapstruct.ap.internal.model.assignment.UpdateWrapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -47,6 +52,7 @@ import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -75,6 +81,10 @@ public class RecentServiceImpl implements RecentService {
|
||||
private LocationService locationService;
|
||||
@Resource
|
||||
private ThirdAuthService thirdAuthService;
|
||||
@Resource
|
||||
private PhotoService photoService;
|
||||
@Resource
|
||||
private OperationService operationService;
|
||||
|
||||
/**
|
||||
* 创建朋友圈
|
||||
@@ -169,7 +179,12 @@ public class RecentServiceImpl implements RecentService {
|
||||
}
|
||||
OperationDO operationDO = operationMapper.selectOne(new LambdaQueryWrapperX<OperationDO>()
|
||||
.eq(OperationDO::getMemberId, dto.getMemberId())
|
||||
.eq(OperationDO::getMemberRecentId, dto.getMemberRecentId())
|
||||
.eq(OperationDO::getOperatorMemberId, dto.getOperatorMemberId())
|
||||
.eq(ObjectUtil.isNotEmpty(dto.getMemberRecentId()), OperationDO::getMemberRecentId, dto.getMemberRecentId())
|
||||
.in(OperationDO::getBizType, Arrays.asList(
|
||||
MemberRecentOperateEnum.MEMBER_COLLECT.getType(),
|
||||
MemberRecentOperateEnum.RECENT_LIKE.getType()
|
||||
))
|
||||
);
|
||||
if (ObjectUtil.isNotEmpty(operationDO)) {
|
||||
if (ObjectUtil.isEmpty(operationDO.getCancelTime())) {
|
||||
@@ -178,11 +193,14 @@ public class RecentServiceImpl implements RecentService {
|
||||
operationMapper.updateById(operationDO);
|
||||
return operationDO.getId();
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(operationDO.getCancelTime())) {
|
||||
operationMapper.delete(new LambdaQueryWrapperX<OperationDO>()
|
||||
.eq(OperationDO::getMemberId, dto.getMemberId())
|
||||
.eq(OperationDO::getMemberRecentId, dto.getMemberRecentId())
|
||||
);
|
||||
// 重新点赞
|
||||
else {
|
||||
LambdaUpdateWrapper<OperationDO> updateWrapper = new LambdaUpdateWrapper<OperationDO>()
|
||||
.eq(OperationDO::getId, operationDO.getId())
|
||||
.set(OperationDO::getTapTime, LocalDateTime.now())
|
||||
.set(OperationDO::getCancelTime, null);
|
||||
operationMapper.update(updateWrapper);
|
||||
return operationDO.getId();
|
||||
}
|
||||
}
|
||||
operationDO = new OperationDO();
|
||||
@@ -425,7 +443,7 @@ public class RecentServiceImpl implements RecentService {
|
||||
* 查询朋友圈用户
|
||||
*/
|
||||
@Override
|
||||
public RecentPageResVo getRecentUserByUserId(Long userId) {
|
||||
public RecentPageResVo getRecentUserByUserId(Long operateUserId, Long userId) {
|
||||
RecentPageResVo result = new RecentPageResVo();
|
||||
result.setMemberId(userId);
|
||||
// 添加用户信息
|
||||
@@ -433,6 +451,13 @@ public class RecentServiceImpl implements RecentService {
|
||||
// 查询用户最新的位置
|
||||
LocationDO currentUserLastLocation = locationService.getCurrentUserLastLocation();
|
||||
convertRecentPageResVoSetupLocation(result, currentUserLastLocation);
|
||||
// 添加用户相册
|
||||
convertRecentPageResVoSetupPhoto(result);
|
||||
// 查询用户操作状态
|
||||
OperationStatusVo operation = operationService.getOperationStatus(operateUserId, userId);
|
||||
if (ObjectUtil.isNotEmpty(operation)) {
|
||||
result.setOperationStatus(operation);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -609,6 +634,22 @@ public class RecentServiceImpl implements RecentService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户相册
|
||||
*/
|
||||
private void convertRecentPageResVoSetupPhoto(RecentPageResVo resVo) {
|
||||
if (ObjectUtil.isEmpty(resVo)) return;
|
||||
List<PhotoDO> photoList = photoService.getByUserId(resVo.getMemberId());
|
||||
if (ObjectUtil.isEmpty(photoList)) return;
|
||||
List<RecentPageResVo.MemberPhoto> memberPhotoList = photoList.stream().map(v -> {
|
||||
RecentPageResVo.MemberPhoto photo = new RecentPageResVo.MemberPhoto();
|
||||
photo.setResourceType(v.getResourceType());
|
||||
photo.setAddress(v.getAddress());
|
||||
return photo;
|
||||
}).collect(Collectors.toList());
|
||||
resVo.setMemberPhotoList(memberPhotoList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为OperationRespVO设置Member信息
|
||||
*/
|
||||
|
||||
+23
-2
@@ -44,8 +44,8 @@
|
||||
<select id="totalGroupRecentByUser"
|
||||
resultType="cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationTotalGroupRecentRespVO">
|
||||
select sum(if(a.biz_type = '1', 1, 0)) as likeTotal,
|
||||
sum(if(a.biz_type = '4' and a.operator_member_id = #{userId}, 1, 0)) as likeItTotal,
|
||||
sum(if(a.biz_type = '4' and a.member_id = #{userId}, 1, 0)) as likeMeTotal,
|
||||
sum(if(a.biz_type = '4' and a.cancel_time is null and a.operator_member_id = #{userId}, 1, 0)) as likeItTotal,
|
||||
sum(if(a.biz_type = '4' and a.cancel_time is null and a.member_id = #{userId}, 1, 0)) as likeMeTotal,
|
||||
sum(if(a.biz_type = '2', 1, 0)) as reportTotal,
|
||||
sum(if(a.biz_type = '3', 1, 0)) as shieldTotal,
|
||||
sum(if(a.biz_type = '4', 1, 0)) as collectTotal,
|
||||
@@ -67,4 +67,25 @@
|
||||
and a.operator_member_id != a.member_id
|
||||
group by a.member_id
|
||||
</select>
|
||||
|
||||
<select id="getOperationStatus"
|
||||
resultType="cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatusVo">
|
||||
select
|
||||
a.member_id,
|
||||
if(a.biz_type = '4' and a.cancel_time is null, true, false) as isLike
|
||||
from member_operation a
|
||||
<where>
|
||||
a.deleted = '0'
|
||||
<if test="operationUserId != null">
|
||||
and a.operator_member_id = #{operationUserId}
|
||||
</if>
|
||||
<if test="userIdList != null and userIdList.size() != 0">
|
||||
and a.member_id in
|
||||
<foreach collection="userIdList" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -48,14 +48,14 @@ spring:
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://127.0.0.1:3306/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://127.0.0.1:3306/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||
lazy: true # 开启懒加载,保证启动速度
|
||||
url: jdbc:mysql://127.0.0.1:3306/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://127.0.0.1:3306/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
|
||||
@@ -6,7 +6,7 @@ spring:
|
||||
autoconfigure:
|
||||
exclude:
|
||||
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
|
||||
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
||||
#- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
||||
- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
|
||||
- de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
|
||||
- de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
|
||||
@@ -46,14 +46,14 @@ spring:
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://123.157.250.162:37897/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://123.157.250.162:37897/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
slave: # 模拟从库,可根据自己需要修改
|
||||
lazy: true # 开启懒加载,保证启动速度
|
||||
url: jdbc:mysql://123.157.250.162:37897/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://123.157.250.162:37897/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
|
||||
@@ -45,14 +45,14 @@ spring:
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://192.168.0.7:3306/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://192.168.0.7:3306/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
slave: # 模拟从库,可根据自己需要修改
|
||||
lazy: true # 开启懒加载,保证启动速度
|
||||
url: jdbc:mysql://192.168.0.7:3306/chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: chat
|
||||
password: YPS3WFhcRiKLhRAm
|
||||
url: jdbc:mysql://192.168.0.7:3306/chat_v1?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: chat_v1
|
||||
password: 7RB4MMfKSxHmwnwD
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
host: 127.0.0.1 # 地址
|
||||
|
||||
@@ -284,6 +284,7 @@ yudao:
|
||||
- /admin-api/pay/notify/** # 支付回调通知,不携带租户编号
|
||||
- /jmreport/* # 积木报表,无法携带租户编号
|
||||
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
|
||||
- /admin-api/third-callback/** # 人脸识别回调接口,无法携带租户编号
|
||||
ignore-tables:
|
||||
- system_tenant
|
||||
- system_tenant_package
|
||||
|
||||
Reference in new issue
Block a user