feat(auth): 实现二维码登录功能

- 新增二维码登录相关接口和页面
- 实现二维码生成、状态检查、登录确认等逻辑
- 添加微信小程序登录支持- 优化用户信息展示和处理
This commit is contained in:
2025-09-05 22:49:41 +08:00
parent 0dfe3934a4
commit 408ff13590
18 changed files with 1558 additions and 10 deletions

110
src/pages/test/scan.tsx Normal file
View File

@@ -0,0 +1,110 @@
import React from 'react';
import { View, Text } from '@tarojs/components';
import { Button } from '@nutui/nutui-react-taro';
import { Scan } from '@nutui/icons-react-taro';
import Taro from '@tarojs/taro';
import { useUniversalScanner } from '@/components/UniversalScanner';
import { useUser } from '@/hooks/useUser';
const ScanTest: React.FC = () => {
const { user, isLoggedIn } = useUser();
const { startScan } = useUniversalScanner({
onScanSuccess: (result) => {
console.log('测试页面 - 扫码成功:', result);
Taro.showModal({
title: '扫码成功',
content: `类型: ${result.type}\n内容: ${result.rawContent}`,
showCancel: false
});
},
onScanError: (error) => {
console.error('测试页面 - 扫码失败:', error);
Taro.showModal({
title: '扫码失败',
content: error,
showCancel: false
});
}
});
const handleDirectScan = () => {
console.log('直接调用 Taro.scanCode');
Taro.scanCode({
success: (res) => {
console.log('直接扫码成功:', res.result);
Taro.showModal({
title: '直接扫码成功',
content: res.result,
showCancel: false
});
},
fail: (err) => {
console.error('直接扫码失败:', err);
Taro.showModal({
title: '直接扫码失败',
content: JSON.stringify(err),
showCancel: false
});
}
});
};
return (
<View className="p-4">
<Text className="text-lg font-bold mb-4"></Text>
<View className="mb-4">
<Text>: {isLoggedIn ? '已登录' : '未登录'}</Text>
</View>
<View className="mb-4">
<Text>: {user ? JSON.stringify(user, null, 2) : '无'}</Text>
</View>
<View className="space-y-4">
<Button
type="primary"
size="large"
block
icon={<Scan />}
onClick={() => {
console.log('点击了统一扫码按钮');
startScan();
}}
>
</Button>
<Button
type="default"
size="large"
block
icon={<Scan />}
onClick={handleDirectScan}
>
</Button>
<Button
type="warning"
size="large"
block
onClick={() => {
console.log('测试日志输出');
console.log('startScan 函数:', startScan);
console.log('startScan 类型:', typeof startScan);
Taro.showToast({
title: '查看控制台日志',
icon: 'none'
});
}}
>
</Button>
</View>
</View>
);
};
export default ScanTest;

View File

@@ -9,6 +9,7 @@ import navTo from "@/utils/common";
import {TenantId} from "@/config/app";
import {useUser} from "@/hooks/useUser";
import {useUserData} from "@/hooks/useUserData";
import {useUniversalScanner} from "@/components/UniversalScanner";
function UserCard() {
const {
@@ -20,7 +21,17 @@ function UserCard() {
getDisplayName,
getRoleName
} = useUser();
const {data} = useUserData()
const {data} = useUserData();
// 统一扫码处理
const { startScan } = useUniversalScanner({
onScanSuccess: (result) => {
console.log('扫码成功:', result);
},
onScanError: (error) => {
console.error('扫码失败:', error);
}
});
useEffect(() => {
// Taro.getSetting获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。
@@ -190,7 +201,48 @@ function UserCard() {
) : ''}
</View>
</View>
{isAdmin() && <Scan onClick={() => navTo('/user/store/verification', true)}/>}
{isLoggedIn && (
<View
onClick={() => {
console.log('扫码按钮被点击了');
// 检查 Taro.scanCode 是否存在
if (typeof Taro.scanCode === 'function') {
console.log('Taro.scanCode 函数存在');
// 直接测试 Taro.scanCode
Taro.scanCode({
success: (res) => {
console.log('直接扫码成功:', res.result);
Taro.showModal({
title: '扫码成功',
content: res.result,
showCancel: false
});
},
fail: (err) => {
console.error('直接扫码失败:', err);
Taro.showModal({
title: '扫码失败',
content: `错误信息: ${JSON.stringify(err)}`,
showCancel: false
});
}
});
} else {
console.error('Taro.scanCode 函数不存在');
Taro.showModal({
title: '错误',
content: 'Taro.scanCode 函数不存在,请检查 Taro 版本',
showCancel: false
});
}
}}
className="p-2 bg-blue-100 rounded cursor-pointer"
>
<Scan className="text-blue-500" />
</View>
)}
<View className={'mr-4 text-sm px-3 py-1 text-black border-gray-400 border-solid border-2 rounded-3xl'}
onClick={() => navTo('/user/profile/profile', true)}>
{'个人资料'}