会员关系表
1. 概述
会员关系表是梵医云系统中用于管理会员信息、会员等级、会员分组、会员标签等相关数据的核心模块。该模块提供了完整的会员管理体系,包括会员基本信息、会员等级体系、会员分组管理、会员标签管理、积分管理、经验管理等功能。
2. 表结构
2.1 会员用户表 (member_user)
会员用户表是会员模块的核心表,存储会员的基本信息、账号信息、等级信息等。
2.1.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 用户ID(主键) |
| mobile | varchar | 11 | 是 | NULL | 手机号 |
| password | varchar | 100 | 是 | NULL | 加密后的密码 |
| status | tinyint | 4 | 否 | 0 | 账号状态(0正常 1停用) |
| register_ip | varchar | 50 | 是 | NULL | 注册IP |
| register_terminal | tinyint | 4 | 是 | NULL | 注册终端(1H5 2小程序 3APP) |
| login_ip | varchar | 50 | 是 | NULL | 最后登录IP |
| login_date | datetime | - | 是 | NULL | 最后登录时间 |
| nickname | varchar | 50 | 是 | NULL | 用户昵称 |
| avatar | varchar | 512 | 是 | NULL | 用户头像 |
| name | varchar | 50 | 是 | NULL | 真实名字 |
| sex | tinyint | 4 | 是 | NULL | 性别(1男 2女 3未知) |
| birthday | datetime | - | 是 | NULL | 出生日期 |
| area_id | int | 11 | 是 | NULL | 所在地 |
| mark | varchar | 500 | 是 | NULL | 用户备注 |
| point | int | 11 | 否 | 0 | 积分 |
| tag_ids | json | - | 是 | NULL | 会员标签列表 |
| level_id | bigint | 20 | 是 | NULL | 会员级别编号 |
| experience | int | 11 | 否 | 0 | 会员经验 |
| total_pay_amount | bigint | 20 | 否 | 0 | 消费总额 |
| group_id | bigint | 20 | 是 | NULL | 用户分组编号 |
| old_mobile | varchar | 11 | 是 | NULL | 用户注销老手机号 |
| active_user | tinyint | 4 | 是 | NULL | 活动用户 |
| promo_code | varchar | 50 | 是 | NULL | 营销代码 |
| store_id | bigint | 20 | 是 | NULL | 营销代码绑定门店ID |
| tenant_id | bigint | 20 | 否 | 0 | 租户编号 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.1.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| uk_mobile | 唯一 | mobile | 手机号唯一索引 |
| idx_level_id | 普通 | level_id | 会员等级索引 |
| idx_group_id | 普通 | group_id | 会员分组索引 |
| idx_tenant_id | 普通 | tenant_id | 租户索引 |
2.1.3 Java 实体类
java
@TableName(value = "member_user", autoResultMap = true)
@KeySequence("member_user_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberUserDO extends TenantBaseDO {
@TableId
private Long id;
private String mobile;
private String password;
private Integer status;
private String registerIp;
private Integer registerTerminal;
private String loginIp;
private LocalDateTime loginDate;
private String nickname;
private String avatar;
private String name;
private Integer sex;
private LocalDateTime birthday;
private Integer areaId;
private String mark;
private Integer point;
@TableField(typeHandler = LongListTypeHandler.class)
private List<Long> tagIds;
private Long levelId;
private Integer experience;
private Long totalPayAmount;
private Long groupId;
private String oldMobile;
private Integer activeUser;
private String promoCode;
private Long storeId;
}2.2 会员分组表 (member_group)
会员分组表用于管理会员的分组信息,可以将会员按照不同的维度进行分组管理。
2.2.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| name | varchar | 50 | 否 | - | 分组名称 |
| remark | varchar | 500 | 是 | NULL | 备注 |
| status | tinyint | 4 | 否 | 0 | 状态(0正常 1停用) |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.2.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
2.2.3 Java 实体类
java
@TableName("member_group")
@KeySequence("member_group_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberGroupDO extends BaseDO {
@TableId
private Long id;
private String name;
private String remark;
private Integer status;
}2.3 会员标签表 (member_tag)
会员标签表用于管理会员的标签信息,可以给会员打上不同的标签,方便进行精准营销。
2.3.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| name | varchar | 50 | 否 | - | 标签名称 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.3.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
2.3.3 Java 实体类
java
@TableName("member_tag")
@KeySequence("member_tag_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberTagDO extends BaseDO {
@TableId
private Long id;
private String name;
}2.4 会员等级表 (member_level)
会员等级表用于配置会员等级体系,每个等级对应不同的权益和折扣。
2.4.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| name | varchar | 50 | 否 | - | 等级名称 |
| level | int | 11 | 否 | - | 等级 |
| experience | int | 11 | 否 | - | 升级经验 |
| discount_percent | int | 11 | 否 | - | 享受折扣 |
| icon | varchar | 512 | 是 | NULL | 等级图标 |
| background_url | varchar | 512 | 是 | NULL | 等级背景图 |
| status | tinyint | 4 | 否 | 0 | 状态(0正常 1停用) |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.4.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_level | 普通 | level | 等级索引 |
2.4.3 Java 实体类
java
@TableName("member_level")
@KeySequence("member_level_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberLevelDO extends BaseDO {
@TableId
private Long id;
private String name;
private Integer level;
private Integer experience;
private Integer discountPercent;
private String icon;
private String backgroundUrl;
private Integer status;
}2.5 层级人员管理表 (member_hierarchical_personnel)
层级人员管理表用于管理门店或机构的层级人员关系。
2.5.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| remark | varchar | 500 | 是 | NULL | 备注 |
| post_management | int | 11 | 是 | NULL | 岗位管理 |
| parent | bigint | 20 | 是 | NULL | 父节点 |
| user_id | bigint | 20 | 是 | NULL | 绑定节点 |
| name | varchar | 50 | 是 | NULL | 姓名 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.5.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_parent | 普通 | parent | 父节点索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
2.5.3 Java 实体类
java
@TableName("member_hierarchical_personnel")
@KeySequence("member_hierarchical_personnel_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HierarchicalPersonnelDO extends BaseDO {
public static final Long PARENT_ROOT = 0L;
@TableId
private Long id;
private String remark;
private Integer postManagement;
private Long parent;
private Long userId;
private String name;
}2.6 会员地址表 (member_address)
会员地址表用于管理会员的收货地址信息。
2.6.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| name | varchar | 50 | 否 | - | 收件人名称 |
| mobile | varchar | 11 | 否 | - | 手机号 |
| area_id | bigint | 20 | 是 | NULL | 地区编号 |
| detail_address | varchar | 500 | 否 | - | 收件详细地址 |
| longitude | varchar | 50 | 是 | NULL | 经度 |
| latitude | varchar | 50 | 是 | NULL | 纬度 |
| default_status | bit | 1 | 否 | b'0' | 是否默认 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.6.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
2.6.3 Java 实体类
java
@TableName("member_address")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberAddressDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private String name;
private String mobile;
private Long areaId;
private String detailAddress;
private String longitude;
private String latitude;
private Boolean defaultStatus;
}2.7 会员积分记录表 (member_point_record)
会员积分记录表用于记录会员积分的变动情况。
2.7.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 自增主键 |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| biz_id | varchar | 64 | 是 | NULL | 业务编码 |
| biz_type | int | 11 | 否 | - | 业务类型 |
| title | varchar | 100 | 是 | NULL | 积分标题 |
| description | varchar | 500 | 是 | NULL | 积分描述 |
| point | int | 11 | 否 | - | 变动积分 |
| total_point | int | 11 | 否 | - | 变动后的积分 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.7.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
| idx_biz_id | 普通 | biz_id | 业务编码索引 |
2.7.3 Java 实体类
java
@TableName("member_point_record")
@KeySequence("member_point_record_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberPointRecordDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private String bizId;
private Integer bizType;
private String title;
private String description;
private Integer point;
private Integer totalPoint;
}2.8 会员经验记录表 (member_experience_record)
会员经验记录表用于记录会员经验的变动情况。
2.8.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| biz_type | int | 11 | 否 | - | 业务类型 |
| biz_id | varchar | 64 | 是 | NULL | 业务编号 |
| title | varchar | 100 | 是 | NULL | 标题 |
| description | varchar | 500 | 是 | NULL | 描述 |
| experience | int | 11 | 否 | - | 经验 |
| total_experience | int | 11 | 否 | - | 变更后的经验 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.8.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
| idx_biz_id | 普通 | biz_id | 业务编码索引 |
2.8.3 Java 实体类
java
@TableName("member_experience_record")
@KeySequence("member_experience_record_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberExperienceRecordDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private Integer bizType;
private String bizId;
private String title;
private String description;
private Integer experience;
private Integer totalExperience;
}2.9 会员等级记录表 (member_level_record)
会员等级记录表用于记录会员等级的变更历史。
2.9.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| level_id | bigint | 20 | 否 | - | 等级编号 |
| level | int | 11 | 否 | - | 会员等级 |
| discount_percent | int | 11 | 否 | - | 享受折扣 |
| experience | int | 11 | 否 | - | 升级经验 |
| user_experience | int | 11 | 否 | - | 会员此时的经验 |
| remark | varchar | 500 | 是 | NULL | 备注 |
| description | varchar | 500 | 是 | NULL | 描述 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.9.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
2.9.3 Java 实体类
java
@TableName("member_level_record")
@KeySequence("member_level_record_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberLevelRecordDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private Long levelId;
private Integer level;
private Integer discountPercent;
private Integer experience;
private Integer userExperience;
private String remark;
private String description;
}2.10 签到记录表 (member_sign_in_record)
签到记录表用于记录会员的签到情况。
2.10.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| user_id | bigint | 20 | 否 | - | 签到用户 |
| day | int | 11 | 否 | - | 第几天签到 |
| point | int | 11 | 否 | - | 签到的积分 |
| experience | int | 11 | 否 | - | 签到的经验 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.10.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_user_id | 普通 | user_id | 用户索引 |
2.10.3 Java 实体类
java
@TableName("member_sign_in_record")
@KeySequence("member_sign_in_record_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberSignInRecordDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private Integer day;
private Integer point;
private Integer experience;
}3. 表关系图
member_user (会员用户表)
├── member_group (会员分组表) - 通过 group_id 关联
├── member_tag (会员标签表) - 通过 tag_ids 关联
├── member_level (会员等级表) - 通过 level_id 关联
├── member_address (会员地址表) - 通过 user_id 关联
├── member_point_record (会员积分记录表) - 通过 user_id 关联
├── member_experience_record (会员经验记录表) - 通过 user_id 关联
├── member_level_record (会员等级记录表) - 通过 user_id 关联
├── member_sign_in_record (签到记录表) - 通过 user_id 关联
└── member_hierarchical_personnel (层级人员管理表) - 通过 user_id 关联4. 使用示例
4.1 创建会员
java
@Service
public class MemberUserServiceImpl implements MemberUserService {
@Resource
private MemberUserMapper memberUserMapper;
public Long createMember(MemberUserSaveReqVO createReqVO) {
MemberUserDO memberUser = MemberUserDO.builder()
.mobile(createReqVO.getMobile())
.password(encodePassword(createReqVO.getPassword()))
.nickname(createReqVO.getNickname())
.avatar(createReqVO.getAvatar())
.status(CommonStatusEnum.ENABLE.getStatus())
.build();
memberUserMapper.insert(memberUser);
return memberUser.getId();
}
}4.2 查询会员列表
java
@Service
public class MemberUserServiceImpl implements MemberUserService {
@Resource
private MemberUserMapper memberUserMapper;
public PageResult<MemberUserDO> getMemberUserPage(MemberUserPageReqVO pageReqVO) {
return memberUserMapper.selectPage(pageReqVO,
new LambdaQueryWrapperX<MemberUserDO>()
.likeIfPresent(MemberUserDO::getNickname, pageReqVO.getNickname())
.eqIfPresent(MemberUserDO::getMobile, pageReqVO.getMobile())
.eqIfPresent(MemberUserDO::getLevelId, pageReqVO.getLevelId())
.eqIfPresent(MemberUserDO::getGroupId, pageReqVO.getGroupId())
.betweenIfPresent(MemberUserDO::getCreateTime, pageReqVO.getCreateTime())
.orderByDesc(MemberUserDO::getId));
}
}4.3 增加会员积分
java
@Service
public class MemberPointServiceImpl implements MemberPointService {
@Resource
private MemberUserMapper memberUserMapper;
@Resource
private MemberPointRecordMapper memberPointRecordMapper;
@Transactional(rollbackFor = Exception.class)
public void addPoint(Long userId, Integer point, Integer bizType, String bizId, String title) {
MemberUserDO user = memberUserMapper.selectById(userId);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
Integer totalPoint = user.getPoint() + point;
memberUserMapper.updateById(MemberUserDO.builder()
.id(userId)
.point(totalPoint)
.build());
memberPointRecordMapper.insert(MemberPointRecordDO.builder()
.userId(userId)
.bizId(bizId)
.bizType(bizType)
.title(title)
.point(point)
.totalPoint(totalPoint)
.build());
}
}4.4 升级会员等级
java
@Service
public class MemberLevelServiceImpl implements MemberLevelService {
@Resource
private MemberUserMapper memberUserMapper;
@Resource
private MemberLevelRecordMapper memberLevelRecordMapper;
@Transactional(rollbackFor = Exception.class)
public void upgradeLevel(Long userId, Long levelId) {
MemberUserDO user = memberUserMapper.selectById(userId);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
MemberLevelDO level = memberLevelMapper.selectById(levelId);
if (level == null) {
throw exception(LEVEL_NOT_EXISTS);
}
memberUserMapper.updateById(MemberUserDO.builder()
.id(userId)
.levelId(levelId)
.build());
memberLevelRecordMapper.insert(MemberLevelRecordDO.builder()
.userId(userId)
.levelId(levelId)
.level(level.getLevel())
.discountPercent(level.getDiscountPercent())
.experience(level.getExperience())
.userExperience(user.getExperience())
.description("会员等级升级")
.build());
}
}4.5 会员签到
java
@Service
public class MemberSignInServiceImpl implements MemberSignInService {
@Resource
private MemberUserMapper memberUserMapper;
@Resource
private MemberSignInRecordMapper memberSignInRecordMapper;
@Transactional(rollbackFor = Exception.class)
public void signIn(Long userId) {
MemberUserDO user = memberUserMapper.selectById(userId);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
Integer day = getSignInDay(userId);
Integer point = getSignInPoint(day);
Integer experience = getSignInExperience(day);
memberUserMapper.updateById(MemberUserDO.builder()
.id(userId)
.point(user.getPoint() + point)
.experience(user.getExperience() + experience)
.build());
memberSignInRecordMapper.insert(MemberSignInRecordDO.builder()
.userId(userId)
.day(day)
.point(point)
.experience(experience)
.build());
}
}5. 业务规则
5.1 会员等级升级规则
- 会员经验达到下一等级的升级经验值时,自动升级
- 升级后享受对应等级的折扣权益
- 等级变更记录在 member_level_record 表中
5.2 积分规则
- 积分可以通过签到、消费、活动等方式获得
- 积分可以用于兑换商品或抵扣金额
- 积分变动记录在 member_point_record 表中
5.3 经验规则
- 经验可以通过签到、消费、活动等方式获得
- 经验用于会员等级升级
- 经验变动记录在 member_experience_record 表中
5.4 签到规则
- 每天签到可以获得积分和经验
- 连续签到天数越多,获得的奖励越多
- 签到记录在 member_sign_in_record 表中
6. 注意事项
- 会员手机号必须唯一,使用 uk_mobile 唯一索引保证
- 会员密码使用 BCrypt 加密存储
- 会员标签使用 JSON 类型存储,使用 LongListTypeHandler 处理
- 所有表都支持多租户,通过 tenant_id 字段隔离
- 所有表都支持逻辑删除,通过 deleted 字段标记
- 会员等级升级时,需要记录等级变更历史
- 积分和经验变动时,需要记录变动历史
注意:本文档持续更新中,如有问题请及时反馈。
