国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

uniapp+node.js+mysql前后端微信小程序授權(quán)登錄

這篇具有很好參考價(jià)值的文章主要介紹了uniapp+node.js+mysql前后端微信小程序授權(quán)登錄。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔

文章目錄

目錄

文章目錄

前言

一、前端代碼?

1.微信授權(quán)登錄的頁(yè)面(沒(méi)有樣式,自己寫(xiě))

2.”我的“頁(yè)面

3.封裝request.js的頁(yè)面

4.vuex的狀態(tài)管理的頁(yè)面

5.添加了識(shí)別有放token的沒(méi)有登錄就自動(dòng)跳轉(zhuǎn)登錄的功能的main.js頁(yè)面

二、后端代碼

1.數(shù)據(jù)庫(kù)連接頁(yè)面(sql.js)

2.數(shù)據(jù)庫(kù)頁(yè)面封裝查詢用戶與插入用戶信息的頁(yè)面以及生成用戶的token(UserSql.js)

3.調(diào)用接口頁(yè)面(sever下面的router下面的index.js)

總結(jié)



前言

利用了vuex狀態(tài)管理存儲(chǔ)了登錄的信息,還加入了token,識(shí)別token是否需要授權(quán)登錄

利用了uni.login,uni.getUserProfile2個(gè)方法獲取用戶的openid和昵稱和頭像圖片地址

前端代碼:有5個(gè)頁(yè)面,1個(gè)是微信授權(quán)登錄的頁(yè)面,1個(gè)”我的“頁(yè)面

1個(gè)封裝request.js的頁(yè)面,2個(gè)vuex的狀態(tài)管理的頁(yè)面,1個(gè)是添加了識(shí)別有放token的沒(méi)有登錄就自動(dòng)跳轉(zhuǎn)登錄的功能的main.js頁(yè)面

后端代碼:1個(gè)數(shù)據(jù)庫(kù)連接頁(yè)面,1個(gè)數(shù)據(jù)庫(kù)頁(yè)面封裝查詢用戶與插入用戶信息的頁(yè)面以及生成用戶的token,1個(gè)調(diào)用接口頁(yè)面


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、前端代碼?

1.微信授權(quán)登錄的頁(yè)面(沒(méi)有樣式,自己寫(xiě))

<template>
?? ??? ??? ?<view ?@tap='loginOther()'>
?? ??? ??? ??? ?<button>微信登錄</button>
?? ??? ??? ?</view>
</template>
import $http from '@/common/api/request.js'
import {mapMutations} from 'vuex'
export default{
?? ?methods:{
? ? ...mapMutations(['login']),
? ? //關(guān)閉當(dāng)前頁(yè)面,返回上一頁(yè)
? ? goBack(){
? ? ?? ?uni.navigateBack({
? ? ?? ??? ?delta:1
? ? ?? ?})
? ? },
?? ??? ?loginOther(){
?? ??? ??? ?uni.login({
?? ??? ??? ??? ?success:(resp)=>{
? ? ? ? ? let code=resp.code;
? ? ? ? ? this.code=code;
?? ??? ??? ??? ?}
?? ??? ??? ?}),
? ? ? uni.getUserProfile({
? ? ? ?? ??? ??? ??? ??? ?desc: "獲取你的昵稱、頭像、地區(qū)及性別",
? ? ? ?? ??? ??? ??? ??? ?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:'請(qǐng)求失敗',
? ? ? ? ? ? ? ? ? ??? ??? ?icon:'none'
? ? ? ? ? ? ? ? ? ??? ?})
? ? ? ? ? ? ? ? ? ?})
? ? ? ?? ??? ??? ??? ??? ?},
? ? ? ?? ??? ??? ??? ?})
?? ??? ?}
?? ?}
}

2.”我的“頁(yè)面

?? ??? ??? ??? ?<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的頁(yè)面

