Vben-Admin 框架中验证码倒计时动态更新解决方案
Vben-Admin 框架中验证码倒计时动态更新解决方案一、Vben-Admin 是什么Vben-Admin是一个基于Vue 3 TypeScript Vite的现代化企业级中后台管理系统框架。它提供了开箱即用的权限管理、路由配置丰富的 UI 组件库基于 Ant Design Vue 封装强大的表单、表格组件系统统一的登录/认证模块vben/common-ui其中的AuthenticationCodeLogin和VbenPinInput组件就是框架内置的验证码登录解决方案。二、为什么会出现这个需求业务场景用户登录时通过手机号 短信验证码的方式。后端接口有以下逻辑验证码未过期时→ 不重复发送短信直接返回已存在的验证码的expire_at验证码已过期或不存在时→ 生成新验证码并发送短信核心需求前端倒计时必须与后端验证码的有效期实时同步场景后端返回expire_at期望倒计时首次请求2026-08-08 14:05:005分钟后300 秒30 秒后再次请求验证码未过期2026-08-08 14:05:00不变270 秒4 分 50 秒后再次请求快过期了2026-08-08 14:05:00不变10 秒5 分钟后再次请求已过期2026-08-08 14:10:00新时间300 秒一句话用户看到的倒计时 当前验证码的真实剩余有效时间每次点击获取验证码按钮都与后端同步校验无缝续期。三、遇到的问题3.1 一开始以为handleSendCode返回值控制倒计时根据VbenPinInput的 props 定义我们以为handleSendCode的返回值会控制倒计时秒数// ❌ 直觉上以为这样就能控制倒计时handleSendCode:async(){// ... 发送验证码 ...return300;// 以为返回 300 就能倒计时 300 秒}3.2 实际测试发现返回无效当我们测试handleSendCode: async () { return 20; }时倒计时仍然显示 60 秒。3.3 查看组件源码发现真相通过查看VbenPinInput组件源码发现其内部逻辑是// VbenPinInput 组件内部简化const{maxTime60,// ← 倒计时秒数来自这里handleSendCodeasync(){},}definePropsPinInputProps();constcountdownref(0);asyncfunctionhandleSend(e:Event){awaithandleSendCode();// ← 只是执行忽略返回值countdown.valuemaxTime;// ← 直接用 maxTime 作为倒计时startCountdown();// ← 每秒减 1}结论handleSendCode的返回值完全被忽略倒计时秒数由maxTimeprops 决定。四、解决方案4.1 核心思路利用 Vue 的响应式数据特性用ref动态绑定maxTime// 1. 定义响应式变量初始 60 秒constmaxTimeref(60);// 2. 在 handleSendCode 中更新它consthandleSendCodeasync(){constresawaitsendCodeApi({phone});if(res.data.expire_at){constsecondsgetSecondsRemaining(res.data.expire_at);maxTime.valueseconds0?seconds:60;// ✅ 更新倒计时}};// 3. 传给 VbenPinInputcomponentProps:{maxTime:maxTime,// ← 响应式绑定值变了组件自动更新}4.2 完整代码script langts setup import { computed, ref } from vue; import { AuthenticationCodeLogin, z } from vben/common-ui; import { $t } from vben/locales; import { message } from ant-design-vue; import { sendCodeApi } from #/api; // 1. 响应式倒计时秒数 const maxTime ref(60); // 2. 计算剩余秒数 const getSecondsRemaining (dateString: string) { const diffMs new Date(dateString).getTime() - new Date().getTime(); return Math.floor(diffMs / 1000); }; // 3. 发送验证码 const handleSendCode async () { try { const res await sendCodeApi({ phone: currentPhone }); if (res.code 0) { if (res.data.expire_at) { const seconds getSecondsRemaining(res.data.expire_at); // ✅ 关键更新响应式变量 maxTime.value seconds 0 ? seconds : 60; } } } catch (error) { // 错误处理... } }; // 4. 表单配置 const formSchema computed((): VbenFormSchema[] [ { component: VbenInput, fieldName: phone, // ... }, { component: VbenPinInput, fieldName: code, componentProps: { codeLength: 6, maxTime: maxTime, // ✅ 响应式绑定 createText: (countdown: number) { return countdown 0 ? ${countdown} 秒后重发 : 获取验证码; }, handleSendCode: handleSendCode, }, // ... }, ]); /script4.3 数据流图用户点击按钮 │ ▼ handleSendCode() │ ▼ sendCodeApi() → 后端返回 { expire_at } │ ▼ getSecondsRemaining(expire_at) → 计算剩余秒数 │ ▼ maxTime.value 剩余秒数 ← 响应式更新 │ ▼ VbenPinInput 内部 countdown.value maxTime ← 组件收到新值 │ ▼ 倒计时按新的秒数开始运行五、总结项目内容框架Vben-Admin 的vben/common-ui认证模块组件VbenPinInput验证码输入倒计时误区误以为handleSendCode返回值控制倒计时真相maxTimeprops 才是倒计时秒数的唯一来源解法用ref响应式绑定maxTime在handleSendCode中动态更新效果倒计时始终与后端expire_at保持同步

