美文网首页
支付宝小程序-工作日记11/25

支付宝小程序-工作日记11/25

作者: Kris_lee | 来源:发表于2017-11-25 11:48 被阅读430次

项目准备工作

处理app.js和首页的先和问题

生成条形码

生成二维码

城市的三级联动

支付宝小程序.jpeg

1、项目准备工作

项目的准备工作做的不是很多。在支付宝小程序踩的坑,主要就是让我很不能接受这个ide工具是真的不是怎么样。

因此我选择了vscode去编写代码。原来ide只用来调试和模拟器。

1.1my.httpRequest的请求封装。

在请求中,会出现error。一共有这几种情况

  • error 11 是代表无权跨越
  • error 12 是网络错误
  • error 13 是请求超时
  • error 14 是解码失败
  • error 19 是请求错误

因为支付宝小程序是完全支持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

1.2 工具类方法的写入 写入utils/util.js

在项目中,我只封装了时间类,和 条形码,二维码的方法。
具体的导出方法和上面的方式一样。这里留下时间戳的方法记录

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,
}

1.3请求接口地址,统一封装

每个项目中都会请求大大小小的接口地址。因此需要统一存放地址路径。

var connect ={
    KRISLEE:‘�http://www.baidu.com‘
}
module.exports = connect

1.4如何导入

导入是通过import来进行导入模块,引用模块,进行操作

import event from ‘../../event.js’

2、处理app.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)

3、生成条形码和二维码

在这里。我就废话不多说了。附近之后在文章的后面贴上。条形码和二维码的文件库。使用的方法,
使用的方式和方法也很简单。

3.1导入文件库

import 文件库 from xxx.js

3.2生成使用方法

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);
}

3.3 使用

在文件里。我在支付宝小程序里,在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

4、城市的三级联动

4.1需要导入city.js

这是一个城市列表。一般省,直辖市 是第一梯队,一般的市是第二梯队,之后的县,区是第三梯队。如下

{
    "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"
  },

4.2 对city.js的操作

首先需要我们对所有的省市区进行集合操作,把他们归集于一起,方便之后的槽子

// 所有的 省市区 集合  
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地址

相关文章

  • 支付宝小程序-工作日记11/25

    项目准备工作处理app.js和首页的先和问题生成条形码生成二维码城市的三级联动 1、项目准备工作 项目的准备工作做...

  • 支付宝小程序入口

    一、主入口 1、支付宝→朋友→小程序→最近使用 2、支付宝→小程序→推荐 3、支付宝→小程序→附近的小程序 4、支...

  • ”一键生成“模式卷土重来,然而还是不太靠谱!

    微信小程序vs支付宝小程序 9月20日,支付宝小程序正式开始公测。在蚂蚁开放日小程序专场发布会,支付宝小程序拉来了...

  • 58小程序假借SPA名义揽客,或暗藏桃色交易?

    支付宝首页上线「小程序收藏」入口 支付宝上线「小程序收藏」入口。7月31 日,支付宝宣布上线「小程序收藏」入口,「...

  • 支付宝小程序serverless云开发拓荒

    支付宝小程序云开发拓荒: 1. 支付宝小程序准备 支付宝小程序开发就不详细介绍了,从创建小程序,到开发、提审官网有...

  • 支付宝小程序 分析

    参考:支付宝小程序开发官方文档 支付宝小程序有哪些核心数据结构(构造函数和实例) 1 App() 支付宝小程序顶层...

  • 今日早报

    2019年3月11号 星期一 二月初五 小程序 1、支付宝小程序上线“图片内容安全”功能 2、内容类小程序「小年糕...

  • 四、 支付宝小程序——框架(二)

    上一节,我们学会了支付宝小程序全局配置。这一节,我们学习支付宝小程序页面配置Page。 三、 支付宝小程序——框架...

  • 推荐一个小程序

    2017年1月,微信小程序上线2017年10月,支付宝小程序上线2018年7月,百度智能小程序上线2018年11月...

  • 支付宝小程序之复制功能

    支付宝小程序与微信小程序复制功能对比: 1.微信小程序之复制功能 2.支付宝小程序之复制功能

网友评论

      本文标题:支付宝小程序-工作日记11/25

      本文链接:https://www.haomeiwen.com/subject/bqxcbxtx.html