首页 > 其他分享 >springboot+vue前后端分离项目-项目搭建10-验证码功能

springboot+vue前后端分离项目-项目搭建10-验证码功能

时间:2024-07-14 17:53:11浏览次数:11  
标签:10 vue springboot random ValidCode message data Math

本次演示的验证码功能只涉及前端,而且功能简单

1. 新建vue/src/components/ValidCode.vue

<template>
  <div class="ValidCode disabled-select"
       :style="`width:${width}; height:${height}`"
       @click="refreshCode"
  >
    <span v-for="(item, index) in codelist"
          :key="index"
          :style="getStyle(item)"
    >{{ item.code }}</span>
  </div>
</template>

<script>
export default {
  name: "ValidCode",
  model: {
    prop: 'value',
    event: 'input'
  },
  props: {
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '40px'
    },
    length: {
      type: Number,
      default: 4
    },
    refresh: {
      type: Number
    }
  },
  data(){
    return{
      codelist: []
    }
  },
  watch: {
    refresh(){
      this.createdCode()
    }
  },
  mounted() {
    this.createdCode()
  },
  methods: {
    refreshCode(){
      this.createdCode()
    },
    createdCode(){
      const len = this.length
      const codeList = []
      const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
      const charsLen = chars.length
      //生成
      for (let i = 0; i < len; i++){
        const rgb = [Math.round(Math.random() * 220),Math.round(Math.random() * 240),Math.round(Math.random() * 220)]
        codeList.push({
          code: chars.charAt(Math.floor(Math.random() * charsLen)),
          color: `rgb(${rgb})`,
          fontSize: `${10 + (+[Math.floor(Math.random() * 10)] + 6)}px`,
          padding: `${[Math.floor(Math.random() * 10)]}px`,
          transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)`
        })
      }
      // 指向
      this.codelist = codeList
      // 将当前数据派发出去
      // console.log(codeList.map(item +> item.code).join(''))
      this.$emit('input', codeList.map(item => item.code).join(''))
    },
    getStyle (data) {
      return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}: transform: ${data.transform}`
    }
  }
}
</script>

<style scoped>
.ValidCode{
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.ValidCode span{
  display: inline-block;
}
</style>

2. vue/src/views/LoginView.vue里引用

<template>
  <div style="width: 100%; height: 100vh; background-color: darkslateblue; overflow: hidden">
    <div style="width: 400px; margin: 150px auto">
      <div style="color: #cccccc; font-size: 30px; text-align: center; padding: 30px 0">欢迎登录</div>
      <el-form label-position="right" :model="form" size="normal" :rules="rules" ref="form">
        <el-form-item prop="username">
          <el-input :prefix-icon="Avatar" v-model="form.username" placeholder="请输入账号"/>
        </el-form-item>
        <el-form-item prop="password">
          <el-input :prefix-icon="Lock" v-model="form.password" show-password placeholder="请输入密码"/>
        </el-form-item>
        <el-form-item>
          <div style="display: flex">
            <el-input :prefix-icon="Key" v-model="form.validCode" style="width: 50%" placeholder="请输入验证码"/>
            <ValidCode @input="createValidCode"/>
          </div>
        </el-form-item>
        <el-form-item>
          <el-radio v-model="form.role" :label="1">管理员</el-radio>
          <el-radio v-model="form.role" :label="2">普通用户</el-radio>
        </el-form-item>
        <el-form-item>
          <el-button style="width: 100%;" type="primary" @click="login">登 录</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import request from "@/utils/request";
import ValidCode from "@/components/ValidCode.vue";

export default {
  name: "LoginView",
  components: {
    ValidCode
  },
  data(){
    return {
      form: {role: 1},
      rules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' }
        ]
      },
      validCode: ''
    }
  },
  created() {
    sessionStorage.removeItem("user")
  },
  methods: {
    // 接收验证码组件提交的4位验证码
    createValidCode(data){
      this.validCode = data
    },
    login() {
      this.$refs.form.validate((valid) => {
        if(valid){
          if(!this.form.validCode) {
            this.$message.error("请填写验证码")
            return
          }
          if(this.form.validCode.toLowerCase() !== this.validCode.toLowerCase()) {
            this.$message.error("验证码错误")
            return
          }
          request.post("/user/login", this.form).then(res => {
            console.log(res)
            if (res.code === '0') {
              this.$message({
                type: "success",
                message: "登录成功"
              })
              sessionStorage.setItem("user", JSON.stringify(res.data))
              this.$router.push("/user") //登陆成功后跳转到主页
            } else {
              this.$message({
                type: "error",
                message: res.msg
              })
            }
          })
        }
      });
    }
  }
}
</script>

