既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
}
});
},
//向后台更新信息
updateUserInfo(info,openInfo) {
const { avatarUrl, city, country, gender,language, nickName, province} = info
const { _id } = openInfo.data
let _this = this;
this.$api.login({avatarUrl, city, country, gender,language, nickName, province, _id}).then(res=>{
if(res.data.isSuccess){
_this.$store.commit('SET\_STATE',['userInfo',res.data.data])
_this.$store.commit('SET\_STATE',['token',res.data.data.token])
uni.setStorageSync('token',res.data.data.token)
_this.$refs.uToast.show({
title: '登录成功',
type: 'success',
});
}else{
_this.$refs.uToast.show({
title: '登录失败',
type: 'fail',
});
}
setTimeout(()=>{
uni.navigateBack()
},1500)
})
}
}
};
四、node后端代码实现
>
> 后台接口采用node+express+mongoose
>
>
>
* 获取openid并创建用户接口
//获取openId的时候,查询用户是否存在,不存在则创建用户,反之更新令牌
var express = require(‘express’);
var router = express.Router();
const User = require(‘./…/model/user’)
const { createToken, verifyToken } = require(‘./…/utils’)
const { WX_CONFIG } = require(‘./…/utils/config’)
// querystring这个模块,用来做url查询参数的解析
const querystring = require(‘querystring’);
const request = require(‘request’);
/**
* @name: 获取微信用户的openId
* @param {string} code 微信小程序授权后返回的code
* @Author: 471826078@qq.com
*/
router.post(‘/getOpenId’, (req, res, next) => {
const data = {
‘appid’: WX_CONFIG.appId,
‘secret’: WX_CONFIG.appScrect,
‘js_code’: req.body.code,
‘grant_type’: ‘authorization_code’
}
// querystring的stringify用于拼接查询
var content = querystring.stringify(data);
// 根据微信开发者文档给的API
var url = ‘https://api.weixin.qq.com/sns/jscode2session?’ + content;
// 对url发出一个get请求
request.get({
‘url’: url
}, (error, response, body) => {
// 将body的内容解析出来
let abody = JSON.parse(body);
const { openid, session_key } = abody
if (openid) {
User.findOne({ openId: openid }).exec((err, doc) => {
if (err) {
res.send({ isSuccess: false, message: ‘登录失败’ });
} else {
let token = createToken({ isAdmin: 0, openId: openid, session_key }, 3600 * 24 * 3)
if (!doc) {
new User({ openId: openid, session_key, isAdmin: 0, token }).save((err1, doc) => {
if (err1) {
res.send({ isSuccess: false, message: ‘登录失败’ });
} else {
res.send({ isSuccess: true, message: ‘登录成功’, data: doc });
}
})
} else {
User.findByIdAndUpdate({ _id: doc._id }, { token, session_key }, { new: true }).exec((err2, doc2) => {
if (err2) {
res.send({ isSuccess: false, message: ‘登录失败’ });
} else {
res.send({ isSuccess: true, message: ‘登录成功’, data: doc });
}
})
}
}
})
} else {
res.send({ isSuccess: false, message: '登录失败' });
}
})
})
module.exports = router
>
> 授权后更新用户信息接口
>
>
>
//会员注册
var express = require(‘express’);
var router = express.Router();
const User = require(‘./…/model/user’)
router.post(‘/memberRegister’, (req, res, next) => {
const { _id, avatarUrl, city, country, gender, language, nickName, province, } = req.body;
User.findByIdAndUpdate({ _id }, { avatarUrl, city, country, gender, language, nickName, province, }, { new: true }).exec((err3, doc) => {
if (err3) {
res.send({ isSuccess: false, message: ‘登录失败’ });
} else {
res.send({ isSuccess: true, message: ‘登录成功’, data: doc });
}
})
})
module.exports = router
#### 五、返回登录之前的页面
if(res.data.isSuccess){
_this.$store.commit('SET\_STATE',['userInfo',res.data.data])
_this.$store.commit('SET\_STATE',['token',res.data.data.token])
uni.setStorageSync('token',res.data.data.token)
_this.$refs.uToast.show({
title: '登录成功',
type: 'success',
});
}else{
_this.$refs.uToast.show({
title: '登录失败',
type: 'fail',
});
}
setTimeout(()=>{
uni.navigateBack()
},1500)
// SET_STATE 方法
const mutations = {
SET_STATE(state, e) {
if (e) {
state[e[0]] = e[1];
}
},
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
1715717510193)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新