一、会员体系设计
1. 会员等级设计
- 等级划分:普通会员、银牌会员、金牌会员、钻石会员
- 升级条件:
- 消费金额累计(如30天内消费满200元升银牌)
- 订单数量累计
- 活跃度(登录、评价、分享等行为)
2. 会员权益设计
- 基础权益:
- 专属价格(部分商品会员价)
- 免费配送(达到一定等级后)
- 生日礼包
- 进阶权益:
- 优先配送(高峰时段优先处理)
- 专属客服通道
- 会员日折扣(每周固定日额外折扣)
- 积分加速(消费积分比例提升)
二、系统架构设计
1. 数据库设计
```sql
-- 会员基本信息表
CREATE TABLE member (
member_id BIGINT PRIMARY KEY AUTO_INCREMENT,
phone VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(50),
avatar VARCHAR(255),
register_time DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login_time DATETIME,
status TINYINT DEFAULT 1 COMMENT 1-正常 0-冻结
);
-- 会员等级表
CREATE TABLE member_level (
level_id INT PRIMARY KEY,
level_name VARCHAR(20) NOT NULL,
min_points INT NOT NULL COMMENT 升级所需积分,
discount_rate DECIMAL(3,2) COMMENT 折扣率,
free_delivery_threshold DECIMAL(10,2) COMMENT 免运费门槛,
description VARCHAR(255)
);
-- 会员积分记录表
CREATE TABLE member_points (
record_id BIGINT PRIMARY KEY AUTO_INCREMENT,
member_id BIGINT NOT NULL,
change_type TINYINT NOT NULL COMMENT 1-增加 2-减少,
change_reason VARCHAR(100) NOT NULL,
points_change INT NOT NULL,
before_points INT NOT NULL,
after_points INT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
-- 会员权益表
CREATE TABLE member_privilege (
privilege_id INT PRIMARY KEY AUTO_INCREMENT,
level_id INT NOT NULL,
privilege_type TINYINT NOT NULL COMMENT 1-折扣 2-免运费 3-专属活动等,
privilege_value VARCHAR(100) NOT NULL,
description VARCHAR(255),
FOREIGN KEY (level_id) REFERENCES member_level(level_id)
);
```
2. 核心服务模块
- 会员管理服务:
- 会员注册/登录
- 会员信息查询与修改
- 会员等级计算与升级
- 会员状态管理
- 积分管理服务:
- 积分获取规则(消费、评价、分享等)
- 积分消耗规则(兑换、抵扣等)
- 积分流水记录
- 积分有效期管理
- 权益管理服务:
- 权益配置与发放
- 权益使用记录
- 权益有效期管理
- 权益使用限制检查
三、关键功能实现
1. 会员等级升级逻辑
```java
public class MemberLevelService {
public void checkAndUpgradeMemberLevel(Long memberId) {
Member member = memberRepository.findById(memberId);
int currentPoints = member.getTotalPoints();
// 查询所有等级,按积分要求排序
List levels = memberLevelRepository.findAllOrderByMinPoints();
for (MemberLevel level : levels) {
if (currentPoints >= level.getMinPoints()) {
// 检查是否已经是该等级或更高等级
if (member.getLevelId() < level.getLevelId()) {
// 升级会员
member.setLevelId(level.getLevelId());
memberRepository.save(member);
// 记录升级日志
logMemberLevelUpgrade(memberId, level.getLevelId());
// 发送升级通知
sendLevelUpgradeNotification(memberId, level);
}
break;
}
}
}
}
```
2. 积分获取与消耗
```java
public class PointsService {
// 获取积分
public void addPoints(Long memberId, PointsSource source, int points) {
Member member = memberRepository.findById(memberId);
int currentPoints = member.getTotalPoints();
int newPoints = currentPoints + points;
member.setTotalPoints(newPoints);
memberRepository.save(member);
// 记录积分变动
MemberPointsRecord record = new MemberPointsRecord(
memberId,
PointsChangeType.INCREASE,
source.name(),
points,
currentPoints,
newPoints
);
pointsRecordRepository.save(record);
}
// 消耗积分
public boolean deductPoints(Long memberId, int points, PointsSource source) {
Member member = memberRepository.findById(memberId);
if (member.getTotalPoints() < points) {
return false; // 积分不足
}
int currentPoints = member.getTotalPoints();
int newPoints = currentPoints - points;
member.setTotalPoints(newPoints);
memberRepository.save(member);
// 记录积分变动
MemberPointsRecord record = new MemberPointsRecord(
memberId,
PointsChangeType.DECREASE,
source.name(),
points,
currentPoints,
newPoints
);
pointsRecordRepository.save(record);
return true;
}
}
```
3. 会员专属价格实现
```java
public class MemberPriceService {
public ProductPrice getMemberPrice(Long productId, Long memberId) {
// 获取商品基础价格
ProductPrice basePrice = productPriceRepository.findByProductId(productId);
// 获取会员等级
Member member = memberRepository.findById(memberId);
MemberLevel level = memberLevelRepository.findById(member.getLevelId());
// 检查是否有会员专属价
MemberProductPrice memberPrice = memberProductPriceRepository
.findByProductIdAndLevelId(productId, level.getLevelId());
if (memberPrice != null) {
return memberPrice;
} else {
// 如果没有专属价,应用等级折扣
double discountedPrice = basePrice.getPrice() * (1 - level.getDiscountRate());
return new ProductPrice(basePrice.getProductId(), discountedPrice);
}
}
}
```
四、技术实现要点
1. 高并发处理:
- 使用Redis缓存会员信息,减少数据库压力
- 会员等级升级采用异步处理,避免阻塞主流程
2. 数据一致性:
- 采用分布式事务处理积分变动和会员等级升级
- 使用消息队列确保积分变动通知的可靠性
3. 安全考虑:
- 会员数据加密存储
- 敏感操作(如积分兑换)增加二次验证
- 防止积分刷取的风控机制
4. 扩展性设计:
- 会员等级和权益配置化,便于运营调整
- 积分规则可配置,支持多种积分获取方式
五、运营支持功能
1. 会员数据分析:
- 会员消费行为分析
- 等级分布统计
- 权益使用情况分析
2. 营销活动支持:
- 会员日活动配置
- 等级专属活动
- 积分兑换活动管理
3. 会员沟通渠道:
- 站内信系统
- 短信/推送通知
- 会员专属客服入口
六、实施路线图
1. 第一阶段(1个月):
- 会员基础框架搭建
- 等级体系和积分规则设计
- 核心数据库设计
2. 第二阶段(1个月):
- 会员管理后台开发
- 会员API接口开发
- 积分获取与消耗功能实现
3. 第三阶段(1个月):
- 会员权益系统开发
- 会员专属价格实现
- 会员日活动功能
4. 第四阶段(持续):
- 数据分析与运营工具开发
- 会员营销活动支持
- 系统优化与性能提升
通过以上方案,叮咚买菜可以构建一个完善的会员体系,提升用户粘性和平台竞争力。