<script setup>
import { Avatar,Lock,Key } from '@element-plus/icons-vue'
</script>

<style scoped>

</style>

 效果:

 

标签:10,vue,springboot,random,ValidCode,message,data,Math
From: https://www.cnblogs.com/xiexieyc/p/18301811

相关文章

  • 题解 P1007 独木桥
    link题意\(N\)个人在长度为\(L\)独木桥上走动,桥上的坐标为\(1,2,\cdots,L\),你不知道他们的方向。他们的速度都为\(1\)。当两个人相遇时,他们就分别转身,继续行走。(转身不花费时间)当某人来到\(0\)或\(L+1\)的位置,他就离开了独木桥。给定\(N\)、\(L\)和\(......
  • springboot“爱相连”儿童慈善管理系统的设计与实现
    #系统介绍随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了“爱相连”儿童慈善管理的发展。然而,由于用户量和需求......
  • springboot 基于uni-app的蛋糕订购小程序的设计与实现
     #系统介绍相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低商家的运营人员成本,实现了蛋糕订购的标准化、制度化、程序化的管理,有效地防止了蛋糕订购的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正蛋糕信息、购物车、订单等信息。课题主要采......
  • 银河麒麟V10SP1搭建oracle19c(单库)
    遇到的坑:1.PRVG-0282问题解决:在先决条件检查步骤,PRVG-0282:无法检索操作系统分发ID的报错,该问题是由于字符集和环境变量问题,只需在执行安装前:使用oracle用户登录,不要root跳到oracle用户下exportCV_ASSUME_DISTID=RHEL7.6exportLANG=en_US然后刷新环境变量在执行./runInstal......
  • 1117java jsp SSM Springboot在线答疑系统学生考试问题发布教师疑难解答(源码+文档+PPT
     项目技术:Springboot+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:window......
  • 2021杭电多校10 D.Pty hates prime numbers题解
    前言暑期第三次组队赛是选的21年杭电多校10,遗憾爆0,被对面队打爆,赛后狠狠补题。这道题的题解,以及网上搜到的其他题解看了好久没看懂,在问了队里大腿多次后,总算磨出来了,这里讲一下我的理解。题意多次询问,每次给定\(n\)和\(k\),如果一个数的质因数里包括前\(k\)个质数,则这个数......
  • 基于uniapp+springboot的记账小程序
    小程序视频链接:https://www.bilibili.com/video/BV1hi421Y7BE/?vd_source=cd3ceb58125e43fa5f95caf874aec5ef1.登录 2.注册 3.我的 4.账单 5.记账6.图表 7.明细 ......
  • vue子组件调用父组件方法
    父组件页面<popoverssref="pop":goodspop="goodspop"></popoverss>子组件 components:{"popoverss":()=>import('../comm/popover.vue')},方法goodspop(e){console.log(e+"----")......
  • vue-router引入多路由文件
    importVuefrom'vue'importRouterfrom'vue-router'importwinIndexfrom'./winIndex.js';Vue.use(Router)exportdefaultnewRouter({routes:[...winIndex,//引入路由wenj{path:'/login',name......
  • springboot“爱相连”儿童慈善管理系统的设计与实现
    系统介绍随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了“爱相连”儿童慈善管理的发展。然而,由于用户量和需求......