import store from '@/store/index.js'
export default{
	common:{
		  baseUrl:"http://本地ip地址或者你的服務(wù)器ip地址或者你服務(wù)器的域名: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進(jìn)行用戶是否登錄的驗(yàn)證
		if(options.header.token){
			options.header.token = store.state.user.token;
			if(!options.header.token){
				uni.showToast({
					title:"請(qǐng)先登錄",
					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的狀態(tài)管理的頁(yè)面

store文件夾i中ndex.js的的文件然后調(diào)用user.js這個(gè)模塊

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:{
?? ??? ?//登錄狀態(tài)
?? ??? ?loginStatus:false,
?? ??? ?//token
?? ??? ?token:null,
?? ??? ?//用戶信息(昵稱/頭像)
?? ??? ?userInfo:{}
?? ?},
?? ?getters:{},
?? ?mutations:{
?? ??? ?//一旦進(jìn)入了app,就需要執(zhí)行這個(gè)方法,把用戶信息讀出來(lái)
?? ??? ?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;
?? ??? ??? ?//持久化存儲(chǔ) ===>把對(duì)象轉(zhuǎn)換成字符串
?? ??? ??? ?uni.setStorageSync('userInfo',JSON.stringify(userInfo));
?? ??? ?},
?? ??? ?//退出登錄
?? ??? ?loginOut(state){
?? ??? ??? ?state.loginStatus = false;
?? ??? ??? ?state.userInfo = {};
?? ??? ??? ?state.token = null;
?? ??? ??? ?//刪除本地存儲(chǔ)的信息
?? ??? ??? ?uni.removeStorageSync('userInfo');
?? ??? ?}
?? ?},
?? ?actions:{}
}

5.添加了識(shí)別有放token的沒(méi)有登錄就自動(dòng)跳轉(zhuǎn)登錄的功能的main.js頁(yè)面

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

Vue.config.productionTip = false

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

//權(quán)限跳轉(zhuǎn)
Vue.prototype.navigateTo = (options)=>{
	if( !store.state.user.loginStatus ){
		uni.showToast({
			title:"請(qǐng)先登錄",
			icon:"none"
		})
		return	uni.navigateTo({
				url:"/pages/login/login"
			})
	}
	uni.redirectTo(options)
}
				
App.mpType = 'app'

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

二、后端代碼

1.數(shù)據(jù)庫(kù)連接頁(yè)面(sql.js)

var mysql = require('mysql');//引入
var connection = mysql.createConnection({
      host     : 'localhost或者你的服務(wù)器公網(wǎng)地址',
      user     : '用戶名',
      password : '自己的數(shù)據(jù)庫(kù)密碼',
      database : '數(shù)據(jù)庫(kù)名稱'
});
module.exports = connection;//拋出

2.數(shù)據(jù)庫(kù)頁(yè)面封裝查詢用戶與插入用戶信息的頁(yè)面以及生成用戶的token(UserSql.js)

var User = {
	//查詢用戶名
	queryUserName( param ){
		if( param.openid){
			//phone = 應(yīng)該是手機(jī)號(hào)這個(gè)變量[屬性],為了后面好操作所有名稱改為:userName
			return "select * from wechatuser where openid = '"+param.openid+"' or nickName = '"+param.nickName+"' ";
		}
	},

	//增加一條用戶數(shù)據(jù)
	insertData( param ){
		let openid = param.openid;
		const jwt = require('jsonwebtoken');
		let payload = {name:openid}; //openid
		let secret = '自己編一個(gè)口令比如“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.調(diào)用接口頁(yè)面(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;//登陸傳過(guò)來(lái)的code
  let nickName=req.body.nickName;
  let avatarUrl=req.body.avatarUrl;
 let appid = "自己小程序后臺(tái)管理的appid"; //自己小程序后臺(tái)管理的appid,可登錄小程序后臺(tái)查看
 let mysecret = "小程序后臺(tái)管理的secret"; //小程序后臺(tái)管理的secret,可登錄小程序后臺(tái)查看
 let grant_type = "authorization_code"; // 授權(quán)(必填)默認(rèn)值
 //拼接出請(qǐng)求微信服務(wù)器的url地址然后請(qǐng)求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格式字符串轉(zhuǎn)換為js對(duì)象
        let parsData = JSON.parse(body.toString());
        let openid=parsData.openid;
        let session_key=parsData.session_key;
        let params={
          openid,
          nickName,
          avatarUrl
        }
	//查詢數(shù)據(jù)庫(kù)中有沒(méi)有此用戶
	connection.query( user.queryUserName( params ) , function (error, results, fields) {
		if( results.length > 0){
			//數(shù)據(jù)庫(kù)中存在      : 讀取
			connection.query( user.queryUserName( params ) , function (e, r) {
        
				res.send({
					data:r[0]
         
				})
			})
		}else{
			//數(shù)據(jù)庫(kù)中[不]存在  : 存儲(chǔ) ==>讀取
			connection.query( user.insertData( params ) , function (er, result) {
				connection.query( user.queryUserName( params ) , function (e, r) {
					res.send({
						data:r[0]
					})
				})
			})
		}
	}) 
         })
})

總結(jié)

當(dāng)你想要設(shè)置一個(gè)頁(yè)面想要使用必須先登錄就在那個(gè)頁(yè)面的接口請(qǐng)求中加入token比如

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

					header:{
						token:true
					}

				}).then((res)=>{
					this.initGetData(res);
				}).catch(()=>{
					uni.showToast({
						title:'請(qǐng)求失敗',
						icon:'none'
					})
				})


?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-490772.html

