zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完成

本文主要是介绍zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

遗留的问题

  • 1、点击切换验证码
  • 2、1分钟后自动切换验证码

点击切换验证码

实现步骤:

  • 1、点击事件
  • 2、调用验证码接口
  • 3、更新验证码的值

点击事件

给图片添加点击事件:

<img :src=" 'data:image/png;base64,' + captchaImg"style="width: 100%; height: 50px; margin-top: 10px; cursor: pointer"@click="refreshCaptcha">

调用验证码接口

const refreshCaptcha = async () => {const captcha = await api.getCaptcha()captchaKey.value = captcha.keycaptchaImg.value = captcha.img
}onMounted(async () => {await refreshCaptcha()
})

1分钟后自动切换验证码

方案1

  • 1、页面挂载的时候,创建定时器,和手动点击切换的逻辑不冲突
  • 2、在页面卸载之前,销毁定时器

方案1:如果手动点击了,验证码的生效时间就不对了。

方案2:

  • 1、在页面挂载的时候创建定时器
  • 2、在页面卸载之前销毁定时器
  • 3、在刷新验证码以后,重新生成定时器:销毁和重新创建

方案2比较靠谱。

实现代码:

// 点击手动刷新验证码
const clickRefreshCaptcha = async () => {await refreshCaptcha()if (autoRefreshTimer.value) {clearInterval(autoRefreshTimer.value)autoRefreshTimer.value = setInterval(async () => {await refreshCaptcha()}, refreshMillionSeconds)}
}// 刷新验证码
const refreshCaptcha = async () => {const captcha = await api.getCaptcha()captchaKey.value = captcha.keycaptchaImg.value = captcha.img
}// 生命周期函数:页面挂载
onMounted(async () => {await refreshCaptcha() // 收到刷新定时器autoRefreshTimer.value = setInterval(async () => { // 定时刷新验证码await refreshCaptcha()}, refreshMillionSeconds)
})// 生命周期函数:页面卸载之前
onBeforeUnmount(async () => {clearInterval(autoRefreshTimer.value) // 卸载自动刷新验证码的定时器
})

接下来要做什么

  • 1、实现校验验证码的功能
  • 2、验证码校验通过以后再校验的功能

校验验证码

封装校验验证码的方法

isCaptcha: async (key, code) => {let ok = falseawait axios({method: "post",url: `http://127.0.0.1:18888/zdppy_captcha`,data: {key, code}}).then(resp => {if (resp.data && resp.data.data && resp.data.status && resp.data.code === 10000) {if (resp.data.data.ok) {ok = true}}})return ok
}

在校验登录之前先校验验证码

const ok = await api.isCaptcha(captchaKey.value, data.captcha);
if (!ok) {// TODO: 验证码框架应该再被使用以后自动移除该keyalert("验证码错误,请刷新之后重试")return
}
alert("验证码校验成功")
return

优化验证码框架

确保key只能被使用一次,更安全。

import zdppy_captcha as captcha
import zdppy_cache as cache# 系统的验证码
key, code, img = captcha.get_base64(4)
print(key)
print(code)
print(img)# cache_obj 只有有set方法就行
# 存储验证码
cache_obj = cache.Cache("tmp/.zdppy_captcha")
cache_obj.set(key, code)# 用户的验证码
user_key = key
user_captcha = code# 校验
v1 = captcha.is_captcha(cache_obj, user_key, user_captcha)
print(v1, v1 == True)# 使用一次以后,就失效
v1 = captcha.is_captcha(cache_obj, user_key, user_captcha)
print(v1, v1 == False)

封装发送登录请求的方法

login: async (username, password) => {let ok = falseawait axios({method: "post",url: `http://127.0.0.1:18888/auth/user/login`,data: {username, password}}).then(resp => {if (resp.data && resp.data.data && resp.data.status && resp.data.code === 10000) {ok = true} else {message.error(resp.data.data.msg)}}).catch(err => {message.error(err.message)})return ok
}

封装清空验证码的逻辑

// 点击登录
const onFinish = async (data) => {// 校验验证码let ok = await api.isCaptcha(captchaKey.value, data.captcha);if (!ok) {await clearCaptcha()message.error("验证码错误")return}// 发送登录请求ok = await api.login(data.username, data.password)if (ok) {message.success("登录成功")} else {await clearCaptcha()}
};// 清空验证码
const clearCaptcha = async () => {formState.captcha = ""await clickRefreshCaptcha() // 模拟点击操作
}

登录成功的响应

在这里插入图片描述

完整登录方法

// 点击登录
const onFinish = async (data) => {// 校验验证码const ok = await api.isCaptcha(captchaKey.value, data.captcha);if (!ok) {await clearCaptcha()message.error("验证码错误")return}// 发送登录请求const loginData = await api.login(data.username, data.password)console.log("xxx登录信息:", loginData)if (loginData) {message.success("登录成功")} else {await clearCaptcha()}
};

到这一步以后,登录完成一大半了。

遗留问题

  • 1、登录以后跳转最近文档
  • 2、如果用户没有登录应该自动跳转登录页面
  • 3、如果用户的token校验失败,应该自动调整登录界面

这篇关于zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128811

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版