微信小程序分享活动技术方案

前言

到头来还是不想找工作,继续折腾吧,看看还能瞎折腾多久。 最近有一个感悟,自己做事情之后所有杂七杂八的事情全都要自己去推动,如果自己不推,那么事情就不会有进展,就算你躺在那里也不会有人管你。 长期工作之后在创业,会有个弊病,就是我把这件事情做完了,然后呢?之前工作的时候,我负责开发我的需求,从代码的设计思路,到实现需求,这个事情好像就结束了,但是自己创业就会衍生出一个问题,你实现了这个需求,然后呢?真心建议正在工作人,特别是毕业三五年内的年轻人,别把自己当成一个工具人,多思考业务价值,和多跟进业务的后续发展,要去搞清楚你做的需求的整个业务链路,并跟进下去。

需求背景

微信小程序、其他各类APP以及网站平台,普遍会举办分享活动,旨在吸引新用户并提升平台内部的互动与曝光度。这些活动通过鼓励用户分享内容至社交圈,有效扩大了平台的传播范围,增加了潜在用户的接触机会,同时也提升了现有用户的参与度和粘性。分享活动不仅有助于平台的用户增长,还能够提升品牌的知名度和影响力,实现用户与平台之间的双赢。

业务流程

技术方案

据库设计

分享(share)

用于记录所有分享的数据

字段 类型 说明
_id string 主键,唯一标识
createTime int 创建时间戳
sourceId string 来源id,分享人的用户id
sourceTag string 来源渠道
sourceType string 来源类型
userId string 用户Id,接收分享消息的的用户的Id,可以用于拉新活动判断是否是新用户
shareStatus int 1:未接收;2:接收成功;3:接收成功,但是已经注册过;4:接收成功并注册
contentId string 分享的内容id

分享反馈(share-notice)

用户查看分享的反馈信息

字段 类型 说明
_id string 主键,唯一标识
createTime int 创建时间戳
userId string 用户Id
title string 提示标题
content string 提示内容
isRead int 1 已读 2 未读

接口设计

更新分享信息(share/update)

csharp 复制代码
const {
  dbUpdate,
  getFilterParams,
} = require("../../utils");
// 更新提示消息
const updateNotice = require('../../notice/update')

exports.main = async (data) => {
  const params = {
    _id: data?._id || "",
    contentId: data?.contentId || "",
    sourceId: data?.sourceId || '', // 来源ID 分享人ID
    sourceTag: data?.sourceTag || '', // 渠道类型
    sourceType: data?.sourceType || '', // 来源类型
    userId: data?.userId || '',
    shareStatus: data?.shareStatus || 1, // 1:未接收;2:接收成功;3:接收成功,但是已经注册过;4:接收成功并注册
  }

  const res = await dbUpdate("share", getFilterParams(params));
  
  // 发起分享时,不传userId
  if (params?._id && params?.userId) {
    const contentMap = {
      3: '不是新用户的提示文案',
      4: '新用户的提示文案'
    }

    
    const noticeParams = {
      userId: params.userId,
      title: '转发成功',
      content: contentMap?.[noticeParams.shareStatus] || `提示的文案,`,
      shareStatus: params.shareStatus
    }
    
    updateNotice.main(getFilterParams(noticeParams));
  }
  return res
};

更新分享通知接口(notice/update)

kotlin 复制代码
const {
  dbUpdate,
  getFilterParams
} = require("../../utils");

exports.main = async (data) => {
  const params = {
    _id: data?._id || "",
    userId: data?.userId || '',
    title: data?.title || '',
    isRead: data?.isRead || 2,
    content: data?.content || "",
  }

  return await dbUpdate("notice", getFilterParams(params));
};

前端发起分享

javascript 复制代码
export async function onShare(params) {
  const {
    title = '', path = '', contentId = ''
  } = params;

  const res = await fetchShareUpdate(params);
  console.log('share res', res)

  if (res?.code === 0) {
    const shareId = res?.data?.data?._id || '';
    const sharePath = `${path}?_id=${contentId}&shareId=${shareId}`;
    const promise = new Promise(resolve => {
      setTimeout(() => {
        resolve({
          title,
          path: sharePath,
        })
      })
    })
    return {
      title,
      path: sharePath,
      promise
    }
  } else {
    return res;
  }
}
相关推荐
笃行3504 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核
前端
微订校园外卖系统4 小时前
校园外卖多站点管理能做吗?三层权限与对账架构
架构·外卖系统·本地生活·微订
金銀銅鐵5 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
得帆低代码PaaS5 小时前
企业级 Agent 架构:MCP、Integration、数据与治理能力
大数据·人工智能·架构·ai agent·企业数字化·mcp
陈随易5 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
ZhengEnCi6 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学
前端·css·交互设计
txxzjmzlh6 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
孟健8 小时前
实测 agent-desktop:AI 控制桌面不截图、不占鼠标键盘,连点 55 次计算器 0 失误
人工智能·架构·开源
nice_lcj5208 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
IT_陈寒9 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端