[mini-blog][v2.1.0]博客小程序签到功能实现

昨天抽空将mini-blog的签到功能基本上实现了,这里分享下。

很早之前就像实现签到功能,昨天终于花时间去变现了,先来看下效果图。

效果

个人中心的排版进行了一定的改造,将关于个人相关的信息整合,留些位置给到签到。

截图1

签到页还是常规的日历组件,为了保证一页填满,加了一个广告组件。

截图2

后端实现

页面样式定好之后,就看怎么设计了,首先是数据库,在云数据库中我又新增了三个集合。

首先是mini_member,用于记录会员相关的汇总数据,以openId作为唯一索引,其中也预留了一些属性,比如积分,未读消息等,用于后期的功能迭代中。

{
    "openId": "oyMiZ5aClPsDJ_2LqWNXWXMolyhs",
    "continueSignedCount": 1,//连续签到数量
    "lastSignedDate": "2020-03-05",//最近签到日
    "level": 1,//会员等级(预留)
    "totalPoints": 1,//总的积分(预留)
    "totalSignedCount": 1,//总的签到数
    "unreadMessgeCount": 0,//未读消息(预留)
    "modifyTime": 1583410585920
}

然后是两张明细表,mini_point_detailmini_sign_detail,用于记录用户的签到明细和积分明细。

基本上这三个集合可以基本满足签到+积分的一些简单功能了。

接着就是云函数的编写了,在这里我也新增了一个云函数memberService,用于处理会员维度相关的操作。

这次核心的方法就是签到,要操作的集合还是比较多的,除了要操作上面新增的三个集合之外,还要加一个mini_subcribute,用于接入签到提醒的订阅消息。核心代码如下:

async function addSign(event) {

  console.info("addSign")

  try {
    let memberInfos = await db.collection('mini_member').where({
      openId: event.info.openId
    }).get();

    const tasks = []
    let date = new Date().toFormat("YYYY-MM-DD")
    if (memberInfos.data.length === 0) {
      let task1 = db.collection('mini_member').add({
        data: {
          openId: event.info.openId,
          totalSignedCount: 1,//累计签到数
          continueSignedCount: 1,//持续签到
          totalPoints: 1,//积分
          lastSignedDate: date,//最后一次签到日期
          level: 1,//会员等级(预留)
          unreadMessgeCount: 0,//未读消息(预留)
          modifyTime: new Date().getTime()
        }
      })
      tasks.push(task1)
    }
    else {
      let continueSignedCount = 1
      let memberInfo = memberInfos.data[0]
      if (new Date().addDays(-1).toFormat("YYYY-MM-DD") == memberInfo.lastSignedDate) {
        continueSignedCount = memberInfo.continueSignedCount + 1
      }

      let task2 = db.collection('mini_member').doc(memberInfo._id).update({
        data: {
          totalSignedCount: _.inc(1),
          continueSignedCount: continueSignedCount,
          totalPoints: _.inc(1),
          lastSignedDate: date,
          modifyTime: new Date().getTime()
        }
      });
      tasks.push(task2)
    }

    //签到明细
    let date1 = new Date().toFormat("YYYY-M-D").split("-")
    let task3 = db.collection('mini_sign_detail').add({
      data: {
        openId: event.info.openId,
        year: date1[0],
        month: date1[1],
        day: date1[2],
        createTime: new Date().getTime()
      }
    })
    tasks.push(task3)

    //如果统一订阅签到通知
    if (event.info.accept == 'accept') {
      let task4 = await db.collection("mini_subcribute").add({
        data: {
          templateId: event.info.templateId,
          openId: event.info.openId,
          timestamp: new Date().getTime()
        }
      });
      tasks.push(task4)
    }

    //积分明细
    let task5 = db.collection('mini_point_detail').add({
      data: {
        openId: event.info.openId,
        operateType: 0,//0:获得 1:使用 2:过期
        count: 1,
        desc: "签到得积分",
        date: (new Date()).toFormat("YYYY-MM-DD HH:MI:SS"),
        createTime: new Date().getTime()
      }
    })
    tasks.push(task5)
    await Promise.all(tasks)
    return true
  }
  catch (e) {
    console.error(e)
    return false
  }
}

当然这里还是不够严谨的,理论上最好使用事务「云开发目前已经支持了,后面我优化下」,保证这几个集合的数据一致性。

其他用于界面展示的数据,可以绕过云函数,直接在小程序端查询云数据库即可,代码较简单,简单的查询。

交互实现

在前端交互上,本着不重复造轮子的目的,找了个开源日历组件「wx_calendar」,样式上基本能接受,功能也满足,所以直接拿来用了。详细的文档可以看下他的github,文档还是比较详细的。

主要在初始化日历组件之后,需要获取历史已经签到的明细,来渲染选中状态:

  /**
   * 日历组件渲染之后
   */
  afterCalendarRender: async function (e) {

    let year=util.getYear(new Date())
    let month=util.getMonth(new Date())
    let res = await api.getSignedDetail(app.globalData.appid, year.toString(), month.toString())
    console.info(res)
    let toSet = [];
    res.result.forEach(function (item) {
      let set = {
        year: item.year,
        month: item.month,
        day: item.day
      }
      toSet.push(set)
    })

    this.calendar.setSelectedDays(toSet);
  }

另外就是在用户点击签到前,唤起下订阅消息授权,接受提醒则每天可以定时提醒用户签到。

   /**
   * 签到
   */
  bindSignFn: function (e) {

    let that = this
    let tempalteId = 'J-MZ6Zrd08TobUgWPbjQcnJt9BHbc9M-nOOxirC8nWA'
    wx.requestSubscribeMessage({
      tmplIds: [tempalteId],
      success(res) {
        console.info(res)
        that.submitSign(res[tempalteId], tempalteId,that).then((res) => {
          console.info(res)
        })
      },
      fail(res) {
        console.info(res)
        wx.showToast({
          title: '程序有一点点小异常,操作失败啦',
          icon: 'none',
          duration: 1500
        })
      }
    })
  },

最后

签到功能已经发版上线拉,有兴趣的小伙伴可以体验下哦。

至于一些细节上交互和实现可以直接获取源码查看,有好的建议也欢迎留言。

下个迭代将完善积分模块,增加一些积分获取的渠道,同时想下有什么福利可以利用积分系统来分享给大家。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 生气——因为在乎 沉默——因为包容 啰嗦——因为希望你更好 发火——因为不想失去 如果不在乎 便会无动于衷 我并不...
    看见脚后跟阅读 234评论 0 0
  • 01 朋友在企业培训圈,无论是京东大学,腾讯大学,淘宝大学,都在不断提及“场景”。工作有“工作场景”,生活有“生活...
    好奇动物阅读 523评论 0 2
  • 我认为,芝麻信用这个功能出来已久,积累了大量的用户数据,已经在开始进行商业操作。与骑呗合作是一种再好不过的商业模式...
    冉阳1阅读 679评论 0 0
  • 晚上在一个小店里吃着汤粉,面相还可以,生菜却好像没有洗干净。 突然想起周星驰的一部电影,食神里吃面的那个画面。 在...
    夜雨下影漂泊阅读 142评论 1 1