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


     1.准备后台

     1.1数据库准备

    创建数据库:

    注意:字符集选择utf8mb4,因为可能用存储用户信息,而有些用户包含emoji标签,用该字符集可以进行存储显示。

     

    1.2 配置数据源

    首先在我们的配置文件config/api中配置数据接口,因为等下需要启动后台,所以这里测试使用本地,WxApiRoot修改成自己的数据接口地址

     为了后期方便维护,我们先将所有的后端接口通过一个文件来保存,在根目录下新建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. };

     1.2 后台部分代码展示

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

    1.3请求方式的封装

    1. loadMeetingInfos(){
    2.     let that=this;
    3.     wx.request({
    4.         url: api.IndexUrl,
    5.         dataType: 'json',
    6.         success(res) {
    7.           console.log(res)
    8.           that.setData({
    9.               lists:res.data.data.infoList
    10.           })
    11.         }
    12.       })
    13.   }


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

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

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

    1.   loadMeetingInfos() {
    2.     let that = this;
    3.     util.request(api.IndexUrl).then(res => {
    4.       this.setData({
    5.         lists: res.data.infoList
    6.       })
    7.     })
    8.   }

    1.4 前端代码 

    index.wxml

    1. <!--index.wxml-->
    2. <view>
    3. <swiper autoplay="true" indicator-dots="true">
    4. <block wx:for="{{imgSrcs}}" wx:key="text">
    5. <swiper-item>
    6. <view>
    7. <image src="{{item.img}}" class="swiper-item" />
    8. </view>
    9. </swiper-item>
    10. </block>
    11. </swiper>
    12. </view>
    13. <view class="mobi-title">
    14. <text class="mobi-icon"></text>
    15. <text class="mobi-text">会议信息</text>
    16. </view>
    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="{{item.image !=null? item.image : '/static/persons/hys.png'}}"></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">{{item.state}}</view>
    26. <view class="join"><text class="list-num">{{item.num}}</text>人报名</view>
    27. </view>
    28. <view class="list-info"><text>{{item.location}}</text>|<text>{{item.starttime}}</text></view>
    29. </view>
    30. </view>
    31. </block>
    32. <view class="section">
    33. <text>到底啦</text>
    34. </view>

    效果图:

    二.WXS的使用


    1.简介


    WXS(WeiXin Script)是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本,丰富模板的数据预处理能力。

    WXS 允许开发者在微信小程序中进行逻辑处理和数据操作。它的设计目标是为了解决一些在 WXML(WeiXin Markup Language)和 JavaScript 中难以处理的问题,提供更灵活的逻辑处理能力。

    数据绑定和计算: WXS 可以用于处理数据绑定和计算。在小程序中,WXML 用于描述页面的结构,WXS 则可以用来进行一些数据的逻辑操作,比如条件判断、循环等。

    独立模块: WXS 可以被视为一种独立的模块,有自己的作用域,可以定义自己的变量和函数。这使得开发者可以更好地组织代码,避免全局变量的冲突。

    与 JavaScript 的关系: WXS 与 JavaScript 是有区别的,虽然它们有相似的语法,但在小程序中,WXS 有一些限制和特定的用途。例如,WXS 不具备 DOM 操作能力,不能直接操作页面的结构。

    运行环境: WXS 运行在一个独立的环境中,与页面的生命周期不同步。它不支持页面事件,主要用于数据处理和计算

    2.WXS优化OA系统


     2.1 使用及定义


    首先在utils目录下创建common.wxs


     

    2.2 导入要使用的项目

     导入到我们要使用的wxml的页面中

    <wxs src="/utils/common.wxs" module="tools" />
    2.3 优化会议状态

    编写优化会议状态函数并进行导入

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

    修改后的前端html代码

    1. <view class="mobi-title">
    2. <text class="mobi-icon"></text>
    3. <text>会议信息</text>
    4. </view>
    5. <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    6. <view class="list" data-id="{{item.id}}">
    7. <view class="list-img">
    8. <image class="video-img" mode="scaleToFill" src="{{item.image != null ? item.image : '/static/persons/hyz.jpg'}}"></image>
    9. </view>
    10. <view class="list-detail">
    11. <view class="list-title"><text>{{item.title}}</text></view>
    12. <view class="list-tag">
    13. <view class="state">{{tools.getStateName(item.state)}}</view>
    14. <view class="join"><text class="list-num">{{tools.getNum(item.canyuze,item.liexize,item.zhuchiren)}}</text>人报名</view>
    15. </view>
    16. <view class="list-info"><text>{{item.location}}</text>|<text>{{tools.formatDate(item.starttime)}}</text></view>
    17. </view>
    18. </view>
    19. </block>
    20. <view class="section bottom-line">
    21. <text>到底啦</text>
    22. </view>

     效果图:

     

  • 相关阅读:
    【C++上层应用】4. 多线程
    阿里终面:说说OAuth2.0 与 单点登录的区别?
    python数据精度问题
    ASO优化优缺点各是什么?带你学会常见的优化手段
    LQ0138 分巧克力【二分法】
    年搜索量超 7 亿次背后:这款 APP 用火山引擎 DataTester 完成“数据驱动”
    【Java面试指北】Exception Error Throwable 你分得清么?
    npm常用命令系统介绍
    汇凯金业:黄金5g工艺是什么意思
    EM算法推导小记
  • 原文地址:https://blog.csdn.net/liaozhixiangjava/article/details/133958454