小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本。

语法和之前一样。只是一些用法和名字(标签)发生了一些变化。

小程序主要就四种扩展名的文件:js,json,wxml,wxss

JS,小程序的功能实现文件,和普通的JavaScript没什么区别,更多的是加入了一些微信扩展的方法,可以与微信进行一些交互。

JSON,小程序的配置文件,也比较简单,格式和之前熟知的JSON文本文件没有区别,在小程序里主要也是用于配置环境和属性等。

WXSS,小程序的样式文件,语法和普通的CSS没啥区别,直接上手就用即可。

WXML,这个语法上和HTML没区别,也是标签类语言,只是标签名字有变化,同时不像HTML标签只是含义不同,默认样式不同,是真正具备一定的功能的。

所以,小程序理论上,了解了WXML标签读含义和功能,了解了微信提供的哪些接口交互。再了解一下小程序的机制,基本上就算是会小程序了。

这里,用微信小程序和百度地图提供的天气接口,来简单说一说,如何做一款自己的简单的微信小程序

一、准备工作

  账号申请

  ※ 微信公众平台的账号申请:https://mp.weixin.qq.com/

  ※ 百度地图开放平台帐号申请:http://lbsyun.baidu.com/

  开发微信小程序,是必须要在微信公众帐号平台注册的,并找到AppID(小程序ID),这个是核心所有小程序开发都要有。

  这个是关键的东西,小程序需要在微信提供的“微信web开发者工具”,这个工具需要微信登录,所有小程序项目开发必须要输入AppID。

  微信公众平台帐号申请完成之后,登录。

  左菜单【开发->开发设置】中,就可以看到AppID,是一串类似于乱码的字符串。类似这样:wx123abc456bcd789cde

  在微信开发工具中,需要的地方,填入这个AppID即可。

  百度地图开放平台申请帐号的目的是为了获取一个访问应用(AK),这个AK是关键,任何调用百度地图相关接口时需要使用这个AK初始化接口。

  进入控制台,应用列表里,就可以根据页面的提示,自行操作,创建一个或者多个AK,不同项目申请不同的AK。

  这两部分准备工作做好之后,就可以正式开始开发小程序了。

二、第一个小程序

  这个不需要做什么操作,只要打开“微信web开发者工具”,创建一个小程序项目,就会得到一个最基本的小程序项目

  直接编译就可以通过模拟器部分看到一个hello world的小程序

  自行调试,测试,看看这第一个程序源码即可。当然最基本的地方是非常简单的。代码有编程基础的人都能看懂。

  其中,只有获取当前微信信息的部分稍微绕了一点。尤其是那个莫名奇妙的“回调程序”。

  不过好在,短期内不理解,可以直接使用,随着日后逐渐开发反复调用,慢慢可以摸索。

三、微信小程序(百度地图API)天气预报

  先说下大致的思路:

  主要是两部分:定位授权和天气数据获取

  在页面加载时,先验证当前是否有用户授权定位信息,如果没有,则提示,并引导用户授权定位信息。

  接下来,如果用户已经授权定位信息之后,则调用一些列天气相关的接口,获取相应的数据,部分数据或许需要二次处理,然后保存到当前功能文件的data中。

  页面渲染时,会根据data中的值,或显示显示,或隐藏标签,或者显示具体的数据。

  

  开始说实例,首先,pages目录里的logs相关的都可以删除,app.json配置里的也同样,基本上和logs有关的这次都不需要,只保留index相关即可

  当然根目录下的不要删除。

  先说不是主要的部分

  1、配置文件xxx.json文件

{
"backgroundColor": "#bbb",
"usingComponents": {},
"enablePullDownRefresh": true,
"navigationBarTitleText": "百度天气"
}
这个文件,主要就是配置页面的,具体需要什么,自己看微信提供的说明
 
