当前位置: 首页 > news >正文

PC端扫描小程序二维码登录

1、获取二维码地址,通过请求微信开发者文档中的服务端获取无限制小程序二维码URL

#controller层
import org.apache.commons.codec.binary.Base64;/*** 获取小程序二维码*/@PassToken@GetMapping("/getQrCode")public AjaxResult getQrCode(BlogUserDto blogUserDto){String base64 = blogUserService.getQrCode(blogUserDto);if (StrUtil.isBlank(base64)){return AjaxResult.error("获取二维码失败");}return AjaxResult.success("data:image/png;base64,"+base64);}#service层/*** 获取小程序二维码* @return*/String getQrCode(BlogUserDto blogUserDto);#service impl层
@Overridepublic String getQrCode(BlogUserDto blogUserDto) {String base64;try{//先判断access_token是否存在。不存在则查询String key = Constants.MINAPP_ACCESS_TOKEN;String accessToken = null;if (redisCache.hasKey(key)){accessToken = redisCache.getCacheObject(key);}if (accessToken  == null){accessToken = wxMaService.getAccessToken(true);redisCache.setCacheObject(key,accessToken,7200, TimeUnit.SECONDS);}//传入的参数a=1&b=2String scene = blogUserDto.getScene();//扫码后跳转的页面String page = "pages/index";boolean checkPath = false;//版本。正式版为release,体验版trial,开发版developString envVersion = "develop";//二维码的宽度int width = 280;boolean autoColor= false;WxMaCodeLineColor lineColor = null;boolean isHyaline = false;//获取无限制二维码byte[] bytes = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(scene,page,checkPath,envVersion,width,autoColor,lineColor,isHyaline);base64 = new String(Objects.requireNonNull(Base64.encodeBase64(bytes)));}catch (Exception e){e.printStackTrace();return null;}return base64;}#Constant类/*** 小程序access_token*/public static final String MINAPP_ACCESS_TOKEN = "minapp_access_token:";

2、将获取到的base64图片地址显示在PC端

<div  style="width: 100%;height: 100%;text-align: center;position:relative"><img :src="codeUrl" alt=""  :loading="loadingCorUrl"style=""><div v-if="showexpire"  @click="clickScanQR" style="width: 65%;height: 98%;position:absolute;top:0%;left:50%;transform:translateX(-50%);opacity: 0.9;font-size:20px;background-color: darkgray;font-color:black;"><div style="position:absolute;top:40%;left:40%;"><i class="el-icon-refresh" style="font-size:60px;color:#ffffff;cursor: pointer;"></i></div><div style="position:absolute;top:65%;left:25%;font-size:15px;color:#ffffff;">二维码失效,点击重试</div></div></div>scene:null,timer:null,loadingCorUrl:false,showexpire:false,//点击重新刷新二维码clickScanQR(){this.getQrCode();},

3、scene的值由PC端生成传给获取二维码的接口。

4、uniapp收到scene的值后,小程序微信登录

 onLoad: function(query) {this.getBanner();// this.getBlogList();setTimeout(function () {console.log('start pulldown');}, 1000);uni.startPullDownRefresh();//获取pc端扫码后传的参数值const scene = decodeURIComponent(query.scene);console.log("scene:"+scene);//如果scene有值,判断用户是否登录if(scene && scene != undefined && scene != 'undefined'){console.log("token:"+this.$store.state.user.token)//如果登录,授权网站。if(this.$store.state.user.token){console.log("llll")updateScene({"scene":scene}).then(res=>{});}else{// 如果没有登录,直接微信登录,授权网站this.$tab.navigateTo('/pages/mine/wxlogin/index?scene='+scene)}}},

5、pc端具体代码

algorithm(){let abc=['a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];let [max,min]=[Math.floor(Math.random()*(10-7+1)+1),Math.floor(Math.random()*(17-10+1)+17)];abc=abc.sort(()=>0.4-Math.random()).slice(max,min).slice(0,8).join("");var a=new Date().getTime()+abc;return a},getQrCode(){this.scene = this.algorithm();this.loadingCorUrl=true;this.showexpire=false;getQrCode({"scene":this.scene}).then(res=>{if(res.code == 200){this.codeUrl=res.msg;if(this.codeUrl && this.codeUrl != undefined && this.codeUrl != 'undefined'){this.loadingCorUrl=false;//获取后轮询var _this = this;var seconds=0,minutes=0;_this.timer = setInterval(()=>{seconds=seconds+3;console.log("seconds:"+seconds);if(seconds == 60){minutes = minutes+1;}_this.$store.dispatch("BlogLoginByScene", {"scene":_this.scene}).then((res) => {if(res.code == 200 && res.token && res.token != undefined &&  res.token != 'undefined'){clearInterval(_this.timer);_this.open = false;_this.getUserInfo();}}).catch(() => {});console.log("minutes:"+minutes)if(minutes == 1){clearInterval(_this.timer);_this.showexpire=true;}},3000)}}})},

6、第5条里的微信扫码登录是另外的接口,在登录配置里另外配置,设置如下

#store->userBlog.js里设置
import {login, logout, getInfo,loginByScene} from '@/api/loginBlog'//根据scene查询登录BlogLoginByScene({commit}, userInfo) {const scene = userInfo.scenereturn new Promise((resolve, reject) => {loginByScene(scene).then(res => {if(res.code == 200 && res.token && res.token != undefined  && res.token != 'undefined'){setToken(res.token)commit('SET_BLOG_TOKEN', res.token)}resolve(res)}).catch(error => {reject(error)})})},#api->loginBlog.js
//根据scene查询登录
export function loginByScene(scene) {const data = {scene}return request({url: '/reception/blog/user/getUserByScene',headers: {isToken: false},method: 'get',params: data})
}

7、后端接口

#controller层
/*** 根据scene查询用户*/@PassToken@GetMapping("/getUserByScene")public AjaxResult getUserByScene(BlogUserDto blogUserDto){if (StrUtil.isBlank(blogUserDto.getScene())){return AjaxResult.error("参数值错误");}BlogUser blogUser = blogUserService.getOne(new LambdaQueryWrapper<BlogUser>().select(BlogUser::getId).eq(BlogUser::getScene,blogUserDto.getScene()));if (blogUser != null){//创建tokenMap<String,Object> claims = new HashMap<>();claims.put("uuid", IdUtils.getLongId());claims.put(Constants.BLOG_LOGIN_USER_KEY,blogUser.getId());String token = tokenService.createToken((claims));redisCache.setCacheObject(CacheConstants.BLOG_LOGIN_TOKEN_KEY + blogUser.getId(),token);AjaxResult ajax = AjaxResult.success();ajax.put(Constants.TOKEN, token);return ajax;}return AjaxResult.success();}/*** 更新用户scene值* @param id* @param blogUser* @return*/@PutMapping("/updateScene")public AjaxResult updateScene(@CurrentUser Long id,@RequestBody BlogUser blogUser){blogUser.setId(id);blogUserService.updateById(blogUser);return AjaxResult.success();}

相关文章:

PC端扫描小程序二维码登录

1、获取二维码地址&#xff0c;通过请求微信开发者文档中的服务端获取无限制小程序二维码URL #controller层 import org.apache.commons.codec.binary.Base64;/*** 获取小程序二维码*/PassTokenGetMapping("/getQrCode")public AjaxResult getQrCode(BlogUserDto bl…...

计算机毕业设计 | SpringBoot+vue移动端音乐网站 音乐播放器(附源码)

1&#xff0c;项目背景 随着计算机技术的发展&#xff0c;网络技术对我们生活和工作显得越来越重要&#xff0c;特别是现在信息高度发达的今天&#xff0c;人们对最新信息的需求和发布迫切的需要及时性。为了满足不同人们对网络需求&#xff0c;各种特色&#xff0c;各种主题的…...

Flutter 中的 Stream:异步编程的利器

在Flutter中&#xff0c;异步编程是非常重要的一部分&#xff0c;特别是在处理用户输入、网络请求或其他涉及时间的操作时。Flutter提供了一种强大的工具&#xff0c;称为Stream&#xff0c;用于简化异步编程的过程。 什么是 Stream&#xff1f; Stream是一种用于处理异步数据…...

2023 波卡年度报告选读:Polkadot SDK 与开发者社区

原文&#xff1a;https://dashboards.data.paritytech.io/reports/2023/index.html#section6 编译&#xff1a;OneBlock 编者注&#xff1a;Parity 数据团队发布的 2023 年 Polkadot 年度数据报告&#xff0c;对推动生态系统的关键数据进行了深入分析。报告全文较长&#xff…...

深入了解Go语言中的unsafe.Sizeof():探究变量与数据类型的内存占用

当涉及到在 Go 语言中确定变量或数据类型所占用的内存空间大小时&#xff0c;unsafe 包中的 Sizeof() 函数成为了一个强有力的工具。它可以用来获取变量或数据类型所占用的字节数&#xff0c;但需要注意的是&#xff0c;它不考虑内存对齐和填充的情况。因此&#xff0c;在使用 …...

安卓上使用免费的地图OpenStreetMap

前一段使用了微信的地图&#xff0c;非常的好用。但是存在的问题是海外无法使用&#xff0c;出国就不能用了&#xff1b; 其实国内三家&#xff1a;百度&#xff0c;高德&#xff0c;微信都是一样的问题&#xff0c;当涉及到商业使用的时候需要付费&#xff1b; 国外除了谷歌…...

基于Java SSM框架实现时间管理系统项目【项目源码+论文说明】

基于java的SSM框架实现时间管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于时间管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了时间管理…...

Mac安装upx及不同os计算md5值

Mac安装upx 最近需要将exe文件打包到pod内部&#xff0c;为了减少包占用磁盘空间&#xff0c;需要借用upx对windows exe文件进行压缩。 1 概念&#xff1a;压缩工具 UPX 全称是 “Ultimate Packer for eXecutables”&#xff0c;是一个免费、开源、编写、可扩展、高性能的可执行…...

Qt/C++编写视频监控系统82-自定义音柱显示

一、前言 通过音柱控件实时展示当前播放的声音产生的振幅的大小&#xff0c;得益于音频播放组件内置了音频振幅的计算&#xff0c;可以动态开启和关闭&#xff0c;开启后会对发送过来的要播放的声音数据&#xff0c;进行运算得到当前这个音频数据的振幅&#xff0c;类似于分贝…...

SpringBoot 如何 配置端口号

结论 server:port: 8088演示 [Ref] 快速构建SpringBoot项目...

跟随chatgpt从零开始安装git(Windows系统)

为什么我们要安装Git&#xff1f;Git有什么用&#xff1f; 1. 版本控制&#xff1a;Git 可以追踪代码的所有变化&#xff0c;记录每个提交的差异&#xff0c;使您能够轻松地回溯到任何历史版本或比较不同版本之间的差异。 2. 分支管理&#xff1a;通过 Git 的分支功能&#xff…...

C++类与对象基础(6)

(注&#xff1a;本篇文章介绍部分内容时&#xff0c;需要用到上盘文章中日期类的代码&#xff0c;文章链接如下&#xff1a;C类与对象基础(5)——日期类的实现-CSDN博客​​​​​​&#xff09; 目录 1. 运算符重载的相关补充&#xff1a; 1.1流运算符重载出现的问题&#x…...

OS_lab——分页机制与内存管理

认真阅读章节资料&#xff0c;掌握什么是分页机制 调试代码&#xff0c;掌握分页机制基本方法与思路 代码pmtest6.asm中&#xff0c;212行~237行&#xff0c;设置断点调试这几个循环&#xff0c;分析究竟在这里做了什么 掌握PDE&#xff0c;PTE的计算方法 动手画一画这个映…...

【面试】Redis基础知识

题目 为什么Redis是单线程却性能很高&#xff1f; Redis是一个高性能的基于内存的键值存储系统。它之所以能够达到高性能&#xff0c;主要有以下几个原因&#xff1a; 基于内存&#xff1a;Redis将数据存储在内存中&#xff0c;而不是硬盘上&#xff0c;这使得数据的读写速度…...

CentOS 9 (stream) 安装 Docker

1. Docker 简介 Docker 是一个开源的容器化平台&#xff0c;可帮助开发者轻松地创建、部署和运行应用程序。Docker 使开发人员能够在一个独立的容器中打包应用程序及其依赖项&#xff0c;这样他们就可以轻松地将应用程序移植到任何其他环境中。 Docker 主要由以下几个组件组成…...

vite中配置服务代理

前言 在vite中配置服务代理和webpack中大差不差,不过有些写法会有些不同 具体配置:配置 Vite {#configuring-vite} | Vite中文网 这里我写了一个demo,如下所示 开启node服务 我用express启动了一个服务,分别暴露两个接口 进行相关配置 在vite.config.ts文件中进行配置 e…...

kotlin 中 any, all , none

any 如果至少有一个元素匹配给定谓词&#xff0c;那么 any() 返回 true。 all 如果没有元素与给定谓词匹配&#xff0c;那么 none() 返回 true。 none 如果所有元素都匹配给定谓词&#xff0c;那么 all() 返回 true。 请注意&#xff0c;在一个空集合上使用任何有效的谓词去…...

如何使用 Python、Node.js 和 Go 创建基于 YOLOv8 的对象检测 Web 服务

1. 介绍 这是有关 YOLOv8 系列文章的第二篇。在上一篇文章中我们介绍了YOLOv8以及如何使用它&#xff0c;然后展示了如何使用 Python 和基于 PyTorch 的官方 YOLOv8 库创建一个 Web 服务来检测图像上的对象。 在本文中&#xff0c;将展示如何在不需要PyTorch和官方API的情况下…...

pod节点jar包替换流程

1、查找到该docker容器 docker ps | grep backend # ./entrypoint.sh文件启动的那个容器2、替换jar 包 mv xxx.jar app.jar docker cp app.jar 66bc6fea9fb5:/home/aimind/3、重启容器 docker restart 66bc6fea9fb5 4、重启容器后进行功能验证 功能验证没问题了&#xff0c;再…...

Pytorch:torch.nn.Module

torch.nn.Module 是 PyTorch 中神经网络模型的基类&#xff0c;它提供了模型定义、参数管理和其他相关功能。 以下是关于 torch.nn.Module 的详细说明&#xff1a; 1. torch.nn.Module 的定义&#xff1a; torch.nn.Module 是 PyTorch 中所有神经网络模型的基类&#xff0c;…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...