易学探索助手-个人记录(十)
在现代 Web 应用中,用户体验的重要性不断上升。近期我完成了两个功能模块 —— 语音播报功能 与 用户信息修改表单,分别增强了界面交互与用户自管理能力。
一、语音播报功能(SpeechSynthesis)
功能特点
-
支持播放、暂停、继续、停止;
-
自动识别当前语音状态(播放中 / 暂停 / 非播放);
-
中文语音支持,速率、语调可调;
-
防止同时播放多条消息。
代码解析
1. 语音播放按钮的显示逻辑
<div class="voice-button-container"v-if="message.text && (typeof message.text === 'string' || message.text.length) && !message.d3Code">
-
确保
message.text
存在且为字符串或数组; -
如果是 SVG 图形类内容(如
d3Code
),不显示播放按钮。
2. 播放控制逻辑
const speakText = (message) => {const text = Array.isArray(message.text) ? message.text.join('') : message.text;if (!text) return;// 如果当前消息正在播放,切换暂停 / 恢复if (message.isSpeaking) {if (speechSynthesis.paused) {speechSynthesis.resume();message.isPaused = false;} else {speechSynthesis.pause();message.isPaused = true;}return;}// 播放其他消息则取消speechSynthesis.cancel();resetAllSpeechStatus();const newUtterance = new SpeechSynthesisUtterance(text);newUtterance.lang = 'zh-CN';newUtterance.rate = 1;newUtterance.pitch = 1;newUtterance.onend = () => {message.isSpeaking = false;message.isPaused = false;currentSpeakingMessageId = null;};message.isSpeaking = true;message.isPaused = false;currentUtterance = newUtterance;currentSpeakingMessageId = message.id;speechSynthesis.speak(newUtterance);
};
-
自动处理字符串数组拼接;
-
speechSynthesis.cancel()
清理可能存在的旧播报; -
播放状态挂载到
message
对象中,避免全局共享状态冲突; -
支持暂停、恢复和播放完毕自动清除状态。
3. 停止播放
const stopSpeech = (message) => {speechSynthesis.cancel();message.isSpeaking = false;message.isPaused = false;currentSpeakingMessageId = null;
};
4. 样式美化
.voice-button {background-color: #f0f0f0;border: 1px solid #ccc;border-radius: 6px;padding: 4px 10px;cursor: pointer;
}
.voice-button:hover {background-color: #e8e8e8;
}
简洁的按钮样式,搭配 hover 效果,让用户操作体验更自然。
5.效果展示
实现亮点
功能点 | 说明 |
---|---|
支持暂停与继续 | 利用 speechSynthesis.pause() 和 resume() |
多条消息互斥 | 播放前调用 speechSynthesis.cancel() |
状态控制 | 通过 message.isSpeaking 与 message.isPaused 控制 UI 交互 |
状态重置 | 播报结束或停止后重置状态,防止按钮状态错乱 |
二、用户信息修改功能
功能实现
-
使用
Element Plus
的el-form
组件构建完整表单; -
实现前端校验(如邮箱格式、密码长度、二次确认);
-
支持密码非必填(可选填);
-
成功后发送异步请求更新用户信息;
-
支持“保存修改”、“重置”、“返回首页”三种操作。
核心代码解析
1. 表单结构
<el-form :model="form" :rules="rules" ref="formRef"><el-form-item label="昵称" prop="nickname"><el-input v-model="form.nickname" /></el-form-item>...
</el-form>
-
v-model
实现双向绑定; -
rules
定义字段级校验规则。
2. 校验逻辑(密码与确认密码)
password: [{validator(rule, value, callback) {if (value && value.length < 6) {callback(new Error('密码长度不能小于6位'));} else {callback();}},trigger: 'blur'}
],
confirmPassword: [{validator(rule, value, callback) {if (form.password && value !== form.password) {callback(new Error('两次密码输入不一致'));} else {callback();}},trigger: 'blur'}
]
支持 密码非必填,但只要填写了就必须满足长度与一致性要求。
3. 表单提交
-
表单校验通过后,发送更新请求;
-
成功或失败均有用户反馈。
4.后端实现
优点总结
措施 | 说明 |
---|---|
密码加密存储 | 使用 passwordEncoder.encode() 对密码加密,防止明文入库 |
非空判断 | 避免用户传入空值覆盖数据库 |
邮箱唯一匹配 | 通过邮箱定位用户记录,保证修改的是本人数据 |
相关文章:

