微信小程序前后端交互与WXS的应用

简介: 微信小程序前后端交互与WXS的应用

前言

当今社交媒体的普及使得微信小程序成为了一种流行的应用开发形式。微信小程序不仅可以提供丰富的用户体验,还能与后台进行交互,实现更多的功能和数据处理。本篇博客将介绍微信小程序如何与后台进行交互,并展示WXS在实际开发中的应用。

一、后台数据交互

1.数据表

2.后端代码的实现

代码实现也比较简单,这里博主就不过多讲解了 !

package com.ctb.minoa.wxcontroller;
import com.ctb.minoa.mapper.InfoMapper;
import com.ctb.minoa.model.Info;
import com.ctb.minoa.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Autho biao
 * 
 */
@RestController
@RequestMapping("/wx/home")
public class WxHomeController {
    @Autowired
    private InfoMapper infoMapper;
    @RequestMapping("/index")
    public Object index(Info info) {
        List<Info> infoList = infoMapper.list(info);
        Map<Object, Object> data = new HashMap<Object, Object>();
        data.put("infoList",infoList);
        return ResponseUtil.ok(data);
    }
}

3.前后端交互

3.1.后端接口URL管理

为了方便代码的可维护性,我们将所有接口通过一个文件去保存,我们可以新建一个文件夹config,在文件夹下新建一个api.js的文件

api.js

// 以下是业务服务器API地址
 // 本机开发API地址
 var WxApiRoot = 'http://localhost:8080/wx/';
 // 测试环境部署api地址
 // var WxApiRoot = 'http://192.168.0.101:8070/wx/';
 // 线上平台api地址
 //var WxApiRoot = 'https://www.oa-mini.com/wx/';
 module.exports = {
   IndexUrl: WxApiRoot + 'home/index', //首页数据接口
   SwiperImgs: WxApiRoot+'swiperImgs', //轮播图
   MettingInfos: WxApiRoot+'meeting/list', //会议信息
 };

3.2.发送后端请求

在所需发送请求的js页面中需引用我们的接口管理api.js

const api = require("../../config/api")

发送请求

loadMeetingInfos(){
      let that=this;
        wx.request({
            url: api.IndexUrl,
            dataType: 'json',
            success(res) {
              console.log(res)
              that.setData({
                  lists:res.data.data.infoList
              })
            }
          })
},

这里我们会有个问题,上述发送后端请求的代码在我们每次发送时都需编写这一长串的代码,会显得代码非常冗余,接下来我们将可以对其进行一个封装,提高代码的复用性

3.3.请求方式的封装

我们可以将我们封装的代码写入到我们的utils/util.js文件夹中

编写请求方式封装方法并将其导出

/**
 * 封装微信的request请求
 */
function request(url, data = {}, method = "GET") {
    return new Promise(function (resolve, reject) {
      wx.request({
        url: url,
        data: data,
        method: method,
        header: {
          'Content-Type': 'application/json',
        },
        success: function (res) {
          if (res.statusCode == 200) {
              resolve(res.data);//会把进行中改变成已成功
          } else {
            reject(res.errMsg);//会把进行中改变成已失败
          }
        },
        fail: function (err) {
          reject(err)
        }
      })
    });
  }
module.exports = {
  request
}

注意:在我们所需要使用的js页面中也需进行引入

const utils = require("../../utils/util.js")

加下来我们将通过我们的封装类重新编写发送请求方式的方法

loadMeetingInfos(){
    utils.request(api.IndexUrl).then(res=>{
        this.setData({
          lists:res.data.infoList
        })
      }).catch(res=>{
          console.log('服器没有开启!')
      })
},

这样代码不仅更简洁明了,还提高了代码的复用性,可为后期实现其它与后台数据交互的效率

4.前端代码的编写

wxml

<!--pages/index/index.wxml-->
<!-- <text>pages/index/index.wxml</text> -->
<!-- 轮播图 -->
<view>
    <swiper autoplay="true" indicator-dots="true" indicator-color="#fff" indicator-active-color="#00f">
        <block wx:for="{{imgSrcs}}" wx:key="text">
            <swiper-item>
                <view>
                    <image src="{{item.img}}" class="swiper-item" />
                </view>
            </swiper-item>
        </block>
    </swiper>
