发表日期:2017-11 文章编辑:小灯 浏览次数:1478
项目准备工作
处理app.js和首页的先和问题
生成条形码
生成二维码
城市的三级联动
支付宝小程序.jpeg项目的准备工作做的不是很多。在支付宝小程序踩的坑,主要就是让我很不能接受这个ide工具是真的不是怎么样。
因此我选择了vscode去编写代码。原来ide只用来调试和模拟器。
在请求中,会出现error。一共有这几种情况
因为支付宝小程序是完全支持es6的。当然部分语法不支持。详情需要查看官方文档。因此我们可以写入Promise 对小程序的Promise支持。(微信小程序是需要导入Promise库用以支持)
function myPromisify(fn) { return function (obj = {}) { return new Promise((resolve, reject) => { obj.success = function (res) { //成功 resolve(res) } obj.fail = function (res) { //处理失败 reject(res); console.log(`接口请求失败 ,错误原因 ${JSON.stringify(res)}`); switch (res.error) { case 11: my.showToast({ type: 'exception', content: '无权跨越', duration: 1000,}); break; case 12: my.showToast({ type: 'exception', content: '网络出错了', duration: 1000, }); break; case 13: my.showToast({ type: 'exception', content: '请求超时', duration: 1000, }); break; case 14:my.showToast({ type: 'exception', content: '解码失败了', duration: 1000, }); break; case 19:my.showToast({ type: 'exception', content: '请求发生了错误', duration: 1000, }); break;default:my.showToast({ type: 'none', content: '请求发生了错误', duration: 1000, }); break;}} fn(obj) }) } } //无论promise对象最后状态如何都会执行 Promise.prototype.finally = function (callback) { let P = this.constructor; return this.then( value => P.resolve(callback()).then(() => value), reason => P.resolve(callback()).then(() => { throw reason }) ); }; function dataRequest(url, method, data) { var param = JSON.parse(data); param['xx'] = 'xx'; param['xx'] = 'xx'; param['xx'] = 'xx-M'; param['xx'] = 'Cxxx;var dataRequest = myPromisify(my.httpRequest) console.log(`接口 : ${url} 请求参数为 : ${JSON.stringify(param)}`); return dataRequest({ url: url, method: method, data: JSON.stringify(param), headers: { "Content-Type": "application/json" }, }) } 将方法导出
module.exports = { dataRequest: dataRequest }
请求结果.png在项目中,我只封装了时间类,和 条形码,二维码的方法。
具体的导出方法和上面的方式一样。这里留下时间戳的方法记录
function formatTime(date) { var year = date.getFullYear() var month = date.getMonth() + 1 var day = date.getDate()var hour = date.getHours() var minute = date.getMinutes() var second = date.getSeconds()return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') } 导出时间戳的方法
module.exports = { formatTime: formatTime, } 每个项目中都会请求大大小小的接口地址。因此需要统一存放地址路径。
var connect ={ KRISLEE:‘�http://www.baidu.com‘ } module.exports = connect 导入是通过import来进行导入模块,引用模块,进行操作
import event from ‘../../event.js’ 在小程序上,我们遇到这个问题。在加载app.js的时候,我们会先调用接口来进行获得支付宝小程序的openid,通过openid来换取userid。然后homepage来获得userid 来进行操作,但是我们遇到这个问题。homepage的js有时候会在app.js之前运行。因此页面需要通过下拉刷新来执行。
2.1 解决方式。
定时器
事件监听
定时器的方法就是延时执行主要的钩子函数里的方法。现在我们主要来说说事件监听的方法。
附代码
var events = {};function on(name, self, callback) { var tuple = [self, callback]; var callbacks = events[name]; if (Array.isArray(callbacks)) { callbacks.push(tuple); } else { events[name] = [tuple]; } }function remove(name, self) { var callbacks = events[name]; if (Array.isArray(callbacks)) { events[name] = callbacks.filter((tuple) => { return tuple[0] != self; }) } }function emit(name, data) { var callbacks = events[name]; if (Array.isArray(callbacks)) { callbacks.map((tuple) => { var self = tuple[0]; var callback = tuple[1]; callback.call(self, data); }) } }exports.on = on; exports.remove = remove; exports.emit = emit; 当app.js完成某个操作的时候,event.emit("finish",data),这时候,主要的钩子函数主要负责监听,拿到事件名称和数据,进行操作 event.on("finish",(data)=>{}),最后要在页面卸载的时候同时,卸载事件监听函数 event.remove("finish",this)
在这里。我就废话不多说了。附近之后在文章的后面贴上。条形码和二维码的文件库。使用的方法,
使用的方式和方法也很简单。
import 文件库 from xxx.js
function barc(id, code, width, height){console.log(convert_length(width)); console.log(convert_length(height)); barcode.code128(my.createCanvasContext(id), code, convert_length(width), convert_length(height)) console.log("执行完毕") }function qrc(id, code, width, height) { qrcode.api.draw(code, { ctx: my.createCanvasContext(id), width: convert_length(width), height: convert_length(height) }) } function convert_length(length) {return Math.round(my.getSystemInfoSync().windowWidth * length / 750); } 在文件里。我在支付宝小程序里,在onLoad方法里使用,画布并不会绘图出二维码和条形码。原因我至今还是没想明白。所以我放钩子函数onReady方法里使用。
在axml文件里。指定唯一标识id
<canvas id="qrcode" style="width:400rpx;height:400rpx;"/> 在js文件里,onReady()方法里使用
onReady(){ wxbarcode.qrcode('qrcode', this.data.value, 400, 400); }
条形码.png
二维码.png这是一个城市列表。一般省,直辖市 是第一梯队,一般的市是第二梯队,之后的县,区是第三梯队。如下
{ "id": "320900", "name": "盐城市", "parent_id": "320000", "level_type": "2" }, { "id": "320902", "name": "亭湖区", "parent_id": "320900", "level_type": "3" }, { "id": "320903", "name": "盐都区", "parent_id": "320900", "level_type": "3" }, { "id": "320921", "name": "响水县", "parent_id": "320900", "level_type": "3" }, 首先需要我们对所有的省市区进行集合操作,把他们归集于一起,方便之后的槽子
// 所有的 省市区 集合 var result_province = cityData_new.filter( function (value) { return (value.level_type == 1); } ); var result_city = cityData_new.filter( function (value) { return (value.level_type == 2); } ); var result_county = cityData_new.filter( function (value) { return (value.level_type == 3); } ); 之后,我们定义当前选定的省市区
之后对城市选择进行操作。比如选择的江苏省,那么之后就要带出南京市,苏州市,选择了南京市,就要带出建邺区之类的操作。
贴出代码 :
cityChange: function (e) { var val = e.detail.value // 改变的picker 每一列对应的下标位置 var t = this.data.cityValue; // 原本的位置if (val[0] != t[0]) { // 第一列改变 city_s = []; county_s = []; var current_id = province_s[val[0]].id; city_s = this.selectResultAction(result_city, current_id); var current_city_id = city_s[0].id; county_s = this.selectResultAction(result_county, current_city_id); this.setData({ citys: city_s, countys: county_s, cityValue: [val[0], 0, 0] }) return; } if (val[1] != t[1]) {// 第二列改变 county_s = []; var current_city_id = city_s[val[1]].id; county_s = this.selectResultAction(result_county, current_city_id); this.setData({ countys: county_s, cityValue: [val[0], val[1], 0] }) return; } if (val[2] != t[2]) {// 第三列改变 this.setData({ county: this.data.countys[val[2]], cityValue: val }) return; } }, 以上是对city进行操作。前端的页面也是需要我们考量的地方。支付宝小程序。有<picker-view> 的标签,以及 <picker-view-column>这样的标签,更加快速的完成了我们想要的操作。
之后我会贴出,相关附件。
以上就这么多,之后会慢慢补充,慢慢完善
城市三级联动地址
条形码,二维码的git地址