甄选好物 · 每一单都赚积分
消费1元=1积分 · 积分抵现(100积分=1元)· 评论分享额外赚积分
全部
山药鲜品
山药面食
山药煎饼
养生粉/蜂蜜
东北山珍
五谷杂粮
💬 最新评价
购物车
结算时自动应用会员折扣,可用积分抵扣现金(最高抵订单30%)
系统设计文档
用户购物与积分激励系统 · 模块交互流程 / 数据结构 / 业务规则引擎
① 用户认证流程
访问商城→
注册(送100积分)→
登录验证→
Session保持→
忘记密码 → 手机验证 → 重置
② 购物下单流程
浏览/搜索商品→
加入购物车→
选择数量规格→
结算页→
自动应用等级折扣→
选择积分抵扣→
支付→
获得消费积分→
订单跟踪
③ 积分生命周期
获取(注册/消费/评论/分享)→
累计 → 等级提升→
使用(抵现)→
流水记录(Ledger)→
过期清零(24个月)
④ 社交互动流程
订单完成→
发表评论+评分(+20分)→
展示商品详情页
点击分享→
生成分享链接/文案→
复制到剪贴板→
每日每商品限1次(+10分)
// ========== 核心数据表设计 ==========
// 用户表 users(主键 id)
{
id: STRING // UUID,
username: STRING UNIQUE,
phone: STRING UNIQUE,
passwordHash: STRING, // bcrypt 加密存储
points: INT, // 当前可用积分余额
totalEarned: INT, // 累计获得积分(决定等级)
tier: ENUM, // 注册/白银/黄金/铂金/钻石
createdAt: DATETIME
}
// 订单表 orders(主键 orderNo)
{
orderNo: STRING UNIQUE,
userId: STRING FK→users,
items: [{ productId, name, price, qty }],
subtotal: DECIMAL, // 商品小计
tierDiscount: DECIMAL, // 等级折扣金额
pointsUsed: INT, // 抵扣积分
pointsDeduct: DECIMAL, // 积分抵扣金额
paid: DECIMAL, // 实付金额
pointsEarned: INT, // 本单获得积分
status: ENUM, // 待发货/已发货/已完成
reviewed: BOOLEAN, // 是否已评价
createdAt: DATETIME
}
// 积分流水表 points_ledger(对账核心,只增不改)
{
id: STRING, userId: STRING FK,
type: ENUM, // EARN_REGISTER/EARN_ORDER/EARN_REVIEW/EARN_SHARE/SPEND_ORDER/EXPIRE
points: INT, // 正数获得,负数消耗
refId: STRING, // 关联订单号/评论ID/商品ID,
balanceAfter: INT, // 变动后余额(审计),
expireAt: DATETIME, // 获得时间+24个月,
createdAt: DATETIME
}
// 评价表 reviews
{ id, productId, userId, username, rating: INT 1-5, text, createdAt }
// 分享记录表 shares(防刷:userId+productId+日期 唯一索引)
{ id, userId, productId, shareDate: DATE, createdAt }
// 规则引擎配置 —— 所有规则集中在 RULES 常量,可配置、可扩展
const RULES = {
earn: {
register: { points: 100, note: '注册赠送' },
consumption: { perYuan: 1, note: '消费1元=1积分' },
review: { points: 20, oncePerOrder: true },
share: { points: 10, oncePerProductPerDay: true }
},
spend: {
exchangeRate: 100, // 100积分=1元
maxDeductRate: 0.30 // 最高抵扣订单实付30%
},
expire: { months: 24 } // 积分有效期24个月
}
积分获取规则
🎁 注册奖励
+100
新用户注册成功即赠100积分,鼓励完成首次登录
💰 消费返积分
1元=1分
按实付金额计算,支付成功即时入账
💬 订单评价
+20
每笔已完成订单限一次,需文字+星级评分
📢 分享商品
+10
每商品每日限1次,防刷机制保障公平
阶梯折扣等级(按累计获得积分)
| 等级 | 累计积分门槛 | 购物折扣 | 权益说明 |
| 🌱 注册会员 | 0 | — | 基础积分权益 |
| 🥈 白银会员 | 500 | 98折 | 解锁积分抵现 |
| 🥇 黄金会员 | 2,000 | 95折 | 生日双倍积分 |
| 💠 铂金会员 | 5,000 | 9折 | 专属客服+优先发货 |
| 💎 钻石会员 | 10,000 | 85折 | 新品优先购+线下活动 |
// ========== 关键业务逻辑(伪代码) ==========
// 1. 结算价格计算链
function calcCheckout(cart, user, pointsToUse) {
subtotal = Σ(item.price × item.qty)
tier = getTierByTotalEarned(user.totalEarned)
discount = subtotal × (1 - tier.rate) // 等级折扣
afterTier = subtotal - discount
maxDeduct = afterTier × RULES.spend.maxDeductRate // 抵扣上限30%
deduct = min(pointsToUse / 100, maxDeduct, user.points / 100)
paid = afterTier - deduct // 实付金额
return { subtotal, discount, deduct, paid }
}
// 2. 支付成功事务(原子操作)
function onPaySuccess(order) {
TRANSACTION {
order.status = '待发货'
user.points -= order.pointsUsed // 扣除抵扣积分
earned = floor(order.paid × 1) // 消费返积分
user.points += earned
user.totalEarned += earned // 计入等级
ledger.add(...); checkTierUpgrade(user) // 触发等级重算
}
}
// 3. 防刷校验
function canShareReward(userId, productId) {
return !shares.exists({userId, productId, date: today})
}
function canReviewReward(order) {
return order.status=='已完成' && !order.reviewed
}
// 4. 积分过期(定时任务,FIFO先进先出核销)
cron daily: 过滤 ledger 中 type=EARN && expireAt < now
→ 生成 EXPIRE 负向流水,扣减余额,通知用户