</view>
<!-- 首页会议信息 -->
<view class="mobi-title">
    <text class="mobi-icon"></text>
    <text>会议信息</text>
</view>
<block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    <view class="list" data-id="{{item.id}}">
        <view class="list-img">
            <image class="video-img" mode="scaleToFill" src="{{item.seatpic}}"></image>
        </view>
        <view class="list-detail">
            <view class="list-title"><text>{{item.title}}</text></view>
            <view class="list-tag">
                <view class="state">{{item.state}}</view>
                <view class="join"><text class="list-num">{{item.num}}</text>人报名</view>
            </view>
            <view class="list-info"><text>{{item.location}}</text>|<text>{{item.starttime}}</text></view>
        </view>
    </view>
</block>
<view class="section bottom-line">
    <text>到底啦</text>
</view>

wxss

/* pages/index/index.wxss */
page{
  height: 100%;
  background-color: #efeff4;
}
.swiper-item {
    height: 300rpx;
    width: 100%;
    border-radius: 10rpx;
}
.list{
    background-color: #fff;
    display: flex;
    margin: 10rpx;
    padding: 10rpx;
}
.list-img,.video-img{
    height: 150rpx;
    width: 150rpx;
}
.list-img{
    margin: 20rpx 0 0 0;
}
.list-detail{
    margin: 0 0 0 15rpx;
}
.list-title{
    font-weight: 700;
}
.list-tag{
    display: flex;
    margin: 10px 0;
}
.state{
    border: 2px solid lightskyblue;
    padding: 2px;
    color: lightskyblue;
}
.join{
    border: 2px solid #fff;
    padding: 2px;
    margin: 0 0 0 20rpx;
    color: gray;
}
.list-num{
    color: red;
}
.list-info{
    color: gray;
}
.bottom-line{
    text-align: center;
    margin-bottom: 10px;
}

js

// pages/index/index.js
const api = require("../../config/app")
const utils = require("../../utils/util.js")
Page({
    /**
     * 页面的初始数据
     */
    data: {
        imgSrcs:[ 
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png",
              "text": "1"
            },
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png",
              "text": "2"
            },
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png",
              "text": "3"
            },
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png",
              "text": "4"
            },
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png",
              "text": "5"
            },
            {
              "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner6.png",
              "text": "6"
            }]
        ,lists:[]
    },
    // loadSwiperImgs(){
    //     let that=this;
    //     // http://localhost:8080/demo/wx/swiperImgs
    //     wx.request({
    //         url: api.SwiperImgs,
    //         dataType: 'json',
    //         success(res) {
    //           console.log(res)
    //           that.setData({
    //               imgSrcs:res.data.images
    //           })
    //         }
    //       })
    //   },
loadMeetingInfos(){
    //   let that=this;
    //     wx.request({
    //         url: api.IndexUrl,
    //         dataType: 'json',
    //         success(res) {
    //           console.log(res)
    //           that.setData({
    //               lists:res.data.data.infoList
    //           })
    //         }
    //       })
    utils.request(api.IndexUrl).then(res=>{
        this.setData({
          lists:res.data.infoList
        })
      }).catch(res=>{
          console.log('服器没有开启!')
      })
},
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        // this.loadSwiperImgs();
        this.loadMeetingInfos();
    },
    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {
    },
    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
    },
    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {
    },
    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {
    },
    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {
    },
    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {
    },
    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {
    },
})

效果演示

通过数据表与效果演示,我们可以看出一些问题,比如状态值不应该显示数字,而是所对应的状态,报名人数的显示,时间的格则等接下来我们将通过WXS给大家解决一些诸如此类的问题

二、WXS的使用

WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。

WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致。

WXS模块

每一个 .wxs 文件和 <wxs> 标签都是一个单独的模块。

每个模块都有自己独立的作用域。即在一个模块里面定义的变量与函数,默认为私有的,对其他模块不可见。

一个模块要想对外暴露其内部的私有变量与函数,只能通过 module.exports 实现

1、.wxs 文件

微信开发者工具里面,右键可以直接创建 .wxs 文件,在其中直接编写 WXS 脚本。

示例代码:

// /pages/comm.wxs
var foo = "'hello world' from comm.wxs";
var bar = function(d) {
  return d;
}
module.exports = {
  foo: foo,
  bar: bar
};