到了這里,關(guān)于uniapp+node.js+mysql前后端微信小程序授權(quán)登錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 新!uniapp微信小程序微信授權(quán)登錄

    新!uniapp微信小程序微信授權(quán)登錄

    ?11月后,微信小程序?qū)τ谖⑿攀跈?quán)登錄做了邏輯上的更改,之前的一鍵授權(quán)獲取用戶信息的功能已不再適用。已發(fā)布審核完成的小程序不受影響,但要想再發(fā)布,只能換成新的登陸邏輯了。 首先,要說(shuō)明的,個(gè)人中心頁(yè)面,未登陸時(shí),應(yīng)有登陸按鈕,最好不要通過(guò)路由守衛(wèi)

    2024年02月09日
    瀏覽(20)
  • uniapp微信小程序授權(quán)微信頭像昵稱

    自微信廢棄uni.getUserInfo和uni.getUserProfile授權(quán)登錄只能使用手機(jī)號(hào)授權(quán)了,頭像和昵稱則是改成了上傳的方式 代碼寫(xiě)的雖然比較low但是很實(shí)用的,可以借鑒一下 html js css? 我這里使用的scss

    2024年02月13日
    瀏覽(21)
  • uniApp微信小程序前后端交互

    config包下 common交互邏輯 index頁(yè)面 過(guò)濾攔截token 校驗(yàn)token

    2024年02月12日
    瀏覽(23)
  • uniApp 微信小程序 授權(quán) 公眾號(hào)推送信息

    uniApp 微信小程序 授權(quán) 公眾號(hào)推送信息

    準(zhǔn)本工作? 1.首先小程序 ?更公眾號(hào)關(guān)聯(lián)起來(lái) 2.配置相應(yīng)的域名(也就是你請(qǐng)求后端接口的公共地址) 3.需要寫(xiě)一個(gè)h5 頁(yè)面 用于跳板 公眾號(hào) 的授權(quán) 公眾號(hào)如何關(guān)聯(lián)小程序? 打開(kāi)微信公眾號(hào)后臺(tái),選擇「設(shè)置 – 公眾號(hào)設(shè)置 」 [關(guān)注公眾號(hào) -打開(kāi)開(kāi)關(guān)? ], 步驟一 步驟二? 步

    2024年02月10日
    瀏覽(25)
  • uniapp新版微信小程序用戶隱私協(xié)議授權(quán)

    manifest.json文件中進(jìn)行配置 App.vue中配置 判斷用戶有沒(méi)有進(jìn)行過(guò)隱私授權(quán) 編寫(xiě)組件 使用組件

    2024年02月09日
    瀏覽(32)
  • uniapp+node.js前后端做帖子模塊:分享帖子和分享頁(yè)面(社區(qū)管理平臺(tái)的小程序)

    ?? 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力! ?? 收藏,你的青睞是我努力的方向! ?? 評(píng)論,你的意見(jiàn)是我進(jìn)步的財(cái)富! 溫馨提示:我做的思路可能是復(fù)雜化了或者說(shuō)代碼寫(xiě)的不規(guī)范,如果你覺(jué)得可以更加簡(jiǎn)便的話歡迎分享到評(píng)論區(qū)或者自己改寫(xiě)一下我的代碼,我的后端是寫(xiě)的

    2024年03月11日
    瀏覽(22)
  • uniapp微信小程序授權(quán)登錄并獲取手機(jī)號(hào)

    新版:前端要授權(quán)兩次,一次獲取用戶信息授權(quán)碼code,另外一次獲取用戶手機(jī)授權(quán)碼code,全部傳給后端。后端通過(guò)用戶信息授權(quán)碼獲取openid,通過(guò)手機(jī)授權(quán)碼獲取手機(jī)號(hào)碼。老版:前端傳給后端授權(quán)碼code和用戶手機(jī)授權(quán)回調(diào)?里的iv和encryptedData給后端,后端通過(guò)code獲取ope

    2024年02月11日
    瀏覽(30)
  • uniApp微信小程序喚出授權(quán)頭像昵稱(微信授權(quán)登錄)彈窗,及服務(wù)端用戶信息解密注意事項(xiàng)

    uniApp微信小程序喚出授權(quán)頭像昵稱(微信授權(quán)登錄)彈窗,及服務(wù)端用戶信息解密注意事項(xiàng)

    頭像昵稱彈窗彈出條件:button授權(quán)按鈕 + uni.getUserProfile API請(qǐng)求 1.H5部分 2.JS部分 注意事項(xiàng): 不能嵌入其他API內(nèi)調(diào)用,一定要在調(diào)用的方法中第一層執(zhí)行(優(yōu)先執(zhí)行 uni.getUserProfile ) 正確做法 :必須第一步用戶點(diǎn)擊按鈕,第二步調(diào)取 uni.getUserProfile API(調(diào)取 uni.getUserProfile 操作

    2024年02月11日
    瀏覽(165)
  • uniapp微信小程序:點(diǎn)擊按鈕先判斷用戶是否授權(quán)位置信息、用戶位置信息授權(quán)、進(jìn)入下一個(gè)頁(yè)面

    uniapp微信小程序:點(diǎn)擊按鈕先判斷用戶是否授權(quán)位置信息、用戶位置信息授權(quán)、進(jìn)入下一個(gè)頁(yè)面

    前提 :該實(shí)例是使用uniapp的小程序 實(shí)現(xiàn)的 文章描述: 這里要實(shí)現(xiàn)的功能是: 1、點(diǎn)擊頁(yè)面中的一個(gè)按鈕 2、判斷用戶是否授權(quán)位置信息 3、未授權(quán)–彈出位置授權(quán)框;已授權(quán)–進(jìn)入下一個(gè)頁(yè)面(地址選擇頁(yè)); 4、彈出位置授權(quán)框后,是否同意授權(quán) 5、同意:得到地址;不同

    2024年02月08日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包