vue3+crypto-js插件实现对密码加密后传给后端

news2024/11/17 1:45:50

最近在做项目的过程中又遇到了一个新的问题,在实现后端管理系统的个人信息页面中,涉及到修改密码的功能,刚开始我直接通过传参的方式将修改的密码传入给后端,可是后端说需要将原密码、新密码以及确认密码都进行加密处理,害这下好了,这咋搞啊。自己之前没涉及过这个啊,话虽如此但这页面毕竟是咱做的啊,总不能说摆手不做放置不管嘛。方法总比困哪多这也难不倒我,于是乎上网查呀查,搜集了很多的资料,终于功夫不负有心人,嘿解决了。这等好事岂能我一人知道,不得分享给大家啊,好了现在咱们就一起共享吧!

(1)搭建修改密码框架

在开始之初呢先是搭建修改密码这一板块的框架,以下是为演示方便做的参考:

<template>
    <!-- 修改密码 -->
    <div class="edit-password">
      <div class="edit-title">
        <p class="title">修改密码</p>
      </div>
      <div class="edit-conten">
        <a-form ref="formRef" :model="formPaw" :rules="rules">
          <a-form-item label="原密码" ref="old_pwd" name="old_pwd" style="margin-left: 13px">
            <a-input
              v-model:value="formPaw.old_pwd"
              size="small"
              placeholder="请输入原密码"
              style="width: 360px; height: 30px"
            ></a-input>
          </a-form-item>
          <a-form-item label="新密码" ref="new_pwd" name="new_pwd" style="margin-left: 13px">
            <a-input
              v-model:value="formPaw.new_pwd"
              size="small"
              placeholder="请输入8到20位的字母加数字"
              style="width: 360px; height: 30px"
            ></a-input>
          </a-form-item>
          <a-form-item label="确认密码" ref="confirm_paw" name="confirm_paw">
            <a-input
              v-model:value="formPaw.confirm_paw"
              size="small"
              placeholder="请输入8到20位的字母加数字"
              style="width: 360px; height: 30px"
            ></a-input>
          </a-form-item>
        </a-form>
        <div class="submit-btn">
          <a-button class="cancel-btn" @click="selectClose">取 消</a-button>
          <a-button class="ok-btn" @click="selectTypeOk">保存</a-button>
        </div>
      </div>
    </div>
    <!-- 子账号 -->
    <!-- <ul class="content-list" v-if="showChildAccound">
        <li class="list-li">
          <div class="profile"></div>
          <div class="account">
            <span class="account-txt">账号类型</span>
            <span class="txt">{{ accountChildType }}</span>
          </div>
        </li>
        <li class="list-li">
          <div class="profile"></div>
          <div class="account">
            <span class="account-txt">账号信息</span>
            <div class="account-info">
              <span class="txt">{{ accountChInfo }}</span>
              <a-button type="primary" ghost style="width: 80px; height: 30px" size="small" @click="editChildPaw"
                >修改密码</a-button
              >
            </div>
          </div>
        </li>
        <li class="list-li">
          <div class="profile"></div>
          <div class="account">
            <span class="account-txt">主账号信息</span>
            <span class="txt">{{ accountinfo }}</span>
          </div>
        </li>
        <li class="list-li">
          <div class="profile"></div>
          <div class="account">
            <span class="account-txt">KEY</span>
            <div class="account-info">
              <span class="txt">{{ accountKey }}</span>
              <a-button type="primary" ghost style="width: 80px; height: 30px" size="small" @click="copyInfo"
                >复制</a-button
              >
            </div>
          </div>
        </li>
      </ul> -->
  </div>
