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

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

时间:2024-09-01 22:51:47浏览次数:5  
标签:ok await 20240901 验证码 captcha zdppy key vue3 data

遗留的问题

  • 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校验失败,应该自动调整登录界面

标签:ok,await,20240901,验证码,captcha,zdppy,key,vue3,data
From: https://blog.csdn.net/qq_37703224/article/details/141789139

相关文章

  • 20240901
    T1LuoguP4801饥饿的狐狸最大值考虑在两个极端之间反复横跳即可。每次跳的时候判一下先喝水是否更优。从最大和最小开始跳都要试一下。最小值随便分讨一下即可。别漏情况了。代码#include<iostream>#include<algorithm>#defineintlonglongusingnamespacestd;i......
  • 20240901_151114 python 项目 获取需要的视频
    需求有一个视频素材目录当中有很多的视频现在需要根据音频素材的时长获取需要的视频内容编程完成项目把生成的视频存放在结果目录中分析音频的时长不同所需要的视频个数也不同视频的长度不同需要对每一个视频进行等时长的截取(例如每个视频只截取3秒钟)用户有可能一次提......
  • 20240901_161659 编程剪辑项目列表
    资料20240901_161503编程剪辑相关列表_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11889402项目20240901_151114python项目获取需要的视频_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11889375......
  • 20240901-究竟是为什么呢
    其实我不是很愿意在博客里发这些的,有被教练发现的风险,也有可能会给大家带来负面情绪。但是我真的太想要有人理解我了,真的好破防啊。我真的在控制我发负面情绪的文章了啊。。。。。。以后还是尽量不发吧。。。写完了之后觉得写成这样子没人能理解,等明天情绪稳定了来改改吧。......
  • vue3中常见单位及响应式单位rpx
    1.常用单位1.1px此时画了一个盒子模型,宽度和高度都是200px此时效果就是这样的1.2vw现在更改成了40vw,看看效果是怎么样的vw也就是在整个页面中的占比量,40vw就是占整个页面的40%使用%这个也是同样的效果,都是在页面中的占比量最直观的区别就是切换页面大小,就可以......
  • 20240901_113250 python 知识点列表
    开发环境20240901_113224python环境依赖的备份与导入_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1188873020240901_114639填空题环境的备份与导入_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11888767......
  • 20240901_113224 python 环境依赖的备份与导入
    20240830_173845python当前环境依赖包导出到文件中_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1187710920240830_183845python从依赖包记录文件中批量安装包_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/11877185......
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区
    SPASPA(SinglePageApplication,单页面应用)是一种Web应用程序架构,其核心特点是在用户与应用程序交互时,不重新加载整个页面,而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA的详细解析,包括其优点和缺点:SPA的优点更好的用户体验:SPA无需重新加载......
  • 推荐一个开箱即用的中后台前端解决方案,基于vue3开发,私活神器(带源码)
     前言在现代软件开发中,中后台系统的开发往往面临诸多挑战,如技术选型、组件库的丰富性、开发效率等。现有的解-决方案可能存在技术栈陈旧、定制性差、study成-本高等问题。为了解决这些痛点,一款新的软件——vue-element-plus-admin,应运而生,提供了一个基于新技术栈的中后台前......
  • 记录vue3写项目遇到的奇奇怪怪怪的小问题(持续更新)
    <el-table:header-cell-style="{color:'#fff',background:'rgba(78,131,211,0.8)'}"//设置table表头样式></el-table>表头居中:cell-style="{text-align:center}"表行居中<el-......