React应用如何支持语音、视觉与触控?深度剖析多模态融合核心机制

第一章:JavaScript+React:多模态交互界面开发

在现代前端开发中,JavaScript 与 React 的结合已成为构建动态、响应式用户界面的主流方案。借助 React 的组件化架构和虚拟 DOM 机制,开发者能够高效地实现多模态交互体验,涵盖触摸、语音、手势识别等多种输入方式。

组件驱动的交互设计

React 的核心理念是将 UI 拆分为可复用的组件。每个组件管理自身的状态,通过 props 和事件回调与其他组件通信。例如,一个支持语音输入的搜索框可以封装为独立组件:
// VoiceSearch.js
import React, { useState } from 'react';

function VoiceSearch() {
  const [transcript, setTranscript] = useState('');

  const handleVoiceInput = () => {
    const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
    recognition.onresult = (event) => {
      setTranscript(event.results[0][0].transcript);
    };
    recognition.start(); // 启动浏览器语音识别
  };

  return (
    
); } export default VoiceSearch;
该组件利用 Web Speech API 实现语音转文本功能,体现了多模态输入的集成方式。

状态管理与交互协调

复杂界面常需协调多种交互模式。使用 React Context 或 Redux 可集中管理跨组件状态。以下为常见交互模式对比:
交互模式技术实现适用场景
触控操作React Touch Events移动端表单、滑动导航
语音输入Web Speech API无障碍访问、车载系统
手势识别Hammer.js + React图片浏览、游戏界面
  • 确保交互反馈即时,提升用户体验
  • 优先使用语义化 HTML 配合 ARIA 属性增强可访问性
  • 在移动设备上优化 touch 事件防抖处理
graph TD A[用户输入] --> B{输入类型} B -->|语音| C[调用 Speech API] B -->|触控| D[触发 onTouch 事件] B -->|鼠标| E[执行 onClick 回调] C --> F[更新状态] D --> F E --> F F --> G[渲染新界面]

第二章:语音交互的实现机制与工程实践

2.1 Web Speech API 原理与浏览器兼容性分析

Web Speech API 是现代浏览器提供的原生接口,支持语音识别(SpeechRecognition)和语音合成(SpeechSynthesis),其核心基于底层操作系统或浏览器集成的语音引擎。
工作原理简述
语音识别通过麦克风捕获音频流,经由网络或本地引擎转换为文本。语音合成则将文本转化为自然语音输出。例如,初始化语音合成功能的代码如下:

const utterance = new SpeechSynthesisUtterance("Hello, world!");
utterance.lang = "en-US";
utterance.pitch = 1;
utterance.rate = 1;
speechSynthesis.speak(utterine);
该代码创建一个语音播报实例,lang 设置语言,pitch 控制音调,rate 调节语速,最终由 speechSynthesis.speak() 触发播放。
浏览器兼容性现状
目前主流浏览器支持情况存在差异,以下为关键浏览器支持概览:
浏览器SpeechRecognitionSpeechSynthesis
Chrome✅(需 HTTPS)
Edge
Firefox
Safari✅(部分支持)
可见,SpeechSynthesis 普遍支持较好,而 SpeechRecognition 多数依赖 Chromium 内核,且常要求安全上下文(HTTPS)。

2.2 React中集成语音识别与合成功能

在现代Web应用中,语音交互正逐渐成为提升用户体验的重要手段。React作为主流前端框架,可通过浏览器API轻松集成语音识别与合成能力。
使用Web Speech API实现语音识别
通过`SpeechRecognition`接口可捕获用户语音并转换为文本:
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
recognition.lang = 'zh-CN';
recognition.onresult = (event) => {
  const transcript = event.results[0][0].transcript;
  console.log('识别结果:', transcript);
};
recognition.start();
上述代码初始化语音识别实例,设置中文语言模型,并在触发结果事件时获取转录文本。需注意该API在部分浏览器中需前缀支持。
利用SpeechSynthesis实现文本朗读
浏览器内置的`speechSynthesis`可将文本转化为语音输出:
const utterance = new SpeechSynthesisUtterance("欢迎使用语音功能");
utterance.lang = 'zh-CN';
utterance.rate = 1.0;
speechSynthesis.speak(utterance);
该示例创建语音表述对象,设定语言与语速后播放。参数`rate`控制语速,取值范围0.1至10,影响听觉流畅度。

