feat:认证

This commit is contained in:
dzc committed 2025-12-03 10:49:58 +08:00
1 parent 6985ee98e6
commit fc83656496
27 files changed
+322 -62

No files matched your search

@@ -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 ==========
@@ -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;
@@ -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() {
@@ -8,11 +8,6 @@ import lombok.Data;
@Data
public class ThirdFindFaceVerifyReqVo {
/**
* 认证场景ID
*/
private Long SceneId;
/**
* 实人认证唯一标识
*/
@@ -37,6 +37,11 @@ public class ThirdFindFaceVerifyResVo {
*/
private String MaterialInfo;
/**
* 错误信息
*/
private String errorMessage;
/**
* 验证通过
*/
@@ -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;
}
@@ -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;
}
}
@@ -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());
}
@@ -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));
}
@@ -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);
}
@@ -36,7 +36,7 @@ public class ComAuthDO extends BaseDO {
/**
* 认证类型编号
*/
private Long bizId;
private String bizId;
/**
* 认证图片或视频
@@ -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);
}
@@ -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);
}
@@ -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);
}
}
@@ -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();
}
@@ -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());
}
}
@@ -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);
/**
* 获得用户相册分页
*/
@@ -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);
@@ -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);
}
@@ -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();
}
}
@@ -85,7 +85,7 @@ public interface RecentService {
/**
* 查询朋友圈用户
*/
RecentPageResVo getRecentUserByUserId(Long userId);
RecentPageResVo getRecentUserByUserId(Long operateUserId, Long userId);
/**
* 朋友圈我喜欢的、喜欢我的等总数统计
@@ -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信息
*/
@@ -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