易学探索助手-个人记录(十)

news2025/5/15 13:25:21

在现代 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.isSpeakingmessage.isPaused 控制 UI 交互
 状态重置播报结束或停止后重置状态,防止按钮状态错乱

二、用户信息修改功能

功能实现

  • 使用 Element Plusel-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() 对密码加密,防止明文入库
非空判断避免用户传入空值覆盖数据库
邮箱唯一匹配通过邮箱定位用户记录,保证修改的是本人数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习51单片机01(安装开发环境)

新学期新相貌.......哈哈哈&#xff0c;我终于把贪吃蛇结束了&#xff0c;现在我们来学stc51单片机&#xff01; 要求&#xff1a;c语言的程度至少要到函数&#xff0c;指针尽量&#xff01;如果c语言不好的&#xff0c;可以回去看看我的c语言笔记。 1.开发环境的安装&#x…

SpringAI

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

lua 作为嵌入式设备的配置语言

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

ERP系统源码,小型工厂ERP系统源码,CRM+OA+进销存+财务

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

基于EFISH-SCB-RK3576/SAIL-RK3576的矿用本安型手持终端技术方案‌

&#xff08;国产化替代J1900的矿山智能化解决方案&#xff09; 一、硬件架构设计‌ ‌本安型结构设计‌ ‌防爆防护体系‌&#xff1a; 采用铸镁合金外壳复合防爆玻璃&#xff08;抗冲击能量>20J&#xff09;&#xff0c;通过GB 3836.1-2021 Ex ib I Mb认证 全密闭IP68接口…

配置文件介绍xml、json

#灵感# 常用xml&#xff0c; 但有点模棱两可&#xff0c;记录下AI助理给我总结的。 .xml XML&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它与 HTML 类似&#xff0c;但有以下主要特点和用途&#xf…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 附录D. PostgreSQL扩展插件速查表一、插件分类速查表二、核心插件详解三、安装与配置指南四、应用场景模板五、版本兼容性说明六、维护与优化建议七、官方资源与工具八、附录…

Qt笔记---》.pro中配置

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

【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤

一、前言 Liblib AI&#xff08;哩布哩布 AI&#xff09;是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。 强大的图像生成能力 &#xff1a;以 Stable Diffusion 技术为核心&#xff0c;提供文生图、图生图、图像后期处理等功能&#xff…

CCF第七届AIOps国际挑战赛季军分享(RAG)

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

【Cesium入门教程】第七课:Primitive图元

Cesium丰富的空间数据可视化API分为两部分&#xff1a;primitive API面向三维图形开发者&#xff0c;更底层一些。 Entity API是数据驱动更高级一些。 // entity // 调用方便&#xff0c;封装完美 // 是基于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 一些简单的设置

输出当前程序启动的路径 可能会出现 &#x1f527; 设置 C17 标准&#xff08;解决 std::filesystem 报错&#xff09; 在 VS 中&#xff0c;右键项目 → 属性。 选择左边的 “C/C” → “语言” 找到 C语言标准&#xff08;C Language Standard&#xff09;选项。 设置为&…

监控易运维管理软件:架构稳健,组件强大

在当今的信息化时代&#xff0c;运维管理对于企业的稳定运营至关重要。一款好的运维管理软件&#xff0c;不仅能够帮助企业高效管理IT基础设施&#xff0c;还能提升运维效率&#xff0c;降低运维成本。今天&#xff0c;我要给大家介绍的&#xff0c;就是我们公司自主研发的监控…

数字IC后端零基础入门基础理论(Day2)

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

零成本打造专属AI图像处理平台:IOPaint本地部署与远程访问指南

文章目录 前言1.什么是IOPaint&#xff1f;2.本地部署IOPaint3.IOPaint简单实用4.公网远程访问本地IOPaint5.内网穿透工具安装6.配置公网地址7.使用固定公网地址远程访问总结 前言 移动摄影的普及使得记录生活变得轻而易举&#xff0c;然而获得一张高质量的照片往往需要付出不…

操作系统-物理结构

操作系统使用read系统调用&#xff0c;将逻辑地址转&#xff08;对于用户来说逻辑地址容易计算&#xff0c;因为各个逻辑块都相邻&#xff09;成了逻辑块号和块内偏移量&#xff0c;并根据分配存储方式&#xff0c;将逻辑块号转成物理块号和块内偏移量 对于用户来说的文件的一…

《AI大模型应知应会100篇》第64篇:构建你的第一个大模型 Chatbot

第64篇&#xff1a;构建你的第一个大模型 Chatbot 手把手教你从零开始搭建一个基于大模型的聊天机器人 摘要 你是否想过&#xff0c;自己也能构建一个像 ChatGPT 一样能对话、能思考的聊天机器人&#xff08;Chatbot&#xff09;&#xff1f;别担心&#xff0c;这并不需要你是…

STM32 片上资源之串口

STM32 片上资源之串口 1 串口介绍1.1 初步介绍1.2 主要特性1.2.1 USART特性1.2.2 UART特性 1.3 主要寄存器1.4 波特率计算1.5 常用工作模式1.5.1 轮询模式&#xff1a;1.5.2 中断模式&#xff1a;1.5.3 DMA模式&#xff1a; 1.6 常见应用1.7 注意事项 2 软件层面协议2.1 基本概…

职坐标IT培训:互联网行业核心技能精讲

在互联网行业高速迭代的今天&#xff0c;掌握全链路核心技能已成为职业发展的关键突破口。职坐标IT培训聚焦行业需求&#xff0c;系统拆解从需求分析到系统部署的完整能力模型&#xff0c;助力从业者构建多维竞争力。无论是产品岗的用户调研与原型设计&#xff0c;还是技术岗的…