笔记来源:拉勾教育 - 大前端就业集训营
文章内容:学习过程中的笔记、感悟、和经验
提示:项目实战类文章资源无法上传,仅供参考
小项目尝试开发
预览 / 真机调试
预览:可以在手机端模拟打开小程序查看效果
真机调试:在手机端打开小程序后,当修改代码后会自动同步
注意:预览时会自动上传代码,最大2M,大于2M会报错
数据接口
申请接口
- 后端工程师 - Express开发
- 模拟接口(Mock -API) - 例如:rap2等
- 第三方接口 - 例如:和风天气(本案例使用)
和风天气
- 注册账号
- 创建应用:和风天气控制台 => 应用管理 => 创建应用
- 申请密钥:应用创建后点击添加数据KEY
- key是调用接口的凭证
- 开发集成
- 请求接口的语法
- 返回数据的示例
具体API可参考和风天气开发文档
调试接口
使用接口调试工具进行需要使用的接口调试,课程使用的是insomnia,我这里使用ApiPost进行调试,国产软件,语言比较友好
调用接口
小程序中调用接口使用wx.request()
云API
小技巧:全局配置中pages第一个页面路径就是默认加载路径
wx.request({
// 请求地址
url: 'https://devapi.qweather.com/v7/weather/3d',
// 请求参数
data: {
location: '101010100',
key: '75174c6785044e3d91b7e1bc457ae702'
},
// 请求头
header: {
// 默认返回JSON
'content-type': 'application/json' // 默认值
},
// 请求成功
success (res) {
console.log(res.data)
}
})
报错内容:xxxx不在以下 request 合法域名列表中
,不解决无法获取数据
- 解决方案:
- 开发阶段:不校验合法域名
- 微信开发者工具 => 详情 => 本地设置 => 不校验合法域名
- 上线阶段:绑定请求接口域名
- 小程序管理后台 => 开发设置 => 服务器域名 =>添加合法域名
- 开发阶段:不校验合法域名
单独封装请求
// 接口地址
const BASE_URL = "https://devapi.qweather.com/v7"
// 应用 key
const KEY = "687e517f06684448a9f4695721414a07"
/**
* API 请求函数
* 参数:url地址,请求方式,请求参数
*/
const request = (url, method, data) => {
// 请求参数上添加我的和风天气KEY
data.key = '75174c6785044e3d91b7e1bc457ae702'
// 返回一个Promise包装后的返回数据
return new Promise((resovle, reject) => {
// 调用小程序API获取数据
wx.request({
// url地址,使用通用请求地址加上接口独有地址
url: BASE_URL + url,
// 请求方式
method,
// 请求参数
data,
// 请求头
header: {
// 默认返回json数据
'content-type': 'application/json'
},
// 请求成功触发promise请求成功方法,传递参数
success (res) {
resovle(res.data)
},
// 请求失败触发promise请求失败方法,传递错误
fail (err) {
reject(err)
}
})
})
}
// 导出
module.exports = {
// 获取三天天气方法,参数:请求参数
threeDays: (data) => {
// 调用上面封装的方法,传入请求地址、请求方法、请求参数
return request('/weather/3d', 'get', data)
}
}
页面中引入API接口
// pages/qweather/qweather.js
// 获取和风天气封装接口
const HFAPI = require('../../utils/api')
Page({
/**
* 页面的初始数据
*/
data: {
// 当前经纬度
location: '',
// 三天天气数据
threeDays: [1,2,3]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 绑定一下this,方便后面调用
const that = this
// 小程序获取当前位置API
wx.getLocation({
type: 'wgs84',
success (res) {
// 维度
const latitude = res.latitude
// 经度
const longitude = res.longitude
// 修改data数据
that.setData({
// 经纬度拼接
location: longitude + ',' + latitude
})
// 获取三天数据,成功后保存数据到data
HFAPI.threeDays({location: that.data.location}).then(res => {
if(res.code === '200') that.setData({threeDays: res.daily})
})
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
报错内容:getLocation需要在app.json中声明permission字段
解决方案:在app.json中声明permission字段,添加字段后获取位置时会弹出提示,点击确认授权后才能获取真实位置
-
"permission": { "scope.userLocation": { "desc": "尝试获取位置信息" } }
项目界面
官方组件:微信小程序官方提供的组件
微信团队推出的第三方组件 - WeUI
-
下载:gitHub下载地址
-
引入:
- 解压后,找到
dist/style/
下面的weui.wxss
文件 - 将文件复制到小程序根目录
- 在全局样式文件 -
app.wxss
中引入即可 -@import 'weui.wxss';
- 解压后,找到
-
使用:
- 通过微信开发者工具打开解压后的dist目录,下面有样例代码
- 也可以通过网站查看效果
地图和列表
- 使用WeUI的列表组件添加列表
- 使用小程序提供的地图组件添加地图
<!--pages/qweather/qweather.wxml-->
<view class="container">
<!-- 顶部地图,设置经纬度、标记、缩放比例 -->
<map name="" longitude='{{longitude}}' latitude='{{latitude}}' markers='{{markers}}' scale="14"
style="width: 100%; height: 160px"></map>
<!-- 图文列表,暂时不处理 -->
<view class="weui-panel weui-panel_access">
<view class="weui-panel__hd">图文组合列表</view>
<view class="weui-panel__bd">
<a class="weui-media-box weui-media-box_appmsg">
<view class="weui-media-box__hd">
<image class="weui-media-box__thumb" src="" alt></image>
</view>
<view class="weui-media-box__bd">
<h4 class="weui-media-box__title">标题一</h4>
<view class="weui-media-box__desc">由各种物质组成的巨型球状天体,叫做星球。星球有一定的形状,有自己的运行轨道。</view>
</view>
</a>
<a class="weui-media-box weui-media-box_appmsg">
<view class="weui-media-box__hd">
<image class="weui-media-box__thumb" src="" alt></image>
</view>
<view class="weui-media-box__bd">
<h4 class="weui-media-box__title">标题二</h4>
<view class="weui-media-box__desc">由各种物质组成的巨型球状天体,叫做星球。星球有一定的形状,有自己的运行轨道。</view>
</view>
</a>
</view>
<view class="weui-panel__ft">
<a class="weui-cell weui-cell_active weui-cell_access weui-cell_link">
<view class="weui-cell__bd">查看更多</view>
<text class="weui-cell__ft"></text>
</a>
</view>
</view>
</view>
// pages/qweather/qweather.js
// 获取和风天气封装接口
const HFAPI = require('../../utils/api')
Page({
/**
* 页面的初始数据
*/
data: {
// 经度
longitude: '',
// 维度
latitude: '',
// 当前经纬度
location: '',
// 三天天气数据
threeDays: [1, 2, 3],
// 地图标记
markers: []
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 绑定一下this,方便后面调用
const that = this
// 小程序获取当前位置API
wx.getLocation({
type: 'wgs84',
success(res) {
// 维度
const latitude = res.latitude
// 经度
const longitude = res.longitude
// 修改data数据
that.setData({
// 经度
longitude,
// 维度
latitude,
// 经纬度拼接
location: longitude + ',' + latitude,
// 地图标记,从课程中复制的
markers: [{
id: "0",
latitude: latitude,
longitude: longitude,
iconPath: "/static/images/location.png",
width: 40,
height: 40,
callout: {
'display': 'ALWAYS',
'fontSize': '30rpx',
'content': '我在这',
'padding': '8rpx',
'boxShadow': '0 0 5rpx #333',
'borderRadius':'4rpx'
}
}]
})
// 获取三天数据,成功后保存数据到data
HFAPI.threeDays({
location: that.data.location
}).then(res => {
if (res.code === '200') that.setData({
threeDays: res.daily
})
})
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
功能组合(上)
- 将数据接口和项目界面组合在一起
- 添加判断条件,数据获取成功设置data,否则弹出提示
- 遍历获取到的三天天气数据,创建列表结构,查看更多不要
- 遍历的时候如果没设置名字,默认使用item
- 和风天气给的图片是编码,需要我们自己下载使用,然后拼接使用
<!--pages/qweather/qweather.wxml-->
<view class="container">
<!-- 顶部地图,设置经纬度、标记、缩放比例 -->
<map name="" longitude='{{longitude}}' latitude='{{latitude}}' markers='{{markers}}' scale="14"
style="width: 100%; height: 160px"></map>
<!-- 图文列表,暂时不处理 -->
<view class="weui-panel weui-panel_access">
<view class="weui-panel__hd">图文组合列表</view>
<view class="weui-panel__bd">
<!-- 遍历三天天气数据,wx:for - 遍历,wx:key - 设置key,好想随便写都可以 -->
<a class="weui-media-box weui-media-box_appmsg" wx:for="{{threeDays}}" wx:key='abc'>
<view class="weui-media-box__hd">
<!-- 图片地址你用和风天气提供图标库 -->
<image class="weui-media-box__thumb" src="../../static/hfIcon/{{item.iconDay}}.png" alt></image>
</view>
<view class="weui-media-box__bd">
<!-- 绑定数据 -->
<h4 class="weui-media-box__title">{{item.fxDate}}</h4>
<view class="weui-media-box__desc">最高温度:{{item.tempMax}} - 最低温度:{{item.tempMin}}</view>
</view>
</a>
</view>
</view>
</view>
<!-- 引入模版,src属性即模版文件路径 -->
<import src='../../tpl/my-footer'></import>
<!-- 使用模版,is即模版name名称,data可以使用数据 -->
<template is='my-footer' data=''></template>
功能组合(下)
WXML模版
一些公共的页面结构,比如说页头、页脚、等信息,都是一样的,可以使用模版功能创建模版,在需要的页面调用即可
<!-- 创建模版 -->
<template name='my-footer'>
<!-- 模版内容 -->
<view class="weui-footer weui-footer_fixed-bottom">
<view class="weui-footer__links">
<a href="javascript:home();" class="weui-footer__link">感谢和风天气</a>
</view>
<view class="weui-footer__text">拉勾教育提供支持</view>
</view>
</template>
<!-- 页面的wxml文件底部使用模版 -->
................
<!-- 引入模版,src属性即模版文件路径 -->
<import src='../../tpl/my-footer'></import>
<!-- 使用模版,is即模版name名称,data可以使用数据 -->
<template is='my-footer' data=''></template>
移动端API
例如去拍照、扫一扫等功能,需要调用移动端API接口实现,在web端无法调用
<!--index.wxml-->
<view class="container">
<!-- 去拍照按钮 -->
<button type="primary" bindtap="toCamear">去拍照</button>
<!-- 扫一扫按钮 -->
<button type="primary" bindtap="bindScan">扫一扫</button>
<!-- 展示扫一扫结果 -->
<text>{{scanResult}}</text>
</view>
// index.js
// 获取应用实例
const app = getApp()
Page({
data: {
// 扫一扫结果
scanResult: ''
..............
},
.................
// 跳转拍照页面
toCamear: () => {
// 小程序API
wx.navigateTo({
// 跳转页面
url: 'camear',
})
},
// 调用扫一扫接口
bindScan: function() {
// 微信扫一扫API
wx.scanCode({
// 成功后调用
success: (res) => {
console.log(res)
// 修改数据
this.setData({
scanResult: res.result
})
}
})
},
})
<!--pages/index/camear.wxml-->
<view class="swiper-view">
<!-- 拍照组件 -->
<camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 200px;"></camera>
<!-- 拍照按钮 -->
<button type="default" bindtap="takePhoto" style="margin: 20px 0; width: 100%;">拍照</button>
<view style="margin: 20rpx; ">
<!-- 拍照预览 -->
<image mode="widthFix" src="{{src}}" style="width: 100%; border-radius: 60rpx;"></image>
</view>
</view>
// pages/test/camera.js
Page({
/**
* 页面的初始数据
*/
data: {
},
..................
// 拍照
takePhoto() {
// 创建拍照上下文 - 小程序API
const ctx = wx.createCameraContext()
// 启动拍照
ctx.takePhoto({
// 拍摄质量
quality: 'high',
// 成功后调用
success: (res) => {
// 将地址存起来
this.setData({
src: res.tempImagePath
})
}
})
},
})