相关新闻

免费降AI率工具为什么越改越高?怎么免费把AIGC疑似度降下来?

免费降AI率工具为什么越改越高?怎么免费把AIGC疑似度降下来?

免费降AI率工具为什么越改越高?怎么免费把AIGC疑似度降下来? 你是不是轮流用了DeepSeek、豆包和几个免费小程序,每个都把文字改得更顺,AI率却一次比一次高?更麻烦的是,原稿还能看出自己的写作习惯&#xff…

2026/10/12 21:30:31 阅读更多 →
西门子200 SMART PLC在自动化产线中的集成应用与优化

西门子200 SMART PLC在自动化产线中的集成应用与优化

1. 项目概述:西门子200smart在自动化产线中的集成应用这个案例展示了西门子S7-200 SMART PLC在工业自动化领域的典型应用场景——通过脉冲定位控制伺服系统,实现自动输送抓料与自动移印机的协同作业。作为一款经济型PLC,200 SMART系列凭借其稳…

2026/10/11 9:10:20 阅读更多 →
UE4 3DUI穿模解决方案:基于深度检测的智能透视材质实现

UE4 3DUI穿模解决方案:基于深度检测的智能透视材质实现

1. 项目概述:从“穿模”到“透视”的UI视觉革命在虚幻引擎4(UE4)里做3DUI,最让人头疼的莫过于“穿模”问题。你精心设计了一个悬浮在角色面前的3D血条、一个漂浮在空中的任务指示器,或者一个附着在武器上的弹药计数器&…

2026/10/11 19:42:28 阅读更多 →

最新新闻

SpringBoot+Vue构建高效办公管理系统实战

SpringBoot+Vue构建高效办公管理系统实战

1. 项目背景与核心价值 办公管理系统作为企业数字化转型的基础设施,正在从传统的C/S架构向B/S架构快速迁移。这个基于SpringBootVue的前后端分离项目,完美契合了现代企业对高效协同、移动办公和低维护成本的核心需求。 我去年为一家中型科技公司实施类似…

2026/10/14 9:09:51 阅读更多 →
多技术栈融合的在线蛋糕商城系统架构实践

多技术栈融合的在线蛋糕商城系统架构实践

1. 项目概述与核心价值 在线蛋糕商城系统是烘焙行业数字化转型的典型解决方案,它通过多技术栈融合实现了从商品展示到订单履约的全流程线上化。这个项目最显著的特点在于采用了PHP、ASP.NET、Java三大后端技术体系,同时整合了SpringBoot、SSM等主流框架&…

2026/10/14 9:09:51 阅读更多 →
PS5全场景调校指南:从开箱设置到串流与存储

PS5全场景调校指南:从开箱设置到串流与存储

“AnyPS5”这个名字,我第一次看到时第一反应是“这怕不是个万能折腾工具”,后来仔细一想,把它理解成“一台PS5能不能适配你的全部使用场景”其实更有意思。我在玩PS5的这几年里,踩过的坑和摸索出的方法不算少,从新机开…

2026/10/14 9:09:51 阅读更多 →
SpringBoot+Vue高校实验室管理系统开发实践

SpringBoot+Vue高校实验室管理系统开发实践

1. 项目概述高校实验室教学管理系统是基于SpringBoot框架开发的一套综合性管理平台,旨在解决传统实验室管理中存在的信息孤岛、流程繁琐、资源利用率低等问题。作为一名有10年开发经验的Java全栈工程师,我在实际教学管理场景中经常遇到以下痛点&#xff…

2026/10/14 9:09:51 阅读更多 →
Oracle 19c OPatch升级实战:p6880880补丁包替换与避坑指南

Oracle 19c OPatch升级实战:p6880880补丁包替换与避坑指南

简介:此压缩包是Oracle 19c数据库的官方更新补丁,面向64位Linux平台,供DBA、系统管理员在修复已知缺陷、加固安全防护或进行版本维护时使用。补丁编号p6880880来自Oracle标准发布渠道,配套内置的OPatch工具,支持补丁安…

2026/10/14 9:09:51 阅读更多 →
Vue3调度系统:任务队列、优先级与更新机制解密

Vue3调度系统:任务队列、优先级与更新机制解密

Vue3架构设计里,调度系统是最容易被忽略、却又实打实决定应用流畅度的核心模块。很多人把Vue3的更新机制简单理解为“数据变了就通知视图更新”,但实际上,从响应式数据发生变化,到DOM真正被修改,中间隔着一整套复杂且有…

2026/10/14 9:08:50 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →