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

news2024/9/22 4:21:04

遗留的问题

  • 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.key
  captchaImg.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.key
  captchaImg.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 = false
    await 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: 验证码框架应该再被使用以后自动移除该key
  alert("验证码错误,请刷新之后重试")
  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 = false
    await 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校验失败,应该自动调整登录界面

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

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

相关文章

ffplay源码分析(五)包缓存队列和帧缓存队列

在音视频处理流程中&#xff0c;ffplay的有两种队列&#xff0c;包缓存队列&#xff08;Packet Buffer Queue&#xff09;和帧缓存队列&#xff08;Frame Buffer Queue&#xff09;。这两个队列的存在&#xff0c;是为了适应音视频数据处理过程中的多线程架构——包括收包线程、…

win11+vscode+Flutter 开发环境配置

https://blog.csdn.net/Oven_maizi/article/details/126804404 1 vscode插件 安装 安装红框中的两个 2 flutter sdk 安装 dart sdk 包含在flutter sdk 里面&#xff0c;路径&#xff1a;flutter_windows_3.24.1-stable\flutter\bin\cache\dart-sdk 方式1&#xff1a; 通过…

[001-07-001].Redis7缓存双写一致性之更新策略探讨

1、面试题&#xff1a; 1.只要使用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;只要是双写&#xff0c;就存在数据一致性问题&#xff0c;那么是如何解决数据一致性问题的2.双写一致性&#xff0c;你先动缓存redis还是数据库MySQL&#xff0c;哪一个…

Python爬虫案例四:爬取某个博主的所有文章保存成PDF格式

引入&#xff08;将图片保存成PDF格式&#xff09;&#xff1a; 测试链接&#xff1a; https://zq.bookan.com.cn/?tdetail&id21088&ct1&is31042341&rid4658&#xff08;图书馆图片保存PDF&#xff09;&#xff0c;前提是装库&#xff0c;pip install img2pdf…

IDEA如何将某个文件夹内的多个module合并到一个大的module内

效果&#xff1a; 初始 方法 Ctrl shift Alt S 打开 project structure 导入module 将这个大文件夹作为新的module导入 效果图 完事儿

C#上位机采用数据库操作方式对Excel或WPS表格进行读取操作

C#采用数据库操作方式对Excel或WPS表格进行读取操作 1、创建连接字符串并编写一个进行数据库操作的方法 public class OleDbHelper{//创建连接字符串private static string connString "ProviderMicrosoft.ACE.OLEDB.12.0;Data Source{0};" "Extended Propert…

如何在态势中嵌入感知?

态势感知是对事物发展的各种情况的估计、判断和理解&#xff0c;而感知是通过感官对事物的认识和了解。要在态势过程中嵌入感知过程&#xff0c;你可以考虑以下步骤&#xff1a; 1、确定态势和感知的要素&#xff1a;首先&#xff0c;明确态势和感知所涉及的关键要素。态势可能…

Lesson08---string类(1)

1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 在c语言中没有string类型只有char类型&#xff0c;char类型只能是一个字符非常的不好用&#xff0c;想要字符串还必须要弄一个c…

华溢艺术之花在社区绽放

华溢艺术之花在社区绽放 这是一个阳光明媚的周末&#xff0c;华溢艺术少儿艺术体验走进了夷陵区营盘社区碧桂园小区。这次活动不仅为社区的孩子们带来了丰富多彩的艺术体验&#xff0c;还让家长们目睹了孩子们在艺术成长道路上那些优美动人的闪光点。 活动现场&#xff0c;热闹…

线性代数|机器学习-P32循环矩阵的特征向量-傅里叶矩阵

文章目录 1. 大纲2. 循环矩阵2.1 移位矩阵P2.2 P的特征值和特征向量2.3 循环卷积矩阵2.4 循环卷积计算 3. 傅里叶矩阵 1. 大纲 循环矩阵在机器学习&#xff0c;图像处理中的应用循环卷积矩阵的特征值&#xff0c;特征向量&#xff0c;卷积规则循环卷积矩阵多项式表达&#xff…

