uniapp+node.js+mysql前后端微信小程序授权登录

这篇具有很好参考价值的文章主要介绍了uniapp+node.js+mysql前后端微信小程序授权登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

目录

文章目录

前言

一、前端代码?

1.微信授权登录的页面(没有样式,自己写)

2.”我的“页面

3.封装request.js的页面

4.vuex的状态管理的页面

5.添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面

二、后端代码

1.数据库连接页面(sql.js)

2.数据库页面封装查询用户与插入用户信息的页面以及生成用户的token(UserSql.js)

3.调用接口页面(sever下面的router下面的index.js)

总结



前言

利用了vuex状态管理存储了登录的信息,还加入了token,识别token是否需要授权登录

利用了uni.login,uni.getUserProfile2个方法获取用户的openid和昵称和头像图片地址

前端代码:有5个页面,1个是微信授权登录的页面,1个”我的“页面

1个封装request.js的页面,2个vuex的状态管理的页面,1个是添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面

后端代码:1个数据库连接页面,1个数据库页面封装查询用户与插入用户信息的页面以及生成用户的token,1个调用接口页面


提示:以下是本篇文章正文内容,下面案例可供参考

一、前端代码?

1.微信授权登录的页面(没有样式,自己写)

<template>
            <view  @tap='loginOther()'>
                <button>微信登录</button>
            </view>
</template>
import $http from '@/common/api/request.js'
import {mapMutations} from 'vuex'
export default{
    methods:{
    ...mapMutations(['login']),
    //关闭当前页面,返回上一页
    goBack(){
        uni.navigateBack({
            delta:1
        })
    },
        loginOther(){
            uni.login({
                success:(resp)=>{
          let code=resp.code;
          this.code=code;
                }
            }),
      uni.getUserProfile({
                          desc: "获取你的昵称、头像、地区及性别",
                          success: (res) => {
                   let ccode=this.code
                   let nickName = res.userInfo.nickName;
                   let avatarUrl = res.userInfo.avatarUrl;
                   $http.request({
                       url:"/login",
                       method:"POST",
                       data:{
                       ccode,
                       nickName,
                       avatarUrl
                       },
                   }).then((res)=>{
                     this.login(res);
                     uni.navigateBack({
                         delta:1
                     })
                   }).catch(()=>{
                       uni.showToast({
                           title:'请求失败',
                           icon:'none'
                       })
                   })
                          },
                      })
        }
    }
}

2.”我的“页面

                <view class='header-logo'>
                    <image class='logo-img' :src=" loginStatus ? userInfo.avatarUrl: '' " mode=""></image>
                    <view class='logo-name'>
                        {{  loginStatus ? userInfo.nickName : ""   }}
                    </view>
                </view>
	import {mapState} from 'vuex';
	export default {
		computed:{
			...mapState({
				loginStatus:state=>state.user.loginStatus,
				userInfo:state=>state.user.userInfo
			})
		}

	}

3.封装request.js的页面

import store from '@/store/index.js'
export default{
	common:{
		  baseUrl:"http://本地ip地址或者你的服务器ip地址或者你服务器的域名:3000/api",
		data:{},
		header:{
			"Content-Type":"application/json",
			"Content-Type":"application/x-www-form-urlencoded"
		},
		method:"GET",
		dataType:"json"
	},
	request( options={} ){
		
		uni.showLoading({
		    title: '加载中'
		});
		
		options.url = this.common.baseUrl + options.url;
		options.data = 	options.data || this.common.data;
		options.header = options.header || this.common.header;
		options.method = options.method || this.common.method;
		options.dataType = 	options.dataType || this.common.dataType;
		
		//判断是否传入了header头的token进行用户是否登录的验证
		if(options.header.token){
			options.header.token = store.state.user.token;
			if(!options.header.token){
				uni.showToast({
					title:"请先登录",
					icon:"none"
				})
				return uni.navigateTo({
					url:"/pages/login/login"
				})
			}
		}
		return new Promise((res,rej)=>{
			uni.request({
				...options,
				success: (result) => {
					if(result.statusCode != 200){
						return rej();
					}
					setTimeout(function () {
					    uni.hideLoading();
					}, 500);
					let data = result.data.data;
					res(data);
				}
			})
		})
	}
}

4.vuex的状态管理的页面

