diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/MemberFill.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/MemberFill.java deleted file mode 100644 index d09db2b61..000000000 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/MemberFill.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.dromara.common.web.core; - -public interface MemberFill { -} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillAspect.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillAspect.java new file mode 100644 index 000000000..ce295132e --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillAspect.java @@ -0,0 +1,127 @@ +package com.wzj.soopin.member.annotation; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.wzj.soopin.member.domain.vo.MemberVO; +import com.wzj.soopin.member.service.IMemberService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.dromara.common.core.domain.R; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.util.Collection; + +@Aspect +@Component +@RequiredArgsConstructor +@Slf4j +public class MemberFillAspect { + + private final IMemberService memberService; + + @Around("@annotation(com.wzj.soopin.member.annotation.MemberFillMethod)") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + Object result = joinPoint.proceed(); + if (result instanceof R) { + Object data = ((R) result).getData(); + if (data != null) { + processObject(data); + } + } + return result; + } + + private void processObject(Object obj) { + + //基础类型跳过 + if (obj == null || isPrimitiveType(obj.getClass())) return; + + // 处理集合类型 + if (obj instanceof Collection) { + for (Object item : (Collection) obj) { + processObject(item); + } + return; + } + + // 处理分页类型 + if (obj instanceof IPage) { + + for (Object item : (Collection)((IPage) obj).getRecords()) { + processObject(item); + } + return; + } + + // 处理数组类型 + if (obj.getClass().isArray()) { + int length = java.lang.reflect.Array.getLength(obj); + for (int i = 0; i < length; i++) { + processObject(java.lang.reflect.Array.get(obj, i)); + } + return; + } + + + + // 同原 MemberFillInterceptor 中的逻辑,简化处理 + Class clazz = obj.getClass(); + while (clazz != null && clazz != Object.class) { + for (Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(MemberFillField.class)) { + handleMemberFill(obj, field); + } + } + clazz = clazz.getSuperclass(); + } + } + + // 判断是否为基本类型或包装类型 + private boolean isPrimitiveType(Class clazz) { + return clazz.isPrimitive() || + clazz.equals(String.class) || + clazz.equals(Integer.class) || + clazz.equals(Long.class) || + clazz.equals(Double.class) || + clazz.equals(Float.class) || + clazz.equals(Boolean.class) || + clazz.equals(Character.class) || + clazz.equals(Short.class) || + clazz.equals(Byte.class); + } + + private void handleMemberFill(Object obj, Field field) { + try { + field.setAccessible(true); + MemberFillField annotation = field.getAnnotation(MemberFillField.class); + String memberIdFieldName = annotation.id(); + + Field idField = findField(obj.getClass(), memberIdFieldName); + idField.setAccessible(true); + Object memberId = idField.get(obj); + + if (memberId instanceof Long) { + MemberVO member = memberService.getMemberInfo((Long) memberId); + if (member != null) { + field.set(obj, member); + } + } + } catch (Exception e) { + log.error("会员信息填充失败", e); + } + } + + private Field findField(Class clazz, String fieldName) throws NoSuchFieldException { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + Class superClass = clazz.getSuperclass(); + if (superClass == null) throw e; + return findField(superClass, fieldName); + } + } +} + diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillField.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillField.java new file mode 100644 index 000000000..3f73acdd5 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillField.java @@ -0,0 +1,18 @@ +package com.wzj.soopin.member.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义vo处理器,用于标注需要填充member的对象 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface MemberFillField { + + String id() default ""; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillMethod.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillMethod.java new file mode 100644 index 000000000..a6a06a6ac --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/annotation/MemberFillMethod.java @@ -0,0 +1,15 @@ +package com.wzj.soopin.member.annotation; + +import java.lang.annotation.*; + +/** + * 自定义vo处理器,用于标注需要填充member的对象 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface MemberFillMethod { + + String id() default ""; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java index 76c08b763..c968d56ab 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java @@ -1,19 +1,17 @@ package com.wzj.soopin.member.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.annotation.MemberFillMethod; import com.wzj.soopin.member.convert.FansConvert; -import com.wzj.soopin.member.convert.FeedbackConvert; +import com.wzj.soopin.member.convert.MemberBlockConvert; import com.wzj.soopin.member.domain.bo.FansBO; -import com.wzj.soopin.member.domain.bo.FeedbackBO; import com.wzj.soopin.member.domain.po.Fans; -import com.wzj.soopin.member.domain.po.Feedback; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.po.MemberBlock; import com.wzj.soopin.member.domain.vo.FansVO; -import com.wzj.soopin.member.domain.vo.FeedbackVO; +import com.wzj.soopin.member.domain.vo.MemberBlockVO; import com.wzj.soopin.member.service.IFansService; import com.wzj.soopin.member.service.IMemberBlockService; import com.wzj.soopin.member.service.IMemberService; @@ -22,7 +20,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.domain.R; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.redis.utils.RedisUtils; @@ -45,28 +42,29 @@ public class FansController { private final IMemberBlockService memberBlockService; + private final MemberBlockConvert memberblockconvert; @Tag(name ="粉丝列表") @PostMapping("/fan/list") - public R> fansList( Long memberId, @RequestBody Page page) { + public R> fansList(@RequestBody FansBO bo, @RequestBody Page page) { LambdaQueryWrapper< Fans> fansQuery = new LambdaQueryWrapper<>(); - fansQuery.eq(Fans::getVloggerId, memberId); + fansQuery.eq(Fans::getVloggerId, bo.getMemberId()); Page fans= service.page(page,fansQuery); return R.ok(convert.toVO( fans)); } @Tag(name ="关注列表") @PostMapping("/follow/list") - public R> followList( Long memberId, @RequestBody Page page) { + public R> followList(@RequestBody FansBO bo, @RequestBody Page page) { LambdaQueryWrapper< Fans> fansQuery = new LambdaQueryWrapper<>(); - fansQuery.eq(Fans::getFanId, memberId); + fansQuery.eq(Fans::getFanId, bo.getMemberId()); Page fans= service.page(page,fansQuery); return R.ok(convert.toVO( fans)); } @Tag(name ="朋友列表") @PostMapping("/friend/list") - public R> friendList( Long memberId, @RequestBody Page page) { + public R> friendList( @RequestBody FansBO bo, @RequestBody Page page) { LambdaQueryWrapper< Fans> fansQuery = new LambdaQueryWrapper<>(); - fansQuery.eq(Fans::getVloggerId, memberId); + fansQuery.eq(Fans::getVloggerId, bo.getMemberId()); fansQuery.eq(Fans::getFriendFlag, 1); Page fans= service.page(page,fansQuery); return R.ok(convert.toVO( fans)); @@ -152,9 +150,12 @@ public class FansController { } @GetMapping("block/list") - public R> queryBlockVloger(@RequestParam Long myId) { + @MemberFillMethod + public R> queryBlockVloger(@RequestParam Long myId) { - return R.ok(memberBlockService.list(new LambdaQueryWrapper().eq(MemberBlock::getMemberId, myId))); + List blockList= memberBlockService.list(new LambdaQueryWrapper().eq(MemberBlock::getMemberId, myId)); + + return R.ok(memberblockconvert.toVO(blockList)); } /** diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java index bb4cf449a..bd5a9f58e 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java @@ -112,7 +112,7 @@ public class FeedbackController { @Tag(name = ("处理")) @Log(title = "意见反馈", businessType = BusinessType.UPDATE) - @PostMapping("/handle/handle") + @PostMapping("/handle") public R changeStatus(@RequestBody FeedbackBO bo) { service.handle(convert.toPo(bo)); return R.ok(); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberBlockConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberBlockConvert.java new file mode 100644 index 000000000..bb05533c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberBlockConvert.java @@ -0,0 +1,20 @@ +package com.wzj.soopin.member.convert; + +import com.wzj.soopin.member.domain.bo.FeedbackBO; +import com.wzj.soopin.member.domain.po.Feedback; +import com.wzj.soopin.member.domain.po.MemberBlock; +import com.wzj.soopin.member.domain.vo.FeedbackVO; +import com.wzj.soopin.member.domain.vo.MemberBlockVO; +import org.dromara.common.web.core.BaseConverter; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +/** + * 意见反馈 DO <=> VO / BO + * + * @author zcc + */ +@Mapper(componentModel = "spring",uses = BaseConverter.class) +public interface MemberBlockConvert extends BaseConverter { + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FansBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FansBO.java index a7c61d9e8..154bc85c6 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FansBO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FansBO.java @@ -19,6 +19,14 @@ import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint; public class FansBO extends BaseBO { + /** + * 用户 + */ + @Schema(description ="用户id") + private String memberId; + + + /** * 博主id */ diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FansVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FansVO.java index 47f7bff2d..c27f13d62 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FansVO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FansVO.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.domain.vo; +import com.wzj.soopin.member.annotation.MemberFillField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; @@ -17,6 +18,7 @@ public class FansVO { @Schema(description ="博主id") @Excel(name = "博主id") + @MemberFillField(id = "vloggerId") private MemberVO vlogger; @Schema(description ="博主id") @@ -24,6 +26,7 @@ public class FansVO { @Schema(description ="粉丝id") @Excel(name = "粉丝id") + @MemberFillField(id = "fanId") private MemberVO fan; @Schema(description ="粉丝id") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberBlockVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberBlockVO.java index e8dff1a0e..df93b7a82 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberBlockVO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberBlockVO.java @@ -1,7 +1,7 @@ package com.wzj.soopin.member.domain.vo; import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.wzj.soopin.member.annotation.MemberFillField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.dromara.common.core.domain.model.BaseAudit; @@ -20,8 +20,15 @@ public class MemberBlockVO extends BaseAudit { @Schema(description ="用户id") private Long memberId; + @Schema(description ="用户") + @MemberFillField(id = "memberId") + private MemberVO member; @Schema(description ="被拉黑人id") private Long blockMemberId; + @Schema(description ="被拉黑人") + @MemberFillField(id = "blockMemberId") + private MemberVO blockMember; + } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java index be95e9fa1..28c630e1a 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java @@ -7,6 +7,7 @@ import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.vo.MemberVO; import org.dromara.common.core.constant.ResultCode; +import java.io.Serializable; import java.util.List; public interface IMemberService extends IService { @@ -60,4 +61,7 @@ public interface IMemberService extends IService { String getPhoneDecrypted(String phoneEncrypted) ; + + + MemberVO getMemberInfo(Serializable id); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index 06a02967a..2b35b8b94 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -6,10 +6,12 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.member.convert.MemberConvert; import com.wzj.soopin.member.domain.bo.MemberBO; import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.po.MemberAccount; +import com.wzj.soopin.member.domain.vo.MemberVO; import com.wzj.soopin.member.mapper.MemberAccountMapper; import com.wzj.soopin.member.mapper.MemberCartMapper; import com.wzj.soopin.member.mapper.MemberMapper; @@ -54,6 +56,9 @@ public class MemberServiceImpl extends ServiceImpl implemen private final MemberAccountMapper memberAccountMapper; + + private final MemberConvert memberConvert; + @Override public boolean usernameExists(String username) { return baseMapper.countByUsername(username) > 0; // 确保实现 @@ -252,4 +257,10 @@ public class MemberServiceImpl extends ServiceImpl implemen public Member getById(Serializable id) { return super.getById(id); } + + + @Override + public MemberVO getMemberInfo(Serializable id) { + return memberConvert.toVO(getById(id)); + } }