2.3 构建可复用的语音控制Hook组件

在现代前端架构中,将语音识别能力封装为可复用的 Hook 是提升开发效率的关键。通过抽象 Web Speech API 的复杂逻辑,开发者可在不同组件间无缝集成语音控制功能。
核心Hook设计
function useSpeechRecognition() {
  const [isListening, setIsListening] = useState(false);
  const [transcript, setTranscript] = useState('');
  const recognition = useRef(null);

  useEffect(() => {
    if ('webkitSpeechRecognition' in window) {
      recognition.current = new webkitSpeechRecognition();
      recognition.current.continuous = true;
      recognition.current.interimResults = true;
      recognition.current.onresult = (event) => {
        let currentTranscript = '';
        for (let i = event.resultIndex; i < event.results.length; i++) {
          if (event.results[i].isFinal) {
            currentTranscript += event.results[i][0].transcript;
          }
        }
        setTranscript(currentTranscript);
      };
    }
  }, []);

  const startListening = () => {
    if (recognition.current) {
      setIsListening(true);
      recognition.current.start();
    }
  };

  const stopListening = () => {
    if (recognition.current) {
      setIsListening(false);
      recognition.current.stop();
    }
  };

  return { isListening, transcript, startListening, stopListening };
}
该 Hook 封装了语音识别实例的生命周期管理,startListeningstopListening 控制识别流程,transcript 实时返回识别文本,便于UI响应。
使用场景示例
  • 语音搜索输入框
  • 无障碍导航控制
  • 语音指令执行系统

2.4 语音指令语义解析与上下文管理

语音指令的语义解析是将用户自然语言转化为可执行结构化意图的关键步骤。系统通常采用预训练语言模型结合领域特定的意图分类器,精准识别用户请求。
上下文状态维护机制
在多轮对话中,上下文管理确保系统理解指代和隐含信息。通过维护会话状态栈,系统可追踪历史意图、槽位填充情况及用户偏好。
字段类型说明
intentstring当前识别的用户意图
slotsdict提取的语义槽位值
context_tokenstring会话上下文标识

# 示例:语义解析返回结构
{
  "intent": "set_reminder",
  "slots": {
    "time": "2023-10-05T08:00:00Z",
    "content": "晨会"
  },
  "context_token": "ctx_7a8b9c"
}
该结构由NLU模块输出,intent表示操作类型,slots为参数集合,context_token用于关联后续对话,实现跨轮次语义连贯。

2.5 实战:语音驱动的表单填写与导航控制

在现代Web应用中,语音交互正逐步成为提升用户体验的重要手段。通过集成Web Speech API,可实现语音驱动的表单自动填写与页面导航控制。
语音识别初始化
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
recognition.lang = 'zh-CN';
recognition.continuous = false;
recognition.interimResults = false;
上述代码初始化语音识别实例,设置中文语言模型,关闭连续识别与中间结果,确保每次仅返回最终识别文本。
语义解析与指令映射
通过关键词匹配将语音转译为操作指令:
  • "姓名张三" → 填入id为name的输入框
  • "跳转到订单页" → 执行window.location.href跳转
实时反馈机制
结合语音合成接口,使用window.speechSynthesis.speak(new SpeechSynthesisUtterance(text))实现操作确认反馈,形成闭环交互体验。

第三章:视觉感知与手势识别技术应用

3.1 基于TensorFlow.js的前端视觉模型部署

浏览器端推理优势
TensorFlow.js 使深度学习模型可在浏览器或Node.js环境中直接运行,避免数据上传,提升隐私性与响应速度。支持WebGL加速,显著提高张量运算效率。
模型加载与预处理
使用 tf.loadGraphModel()tf.loadLayersModel() 加载已转换的模型文件:
const model = await tf.loadGraphModel('model.json');
const tensor = tf.browser.fromPixels(imageElement)
  .resizeNearestNeighbor([224, 224])
  .toFloat()
  .div(255.0)
  .expandDims();
