uniapp+express前后端小程序获取头像和昵称和code,openid,小程序授权登陆最新教程

目录

  • 0总体思路
    • 0.1前端实现:
    • 0.2如何阻拦一些页面必须要登陆才能进去呢?
    • 0.3后端实现
  • 1.首页
  • 2.个人中心页
  • 3.授权登陆页
    • 3.1.获取微信头像和微信昵称
      • 3.1.1官方教程
      • 3.1.2实际实现
    • 3.2.获取头像和昵称之后去获取code小程序授权登陆
    • 3.3登陆页的整体代码:
  • 4.接口封装页
  • 5.全局变量vuex页
    • 5.1代码:
    • 5.2使用方法:
      • 5.2.1.保存数据到vuex
      • 5.2.2.获取数据的就是代码如下:
  • 6.后端实现
    • 6.1封装一个数据库的连接请求
    • 6.2登陆授权的接口实现


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


0总体思路

温馨提示:我做的思路可能是复杂化了,如果你觉得可以更加简便的话欢迎分享到评论区或者自己改写一下我的代码,我的后端是写的很简单的没有什么路由分发是直接写的,你可以自由优化
1-5都是在说前端,如果你想看后端直接跳到第6章就好

0.1前端实现:

首先小程序进入首页自动去获取一遍本地存储的用户信息赋值到vuex里面去,用户进入个人中心的时候页面去获取vuex里面的用户信息(头像,昵称),如果发现没有的话就显示登录注册按钮,点击之后跳转到用户授权登录页,用户授权头像和昵称之后点击授权登陆按钮,获取到用户的code传入到后端,后端返回用户信息和token给前端,前端保存到本地存储和vuex里面去

0.2如何阻拦一些页面必须要登陆才能进去呢?

我的逻辑思路是在封装的请求接口里面的请求放获取本地存储的token,如果有就传入后端如果没有就传无给后端,后端在那些需要阻拦登陆的接口前面放中间件,放token验证的中间件,验证这个token解析出来的用户信息是不是这个用户的(这一步我是没有做的,所以我就是介绍一个思路你们可以自己去做)

0.3后端实现

后端解构赋值接受code+头像+昵称,然后拿code去拼接一个链接(看代码)去请求微信官方服务器,我这里的请求是用到了aixos所以记得导入这个第三方库哦!!!,拿拼接好的链接去换取这个用户的openid(这个很重要是用户的唯一标识),换取到openid之后去数据库里面查询用户表里面有没有一条数据包含这个openid的如果没有就是注册,如果有就是登陆(需要注意的是本文代码是没有去注意查看对比用户这次上传的头像和昵称与数据库里面的数据去对比就只是对比了openid来判断用户是注册还是登陆)

1.首页

onLoad是页面加载时,放在js那里和data是同级关系

  onLoad() {const user = uni.getStorageSync('user');const token = uni.getStorageSync('token');this.$store.commit('user', user);this.$store.commit('token', token);},

2.个人中心页

