马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、refresh_token
记任命户登录状态的 token 的有用时间被设置成了8个小时,高出8小时后将不再保持登录的状态了,此种情况下除了让用户重新举行登录外尚有一种体验更好的方式,即 refresh_token。
在调用登录接口乐成后会返回 token 和 refreshToken 当 token 有用时间设置了 8 个小时,refreshToken 有用时间设置了 3 天,当 token 失效后 refreshToken 仍旧有用,此时可以通过 refreshToken 来为 token 续期,所谓的续期就是调用后端提供的一个接口,然后把 refreshToken 发送给服务端,服务端重新返回新的 token 和 refreshToken。
1.1 革新 token
- 判定当前的 token 有没有失效可以根据接口返回的状态码举行判定,当 token 失效后会返回 401,在相应拦截器中可以同一获取全部接口返回的状态码,然后对其举行判定:
- // utils/http.js
- // 配置响应拦截器
- http.intercept.response = async function ({
-
- data, config }) {
-
-
- // 如果状态码为401,则表明token已失效
- if (data.code === 401) {
-
-
- // 获取应用实例来读取 refreshToken
- const app = getApp()
- console.log(app.refreshToken)
- }
- // 只保留data数据,其它的都过滤掉
- return data
- }
复制代码 要想通过应用实例 getApp 来读取 refreshToken 必须提前读取当地存储的数据并存储到应用实例当中:
- // app.js
- App({
-
-
- onLaunch() {
-
-
- // 读取 token
- this.getToken()
- },
- getToken() {
-
-
- // 读取本地的token
- this.token = wx.getStorageSync('token')
- this.refreshToken = wx.getStorageSync('refreshToken')
- },
- })
复制代码
- 调用接口把 refreshToken 发送给服务端变更新的 token 和 refreshToken
接口文档地点
接口中所必要的接口 refreshToken 必要通过自界说的头信息 Authorization 来通报:
- // utils/http.js
- // 配置响应拦截器
- http.intercept.response = async function ({
-
- data, config }) {
-
-
- // 如果状态码为401,则表明token已失效
- if (data.code === 401) {
-
-
- // 获取应用实例
- const app = getApp()
- // 1.1 调用接口获取新的 token
- const res = await http({
-
-
- url: '/refreshToken',
- method: 'POST',
- header: {
-
-
- Authorization: 'Bearer ' + app.refreshToken,
- },
- })
- // 检测接口是否调用成功
- if (res.code !== 10000) return wx.utils.toast('更新token失败!')
- // 重新存储新的 token
- app.setToken('token', res.data.token)
- app.setToken('refreshToken', res.data.refreshToken)
- }
- // 只保留data数据,其它的都过滤掉
- return data
- }
复制代码 在获取新的 token 和 refreshToken 后必要将原来已经失效的 token 和 refreshToken 更换掉,即再次调用 app.setToken 来更新数据。
1.2 无感哀求
在实际的应用中在调用某个接口时才会知道 token 是否已经逾期,这种情况我们去革新了 token ,但是原接口调用的数据我们并不能立即获取到,为了办理这个标题我们可以在革新 token 乐成后,自动的再去把原来的接口调用一次来获取数据,对于用户来说感觉不到 token 曾以失效过,我们将这种处理处罚方式叫成了无感哀求(这是我自已起的名字,各人重点明白这个名称背后的实现逻辑即可)。
- // 配置响应拦截器
- http.intercept.response = async function ({
-
- data, config }) {
-
-
- // 如果状态码为401,则表明token已失效
- if (data.code === 401) {
-
-
- // 获取应用实例
- const app = getApp()
- // 1.1 调用接口获取新的 token
- const res = await http({
-
-
- url: '/refreshToken',
- method: 'POST',
- header: {
-
-
- Authorization: 'Bearer ' + app.refreshToken,
- },
- })
- // 检测接口是否调用成功
- if (res.code !== 10000) return wx.utils.toast('更新token失败!')
- // 重新存储新的 token
- app.setToken('token', res.data.token)
- app.setToken('refreshToken', res.data.refreshToken)
- // 1.2 获取到原来接口请求的参数
- config = Object.assign(config, {
-
-
- header: {
-
-
- // 更新后的 token
- Authorization: 'Bearer ' + res.data.token,
- },
- })
- // 重新发请求
- return http(config)
- }
- // 只保留data数据,其它的都过滤掉
- return data
- }
复制代码 重新发起哀求时 config 中包罗的是旧的失效的 token,我们必要用新的 token 覆盖掉原有哀求参数中的自界说头信息 Authorization :
- // 获取到原来接口请求的参数
- config = Object.assign(config, {
-
-
- header: {
-
-
- // 更新后的 token
- Authorization: 'Bearer ' + res.data.token,
- },
- })
复制代码 1.3 重新登录
革新 token 完成后我们必要进一步的分析,假如 refreshToken 也失效了怎么办?(用户高出3天都没有打开过小步伐的情况下),这种情况下就只能让用户重新举行登录了,即跳转到登录页面即可:
- // 配置响应拦截器
- http.intercept.response = async function ({
-
- data, config }) {
-
-
- // 如果状态码为401,则表明token已失效
- if (data.code === 401) {
-
-
- // 获取应用实例
- const app = getApp()
- // 1.3 状态为 401 且接口为 /refreshToken 表明 refreshToken 也过期了
- if (config.url.includes('/refreshToken')) {
-
-
- // 获取当前页面的路径,保证登录成功后能跳回到原来页面
- const pageStack = getCurrentPages()
- const currentPage = pageStack.pop()
- const redirectURL = currentPage.route
- // 跳由跳转(登录页面)
- return wx.redirectTo({
-
-
- url: '/pages/login/index?redirectURL=/' + redirectURL,
- })
- }
- // 1.1 调用接口获取新的 token
- const res = await http({
-
-
- url: '/refreshToken',
- method: 'POST',
- header: {
-
-
- Authorization: 'Bearer ' + app.refreshToken,
- },
- })
- // 检测接口是否调用成功
- if (res.code !== 10000) return wx.utils.toast('更新token失败!')
- // 重新存储新的 token
- app.setToken('token', res.data.token)
- app.setToken('refreshToken', res.data.refreshToken)
-
- // 1.2 获取到原来接口请求的参数
- config = Object.assign(config, {
-
-
- header: {
-
-
- // 更新后的 token
- Authorization: 'Bearer ' + res.data.token,
- },
- })
- // 重新发请求
- return http(config)
- }
- // 只保留data数据,其它的都过滤掉
- return data
- }
复制代码 在相应拦截器中通过 config 参数可以获取调用接口的路径参数,判定假如调用的是 /refreshToken 接口且返回的是 401 时,则表过是 refreshToken 当前也是逾期了。
二、房屋管理
房屋管理是项目中最大的功能模块,别的包罗了位置服务、房屋信息、房屋列表、添加房屋、修改房屋、删除房屋等子功能。
2.1 位置服务
位置服务(LBS)是基于用户的位置来提供服务的技能,通过要共同第三方的服务来实现,如腾讯舆图、高德舆图、百度舆图等,在本项目接纳的是腾讯的位置服务。
申请使用腾讯位置服务必要按如下步调操纵:
- 注册账号
- 创建应用
- 天生 key
- 小步伐管理配景添加正当域名
步调参考视频的先容和官方文档来操纵,在此就不缀述了。
在使用位置服务的时间必要提供用户的位置(经纬度),关于用户的位置小步伐提供了 API ,在使用获取位置的 API 时必要先在 app.json 中举行声明,并在小步伐管理后举行申请,干系限定请参考文档分析。
- {
-
-
- "requiredPrivateInfos": [
- "getLocation",
- "chooseLocation"
- ],
- "permission": {
-
-
- "scope.userLocation": {
-
-
- "desc": "你的位置信息将用于小程序位置接口的效果展示"
- }
- }
复制代码 调用 wx.getLocation() 获取用户当前位置,该 API 支持返回 Promise:
- Page({
-
-
- async getLocation() {
-
-
- // 调用 API
- const {
-
- latitude, longitude} = await wx.getLocation()
- console.log(latitude, longitude)
- }
- })
复制代码 调用 wx.chooseLocation 会打开舆图由用户自由选择一个位置后返回该位置的经纬度,该 API 支持返回 Promise:
[code][/code] |