该代码将图像元素转为张量,归一化至 [0,1] 范围,并增加批次维度以符合输入要求。
实时推理流程
调用 model.executeAsync(tensor) 进行异步推理,适用于复杂模型防止UI阻塞。输出结果通过 .dataSync() 提取置信度数组,结合标签映射完成分类识别。

3.2 使用MediaPipe实现手势检测与跟踪

MediaPipe 是 Google 开发的开源框架,专为构建多媒体机器学习管道而设计。在手势识别任务中,其预训练的 Hands 模型可实现实时手部关键点检测与跟踪。
集成MediaPipe Hands模型
首先通过 Python 安装 MediaPipe 并加载手部检测模块:

import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=2,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5)
参数说明:max_num_hands 控制检测最大手臂数量;min_detection_confidence 设定检测置信度阈值,值越高越保守。
关键点可视化
使用 MediaPipe 提供的绘图工具快速渲染手部骨架:
  • mp_drawing:内置绘制函数
  • draw_landmarks():将21个关键点连接成骨架
  • 支持自定义颜色与线条粗细

3.3 将视觉信号映射为UI交互事件流

在现代人机交互系统中,视觉信号需被精准解析并转化为可执行的UI事件流。这一过程依赖于图像识别与行为语义解码的协同。
事件映射流程
视觉输入经目标检测模型处理后,输出对象位置与动作类型。系统据此触发对应UI响应,如点击、滑动等。
核心转换逻辑

# 示例:手势识别到点击事件的映射
def map_gesture_to_event(gesture, position):
    if gesture == "pinch":
        return UIEvent("click", x=position[0], y=position[1])
    elif gesture == "swipe_left":
        return UIEvent("swipe", direction="left")
该函数将识别出的手势类型与坐标结合,生成标准化UI事件对象,供前端事件队列消费。
映射对照表
视觉信号UI事件触发条件
手掌展开暂停播放持续2秒
食指指向点击坐标稳定50ms

第四章:触控与多点输入的精细化处理

4.1 触摸事件模型与React事件系统的融合

在移动Web开发中,原生触摸事件(如 touchstarttouchmovetouchend)与React的合成事件系统存在差异。React通过事件委托机制统一管理事件,并将原生事件封装为跨平台的合成事件。
事件映射与兼容性处理
React将原生触摸事件自动映射为对应的合成事件,例如:
function TouchComponent() {
  const handleTouchStart = (e) => {
    console.log('Touch started at:', e.touches[0].clientX);
  };

  return <div onTouchStart={handleTouchStart}>触摸我</div>;
}
上述代码中,onTouchStart 是React支持的触摸事件处理器,其事件对象 e 封装了原生 touchestargetTouches 等属性,确保在不同设备上行为一致。
事件生命周期同步
原生事件React合成事件用途
touchstartonTouchStart开始触摸
touchmoveonTouchMove滑动操作
touchendonTouchEnd结束触摸

4.2 多指手势识别(缩放、旋转)的自定义逻辑

在移动应用开发中,实现精准的多指手势识别是提升交互体验的关键。通过监听触摸事件中的多个触点坐标变化,可提取缩放与旋转动作的核心参数。
手势参数计算原理
缩放比例由双指间距离比值决定,旋转角度基于向量夹角计算:
const getDistance = (t1, t2) => Math.sqrt(Math.pow(t2.x - t1.x, 2) + Math.pow(t2.y - t1.y, 2));
const getAngle = (t1, t2) => Math.atan2(t2.y - t1.y, t2.x - t1.x) * 180 / Math.PI;
上述函数分别用于计算两触点间的距离和方向角,是识别缩放与旋转的基础。
核心识别逻辑流程
  • 监听 touchstart、touchmove、touchend 事件
  • 在 touchmove 中判断 touches.length ≥ 2
  • 实时计算当前与上一帧的距离与角度差
  • 触发自定义缩放(scale)与旋转(rotate)事件
通过动态更新变换矩阵,可将识别结果应用于视图变换,实现流畅自然的手势响应。

4.3 跨设备触控兼容性优化策略

在多端协同场景中,不同设备的触控精度、采样频率和输入延迟存在显著差异。为提升用户体验一致性,需建立统一的输入抽象层。
触控事件标准化处理
通过中间件对原始触控数据进行归一化处理,屏蔽底层硬件差异:
// 触控事件适配器
function normalizeTouchEvent(event) {
  return {
    x: event.clientX / window.innerWidth,  // 归一化坐标
    y: event.clientY / window.innerHeight,
    pressure: event.force || 0.5,          // 标准化压力值
    timestamp: performance.now()
  };
}
该函数将屏幕坐标转换为[0,1]范围的相对值,确保在不同分辨率设备间行为一致;pressure字段兼容无压感设备,默认设为0.5。
动态采样率调节策略
  • 高精度模式:采样间隔设为8ms(约120Hz),用于绘图等精细操作
  • 节能模式:间隔提升至16ms(60Hz),适用于普通导航场景

4.4 实战:构建支持手写笔与手指区分的画板组件

在现代触控设备中,区分手写笔和手指输入对提升用户体验至关重要。通过监听 `pointerdown`、`pointermove` 和 `pointerup` 事件,可精确捕获输入类型。
指针事件类型识别
浏览器通过 `PointerEvent.pointerType` 属性区分输入源,其值可为 `pen`、`touch` 或 `mouse`。仅当值为 `pen` 时启用压感和倾斜数据。
canvas.addEventListener('pointerdown', (e) => {
  if (e.pointerType === 'pen') {
    isDrawing = true;
    ctx.beginPath();
    ctx.moveTo(e.clientX, e.clientY);
  }
});
上述代码确保仅手写笔触发绘图逻辑,避免手指误触。
压感与平滑绘制
利用 `e.pressure` 实现笔触粗细变化,提升书写真实感。
  • pressure = 0:轻触,线条细
  • pressure = 1:重压,线条粗
结合 `lineWidth` 动态调整,实现自然书写效果。

第五章:总结与展望

技术演进的持续驱动
现代后端架构正加速向云原生与服务网格演进。以 Istio 为例,其通过 Sidecar 模式解耦通信逻辑,显著提升微服务治理能力。实际案例中,某金融平台迁移至 Istio 后,熔断与重试策略配置效率提升 60%。
代码级优化实践
性能瓶颈常源于低效的数据处理逻辑。以下 Go 示例展示了批量写入优化:

// 批量插入用户记录,减少数据库 round-trip
func BatchInsert(users []User) error {
    stmt, _ := db.Prepare("INSERT INTO users(name, email) VALUES(?, ?)")
    defer stmt.Close()
    for _, u := range users {
        if _, err := stmt.Exec(u.Name, u.Email); err != nil {
            return err // 实际项目需更精细错误处理
        }
    }
    return nil
}
未来架构趋势观察
  • Serverless 计算在事件驱动场景中逐步替代传统 FaaS 部署模式
  • WASM 正在边缘计算中崭露头角,Cloudflare Workers 已支持 Rust 编写的 WASM 函数
  • AI 原生应用推动向量数据库与模型推理服务的深度集成
可观测性体系构建
指标类型采集工具告警阈值建议
请求延迟 P99Prometheus + OpenTelemetry>500ms 触发警告
错误率DataDog APM持续 1 分钟 >1%
API Gateway Auth Service User Service

相关推荐

省级产业研发综合指标数据2004-2024年

01、数据介绍 产业研发综合指标通常用于衡量各省份在科技创新、研发投入、成果转化及产业发展等方面的综合实力。结合现有的权威评估报告统计整理如下数据。包括研发机构情况,R&D相关投入,新产品开发销售、发明专利数、技术引进技术改造经费支出等数据。 数据名称:省级产业研发综合指标数据 数据年份:2004-2024年 02、数据指标 统计年度 地区代码 地区名称 研发机构数(个) R&D人员折合全时当量(人年) R&D经费内部支出(万元) R&D项目数(项) R&D项目经费(万元) 新产品开发项目数(项) 新产品开发经费支出(万元) 新产品销售收入(万元) 新产品销售收入-出口(万元) 专利申请数(件) 发明专利申请数(件) 有效发明专利数(件) 技术改造经费支出(万元) 购买境内技术经费支出(万元) 技术引进经费支出(万元) 消化吸收经费支出(万元)

React-Native使用ART实现水波纹、波浪线动画、声波音频波动效果(附源码)

笔者最近有个RN项目,需要在设备通话的时候,App侧展示声波纹UI效果,以笔者的尿性又去折腾整理了一番,效果还是不错的,已在项目使用。 在React Native中有个ART库,它可以绘制各种线(实线、虚线、曲线)、图形(矩形、圆、扇形)组合,让非常酷炫的绘图及动画变成了可能。 至于水波纹、波浪动画、声波音频这些常用的效果,一般都是贝塞尔曲线加持画出来的。 希望能帮助到有需要的同学,加油共勉!

Crazy程序猿 2048

如何实现高校科技成果转化的高效对接?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新产业创新智能化发展。

基于 Web Speech API 的 React 文本转语音Hook 实践

本文介绍了如何利用React自定义Hook useStreamTTS实现流畅的文本转语音功能,重点解决长文本流式内容的朗读问题。该方案采用标点断句策略,将未完结片段缓冲处理,确保朗读自然连贯;自动选择中文女声并优化语速(1.2-1.3)和停顿(30ms);支持流式增量文本的自动拼接和顺序朗读。核心功能包括:分句缓冲、语音队列管理、中文女声优选,适用于AI助手、知识播报等场景。该Hook仅需简单调用即可实现专业级TTS体验,源码已完整提供。

壮汉的博客 701

Midscene.js:视觉驱动的跨平台UI自动化技术深度解析

在数字化转型浪潮中,企业自动化需求呈指数级增长,但传统UI自动化工具却面临前所未有的挑战。DOM依赖、跨平台割裂、维护成本高昂——这些问题是否让你在自动化实施中步履维艰?传统方案为何在现代化应用面前频频失效? Midscene.js以**纯视觉驱动**为核心,通过AI多模态模型直接"看懂"屏幕,从根本上重构了UI自动化的技术范式。本文将从技术决策者的视角,深度剖析这一创新框架如何突破传统自动化瓶

gitblog_00753的博客 495

CVAT开源计算机视觉标注工具终极指南:从入门到企业级部署

在当今人工智能和计算机视觉飞速发展的时代,高质量的训练数据已成为决定模型性能的关键因素。**CVAT开源标注工具**作为业界领先的**计算机视觉数据标注平台**,为研究机构和企业提供了从基础标注到复杂3D数据处理的全方位解决方案。本文将从技术架构、部署策略、应用场景等多个维度,深度解析CVAT如何帮助团队构建高效、安全、可扩展的**视觉AI数据标注工作流**。 ## 一、CVAT核心能力矩阵:超

gitblog_00363的博客 879

基于视觉感知的跨平台AI自动化框架:Midscene技术架构深度解析实现原理

Midscene是一个基于AI视觉感知的跨平台自动化框架,通过创新的视觉驱动交互和桥接模式架构,实现了从Web到移动端再到桌面端的统一自动化解决方案。该框架采用自然语言编程范式,让开发者能够使用YAML脚本结合AI指令来编写自动化任务,彻底改变了传统UI自动化的技术实现方式。 ## 技术背景:传统自动化工具的局限挑战 在当前的软件自动化领域,传统工具面临着多重技术瓶颈。基于DOM元素定位的自

gitblog_01037的博客 883

5大技术突破:如何用企业级可视化AI工作流重构全栈自动化开发

