官方开发有了更新v0.10.101100,Picker的mode属性已经支持date以及time(background-image的bug也修复),于是来更新此实例。

目标:实现集成日期组件

如图

步骤,在item.wxml文件中增加一个picker组件,如下:

日期: {{date}}

如图

从图中可以看出:1.日期后面是空白的,应该默认显示今天日期;

2.点击确定也没有显示到组件上,需要实现bindDateChange方法。

于是我们需要在item.js文件中,声明一个data值date与wxml中的{{date}}绑定关联

然后在onLoad中初始化字符串格式的日期值,详细说明见注释:// 获取当前日期

var date = new Date();

// 格式化日期为"YYYY-mm-dd"

var dateStr = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();

// 存回data,以渲染到页面

this.setData({

date: dateStr

})

经过如上处理,日期组件已经显示为当前日期

如图

处理到此,我们还需要修复一个逻辑错误,即组件的结束日期应该不超过当日,做法也很简单,只需要在wxml文件中对picker的日期属性end由2017-09-01改为{{date}}即可

吐槽一下,官方的picker的还是有bug的,完全不听start与end使唤,仍可以选任意日期,暂时不去理会,代码就这么写着,什么时候开发工具修复了自然可以了,毕竟是现在还只是内测,就将就用着。

接下来处理日期组件点击确认事件bindDateChange

回到item.js文件

声明一个bindDateChange方法,添加如下代码以写回data中的date值// 点击日期组件确定事件

bindDateChange: function(e) {

this.setData({

date: e.detail.value

})

}

至此,已经实现集成日期picker组件。剩下的就是将它同之前的标题、类型、金额字段那样存在json再本地setStorage存储即可,这里不作赘述,具体可以参考本人公众号之前发的文章《微信小程序(应用号)实战课程之记账应用开发》。

步骤

1.小程序端通过微信第三方登录,取出nickname向服务端请求登录,成功后本地并缓存uid,accessToken

接口出处:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.htmlApp({

onLaunch: function() {

wx.login({

success: function(res) {

if (res.code) {

//发起网络请求

wx.request({

url: 'https://test.com/onLogin',

data: {

code: res.code

}

})

} else {

console.log('获取用户登录态失败!' + res.errMsg)

}

}

});

}

})

缓存用户的基本信息

index.jsonLoad: function(){

var that = this

//调用应用实例的方法获取全局数据

app.getUserInfo(function(userInfo){

//请求登录

console.log(userInfo.nickName);

app.httpService(

'user/login',

{

openid: userInfo.nickName

},

function(response){

//成功回调

console.log(response);

// 本地缓存uid以及accessToken

var userinfo = wx.getStorageSync('userinfo') || {};

userinfo['uid'] = response.data.uid;

userinfo['accessToken'] = response.data.accessToken;

console.log(userinfo);

wx.setStorageSync('userinfo', userinfo);

}

);

})

}

app.js

定义一个通用的网络访问函数: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('接口错误');

}

})

},

这里method默认为get,如果设置为其他,比如post,那么服务端怎么也取不到值,于是改动了服务端的取值方式,由$POST改为$GET。

在Storage面板中,检查到数据已成功存入

[2016-10-25]

由单机版升级为网络版

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){

//成功回调,本地缓存accessToken

var 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){

//成功回调,本地缓存accessToken

var 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,渲染wxml

app.httpService(

'item/all',

{'accessToken': wx.getStorageSync('accessToken')},

function(response){

that.setData({

'items':response.data

});

}

);

}

布局代码:

{{item.title}}

{{item.cate}} {{item.account}}

{{item.cate}} {{item.account}}

{{item.date}}

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