2、模板文件xxx.wxml
  1. <loading hidden="{{loadingStatus}}">
  2. 加载中...
  3. </loading>
  4. <view wx:if="{{userLocation == 3}}" class="box weather_bg list_left">
  5. <text class='tips' bindtap='refreshCurrentPage'>
  6. 定位异常,无法正确获取您的定位信息\n
  7. 1.请重新刷新页面\n
  8. 2.尝试换个地方重新刷新页面\n
  9. 3.晚些时候再刷新页面\n
  10. 4.非中国境内,无法正确获取\n
  11. 5.如果上述操作依然存在问题,请联系作者
  12. </text>
  13. </view>
  14. <view wx:if="{{userLocation == 2}}" class="box city_title list_center">
  15. <text class='tips' bindtap='refreshCurrentPage'>
  16. 没有授权获取定位信息,功能无法使用\n
  17. 确认授权后,请下拉或者点击文字刷新获取数据
  18. </text>
  19. <button class='btn' bindtap='gotoAuthPage'>点击开启授权</button>
  20. </view>
  21. <view wx:elif="{{userLocation == 1}}">
  22. <view class="box city_title">
  23. <view class="city">{{cityInfo.addressComponent.city}}</view>
  24. <view class="pos">( {{cityInfo.location.lat}} , {{cityInfo.location.lng}} )</view>
  25. </view>
  26. <view class="box city_info">
  27. <view>地址:{{cityInfo.formatted_address}}</view>
  28. <view>邮编:{{cityInfo.addressComponent.adcode}}</view>
  29. <view>周边:{{cityInfo.business}}</view>
  30. </view>
  31. <view class='box weather_title'>天气情况</view>
  32. <view class="box weather_info">
  33. <view class='f_red'>{{weatherInfo.date}}</view>
  34. <view>
  35. <text class='f_black'>{{weatherInfo.weatherDesc}}</text>
  36. <text class='ml20'>{{weatherInfo.temperature}}</text>
  37. <text class='ml20'>{{weatherInfo.wind}}</text>
  38. </view>
  39. <view>PM2.5:{{weatherInfo.pm25}}</view>
  40. </view>
  41. <block wx:for="{{weatherInfoExt}}" wx:key="index">
  42. <block wx:if="{{index > 0}}">
  43. <view class="box weather_info">
  44. <image wx:if="{{currentTime >= '06' && currentTime < '18'}}" src='{{item.dayPictureUrl}}' mode="aspectFill" class='pic'></image>
  45. <image wx:else src='{{item.nightPictureUrl}}' mode="aspectFill" class='pic'></image>
  46. <text class='ml20'>{{item.date}}</text>
  47. <text class='ml20'>{{item.temperature}}</text>
  48. <text class='ml20'>{{item.weather}}</text>
  49. <text class='ml20'>{{item.wind}}</text>
  50. </view>
  51. </block>
  52. </block>
  53. </view>

这个模板文件,主要分成四个部分:加载浮层、定位异常提示、未授权提示、正常天气预报展示

简单说明:

loading标签,效果是一个特效,一个“loading...”的浮层浮在手机页面上,数据和页面加载完成之后,可以控制其隐藏

wx:if="{{userLocation == 3}}"相关标签,这个部分是当获取定位信息失败,或者超出接口范围时,显示提示信息

wx:if="{{userLocation == 2}}"相关标签,这个部分是当前用户没有授权定位信息,展示的提示信息,并提供授权引导按钮

剩下的标签代码,就是正常的天气信息显示的部分。

页面上所有用{{}}这种双大括号括起来的都是变量标签,用于获取变量信息的,例如:{{userLocation == 2}}读出变量usesrLocation的值和2比较大小

这些变量的值,都来自于xxx.js文件的Page->data里边定义的变量。

3、样式文件xxx.wxss

  1. page{
  2. padding:;
  3. background: #fdfdfd;
  4. }
  5. view{
  6. font-size: 32rpx;
  7. color: #333;
  8. font-family: "微软雅黑";
  9. }
  10. image{
  11. text-align: center;
  12. vertical-align:middle;
  13. }
  14. /* 通用部分 */
  15. .box{
  16. margin: 24rpx;
  17. padding: 24rpx;
  18. line-height: 180%;
  19. }
  20. .box_bg {
  21. background: #f0f6fa;
  22. }
  23. .list_left{
  24. text-align: left;
  25. line-height: 100%;
  26. padding-left: 40rpx;
  27. }
  28. .list_center{
  29. text-align: center;
  30. line-height: 100%;
  31. padding:;
  32. }
  33. /* 城市信息部分 */
  34. .city_title{
  35. align-items: center;
  36. display: flex;
  37. flex-direction: column;
  38. margin: -8rpx 0 -20rpx 0;
  39. padding-bottom:;
  40. }
  41. .city_title .btn{
  42. margin-top: 30rpx;
  43. font-size: 28rpx;
  44. color: #000;
  45. }
  46. .city_title .city{
  47. font-size: 36rpx;
  48. color: #000;
  49. }
  50. .city_title .pos{
  51. font-size: 32rpx;
  52. }
  53. .city_info{
  54. border: 1px solid #efefef;
  55. }
  56. /* 天气信息部分 */
  57. .weather_title{
  58. margin-bottom: -16rpx;
  59. padding-bottom:;
  60. }
  61. .weather_info{
  62. color: #555;
  63. border: 1px solid #efefef;
  64. }
  65. .weather_info .pic{
  66. padding:;
  67. margin:-4px 0 0 0;
  68. width:22px;
  69. height:16px
  70. }
  71. .weather_info .f_red{
  72. color: red;
  73. }
  74. .weather_info .f_black{
  75. color:black;
  76. }
  77. .weather_info .ml20{
  78. margin-left: 20rpx;
  79. }