store文件夹i中ndex.js的的文件然后调用user.js这个模块

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);
//用户
import user from './modules/user.js'
export default new Vuex.Store({
    modules:{
        user,
    }
})
export default{
    state:{
        //登录状态
        loginStatus:false,
        //token
        token:null,
        //用户信息(昵称/头像)
        userInfo:{}
    },
    getters:{},
    mutations:{
        //一旦进入了app,就需要执行这个方法,把用户信息读出来
        initUser(state){
            let userInfo = uni.getStorageSync('userInfo');
            if( userInfo ){
                userInfo = JSON.parse( userInfo );
                state.userInfo = userInfo;
                state.loginStatus = true;
                state.token = userInfo.token;
            }
        },
        //登录后保存用户信息
        login(state,userInfo){
            state.userInfo = userInfo;
            state.loginStatus = true;
            state.token = userInfo.token;
            //持久化存储 ===>把对象转换成字符串
            uni.setStorageSync('userInfo',JSON.stringify(userInfo));
        },
        //退出登录
        loginOut(state){
            state.loginStatus = false;
            state.userInfo = {};
            state.token = null;
            //删除本地存储的信息
            uni.removeStorageSync('userInfo');
        }
    },
    actions:{}
}

5.添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

import store from 'store'
Vue.prototype.$store = store;

//权限跳转
Vue.prototype.navigateTo = (options)=>{
	if( !store.state.user.loginStatus ){
		uni.showToast({
			title:"请先登录",
			icon:"none"
		})
		return	uni.navigateTo({
				url:"/pages/login/login"
			})
	}
	uni.redirectTo(options)
}
				
App.mpType = 'app'

const app = new Vue({
	store,
    ...App
})
app.$mount()

二、后端代码

1.数据库连接页面(sql.js)

var mysql = require('mysql');//引入
var connection = mysql.createConnection({
      host     : 'localhost或者你的服务器公网地址',
      user     : '用户名',
      password : '自己的数据库密码',
      database : '数据库名称'
});
module.exports = connection;//抛出

2.数据库页面封装查询用户与插入用户信息的页面以及生成用户的token(UserSql.js)

var User = {
	//查询用户名
	queryUserName( param ){
		if( param.openid){
			//phone = 应该是手机号这个变量[属性],为了后面好操作所有名称改为:userName
			return "select * from wechatuser where openid = '"+param.openid+"' or nickName = '"+param.nickName+"' ";
		}
	},

	//增加一条用户数据
	insertData( param ){
		let openid = param.openid;
		const jwt = require('jsonwebtoken');
		let payload = {name:openid}; //openid
		let secret = '自己编一个口令比如“mysql”';//口令
		let token = jwt.sign(payload,secret);//拼接token
		let nickName = param.nickName;
		let avatarUrl = param.avatarUrl ;
		return 'insert into wechatuser (openid,nickName,avatarUrl,token) values ("'+openid+'","'+nickName+'","'+avatarUrl+'","'+token+'")';
	}
}

exports = module.exports = User;

3.调用接口页面(sever下面的router下面的index.js)

var express = require('express');
var router = express.Router();
var connection = require('../db/sql.js');
var user = require('../db/UserSql.js');
var jwt_decode = require('jwt-decode');
const request = require('request')
router.post('/api/login', function(req, res, next) {
  let code=req.body.ccode;//登陆传过来的code
  let nickName=req.body.nickName;
  let avatarUrl=req.body.avatarUrl;
 let appid = "自己小程序后台管理的appid"; //自己小程序后台管理的appid,可登录小程序后台查看
 let mysecret = "小程序后台管理的secret"; //小程序后台管理的secret,可登录小程序后台查看
 let grant_type = "authorization_code"; // 授权(必填)默认值
 //拼接出请求微信服务器的url地址然后请求oppenid和session_key
  let url ='https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + mysecret + '&js_code=' + code + '&grant_type=authorization_code';
      request(url,(error, response, body)=>{
        //JSON.parse()方法将JSON格式字符串转换为js对象
        let parsData = JSON.parse(body.toString());
        let openid=parsData.openid;
        let session_key=parsData.session_key;
        let params={
          openid,
          nickName,
          avatarUrl
        }
	//查询数据库中有没有此用户
	connection.query( user.queryUserName( params ) , function (error, results, fields) {
		if( results.length > 0){
			//数据库中存在      : 读取
			connection.query( user.queryUserName( params ) , function (e, r) {
        
				res.send({
					data:r[0]
         
				})
			})
		}else{
			//数据库中[不]存在  : 存储 ==>读取
			connection.query( user.insertData( params ) , function (er, result) {
				connection.query( user.queryUserName( params ) , function (e, r) {
					res.send({
						data:r[0]
					})
				})
			})
		}
	}) 
         })
})

