两天撸两个天气小程序

经过最近两年多的发展,小程序的地位也逐渐越来越高了,各个平台前赴后继做了自家的小程序平台,随着市场的需求越来愈多,我们开发各平台的小程序的激情也随(被)之(逼)高(无)涨(奈)。

选择uniapp来开发。uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。即使不跨端,uni-app同时也是更好的小程序开发框架。来自官方。喜欢taro, wepy,mpvue的朋友也莫喷我,大家各有所好,大家开心就好。

【智行天气】小程序效果图

1、获取位置信息

在定位功能中,本程序用到腾讯地图的api 以及 腾讯天气的api接口, 需要到官网中注册开发者账号,通过注册后得到的appKey来请求我们需要的数据,详细注册步骤请自行度娘 由于需要用到定位功能,uniapp的getLocation方法获取到的是当前位置的坐标,然后对应腾讯地图具体城市

uni.getLocation({
    // #ifdef MP-WEIXIN
    type: 'wgs84',
    // #endif
    async success (res) {
        const {latitude, longitude} = res
        const result = await that.ajax({url: 'https://apis.map.qq.com/ws/geocoder/v1', data: {
            location: `${latitude},${longitude}`,
            key: ''
        }})
        let {province, city, district} = result.result.address_component
        that.getData(province, city, district)
    },
    fail(){
        uni.showModal({
          content: '检测到您没打开定位权限,是否去设置打开?',
          confirmText: "确认",
          cancelText: "取消",
          success: function (res) {
            if (res.confirm) {
              // #ifdef MP-WEIXIN
              wx.openSetting({
                success: (res) => {
                    that.getIn()
                }
              })
              // #endif
              // #ifdef MP-ALIPAY
              my.openSetting({
                 success: (res) => {
                    that.getIn()
                 }
              })
              // #endif
            }
          }
        });
    }
})

2、查询天气

得到城市名后,再用城市名查询天气的接口,得到未来几天的天气预报。 天气接口使用腾讯天气接口api。 在小程序中使用前,要在小程序设置界面,开发设置中添加request合法域名。

methods: {
    async getData(province, city, district){
        const that = this
        const data = await that.ajax({url: 'https://wis.qq.com/weather/common', data: {
            source: 'xw',
            weather_type: 'observe|alarm|air|forecast_1h|forecast_24h|index|limit|tips|rise',
            province: province,
            city: city,
            county: district
        }})
        that.region = [province, city, district]
        if(data.status != 200){
            uni.showToast({
                title: result.message,
                icon: 'none'
            });
            return false;
        }
        if(!data.data.air.aqi_name){
            uni.showToast({
                title: '暂无该地区的天气信息',
                icon: 'none'
            });
            return false;
        }
        that.data = data.data
    }
}

3、小程序界面

由于没有什么审美,缺乏想象力,参考腾讯天气的界面来做的。功能十分简单,查看当前地区的天气和切换其他地区的天气,查看最近24小时的天气情况以及最近6天的天气情况,展示今天的农历时间。

4、插件使用

想快速完成小程序的搭建,里面的折线图采用的uchart.js, 因为可以兼容支付宝小程序和微信小程序,农历查询也是采用的插件calendar.js折线图在支付宝小程序中会有模糊的问题,需要做兼容处理

<template>
<!-- #ifdef MP-ALIPAY -->
<canvas canvas-id="canvas" id="canvas" width="750" height="240" style="width:750rpx;height:240rpx;" class="canvas">
</canvas>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<canvas canvas-id="canvas" id="canvas" class="canvas">
</canvas>
<!-- #endif -->
</template>

<script>
var wxCharts = require('../../utils/chart.js');
lineChart = new wxCharts({
    $this: this,
    canvasId: 'canvas',
    type: 'line',
    categories: ['', '', '', '', '' ,''],
    colors: ['#ffad35', '#4fc3f7'],
    background: '#fff',
    animation: true,
    series: [{
        name: '',
        data: that.max,
        format: function (val, name) {
            return val + '°';
        }
    }, {
        name: '',
        data: that.min,
        format: function (val, name) {
            return val + '°';
        }
    }],
    xAxis: {
        disableGrid: true,
        disabled: true,
        axisLine: false
    },
    yAxis: {
        max: Math.max.apply(Math, that.max) * 1 + 0.1,
        disabled: true,
        disableGrid: true,
    },
    legend:{ 
        show: false 
    },
    // #ifdef MP-ALIPAY
    pixelRatio: that.pixelRatio, // 解决支付宝模糊问题
    // #endif
    width: that.cWidth,
    height: that.cHeight
});
</script>

微信小程序有城市选择组件,支付宝的没有可以直接使用的城市组件,uniapp官方介绍:支持安装 mpvue 组件,但npm方式不支持小程序自定义组件(如 wxml格式的vant-weapp),找到一款支付宝可以使用的城市插件:mpvue-citypicker, 城市选择组件