这些样式的写法,都是正常的CSS的写法,使用规则和CSS没有任何区别,就不做说明了。
 
4、功能文件xxx.js
  1. // 获取全局app.js中的内容
  2. const app = getApp();
  3. // 引用工具文件
  4. var util = require('../../utils/util.js');
  5. // 引用百度地图提供的接口JS文件
  6. var bmap = require('../../utils/bmap-wx.min.js');
  7.  
  8. Page({
  9. // 数据初始化
  10. data: {
  11. loadingStatus: false,
  12. userLocation: 0, // 0默认没有状态,1获取到用户定位,2用户拒绝提供定位信息,3无法获取正确定位
  13. cityInfo: {}, //城市信息
  14. weatherInfo: {}, //天气信息
  15. weatherInfoExt: {}, //天气扩展信息
  16. currentTime:'' // 当前时间
  17. },
  18.  
  19. // 更新用户的位置获取的状态
  20. updateUserLocation: function (v) {
  21. this.setData({
  22. loadingStatus: true,// 加载完成,隐藏加载动画
  23. userLocation: v //更新当前页面的变量值
  24. });
  25. },
  26.  
  27. // 跳转到授权页面
  28. gotoAuthPage: function(){
  29. wx.openSetting({
  30. fail: function () {
  31. wx.showModal({
  32. title: '操作失败',
  33. content: '请到微信中自行设置授权操作',
  34. confirmText: '知道了',
  35. confirmColor: '#345391',
  36. showCancel: false
  37. })
  38. }
  39. });
  40. },
  41.  
  42. // 刷新当前页面(相当于下拉刷新页面)
  43. refreshCurrentPage: function(){
  44. wx.startPullDownRefresh({});
  45. },
  46.  
  47. // 获取地理位置和天气的方法
  48. getLocationAndWeather: function () {
  49. var that = this;
  50. // 使用百度地图提供的ak标记,初始化地图数据
  51. var BMap = new bmap.BMapWX({
  52. ak: app.globalData.bmap_ak
  53. });
  54. // 失败执行的方法
  55. var fail = function (data) {
  56. if (data.errMsg == 'getLocation:fail auth deny') {
  57. // 更新页面状态为2,用户拒绝提供位置信息
  58. that.updateUserLocation(2);
  59. }else{
  60. // 更新页面状态为3,获取定位信息错误,或者定位不在大陆境内
  61. that.updateUserLocation(3);
  62. }
  63. };
  64. // 获取城市信息成功执行的方法
  65. var regeocoding_success = function (data) {
  66. // 获取地址数据
  67. var city_info = data.originalData.result;
  68. // 二次处理数据,将经纬度的数据,保留四舍五入保留五位小数
  69. city_info.location.lat = city_info.location.lat.toFixed(5);
  70. city_info.location.lng = city_info.location.lng.toFixed(5);
  71. // 更新页面状态为1,用户允许授权定位信息
  72. that.updateUserLocation(1);
  73. // 将相关数据,写到初始化的data数据中
  74. that.setData({
  75. cityInfo: city_info
  76. });
  77. };
  78. // 获取天气成功执行的方法
  79. var weather_success = function (data) {
  80. // 获取天气基本数据
  81. var weatherInfo = data.currentWeather[0];
  82. // 获取天气扩展信息
  83. var weatherInfoExt = data.originalData.results[0].weather_data;
  84. // 将天气预报数据写入定义(初始化)的变量中
  85. that.setData({
  86. weatherInfo: weatherInfo,
  87. weatherInfoExt: weatherInfoExt
  88. });
  89. // 天气获取成功之后,再调用其他数据(regeocoding接口有BUG,没有数据依然返回成功状态)
  90. // 调用接口获取城市地区信息
  91. BMap.regeocoding({
  92. fail: fail,
  93. success: regeocoding_success
  94. });
  95. };
  96. // 调用接口获取天气信息
  97. BMap.weather({
  98. fail: fail,
  99. success: weather_success
  100. });
  101. },
  102.  
  103. // 加载执行
  104. onLoad: function () {
  105. app.checkUserLocation();
  106. // 获取当前时间,并拆分成日期和时间两部分
  107. var current_time = util.formatTime(new Date()).split(' ');
  108. // 将时间部分记录,用于判断早晚
  109. this.setData({
  110. currentTime: current_time[1]
  111. });
  112. // 调用获取天气和地理位置的方法
  113. this.getLocationAndWeather();
  114. },
  115.  
  116. // 下拉页面执行页面刷新
  117. onPullDownRefresh: function () {
  118. wx.showNavigationBarLoading(); // 显示顶部刷新图标
  119. this.getLocationAndWeather(); // 调用获取天气和地理位置的方法
  120. wx.hideNavigationBarLoading(); // 隐藏导航栏加载框
  121. wx.stopPullDownRefresh(); // 停止下拉动作
  122. }
  123.  
  124. })