总结

当你想要设置一个页面想要使用必须先登录就在那个页面的接口请求中加入token比如

				$http.request({
					url:"/selectCart",
					method:"POST",

					header:{
						token:true
					}

				}).then((res)=>{
					this.initGetData(res);
				}).catch(()=>{
					uni.showToast({
						title:'请求失败',
						icon:'none'
					})
				})


 文章来源地址https://www.toymoban.com/news/detail-490772.html

到了这里,关于uniapp+node.js+mysql前后端微信小程序授权登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新!uniapp微信小程序微信授权登录

     11月后,微信小程序对于微信授权登录做了逻辑上的更改,之前的一键授权获取用户信息的功能已不再适用。已发布审核完成的小程序不受影响,但要想再发布,只能换成新的登陆逻辑了。 首先,要说明的,个人中心页面,未登陆时,应有登陆按钮,最好不要通过路由守卫

    2024年02月09日
    浏览(38)
  • uniapp微信小程序授权微信头像昵称

    自微信废弃uni.getUserInfo和uni.getUserProfile授权登录只能使用手机号授权了,头像和昵称则是改成了上传的方式 代码写的虽然比较low但是很实用的,可以借鉴一下 html js css  我这里使用的scss

    2024年02月13日
    浏览(32)
  • uniApp微信小程序前后端交互

    config包下 common交互逻辑 index页面 过滤拦截token 校验token

    2024年02月12日
    浏览(29)
  • uniApp 微信小程序 授权 公众号推送信息

    准本工作  1.首先小程序  更公众号关联起来 2.配置相应的域名(也就是你请求后端接口的公共地址) 3.需要写一个h5 页面 用于跳板 公众号 的授权 公众号如何关联小程序? 打开微信公众号后台,选择「设置 – 公众号设置 」 [关注公众号 -打开开关  ], 步骤一 步骤二  步

    2024年02月10日
    浏览(28)
  • uniapp新版微信小程序用户隐私协议授权

    manifest.json文件中进行配置 App.vue中配置 判断用户有没有进行过隐私授权 编写组件 使用组件

    2024年02月09日
    浏览(41)
  • uniapp+node.js前后端做帖子模块:分享帖子和分享页面(社区管理平台的小程序)

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 温馨提示:我做的思路可能是复杂化了或者说代码写的不规范,如果你觉得可以更加简便的话欢迎分享到评论区或者自己改写一下我的代码,我的后端是写的

    2024年03月11日
    浏览(34)
  • uniapp微信小程序授权登录并获取手机号

    新版:前端要授权两次,一次获取用户信息授权码code,另外一次获取用户手机授权码code,全部传给后端。后端通过用户信息授权码获取openid,通过手机授权码获取手机号码。老版:前端传给后端授权码code和用户手机授权回调 里的iv和encryptedData给后端,后端通过code获取ope

    2024年02月11日
    浏览(69)
  • uniApp微信小程序唤出授权头像昵称(微信授权登录)弹窗,及服务端用户信息解密注意事项

    头像昵称弹窗弹出条件:button授权按钮 + uni.getUserProfile API请求 1.H5部分 2.JS部分 注意事项: 不能嵌入其他API内调用,一定要在调用的方法中第一层执行(优先执行 uni.getUserProfile ) 正确做法 :必须第一步用户点击按钮,第二步调取 uni.getUserProfile API(调取 uni.getUserProfile 操作

    2024年02月11日
    浏览(47)
  • uniapp微信小程序:点击按钮先判断用户是否授权位置信息、用户位置信息授权、进入下一个页面

    前提 :该实例是使用uniapp的小程序 实现的 文章描述: 这里要实现的功能是: 1、点击页面中的一个按钮 2、判断用户是否授权位置信息 3、未授权–弹出位置授权框;已授权–进入下一个页面(地址选择页); 4、弹出位置授权框后,是否同意授权 5、同意:得到地址;不同

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包