</template>
<script setup>
import { message } from 'ant-design-vue'
import { AESUtil } from '@/utils/AESUtil'
// 输入密码信息
const formPaw = ref({
  old_pwd: '',
  new_pwd: '',
  confirm_paw: ''
})
// 子账号信息
const switchAccount = ref([])
// 修改密码确定
const selectTypeOk = async () => {}
// 修改密码取消
const selectClose = () => {}
// 判断输入的密码是否一致
const equalToPassword = (rule, value, callback) => {
  if (formPaw.value.new_pwd !== value) {
    callback(new Error('两次输入的密码不一致'))
  } else {
    callback()
  }
}
// 密码规则校验
const rules = ref({
  old_pwd: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
  new_pwd: [
    { required: true, message: '新密码不能为空', trigger: 'blur' },
    {
      pattern:
        '^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&*,./:;\\"\'\`~|*--+/\\\\.])[\\da-zA-Z!@#$%^&*,./:;\\"\'\`~|*--+/\\\\.]{8,20}$',
      message: '密码由8-20位至少包含一个大小写字母、数字、特殊符号组成',
      trigger: 'blur'
    }
  ],
  confirm_paw: [
    { required: true, message: '确认密码不能为空', trigger: 'blur' },
    { required: true, validator: equalToPassword, trigger: 'blur' }
  ]
})
onMounted(() => {})
</script>

(2)下载crypto-js插件

使用npm进行安装crypto-js

npm install crypto-js --save

(3)使用crypto-js插件

在下载完之后其实我们的项目里已经存在crypto-js插件了,如果不知道有没有安装成功可以在项目的package.json文件中进行查看。那么如何使用这个组件呢,这个还需要你再在utils文件夹下重新建一个名为AESUtil.js的文件。然后在这个文件里面使用此组件,具体方法如下:

import CryptoJS from 'crypto-js'