基本上所有的功能都是在js文件中完成的。

简单说明:

const app = getApp(); 这个定义,就是可以通过app这个常量,可以调用app.js文件中的变量和方法。
var util = require('../../utils/util.js'); 

将utils目录里的util.js文件引入到当前页面,同时,可以通过util这个变量访问该文件声明开放的方法。此文件默认自带

var bmap = require('../../utils/bmap-wx.min.js'); 将百度地图API的文件引入当前页面,同时可以使用bmap变量使用其对外声明的方法。此文件需要百度平台下载
ak: app.globalData.bmap_ak 这个需要把自己的ak值(来自百度地图开放平台)放到这里,才可以正常使用。
 
因为所有代码,几乎每一句话都有注释,所以就不做详细的说明了。
 
注意:百度地图提供的接口 BMap.regeocoding 是有问题的,所以,先调用了那个weather接口,其返回成功之后,再调用regeocoding方法,否则在特定情况下(比如定位非国内等)会错误。
 
附上app.js的代码,因为上边的js文件中有使用其中的方法,当然也可以都移植到xxx.js文件中。
  1. App({
  2. globalData: {
  3. userInfoAuth: 0,//0无状态,1用户已经授权用户信息,2用户拒绝授权用户信息
  4. // 用户信息
  5. userInfo: null,
  6. // 百度地图提供的AK串
  7. bmap_ak: '百度地图开放平台的AK值',
  8. // cur_city_id: '' // 用于记录城市ID,在切换城市时,将目标城市ID记录,需要时读取
  9. },
  10.  
  11. // 监听初始化
  12. onLaunch: function () {
  13.  
  14. },
  15.  
  16. onShow: function () { },//监听显示(进入前台)
  17. onHide: function () { },//监听隐藏(进入后台:按home离开微信)
  18.  
  19. // 设置所在地(城市)
  20. // setLocal: function (id, val) {
  21. // wx.setStorageSync(id, val);//API:设置本地缓存,将数据存储在本地缓存中
  22. // },
  23.  
  24. // 用户位置授权验证及操作
  25. checkUserLocation: function () {
  26. var that = this;
  27. // 获取授权信息
  28. wx.getSetting({
  29. success: function (res) {
  30. // 判断是否已经操作过授权操作
  31. if (res.authSetting.hasOwnProperty("scope.userLocation")) {
  32. if (res.authSetting["scope.userLocation"] == true) {
  33. // 已经授权位置信息,暂时无操作
  34. } else {
  35. // 没有授权位置信息,弹出选择框提示用户选择操作
  36. wx.showModal({
  37. title: '信息授权',
  38. content: '提示:位置授权暂未开启,无法获取相关信息',
  39. confirmText: '开启授权',
  40. cancelText: '仍然拒绝',
  41. // confirmColor: '#345391',
  42. cancelColor: '#666',
  43. success: function (res) {
  44. if (res.confirm) {
  45. // 用户选择“允许”,则开启授权页面
  46. wx.openSetting({
  47. fail: function () {
  48. wx.showModal({
  49. title: '操作失败',
  50. content: '请到微信中自行设置授权操作',
  51. confirmText: '知道了',
  52. confirmColor: '#345391',
  53. showCancel: false
  54. })
  55. }
  56. })
  57. }
  58. // 用户选择“拒绝”,则弹层提示无法获取数据
  59. if (res.cancel) {
  60. wx.showModal({
  61. title: '授权失败',
  62. content: '无法使用定位权限,不能获取到数据',
  63. confirmText: '知道了',
  64. confirmColor: '#345391',
  65. showCancel: false
  66. })
  67. }
  68. }
  69. })
  70. }
  71. } else {
  72. // 还没有操作位置授权,暂时不做处理
  73. }
  74. }
  75. })
  76. }
  77.  
  78. })

