• 无纸化办公小程序数据交互、wxs的使用


    前言

    很多同志们再写小程序的过程中,不知道该怎么发起HTTP请求到后端,在Web环境中发起HTTPS请求是很常见的,但是微信小程序是腾讯内部的产品,不能直接打开一个外部的链接。例如,在微信小程序中不能直接打开www.taobao.com网站,但是,在小程序开发的时候,如果需要请求一个网站的内容或者服务,如何实现?虽然微信小程序里面不能直接访问外部链接,但是腾讯为开发者封装好了一个wx.request(object)的API。
     

    一、搭建数据库连接

     为了后期方便维护,我们先将所有的后端接口通过一个文件来保存,在根目录下新建config文件夹随后建立api.js文件。

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

    先定义本机开发的API地址,具体的请求在下面定义方便管理。

    1.请求方式的封装

    我们需要多次发送请求的时候,可以将请求方法进行封装直接调用

    在/utils/util.js中添加下列代码

    1. /**
    2. * 封装微信的request请求
    3. */
    4. function request(url, data = {}, method = "GET") {
    5. return new Promise(function (resolve, reject) {
    6. wx.request({
    7. url: url,
    8. data: data,
    9. method: method,
    10. header: {
    11. 'Content-Type': 'application/json',
    12. },
    13. success: function (res) {
    14. if (res.statusCode == 200) {
    15. resolve(res.data);//会把进行中改变成已成功
    16. } else {
    17. reject(res.errMsg);//会把进行中改变成已失败
    18. }
    19. },
    20. fail: function (err) {
    21. reject(err)
    22. }
    23. })
    24. });
    25. }

    注意在module.exports中导出和需要使用的页面js中使用实const util = require("../../utils/util")

    1. //首页会议信息的ajax
    2. loadMeetingInfos() {
    3. let that = this;
    4. util.request(api.IndexUrl).then(res => {
    5. this.setData({
    6. lists: res.data.infoList
    7. })
    8. })
    9. }

    2.后端代码结构

    后端使用springboot进行搭建,引用了mysql,swagger,mybatisplus等依赖

    部分代码:

    1. @RestController
    2. @RequestMapping("/wx/home")
    3. public class WxHomeController {
    4. @Autowired
    5. private InfoMapper infoMapper;
    6. @RequestMapping("/index")
    7. public Object index(Info info) {
    8. List<Info> infoList = infoMapper.list(info);
    9. Map<Object, Object> data = new HashMap<Object, Object>();
    10. data.put("infoList",infoList);
    11. return ResponseUtil.ok(data);
    12. }
    13. }

     3.前端代码

    wxml

    1. <view>
    2. <swiper autoplay="true" indicator-dots="true">
    3. <block wx:for="{{imgSrcs}}" wx:key="text">
    4. <swiper-item>
    5. <view>
    6. <image src="{{item.img}}" class="swiper-item" />
    7. view>
    8. swiper-item>
    9. block>
    10. swiper>
    11. view>
    12. <view class="mobi-title">
    13. <text class="mobi-icon">text>
    14. <text class="mobi-text">会议信息text>
    15. view>
    16. <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    17. <view class="list" data-id="{{item.id}}">
    18. <view class="list-img">
    19. <image class="video-img" mode="scaleToFill" src="{{item.image !=null? item.image : '/static/persons/6.png'}}">image>
    20. view>
    21. <view class="list-detail">
    22. <view class="list-title"><text>{{item.title}}text>view>
    23. <view class="list-tag">
    24. <view class="state">{{item.state}}view>
    25. <view class="join"><text class="list-num">{{item.num}}text>人报名view>
    26. view>
    27. <view class="list-info"><text>{{item.location}}text>|<text>{{item.starttime}}text>view>
    28. view>
    29. view>
    30. block>
    31. <view class="section">
    32. <text>到底啦text>
    33. view>

    wxss

    1. /**index.wxss**/
    2. .section{
    3. color: #aaa;
    4. display: flex;
    5. justify-content: center;
    6. }
    7. .list-info {
    8. color: #aaa;
    9. }
    10. .list-num {
    11. color: #e40909;
    12. font-weight: 700;
    13. }
    14. .join {
    15. padding: 0px 0px 0px 10px;
    16. color: #aaa;
    17. }
    18. .state {
    19. margin: 0px 6px 0px 6px;
    20. border: 1px solid #93b9ff;
    21. color: #93b9ff;
    22. }
    23. .list-tag {
    24. padding: 3px 0px 10px 0px;
    25. display: flex;
    26. align-items: center;
    27. }
    28. .list-title {
    29. display: flex;
    30. justify-content: space-between;
    31. font-size: 11pt;
    32. color: #333;
    33. font-weight: bold;
    34. }
    35. .list-detail {
    36. display: flex;
    37. flex-direction: column;
    38. margin: 0px 0px 0px 15px;
    39. }
    40. .video-img {
    41. width: 80px;
    42. height: 80px;
    43. }
    44. .list {
    45. display: flex;
    46. flex-direction: row;
    47. border-bottom: 1px solid #6b6e74;
    48. padding: 10px;
    49. }
    50. .mobi-text {
    51. font-weight: 700;
    52. padding: 15px;
    53. }
    54. .mobi-icon {
    55. border-left: 5px solid #e40909;
    56. }
    57. .mobi-title {
    58. background-color: rgba(158, 158, 142, 0.678);
    59. margin: 10px 0px 10px 0px;
    60. }
    61. .swiper-item {
    62. height: 300rpx;
    63. width: 100%;
    64. border-radius: 10rpx;
    65. }
    66. .userinfo {
    67. display: flex;
    68. flex-direction: column;
    69. align-items: center;
    70. color: #aaa;
    71. }
    72. .userinfo-avatar {
    73. overflow: hidden;
    74. width: 128rpx;
    75. height: 128rpx;
    76. margin: 20rpx;
    77. border-radius: 50%;
    78. }
    79. .usermotto {
    80. margin-top: 200px;
    81. }

    此时界面已经能够加载数据了,但是还是有些问题,比如会议的状态,我们数据库展示的是数字,但是在界面上不行,还需要计算数据库中三列参加会议的人数,还需要将数据库的时间格式转换

    二、WXS的使用

    WXS(WeChat Mini Program Storage)是微信小程序提供的本地存储方案,用于在小程序中进行数据的存储和管理。相比远程数据库,WXS更适合于小规模、简单的数据存储需求。

    1.wxs 文件

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

    1. function getState(state){
    2. // 状态:0取消会议1待审核2驳回3待开4进行中5开启投票6结束会议,默认值为1
    3. if(state == 0 ){
    4. return '取消会议';
    5. }else if(state == 1 ){
    6. return '待审核';
    7. }else if(state == 2 ){
    8. return '驳回';
    9. }else if(state == 3 ){
    10. return '待开';
    11. }else if(state == 4 ){
    12. return '进行中';
    13. }else if(state == 5 ){
    14. return '开启投票';
    15. }else if(state == 6 ){
    16. return '结束会议';
    17. }
    18. return '其它';
    19. }
    20. var getNumber = function(str) {
    21. var s = str+'';
    22. var array = s.split(',');
    23. var len = array.length;
    24. return len;
    25. }
    26. function formatDate(ts, option) {
    27. var date = getDate(ts)
    28. var year = date.getFullYear()
    29. var month = date.getMonth() + 1
    30. var day = date.getDate()
    31. var week = date.getDay()
    32. var hour = date.getHours()
    33. var minute = date.getMinutes()
    34. var second = date.getSeconds()
    35. //获取 年月日
    36. if (option == 'YY-MM-DD') return [year, month, day].map(formatNumber).join('-')
    37. //获取 年月
    38. if (option == 'YY-MM') return [year, month].map(formatNumber).join('-')
    39. //获取 年
    40. if (option == 'YY') return [year].map(formatNumber).toString()
    41. //获取 月
    42. if (option == 'MM') return [mont].map(formatNumber).toString()
    43. //获取 日
    44. if (option == 'DD') return [day].map(formatNumber).toString()
    45. //获取 年月日 周一 至 周日
    46. if (option == 'YY-MM-DD Week') return [year, month, day].map(formatNumber).join('-') + ' ' + getWeek(week)
    47. //获取 月日 周一 至 周日
    48. if (option == 'MM-DD Week') return [month, day].map(formatNumber).join('-') + ' ' + getWeek(week)
    49. //获取 周一 至 周日
    50. if (option == 'Week') return getWeek(week)
    51. //获取 时分秒
    52. if (option == 'hh-mm-ss') return [hour, minute, second].map(formatNumber).join(':')
    53. //获取 时分
    54. if (option == 'hh-mm') return [hour, minute].map(formatNumber).join(':')
    55. //获取 分秒
    56. if (option == 'mm-dd') return [minute, second].map(formatNumber).join(':')
    57. //获取 时
    58. if (option == 'hh') return [hour].map(formatNumber).toString()
    59. //获取 分
    60. if (option == 'mm') return [minute].map(formatNumber).toString()
    61. //获取 秒
    62. if (option == 'ss') return [second].map(formatNumber).toString()
    63. //默认 时分秒 年月日
    64. return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
    65. }
    66. function formatNumber(n) {
    67. n = n.toString()
    68. return n[1] ? n : '0' + n
    69. }
    70. function getWeek(n) {
    71. switch(n) {
    72. case 1:
    73. return '星期一'
    74. case 2:
    75. return '星期二'
    76. case 3:
    77. return '星期三'
    78. case 4:
    79. return '星期四'
    80. case 5:
    81. return '星期五'
    82. case 6:
    83. return '星期六'
    84. case 7:
    85. return '星期日'
    86. }
    87. }
    88. module.exports = {
    89. getState: getState,
    90. getNumber: getNumber,
    91. formatDate:formatDate
    92. };

    注意将自定义的函数进行导出

    然后在需要用到的页面引入,比如:

    <wxs src="../../utils/page.wxs" module="tools"/>

    修改后的前端html代码

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

  • 相关阅读:
    糟了,线上服务出现OOM了
    JAVA中的异常处理
    未找到 [“sitemapLocation“] 对应的 sitemap.json 文件
    什么是云服务器实例?实例的镜像,存储,安全分别是什么?
    笔记:Python 字符串与正则表达式(练习题)
    进程互斥的软硬件实现方法
    基于英雄联盟的知识图谱问答系统
    Vue入门
    springBoot源码汇总
    深入理解 JVM 之——Java 内存区域与溢出异常
  • 原文地址:https://blog.csdn.net/Ying_hao_kun/article/details/133957223