<view class="head"><view class="gr"><view v-if="user.avatarUrl && user.nickName" class="user-info"><image :src="user.avatarUrl" mode="aspectFill" class="avatar"></image><text class="nickname">{{ user.nickName }}</text></view><view v-else @click="wxlogin()">点击注册登录</view></view>
</view>
      data() {return {user: {} // 用户信息};},onShow() {// 在页面显示时获取vuex中的user信息this.user = this.$store.state.user || {};},methods: {wxlogin() {uni.navigateTo({url: '/pages/login/login'});},

3.授权登陆页

3.1.获取微信头像和微信昵称

3.1.1官方教程

根据官方给的教程:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html
官方代码示例:




const defaultAvatarUrl = ‘https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0’

Page({
data: {
avatarUrl: defaultAvatarUrl,
},
onChooseAvatar(e) {
const { avatarUrl } = e.detail
this.setData({
avatarUrl,
})
}
})

3.1.2实际实现

我的实际代码示例:获取到头像和昵称然后保存到本页面的数据中

<button open-type=“chooseAvatar” @chooseavatar=“onChooseAvatar”>


<input class=“nickNameInput” type=“nickname” :value=“nickName” placeholder=“请输入您的昵称” @change=“getNickname” />
<button @click=“wxlogin()”>注册登录

getNickname(e) {
this.nickName = e.detail.value;
},
onChooseAvatar(e) {
this.avatar = e.detail.avatarUrl;
console.log(e.detail.avatarUrl);
},

3.2.获取头像和昵称之后去获取code小程序授权登陆

注意就是获取code必须要点击事件,需要用户去点击,可以看官方的:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
逻辑思路是先让用户上传完头像和昵称之后让用户去点击授权登陆的按钮,点击之后获取到code然后将这三个数据都传入后端,需要注意的是如果用户没有上传头像和昵称(即这2个数据为空时要阻止授权登陆并提示(我这里没写))
样式css需要自己去调节哦

3.3登陆页的整体代码:

<template><view><button open-type="chooseAvatar" @chooseavatar="onChooseAvatar"><img :src="avatar" alt="" srcset="" /></button><input class="nickNameInput" type="nickname" :value="nickName" placeholder="请输入您的昵称" @change="getNickname" /><button @click="wxlogin()">注册登录</button></view>
</template>
<script>
export default {data() {return {avatar: '',nickName: '',code: ''};},methods: {getNickname(e) {this.nickName = e.detail.value;},onChooseAvatar(e) {this.avatar = e.detail.avatarUrl;console.log(e.detail.avatarUrl);},wxlogin() {uni.login({provider: 'weixin',success: (loginRes) => {if (loginRes.code) {this.code = loginRes.code;// 发送 res.code 到后台换取 openId, sessionKey, unionIdconsole.log(loginRes.code);this.getCode();} else {console.log('登录失败!' + loginRes.errMsg);}}});},async getCode() {const res = await this.$myRequest({method: 'post',url: '/wxlogin',data: {avatar: this.avatar,nickName: this.nickName,code: this.code}});const user = res.data.user;const token = res.data.token;// 保存数据到小程序本地存储uni.setStorageSync('user', user);uni.setStorageSync('token', token);// 保存数据到vuex里面去this.$store.commit('user', user);this.$store.commit('token', token);// 返回上一页uni.navigateBack();console.log(res.data.user);}}
};
</script>

4.接口封装页

在这个登陆页面我的请求接口是进行封装的然后全局挂载了
新建一个request.js文件,代码如下:

// 设置基础 URL
const BASE_URL = 'http://192.168.0.105:8080';
// 封装请求方法,返回一个 Promise 对象
export const myRequest = (options) => {return new Promise((resolve, reject) => {// 使用 uni.request 进行请求uni.request({// 拼接完整的请求 URLurl: BASE_URL + options.url,// 请求方法,默认为 GETmethod: options.method || 'GET',// 请求数据,默认为空对象data: options.data || {},// 请求头部,包含 Authorization 字段,用于携带 Tokenheader: {Authorization: uni.getStorageSync('token') // 从本地存储中获取 Token},// 请求成功的回调函数success: (res) => {resolve(res); // 将成功的响应传递给 Promise 的 resolve 函数},// 请求失败的回调函数fail: (err) => {// 在页面上显示请求失败的提示信息uni.showToast({title: '请求接口失败'});reject(err); // 将失败的错误对象传递给 Promise 的 reject 函数}});});
};

新建完文件之后还需要在mian.js导入进行全局挂载进行使用:

import {myRequest
} from './common/request.js'Vue.prototype.$myRequest = myRequest

5.全局变量vuex页

5.1代码:

我这里是用vuex去管理全局变量的,就是将用户信息和token保存到vuex里面去,你们也可以保存你们想要的全局变量到vuex里面去方便使用
新建一个store目录里面新建一个index.js文件,里面代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({state: {//公共的变量,这里的变量不能随便修改,只能通过触发mutations的方法才能改变user: null, //用户信息token: null, //登陆令牌communityId: 1 //小区id},mutations: {//相当于同步的操作user(state, user) {state.user = user;},token(state, token) {state.token = token;},communityId(state, communityId) {state.communityId = communityId;}},actions: {//相当于异步的操作,不能直接改变state的值,只能通过触发mutations的方法才能改变}
})
export default store

搞完之后到mian.js文件去导入然后全局挂载:

import store from './store/index.js'
Vue.prototype.$store = store

5.2使用方法:

5.2.1.保存数据到vuex

保存数据到vuex里面去的话就是需要你先在这个inde.js新建一个变量并且你还需要新建一个方法就是用来操作的比如说:

//相当于同步的操作
user(state, user) {state.user = user;
},

你可以按照这个的格式新建其他数据的操作方法,然后我这里保存user数据的话就是代码如下:

  // 保存数据到vuex里面去this.$store.commit('user', user);

5.2.2.获取数据的就是代码如下:

//获取vuex里面的用户信息
this.user = this.$store.state.user

6.后端实现

6.1封装一个数据库的连接请求

新建一个sql.js然后再导入到app.js
var mysql = require(‘mysql’); //引入
var connection = mysql.createConnection({
host: ‘localhost’,
user: ‘root’,
password: ‘root’,
database: ‘zxjy’
});
module.exports = connection; //抛出

6.2登陆授权的接口实现

提示:cors是为了用来跨域的,axios是用来做微信请求的,jsw是用来生成token的,还有上面那个sql都是第三方包需要记得用npm install哦!!!以及那个内容需要自己设置一下哦比如说appid,密钥啥的

const express = require('express')
const connection = require('./sql.js');
const cors = require('cors'); //配置 CORS 策略
const axios = require('axios'); //网络请求模块,用来请求那个微信服务器的openid
const jwt = require('jsonwebtoken'); //生成 Token 
// 1.创建express的服务器
const app = express()
const appid = ""; //自己小程序后台管理的appid,可登录小程序后台查看
const mysecret = ""; //小程序后台管理的secret,可登录小程序后台查看
const grant_type = "authorization_code"; // 授权(必填)默认值
const secretKey = ''; //jwt的密钥
// 封装微信API请求
async function wxlogin(code) {const url =`https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${mysecret}&js_code=${code}&grant_type=${grant_type}`;try {const response = await axios.get(url);return response.data;} catch (error) {console.error(error);throw error;}
}app.use(cors()); // 使用 CORS 中间件  
app.use(express.json()); // 解析 POST 请求的请求体
//注册登录的接口
app.post('/wxlogin', async (req, res) => {let code = req.body.code; //登陆传过来的codelet nickName = req.body.nickName;let avatarUrl = req.body.avatar;const params = await wxlogin(code);let openid = params.openid //查询一下这个openid是否存在数据库来判断用户是登陆还是注册,没有判断头像或者昵称是否更新connection.query('SELECT * FROM user WHERE openId = ?', [openid], (error, results) => {if (error) {console.error(error);return res.status(500).json({error: 'Internal Server Error'});}if (results.length > 0) {// 用户已存在const user = {id: results[0].id,nickName: results[0].name,avatarUrl: results[0].avatar};// 生成 Tokenconst token = jwt.sign(user, secretKey, {expiresIn: '9999h'}); // Token 有效期为9999小时return res.json({message: '用户已存在',token,user});} else {// 用户不存在,需要注册// 使用昵称、头像、openid 插入新用户到数据库connection.query('INSERT INTO user (openId, name, avatar) VALUES (?, ?, ?)', [openid,nickName, avatarUrl], (error, insertResult) => {if (error) {console.error(error);return res.status(500).json({error: 'Internal Server Error'});}const userId = insertResult.insertId; // 获取插入的用户的 idconst user = {id: userId,nickName,avatarUrl};return res.json({message: '用户注册成功',token,user});});}});
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode每日一题】二分查找 - 寻找峰值(难度⭐⭐)(20)

1. 题目解析 Leetcode链接&#xff1a;162. 寻找峰值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目中所说的峰值并返回他们的下标即可。 2. 算法原理 分析峰顶及其两旁数据的特点 峰顶数据特点&#xff1a;峰…

windows 11+docker desktop+grafana+influxDB+python写入

下载安装docker desktop 出现WSL相关的错误。WSL是一个linux内核的子系统&#xff0c;docker是基于linux内核的&#xff0c;所以运行docker需要WSL。 以管理员权限打开powershell&#xff0c;查看WSL状态 wsl --status 我遇到的错误是因为我关闭了windows的某些更新 执行上…

Android自定义View实现数字密码锁

最近项目上用到一个密码加锁功能&#xff0c;需要一个数字密码界面&#xff0c;就想着封装成一个View来方便管理和使用。 废话不多说&#xff0c;先上最终效果图&#xff1a; 思路 整体可分为2个部分来实现&#xff0c;1.顶部是4个密码位的填充&#xff1b;2.数字键盘部分。整…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

旧衣服回收小程序开发:企业、创业者收益新模式

近年来&#xff0c;我国旧衣回收行业发展迅速。随着大众对衣物的更新需求增加&#xff0c;闲置衣物便也不断增加&#xff0c;我国的旧衣回收行业的市场规模随之增加。 当下&#xff0c;旧衣回收产业链较为完善&#xff0c;主要以出口为主&#xff0c;回收利润较高。与其他行业…

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

python Matplotlib Tkinter--pack 框架案例

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 版本一 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox…

优思学院|精益生产管理在中国的发展前景

在这个快速变化的世界里&#xff0c;有一个管理理念悄然崛起&#xff0c;它就是精益生产。 这个概念最早由詹姆斯P沃麦克、丹尼尔T琼斯和丹尼尔鲁斯在他们的著作《改变世界的机器》中提出&#xff0c;后来在丰田汽车公司的成功实践中得到了广泛的认可。 这本书不仅风靡全球&a…

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…

Selenium 自动化遇见 shadow-root 元素怎么处理?

shadow-root是前端的特殊元素节点&#xff0c;其使用了一个叫做shadowDOM的技术做了封装&#xff0c;shadowDOM的作用可以理解为在默认的DOM结构中又嵌套了一个DOM结构&#xff08;和iframe有点类似&#xff0c;只不过iframe内嵌的是HTML&#xff09;&#xff0c;我们遇见shado…

LMDeploy 大模型量化部署

Weight Only量化是一种常见的模型优化技术&#xff0c;特别是在深度学习模型的部署中。这种技术仅对模型的权重进行量化&#xff0c;而不涉及激活&#xff08;即模型中间层的输出&#xff09;。选择采用Weight Only量化的原因主要包括以下几点&#xff1a; 减少模型大小 通过将…

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术&#xff0c;自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat&#xff0c;Centos&#xff0c;OracleLinux 三种。 三者的区别简单说明如下&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

ICASSP2024 | MLCA-AVSR: 基于多层交叉注意力机制的视听语音识别

视听语音识别&#xff08;Audio-visual speech recognition, AVSR&#xff09;是指结合音频和视频信息对语音进行识别的技术。当前&#xff0c;语音识别&#xff08;ASR&#xff09;系统在准确性在某些场景下已经达到与人类相媲美的水平。然而在复杂声学环境或远场拾音场景&…

大语言模型推理加速技术:计算加速篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;计算加速篇 - 知乎 目录 简介 Transformer和Attention 瓶颈 优化目标 计算加速 计算侧优化 KVCache Kernel优化和算子融合 分布式推理 内存IO优化 Flash Attention Flash Decoding Continuous Batching Page…

Go Run - Go 语言中的简洁指令

原文&#xff1a;breadchris - 2024.02.21 也许听起来有些傻&#xff0c;但go run是我最喜欢的 Go 语言特性。想要运行你的代码&#xff1f;只需go run main.go。它是如此简单&#xff0c;我可以告诉母亲这个命令&#xff0c;她会立即理解。就像 Go 语言的大部分功能一样&…

微调实操四:直接偏好优化方法-DPO

在《微调实操三:人类反馈对语言模型进行强化学习(RLHF)》中提到过第三阶段有2个方法,一种是是RLHF, 另外一种就是今天的DPO方法, DPO通过直接优化语言模型来实现对其行为的精确控制&#xff0c;而无需使用复杂的强化学习&#xff0c;也可以有效学习到人类偏好&#xff0c;DPO相…

python中的类与对象(2)

目录 一. 类的基本语法 二. 类属性的应用场景 三. 类与类之间的依赖关系 &#xff08;1&#xff09;依赖关系 &#xff08;2&#xff09;关联关系 &#xff08;3&#xff09;组合关系 四. 类的继承 一. 类的基本语法 先看一段最简单的代码&#xff1a; class Dog():d_…

智慧公厕的目的和意义是什么?

智慧公厕是近年来城市建设中的一项重要举措&#xff0c;其目的在于实现公共厕所的智慧化管理&#xff0c;为市民群众提供更好的服务体验&#xff0c;助力智慧城市和数字环卫的发展&#xff0c;提升社会公共卫生服务水平。 与此同时&#xff0c;智能公厕也具有重要的意义&#x…

springboot+vue实现微信公众号扫码登录

通常在个人网站中&#xff0c;都会有各种第三方登录&#xff0c;其中微信登录需要认证才能使用&#xff0c;导致个人开发者不能进行使用此功能&#xff0c;但是我们可以使用微信公众号回复特定验证码来进行登录操作。 微信关键词处理 微信公众号关键词自动回复&#xff0c;具体…

60kW 可编程直流回馈负载箱的优势和特点

60kW可编程直流回馈负载箱是一种先进的电力设备&#xff0c;主要用于模拟电网中的负载&#xff0c;为电力系统提供稳定的负载环境。它具有许多优势和特点&#xff0c;使其在电力系统中得到了广泛的应用。 60kW可编程直流回馈负载箱具有高效的能源转换效率&#xff0c;能够将电能…