首页 > 数据库 >uniapp+node.js+mysql前后端微信小程序授权登录

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

时间:2023-12-12 17:04:42浏览次数:38  
标签:node uniapp 微信 state js token let userInfo 页面


文章目录

一、前端代码?

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>

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

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'
                       })
                   })
                          },
                      })
        }
    }
}

uniapp+node.js+mysql前后端微信小程序授权登录_用户信息_02

2.”我的“页面

<view class='header-logo'>
                    <image class='logo-img' :src=" loginStatus ? userInfo.avatarUrl: '' " mode=""></image>
                    <view class='logo-name'>
                        {{  loginStatus ? userInfo.nickName : ""   }}
                    </view>
                </view>

uniapp+node.js+mysql前后端微信小程序授权登录_用户信息_03

import {mapState} from 'vuex';
	export default {
		computed:{
			...mapState({
				loginStatus:state=>state.user.loginStatus,
				userInfo:state=>state.user.userInfo
			})
		}

	}

uniapp+node.js+mysql前后端微信小程序授权登录_数据库_04

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);
				}
			})
		})
	}
}

uniapp+node.js+mysql前后端微信小程序授权登录_用户信息_05

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,
    }
})

uniapp+node.js+mysql前后端微信小程序授权登录_数据库_06

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:{}
}

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

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()

uniapp+node.js+mysql前后端微信小程序授权登录_数据库_08

二、后端代码

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

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

uniapp+node.js+mysql前后端微信小程序授权登录_数据库_09

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;

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

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]
					})
				})
			})
		}
	}) 
         })
})

uniapp+node.js+mysql前后端微信小程序授权登录_数据库_11


总结

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

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

					header:{
						token:true
					}

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

 



标签:node,uniapp,微信,state,js,token,let,userInfo,页面
From: https://blog.51cto.com/u_14972985/8789337

相关文章

  • Hadoop NameNode(SecondaryNameNode) Fsimage和Edits解析
    NameNode被格式化之后,将在NameNode目录下产生一些文件1.Fsimage文件Fsimage文件是HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息1.查看Fsimage文件1.oiv命令hdfsoiv-p文件类型-i镜像文件-o转换后文件的输出路径hdfs......
  • NodeJs学习笔记
    目录NodeJsBuffer(缓冲区)概念特点使用计算机基础进程与线程fs模块写入文件①.writeFile异步写入②.writeFileSync同步写入③.appendFile/appendFileSync追加写入④.createWriteStream流式写入需要写入文件的场景文件读取①.readFile异步读取②.readFileSync同步读......
  • 微信公众号文章批量转pdf
    操作步骤步骤一:下载离线html网页文件1、登录微信公众号后台,打开“发表记录”。2、按Ctrl+S或右击网页选择“另存为”,保存离线的html网页文件。(网页的文件后缀名是html)3、记住html文件保存路径(如下图最上面红色方框),并设置【html文件名称】。注意:html文件由序号1~n,html文件名称格......
  • node.js--npm初始
    npm安装安装node.js时候会自动安装npm,所以如果安装了node.js就不需要安装npm了,命令行使用命令npm-v查看npm版本,出现版本号,则表示安装成功。npm初始化包使用npminit命令创建一个package.json文件,然后使用npminstall命令安装依赖。如果使用命令npminit-y则......
  • uniapp插件市场上架插件,提示components不包含对应包名称的组件
    第一次在uniapp上架了一个小组件,所有的都按照文档填写上传了,但是提交的时候一直提示不行原来是在压缩组件源码的时候出问题,不要把components和static放在一个文件夹下面压缩文件夹,要直接把components和`static``组合压缩就行。这是错误的这是正确的......
  • 微信小程序自定义顶部导航栏并适配不同机型
    前言在小程序中,顶部导航栏是一个非常重要的组件,它不仅可以方便用户进行页面切换,还可以提高用户体验。默认情况下,小程序的顶部导航栏是由系统自动生成的,我们只能修改一些基本的样式,如背景色、文字颜色等。但是,如果想要实现更加复杂的样式,如自定义图标、自定义背景等,而且在不同的手......
  • ElasticSearch之Node query cache settings
    对于filter查询,ElasticSearch提供了缓存查询结果的特性,当缓存中存在满足查询条件要求的数据时,直接从缓存中提取查询结果。对于ElasticSearch节点,该节点上的所有shard共享同一个缓存区域。ElasticSearch基于LRU算法来管理缓存中的数据,当空间不足以承载最新的查询操作的结果时,使用......
  • Kilikilinode2
    自做网页2(优化,补充)前言之前做的网页还有许多需要优化的地方,比如用户登录退出,认证方式.....等等。下面一个一个来优化一下,下面只做主要代码目录自做网页2(优化,补充)1.注册用户优化2.登录页面优化3.首页头像的优化随机显示头像和退出功能4.试下使用B站的嵌入代码,再加个背景音乐......
  • Kilikilinode1
    Kilikili首页布局设计1(仿照Bilibili)目录Kilikili首页布局设计1(仿照Bilibili)一、整体布局分析二、具体代码1、head设计1.1html设计1.2CSS设计1.3JS设计1.4遇到的问题总结2、channel设计1.1html设计1.2CSS设计1.3JS设计1.4遇到的问题总结3、body设计1.1html设计1.2CS......
  • Kilikilinode2
    自做网页2(优化,补充)前言之前做的网页还有许多需要优化的地方,比如用户登录退出,认证方式.....等等。下面一个一个来优化一下,下面只做主要代码目录自做网页2(优化,补充)1.注册用户优化2.登录页面优化3.首页头像的优化随机显示头像和退出功能4.试下使用B站的嵌入代码,再加个背景音乐......