微信小程序记账应用实例课程(完结)——对接服务端账目CRUD
2019独角兽企业重金招聘Python工程师标准>>>
#由单机版升级为网络版
##1.缓存accessToken,以后作为令牌使用,uid不必缓存,由服务端完成映射,user/login接口
先来回顾一下app.js封装的httpService的代码实现:
httpService:function(uri, param, cb) {
// 分别对应相应路径,参数,回调wx.request({url: 'http://financeapi.applinzi.com/index.php/' + uri,data: param,header: {'Content-Type': 'application/json'},success: function(res) {cb(res.data)},fail: function() {console.log('接口错误');}}) }
调用的是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写上如下代码
app.httpService('user/login',{openid: userInfo.nickName}, function(response){//成功回调,本地缓存accessTokenvar accessToken = response.data.accessToken;wx.setStorageSync('accessToken', accessToken);});
app.js onLaunch调用如下代码,在程序启动就登录与缓存accessToken。
之所以不在index.js中调用登录,是因为app launch生命周期较前者更前,accessToken保证要加载item/all之前生成并缓存到本地
onLaunch: function () {//调用应用实例的方法获取全局数据var that = this//调用登录接口wx.login({success: function () {wx.getUserInfo({success: function (res) {//请求登录that.httpService('user/login',{openid: res.userInfo.nickName}, function(response){//成功回调,本地缓存accessTokenvar accessToken = wx.getStorageSync('logs') || '';accessToken = response.data.accessToken;wx.setStorageSync('accessToken', accessToken);});}})}})},
##2.请求网络,对接获取的账目列表,item/all接口
使用onShow而不使用onLoad,是因为每次添加返回后首页需要自刷新
response是服务器返回的数据
而response.data中包含了自己的账目列表信息
{"code": 200,"msg": "加载成功","data": [{"id": "21","title": "工资","cate": "+","account": "6500.0","date": "2016-10-22","uid": "8"},{"id": "20","title": "超市购物","cate": "-","account": "189.0","date": "2016-10-21","uid": "8"},{"id": "12","title": "抢红包","cate": "+","account": "20.5","date": "2016-10-30","uid": "8"}]
}
读取代码:
onShow: function () {var that = this// 获取首页列表,本地storage中取出accessToken作为参数,不必带上uid;// 成功回调后,设置为data,渲染wxmlapp.httpService('item/all', {'accessToken': wx.getStorageSync('accessToken')}, function(response){that.setData({'items':response.data});});}
布局代码:
<block wx:for="{{items}}"><view class="news-item" data-title="{{item.title}}"><view class="news-text"><text class="news-title">{{item.title}}</text><view class="news-stamp"><text wx:if="{{item.cate == '-'}}" class="sign-green">{{item.cate}} {{item.account}}</text><text wx:else class="sign-red">{{item.cate}} {{item.account}}</text><text>{{item.date}}</text></view></view></view></block>
##2.请求网络,对接账目,item/add接口
拿到表单组件上的各值,title,record,cate,date,而accessToken我们就在httpService方法统一注入。
httpService:function(uri, param, cb) {// 如果令牌已经存在,那么提交令牌到服务端if (wx.getStorageSync('accessToken')) {param.accessToken = wx.getStorageSync('accessToken');}...
提交到网络
// 本条数据打包成jsonvar record = {title: this.data.title,cate: this.data.cate,account: this.data.account,date: this.data.date}// accessToken放在record传入也可以,但为了更多的复用,我将它放在httpService时统一注入// 访问网络var app = getApp();app.httpService('item/add',record,function(response) {// 提示框that.setData({modalHidden: false});});
##3.首页传id值,编辑页面访问网络并显示数据
1.从首页列表传item对象的id号到item页面
<view class="news-item" data-id="{{item.id}}" bindtap="itemTap">
2.绑定data-id到点击单元格事件itemTap
var id = parseInt(e.currentTarget.dataset.id);
3.使用navigate传值
wx.navigateTo({url: '../item/item?id='+id})
4.item页面接收id值,并作判断有无id号
onLoad: function (options) {this.setData({id:options.id,})}
5.读取网络返回的数据与渲染到页面
var that = this;if (options.id) {// 访问网络var app = getApp();app.httpService('item/view',{id: options.id},function(response){that.setData({id: response.data.id,title: response.data.title,cate: response.data.cate,account: response.data.account,date: response.data.date});});}
6.并将button按钮绑定为update方法
<button wx:if="{{id}}" class="button" type="primary" bindtap="update">编辑</button><button wx:else class="button" type="primary" bindtap="save">添加</button>
7.修改账目提交到网络,item/update
客户端update方法
update: function(){var that = this;// 本条数据打包成jsonvar record = {title: this.data.title,cate: this.data.cate,account: this.data.account,date: this.data.date,id: this.data.id}// accessToken放在record传入也可以,但为了更多的复用,我将它放在httpService时统一注入// 访问网络var app = getApp();app.httpService('item/update',record,function(response) {// 提示框that.setData({modalHidden: false});});},
8.删除账目,item/del接口
方法实现
delete: function () {var that = this;// 访问网络,删除账目var app = getApp();app.httpService('item/del',{id: that.data.id},function(response){// 提示框that.setData({modalTitle: '删除成功',modalHidden: false});});},
布局页面
先判断是否有id值,有则在编辑按钮正文出现删除按钮
<button wx:if="{{id}}" class="button" type="default" bindtap="delete">删除</button>
源码下载:关注下方的公众号->回复数字1002
对小程序开发有趣的朋友关注公众号: huangxiujie85,QQ群: 581513218,微信: small_application,陆续还将推出更多作品。
转载于:https://my.oschina.net/huangxiujie/blog/775562
微信小程序记账应用实例课程(完结)——对接服务端账目CRUD相关推荐
- 微信小程序头像上传+(C#)服务端接收
第一步:样式设置(WXSS) 说明:.imagesize给view使用,.avatar给image使用.作用是把图片显示为圆形. .imagesize{display:flex; justify-co ...
- 校园服务小程序源代码分享园服务微信小程序全开源版源码-包含服务端
2021年4月17日更新 严正声明: [请一定勿将程序用户商业用途且 包括 用此程序去参加各类学校的竞赛或者其他以获取名利而参与的竞赛等,一旦被原作者发现将会面临严重的侵权责任后果,特别是被获奖后会遭 ...
- 微信小程序开发之图片上传+Java服务端接收
闲言少叙直入正题 前端代码在网上一搜一大堆,且搜出来的结果基本上是正确的,没啥好说的,我连代码都不想贴(如果有时间的话明天整理下贴在文章结尾,没时间的话就不贴了).但是,但是,但是,靠谱的,不用改动就 ...
- eslint不报错 vue_2-2【微信小程序全栈开发课程】index页面搭建--ESlint格式错误
1.修改入口文件 也就是src/pages/index/main.js文件 main.js是入口文件,通过main.js来加载index.vue文件.每个页面文件夹中都要有main.js文件 //加载 ...
- 视频教程-uniapp开发仿阿里飞猪旅游微信小程序,vue中高级课程-Vue
uniapp开发仿阿里飞猪旅游微信小程序,vue中高级课程 五年互联网实战开发经验,全栈工程师,熟悉主流前端开发技术,js,vue等,后端技术方向在python,node,曾先后就职于阿里云,阿里影业 ...
- angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍
1.打开小程序目录 打开微信开发者工具,我们上一节新建的项目,我圈出来的这个地方就是小程序的目录结构(如果你那里没有显示,可以点击左上方的编辑器来显示) 2.原生小程序框架介绍 给大家画了一张图,重要 ...
- python操作微信小程序云端数据库_微信小程序·云开发云数据库的基本使用-微信小程序云开发实例-腾讯云微信小程序...
微信小程序·云开发云数据库的基本使用-微信小程序云开发实例-腾讯云微信小程序 浏览量:1120 时间:2020-04-06
- 为啥我的页面模板的from提交不了数据_4-9【微信小程序全栈开发课程】意见反馈(四)--提交反馈信息
1.创建后端操作文件 先在后端server/controllers文件夹中创建操作文件createopinion.js,用来将从前端页面提交的数据,插入到opinions表中,创建完之后,页面目录如下 ...
- 上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...
现在是一次性加载所有的记录数据,数据多的时候,会加载比较慢,所以我们改成分页加载,一次最多加载15条数据 每次拉倒底部都会自动加载下一页的数据,知道所有的数据加载完成 1.添加data变量 编辑rec ...
最新文章
- js init : function ()
- matlab 小括号
- access、strtol函数的使用(后者为C库函数)
- 解决bert在文本长度的问题的方案,篇章级
- 周鸿祎为何忘不掉搜索?
- C++ and Java template class and function 模板类和模板函数
- libiconv字符集转换库在C#中的使用
- python返回字典keys()
- 做手机系统,鸿蒙怎样才有机会
- javaSE基础篇之char
- Windows 10 安装(硬盘装机)
- 最小二乘法求线性回归方程
- 自制STC12C5A60S2最小系统板
- structs2框架学习一(启动过程和各种配置)
- 2023年度流行色,带来信心的活力洋红色
- The Sandbox沙盒遊戲設計大賽將於12月24日開始
- 后端一次性传了10w条数据,前端该如何处理?—— 面试高频
- 最有效的5条改进措施
- SVM算法教科书(一)
- 【JVM】垃圾回收算法
热门文章
- java 之 异常
- js两个等号和三个等号_js中两个等号(==)和三个等号(===)的区别
- linux 指定库名 登录mysql_linux下对应mysql数据库的常用操作
- axure怎样24位bmp输出_平衡(非平衡)输入输出的无源变压器前级放大器
- 睡醒了,有精神了,简单讲讲这几天的故事了
- 滑轨声源定向的理论模型与参数估计
- c语言排班系统设计报告,C语言课程设计关于排班系统的一些问题
- java awt canvas_JavaFX AWT Canvas
- rmi反序列化导致rce漏洞修复_JAVA反序列化漏洞解决办法
- 描述Linux的虚拟化实现,Linux中实现虚拟化的四种常用方法