前言

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

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

功能说明

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

启用 “优惠券” 模块

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

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

优惠券例子 - 图1

后台管理

添加优惠券规则

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

优惠券管理

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

小程序实现

效果演示

优惠券例子 - 图2

wxml代码

  1. <view class="page">
  2. <view class="page__bd">
  3. <view class="weui-tab">
  4. <view class="weui-navbar">
  5. <block wx:for="{{tabs}}" wx:key="*this">
  6. <view id="{{index}}" class="weui-navbar__item {{activeIndex == index ? 'weui-bar__item_on' : ''}}" bindtap="tabClick">
  7. <view class="weui-navbar__title">{{item}}</view>
  8. </view>
  9. </block>
  10. </view>
  11. <view class="weui-tab__panel">
  12. <view wx:if="{{ activeIndex == 0 }}" wx:for="{{ couponList }}" wx:key="*this" class="weui-panel">
  13. <view class="weui-panel__hd"> {{ item.name }} </view>
  14. <view class="weui-panel__bd">
  15. <view class="weui-media-box weui-media-box_text">
  16. <view class="weui-media-box__title weui-media-box__title_in-text couponAmount">
  17. <text wx:if="{{ item.moneyMin == item.moneyMax }}">¥ {{ item.moneyMin }}</text>
  18. <text wx:else>¥ {{ item.moneyMin }} - {{ item.moneyMax }}</text>
  19. </view>
  20. <view class="weui-media-box__desc">
  21. <text wx:if="{{ item.moneyHreshold > 0 }}"> 消费满 {{ item.moneyHreshold }} 可用 </text>
  22. <text wx:if="{{ item.numberPersonMax > 0 }}"> 每人限领 {{ item.numberPersonMax }} 张 </text>
  23. </view>
  24. <view class="weui-media-box__info">
  25. <view wx:if="{{ item.pwd }}" class="weui-media-box__info__meta">需要口令</view>
  26. <view wx:if="{{ item.needScore > 0 }}" class="weui-media-box__info__meta">需要{{ item.needScore }}积分</view>
  27. <view wx:if="{{ item.needSignedContinuous > 0 }}" class="weui-media-box__info__meta">连续签到{{ item.needSignedContinuous }}天</view>
  28. <view class="weui-media-box__info__meta">剩余 {{ item.numberLeft }}</view>
  29. </view>
  30. <view class="weui-media-box__info" style="margin-top: 0px;">
  31. <view class="button-sp-area">
  32. <button class="weui-btn mini-btn" type="default" size="mini" bindtap="couponDetail" data-id="{{ item.id }}">详情</button>
  33. <button class="weui-btn mini-btn marginL" type="primary" size="mini" bindtap="fetchCoupons" data-id="{{ item.id }}">领取</button>
  34. <button class="weui-btn mini-btn marginL" type="warn" size="mini" bindtap="sendCoupons" data-id="{{ item.id }}">赠送给TA</button>
  35. </view>
  36. </view>
  37. </view>
  38. </view>
  39. </view>
  40. <view class="weui-tab__content" wx:if="{{activeIndex == 1}}">读取数据请查看控制台,页面渲染可以自己动手,参考 TAB1</view>
  41. </view>
  42. </view>
  43. </view>
  44. </view>

js代码

  1. const WXAPI = require('apifm-wxapi')
  2. const sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. tabs: ["所有优惠券", "我的优惠券"],
  9. activeIndex: 0,
  10. sliderOffset: 0,
  11. sliderLeft: 0,
  12. couponList: undefined
  13. },
  14. onLoad: function (options) {
  15. const _this = this;
  16. wx.getSystemInfo({
  17. success: function (res) {
  18. _this.setData({
  19. sliderLeft: (res.windowWidth / _this.data.tabs.length - sliderWidth) / 2,
  20. sliderOffset: res.windowWidth / _this.data.tabs.length * _this.data.activeIndex
  21. });
  22. }
  23. });
  24. this.coupons()
  25. },
  26. onShow: function () {
  27. },
  28. goRegist() {
  29. wx.navigateTo({
  30. url: '/pages/auth/index'
  31. })
  32. },
  33. tabClick: function (e) {
  34. this.setData({
  35. sliderOffset: e.currentTarget.offsetLeft,
  36. activeIndex: e.currentTarget.id
  37. });
  38. if (e.currentTarget.id == 0) {
  39. this.coupons()
  40. } else {
  41. this.myCoupons()
  42. }
  43. },
  44. coupons(){
  45. WXAPI.coupons().then(res => {
  46. console.log(res)
  47. if (res.code == 0) {
  48. this.setData({
  49. couponList: res.data
  50. })
  51. } else {
  52. wx.showToast({
  53. title: res.msg,
  54. icon: 'none'
  55. })
  56. this.setData({
  57. couponList: null
  58. })
  59. }
  60. })
  61. },
  62. myCoupons(){
  63. const loginToken = wx.getStorageSync('loginToken')
  64. if (!loginToken) {
  65. wx.showToast({
  66. title: '请先登录',
  67. icon: 'none'
  68. })
  69. this.goRegist()
  70. return
  71. }
  72. WXAPI.myCoupons({
  73. token: loginToken.token
  74. }).then(res => {
  75. console.log(res)
  76. if (res.code == 0) {
  77. this.setData({
  78. couponList: res.data
  79. })
  80. } else {
  81. wx.showToast({
  82. title: res.msg,
  83. icon: 'none'
  84. })
  85. this.setData({
  86. couponList: null
  87. })
  88. }
  89. })
  90. },
  91. couponDetail(e){
  92. const id = e.currentTarget.dataset.id
  93. WXAPI.couponDetail(id).then(res => {
  94. console.log('优惠券详情数据:', res)
  95. wx.showModal({
  96. title: '提示',
  97. content: '读取成功,查看控制台',
  98. showCancel: false
  99. })
  100. })
  101. },
  102. fetchCoupons(e){
  103. const loginToken = wx.getStorageSync('loginToken')
  104. if (!loginToken) {
  105. wx.showToast({
  106. title: '请先登录',
  107. icon: 'none'
  108. })
  109. this.goRegist()
  110. return
  111. }
  112. const id = e.currentTarget.dataset.id
  113. WXAPI.fetchCoupons({
  114. id: id,
  115. token: loginToken.token
  116. }).then(res => {
  117. console.log(res)
  118. if (res.code == 0) {
  119. wx.showToast({
  120. title: '领取成功',
  121. icon: 'success'
  122. })
  123. } else {
  124. wx.showToast({
  125. title: res.msg,
  126. icon: 'none'
  127. })
  128. }
  129. })
  130. },
  131. sendCoupons(e){
  132. console.log('该方法作为作业留给你来实现')
  133. // WXAPI.sendCoupons({ })
  134. }
  135. })

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

总结

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

  1. WXAPI.coupons(Object object)
  2. WXAPI.couponDetail(id)
  3. WXAPI.fetchCoupons(Object object)
  4. WXAPI.myCoupons(Object object)
  5. WXAPI.sendCoupons(Object object)

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

《api接口文档》

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

《apifm-wxapi使用说明》

本案例Demo代码下载:

《apifm-wxapi使用Demo程序》

期待你的进步!
感谢!