微信小程序Demo 优惠券展示 / 领取 / 赠送 / 口令优惠券

2023-10-26

前言

本教程是基于 “apifm-wxapi” 模块,教你快速实现小程序开发,所以你可能需要先了解以下知识点:

《创建 HelloWorld 项目》
《使用 “apifm-wxapi” 快速开发小程序》
《免费注册开通后台,获得专属域名》

功能说明

后台发布优惠券信息,可设置固定金额、金额范围(随机金额)、领取口令;
小程序展示所有可领取的优惠券信息;
用户登录后可领取优惠券,领取后在后续的订单模块中下单时候使用;
需要可以管理我的优惠券(可将自己的优惠券赠送给别人);

启用 “优惠券” 模块

登录 “第一步” 注册的后台,左侧菜单 --> 工厂设置 --> 模块管理

找到 “优惠券” 模块,点击 “启用模块” ,然后 F5 刷新一下后台界面,你将可以看到新的菜单:
“财务管理” --> “优惠券规则” + “优惠券管理” 2 个菜单 ;

优惠券管理

后台管理

添加优惠券规则

添加优惠券规则,根据你自己的实际情况创建优惠券的规则,用户领取后,将按照设定的规则给用户发放优惠券;

优惠券管理

用户领取优惠券后,将在这个菜单进行管理,管理员可以手动作废用户的优惠券;

小程序实现

效果演示

优惠券管理

wxml代码

<view class="page">
  <view class="page__bd">
    <view class="weui-tab">
      <view class="weui-navbar">
        <block wx:for="{{tabs}}" wx:key="*this">
          <view id="{{index}}" class="weui-navbar__item {{activeIndex == index ? 'weui-bar__item_on' : ''}}" bindtap="tabClick">
            <view class="weui-navbar__title">{{item}}</view>
          </view>
        </block>
      </view>
      <view class="weui-tab__panel">
        <view wx:if="{{ activeIndex == 0 }}" wx:for="{{ couponList }}" wx:key="*this" class="weui-panel">
          <view class="weui-panel__hd"> {{ item.name }} </view>
          <view class="weui-panel__bd">
            <view class="weui-media-box weui-media-box_text">
              <view class="weui-media-box__title weui-media-box__title_in-text couponAmount">
                <text wx:if="{{ item.moneyMin == item.moneyMax }}">¥ {{ item.moneyMin }}</text>
                <text wx:else>¥ {{ item.moneyMin }} - {{ item.moneyMax }}</text>
              </view>
              <view class="weui-media-box__desc">
                <text wx:if="{{ item.moneyHreshold > 0 }}"> 消费满 {{ item.moneyHreshold }} 可用 </text>
                <text wx:if="{{ item.numberPersonMax > 0 }}"> 每人限领 {{ item.numberPersonMax }} 张 </text>
              </view>
              <view class="weui-media-box__info">
                <view wx:if="{{ item.pwd }}" class="weui-media-box__info__meta">需要口令</view>
                <view wx:if="{{ item.needScore > 0 }}" class="weui-media-box__info__meta">需要{{ item.needScore }}积分</view>
                <view wx:if="{{ item.needSignedContinuous > 0 }}" class="weui-media-box__info__meta">连续签到{{ item.needSignedContinuous }}天</view>
                <view class="weui-media-box__info__meta">剩余 {{ item.numberLeft }}</view>
              </view>
              <view class="weui-media-box__info" style="margin-top: 0px;">
                <view class="button-sp-area">
                  <button class="weui-btn mini-btn" type="default" size="mini" bindtap="couponDetail" data-id="{{ item.id }}">详情</button>
                  <button class="weui-btn mini-btn marginL" type="primary" size="mini" bindtap="fetchCoupons" data-id="{{ item.id }}">领取</button>
                  
                  <button class="weui-btn mini-btn marginL" type="warn" size="mini" bindtap="sendCoupons" data-id="{{ item.id }}">赠送给TA</button>
                </view>
              </view>
            </view>
          </view>
        </view>
        <view class="weui-tab__content" wx:if="{{activeIndex == 1}}">读取数据请查看控制台,页面渲染可以自己动手,参考 TAB1</view>
      </view>
    </view>
  </view>