kaggle平台free使用GPU

1、注册 请保证在【科学上网】条件下进入如下操作&#xff0c;只有在注册账户和手机号验证时需要。 step1&#xff1a;注册账户 进入kaggle官网&#xff1a;https://www.kaggle.com/&#xff0c;点击右上角【Register】进入注册页面 最好选择使用邮箱注册&#xff08;&#…

零域(微隔离)详述

一、什么是零信任微隔离&#xff1f; 微隔离的实现方式是将数据中心内部所有的业务按照特定的原则划分为数个微小的网络节点&#xff0c;根据动态策略分析对这些节点执行访问控制&#xff0c;在逻辑上将这些节点隔离开&#xff0c;限制用户横向移动&#xff0c;这就是微…

docker-compose 快速部署nacos-standalone单节点

一、nacos 介绍 官网&#xff1a; https://nacos.io/ 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台 二、如何使用docker-compose 快速部署nacos2.3.1 ⚠️ &#xff1a; nacos-standalone 部署方式 依赖于 数据库&#xff0c;请先配置好数据库实例&…

日系编曲:了解日系音乐 日系和声特征 设计日系和声 和弦进行摘抄

了解日系音乐 日系音乐风格多样&#xff0c;涵盖流行、摇滚、民谣、古典等多种类型。以下是部分知名的日系音乐作品、歌手及乐队&#xff1a; 作品 《First Love》是宇多田光的代表作之一&#xff0c;旋律悠扬&#xff0c;情感真挚&#xff0c;展现了初恋的美好与青涩&#xf…

c++ 原型模式

文章目录 什么是原型模式为什么要使用原型模式使用场景示例 什么是原型模式 用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型创建新的对象&#xff0c;简单理解就是“克隆指定对象” 为什么要使用原型模式 原型模式&#xff08;Prototype Pattern&#xff09;是…

C++学习笔记----6、内存管理(一)---- 使用动态内存(1)

当你使用现代结构&#xff0c;例如std::vector,std::string等等&#xff0c;从一开始到现在以及到未来&#xff0c;C是一个安全的编程语言。该语言提供了许多的道路&#xff0c;路线以及红绿灯&#xff0c;比如C核心指导&#xff0c;静态代码分析器来分析代码的正确性&#xff…

SQLite3 数据库

一、SQLite3 命令 1. 基本命令 .tables&#xff1a;用于查看数据库中的表。.headers on/off&#xff1a;开启或者关闭表头&#xff0c;方便查看表结构。.mode column&#xff1a;使列对齐&#xff0c;增强数据的可读性。.width 列宽1 列宽2&#xff1a;设置每一列的列宽&…

大量图片进行自适应处理

首先我们手里有一个视频&#xff0c;但是我们对视频进行图像处理的话视频很难暂停进行观察&#xff0c;我们可以写一个按键坚挺&#xff0c;但是小编这里介绍另一个办法&#xff0c;大致思路为&#xff0c;把视频进行截帧为图片的集合&#xff0c;再对该集合进行统一的图像处理…

基于UniApp+Springboot花店微信小程序

此花店小程序是多商家&#xff0c;多用户&#xff0c;以及后台管理员操作的花市集小程序系统&#xff0c;前端采用vue 和 UniApp&#xff0c;后端采用java Springboot 设计开发。前后端分离的花店微信小程序系统&#xff0c;数据库采用独立的数据库mysql 小程序端界面主要采用…

yolo数据集钢材表面缺陷v8下载适用yolov5等全版本已标注txt格式

钢材表面缺陷检测数据集介绍 数据集概述 本数据集专为钢材表面缺陷检测任务而设计&#xff0c;包含了大量的钢材表面图像&#xff0c;每张图像均带有详细的缺陷标注信息。数据集旨在帮助研究人员和开发人员训练高精度的目标检测模型&#xff0c;以应用于钢材制造和质量控制等多…