feat(qr-login): 实现扫码登录功能模块

This commit is contained in:
2025-09-21 22:10:22 +08:00
parent 611f0e3216
commit 16559c76ed
15 changed files with 1329 additions and 54 deletions

View File

@@ -1,6 +1,8 @@
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import Taro from '@tarojs/taro';
import {SERVER_API_URL} from "@/utils/server";
import {getUserInfo} from "@/api/layout";
/**
* 扫码登录相关接口
@@ -70,7 +72,7 @@ export interface ConfirmLoginParam {
unionid?: string;
nickname?: string;
avatar?: string;
gender?: number;
gender?: string;
};
// 设备信息
deviceInfo?: string;
@@ -96,7 +98,7 @@ export interface ConfirmLoginResult {
*/
export async function generateQRToken(data?: GenerateQRTokenParam) {
const res = await request.post<ApiResult<GenerateQRTokenResult>>(
'http://127.0.0.1:9200/api/qr-login/generate',
SERVER_API_URL + '/qr-login/generate',
{
clientType: 'wechat',
expireMinutes: 5,
@@ -114,7 +116,7 @@ export async function generateQRToken(data?: GenerateQRTokenParam) {
*/
export async function checkQRLoginStatus(token: string) {
const res = await request.get<ApiResult<QRLoginStatusResult>>(
`http://127.0.0.1:9200/api/qr-login/status/${token}`
SERVER_API_URL + `/qr-login/status/${token}`
);
if (res.code === 0 && res.data) {
return res.data;
@@ -127,7 +129,7 @@ export async function checkQRLoginStatus(token: string) {
*/
export async function confirmQRLogin(data: ConfirmLoginParam) {
const res = await request.post<ApiResult<ConfirmLoginResult>>(
'http://127.0.0.1:9200/api/qr-login/confirm',
SERVER_API_URL + '/qr-login/confirm',
data
);
if (res.code === 0 && res.data) {
@@ -142,25 +144,26 @@ export async function confirmQRLogin(data: ConfirmLoginParam) {
export async function confirmWechatQRLogin(token: string, userId: number) {
try {
// 获取微信用户信息
const userInfo = await getUserProfile();
const userInfo = await getUserInfo();
console.log('获取微信用户信息3:', userInfo)
const data: ConfirmLoginParam = {
token,
userId,
platform: 'wechat',
wechatInfo: {
nickname: userInfo?.nickName,
avatar: userInfo?.avatarUrl,
gender: userInfo?.gender
nickname: userInfo?.nickname,
avatar: userInfo?.avatar,
gender: userInfo?.sex
},
deviceInfo: await getDeviceInfo()
};
const res = await request.post<ApiResult<ConfirmLoginResult>>(
'http://127.0.0.1:9200/api/qr-login/wechat-confirm',
SERVER_API_URL + '/qr-login/confirm',
data
);
console.log(res,'ConfirmLoginParamResult>')
if (res.code === 0 && res.data) {
return res.data;
}
@@ -227,20 +230,44 @@ async function getDeviceInfo() {
*/
export function parseQRContent(qrContent: string): string | null {
try {
console.log('解析二维码内容1:', qrContent);
// 尝试解析JSON格式
if (qrContent.startsWith('{')) {
const parsed = JSON.parse(qrContent);
return parsed.token || null;
return parsed.token || parsed.qrCodeKey || null;
}
// 尝试解析URL格式
if (qrContent.includes('token=')) {
if (qrContent.includes('http')) {
const url = new URL(qrContent);
return url.searchParams.get('token');
// 支持多种参数名
return url.searchParams.get('token') ||
url.searchParams.get('qrCodeKey') ||
url.searchParams.get('qr_code_key') ||
null;
}
// 直接返回内容作为token
return qrContent;
// 尝试解析简单的key=value格式
if (qrContent.includes('=')) {
const params = new URLSearchParams(qrContent);
return params.get('token') ||
params.get('qrCodeKey') ||
params.get('qr_code_key') ||
null;
}
// 如果是以qr-login:开头的格式
if (qrContent.startsWith('qr-login:')) {
return qrContent.replace('qr-login:', '');
}
// 直接返回内容作为token如果是32位以上的字符串
if (qrContent.length >= 32) {
return qrContent;
}
return null;
} catch (error) {
console.error('解析二维码内容失败:', error);
return null;