feat:用户配置

This commit is contained in:
dzc committed 2025-11-28 10:41:05 +08:00
1 parent 1c4d6b64ba
commit 9055bb29cf
11 files changed
+120 -11

No files matched your search

@@ -17,6 +17,7 @@ public enum MemberRecentTagEnum {
TRUE_PERSON_AUTH("1", "真人认证"),
NEW_PERSON("2", "新人"),
HOME_RECOMMEND("3", "首页推荐"),
;
private final String type;
private final String description;
@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.member.controller.admin.user;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.member.controller.app.user.vo.recentcfg.MemberRecentCfgReqVo;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
import cn.iocoder.yudao.module.member.service.user.MemberRecentCfgService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 用户朋友圈配置")
@RestController
@RequestMapping("/member/recent-cfg")
@Validated
@Slf4j
public class MemberRecentCfgController {
@Resource
private MemberRecentCfgService recentCfgService;
@PostMapping("/create-or-update")
@Operation(summary = "创建或更新配置")
public CommonResult<MemberRecentCfgDO> createOrUpdate(@RequestBody MemberRecentCfgReqVo dto) {
return success(recentCfgService.createOrUpdate(dto));
}
}
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.member.controller.admin.user;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.*;
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
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.user.MemberRecentTagMapper;
@@ -16,6 +18,7 @@ import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService;
import cn.iocoder.yudao.module.member.service.tag.MemberTagService;
import cn.iocoder.yudao.module.member.service.user.MemberRecentCfgService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -55,6 +58,8 @@ public class MemberUserController {
@Resource
private MemberRecentTagMapper memberRecentTagMapper;
@Resource
private MemberRecentCfgService memberRecentCfgService;
@PutMapping("/update")
@Operation(summary = "更新会员用户")
@@ -87,7 +92,21 @@ public class MemberUserController {
@PreAuthorize("@ss.hasPermission('member:user:query')")
public CommonResult<MemberUserRespVO> getUser(@RequestParam("id") Long id) {
MemberUserDO user = memberUserService.getUser(id);
return success(MemberUserConvert.INSTANCE.convert03(user));
MemberUserRespVO result = MemberUserConvert.INSTANCE.convert03(user);
// 查询用户tag
if (ObjectUtil.isNotEmpty(result)) {
List<MemberRecentTagDO> memberRecentTags = memberRecentTagMapper.getByMemberId(result.getId());
if (ObjectUtil.isNotEmpty(memberRecentTags)) {
List<MemberUserRespVO.MemberTag> tags = memberRecentTags.stream().map(v -> {
MemberUserRespVO.MemberTag entity = new MemberUserRespVO.MemberTag();
entity.setTagBizType(v.getTagBizType());
entity.setTagTitle(v.getTagTitle());
return entity;
}).collect(Collectors.toList());
result.setMemberTagList(tags);
}
}
return success(result);
}
@GetMapping("/page")
@@ -111,7 +130,9 @@ public class MemberUserController {
List<MemberGroupDO> groups = memberGroupService.getGroupList(convertSet(pageResult.getList(), MemberUserDO::getGroupId));
// 处理用户朋友圈的TAG
List<MemberRecentTagDO> memberRecentTags = memberRecentTagMapper.getByIds(convertSet(pageResult.getList(), MemberUserDO::getId));
return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags,memberRecentTags, levels, groups));
// 查询用户配置
List<MemberRecentCfgDO> memberCfgList = memberRecentCfgService.getByMemberIds(convertSet(pageResult.getList(), MemberUserDO::getId));
return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, memberRecentTags, levels, groups, memberCfgList));
}
}
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.member.controller.admin.user.vo;
import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageResVo;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -53,6 +54,9 @@ public class MemberUserRespVO extends MemberUserBaseVO {
@Schema(description = "用户tag")
private List<MemberUserRespVO.MemberTag> memberTagList;
@Schema(description = "朋友圈相关配置")
private MemberRecentCfgDO recentCfg;
@Data
public static class MemberTag {
@@ -27,7 +27,7 @@ public class AppMemberRecentCfgController {
@PostMapping("/create-or-update")
@Operation(summary = "创建或更新配置")
public CommonResult<MemberRecentCfgDO> getUserInfo(@RequestBody MemberRecentCfgReqVo dto) {
public CommonResult<MemberRecentCfgDO> createOrUpdate(@RequestBody MemberRecentCfgReqVo dto) {
dto.setMemberId(getLoginUserId());
return success(recentCfgService.createOrUpdate(dto));
}
@@ -16,6 +16,10 @@ public class MemberRecentCfgReqVo {
@Schema(description = "用户id")
private Long memberId;
@NotNull(message = "是否推送不能为空")
@Schema(description = "是否推送")
private Boolean isPush;
@NotNull(message = "首页隐身不能为空")
@Schema(description = "首页隐身")
private Boolean homeHide;
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.member.convert.address.AddressConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import org.mapstruct.Mapper;
@@ -54,18 +55,29 @@ public interface MemberUserConvert {
List<MemberTagDO> tags,
List<MemberRecentTagDO> memberRecentTags,
List<MemberLevelDO> levels,
List<MemberGroupDO> groups) {
List<MemberGroupDO> groups,
List<MemberRecentCfgDO> memberCfgList
) {
PageResult<MemberUserRespVO> result = convertPage(pageResult);
// 处理关联数据
Map<Long, String> tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
Map<Long, String> levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName);
Map<Long, String> groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName);
Map<Long, MemberRecentCfgDO> memberCfgMap = convertMap(memberCfgList, MemberRecentCfgDO::getMemberId);
// 填充关联数据
result.getList().forEach(user -> {
user.setTagNames(convertList(user.getTagIds(), tagMap::get));
user.setLevelName(levelMap.get(user.getLevelId()));
user.setGroupName(groupMap.get(user.getGroupId()));
user.setMemberTagList(new ArrayList<>());
MemberRecentCfgDO cfg = memberCfgMap.get(user.getId());
if (ObjectUtil.isEmpty(cfg)) {
user.setRecentCfg(MemberRecentCfgDO.builder().isPush(false).homeHide(false).privacySecure(false).shortNote(false).build());
} else {
user.setRecentCfg(cfg);
}
// 处理朋友圈TAG
List<MemberRecentTagDO> targetTags = memberRecentTags.stream().filter(v -> ObjectUtil.equals(v.getMemberId(), user.getId())).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(targetTags)) {
@@ -30,6 +30,11 @@ public class MemberRecentCfgDO extends BaseDO {
*/
private Long memberId;
/**
* 推送开关
*/
private Boolean isPush;
/**
* 首页隐身
*/
@@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* 朋友圈用户tag Mapper
@@ -14,10 +14,16 @@ import java.util.Set;
@Mapper
public interface MemberRecentTagMapper extends BaseMapperX<MemberRecentTagDO> {
default List<MemberRecentTagDO> getByIds(Set<Long> memberIds) {
default List<MemberRecentTagDO> getByIds(Collection<Long> memberIds) {
return selectList(new LambdaQueryWrapperX<MemberRecentTagDO>()
.in(MemberRecentTagDO::getMemberId, memberIds)
);
}
default List<MemberRecentTagDO> getByMemberId(Long memberId) {
return selectList(new LambdaQueryWrapperX<MemberRecentTagDO>()
.eq(MemberRecentTagDO::getMemberId, memberId)
);
}
}
@@ -4,11 +4,17 @@ package cn.iocoder.yudao.module.member.service.user;
import cn.iocoder.yudao.module.member.controller.app.user.vo.recentcfg.MemberRecentCfgReqVo;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* 用户朋友圈相关配置 Service 接口
*/
public interface MemberRecentCfgService {
List<MemberRecentCfgDO> getByMemberIds(Collection<Long> memberIds);
/**
* 创建或新增配置
*/
@@ -23,6 +29,4 @@ public interface MemberRecentCfgService {
* 删除配置
*/
int del(Long menberId);
}
@@ -12,6 +12,11 @@ import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* 用户朋友圈相关配置 Service 实现类
@@ -25,14 +30,25 @@ public class MemberRecentCfgServiceImpl implements MemberRecentCfgService {
@Resource
private RecentCfgMapper recentCfgMapper;
@Override
public List<MemberRecentCfgDO> getByMemberIds(Collection<Long> memberIds) {
if (ObjectUtil.isEmpty(memberIds)) return new ArrayList<>();
return recentCfgMapper.selectList(new LambdaQueryWrapperX<MemberRecentCfgDO>()
.in(MemberRecentCfgDO::getMemberId, memberIds)
);
}
/**
* 创建或新增配置
*/
@Override
public MemberRecentCfgDO createOrUpdate(MemberRecentCfgReqVo dto) {
MemberRecentCfgDO detail = recentCfgMapper.selectOne(new LambdaQueryWrapperX<MemberRecentCfgDO>()
.eq(MemberRecentCfgDO::getMemberId, dto.getMemberId())
);
MemberRecentCfgDO detail = null;
if (ObjectUtil.isNotEmpty(dto.getMemberId())) {
detail = recentCfgMapper.selectOne(new LambdaQueryWrapperX<MemberRecentCfgDO>()
.eq(MemberRecentCfgDO::getMemberId, dto.getMemberId())
);
}
MemberRecentCfgDO entity = BeanUtil.toBean(dto, MemberRecentCfgDO.class);
if (ObjectUtil.isEmpty(detail)) {
recentCfgMapper.insert(entity);