一,基本过程
二,基本免登录的流程
三,代码细节
1,跳转到指定页面后发起第一个请求(有session的话,说明已经登陆)
var obj = {
session_3rd: that.session_3rd, sid: that.sid, } var res = await that.$api.postForm('/shop', obj)
2,然后到封装的api请求处看:
// 封装请求 const request = (method, url, options) => {
let methods = ''; let headers = {
}; switch (method) {
case 'get': methods = 'GET' headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } break; case 'post': methods = 'POST' headers = {
'Content-Type': 'application/json; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } break; case 'postForm': methods = 'POST' headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } break; } let obj = {
}, hideLoading = false, loadingText = '正在加载...'; if (options) {
//如果有options if (options.hideLoading) {
hideLoading = options.hideLoading delete options.hideLoading } if (options.loadingText) {
loadingText = options.loadingText delete options.loadingText } } return new Promise((resolve, reject) => {
!hideLoading && uni.showLoading({
title: loadingText, // #ifndef MP-ALIPAY mask:true, // #endif }) uni.request({
url: `${
base.BASE_URL}${
platform}${
url}`, method: methods, data: dataObj(url, options), header: headers, success: res => {
util.checkError(res, resolve, reject) }, fail: e => {
util.checkError(e, resolve, reject) }, complete: () => {
uni.hideLoading() } }) }) }
主要是这行,也就是需要校验结果
success: res => {
util.checkError(res, resolve, reject) },
3,然后进入校验的代码查看具体的校验代码:
const checkError = (res, resolve, reject) => {
if (res) {
if (res.statusCode == '404' || res.statusCode == '500' || res.statusCode == 404) {
uni.redirectTo({
url: '/pages/404/404' }) } else if (res.data) {
if (res.data.code) {
if (res.data.code == "10002") {
// #ifndef H5 var err = uni.getStorageSync('err'); console.log('10002错误码', err) if (!err) {
goLogin(); uni.setStorageSync('err', res.data.code); console.log('拦截请求登录'); } // #endif // #ifdef H5 goLogin(); // #endif reject(res);
这里只是截取的一部分相关代码,如果没有session,就会走10002这边,调用goLogin():
//未授权,请重新登录(10002) const goLogin = async () => {
let redirect = await getCurPageUrl() let redirectUrl = '' if (redirect && redirect.indexOf("redirect=") == -1) {
redirectUrl = redirect if (redirect.indexOf("?") != -1) {
//如果url作为参数,后面还拼接参数,会导致后面的参数无法拿到,所以要把’?‘先转成“&” redirectUrl = redirect.replace("?", "&"); } // #ifndef H5 console.log('redirectUrl', redirectUrl) miniLogin(redirectUrl); // #endif } }
const getCurPageUrl = () => {
//获取当前页面url包括参数 var pages = getCurrentPages(); //获取加载的页面 var currentPage = pages[pages.length - 1]; //获取当前页面的对象 console.log('currentPage', currentPage) if (!currentPage) {
setTimeout(function() {
getCurPageUrl(); //没有拿到页面延时1000重新执行 }, 1000) } else {
var url = currentPage.route; //当前页面url var options = currentPage.options; //获取url中所带的参数 //拼接url的参数 var currentPageUrl = url + '?'; for (var key in options) {
var value = options[key] currentPageUrl += key + '=' + value + '&'; } currentPageUrl = currentPageUrl.substring(0, currentPageUrl.length - 1); console.log('curpage', currentPageUrl); return Promise.resolve(currentPageUrl); } }
对应的miniLogin():
const miniLogin = (curPageUrl) => {
uni.login({
success: async function(loginRes) {
console.log(loginRes); var obj = {
code: loginRes.code }; try {
// #ifdef MP-WEIXIN var res = await api.postFormNoCheck('/login', obj); // #endif if (res.data.code == '10004') {
//手机号不存在需前往登录页面获取手机号码并登录 if (curPageUrl.indexOf("phone=") != -1) {
uni.login({
success: async function(codeRes) {
var phone = curPageUrl.split('phone=')[1]; if (phone.indexOf('&') != -1) {
phone = phone.split('&')[0]; } var tjObj = {
code: codeRes.code, phone: phone }; try {
var tjRes = await api.postFormNoCheck('/login/getTJHKPhone', tjObj); if (tjRes.data.code == '10000') {
// 手机号绑定成功,重新加载当前页面 if (curPageUrl.indexOf("&") != -1) {
//有转换过的带参数url要转换回去带问号拼接 curPageUrl = curPageUrl.replace("&", "?") } uni.redirectTo({
url: '/' + curPageUrl }) } } catch (err) {
console.log('err', err); } } }) } //老用户,登陆成功,有session返回 } else {
var session_3rd = res.data['session_3rd']; if (session_3rd) {
uni.setStorageSync('session_3rd', session_3rd); var userData = await api.postForm('/user/userMsg', {
session_3rd: session_3rd }); uni.setStorageSync('user', userData.data.user); var curPage = await getCurPage(); let redirect = curPageUrl; if (curPageUrl.indexOf("&") != -1) {
//有转换过的带参数url要转换回去带问号拼接 redirect = curPageUrl.replace("&", "?") } let redirectUrl = '' if (redirect && redirect != "pages/order/orderList/orderList" && redirect != "pages/user/user/user" && redirect != "pages/index/index") {
redirectUrl = '/' + redirect uni.redirectTo({
url: redirectUrl }) }else if (redirect && redirect == "undefined") {
uni.redirectTo({
url: '/pages/404/404', }); } } else {
uni.hideLoading(); goLogin(); } } } catch (err) {
console.log('err', err) } } }) }
到此这篇微信小程序跳转微信小程序实现免登录的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-wfwjg/11090.html