Commit 54bf24b96676c5eda988f3d5311470f6c844dde4
1 parent
551a9684
code review:会员等级
Showing
12 changed files
with
31 additions
and
156 deletions
sql/mysql/member_group.sql deleted
| 1 | -create table member_group | |
| 2 | -( | |
| 3 | - id bigint auto_increment comment '编号' primary key, | |
| 4 | - name varchar(30) default '' not null comment '名称', | |
| 5 | - remark varchar(255) default '' not null comment '备注', | |
| 6 | - status tinyint default 0 not null comment '状态', | |
| 7 | - creator varchar(64) default '' null comment '创建者', | |
| 8 | - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', | |
| 9 | - updater varchar(64) default '' null comment '更新者', | |
| 10 | - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', | |
| 11 | - deleted bit default b'0' not null comment '是否删除', | |
| 12 | - tenant_id bigint default 0 not null comment '租户编号' | |
| 13 | -) | |
| 14 | - comment '用户分组'; | |
| 15 | - | |
| 16 | -alter table member_user add column group_id bigint null comment '用户分组编号'; | |
| 17 | - | |
| 18 | --- 菜单 SQL | |
| 19 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) | |
| 20 | -VALUES ('用户分组', '', 2, 5, 2262, 'group', '', 'member/group/index', 0, 'MemberGroup'); | |
| 21 | - | |
| 22 | --- 按钮父菜单ID | |
| 23 | --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 | |
| 24 | -SELECT @parentId := LAST_INSERT_ID(); | |
| 25 | - | |
| 26 | --- 按钮 SQL | |
| 27 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 28 | -VALUES ('用户分组查询', 'member:group:query', 3, 1, @parentId, '', '', '', 0); | |
| 29 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 30 | -VALUES ('用户分组创建', 'member:group:create', 3, 2, @parentId, '', '', '', 0); | |
| 31 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 32 | -VALUES ('用户分组更新', 'member:group:update', 3, 3, @parentId, '', '', '', 0); | |
| 33 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 34 | -VALUES ('用户分组删除', 'member:group:delete', 3, 4, @parentId, '', '', '', 0); | |
| 35 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 36 | -VALUES ('用户分组导出', 'member:group:export', 3, 5, @parentId, '', '', '', 0); |
sql/mysql/member_level.sql
| 1 | --- 会员表增加字段 | |
| 2 | -alter table member_user add column experience int not null default 0 comment '经验'; | |
| 3 | -alter table member_user add column level_id bigint comment '等级编号'; | |
| 4 | - | |
| 5 | --- 增加3张表 | |
| 6 | -create table member_level | |
| 7 | -( | |
| 8 | - id bigint auto_increment comment '编号' primary key, | |
| 9 | - name varchar(30) default '' not null comment '等级名称', | |
| 10 | - experience int default 0 not null comment '升级经验', | |
| 11 | - level int default 0 not null comment '等级', | |
| 12 | - discount tinyint default 100 not null comment '享受折扣', | |
| 13 | - icon varchar(255) default '' not null comment '等级图标', | |
| 14 | - background_url varchar(255) default '' not null comment '等级背景图', | |
| 15 | - status tinyint default 0 not null comment '状态', | |
| 16 | - creator varchar(64) default '' null comment '创建者', | |
| 17 | - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', | |
| 18 | - updater varchar(64) default '' null comment '更新者', | |
| 19 | - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', | |
| 20 | - deleted bit default b'0' not null comment '是否删除', | |
| 21 | - tenant_id bigint default 0 not null comment '租户编号' | |
| 22 | -) | |
| 23 | - comment '会员等级'; | |
| 24 | - | |
| 25 | -create table member_level_log | |
| 26 | -( | |
| 27 | - id bigint auto_increment comment '编号' primary key, | |
| 28 | - user_id bigint default 0 not null comment '用户编号', | |
| 29 | - level_id bigint default 0 not null comment '等级编号', | |
| 30 | - level int default 0 not null comment '会员等级', | |
| 31 | - discount tinyint default 100 not null comment '享受折扣', | |
| 32 | - experience int default 0 not null comment '升级经验', | |
| 33 | - user_experience int default 0 not null comment '会员此时的经验', | |
| 34 | - remark varchar(255) default '' not null comment '备注', | |
| 35 | - description varchar(255) default '' not null comment '描述', | |
| 36 | - creator varchar(64) default '' null comment '创建者', | |
| 37 | - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', | |
| 38 | - updater varchar(64) default '' null comment '更新者', | |
| 39 | - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', | |
| 40 | - deleted bit default b'0' not null comment '是否删除', | |
| 41 | - tenant_id bigint default 0 not null comment '租户编号' | |
| 42 | -) | |
| 43 | - comment '会员等级记录'; | |
| 44 | - | |
| 45 | -create index idx_user_id on member_level_log (user_id) comment '会员等级记录-用户编号'; | |
| 46 | - | |
| 47 | -create table member_experience_log | |
| 48 | -( | |
| 49 | - id bigint auto_increment comment '编号' primary key, | |
| 50 | - user_id bigint default 0 not null comment '用户编号', | |
| 51 | - biz_id varchar(64) default '' not null comment '业务编号', | |
| 52 | - biz_type tinyint default 0 not null comment '业务类型', | |
| 53 | - title varchar(30) default '' not null comment '标题', | |
| 54 | - experience int default 0 not null comment '经验', | |
| 55 | - total_experience int default 0 not null comment '变更后的经验', | |
| 56 | - description varchar(512) default '' not null comment '描述', | |
| 57 | - creator varchar(64) default '' null comment '创建者', | |
| 58 | - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', | |
| 59 | - updater varchar(64) default '' null comment '更新者', | |
| 60 | - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', | |
| 61 | - deleted bit default b'0' not null comment '是否删除', | |
| 62 | - tenant_id bigint default 0 not null comment '租户编号' | |
| 63 | -) | |
| 64 | - comment '会员经验记录'; | |
| 65 | - | |
| 66 | -create index idx_user_id on member_experience_log (user_id) comment '会员经验记录-用户编号'; | |
| 67 | -create index idx_user_biz_type on member_experience_log (user_id, biz_type) comment '会员经验记录-用户业务类型'; | |
| 68 | - | |
| 69 | 1 | -- 增加字典 |
| 70 | 2 | insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type'); |
| 71 | 3 | insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '管理员调整', '0', 0); |
| ... | ... | @@ -74,21 +6,3 @@ insert system_dict_data(dict_type, label, value, sort) values ('member_experienc |
| 74 | 6 | insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '退单扣除', '3', 3); |
| 75 | 7 | insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到奖励', '4', 4); |
| 76 | 8 | insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '抽奖奖励', '5', 5); |
| 77 | - | |
| 78 | --- 菜单 SQL | |
| 79 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) | |
| 80 | -VALUES ('会员等级', '', 2, 3, 2262, 'level', '', 'member/level/index', 0, 'MemberLevel'); | |
| 81 | - | |
| 82 | --- 按钮父菜单ID | |
| 83 | --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 | |
| 84 | -SELECT @parentId := LAST_INSERT_ID(); | |
| 85 | - | |
| 86 | --- 按钮 SQL | |
| 87 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 88 | -VALUES ('会员等级查询', 'member:level:query', 3, 1, @parentId, '', '', '', 0); | |
| 89 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 90 | -VALUES ('会员等级创建', 'member:level:create', 3, 2, @parentId, '', '', '', 0); | |
| 91 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 92 | -VALUES ('会员等级更新', 'member:level:update', 3, 3, @parentId, '', '', '', 0); | |
| 93 | -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) | |
| 94 | -VALUES ('会员等级删除', 'member:level:delete', 3, 4, @parentId, '', '', '', 0); | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java
| ... | ... | @@ -35,7 +35,7 @@ public class MemberLevelBaseVO { |
| 35 | 35 | @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "98") |
| 36 | 36 | @NotNull(message = "享受折扣不能为空") |
| 37 | 37 | @Range(min = 0, max = 100, message = "享受折扣的范围为 0-100") |
| 38 | - private Integer discount; | |
| 38 | + private Integer discountPercent; | |
| 39 | 39 | |
| 40 | 40 | @Schema(description = "等级图标", example = "https://www.iocoder.cn/yudao.jpg") |
| 41 | 41 | @URL(message = "等级图标必须是 URL 格式") | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogBaseVO.java
| ... | ... | @@ -26,7 +26,7 @@ public class MemberLevelLogBaseVO { |
| 26 | 26 | |
| 27 | 27 | @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319") |
| 28 | 28 | @NotNull(message = "享受折扣不能为空") |
| 29 | - private Integer discount; | |
| 29 | + private Integer discountPercent; | |
| 30 | 30 | |
| 31 | 31 | @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319") |
| 32 | 32 | @NotNull(message = "升级经验不能为空") | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java
| ... | ... | @@ -29,9 +29,11 @@ public class MemberUserRespVO extends MemberUserBaseVO { |
| 29 | 29 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 30 | 30 | private LocalDateTime createTime; |
| 31 | 31 | |
| 32 | - | |
| 33 | 32 | // ========== 其它信息 ========== |
| 34 | 33 | |
| 34 | + @Schema(description = "积分", example = "100") | |
| 35 | + private Integer point; | |
| 36 | + | |
| 35 | 37 | @Schema(description = "会员标签", example = "[红色, 快乐]") |
| 36 | 38 | private List<String> tagNames; |
| 37 | 39 | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceLogDO.java
| 1 | 1 | package cn.iocoder.yudao.module.member.dal.dataobject.level; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | |
| 4 | 5 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; |
| 5 | 6 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | 7 | import com.baomidou.mybatisplus.annotation.TableId; |
| ... | ... | @@ -29,6 +30,8 @@ public class MemberExperienceLogDO extends BaseDO { |
| 29 | 30 | private Long id; |
| 30 | 31 | /** |
| 31 | 32 | * 用户编号 |
| 33 | + * | |
| 34 | + * 关联 {@link MemberUserDO#getId()} 字段 | |
| 32 | 35 | */ |
| 33 | 36 | private Long userId; |
| 34 | 37 | /** |
| ... | ... | @@ -46,6 +49,10 @@ public class MemberExperienceLogDO extends BaseDO { |
| 46 | 49 | */ |
| 47 | 50 | private String title; |
| 48 | 51 | /** |
| 52 | + * 描述 | |
| 53 | + */ | |
| 54 | + private String description; | |
| 55 | + /** | |
| 49 | 56 | * 经验 |
| 50 | 57 | */ |
| 51 | 58 | private Integer experience; |
| ... | ... | @@ -53,9 +60,5 @@ public class MemberExperienceLogDO extends BaseDO { |
| 53 | 60 | * 变更后的经验 |
| 54 | 61 | */ |
| 55 | 62 | private Integer totalExperience; |
| 56 | - /** | |
| 57 | - * 描述 | |
| 58 | - */ | |
| 59 | - private String description; | |
| 60 | 63 | |
| 61 | 64 | } | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelDO.java
| ... | ... | @@ -34,17 +34,18 @@ public class MemberLevelDO extends BaseDO { |
| 34 | 34 | */ |
| 35 | 35 | private String name; |
| 36 | 36 | /** |
| 37 | - * 升级经验 | |
| 38 | - */ | |
| 39 | - private Integer experience; | |
| 40 | - /** | |
| 41 | 37 | * 等级 |
| 42 | 38 | */ |
| 43 | 39 | private Integer level; |
| 44 | 40 | /** |
| 41 | + * 升级经验 | |
| 42 | + */ | |
| 43 | + private Integer experience; | |
| 44 | + /** | |
| 45 | 45 | * 享受折扣 |
| 46 | 46 | */ |
| 47 | - private Integer discount; | |
| 47 | + private Integer discountPercent; | |
| 48 | + | |
| 48 | 49 | /** |
| 49 | 50 | * 等级图标 |
| 50 | 51 | */ | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelLogDO.java
| 1 | 1 | package cn.iocoder.yudao.module.member.dal.dataobject.level; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | |
| 4 | 5 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 5 | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 6 | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| ... | ... | @@ -30,20 +31,26 @@ public class MemberLevelLogDO extends BaseDO { |
| 30 | 31 | private Long id; |
| 31 | 32 | /** |
| 32 | 33 | * 用户编号 |
| 34 | + * | |
| 35 | + * 关联 {@link MemberUserDO#getId()} 字段 | |
| 33 | 36 | */ |
| 34 | 37 | private Long userId; |
| 35 | 38 | /** |
| 36 | 39 | * 等级编号 |
| 40 | + * | |
| 41 | + * 关联 {@link MemberLevelDO#getId()} 字段 | |
| 37 | 42 | */ |
| 38 | 43 | private Long levelId; |
| 39 | 44 | /** |
| 40 | 45 | * 会员等级 |
| 46 | + * | |
| 47 | + * 冗余 {@link MemberLevelDO#getLevel()} 字段 | |
| 41 | 48 | */ |
| 42 | 49 | private Integer level; |
| 43 | 50 | /** |
| 44 | 51 | * 享受折扣 |
| 45 | 52 | */ |
| 46 | - private Integer discount; | |
| 53 | + private Integer discountPercent; | |
| 47 | 54 | /** |
| 48 | 55 | * 升级经验 |
| 49 | 56 | */ | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceLogService.java
| ... | ... | @@ -39,14 +39,6 @@ public interface MemberExperienceLogService { |
| 39 | 39 | */ |
| 40 | 40 | PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO); |
| 41 | 41 | |
| 42 | - /** | |
| 43 | - * 获得会员经验记录列表, 用于 Excel 导出 | |
| 44 | - * | |
| 45 | - * @param exportReqVO 查询条件 | |
| 46 | - * @return 会员经验记录列表 | |
| 47 | - */ | |
| 48 | - List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO); | |
| 49 | - | |
| 50 | 42 | // TODO @疯狂:类似 MemberLevelLogService 的方法,这里也需要提供一个通用的方法,用于创建经验变动记录 |
| 51 | 43 | |
| 52 | 44 | /** | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogService.java
| ... | ... | @@ -47,14 +47,6 @@ public interface MemberLevelLogService { |
| 47 | 47 | */ |
| 48 | 48 | PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO); |
| 49 | 49 | |
| 50 | - /** | |
| 51 | - * 获得会员等级记录列表, 用于 Excel 导出 | |
| 52 | - * | |
| 53 | - * @param exportReqVO 查询条件 | |
| 54 | - * @return 会员等级记录列表 | |
| 55 | - */ | |
| 56 | - List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO); | |
| 57 | - | |
| 58 | 50 | // TODO @疯狂:把 createCancelLog、createAdjustLog、createAutoUpgradeLog 几个日志合并成一个通用的日志方法;整体的内容,交给 MemberLevelService 去做;以及对应的 level 变化的通知; |
| 59 | 51 | |
| 60 | 52 | /** | ... | ... |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogServiceImpl.java
| ... | ... | @@ -75,7 +75,7 @@ public class MemberLevelLogServiceImpl implements MemberLevelLogService { |
| 75 | 75 | levelLogDO.setUserId(user.getId()); |
| 76 | 76 | levelLogDO.setLevelId(level.getId()); |
| 77 | 77 | levelLogDO.setLevel(level.getLevel()); |
| 78 | - levelLogDO.setDiscount(level.getDiscount()); | |
| 78 | + levelLogDO.setDiscountPercent(level.getDiscountPercent()); | |
| 79 | 79 | levelLogDO.setUserExperience(level.getExperience()); |
| 80 | 80 | levelLogDO.setExperience(experience); |
| 81 | 81 | levelLogDO.setRemark(reason); |
| ... | ... | @@ -92,7 +92,7 @@ public class MemberLevelLogServiceImpl implements MemberLevelLogService { |
| 92 | 92 | levelLogDO.setUserId(user.getId()); |
| 93 | 93 | levelLogDO.setLevelId(level.getId()); |
| 94 | 94 | levelLogDO.setLevel(level.getLevel()); |
| 95 | - levelLogDO.setDiscount(level.getDiscount()); | |
| 95 | + levelLogDO.setDiscountPercent(level.getDiscountPercent()); | |
| 96 | 96 | levelLogDO.setExperience(level.getExperience()); |
| 97 | 97 | levelLogDO.setUserExperience(user.getExperience()); |
| 98 | 98 | levelLogDO.setDescription("成为:" + level.getName()); | ... | ... |
yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java
| ... | ... | @@ -49,7 +49,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { |
| 49 | 49 | public void testCreateLevel_success() { |
| 50 | 50 | // 准备参数 |
| 51 | 51 | MemberLevelCreateReqVO reqVO = randomPojo(MemberLevelCreateReqVO.class, o -> { |
| 52 | - o.setDiscount(randomInt()); | |
| 52 | + o.setDiscountPercent(randomInt()); | |
| 53 | 53 | o.setIcon(randomURL()); |
| 54 | 54 | o.setBackgroundUrl(randomURL()); |
| 55 | 55 | }); |
| ... | ... | @@ -76,7 +76,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { |
| 76 | 76 | o.setLevel(dbLevel.getLevel()); |
| 77 | 77 | o.setExperience(dbLevel.getExperience()); |
| 78 | 78 | //以下是要修改的字段 |
| 79 | - o.setDiscount(randomInt()); | |
| 79 | + o.setDiscountPercent(randomInt()); | |
| 80 | 80 | o.setIcon(randomURL()); |
| 81 | 81 | o.setBackgroundUrl(randomURL()); |
| 82 | 82 | }); |
| ... | ... | @@ -256,7 +256,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { |
| 256 | 256 | private static MemberLevelDO randomLevelDO(Consumer<MemberLevelDO>... consumers) { |
| 257 | 257 | Consumer<MemberLevelDO> consumer = (o) -> { |
| 258 | 258 | o.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| 259 | - o.setDiscount(randomInt(0, 100)); | |
| 259 | + o.setDiscountPercent(randomInt(0, 100)); | |
| 260 | 260 | o.setIcon(randomURL()); |
| 261 | 261 | o.setBackgroundUrl(randomURL()); |
| 262 | 262 | }; | ... | ... |