拿到表单组件上的各值,title,record,cate,date,而accessToken我们就在httpService方法统一注入。httpService:function(uri, param, cb) {

// 如果令牌已经存在,那么提交令牌到服务端

if (wx.getStorageSync('accessToken')) {

param.accessToken = wx.getStorageSync('accessToken');

}

...

提交到网络// 本条数据打包成json

var 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页面

2.绑定data-id到点击单元格事件itemTapvar 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方法编辑

添加

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

客户端update方法update: function(){

var that = this;

// 本条数据打包成json

var 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值,有则在编辑按钮正文出现删除按钮删除

记账小程序php开发_微信小程序(应用号)开发实战记账软件实例相关推荐

  1. node.js 微信小程序 部署服务器_微信小程序云开发环境部署,及添加数据

    点击蓝字 关注我们 今天在漫无目的逛CSDN的时候,一篇关于微信公众号云开发的文章引起了我的注意.据介绍,小程序云开发简称tcb,是腾讯爸爸给我们提供的基于腾讯云的云服务器.目前云开发已包含云数据库, ...

  2. python操作微信小程序云端数据库_微信小程序云开发之数据库操作

    本文实例为大家分享了微信小程序云开发之数据库操作的具体代码,供大家参考,具体内容如下 新建集合 1.打开云开发控制台,数据库 2.添加集合users 添加代码 onAdd: function () { ...

  3. python操作微信小程序云端数据库_微信小程序·云开发云数据库的基本使用-微信小程序云开发实例-腾讯云微信小程序...

    微信小程序·云开发云数据库的基本使用-微信小程序云开发实例-腾讯云微信小程序 浏览量:1120 时间:2020-04-06

  4. 超市微信小程序怎么做_微信小程序便利店怎么开?便利店和百货超市怎么开发小程序?...

    微信小程序便利店怎么开?便利店和百货超市怎么开发小程序?下面跟随小编一起来看看吧! 现在很多商家还在小程序是什么,流行的说法是开店到微信,创建一个互联网离线模式,将近五公里的小程序显示出来,只要别人用 ...

  5. 拼团小程序源码_微信小程序拼团系统为什么很多商家开发

    问大家一个问题,你有收到过朋友的微信小程序拼团消息吗?相信不少的人都收到过,但是一些不太了解小程序的人,对拼团系统还不太了解,西安小程序开发青云在线小编告诉您,小程序拼团模式也叫做团购模式,同样一款产 ...

  6. python开发小程序拼团_微信小程序新功能,正合适开发拼团类小程序|明智科技...

    1.分享 微信小程序的任何一个页面都可以增加分享功能,用户可以把小程序便捷的分享给通讯录的好友和微信群.但不能分享到朋友圈. 也可以进一步理解为小程序开发者可以创造一种诱导用户分享给好友和微信群的应用 ...

  7. node.js 微信小程序 部署服务器_微信小程序开发入门(一),Nodejs搭建本地服务器...

    1.  如何模拟真实环境中,读取服务端数据,首先需要使用Nodejs搭建一个本地服务器的环境. 在搭建web服务器之前,需要先安装node.js(安装版本最好为6.9.x) 安装后node.js,接下 ...

  8. mysql导入微信小程序云开发_微信小程序-云开发数据库上传json文件

    小程序新增了云开发功能,对于个人开发者是个利好消息.可以省去购买服务器,购买域名以及繁琐配置等步骤,减轻了开发者的负担.至于如何云开发我就不在这里赘述了,请移步微信小程序云开发官方文档,说的很清楚.这 ...

  9. java写微信小程序答辩问题_微信小程序 开发中遇到问题总结

    微信小程序 开发中遇到问题总结 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载.例: //app.js App({ ...

  10. 微信小程序页面栈_微信小程序开发中的页面栈及页面路由原理

    摘要:小程序的开发方兴未艾,本文以图解的形式详细剖析了小程序开发中的页面栈及页面路由原理,对于该原理的深入理解有助于开发者更好地理解小程序的开发框架,更好地开发出功能强大的小程序. 微信小程序(以下简 ...

最新文章

  1. 北大青鸟广州天河:高中生做技术经理!
  2. CSS和JS样式属性对照表
  3. FineReport报表和FineBI的差别和各自的优势在哪
  4. opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)
  5. php document.write,在JS中有关document.write()的用法(详细教程)
  6. 人脸测温门禁 传感器_湖南人脸测温门禁如何选择
  7. Windows下redis使用及安装
  8. Packet Tracer 5.0实验(七) 路由器单臂路由配置
  9. Differential Geometry之第十章极小曲面
  10. linux 怎么进终端,进入Linux终端界面的方法汇总
  11. 二维数组与指针(详解)
  12. 动态规划-背包问题(易懂)
  13. 基于S3C2410和UDAl34l的嵌进式音频系统设计
  14. 字号与阿拉伯数字对应列表
  15. 狂神Docker通俗易懂学习笔记2
  16. 网页添加飘动窗口(图片链接)+ IE8下js解析错误
  17. 解决autocad闪退
  18. 食神软件测试初学者,橙光游戏食神养成计划升阶攻略
  19. 股票证券名词解释汇总
  20. Ray+GPU支持高性能计算

热门文章

  1. PHP 每小时抽奖,项目3:PHP抽奖程序 ,抽奖规则代码 分时间段
  2. cityscape train.txt 数据 python读取子文件夹内所有文件
  3. 使用Google搜索引擎的10个搜索技巧
  4. wps序号打乱重新排序_wps表格 已经排好序号 ,顺序错误,想重新排列
  5. python 拼音相似度_人工智能之pypinyin jieba gensim 之最简单的相似度实现
  6. 江南春新年围炉夜谈:如何破解增长焦虑?
  7. IPD咨询之企业营销体系解决方案:让营业额快速翻倍!
  8. 111.绘制正态分布曲线
  9. 【滤波器】基于多种滤波器实现信号去噪含Matlab源码
  10. 注解缓存@Cacheable、CachePut、CacheEvict、Caching使用及介绍