Commit 4f589cad5359fd48dabfc3f9a34495fc2126e690

Authored by owen
1 parent 9b6e2114

会员:

1.会员设置标签
sql/mysql/member_tag.sql
@@ -12,6 +12,7 @@ create table member_tag @@ -12,6 +12,7 @@ create table member_tag
12 ) 12 )
13 comment '会员标签'; 13 comment '会员标签';
14 14
  15 +alter table member_user add column tag_ids varchar(255) null comment '用户标签编号列表,以逗号分隔';
15 16
16 -- 菜单 SQL 17 -- 菜单 SQL
17 INSERT INTO system_menu( 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 package cn.iocoder.yudao.module.member.controller.admin.user; 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 import io.swagger.v3.oas.annotations.Operation; 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 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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 @Tag(name = "管理后台 - 会员用户") 28 @Tag(name = "管理后台 - 会员用户")
23 @RestController 29 @RestController
@@ -27,6 +33,8 @@ public class MemberUserController { @@ -27,6 +33,8 @@ public class MemberUserController {
27 33
28 @Resource 34 @Resource
29 private MemberUserService memberUserService; 35 private MemberUserService memberUserService;
  36 + @Resource
  37 + private MemberTagService memberTagService;
30 38
31 @PutMapping("/update") 39 @PutMapping("/update")
32 @Operation(summary = "更新会员用户") 40 @Operation(summary = "更新会员用户")
@@ -50,7 +58,17 @@ public class MemberUserController { @@ -50,7 +58,17 @@ public class MemberUserController {
50 @PreAuthorize("@ss.hasPermission('member:user:query')") 58 @PreAuthorize("@ss.hasPermission('member:user:query')")
51 public CommonResult<PageResult<MemberUserRespVO>> getUserPage(@Valid MemberUserPageReqVO pageVO) { 59 public CommonResult<PageResult<MemberUserRespVO>> getUserPage(@Valid MemberUserPageReqVO pageVO) {
52 PageResult<MemberUserDO> pageResult = memberUserService.getUserPage(pageVO); 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,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
7 7
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
  10 +import java.util.List;
10 11
11 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; 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,4 +50,7 @@ public class MemberUserBaseVO {
49 @Schema(description = "会员备注", example = "我是小备注") 50 @Schema(description = "会员备注", example = "我是小备注")
50 private String mark; 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,6 +8,7 @@ import lombok.ToString;
8 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
9 9
10 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
  11 +import java.util.List;
11 12
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 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,4 +32,7 @@ public class MemberUserPageReqVO extends PageParam {
31 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
32 private LocalDateTime[] createTime; 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 +6,7 @@ import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
  9 +import java.util.List;
9 10
10 @Schema(description = "管理后台 - 会员用户 Response VO") 11 @Schema(description = "管理后台 - 会员用户 Response VO")
11 @Data 12 @Data
@@ -28,4 +29,9 @@ public class MemberUserRespVO extends MemberUserBaseVO { @@ -28,4 +29,9 @@ public class MemberUserRespVO extends MemberUserBaseVO {
28 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 29 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
29 private LocalDateTime createTime; 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,6 +10,9 @@ import org.mapstruct.Mapper;
10 import org.mapstruct.factory.Mappers; 10 import org.mapstruct.factory.Mappers;
11 11
12 import java.util.List; 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 @Mapper 17 @Mapper
15 public interface MemberUserConvert { 18 public interface MemberUserConvert {
@@ -28,4 +31,12 @@ public interface MemberUserConvert { @@ -28,4 +31,12 @@ public interface MemberUserConvert {
28 31
29 MemberUserRespVO convert03(MemberUserDO bean); 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,15 +2,18 @@ package cn.iocoder.yudao.module.member.dal.dataobject.user;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.ip.core.Area; 4 import cn.iocoder.yudao.framework.ip.core.Area;
  5 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
5 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; 6 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
6 import cn.iocoder.yudao.module.system.enums.common.SexEnum; 7 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
7 import com.baomidou.mybatisplus.annotation.KeySequence; 8 import com.baomidou.mybatisplus.annotation.KeySequence;
  9 +import com.baomidou.mybatisplus.annotation.TableField;
8 import com.baomidou.mybatisplus.annotation.TableId; 10 import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 11 import com.baomidou.mybatisplus.annotation.TableName;
10 import lombok.*; 12 import lombok.*;
11 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 13 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
12 14
13 import java.time.LocalDateTime; 15 import java.time.LocalDateTime;
  16 +import java.util.List;
14 17
15 /** 18 /**
16 * 会员用户 DO 19 * 会员用户 DO
@@ -102,6 +105,11 @@ public class MemberUserDO extends TenantBaseDO { @@ -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 package cn.iocoder.yudao.module.member.dal.mysql.user; 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 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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,6 +10,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
9 11
10 import java.util.List; 12 import java.util.List;
  13 +import java.util.stream.Collectors;
11 14
12 /** 15 /**
13 * 会员 User Mapper 16 * 会员 User Mapper
@@ -27,11 +30,19 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; { @@ -27,11 +30,19 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
27 } 30 }
28 31
29 default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) { 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 return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>() 40 return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
31 .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile()) 41 .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
32 .betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate()) 42 .betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
33 .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname()) 43 .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
34 .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime()) 44 .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
  45 + .apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
35 .orderByDesc(MemberUserDO::getId)); 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 package cn.iocoder.yudao.module.member.service.tag; 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 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; 6 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagCreateReqVO;
5 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagExportReqVO; 7 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagExportReqVO;
@@ -81,6 +83,9 @@ public class MemberTagServiceImpl implements MemberTagService { @@ -81,6 +83,9 @@ public class MemberTagServiceImpl implements MemberTagService {
81 83
82 @Override 84 @Override
83 public List<MemberTagDO> getTagList(Collection<Long> ids) { 85 public List<MemberTagDO> getTagList(Collection<Long> ids) {
  86 + if (CollUtil.isEmpty(ids)) {
  87 + return ListUtil.empty();
  88 + }
84 return tagMapper.selectBatchIds(ids); 89 return tagMapper.selectBatchIds(ids);
85 } 90 }
86 91