在当今AI应用开发领域,传统编码模式正面临前所未有的效率瓶颈。技术团队往往需要投入大量时间处理API集成、数据处理管道构建和系统调试,而这些重复性工作占据了开发周期的60%以上。Awesome-Dify-Workflow项目通过46个精心设计的可视化AI工作流,为企业级应用开发提供了一套革命性的低代码解决方案,将复杂AI应用开发从数周缩短至数小时。 ## 技术范式转变:从传统开发到可视化工作流架

gitblog_00266的博客 356

基于SpringBoot+Vue校园失物招领系统的设计实现

校园失物招领系统的设计实现前端采用了Vue框架,并结合ElementUI来实现界面的设计布局。后端采用了SpringBoot框架进行开发设计,并结合了Java语言和MySQL数据库来实现。在功能上分为了前端用户模块和管理员模块。前端用户模块主要实现了招领物品信息的发布、查询管理,失物信息的发布、管理以及自动匹配招领物品,查看校园相关通知公告。管理员模块主要实现了物品分类管理、校园通知管理以及物品招领信息的查询统计等功能。校园失物招领系统的实现优化失物招领的流程,提高了校园失物招领的效率,促进了校园文化的建设,营造了良好的诚信氛围。

科技成果转化效率低怎么办?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新产业创新智能化发展。

TinyML边缘智能振动诊断实战-ESP32完整工程-v1.0.zip

无硬件可完整体验:固件内置信号合成模拟器(严格复现训练物理模型),串口发 S0~S3 切换 4 种机器故障 算子级正确性:用 inspect_model_ops.py 从 tflite 解析出实际算子(EXPAND_DIMS/CONV_2D/RESHAPE/MEAN/FC/SOFTMAX),固件注册逐一对应——规避了 TFLite Micro 最常见的 "Op type not found" 坑 诚实标注:文档中明确区分“合成演示数据 / 工程近似 / 实测值”,并给出接入真实数据的完整流程

产业园区如何搭建统一的科技服务平台?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新产业创新智能化发展。

复现基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,提出了一种改进的秃鹰搜索算法(BES),旨在解决微电网群在复杂运行环境下的多目标、强约束、非线性及高维经济调度问题。通过引入特定优化策略,增强了基础算法的全局搜索能力和收敛效率,克服了传统智能算法易陷入局部最优的缺陷。研究构建了一个包含分布式电源、储能系统多元负荷的微电网群调度模型,以最小化系统综合运行成本为核心目标,综合考虑功率平衡、设备出力能力、储能运行特性等多重约束条件。通过仿真实验验证了所提算法在调度精度、稳定性和计算效率方面相较于传统方法具有明显优势,并进一步展示了其在降低能源开支、提升可再生能源消纳水平方面的实际应用价值。; 适合人群:具备一定电力系统基础知识或优化算法背景,从事新能源调度、智能优化算法研究应用等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网群、综合能源系统等场景下的经济调度优化;②为秃鹰算法及其他群体智能算法的改进、复现性能对比提供参考范例;③服务于科研仿真、算法验证及工程化应用需求。; 阅读建议:建议读者结合文中提供的Matlab代码实现进行实践操作,重点关注算法改进机制调度模型的构建逻辑,同时可借助网盘资源获取完整资料,以加深对算法性能表现应用场景的理解。

ffmpeg-Muti-solve-rtspnogood.zip

多路推流MP4本地切换测试。跨平台arm_win

Obsidian 是一款本地优先的笔记知识管理工具,基于 Markdown 文件存储,以双链(Bidirectional Links)为核心,帮助你构建个人知识网络

Obsidian 是一款本地优先的笔记知识管理工具,基于 Markdown 文件存储,以双链(Bidirectional Links)为核心,帮助你构建个人知识网络

上一篇: C++机械臂轨迹规划实战:从PID到MPC的进阶之路(稀缺工业案例公开)
下一篇: 掌握这4种Perl正则黑科技,轻松应对复杂训练数据噪声
DeepNest
博客等级 码龄1年 159粉丝 2030原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值