Commit 4f589cad5359fd48dabfc3f9a34495fc2126e690

Authored by owen
1 parent 9b6e2114

会员:

1.会员设置标签
sql/mysql/member_tag.sql
... ... @@ -12,6 +12,7 @@ create table member_tag
12 12 )
13 13 comment '会员标签';
14 14  
  15 +alter table member_user add column tag_ids varchar(255) null comment '用户标签编号列表,以逗号分隔';
15 16  
16 17 -- 菜单 SQL
17 18 INSERT INTO system_menu(
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
1 1 package cn.iocoder.yudao.module.member.controller.admin.user;
2 2  
3   -import org.springframework.web.bind.annotation.*;
4   -import javax.annotation.Resource;
5   -import org.springframework.validation.annotation.Validated;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import io.swagger.v3.oas.annotations.tags.Tag;
8   -import io.swagger.v3.oas.annotations.Parameter;
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
  8 +import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
  9 +import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
  10 +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
  11 +import cn.iocoder.yudao.module.member.service.tag.MemberTagService;
  12 +import cn.iocoder.yudao.module.member.service.user.MemberUserService;
9 13 import io.swagger.v3.oas.annotations.Operation;
  14 +import io.swagger.v3.oas.annotations.Parameter;
  15 +import io.swagger.v3.oas.annotations.tags.Tag;
  16 +import org.springframework.security.access.prepost.PreAuthorize;
  17 +import org.springframework.validation.annotation.Validated;
  18 +import org.springframework.web.bind.annotation.*;
10 19  
11   -import javax.validation.*;
  20 +import javax.annotation.Resource;
  21 +import javax.validation.Valid;
  22 +import java.util.*;
  23 +import java.util.stream.Collectors;
12 24  
13   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
14   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
15 25 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
16   -
17   -import cn.iocoder.yudao.module.member.controller.admin.user.vo.*;
18   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
19   -import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
20   -import cn.iocoder.yudao.module.member.service.user.MemberUserService;
  26 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
21 27  
22 28 @Tag(name = "管理后台 - 会员用户")
23 29 @RestController
... ... @@ -27,6 +33,8 @@ public class MemberUserController {
27 33  
28 34 @Resource
29 35 private MemberUserService memberUserService;
  36 + @Resource
  37 + private MemberTagService memberTagService;
30 38  
31 39 @PutMapping("/update")
32 40 @Operation(summary = "更新会员用户")
... ... @@ -50,7 +58,17 @@ public class MemberUserController {
50 58 @PreAuthorize("@ss.hasPermission('member:user:query')")
51 59 public CommonResult<PageResult<MemberUserRespVO>> getUserPage(@Valid MemberUserPageReqVO pageVO) {
52 60 PageResult<MemberUserDO> pageResult = memberUserService.getUserPage(pageVO);
53   - return success(MemberUserConvert.INSTANCE.convertPage(pageResult));
  61 +
  62 + // 处理会员标签返显
  63 + Set<Long> tagIds = pageResult.getList().stream()
  64 + .map(MemberUserDO::getTagIds)
  65 + .filter(Objects::nonNull)
  66 + .flatMap(Collection::stream)
  67 + .collect(Collectors.toSet());
  68 + List<MemberTagDO> tags = memberTagService.getTagList(tagIds);
  69 + Map<Long, String> tagNameMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
  70 +
  71 + return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tagNameMap));
54 72 }
55 73  
56 74 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java
... ... @@ -7,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
7 7  
8 8 import javax.validation.constraints.NotNull;
9 9 import java.time.LocalDateTime;
  10 +import java.util.List;
10 11  
11 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
12 13  
... ... @@ -49,4 +50,7 @@ public class MemberUserBaseVO {
49 50 @Schema(description = "会员备注", example = "我是小备注")
50 51 private String mark;
51 52  
  53 + @Schema(description = "会员标签")
  54 + private List<Long> tagIds;
  55 +
52 56 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java
... ... @@ -8,6 +8,7 @@ import lombok.ToString;
8 8 import org.springframework.format.annotation.DateTimeFormat;
9 9  
10 10 import java.time.LocalDateTime;
  11 +import java.util.List;
11 12  
12 13 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 14  
... ... @@ -31,4 +32,7 @@ public class MemberUserPageReqVO extends PageParam {
31 32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32 33 private LocalDateTime[] createTime;
33 34  
  35 + @Schema(description = "会员标签")
  36 + private List<Long> tagIds;
  37 +
34 38 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java
... ... @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8 8 import java.time.LocalDateTime;
  9 +import java.util.List;
9 10  
10 11 @Schema(description = "管理后台 - 会员用户 Response VO")
11 12 @Data
... ... @@ -28,4 +29,9 @@ public class MemberUserRespVO extends MemberUserBaseVO {
28 29 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
29 30 private LocalDateTime createTime;
30 31  
  32 +
  33 + // ========== 其它信息 ==========
  34 +
  35 + @Schema(description = "会员标签")
  36 + private List<String> tagNames;
31 37 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java
... ... @@ -10,6 +10,9 @@ import org.mapstruct.Mapper;
10 10 import org.mapstruct.factory.Mappers;
11 11  
12 12 import java.util.List;
  13 +import java.util.Map;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
13 16  
14 17 @Mapper
15 18 public interface MemberUserConvert {
... ... @@ -28,4 +31,12 @@ public interface MemberUserConvert {
28 31  
29 32 MemberUserRespVO convert03(MemberUserDO bean);
30 33  
  34 + default PageResult<MemberUserRespVO> convertPage(PageResult<MemberUserDO> pageResult,
  35 + Map<Long, String> tagMap) {
  36 + PageResult<MemberUserRespVO> result = convertPage(pageResult);
  37 + for (MemberUserRespVO vo : result.getList()) {
  38 + vo.setTagNames(convertList(vo.getTagIds(), tagMap::get));
  39 + }
  40 + return result;
  41 + }
31 42 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
... ... @@ -2,15 +2,18 @@ package cn.iocoder.yudao.module.member.dal.dataobject.user;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.ip.core.Area;
  5 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
5 6 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
6 7 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
7 8 import com.baomidou.mybatisplus.annotation.KeySequence;
  9 +import com.baomidou.mybatisplus.annotation.TableField;
8 10 import com.baomidou.mybatisplus.annotation.TableId;
9 11 import com.baomidou.mybatisplus.annotation.TableName;
10 12 import lombok.*;
11 13 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
12 14  
13 15 import java.time.LocalDateTime;
  16 +import java.util.List;
14 17  
15 18 /**
16 19 * 会员用户 DO
... ... @@ -102,6 +105,11 @@ public class MemberUserDO extends TenantBaseDO {
102 105  
103 106 // ========== 其它信息 ==========
104 107  
105   - // TODO 积分、成长值、会员等级等等
  108 + /**
  109 + * 会员标签列表,以逗号分隔
  110 + */
  111 + @TableField(typeHandler = LongListTypeHandler.class)
  112 + private List<Long> tagIds;
106 113  
  114 + // TODO 积分、成长值、会员等级等等
107 115 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
1 1 package cn.iocoder.yudao.module.member.dal.mysql.user;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
3 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
... ... @@ -8,6 +10,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8 10 import org.apache.ibatis.annotations.Mapper;
9 11  
10 12 import java.util.List;
  13 +import java.util.stream.Collectors;
11 14  
12 15 /**
13 16 * 会员 User Mapper
... ... @@ -27,11 +30,19 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
27 30 }
28 31  
29 32 default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
  33 + String tagIdSql = "";
  34 + if (CollUtil.isNotEmpty(reqVO.getTagIds())) {
  35 + tagIdSql = reqVO.getTagIds().stream()
  36 + .map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)")
  37 + .collect(Collectors.joining(" OR "));
  38 + }
  39 +
30 40 return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
31 41 .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
32 42 .betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
33 43 .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
34 44 .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
  45 + .apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
35 46 .orderByDesc(MemberUserDO::getId));
36 47 }
37 48  
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java
1 1 package cn.iocoder.yudao.module.member.service.tag;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
3 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 6 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagCreateReqVO;
5 7 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagExportReqVO;
... ... @@ -81,6 +83,9 @@ public class MemberTagServiceImpl implements MemberTagService {
81 83  
82 84 @Override
83 85 public List<MemberTagDO> getTagList(Collection<Long> ids) {
  86 + if (CollUtil.isEmpty(ids)) {
  87 + return ListUtil.empty();
  88 + }
84 89 return tagMapper.selectBatchIds(ids);
85 90 }
86 91  
... ...