简介
本文件面向 DouPHP 小程序“分享传播”功能页面的开发与维护,聚焦以下目标:
- 分享申请与记录:用户提交分享截图、查看个人分享记录。
- 后台审核与激励:管理员审核通过并下发积分奖励(可配置)。
- 数据模型与流程:围绕 share 表、附件草稿认领、状态流转与分页展示。
- 统计与优化:提供点击量、转化率、ROI 等指标的接入建议与落地方案。
- 常见问题:链接失效、重复申请、防刷机制等问题的处理策略。
说明:当前代码实现的是“分享奖励申请与审核”闭环;分享链接生成、来源追踪、转化统计属于扩展能力,本文在“扩展设计”部分给出可落地的方案与接口约定,便于后续集成。
项目结构
分享功能涉及前台会员中心、API(小程序)、后台管理三个入口,以及共享的业务服务与数据模型。
graph TB
subgraph "前台"
FSC["front/controller/share/ShareController"]
FUC["front/controller/share/UserController"]
FSS["_'/module/share/front/service/share/ShareService"]
end
subgraph "API(小程序)"
ASC["api/controller/share/ShareController"]
AUC["api/controller/share/UserController"]
end
subgraph "后台"
BSC["admin/controller/share/ShareController"]
BSS["admin/service/share/ShareService"]
BSM["_'/module/share/admin/model/share/Share"]
BV["admin/view/share.htm"]
end
FSC --> FSS
FUC --> FSS
AUC --> FSS
BSC --> BSS
BSS --> BSM
BSC --> BV
核心组件
- 前台控制器
- ShareController:统一入口 /share,渲染当前会员的分享记录列表。
- UserController:会员中心 /user/share/*,包含列表、申请表单、提交申请。
- API 控制器(小程序)
- ShareController:模块入口占位。
- UserController:小程序侧分享记录列表、申请页获取草稿令牌、提交申请。
- 业务服务
- 前台 ShareService:生成分享编号、提交申请(创建 share 行并认领草稿附件)、构建列表数据、查询待处理数量。
- 后台 ShareService:列表筛选与分页、详情视图、审核处理(写入状态/时间、发放积分)、批量删除、参数初始化。
- 数据模型
- admin Model Share:映射 share 表,提供筛选作用域、默认排序、批量删除等。
- 视图与语言
- admin/view/share.htm:后台列表与详情模板,展示图片、状态、操作按钮。
- 多语言键:分享状态、字段名、提示语等。
架构总览
分享功能采用前后端分离的三层架构:前台/小程序负责申请与展示,后台负责审核与激励发放,服务层封装业务规则,模型层负责数据访问。
sequenceDiagram
participant U as "用户/小程序"
participant F as "前台控制器"
participant S as "前台服务"
participant DB as "数据库(share)"
participant A as "后台控制器"
participant AS as "后台服务"
participant W as "钱包/积分服务"
U->>F : 打开申请页/提交申请
F->>S : 清理草稿/生成草稿令牌/提交申请
S->>DB : 创建分享记录(status=0)
S->>DB : 认领草稿附件到分享ID
Note over S,DB : 至少一张图认领成功才算成功
U->>A : 后台审核(通过/驳回)
A->>AS : 更新状态/记录审核信息
AS->>W : 若开启积分则发放积分(按配置)
AS-->>A : 返回重定向URL
详细组件分析
前台分享申请与记录
- 列表页:根据当前登录用户 ID 拉取分享记录,附带图片列表、状态、时间等。
- 申请表:校验是否已有待处理申请;清理历史草稿并生成新的草稿令牌;渲染已上传的图片预览。
- 提交申请:再次校验待处理数量;调用服务创建分享记录并认领草稿附件;成功后跳转提示。
flowchart TD
Start(["进入申请页"]) --> CheckPending{"是否存在待处理申请?"}
CheckPending --> |是| ShowTip["提示不可重复申请"]
CheckPending --> |否| CleanDraft["清理历史草稿"]
CleanDraft --> NewToken["生成草稿令牌"]
NewToken --> RenderForm["渲染表单与图片预览"]
RenderForm --> Submit["提交申请(draft_token)"]
Submit --> CreateRecord["创建分享记录(status=0)"]
CreateRecord --> ClaimAttach["认领草稿附件到分享ID"]
ClaimAttach --> Success{"至少一张图认领成功?"}
Success --> |是| Done["提示申请成功"]
Success --> |否| Fail["提示失败并返回申请页"]
API 小程序侧分享申请
- 列表接口:返回分享记录与分页信息。
- 申请接口:清理草稿、生成草稿令牌、返回图片 HTML 片段。
- 提交接口:校验待处理、提交申请并返回结果。
sequenceDiagram
participant App as "小程序"
participant API as "API控制器"
participant FS as "前台服务"
participant DB as "数据库"
App->>API : GET /share/user (列表)
API->>FS : buildShareListData(userId, page)
FS->>DB : 查询分享记录
DB-->>FS : 记录集
FS-->>API : 列表+分页
API-->>App : JSON 响应
App->>API : GET /share/user/apply
API->>FS : 清理草稿/生成令牌
FS-->>API : 返回draft_token与图片HTML
API-->>App : JSON 响应
App->>API : POST /share/user/apply
API->>FS : submitShareApply(userId, draft_token)
FS->>DB : 创建分享记录并认领附件
DB-->>FS : 成功/失败
FS-->>API : 布尔结果
API-->>App : 成功或错误码
后台审核与激励发放
- 列表:支持按用户名、分享编号、时间范围筛选,分页展示。
- 详情:展示分享编号、用户、图片、状态、审核信息等。
- 审核:更新状态为“已完成”,记录审核时间与备注;若开启积分,按配置发放积分。
- 批量:批量删除选中记录并写审计日志。
sequenceDiagram
participant Admin as "管理员"
participant AC as "后台控制器"
participant AS as "后台服务"
participant DB as "数据库"
participant W as "钱包/积分服务"
Admin->>AC : 打开列表/详情
AC->>AS : 构建列表/详情数据
AS->>DB : 查询分享记录
DB-->>AS : 数据
AS-->>AC : 渲染数据
Admin->>AC : 提交审核(通过/备注)
AC->>AS : handle(validated)
AS->>DB : 更新status/handled_at/handle_record
AS->>W : 若开启积分则createPoint(user_id, 'share', point, share_sn)
AS-->>AC : 重定向到详情页
数据模型与字段说明
- 主表:share(分享记录)
- id:主键
- user_id:分享用户ID
- share_sn:分享编号(唯一标识,用于关联积分发放)
- status:状态(0 处理中,1 处理完成)
- handle_record:审核说明
- handled_at:审核时间
- created_at:申请时间
- 附件:通过通用附件系统以“share”类型挂载到分享ID,支持多图。
- 权限与白名单:后台模型定义可批量写入字段,避免越权修改。
分享编号生成机制
- 生成规则:6位数字随机数,不足补零;若冲突则递归重试。
- 用途:作为分享的唯一标识,用于关联积分发放与后续统计。
- 复杂度:O(1) 平均生成,冲突概率极低;存在冲突时线性重试。
分享效果追踪与统计分析(扩展设计)
当前代码未内置点击与转化埋点,建议在分享链接中携带追踪参数,并在落地页进行计数与归因:
- 链接参数建议
- source:来源渠道(如 weixin、qq、douapp)
- channel:子渠道(如 group、moments)
- content:内容类型(product/article/activity)
- item_id:内容ID(商品/文章/活动ID)
- referrer_user_id:分享人ID(可选)
- ts:时间戳(防缓存)
- 落地页埋点
- 首次访问记录一次点击事件(去重策略:基于 session + item_id + source 组合)。
- 将点击事件写入统计表(如 share_clicks),字段包括:id、item_type、item_id、source、channel、referrer_user_id、created_at。
- 转化归因
- 当发生购买/注册等行为时,读取最近一次有效点击(例如 7 天内)进行归因。
- 计算指标:点击量、转化率(转化次数/点击量)、ROI(收益-成本)/成本(积分成本)。
- 报表与导出
- 按日/周/月聚合点击与转化,支持按来源、渠道、内容类型维度下钻。
- 提供导出接口供运营分析使用。
分享激励机制
- 触发条件:后台审核通过(status=1)。
- 奖励内容:积分(可配置),通过钱包服务发放,关联 share_sn 以便追溯。
- 配置项:分享奖励积分值(默认值由语言包提供,可在参数管理中设置)。
分享文案与素材优化(扩展建议)
- 文案优化:针对不同渠道与人群,动态拼接标题与摘要,提升点击率。
- 图片生成:服务端合成带二维码的海报图,二维码中包含追踪参数。
- 模板定制:支持多套海报模板,按内容类型切换。
- A/B 测试:对文案与图片进行分组实验,评估点击与转化差异。
依赖关系分析
- 控制器依赖服务:前台/后台控制器均依赖各自 ShareService。
- 服务依赖模型:后台服务依赖 admin Model Share 进行筛选与持久化。
- 服务依赖外部能力:钱包服务(积分发放)、附件系统(草稿认领与展示)、语言系统(多语言键)。
- 视图依赖数据:后台模板依赖服务组装的数据结构(列表、图片、状态)。
graph LR
FUC["前台UserController"] --> FSS["前台ShareService"]
FSC["前台ShareController"] --> FSS
AUC["API UserController"] --> FSS
BSC["后台ShareController"] --> BSS["后台ShareService"]
BSS --> BSM["后台Model Share"]
BSS --> WALLET["钱包服务"]
FSS --> ATTACH["附件系统"]
BSC --> VIEW["后台视图"]
性能考虑
- 分页加载:列表使用分页器,减少单次数据量。
- 附件懒加载:图片列表按需渲染,避免一次性加载过多资源。
- 并发控制:同一用户仅允许一个待处理申请,防止重复提交。
- 索引建议:对 share.user_id、share.share_sn、share.created_at 建立索引以提升查询效率。
- 缓存策略:对热点内容(如热门商品/文章)的分享统计可引入缓存层降低数据库压力。
故障排查指南
- 无法提交申请
- 检查是否已有待处理申请(前端/后端均有校验)。
- 确认草稿令牌有效且至少一张图片认领成功。
- 审核失败
- 检查状态是否为“已完成”且未解锁;非法参数会被拒绝。
- 未收到积分
- 确认已开启积分功能且配置了分享奖励积分值。
- 检查钱包服务是否正常。
- 图片不显示
- 检查附件是否正确认领到分享ID;后台模板依赖 gallery 方法返回数据。
结论
当前分享功能实现了完整的“申请—审核—激励”闭环,具备清晰的职责划分与良好的可扩展性。建议在此基础上补充分享链接追踪与转化统计能力,完善运营分析与激励效果评估,进一步提升传播效率与 ROI。
附录
- 关键接口路径
- 前台:/share、/user/share、/user/share/apply、/user/share/applyPost
- API:?route=share/user、?route=share/user/apply、?route=share/user/applyPost
- 后台:route=share(列表/详情/处理/批量)
- 语言键参考
- 分享状态、字段名、提示信息等见语言文件。