@mallApp/src/pages/home/index.vue:47~53 点击里面的商品时,修改为跳转到一个“团购详情”页面,此页面样式如图。
团购详情.png 只呈现了一个在客户点击团购商品时,展现给客户的团购入口页(即下面的:用户选择 > 红玫瑰99元 ),其它后端及前端的支持没有实现时,是无法实现团购功能的。下面对团购核心功能做个描述,好让 AI 有个实现脉络,然后据此展开把实现计划写得更具体。
整个系统的核心其实只有三个对象:
活动(Activity)
│
├── 商品(Product)
│
└── 拼团(Group)
│
├── 团长(发起人)
├── 成员1
├── 成员2
├── 成员3
└── 成员4
团购活动创建在 @hdApp/src/admin/homePageConfig/groupBuy.vue 页面实现创建。当前,只支持一次只创建一个活动及运行一个活动(活动数据暂存到 redis,接下来要用 mysql 数据表持久化)。当前没有实现保存历史活动,此次实现时,补充按:活动日期时间 为区分id,创建出活动批次。对应下面的商品,如果商品有新增,但活动日期时间没变,就以活动日期时间为前缀,创建新活动商品记录(如果还是同样的商品,但把价格,也要创建新的商品记录,旧的不展示,只展现新的商品)。如果活动日期时间变动了,就会创建新的一批活动。如果活动日期时间重叠,直接取用历史活动,不新建了。
例如:
七夕鲜花拼团活动
│
├── 红玫瑰99元(5人成团)
├── 百合79元(3人成团)
└── 向日葵59元(2人成团)
用户选择
红玫瑰99元
点击
我要开团
系统生成:
GroupID = 9527
商品:红玫瑰
团长:A
人数:1/5
状态:拼团中
随后分享的是:
https://xxxx/pages/group?id=9527
不是
product?id=88
用户A
商品详情
红玫瑰99元
【我要开团】
点击以后
服务器(后端服务):
创建Group
group_id=1001
leader=A
need_num=5
current_num=1
status=拼团中
然后A支付成功。
支付成功以后:
Group
1001
人数
1/5
分享卡片:
A邀请你一起拼团
还差4人成团
立即参与
分享路径
onShareAppMessage() {
return {
title:'还差4人成团',
path:'/pages/group/detail?id=1001'
}
}
所有人打开都是:
GroupID=1001
而不是商品ID。
例如
B打开
页面请求
GET
/group/detail?id=1001
服务器返回
Group
1001
商品:红玫瑰
团长:A
人数:1/5
成员:A
页面展示
A □ □ □ □ 还差4人
【我要参团】
点击
我要参团
实际上就是
POST
/order/create
{
group_id:1001,
product_id:88
}
注意: 这里不是创建新团。
而是:
加入已有团
服务器(后端):
创建订单
order
↓
支付
↓
支付成功
↓
加入GroupMember
于是
Group
1001
人数
2/5
B也可以继续分享
分享出去仍然是:
group?id=1001
不是新的Group。
于是 C、D、E
全部进入:
1001
人数:
1/5
↓
2/5
↓
3/5
↓
4/5
↓
5/5
支付成功以后
current_num++
if(current_num==need_num){
status=SUCCESS
}
例如
need_num=5
current_num=5
更新
status=SUCCESS
然后:
通知所有人:
🎉 拼团成功
等待商家发货
@hdApp/src/admin/homePageConfig/groupBuyGoodsEdit.vue 每个团购商品有分是否支持虚拟成团,以下按支持与不技术情况进行展开说明:
支持 开启了虚拟成团的,会填写一个虚拟成团时间(要搞循环任务),每隔一段时间时,触发一闪任务,把不满团的自动变动为满团让其团购成功。
不支持 不支持虚拟成团的,则会在活动到期时,把对应开团的(或参团的)的订单标记为失败。
创建团:
创建订单
↓
支付
↓
创建Group
↓
加入GroupMember
↓
人数=1
参团:
创建订单
↓
支付
↓
加入GroupMember
↓
人数+1
↓
检查是否满团
↓
满团
↓
通知(通知可以先不实现)
页面脉络如下
活动详情
@mallApp/src/pages/home/index.vue:47~53 活动呈现
点击某商品,展示(按团购详情.png展示):
玫瑰
99元
5人成团
【去开团】
↓
团购的结果 ---- 现在只在订单中呈现情况
拼团情况展示:
已完成
失败
关键在于分享路径带上 group_id:
onShareAppMessage() {
return {
title: `还差${this.group.need_num - this.group.current_num}人成团`,
imageUrl: this.group.product.cover,
path: `/pages/group/detail?id=${this.group.id}`
}
}
好友打开:
group/detail?id=1001
即可进入同一个团。
这是一个商用的鲜花商城,建议一开始就预留以下能力,而不要只做最基础的拼团:
建议采用"拼多多式拼团"架构:订单(Order) 与 拼团(Group) 解耦,订单只记录自己属于哪个 group_id,而拼团人数完全由 group_member 维护。** 这种设计扩展性最好,后续增加团长免单、阶梯团、抽奖团、老带新团、万人团等玩法时,数据库结构基本无需调整,非常适合商用项目。