<template>
    <view class="txt-location" @tap="showCityPicker">
        <view class="icon"></view>
        <block v-if="region.length">{{region[0]}}{{region[1]}}{{region[2]}}</block>
        <block v-else>选择城市</block>
        <!-- #ifdef MP-WEIXIN -->
        <picker class="city" mode="region" @change="handleChange" :value="region">
            <view class="picker">
                当前选择:{{region[0]}},{{region[1]}},{{region[2]}}
            </view>
         </picker>
        <!-- #endif -->
    </view>
    <mpvue-city-picker ref="mpvueCityPicker" :pickerValueDefault="pickerValueDefault" @onConfirm="onConfirm"></mpvue-city-picker>
</template>

<script>
import mpvueCityPicker from 'mpvue-citypicker';
export default {
  data() {
    return {
      region: [],
      pickerValueDefault: [0, 0, 1]
    };
  },
  components: {
    mpvueCityPicker
  },
  methods: {
    showCityPicker() {
        // #ifdef MP-ALIPAY
        this.$refs.mpvueCityPicker.show()
        // #endif
    },
    onConfirm(e) {
        if(e.label){
            this.region = e.label.split('-')
            this.getData(this.region[0], this.region[1], this.region[2])
        }
    },
    handleChange(e) {
        this.region = e.detail.value
        this.getData(this.region[0], this.region[1], this.region[2])
    }
  }
};
</script>

总结

  1. 界面很快就搭建完成,提供了较为完整的组件以及各种API2
  2. 天气接口查询的腾讯天气的,需要做过滤处理才能使用,某些地区查询天气没有返回需要友情提示处理
  3. 第一次做支付宝小程序遇到的坑不少,例如图表模糊,城市选择组件需要自己做,消息提示框uni.showToast使用时需要兼容,支付宝不能使用duration字段,获取位置uni.getLocation使用时也需要兼容,支付宝不能使用type字段等。
  4. 程序的提交审核比较快,我的大概是用了一天的时间就申请好了。但是支付宝审核比较慢
  5. 后续将代码放到https://github.com/galan99
原文链接:segmentfault.com

上一篇:vue本地打包build之后dist文件下的index.html不显示内容报错Failed to load resource
下一篇:tumbler

相关推荐

  • 高级程序设计:第7章-函数表达式

    函数表达式是JavaScript中的一个既强大又容易令人困惑的特性。 定义函数表达式的方法 1.函数声明 先有function关键字,然后是函数的名字,就是指定函数名的方式。

    1 年前
  • 高程读书笔记 第六章 面向对象程序设计

    本章内容 ECMA262把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数 理解对象 创建对象 创建自定义对象的最简单方式就是创建一个Object的实例,再为它添加属性和方...

    2 年前
  • 马蜂窝旅游小程序

    前言 前段时间学习了关于微信小程序的开发,光说不练假把式,所以就打算自己手撸一个微信小程序,而网上电商类小程序太多了,所以就选择了旅游攻略类小程序来练手。这是我第一次写小程序和第一次写文章,不足之...

    1 年前
  • 首次实战小程序遇到的坑

    在我的强烈要求下,产品终于决定开发一款小程序了,以下是一些开发心得 1.在正式进入开发前,花了两个多小时的时间,阅读了开发文档,不得不说,在此大赞腾讯的开发文档,简单明了 2.拿到设计图,是一倍的...

    2 年前
  • 项目中引入特殊字体【小程序、h5】包括canvas画图

    请看清楚我虚线下面所有的话。 横线上的废话随便你看不看。 说实话这个字体已经把我折腾的死去活来了一段时间,而且我们项目还经常要画分享图去刷朋友圈,默认字体没办法达到设计的那种效果,查了不少资料,也自己...

    1 年前
  • 顶级测试框架Jest指南:跑通一个完美的程序,就是教出一群像样的学生

    facebook三大项目:yarn jest metro,有横扫宇宙之势。 这个项目的宗旨为:减少测试一个项目所花费的时间成本和认知成本。 ——其实,它在让你当一个好老师。

    2 年前
  • 革命性小程序框架 Remax 发布 2.0

    经过一段时间的开发,我们很高兴地向大家介绍支持 Web 应用构建的 Remax 2.0。 支持 Web 应用构建 得益于 Remax One 的设计,现在基于 Remax One 构建的应用可以编译到...

    25 天前
  • 面向对象的程序设计——理解对象

    面向对象的程序设计 ECMA262 把对象定义为:无须属性的集合,其属性可以包含基本值、对象或者函数。 理解对象 属性类型 ECMAScript 中有两种属性:数据属性和访问器属性,...

    2 年前
  • 面向对象的程序设计——创建对象

    1.普通对象声明 创建自定义对象的最简单方式就是创建一个的实例,然后在为他们添加属性和方法,如下所示: 的含义: 1. 表示当前作用域下的对象; 2. 表示实例化出来的那个对象; 3....

    2 年前
  • 随着nativescript Appium测试应用程序

    Zakaria Acharkiuser70192(https://stackoverflow.com/users/4281779/zakariaacharki)提出了一个问题:Testing Nati...

    2 年前

官方社区

扫码加入 JavaScript 社区