所有代码都是可以直接复制使用,放到小程序里就可以执行了。但是需要自己申请小程序AppID和百度的ak值。

附效果图:

微信小程序,天气预报(百度地图开放平台API)的更多相关文章

  1. 微信小程序转百度小程序修改

    百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...

  2. 1个多商户、多平台版 微信小程序(多商户、多平台版),影城行业、影业连锁 多商户、多平台版微信小程序。(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本)

    1个 影城行业 微信小程序(多商户.多平台版), 影业连锁 多商户.多平台版微信小程序.(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本) 资讯QQ: 876635409  ...

  3. 微信小程序转换为百度小程序

    据粗略预估,微信小程序和百度小程序,有至少90%以上的相似代码,而且api的参数和返回的数据都是一致的,有一些不一致的将做如下介绍:.wxml文件,改成后辍名.swan.wxss文件,改成后辍名为.c ...

  4. 微信小程序转百度小程序代码

    听说百度小程序开始出现手机端搜索流量,作为SEO一员,必须搞他.但是又奈何之前做的都是微信小程序,所以用php写了一个微信小程序转百度小程序代码. 修改文件后缀名 .wxml转换为.swan .wxs ...

  5. 微信小程序接入百度OCR(身份证识别)

    微信小程序接入百度OCR(身份证识别) 1.接口描述 支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名.性别.民族.出生日期.住址.身份证号.签发机关.有效期限,识别准确率超过99%:同 ...

  6. 微信小程序-基于高德地图API实现天气组件(动态效果)

    微信小程序-基于高德地图API实现天气组件(动态效果) ​ 在社区翻腾了许久,没有找到合适的天气插件.迫不得已,只好借鉴互联网上的web项目,手动迁移到小程序中使用.现在分享到互联网社区中,帮助后续有 ...

  7. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...

  8. 微信小程序入门与实战 常用组件API开发技巧项目实战*全

    第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...

  9. 微信小程序接入百度统计

    一. 百度统计添加应用,获取appkey和微信小程序统计sdk: 1. 百度统计首页,点击“我的全部应用”右侧的添加按钮: 2. “应用类型”选择小程序统计,选择微信小程序,填写应用名称信息,选择内容 ...

随机推荐

  1. ECharts(中国地图篇)的使用

    代码html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <me ...

  2. 扫描系统进程和获取某进程的PID

    扫描系统的所有进程 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> int scan() ...

  3. 项目中的java文件没有在WEB-INF\classes中生成class文件

    https://blog.csdn.net/u011008029/article/details/49303723 病因: 我在eclipse 上面  编的web  项目 并没有错 但是 一直出现 5 ...

  4. Node.js的进程管理

    众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进 ...

  5. 【python】——sql模拟

    一.作业需求: 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支 ...

  6. Flv视频格式如何转换成MP4格式

    如何将flv视频格式转换成MP4格式呢?随着现在视频格式的不断多样化,视频格式转换的问题也成了现在生活中常见的问题,那么我们应该怎样将flv视频格式转换成MP4格式呢?下面我们就一起来看一下吧. 操作 ...

  7. Codeforces 1089E - Easy Chess - [DFS+特判][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem E]

    题目链接:https://codeforces.com/contest/1089/problem/E Elma is learning chess figures. She learned that ...

  8. J2EE [web] 403.500.404页面配置

    如果想让系统在出错后,看到自定义的错误提示页面,而不是满屏错误原因以及代码. 1.web.xml中 <error-page> <error-code>403</error ...

  9. [ipsec][strongswan] 用strongswan pki工具生成自签名证书

    如题.我在实验环境里,分别要为两个endpoint(T9和T129)生成证书. 证书是如何生成的呢? 证书是由根证书机构签发的.申请证书的人将request提交给根证书机构,然后根证书机构根据requ ...

  10. DBMS_METADATA.set_transform_param格式化输出

    DBMS_METADATA.set_transform_param格式化输出获得DDL --输出信息采用缩排或换行格式化 EXEC DBMS_METADATA.set_transform_param( ...