feat(dealer): 将“确定签约”按钮文本修改为“立即提交”

将客户添加页面中的按钮文本从“确定签约”更改为“立即提交”,以更准确地反映用户操作意图。feat(config): 移除测试页面的路由配置

从 app.config.ts 中移除了 /pages/test/scan 路由配置,清理不再使用的测试页面路径。

feat(index): 添加统一扫码按钮并优化用户信息检查逻辑在首页头部添加了 UnifiedQRButton 组件,支持统一扫码入口,用于登录和核销功能。
同时优化了微信用户昵称判断条件的空格格式。

feat(api): 新增扫码登录相关接口及工具方法

新增 qr-login 模块,包含生成二维码 token、检查扫码状态、确认登录等接口。同时提供了解析二维码内容、获取设备信息等辅助函数。

feat(component): 新增统一扫码按钮组件 UnifiedQRButton

创建 UnifiedQRButton 组件,封装扫码逻辑,支持页面模式跳转与直接扫码两种方式,
并根据扫码结果展示不同反馈。

feat(hook): 新增 useUnifiedQRScan Hook 支持登录与核销扫码

实现 useUnifiedQRScan 自定义 Hook,统一处理登录二维码和礼品卡核销二维码的识别与处理流程,支持权限校验、解密、状态管理等功能。
```
This commit is contained in:
2025-09-23 11:11:20 +08:00
parent c5a38ab695
commit d12a0fbf11
7 changed files with 732 additions and 119 deletions

View File

@@ -14,6 +14,7 @@ import {View, Text} from '@tarojs/components'
import MySearch from "./MySearch";
import './Header.scss';
import navTo from "@/utils/common";
import UnifiedQRButton from "@/components/UnifiedQRButton";
const Header = (props: any) => {
// 使用新的useShopInfo Hook
@@ -194,7 +195,7 @@ const Header = (props: any) => {
if (isLoggedIn && user) {
console.log('用户信息已更新:', user);
// 检查是否设置头像和昵称
if(user.nickname === '微信用户'){
if (user.nickname === '微信用户') {
Taro.showToast({
title: '请设置头像和昵称',
icon: 'none'
@@ -242,7 +243,32 @@ const Header = (props: any) => {
<TriangleDown size={9} className={'text-white'}/>
</Space>
</View>
)}>
)}
right={
<Space style={{
marginRight: '100px'
}}>
{/*统一扫码入口 - 支持登录和核销*/}
<UnifiedQRButton
size="small"
onSuccess={(result) => {
console.log('统一扫码成功:', result);
// 根据扫码类型给出不同的提示
if (result.type === 'verification') {
// 核销成功,可以显示更多信息或跳转到详情页
Taro.showModal({
title: '核销成功',
content: `已成功核销的品类:${result.data.goodsName || '礼品卡'},面值¥${result.data.faceValue}`
});
}
}}
onError={(error) => {
console.error('统一扫码失败:', error);
}}
/>
</Space>
}
>
</NavBar>
</>
)

View File

@@ -1,110 +0,0 @@
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;