文档目录
分享推广表

简介

本文件面向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计算
添加日期:2026-10-05