小程序教程

微信小程序记账应用实例课程完结 对接服务端账目CRUD

字号+ 作者: 来源: 2016-11-23 09:49 我要评论( )

由单机版升级为网络版1.缓存accessToken,以后作为令牌使用,uid不必缓存,由服务端完成映射,user/login接口

先来回顾一下app.js封装的httpService的代码实现:

  1.   httpService:function(uri, param, cb) {
  2. //      分别对应相应路径,参数,回调
  3.       wx.request({
  4.             url: 'http://financeapi.applinzi.com/index.php/' + uri,
  5.             data: param,
  6.             header: {
  7.                 'Content-Type': 'application/json'
  8.             },
  9.             success: function(res) {
  10.                 cb(res.data)
  11.             },
  12.             fail: function() {
  13.                 console.log('接口错误');
  14.             }
  15.         })  
  16.   }
复制代码

调用的是wx.request接口,返回res.data即为我们服务器返回的数据,结构与wx.request返回的类似,这里多一层结构,不可混淆。

response.code,response.msg,response.data是我自己服务端定义的结构

res.statusCode,res.errMsg,res.data是微信给我们定义的结构

而我们的response又是包在res.data中的,所以正常不加封装的情况下,要取得我们自己服务端返回的目标数据应该是写成,res.data.data.accessToken;好在已经作了封装,不会那么迷惑人了,今后调用者只认response.data就可以拿到自己想要的数据了。

明白了上述关系与作了封装后,我们调用起来就方便了,index.js中onShow写上如下代码

  1. app.httpService(
  2.                     'user/login',
  3.                     {
  4.                         openid: userInfo.nickName
  5.                     },
  6.                     function(response){
  7.                         //成功回调,本地缓存accessToken
  8.               var accessToken = response.data.accessToken;
  9.                         wx.setStorageSync('accessToken', accessToken);
  10.                     }
  11.             );
复制代码

app.js onLaunch调用如下代码,在程序启动就登录与缓存accessToken。

之所以不在index.js中调用登录,是因为app launch生命周期较前者更前,accessToken保证要加载item/all之前生成并缓存到本地

  1.   onLaunch: function () {
  2.     //调用应用实例的方法获取全局数据
  3.     var that = this
  4.     //调用登录接口
  5.     wx.login({
  6.       success: function () {
  7.         wx.getUserInfo({
  8.           success: function (res) {
  9.             //请求登录
  10.             that.httpService(
  11.                 'user/login',
  12.                 {
  13.                   openid: res.userInfo.nickName
  14.                 },
  15.                 function(response){
  16.                   //成功回调,本地缓存accessToken
  17.                   var accessToken = wx.getStorageSync('logs') || '';
  18.                   accessToken = response.data.accessToken;
  19.                   wx.setStorageSync('accessToken', accessToken);
  20.                 }
  21.             );
  22.           }
  23.         })
  24.       }
  25.     })
  26.   },
复制代码

2.请求网络,对接获取的账目列表,item/all接口

使用onShow而不使用onLoad,是因为每次添加返回后首页需要自刷新

response是服务器返回的数据

而response.data中包含了自己的账目列表信息

  1. {
  2.   "code": 200,
  3.   "msg": "加载成功",
  4.   "data": [
  5.     {
  6.       "id": "21",
  7.       "title": "工资",
  8.       "cate": "+",
  9.       "account": "6500.0",
  10.       "date": "2016-10-22",
  11.       "uid": "8"
  12.     },
  13.     {
  14.       "id": "20",
  15.       "title": "超市购物",
  16.       "cate": "-",
  17.       "account": "189.0",
  18.       "date": "2016-10-21",
  19.       "uid": "8"
  20.     },
  21.     {
  22.       "id": "12",
  23.       "title": "抢红包",
  24.       "cate": "+",
  25.       "account": "20.5",
  26.       "date": "2016-10-30",
  27.       "uid": "8"
  28.     }
  29.   ]
  30. }
复制代码

读取代码:

  1.   onShow: function () {
  2.     var that = this
  3.     // 获取首页列表,本地storage中取出accessToken作为参数,不必带上uid;
  4.     // 成功回调后,设置为data,渲染wxml
  5.     app.httpService(
  6.                     'item/all',
  7.                     {'accessToken': wx.getStorageSync('accessToken')},
  8.                     function(response){
  9.                         that.setData({
  10.                           'items':response.data
  11.                         });
  12.                     }
  13.     );
  14.   }
复制代码