易学探索助手-个人记录(十)
在现代 Web 应用中,用户体验的重要性不断上升。近期我完成了两个功能模块 —— 语音播报功能 与 用户信息修改表单,分别增强了界面交互与用户自管理能力。 一、语音播报功能(SpeechSynthesis) 功能特点 支持播放、暂停、继续、停…...
Linux基础 -- SSH 流式烧录与压缩传输笔记
Linux SSH 流式烧录与压缩传输指南 一、背景介绍 在嵌入式开发和维护中,常常需要通过 SSH 从 PC 向设备端传输大文件(如系统镜像、固件)并将其直接烧录到指定磁盘(如 /dev/mmcblk2)。然而,设备端存储空间…...

学习51单片机01(安装开发环境)
新学期新相貌.......哈哈哈,我终于把贪吃蛇结束了,现在我们来学stc51单片机! 要求:c语言的程度至少要到函数,指针尽量!如果c语言不好的,可以回去看看我的c语言笔记。 1.开发环境的安装&#x…...
事件驱动reactor的原理与实现
fdset 集合:(就是说) fd_set是一个位图(bitmap)结构 每个位代表一个文件描述符 0表示不在集合中,1表示在集合中 fd_set结构(简化): [0][1][2][3][4][5]...[1023] …...
大模型训练简介
在人工智能蓬勃发展的当下,大语言模型(LLM)成为了众多应用的核心驱动力。从智能聊天机器人到复杂的内容生成系统,LLM 的卓越表现令人瞩目。而这背后,大模型的训练过程充满了奥秘。本文将深入探讨 LLM 训练的各个方面&a…...
深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
一、典型故障现象与用户痛点 在高并发业务场景中,企业级 Spring Boot 应用常遇到以下连锁故障: 用户侧:网页访问超时、提交表单无响应,报错 “服务不可用”。运维侧:监控平台报警 “数据库连接池耗尽”,To…...
More Effective C++:改善编程与设计(上)
More Effective C: 目录 More Effective C: 条款1:仔细区别pointers和 references 条款2:最好使用C转型操作符 条款3:绝对不要以多态方式处理数组 条款4:非必要不要提供default constructor 条款5:对定制的“类型转换函数”保持警觉 …...
TNNLS-2020《Autoencoder Constrained Clustering With Adaptive Neighbors》
核心思想分析 该论文提出了一种名为ACC_AN(Autoencoder Constrained Clustering with Adaptive Neighbors)的深度聚类方法,旨在解决传统子空间聚类方法在处理非线性数据分布和高维数据时的局限性。核心思想是将深度自编码器(Auto…...

SpringAI
机器学习: 定义:人工智能的子领域,通过数据驱动的方法让计算机学习规律,进行预测或决策。 核心方法: 监督学习(如线性回归、SVM)。 无监督学习(如聚类、降维)。 强化学…...

lua 作为嵌入式设备的配置语言
从lua的脚本中获取数据 lua中栈的索引 3 | -1 2 | -2 1 | -3 可以在lua的解释器中加入自己自定的一些功能,其实没啥必要,就是为了可以练习下lua...

ERP系统源码,小型工厂ERP系统源码,CRM+OA+进销存+财务
ERP系统源码,小型工厂ERP系统源码,ERP计划管理系统源码,CRMOA进销存财务 对于ERP来说,最为主要的作用就是能够强调企业的计划性,通过以业务订单以及客户的相关需求来作为企业计划的基础,并且还能够对企业现…...

基于EFISH-SCB-RK3576/SAIL-RK3576的矿用本安型手持终端技术方案
(国产化替代J1900的矿山智能化解决方案) 一、硬件架构设计 本安型结构设计 防爆防护体系: 采用铸镁合金外壳复合防爆玻璃(抗冲击能量>20J),通过GB 3836.1-2021 Ex ib I Mb认证 全密闭IP68接口…...

配置文件介绍xml、json
#灵感# 常用xml, 但有点模棱两可,记录下AI助理给我总结的。 .xml XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。它与 HTML 类似,但有以下主要特点和用途…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录D. PostgreSQL扩展插件速查表一、插件分类速查表二、核心插件详解三、安装与配置指南四、应用场景模板五、版本兼容性说明六、维护与优化建议七、官方资源与工具八、附录…...

Qt笔记---》.pro中配置
文章目录 1、概要1.1、修改qt项目的中间文件输出路径和部署路径1.2、Qt 项目模块配置1.3、外部库文件引用配置 1、概要 1.1、修改qt项目的中间文件输出路径和部署路径 (1)、为解决 “ 输出文件 ” 和 “ 中间输出文件 ”全部在同一个文件夹下的问题&am…...

【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤
一、前言 Liblib AI(哩布哩布 AI)是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。 强大的图像生成能力 :以 Stable Diffusion 技术为核心,提供文生图、图生图、图像后期处理等功能ÿ…...

CCF第七届AIOps国际挑战赛季军分享(RAG)
分享CCF 第七届AIOps国际挑战赛的季军方案,从我们的比赛经历来看,并不会,相反,私域领域问答的优秀效果说明RAG真的很重要 历经4个月的时间,从初赛赛道第1,复赛赛道第2,到最后决赛获得季军&…...

【Cesium入门教程】第七课:Primitive图元
Cesium丰富的空间数据可视化API分为两部分:primitive API面向三维图形开发者,更底层一些。 Entity API是数据驱动更高级一些。 // entity // 调用方便,封装完美 // 是基于primitive的封装// primitive // 更接近底层 // 可以绘制高级图形 /…...

【5分钟学Docker】Docker快速使用
目录 1. 概述 2. 基本操作 2.1. 镜像操作 2.2. 容器操作 2.3. 运行操作 2.4. 镜像保存 2.5. 镜像分享 3. 高级操作 4. 挂载 4.1. 目录挂载 4.2. 卷映射 1. 概述 Docker 镜像有镜像名称和TAG 2. 基本操作 2.1. 镜像操作 查看镜像 docker images docker image ls …...

opencv 一些简单的设置
输出当前程序启动的路径 可能会出现 🔧 设置 C17 标准(解决 std::filesystem 报错) 在 VS 中,右键项目 → 属性。 选择左边的 “C/C” → “语言” 找到 C语言标准(C Language Standard)选项。 设置为&…...
快速地解决Spring循环依赖问题
循环依赖的大体结构如下: AServiceImpl Slf4j Service AllArgsConstructor public class AServiceImpl extends ServiceImpl<AMapper, A> implements AService {private final BService bService; }BServiceImpl Slf4j Service AllArgsConstructor public …...
反向操作:如何用AI检测工具优化自己的论文“人味”?
大家好,这里是论文写手的一线自救指南😤 在AIGC横行的今天,谁还没偷偷用过AI写几段论文内容?但问题来了:学校越来越会“识AI”了! 有的学校甚至不看重复率,只盯AIGC率报告,一句“AI…...
CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
导语: 在私域流量与社交电商爆发的时代,CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略,快速占领市场,实现用户裂变与收益倍增。…...
苹果处理器“仿生“命名背后的营销策略与技术创新
苹果处理器"仿生"命名背后的营销策略与技术创新 苹果自2017年推出A11 Bionic芯片以来,其处理器系列便开始采用"仿生"(Bionic)这一名称。这一命名并非源于芯片模仿生物神经系统的技术突破,而是苹果为提升芯片…...

监控易运维管理软件:架构稳健,组件强大
在当今的信息化时代,运维管理对于企业的稳定运营至关重要。一款好的运维管理软件,不仅能够帮助企业高效管理IT基础设施,还能提升运维效率,降低运维成本。今天,我要给大家介绍的,就是我们公司自主研发的监控…...
【Python】抽象基类ABC
抽象基类(Abstract Base Classes)的核心作用 抽象基类(ABC)是Python中一种特殊的类,它通过abc模块实现,主要服务于面向对象编程中的接口规范和设计约束。以下是它的核心作用: 1. 强制接口实现(核心作用) 确保子类必…...

数字IC后端零基础入门基础理论(Day2)
数字IC后端零基础入门基础理论(Day1) Placement Blockage: cell摆放阻挡层。它是用来引导工具做placement的一种物理约束或手段,目的是希望工具按照我们的要求来做标准单元的摆放。 它主要有三种类型,分别是hard placement bloc…...

零成本打造专属AI图像处理平台:IOPaint本地部署与远程访问指南
文章目录 前言1.什么是IOPaint?2.本地部署IOPaint3.IOPaint简单实用4.公网远程访问本地IOPaint5.内网穿透工具安装6.配置公网地址7.使用固定公网地址远程访问总结 前言 移动摄影的普及使得记录生活变得轻而易举,然而获得一张高质量的照片往往需要付出不…...

操作系统-物理结构
操作系统使用read系统调用,将逻辑地址转(对于用户来说逻辑地址容易计算,因为各个逻辑块都相邻)成了逻辑块号和块内偏移量,并根据分配存储方式,将逻辑块号转成物理块号和块内偏移量 对于用户来说的文件的一…...
CGO中引入 <cstddef> <vector> fatal error: cstddef: No such file or directory 失败的原因
原因 可以在CPP里面引入C的头文件,但不能在h文件引入 错误 fatal error: cstddef: No such file or directory 测试case,下面的可以,如果把他放到头文件就会报错 // main.go package main// #cgo CXXFLAGS: -stdc11 // #cgo LDFLAGS: -l…...