简介
本文件面向DouPHP电商系统的“分享推广”模块,聚焦于分享记录表 dou_share 的表结构设计、业务流程与扩展方案。当前仓库实现了“分享奖励申请与审核”的最小可用闭环:会员提交分享申请(含图片附件),后台审核通过后发放积分;同时提供分享记录列表展示。文档在此基础上补充了分享链接生成、点击追踪、转化统计、效果分析与ROI计算等常见业务所需的表结构与实现建议,帮助开发者构建完整的分享推广数据模型。
项目结构
分享模块采用前后端分离与模块化组织:
- 数据库脚本定义分享主表结构
- 前台负责会员侧的申请、列表展示与服务编排
- 后台负责审核、批量操作与积分发放
- API为小程序等客户端提供统一接口
graph TB
subgraph "前端"
FE["前端控制器<br/>/share"]
end
subgraph "API"
API["小程序用户控制器<br/>?route=share/user/*"]
end
subgraph "业务服务"
FSVC["前台服务<br/>ShareService"]
ASVC["后台服务<br/>ShareService"]
end
subgraph "数据层"
M1["前台模型 Share"]
M2["后台模型 Share"]
DB[("数据库<br/>dou_share / point")]
end
FE --> FSVC
API --> FSVC
FSVC --> M1
ASVC --> M2
M1 --> DB
M2 --> DB
核心组件
- 分享主表(dou_share):记录每次分享申请单号、归属会员、处理记录、处理时间、状态与创建时间。
- 积分表(point):在开启积分功能时,用于记录分享行为对应的积分变动,包含 action=share 与 from=share_sn 的关联。
- 前台服务:负责分享单号生成、申请提交、列表查询与待办计数。
- 后台服务:负责分享列表筛选、详情渲染、审核通过并写入处理记录与时间,必要时发放积分。
- 控制器:前端页面入口与API用户接口,协调服务与视图/响应。
架构总览
分享推广的核心流程包括:会员提交分享申请(携带图片草稿令牌)、后台审核通过并记录处理信息、可选地发放积分。
sequenceDiagram
participant U as "会员"
participant FE as "前端控制器"
participant SVC as "前台服务"
participant MOD as "前台模型"
participant DB as "数据库(dou_share)"
participant ASVC as "后台服务"
participant PMOD as "后台模型"
participant PDB as "数据库(point)"
U->>FE : 访问分享列表/申请
FE->>SVC : buildShareListData / submitShareApply
SVC->>MOD : createShareSn / forUser / countPendingByUserId
MOD->>DB : 读写 share 表
Note over SVC,DB : 提交申请时创建 share 行(status=0),并认领附件
U->>FE : 后台审核通过
FE->>ASVC : handle(审核)
ASVC->>PMOD : 更新 status/handle_record/handled_at
PMOD->>DB : 更新 share 表
ASVC->>PDB : 若开启积分则写入 point(action=share, from=share_sn)
详细组件分析
分享主表(dou_share)设计
- 用途:记录每一次分享奖励申请,作为后续审核与计分的唯一依据。
- 关键字段
- id:自增主键
- share_sn:分享单号,唯一标识一次分享申请
- user_id:会员ID
- handle_record:审核处理备注
- handled_at:处理时间
- status:状态(-1待审核,0已驳回,1已通过)
- created_at:创建时间
- 索引建议
- 主键 id
- 唯一索引 share_sn(防重复)
- 普通索引 user_id(按会员查询)
- 复合索引 (status, created_at) 支持列表分页与筛选
分享单号生成与去重
- 生成策略:随机6位数字,存在冲突时递归重试,直至唯一。
- 去重保障:通过模型方法检查 share_sn 是否已存在,避免并发下重复。
- 建议增强:在高并发场景可引入Redis原子递增或分布式锁,确保唯一性与高性能。
分享申请提交流程
- 步骤
- 清理用户历史草稿,生成新的草稿令牌
- 创建 share 记录(status=0),绑定 share_sn 与 user_id
- 将草稿附件认领到真实 share.id
- 失败回滚:未认领成功则删除新建的 share 记录
- 结果:进入后台审核队列
flowchart TD
Start(["开始"]) --> Clean["清理用户草稿"]
Clean --> Token["生成草稿令牌"]
Token --> Create["创建 share 记录<br/>status=0"]
Create --> Claim["认领附件到 share.id"]
Claim --> |成功| Done(["完成"])
Claim --> |失败| Rollback["删除新建的 share 记录"]
Rollback --> End(["结束"])
后台审核与积分发放
- 审核动作:更新 status=1,写入 handle_record 与 handled_at
- 积分发放:若开启积分功能,根据配置参数向 point 表写入 action=share、from=share_sn 的记录
- 批量删除:支持批量取消选中记录
sequenceDiagram
participant A as "管理员"
participant AC as "后台控制器"
participant ASVC as "后台服务"
participant M as "后台模型"
participant DB as "数据库"
A->>AC : 提交审核
AC->>ASVC : handle(validated)
ASVC->>M : 更新 status/handle_record/handled_at
M->>DB : UPDATE dou_share
ASVC->>DB : 若开启积分则 INSERT point(action=share, from=share_sn)
ASVC-->>AC : 返回重定向
分享记录列表与展示
- 前台列表:按会员过滤,分页展示 share_sn、图片、处理记录、处理时间、积分、状态与创建时间
- 后台列表:支持用户名、分享单号、时间范围筛选,分页展示并格式化状态样式
小程序分享奖励接口
- 列表:返回 share_list 与 pager
- 申请:校验是否存在待处理申请,清理草稿并返回 draft_token
- 提交:再次校验待处理,调用服务提交申请
依赖关系分析
- 前台服务依赖前台模型进行 share 表读写与统计
- 后台服务依赖后台模型进行列表筛选与审核更新
- 积分发放依赖 point 表(当 features.point 开启时)
- 附件系统通过 attachment() 管理草稿与认领
classDiagram
class 前台服务_ShareService {
+createShareSn()
+submitShareApply(userId, draftToken)
+buildShareListData(userId, page, pageUrl)
+countPendingByUserId(userId)
}
class 前台模型_Share {
+shareSnExists(shareSn) bool
+forUser(query, userId)
+countPendingByUserId(userId) int
+getPointValueForShareAction(userId, shareSn) mixed
}
class 后台服务_ShareService {
+buildShareListData(...)
+handle(validated) string
+batchCancel(validated) array
}
class 后台模型_Share {
+scopeFilterByUserId(...)
+scopeFilterByShareSn(...)
+scopeFilterByCreatedAfter(...)
+scopeFilterByCreatedBefore(...)
+deleteWhereIdIn(ids)
}
前台服务_ShareService --> 前台模型_Share : "使用"
后台服务_ShareService --> 后台模型_Share : "使用"
性能与高并发优化
- 高并发分享计数
- 使用Redis原子计数器(如 INCR)对 share 事件计数,定时落库聚合,降低数据库压力
- 对热点 key 设置过期与分片,避免单点瓶颈
- 数据去重
- share_sn 唯一索引保证幂等
- 并发申请前增加 Redis 分布式锁(user_id + 资源粒度),防止重复提交
- 读写分离与缓存
- 列表页读多写少,可使用缓存层(如内存缓存/Redis)缓存分页结果或统计值
- 审核写路径走数据库事务,确保一致性
- 索引优化
- 为 user_id、status、created_at 建立合适索引,提升筛选与分页效率
- 异步化
- 积分发放、消息通知等耗时逻辑可放入任务队列异步执行,缩短请求链路
故障排查指南
- 申请失败
- 检查是否存在待处理申请(countPendingByUserId)
- 确认草稿令牌有效且附件认领成功
- 审核异常
- 校验 share 记录是否存在
- 确认状态不允许重复通过(已通过的需解锁)
- 积分未到账
- 检查 features.point 是否开启
- 核对 point 表中 action=share 与 from=share_sn 的记录
结论
当前分享模块实现了“申请—审核—积分”的最小闭环,数据结构清晰、职责分层明确。为满足更广泛的电商分享推广需求,建议在现有 dou_share 基础上扩展分享链接、点击追踪、转化统计与效果分析相关表结构,并结合缓存、队列与索引优化提升高并发下的稳定性与性能。
附录:数据模型与字段说明
现有表结构
- dou_share(分享主表)
- id:自增主键
- share_sn:分享单号(建议唯一索引)
- user_id:会员ID(建议索引)
- handle_record:处理记录
- handled_at:处理时间
- status:状态(-1待审核,0已驳回,1已通过)
- created_at:创建时间
推荐扩展表结构(供参考)
- 分享渠道表(share_channel)
- id:主键
- name:渠道名称(如微信、微博、短信)
- code:渠道编码(唯一)
- sort:排序
- enabled:是否启用
- created_at/updated_at:时间戳
- 分享链接表(share_link)
- id:主键
- share_sn:关联分享单号(外键/逻辑关联)
- channel_code:渠道编码
- short_url:短链
- long_url:原始长链
- expire_at:过期时间
- created_at:创建时间
- 索引:short_url 唯一、channel_code、expire_at
- 点击追踪表(share_click)
- id:主键
- link_id:关联分享链接
- user_id:访客/会员ID(可为空)
- ip:IP地址
- ua:用户代理
- referer:来源页面
- device:设备类型
- location:地区(可选)
- created_at:访问时间
- 索引:link_id、created_at、user_id
- 转化统计表(share_conversion)
- id:主键
- click_id:关联点击记录
- event_type:事件类型(注册、下单、支付等)
- target_id:目标对象ID(如订单号)
- amount:金额(可选)
- created_at:转化时间
- 索引:click_id、event_type、created_at
- 效果分析报表(share_statistics)
- id:主键
- stat_date:统计日期
- channel_code:渠道编码
- clicks:点击数
- conversions:转化数
- orders:订单数
- revenue:销售额
- roi:投资回报率(可选)
- created_at/updated_at:时间戳
- 索引:stat_date、channel_code
说明
- 以上扩展表为通用设计建议,可根据实际业务裁剪
- 点击与转化可通过事件流方式异步写入,减少主流程开销
- 报表可按天/周/月聚合,便于趋势分析与ROI计算