布局代码:

  1. <block wx:for="{{items}}">
  2.     <view class="news-item" data-title="{{item.title}}">
  3.       <view class="news-text">
  4.         <text class="news-title">{{item.title}}</text>
  5.         <view class="news-stamp">
  6.           <text wx:if="{{item.cate == '-'}}" class="sign-green">{{item.cate}} {{item.account}}</text>
  7.           <text wx:else class="sign-red">{{item.cate}} {{item.account}}</text>
  8.           <text>{{item.date}}</text>
  9.         </view>
  10.       </view>
  11.     </view>
  12.   </block>
复制代码

2.请求网络,对接账目,item/add接口

拿到表单组件上的各值,title,record,cate,date,而accessToken我们就在httpService方法统一注入。

  1.   httpService:function(uri, param, cb) {
  2.     // 如果令牌已经存在,那么提交令牌到服务端
  3.     if (wx.getStorageSync('accessToken')) {
  4.       param.accessToken = wx.getStorageSync('accessToken');
  5.     }
  6.     ...
复制代码

提交到网络

  1.     // 本条数据打包成json
  2.     var record = {
  3.       title: this.data.title,
  4.       cate: this.data.cate,
  5.       account: this.data.account,
  6.       date: this.data.date
  7.     }
  8.     // accessToken放在record传入也可以,但为了更多的复用,我将它放在httpService时统一注入
  9.     // 访问网络
  10.     var app = getApp();
  11.     app.httpService(
  12.       'item/add',
  13.       record,
  14.       function(response) {
  15.         // 提示框
  16.         that.setData({
  17.           modalHidden: false
  18.         });
  19.       }
  20.     );
复制代码

3.首页传id值,编辑页面访问网络并显示数据

1.从首页列表传item对象的id号到item页面

  1. <view class="news-item" data-id="{{item.id}}" bindtap="itemTap">
复制代码

2.绑定data-id到点击单元格事件itemTap

  1. var id = parseInt(e.currentTarget.dataset.id);
复制代码

3.使用navigate传值

  1.     wx.navigateTo({
  2.       url: '../item/item?id='+id
  3.     })
复制代码

4.item页面接收id值,并作判断有无id号

  1.   onLoad: function (options) {
  2.     this.setData({
  3.       id:options.id,
  4.     })
  5.   }
复制代码

5.读取网络返回的数据与渲染到页面

  1.     var that = this;
  2.     if (options.id) {
  3.       // 访问网络
  4.       var app = getApp();
  5.       app.httpService(
  6.           'item/view',
  7.           {id: options.id},
  8.           function(response){
  9.             that.setData({
  10.               id: response.data.id,
  11.               title: response.data.title,
  12.               cate: response.data.cate,
  13.               account: response.data.account,
  14.               date: response.data.date
  15.             });
  16.           }
  17.         );
  18.     }
复制代码

6.并将button按钮绑定为update方法

  1.     <button wx:if="{{id}}" class="button" type="primary" bindtap="update">编辑</button>
  2.     <button wx:else class="button" type="primary" bindtap="save">添加</button>
复制代码

7.修改账目提交到网络,item/update

客户端update方法

  1. update: function(){
  2.     var that = this;
  3.     // 本条数据打包成json
  4.     var record = {
  5.       title: this.data.title,
  6.       cate: this.data.cate,
  7.       account: this.data.account,
  8.       date: this.data.date,
  9.       id: this.data.id
  10.     }
  11.     // accessToken放在record传入也可以,但为了更多的复用,我将它放在httpService时统一注入
  12.     // 访问网络
  13.     var app = getApp();
  14.     app.httpService(
  15.       'item/update',
  16.       record,
  17.       function(response) {
  18.         // 提示框
  19.         that.setData({
  20.           modalHidden: false
  21.         });
  22.       }
  23.     );
  24.   },
复制代码

8.删除账目,item/del接口

方法实现

  1.   delete: function () {
  2.       var that = this;
  3.       // 访问网络,删除账目
  4.       var app = getApp();
  5.       app.httpService(
  6.           'item/del',
  7.           {id: that.data.id},
  8.           function(response){
  9.             // 提示框
  10.             that.setData({
  11.               modalTitle: '删除成功',
  12.               modalHidden: false
  13.             });
  14.           }
  15.         );
  16.   },
复制代码

布局页面

先判断是否有id值,有则在编辑按钮正文出现删除按钮

  1.     <button wx:if="{{id}}" class="button" type="default" bindtap="delete">删除</button>
复制代码


 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 微信小程序 轮播图 swiper图片组件

    微信小程序 轮播图 swiper图片组件

    2016-11-23 09:49

  • 微信小程序 开发 微信开发者工具 快捷键

    微信小程序 开发 微信开发者工具 快捷键

    2016-11-23 09:49

  • 微信小程序 页面跳转 传递参数

    微信小程序 页面跳转 传递参数

    2016-11-23 09:49

  • 微信小程序 如何获取时间

    微信小程序 如何获取时间

    2016-11-23 09:49

网友点评