7-团购实现.md 6.5 KB

@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人

【我要参团】

第四步:B下单

点击

我要参团

实际上就是

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 每个团购商品有分是否支持虚拟成团,以下按支持与不技术情况进行展开说明:

  1. 支持 开启了虚拟成团的,会填写一个虚拟成团时间(要搞循环任务),每隔一段时间时,触发一闪任务,把不满团的自动变动为满团让其团购成功。

  2. 不支持 不支持虚拟成团的,则会在活动到期时,把对应开团的(或参团的)的订单标记为失败。

后端流程

创建团:

创建订单
↓
支付
↓
创建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

即可进入同一个团。


支持增加的功能

这是一个商用的鲜花商城,建议一开始就预留以下能力,而不要只做最基础的拼团:

  1. 自动退款:拼团失败后自动触发退款流程(项目中有退款实现,请找出直接用上)。
  2. 一人成多团:同一用户可以同时发起多个不同团,或参与多个团(处理好,同一个团不重叠同一客户)。
  3. 虚拟成团:支持机器人补位(如有业务需求,需明确标识并遵守相关平台规则)。
  4. 阶梯拼团:3 人团、5 人团、10 人团对应不同价格。
  5. 团排行榜:展示热门拼团、即将满团(例如还差 1 人),提高转化率。
  6. 库存锁定策略:建议在用户支付成功后占用库存,而不是开团时占用;若业务要求,也可采用预占库存并设置超时释放机制。

建议采用"拼多多式拼团"架构:订单(Order) 与 拼团(Group) 解耦,订单只记录自己属于哪个 group_id,而拼团人数完全由 group_member 维护。** 这种设计扩展性最好,后续增加团长免单、阶梯团、抽奖团、老带新团、万人团等玩法时,数据库结构基本无需调整,非常适合商用项目。