前言
之前写过一篇《云开发实战-如何维护用户表》,这种方式是最简单的,经过阅读了一些开源项目的代码,我优化了部分写法。
对比
优化前实现思路:
- 通过 login 云函数获取 openid 存放到本地
- 在授权信息的时候去添加 userInfo
- 根据 openid 去查询是否已经存储
- 没有查到就是新用户进行添加并存放 id 到本地
- 查看后老用户就根据 id 进行更新信息
优化后实现思路:
- 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表
- 得到状态后存放在 app.js 的全局变量 authorized 属性里面
- 当需要用户授权的时候判断状态,没有就跳转到授权页面
- 进行授权调用 authorize 云函数添加用户
代码
- 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表
- 得到状态后存放在 app.js 的全局变量 authorized 属性里面。
wx.cloud.callFunction({
// 云函数名称
name: 'user',
// 传给云函数的参数
data: {
action: 'queryCurrentUser'
}
}).then(res => {
if (res.result.errMsg === 'user.query.ok') {
this.onAuthorized(res.result.data.userInfo);
this.authorized = true;
}
wx.hideLoading();
})
onAuthorized(userInfo) {
this.authorized = true;
this.globalData.userInfo = userInfo;
},
queryCurrentUser 云函数
async queryCurrentUser(context, params) {
const {
OPENID
} = context;
let res = await db.collection('users').where({
openid: OPENID
}).get();
if (res.data.length === 0) {
return {
errMsg: 'user.query.none'
};
}
return {
errMsg: 'user.query.ok',
data: {
userInfo: res.data[0].userInfo
}
};
},
- 当需要用户授权的时候判断状态,没有就跳转到授权页面
index.js
toInfo(res) {
if (app.authorized !== true) {
wx.navigateTo({
url: '/pages/authorize/authorize'
});
return;
}
// 省略业务代码....
}
- 进行授权调用 authorize 云函数添加用户
authorize.js
wx.cloud.callFunction({
// 云函数名称
name: 'user',
// 传给云函数的参数
data: {
action: 'authorize',
userInfo: userInfo
}
}).then(res => {
if (res.result.errMsg === 'user.authorize.ok' || res.result.errMsg === 'user.authorize:authorized') {
app.onAuthorized(res.result.data.userInfo);
wx.showLoading({
title: '授权成功'
});
setTimeout(() => {
wx.hideLoading();
app.navigateBack();
}, 1000);
return;
}
wx.nextTick(() => {
wx.showToast({
title: '授权失败',
icon: 'none',
duration: 1000
});
});
});
authorize 云函数
const authorizedRes = {
env: cloud.DYNAMIC_CURRENT_ENV,
errMsg: 'user.authorize:authorized'
};
async authorize(context, params) {
const {
OPENID
} = context;
let getRes = await db.collection('users').where({
openid: OPENID
}).get();
if (getRes.errMsg !== 'collection.get:ok') {
return errorAuthorizeRes;
}
if (getRes.data.length > 0) {
return authorizedRes;
}
let addRes = await db.collection('users').add({
data: {
openid: OPENID,
userInfo: params.userInfo,
authorizedTime: new Date(),
}
});
return {
errMsg: 'user.authorize.ok',
data: {
userInfo: params.userInfo
}
};
}
总结
这种方式优点如下:
- 用云函数来验证,云函数可以直接获取 openid
- 通用统一的授权页面进行授权,这样就不需要在不同的地方写同样的授权代码
- 添加逻辑在云函数中实现,改小程序前端代码需要重新发版,云函数部署就行
代码需要不断优化才能更好。
|