小程序登陆注册
背景
由于我使用的是阿里云不是腾讯云,而且域名懒得备案用的是反向代理,所以小程序选择使用云服务,然而臣妾真的做不到啊,bug太多了。
云开发初探
创建一个云开发,首先会自动给你一个login云函数,以及各种数据库等使用模板
先开启云服务,创建了一个数据库
{"_id":"57896b495cef95e40834741e12ced6b1","score":0.0,"sex":"男","student_id":"17020031102","username":"张小呆","password":"123456"} //保存用户的个人数据,暂时只想到这些,后期需要继续加
然后加上的自己的代码,创建自己的页面
授权验证
发现登陆无法实现,需要自己写一个登陆并且读取用户包括openid的数据存储到全局变量中
代码实现如下,getUserInfo()无法实现openid的获取,所以我调用了自带的login云函数,获取并存了起来
bindGetUserInfo: function () {
wx.getUserInfo({
success: function (res) {
console.log(res)
app.globalData = res.userInfo
console.log(app.globalData)
}
})
wx.cloud.callFunction({
name: 'login',
data: {},
success: res => {
console.log('[云函数] [login] user openid: ', res.result.openid)
app.globalData.openid = res.result.openid
this.setData({
hiddenmodalput: false
})
},
fail: err => {
console.error('[云函数] [login] 调用失败', err)
}
})
},
数据库调用
注册虽然不需要验证登陆(打算把注册验证放在app.js,新用户跳去注册页面,不然就直接登陆),但是注册需要验证邀请人学号是否正确,以及插入新用户数据,实现对数据库的增查改。
开始打算用他给的模板,但是问题来了,作为一名普通用户怎么能更改数据库呢,于是打算写一个云函数,实现对数据库的各种操作,代码如下:
exports.main = async (event, context) => {
const targetDB = db.collection(event.db)
try {
if (event.type == "insert") {
return await targetDB.add({
data: event.data//data类型such as:{id:1}
})
}
if (event.type == "update") {//indexKey为数据库给每份数据自动匹配的一个_id值
return await targetDB.doc(event.indexKey).update({
data: event.data
})
}
if (event.type == "delete") {//condition为判定条件类型such as:{id: 1}
return await targetDB.where(event.condition).remove()
}
if (event.type == "get") {
return await targetDB.where(event.condition)
.skip(event.limit * event.skip)//skip查了一堆也没搞懂是干嘛的,暂时认为是从找到的第几个开始算,这里skip = 0
.limit(event.limit)//limit是限制最大查找的个数
.get()
}
} catch (e) {
console.error(e)
}
}
然而学会他们的用法真的很困难,官方文档写的没有明确解释每个参数的意义,查找到的所有博客理论部分基本都是抄的官方文档,没有一点参考价值,非常痛苦
大bug
最痛苦的是代码写对了,最后一遍遍调试就是不行
结果几小时的查阅以及调试,偶然注意到了他的执行顺序居然是反的,对此专门调试了一下才发现调用云函数非常慢,调用云函数还没执行完,后面的代码就执行了,想到直接用嵌套调用,然而依旧不行,蒙蔽了
又疯狂的有方向的查阅了一番找到了一篇比较好的博客对微信小程序的异步处理有详细的方法,但是人家第一种方法也是嵌套就很迷,看了看第二种太麻烦要大改,果断放弃了,虽然嵌套比较不好看,可读性和维护性不高,但是对于这种轻量级的小程序也不是不能用,于是最后试了一下嵌套,居然成功了,阔以说是非常玄学
最终嵌套代码如下(由于调试了好久,格式越调试越乱,很无奈=.=)
var that = this;
if (!(that.data.sexx == '男' || that.data.sexx == '女')) {
wx.showToast({
title: '性别输入有误',
})
return;
}
if (!that.data.cname) {
wx.showToast({
title: '姓名班级有误',
})
return;
}
if (that.data.iname != '') {
const db = wx.cloud.database()
console.log(that.data.iname)
wx.cloud.callFunction({
name: 'database',
data: {
type: "get", //指定操作是insert
db: "user", //指定操作的数据表
limit: 2,
skip: 0,
condition: { student_id: that.data.iname }
},
success: function (res) {
console.log(res.result.data)
that.data.res_db = res.result.data[0]
console.log(that.data.res_db)
console.log(that.data.res_db.student_id)
console.log(that.data.res_db.score)
if (that.data.res_db.student_id != that.data.iname) {
wx.showToast({
title: '无此邀请人',
icon: 'loading'
})
return;
}
console.log(that.data.res_db.score + 2)
wx.cloud.callFunction({
name: 'database',
data: {
type: "update", //指定操作是insert
db: "user", //指定操作的数据表
condition: { _id: that.data.res_db._id },
data: { //指定insert的数据
//groupID: wx.getStorageSync("groupID"),
//subject: ["语文soc", "数学", "英语", "物理", "化学", "历史", "地理", "政治"]
score: that.data.res_db.score+2
}
},
success: function (res) {
wx.showToast({
title: '被邀请成功',
icon: 'success'
})
wx.cloud.callFunction({
name: 'database',
data: {
type: "insert", //指定操作是insert
db: "user", //指定操作的数据表
data: { //指定insert的数据
username: that.data.cname,
password: app.globalData.openid,
score: 0,
sex: that.data.sexx,
student_id: that.data.student_id
}
},
success: function (res) {
wx.showToast({
title: '注册成功',
icon: 'success'
})
wx.redirectTo({
url: '../mine/mine',
})
},
error: function (error) {
console.log(error)
}
});
},
error: function (error) {
console.log(error)
}
})
},
error: function (error) {
console.log(error)
}
});
}