用 uniapp 写个天气的微信小程序和支付宝小程序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
min1214821
V2EX    微信

用 uniapp 写个天气的微信小程序和支付宝小程序

  •  
  •   min1214821 2019-09-10 11:22:40 +08:00 3342 次点击
    这是一个创建于 2227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么是两个小程序,而不是多个平台的、因为注册头条小程序的没有资格就放弃了其他平台的了,为何做此小程序是因为最近刚好有空,用 uniapp 来练练手。

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

    为何选择 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> 


    阳历插件使用
    <script> var time = require('../../utils/utils.js').calendar.solar2lunar(); let day = `${time.cMonth}月${time.cDay} ${time.ncWeek} 农历${time.IMonthCn}${time.IDayCn}` // 9 月 10 星期二 阳历八月十二 </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
    2 条回复    2019-09-11 12:14:27 +08:00
    linxl
        1
    linxl  
       2019-09-10 11:24:50 +08:00
    最近再看小程序的文档, 简直头皮发麻...
    min1214821
        2
    min1214821  
    OP
       2019-09-11 12:14:27 +08:00
    使用的腾讯地图 api,文中百度地图文案出错,不好意思了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1227 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:37 PVG 07:37 LAX 16:37 JFK 19:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86