</view>

js代码

const WXAPI = require('apifm-wxapi')

const sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置

Page({

  /**
   * 页面的初始数据
   */
  data: {
    tabs: ["所有优惠券", "我的优惠券"],
    activeIndex: 0,
    sliderOffset: 0,
    sliderLeft: 0,
    couponList: undefined
  },
  onLoad: function (options) {
    const _this = this;
    wx.getSystemInfo({
      success: function (res) {
        _this.setData({
          sliderLeft: (res.windowWidth / _this.data.tabs.length - sliderWidth) / 2,
          sliderOffset: res.windowWidth / _this.data.tabs.length * _this.data.activeIndex
        });
      }
    });
    this.coupons()
  },
  onShow: function () {

  },
  goRegist() {
    wx.navigateTo({
      url: '/pages/auth/index'
    })
  },
  tabClick: function (e) {
    this.setData({
      sliderOffset: e.currentTarget.offsetLeft,
      activeIndex: e.currentTarget.id
    });
    if (e.currentTarget.id == 0) {
      this.coupons()
    } else {
      this.myCoupons()
    }
  },
  coupons(){
    WXAPI.coupons().then(res => {
      console.log(res)
      if (res.code == 0) {
        this.setData({
          couponList: res.data
        })
      } else {
        wx.showToast({
          title: res.msg,
          icon: 'none'
        })
        this.setData({
          couponList: null
        })
      }
    })
  },
  myCoupons(){
    const loginToken = wx.getStorageSync('loginToken')
    if (!loginToken) {
      wx.showToast({
        title: '请先登录',
        icon: 'none'
      })
      this.goRegist()
      return
    }
    WXAPI.myCoupons({
      token: loginToken.token
    }).then(res => {
      console.log(res)
      if (res.code == 0) {
        this.setData({
          couponList: res.data
        })
      } else {
        wx.showToast({
          title: res.msg,
          icon: 'none'
        })
        this.setData({
          couponList: null
        })
      }
    })
  },
  couponDetail(e){
    const id = e.currentTarget.dataset.id
    WXAPI.couponDetail(id).then(res => {
      console.log('优惠券详情数据:', res)
      wx.showModal({
        title: '提示',
        content: '读取成功,查看控制台',
        showCancel: false
      })
    })
  },
  fetchCoupons(e){
    const loginToken = wx.getStorageSync('loginToken')
    if (!loginToken) {
      wx.showToast({
        title: '请先登录',
        icon: 'none'
      })
      this.goRegist()
      return
    }
    const id = e.currentTarget.dataset.id
    WXAPI.fetchCoupons({
      id: id,
      token: loginToken.token
    }).then(res => {
      console.log(res)
      if (res.code == 0) {
        wx.showToast({
          title: '领取成功',
          icon: 'success'
        })
      } else {
        wx.showToast({
          title: res.msg,
          icon: 'none'
        })
      }
    })
  },
  sendCoupons(e){
    console.log('该方法作为作业留给你来实现')
    // WXAPI.sendCoupons({  })
  }
})

WXAPI.init('gooking') 这句代码是将你的小程序链接到你的后台,其中 gooking 这个是你的专属域名(请查看前言中关于专属域名的章节说明);

总结

本案例主要使用了 apifm-wxapi 的以下3个方法:

WXAPI.coupons(Object object)
WXAPI.couponDetail(id)
WXAPI.fetchCoupons(Object object)
WXAPI.myCoupons(Object object)
WXAPI.sendCoupons(Object object)

关于更加详细的参数使用,以及更加高级的进阶使用方法,可以参考api接口文档说明:

《api接口文档》

关于 apifm-wxapi 更多的使用方法:

《apifm-wxapi使用说明》

本案例Demo代码下载:

《apifm-wxapi使用Demo程序》