上述例子在 /pages/comm.wxs 的文件里面编写了 WXS 代码。该 .wxs 文件可以被其他的 .wxs 文件 或 WXML 中的 <wxs> 标签引用。

module 对象

每个 wxs 模块均有一个内置的 module 对象。

属性

  • exports: 通过该属性,可以对外共享本模块的私有变量与函数。

示例代码:

// /pages/tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {
  return d;
}
module.exports = {
  FOO: foo,
  bar: bar,
};
module.exports.msg = "some msg";

在需要使用的wxml页面中引用

<!-- page/index/index.wxml -->
<wxs src="./../tools.wxs" module="tools" />
<view> {{tools.msg}} </view>
<view> {{tools.bar(tools.FOO)}} </view>

页面输出:

some msg
'hello world' from tools.wxs

2.综合运用

下面我们将对上面前后端数据交互后所遇到的一些问题进行解决

数字转换问题

//将状态值赋值为中文
function getState(state){
    // 状态:0取消会议1待审核2驳回3待开4进行中5开启投票6结束会议,默认值为1
    if(state == 0 ){
        return '取消会议';
    }else if(state == 1 ){
        return '待审核';
    }else if(state == 2 ){
        return '驳回';
    }else if(state == 3 ){
        return '待开';
    }else if(state == 4 ){
        return '进行中';
    }else if(state == 5 ){
        return '开启投票';
    }else if(state == 6 ){
        return '结束会议';
    } 
    return '其它';
} 

通过状态值去判断会议状态内容

人数计算问题

1. // 将参与者,列席者,主持人---参与会议的人数进行统计
2. function getNumber(canyuze, liexize, zhuchiren) {
3.     var person = canyuze + "," + liexize + "," + zhuchiren;
4.     var arr = person.split(",");
5. 
6. // 进行数组去重
7.     var res = [];
8. for (var i = 0; i < arr.length; i++) {
9. if (res.indexOf(arr[i]) === -1) {
10.         res.push(arr[i]);
11.       }
12.     }
13. return res.length;
14.   }

将所有参会人员统计并进行截取和去重

时间格式问题

1. //   将时间格式化---调成想要相对应的格式
2. function formatDate(ts, option) {
3.     var date = getDate(ts)
4.     var year = date.getFullYear()
5.     var month = date.getMonth() + 1
6.     var day = date.getDate()
7.     var week = date.getDay()
8.     var hour = date.getHours()
9.     var minute = date.getMinutes()
10.     var second = date.getSeconds()
11. 
12. //获取 年月日
13. if (option == 'YY-MM-DD') return [year, month, day].map(formatNumber).join('-')
14. 
15. //获取 年月
16. if (option == 'YY-MM') return [year, month].map(formatNumber).join('-')
17. 
18. //获取 年
19. if (option == 'YY') return [year].map(formatNumber).toString()
20. 
21. //获取 月
22. if (option == 'MM') return  [mont].map(formatNumber).toString()
23. 
24. //获取 日
25. if (option == 'DD') return [day].map(formatNumber).toString()
26. 
27. //获取 年月日 周一 至 周日
28. if (option == 'YY-MM-DD Week')  return [year, month, day].map(formatNumber).join('-') + ' ' + getWeek(week)
29. 
30. //获取 月日 周一 至 周日
31. if (option == 'MM-DD Week')  return [month, day].map(formatNumber).join('-') + ' ' + getWeek(week)
32. 
33. //获取 周一 至 周日
34. if (option == 'Week')  return getWeek(week)
35. 
36. //获取 时分秒
37. if (option == 'hh-mm-ss') return [hour, minute, second].map(formatNumber).join(':')
38. 
39. //获取 时分
40. if (option == 'hh-mm') return [hour, minute].map(formatNumber).join(':')
41. 
42. //获取 分秒
43. if (option == 'mm-dd') return [minute, second].map(formatNumber).join(':')
44. 
45. //获取 时
46. if (option == 'hh')  return [hour].map(formatNumber).toString()
47. 
48. //获取 分
49. if (option == 'mm')  return [minute].map(formatNumber).toString()
50. 
51. //获取 秒
52. if (option == 'ss') return [second].map(formatNumber).toString()
53. 
54. //默认 时分秒 年月日
55. return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
56.   }
57. function formatNumber(n) {
58.     n = n.toString()
59. return n[1] ? n : '0' + n
60.   }
61. 
62. function getWeek(n) {
63.     switch(n) {
64.         case 1:
65. return '星期一'
66.         case 2:
67. return '星期二'
68.         case 3:
69. return '星期三'
70.         case 4:
71. return '星期四'
72.         case 5:
73. return '星期五'
74.         case 6:
75. return '星期六'
76.         case 7:
77. return '星期日'
78.     }
79.   }