// 秘钥,必须由16位字符组成
// const secretKey = 'j78Rd5fEi9fr4$dY'
export const AESUtil = {
  /**
   * AES加密方法
   * @param content 要加密的字符串
   * @returns {string} 加密结果
   */
  aesEncrypt: (content, seckey ) => {
    const key = CryptoJS.enc.Utf8.parse(seckey)
    const srcs = CryptoJS.enc.Utf8.parse(content)
    const encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
    return encrypted.toString()
  },

  /**
   * 解密方法
   * @param encryptStr 密文
   * @returns {string} 明文
   */
  aesDecrypt: (encryptStr, seckey) => {
    const key = CryptoJS.enc.Utf8.parse(seckey)
    const decrypt = CryptoJS.AES.decrypt(encryptStr, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
    return CryptoJS.enc.Utf8.stringify(decrypt).toString()
  }
}

(4)引用AESUtil.js文件

结束完上述操作后,需要做的是如何在自己写的代码中使用到这个方法,首先是在上述代码中的<script>中引入AESUtil.js文件

import { AESUtil } from '@/utils/AESUtil'

然后再次确认密码的事件中进行使用

// 修改密码确定
const selectTypeOk = async () => {
  try {
    await formRef.value.validateFields()
  } catch (errorInfo) {
    return console.log('请完整输入')
  }
//这里是使用方式---本片文章最重要的地方
  const passwordEntity = {
    old_pwd: AESUtil.aesEncrypt(formPaw.value.old_pwd, 'DZ2Ri1rVRhWEALBx'),
    new_pwd: AESUtil.aesEncrypt(formPaw.value.new_pwd, 'DZ2Ri1rVRhWEALBx'),
    confirm_paw: AESUtil.aesEncrypt(formPaw.value.confirm_paw, 'DZ2Ri1rVRhWEALBx')
  }
  console.log(formPaw.value.old_pwd, 'formPaw.old_pwdformPaw.old_pwdformPaw.old_pwd')
  updAccountPwd(passwordEntity)
    .then(res => {
      if (res.code === 200 && res.data) {
        message.success('修改成功')
      } else {
        message.error('修改失败')
      }
    })
    .catch(error => {
      console.log(error)
    })
}

以上代码中的接口使用的是封装后的方式,可自行按照自己的进行修改即可

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

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

相关文章

高铝粉煤灰提取氧化铝可实现资源最大化利用 我国政府重视程度高

高铝粉煤灰提取氧化铝可实现资源最大化利用 我国政府重视程度高 高铝粉煤灰&#xff0c;是指氧化铝含量大于37%的粉煤灰&#xff0c;高铝粉煤灰提取氧化铝&#xff0c;是以高铝粉煤灰为原料&#xff0c;提取氧化铝的技术&#xff0c;可以提高我国氧化铝供应能力&#xff0c;实现…

C语言的学习发展路线(都是干货)

哈喽&#xff0c;大家好呀~我又回来了&#xff0c;前期比较忙&#xff0c;没有时间来更文&#xff0c;现在给大家推荐了一个C语言的学习路线&#xff0c;供大家一起学习啦&#xff01; 1. 环境搭建与工具篇 选择编译器&#xff1a;常用的编译器有gcc、Clang、Visual Studio等。…

Linux rpm包管理

rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager (RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的setup.exe&#xff0c;这一文件格式名称虽然打上了RedHat的标志&am…

推荐给中小学生的暑假打字神器

暑假是孩子们放松身心、增长知识的好时机。在这个漫长的假期里&#xff0c;家长们不仅希望孩子能够快乐地度过每一天&#xff0c;还希望他们能在学习上有所进步。尤其是随着科技的发展&#xff0c;熟练的打字技巧已经成为现代学习和工作的基本技能之一。今天&#xff0c;我要向…

10分钟掌握Python缓存,效率提升1000%

全文速览 python的不同缓存组件的使用场景和使用样例cachetools的使用 项目背景 代码检查项目&#xff0c;需要存储每一步检查的中间结果&#xff0c;最终把结果汇总并写入文件中 在中间结果的存储中 可以使用context进行上下文的传递&#xff0c;但是整体对代码改动比较大…

Jira实践案例分享:小米集团如何通过API请求优化、数据治理与AI智能客服等,实现Jira系统的高效运维

日前&#xff0c;Atlassian中国合作伙伴企业日活动在上海成功举办。活动以“AI协同 创未来——如何利用人工智能提升团队协作&#xff0c;加速产品交付”为主题&#xff0c;深入探讨了AI技术在团队协作与产品交付中的创新应用与实践&#xff0c;吸引了众多业内专家、企业客户及…

股掌柜:实时行情数据和工具:揭示投资潜力的关键

如今充斥着各种投资信息、交易平台和金融工具的时代&#xff0c;如何抓住投资机会成为了每个投资者必须面对的重要挑战。一个明确的投资策略和准确的市场分析成为了判断市场走势和抓住投资机会的关键。而实时行情数据和工具的使用则能够为投资者提供全面、准确的市场信息&#…

选择诊所管理系统的原则是什么?

如今&#xff0c;诊所管理系统已成为医疗机构提升管理效率、优化患者服务的重要工具。然而&#xff0c;市场上的诊所管理系统琳琅满目&#xff0c;功能各异&#xff0c;因此&#xff0c;如何选择一款适合自己诊所的管理系统&#xff0c;是许多诊所管理者需要思考的问题。下面&a…

idea常用配置 | 快捷注释

idea快速注释 一、类上快速注释 &#xff08;本方法是IDEA环境自带的&#xff0c;设置特别方便简单易使用&#xff09; 1、偏好设置->编辑器->文件和代码模版 | File-Settings-Editor-File and Code Templates 2、右下方的“描述”中有相对应的自动注注释配置格式 贴…

什么是期货基金?

期货基金&#xff0c;是指广大投资者将资金集中起来&#xff0c;委托给专业的期货投资机构&#xff0c;并通过商品交易顾问进行期货投资交易&#xff0c;投资者承担投资风险并享有投资利润的一种集合投资方式。期货基金的投资对象主要有两大类商品&#xff1a;期货与金融期货。…

使用nvm命令进行node和npm版本下载以及切换

下载以及安装nvm方式 https://blog.csdn.net/ppz8823/article/details/130862191 1.查看nvm版本 nvm -v2.查看node 和 npm版本 node -v npm -v3.使用nvm查看已下载的node版本 nvm ls4.使用nvm 查看可使用的在线node版本 nvm list available4.下载想要使用的node版本&#x…

叉车装载机智能AI影像防撞系统,让车辆远离事故!

"员工受伤会给你的公司带来多少损失&#xff1f; 如果把安全放在首位&#xff0c;你会节省多少钱&#xff1f; 避免碰撞和降低工作场所的伤害风险&#xff0c;不仅可以挽救生命&#xff0c;还可以降低整体成本。" 你知道吗&#xff1f;2021年度全国叉车事故总数为42起…

互联网医院系统开发中的移动端应用设计

在现代医疗服务中&#xff0c;互联网医院系统逐渐成为提升患者体验和优化医疗资源的重要手段。而移动端应用作为互联网医院系统的关键组成部分&#xff0c;其设计和开发尤为重要。本文将从设计原则、技术架构和具体实现等方面探讨互联网医院系统中的移动端应用设计&#xff0c;…

Android studio Logcat 功能介绍

介绍 Android Studio Jellyfish版本下logcat功能&#xff0c;不同的tag会有不同的颜色&#xff0c;不同level等级的log默认也有不同的颜色。log过滤修改的更简洁了&#xff0c;原先的log视图只需要勾选就可以选择不同level的log了&#xff0c;当前需要在输入框中进行过滤器匹配…

高性能并行计算华为云实验三:蒙特卡罗算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建蒙特卡罗算法源码 3.2 Makefile的创建与编译 3.3 主机文件配置与运行监测​​​​​​​ 四、实验结果与分析 4.1 原教程对应的实验结果 4.2 改进后的实验结果 五、实验思考与总结 5.1 实验思考 5.2 实验总结…

高效安全的IPXProxy代理服务:摆脱免费代理的烦恼

​在现代互联网环境中&#xff0c;IP代理的使用变得越来越普遍。无论是企业级用户还是个人用户&#xff0c;都需要借助IP代理来实现隐私保护、网络加速和跨区域访问。然而&#xff0c;面对市场上众多的代理服务&#xff0c;有些用户会因为成本考虑而选择免费代理。然而&#xf…

用python做地图绘制

1.写代码 from pyecharts.charts import Map from pyecharts.options import VisualMapOptsmapMap() data[("上海市",122),("北京市",12),("天津市", 12),("广东省",22) ] map.add("测试地图",data) map.set_global_opts(v…

惠海 H6901B升压恒流3.7V 7.4V 12V 24V 30V 36V 48V 60V 80V 100V LED灯杯方案

H6901B是一款升压型LED恒流驱动芯片&#xff0c;具有良好稳定性的特点。H6901B的主要特点包括宽输入电压范围&#xff08;2.7V-100V&#xff09;、高工作频率&#xff08;1MHz&#xff09;以及多种保护功能&#xff08;如芯片供电欠压保护、过温保护、软启动等&#xff09;。此…

专业,城市,院校,高考填报志愿的三要素怎么排序?

我认为排序方式可以参考&#xff1a; 城市>学校 同样是计算机专业&#xff0c;不论学校的高低&#xff0c;一线城市更容易接触到时代的前端&#xff0c;有更多学习机会&#xff0c;有更好的文化氛围&#xff0c;同样在就业的时候也更容易接触到企业.... 如果要把专业考虑进…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 二(51-)

环境&#xff1a;OpenCV3.2.0 VS2015 51、Mean-Shift算法分割图像 cv::pyrMeanShiftFiltering() 参考链接&#xff1a;【从零学习OpenCV 4】分割图像——Mean-Shift分割算法 Mean-Shift算法又被称为均值漂移法&#xff0c;是一种基于颜色空间分布(彩色图像的像素值)的图像分割…