期待你的进步!
感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序Demo 优惠券展示 / 领取 / 赠送 / 口令优惠券 的相关文章

  • 使用RedisTemplate访问Redis数据结构

    Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射 这5种数据结构类型分别为String 字符串 List 列表 Set 集合 Hash 散列 和 Zset 有序集合 下面来对这5种数据结构类型作简单的介绍 结
  • vs下载安装太慢的问题解决

    悔恨把当初 下载的vs给卸载了 如今下载80kb s折磨人 今天花了十来分钟终于知道怎么加快速度了 网上看了很多资料 最后整合如下 1 站长工具用这个网站查询所在的域名 download visualstudio microsoft com
  • Android13源码下载及全编译流程

    目录 一 源码下载 1 1 配置要求 1 1 1 硬件配置要求 1 1 2 软件要求 1 2 下载环境搭建 1 2 1 依赖安装 1 2 2 工具安装 1 2 3 git配置 1 2 4 repo配置 1 3 源码下载 1 3 1 明确下载
  • 光学成像原理之景深(Depth of Field)

    1 概述 先看两个例子 拍摄花 昆虫等照片时 背景拍的比较模糊 突出被拍物 但当拍摄纪念照 风景等照片时 却会把背景拍摄得和被拍对象一样清晰 这两者就是不同景深 前者为浅景深 拍摄聚焦到被拍物上 只能拍清一小段距离 被拍物前后的景色都被虚化
  • SpringCloud-Zuul服务网关与Ribbon负载均衡

    今天继续学习SpringCloud 上篇我们讲了 Eureka和服务提供者 消费者 这一篇针对服务网关和负载均衡详细说说 以下代码皆用最简单的代码示例 并非真正的业务代码 学习中用到的学习资料如下 文章 SpringCloud极简入门 视频
  • 我要进大厂第三讲:跳槽,如何选择一家公司

    我要进大厂第三讲 跳槽 如何选择一家公司 本文是我要进大厂第三讲 跳槽 如何选择一家公司 跳槽是每个程序员都会经历的 作为一个跳槽过好几次的人 对于跳槽这件事我还是有一定的发言权的 总结就一个字 真鸡儿累 如果新的岗位发展前景不错 也比较适
  • 效率优化之多轨数据传输

    项目效率优化是开发者避免不了的问题 最常见的方案是服务器升级性能优化 算法策略的优化 比如动态规划等 此次 笔者分享一种效率优化的方案 多轨道数据传输 拿insert2000条数据举例 2000tiao数据一条一条插入 我的电脑耗时大约16
  • Python 数据结构与算法,中文版请下载!

    数据结构作为计算机从业人员的必备基础 Java c 之类的语言有很多这方面的书籍 Python 相对较少 其中比较著名的一本 Python 数据结构与算法 所以我在学习的过程中将其翻译了中文版 希望对大家有点帮助 地址 github 地址
  • 2021美赛D题思路解析

    2021美赛D题思路解析 打完更 正在路上
  • hibernate.cfg.xml配置文件

  • UnityShader从入门到放弃(二)表面着色器和顶点、片元着色器

    1 表面着色器 表面着色器是Unity特有的一种着色器代码类型 表面着色器定义在SubShader中 表面着色器需要编写的代码量很少 Unity会自动处理一些细节 但是表面着色器的本质和顶点 片元着色器是一样的 当我们定义一个表面着色器的时
  • mysql对搜索结果多条记录的处理

    用游标 和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE A1 VARCHAR 10 A2 VARCHAR 10 A3 INT DECLARE CURSOR YOUCURNAME FOR SEL
  • QT富文本简单使用

    QT富文本简单使用 介绍 插入 遍历指定框架 遍历指定框架中所有文本块 包括子框架 介绍 富文本其实就是在一个编辑框内又输入文字又输入图片等各种东西 不仅仅是文字 qt自带的有QTextEdit 该类中有一个QTextDocument 一切
  • 实验10——摄像头实验

    实验十 摄像头实验 一 实验目的 利用ESP32 CAM开启摄像头 在网站上显示实时图像 二 实验内容 1 配置基本的开发环境 2 烧录代码 3 在网页上显示实时摄像 三 实验设备 1 ESP32 CAM发板 2 杜邦线 四 实验步骤 1
  • C++中实参形参传递、返回值产生的临时变量

    C 中实参形参传递 返回值产生的临时变量 C和C 中的副本机制 1 函数返回值产生的临时变量 2 实参形参传递过程中产生的临时变量 C和C 中的副本机制 函数的形参 return 都有副本机制 数组没有副本机制 为了节约内存 副本机制就会产
  • Java - XPath解析爬取内容

    maven依赖
  • npm install报错的几种解决办法

    1 可能是缓存问题 vscode新导入项目 使用npm i 安装包时 经常出现npm ERR code EINTEGRITY的问题 应该是npm本地的缓存造成的 1 删除package lock json文件 如果不想更改此文件 装完之后还
  • git问题error: remote origin already exists.

    1 先删除远程 Git 仓库 git remote rm origin 2 再添加远程 Git 仓库 git remote add origin https gitee com xx xxxx git 3 最后git push origin
  • Linux终端Tab提示忽略大小写

    1 在用户家目录下创建 inputrc 文件 touch inputrc 2 在该文件中输入以下内容 set completion ignore case on vi inputrc 输入set completion ignore case
  • 各种杂志投稿方式与评价

    导读 一 目录 1计算机应用研究 2 现代通信 3 火力与指挥控制 4系统仿真学报 5 宇航学报 6导弹与航天运载技术 7小型微型计算机系统 8计算机仿真 9自动化学报 10微计算机信息 11继电器 12电网技术 13传感器技术 14西北农