将日期格式进行转换

注:最后需要将所有方法进行导出

1. module.exports = {
2.         getState: getState,
3.         getNumber:getNumber,
4.         formatDate:formatDate
5.       };

在wxml中引用

1. <!--pages/index/index.wxml-->
2. <!-- <text>pages/index/index.wxml</text> -->
3. <!-- 轮播图 -->
4. <view>
5. <swiper autoplay="true" indicator-dots="true" indicator-color="#fff" indicator-active-color="#00f">
6. <block wx:for="{{imgSrcs}}" wx:key="text">
7. <swiper-item>
8. <view>
9. <image src="{{item.img}}" class="swiper-item" />
10. </view>
11. </swiper-item>
12. </block>
13. </swiper>
14. </view>
15. <!-- 首页会议信息 -->
16. <wxs src="/utils/comm.wxs" module="tools" />
17. <view class="mobi-title">
18. <text class="mobi-icon"></text>
19. <text>会议信息</text>
20. </view>
21. <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
22. <view class="list" data-id="{{item.id}}">
23. <view class="list-img">
24. <image class="video-img" mode="scaleToFill" src="{{item.seatpic}}"></image>
25. </view>
26. <view class="list-detail">
27. <view class="list-title"><text>{{item.title}}</text></view>
28. <view class="list-tag">
29. <view class="state">{{tools.getState(item.state)}}</view>
30. <view class="join"><text class="list-num">{{tools.getNumber(item.canyuze,item.liexize,item.zhuchiren)}}</text>人报名</view>
31. </view>
32. <view class="list-info"><text>{{item.location}}</text>|<text>{{tools.formatDate(item.starttime)}}</text></view>
33. </view>
34. </view>
35. </block>
36. <view class="section bottom-line">
37.     <text>到底啦</text>
38. </view>
39.

效果演示


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
2月前
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
104 2
|
3月前
|
人工智能
10 分钟构建 AI 客服并应用到网站、钉钉或微信中简说
10 分钟构建 AI 客服并应用到网站、钉钉或微信
|
25天前
|
存储 缓存 开发框架
提高微信小程序的应用速度
【10月更文挑战第21天】提高微信小程序的应用速度需要从多个方面入手,综合运用各种优化手段。通过不断地优化和改进,能够显著提升小程序的性能,为用户带来更流畅、更高效的使用体验。
46 3
|
2月前
|
人工智能 运维 负载均衡
10 分钟构建 AI 客服并应用到网站、钉钉或微信中
《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案通过详尽的文档和示例代码,使具有一定编程基础的用户能够快速上手,顺利完成AI客服集成。方案涵盖高可用性、负载均衡及定制化选项,满足生产环境需求。然而,若文档不清晰或存在信息缺失,则可能导致部署障碍。实际部署中可能遇到网络、权限等问题,需逐一排查。云产品的功能、性能及操作配置便捷性直接影响解决方案效果,详尽的产品手册有助于快速解决问题。总体而言,该方案在各方面表现出色,值得推荐。
|
1月前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
62 5
|
2月前
|
小程序
浅谈提高微信小程序的应用速度
浅谈提高微信小程序的应用速度
|
2月前
|
小程序 Android开发 iOS开发
ISO钉钉小程序小程序webview打开nextjs应用异常
ISO钉钉小程序小程序webview打开nextjs应用异常
52 3
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的代驾应用系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的代驾应用系统附带文章和源代码部署视频讲解等
204 21
|
5月前
|
PHP 移动开发 安全
PHP应用如何对接微信公众号JSAPI支付
本文介绍了微信支付的多种方式,包括JSAPI支付、APP支付、Native支付、付款码支付和H5支付。
76 8
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的服装品牌的推广及应用网站附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的服装品牌的推广及应用网站附带文章和源代码部署视频讲解等
51 4
下一篇
无影云桌面