小程序无限制保存formid到后台

本文介绍了如何在小程序中无限制地保存formId到后台。formId用于发送临时消息通知,会过期且只能使用一次。实现策略包括封装透明组件来记录formId,设置每日采集上限,以及在达到特定数量时上传到服务器。代码示例基于类Vue框架,确保不影响前端布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小程序formId

小程序的formId是为发送消息模板做准备的,只能在小程序使用时获取,后台是无法获取的。所以是用来发送一切临时的通知消息,并且formId是会过期的,且只能使用一次。期限好想是一周。但是我们为了给用户发送通知方便直接在用户使用小程序的时候收集formId并且在有效期内使用就能实现发送通知的功能。

实现策略

因为小程序限制,只能如下的方式获取formId,支付也会有formId我们这里不讨论,但是button一般太丑了。

 <form report-submit="true" @submit="formSubmit">
   <button form-type="submit" class="form-btn">
   </button>
</form>

为了button不影响我们界面的美观,并且能够以能够对开发者不透明的使用就更好了。我们现在封装一个组件,满足一以下功能:

  • 不影响前端点击事件布局。即组件透明,并且有点击区域触发submit事件
  • 每次点击记录formId
  • 设定每天formId的采集上限
  • 当formId达到上限,不渲染form,防止频繁获取formId造成的影响
  • 设定formId达到多少值上传到服务器。

下面是代码实现

框架是类vue,如果不兼容自己需要改造下

<template>
    <div>
        <form v-if="isGetFormId" report-submit="true" @submit="formSubmit">
            <button form-type="submit" class="form-btn">

            </button>
        </form>
    </div>
</template>

<script>
    let ms = wx //兼容微信接口,如果不是使用微信,可以修改这个,并确认接口规范
    export default {
        data() {

            return {
                //每天获取formId的上限
                dayGetFormIdLimit:10,
                //上传到服务器的formId池大小,即formId采集到这么多个后就会上传到服务器\
                isGetFormId:true,
                //formId的过期毫秒数,为了保险,设定为5天,
                formIdExpire:5*24*60*60*1000,
                //模拟器中是否开启测试
                isMockTest:false,
                //存储key,每天formIds的采集数
                STORAGE_KEY:'formIdsCount'
            };
        },
        mounted() {
            this.isGetFormId = this.isFormShow()
        },

        methods: {
            //获取当天年月日
            getDay(){
                let date = new Date()
                let day = date.getFullYear()+"-" + (date.getMonth()+1)+"-"+date.getDate()
                return day
            },
            //处理提交记录
            isFormShow(){
                let isShow = true
                let day = this.getDay()
                //判断isGetFormId
                let formIds = ms.getStorageSync(this.STORAGE_KEY)
                if(typeof formIds === "object" ){
                    let dayFormIdCount = formIds[day]
                    if("number" === typeof dayFormIdCount){
                        if(dayFormIdCount >= this.dayGetFormIdLimit){
                            isShow = false
                            console.log('collect formIds is max:',this.dayGetFormIdLimit)
                        }
                    }
                }
                return isShow
            },
            //记录formId提交
            submitRecord(){
                if(!this.isFormShow()){
                    return
                }
                let day = this.getDay()
                let formIds = ms.getStorageSync(this.STORAGE_KEY)
                let cFormIds = {}
                if(typeof formIds === "object" ){
                    let dayFormIdCount = formIds[day]
                    if("number" === typeof dayFormIdCount){
                        cFormIds[day] = dayFormIdCount + 1
                    }else{
                        cFormIds[day] = 1
                    }
                }else{
                    cFormIds[day] = 1
                }
                ms.setStorageSync(this.STORAGE_KEY,cFormIds)
                this.isGetFormId =  this.isFormShow()
            },
            //触发表单事件
            formSubmit(e){
                if(e && e.detail && e.detail.formId){
                    if(!this.isMockTest){
                        //模拟器不采集
                        if(e.detail.formId.indexOf('formId')>0){
                            console.log('formId not collect for mock')
                            return
                        }
                    }

                    //提交formId数据
                    //这里要传formId和过期的绝对时间,防止formId在使用时过期
                    let params = {
                        formId:e.detail.formId,
                        expire:new Date().getTime()+this.formIdExpire
                    }
                    //提交到后端
                    postRow('/api/wxFormId/',params)
                    //采集记录
                    this.submitRecord()
                }else{
                    console.log('save form id exception.not event params')
                }
            }
        },

        watch: {},
        computed: {},
        filters: {},
        components: {},
        name: "wx-form-id"
    }
</script>

<style lang="scss">
    .form-btn{
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        opacity:0;
    }
</style>

隐藏时使用css的方式。

使用

在有点击时间的节点下,加入此组件

<view @click="clickReview"  class="content">
  <wx-form-id></wx-form-id>
  <text class="text-gray text-sm">hello</text>
</view>

版权所有


作者:简书@mt23,CSDN@mt23

出处:

https://www.jianshu.com/u/71f8075c4151

https://blog.csdn.net/mathcoder23

发布时间:2019-09-12

版权所有,欢迎保留原文链接进行转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值