随机推荐

  • mybatis在insert时,实体类字段为null时,报错问题

    mybatis在insert时 实体类字段为null时 报错问题 在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值 它会自动将Java类型转换成数据库的类型 而一旦传入的是null它就无法准确判断这个类型应该是什么 就有
  • python基础5——正则、数据库操作

    文章目录 一 数据库编程 1 1 connect 函数 1 2 命令参数 1 3 常用语句 二 正则表达式 2 1 匹配方式 2 2 字符匹配 2 3 数量匹配 2 4 边界匹配 2 5 分组匹配 2 6 贪婪模式 非贪婪模式 2 7 标志
  • 【狂神】MySQl - 修改和删除数据库表字段

    1 修改和删除数据库表字段 测试表 CREATE TABLE teacher id INT 11 NOT NULL COMMENT 教师编号 name VARCHAR 100 NOT NULL COMMENT 教师名称 PRIMARY KE
  • DNA repair 【HDU - 2457】【AC自动机+DP思路】

    题目链接 开始肝这道题的时候也是冒了十足的勇气 呜呜呜 当时一直没发现 我有个地方写成了 s i A 怎么能这样用啊 毕竟只有A C G T的说 呜呜呜 QAQ 然后讲一下 这道题的AC自动机的想法 还有DP的思路 我DP超菜 能过也是超神
  • Filezila的下载、安装与使用

    目录 一 Filezila的作用 二 Filezila的下载与安装 三 Filezila的使用 一 Filezila的作用 实现两个不同的主机之间的文件传输 二 Filezila的下载与安装 官网 下载 FileZilla中文网 选择下载客
  • 《为何爱会伤人》-读书笔记

    童年的重复 恋爱是童年关系的一次轮回 轮回的含义有两层 1 重温童年的美好 2 修正童年的错误 修正童年的错误 会让我们有改造的梦想 即想要在恋爱关系中去改造一个人 但是没有人愿意被改造 我们总是忍不住重复童年 哪怕它伤痕累累 一见钟情是我
  • KVM切换器和VGA切换器的区别

    CYK旗舰店接到过很多顾客的咨询 就是关于一个显示器接多个主机 一个主机接多个显示器需要如何连接的 市面上有KVM切换器和VGA切换器 可以解决以上两种问题 但是价格都高于于CYK生产的VGA一分二分屏线 CYK一分二分屏线价格不高 可以满
  • OpenCV教程——图像模糊。均值模糊,高斯模糊,中值模糊,双边模糊,高斯分布

    1 图像模糊 图像模糊是图像处理中最简单和常用的操作之一 使用该操作的原因之一是为了给图像预处理时降低噪声 图像模糊操作背后是数学的卷积计算 卷积操作的原理 常用的图像模糊的方法 均值模糊 高斯模糊 中值模糊 双边模糊 这四种模糊方式有时也
  • latex放一张大图在作者和正文之间

    ACM提供的latex的模板 begin teaserfigure includegraphics width textwidth sampleteaser caption Seattle Mariners at Spring Traini
  • 三.树莓派4B-无线登录

    无线登录 无线登录是指通过树莓派的SSH服务连接树莓派 这种方式最常用 SSH服务开启后 就相当于串口登录时配置config txt和cmdline txt文件一样 使得系统数据往wifi模块进行发送 再由软件接收 呈现系统终端界面 SSH
  • 如何使用Anaconda创建python3.9环境

    如何使用Anaconda创建python3 9环境 首先查看python版本 然后退出 你可以输入conda h查看基本的语法 下面进行创建仓库 即输入conda create 创建一个新的环境要给它一个名字 你可以用 n 表示你后面要起的
  • 微信小程序发布上线全流程(注册/开发/上传审核)

    以下是微信小程序发布上线的详细流程 确认小程序信息 在微信公众平台注册并登录后 进入小程序管理后台 在 开发 gt 开发设置 中填写小程序基本信息和配置 包括小程序名称 图标设计 类目选择等 此外 需要在小程序管理后台中配置小程序服务类目和
  • c++如何求任意多边形的面积

    由于项目需要 求解任意不规则多边形的面积 想了很久 也不知道怎么叙述 直接代码展示吧 include
  • vue中使用canvas添加各类水印

    vue使用canvas绘制文字水印背景 1 写watermarker js文件 水印添加方法 const setWatermark str1 str2 gt const id 1 23452384164 123412415 if docum
  • 老毛桃电脑重装linux系统,如何简单快速用U盘装Win10系统,小白也能变装系统达人...

    原标题 如何简单快速用U盘装Win10系统 小白也能变装系统达人 飚王出品 必属精品 电脑作为家庭必备 虽然大部分时候都不需要我们自己装系统 但万一遇到电脑中毒系统崩溃或者买回一台笔记本预装linux系统但想换Win10 除了花钱找人装外
  • 数据挖掘技术的来源、历史、研究内容及常用技术

    数据挖掘技术的来源 历史 研究内容及常用技术 1 数据挖掘技术的由来 1 1网络之后的下一个技术热点 我们现在已经生活在一个网络化的时代 通信 计算机和网络技术正改变着整个人类和社会 如果用芯片集成度来衡量微电子技术 用CPU处理速度来衡量
  • 第18章_JDK8-17新特性(上)

    文章目录 第18章 JDK8 17新特性 上 本章专题与脉络 1 Java版本迭代概述 1 1 发布特点 小步快跑 快速迭代 1 2 名词解释 名词解释 Oracle JDK和Open JDK 名词解释 JEP 名词解释 LTS 1 3 各
  • 数字孪生-第二章、数字孪生技术

    第二章 数字孪生技术 2 1 数字孪生的相关领域 想要厘清数字孪生技术的内涵和体系架构 就需要数字如下10个部分的数字孪生的相关领域 2 1 1 数字孪生与计算机辅助设计 计算机辅助设计 Computer Aided Design CAD
  • 万元礼品奖池 玩转「Lighthouse」有奖征文来袭

    疫情之下 居家办公的你被远程会议邀请吵醒 孩子正在网课课堂中跟老师斗智斗勇 家人们在直播间里频频下单 这一切都在说明 我们已经进入了一个 万物皆可在云上 的时代 轻量应用服务器Lighthouse作为新一代开箱即用 面向轻量应用场景的云服务
  • 微信小程序Demo 优惠券展示 / 领取 / 赠送 / 口令优惠券

    前言 本教程是基于 apifm wxapi 模块 教你快速实现小程序开发 所以你可能需要先了解以下知识点 创建 HelloWorld 项目 使用 apifm wxapi 快速开发小程序 免费注册开通后台 获得专属域名 功能说明 后台发布优惠