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.微信授权登录的页面(没有样式,自己写)

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.”我的“页面

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


 

你可能感兴趣的:(uni-app,node.js,mysql,微信小程序,express)