vue3的大致使用


<template>
    <div class="login_wrap">
        <div class="form_wrap">
<!--            账号输入-->
<el-form ref="formRef"  :model="user"  class="demo-dynamic" >
<!--prop要跟属性名称对应-->
    <el-form-item prop="id"    :rules="[ { required: true, message: '账号不能为空', trigger: 'blur',}, ]">
        <el-input style="height: 50px;font-size: 30px" v-model="user.id" ><template #prepend>账号</template></el-input>
    </el-form-item>
<!--密码输入-->
    <el-form-item prop="password"  class="password-input"  :rules="[ { required: true, message: '密码不能为空', trigger: 'blur',}, ]">
        <el-input type="password" style="height: 50px;font-size: 30px" v-model="user.password" ><template #prepend>密码</template></el-input>
    </el-form-item>
<!--    验证码-->
    <el-form-item prop="identifyingcode.inputverificationcodenumber" :rules="[ { required: true, message: '验证码不能为空', trigger: 'blur',}, ]">
        <el-input style="height: 50px;font-size: 30px"  v-model="user.identifyingcode.inputverificationcodenumber" ><template #prepend>验证码</template></el-input>
    </el-form-item>

  <el-form-item>
   <div style="font-size: 30px"> 用户角色:</div>
    <el-select v-model="user.role">
      <el-option
          v-for="item in option.role"
          :key="item"
          :label="item"
          :value="item"
      />
    </el-select>
  </el-form-item>
    <canvas class='code' ref="codeimg"  @click="codetrigger"></canvas>
    </el-form>

            <el-button type="primary"  style="width: 100px;height: 40px" @click='lgintrigger' class="login-btn">登录</el-button>
        </div>
    </div>

  <div class="information">作者:甘世涛
  <br/>版权所有  违者必究
    <br/>前端框架:vue <br/>    后端框架springboot
  </div>
</template>

<script>
    import {useRouter} from "vue-router";
    import {useStore} from "vuex";
    import {get,post} from "@/util/service";
    import { reactive, onMounted, ref, toRefs } from 'vue'
    import { ElMessage} from 'element-plus'
    export default {
        setup()
        {   const router=useRouter()
            const store=useStore()
            const codeimg = ref(null)//获取div对象 ref属性为codeimg的对象  这个对象是验证码
            let userrole=""
          
          
            const data = reactive ({
                option:{
                  role:['管理员','教师','学生']
                },

                 user:{//用户
                 id:"",//用户账号
                 password:"",//用户密码
                    role:"",//用户角色
                     identifyingcode: {//验证码
                         pool: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', // 随机生成A-F 1-9的验证码
                         // pool: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', // 字符串
                         width: 360,
                         height: 200,
                         verificationcodenumber: "",/*随机生成的验证码*/
                         inputverificationcodenumber:""/*键盘输入的验证码*/
                     }

             },
              
              
                shishi:"",

            })


          
          
          
            onMounted(() => {//初始化函数
                data.user.identifyingcode.verificationcodenumber = draw() // 初始化绘制图片验证码
            })


          
          
          
            const codetrigger = () => {
                data.user.identifyingcode.verificationcodenumber = draw()  // 点击图片重新绘制
            }
            
            
            

            // 随机数
            const randomNum = (min, max) => {
                return parseInt(Math.random() * (max - min) + min)
            }


            

            const randomColor = (min, max) => { // 随机颜色
                const r = randomNum(min, max)
                const g = randomNum(min, max)
                const b = randomNum(min, max)
                return `rgb(${r},${g},${b})`
            }


            const draw = () => {// 绘制图片
                const ctx = codeimg.value.getContext('2d')// 3.填充背景颜色,背景颜色要浅一点
                ctx.fillStyle = randomColor(180, 230) // 填充颜色颜色不要太深
                ctx.fillRect(0, 0, data.user.identifyingcode.width, data.user.identifyingcode.height)// 填充的位置
                let verificationcodenumber = ''//存储四个验证码
                for (let i = 0; i < 4; i++) {               // 4.随机产生字符串,并且随机旋转
                    const text = data.user.identifyingcode.pool[randomNum(0, data.user.identifyingcode.pool.length)]  // 随机的四个字
                    verificationcodenumber += text
                    const fontSize = randomNum(100, 200) // 随机的字体大小
                    const deg = randomNum(-30, 30) // 字体随机的旋转角度
                    ctx.font = fontSize + 'px SimSun'//宋体
                    ctx.textBaseline = 'top'
                    ctx.fillStyle = randomColor(80, 150)
                    /* 用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
                    restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
                     */
                    ctx.save()
                    ctx.translate(60 * i + 15, 15)//平移
                    ctx.rotate((deg * Math.PI) / 180)//旋转
                    ctx.fillText(text, -15 + 5, -15)//填充文本
                    ctx.restore()
                }
                // 5.随机产生5条干扰线,干扰线的颜色要浅一点
                for (let i = 0; i < 5; i++) {
                    ctx.beginPath()
                    ctx.moveTo(randomNum(0, data.user.identifyingcode.width), randomNum(0, data.user.identifyingcode.height))
                    ctx.lineTo(randomNum(0, data.user.identifyingcode.width), randomNum(0, data.user.identifyingcode.height))
                    ctx.strokeStyle = randomColor(180, 230)
                    ctx.closePath()
                    ctx.stroke()
                }


                // 6.随机产生40个干扰的小点
                for (let i = 0; i < 40; i++) {
                    ctx.beginPath()
                    ctx.arc(randomNum(0, data.user.identifyingcode.width), randomNum(0, data.user.identifyingcode.height), 1, 0, 2 * Math.PI)
                    ctx.closePath()
                    ctx.fillStyle = randomColor(150, 200)
                    ctx.fill()
                }
                return verificationcodenumber
            }

          onMounted( async () => {

          })





           const lgintrigger=async () => {
               if (data.user.role === "" && data.user.accountnumber === "" || data.user.password === "" || data.user.identifyingcode.inputverificationcodenumber === "") {
                   ElMessage.error("输入信息不能为空")
                   return
               }
               if (data.user.identifyingcode.inputverificationcodenumber !== data.user.identifyingcode.verificationcodenumber) {
                   ElMessage.error("验证码不正确")
                   return
               }
               let flag;
               localStorage.setItem('userrole', data.user.role)//当前用户角色
               localStorage.setItem('id', data.user.id)//当前用户角色
               var formdata = new FormData()
               formdata.append("id", data.user.id)
               formdata.append("password", data.user.password)
               if (data.user.role === "管理员") {
                   await  post("/admin/login", formdata).then(res => {
                       if (res) {
                           localStorage.setItem('userrole', data.user.role)//当前用户角色
                           router.push('/home')
                       } else {
                           alert("不存在该账号和密码")
                       }

                   })

               } else if (data.user.role === "教师") {
                   await post("/teacher/login", formdata).then(res => {
                       if (res) {
                           localStorage.setItem('id', data.user.id)//当前用户编号
                           localStorage.setItem('userrole', data.user.role)//当前用户角色
                           router.push('/home')
                       } else {
                           alert("不存在该账号和密码")
                       }
                   })
               } else {
                   await post("/student/login", formdata).then(res => {
                       if (res) {
                           localStorage.setItem('id', data.user.id)//当前用户编号
                           localStorage.setItem('userrole', data.user.role)//当前用户角色
                           router.push('/home')
                       } else {
                           alert("不存在该账号和密码")
                       }
                   })
               }
           }


            return{
                ...toRefs(data),
                lgintrigger,
                codeimg,
                codetrigger
            }
            //
        }
    }

</script>

<style scoped>
.login_wrap{
    width: 100%;
    height: 80vh;
    background: rgb(0,186,255,100);
     background-image: url("../assets/shouye.png");
    /*
    position: relative;
    */
}

.information{
  width: 100%;
  height: 80vh;
  background: rgb(0,100,255,100);
  font-size: 30px;
  text-align: center;
}
/*这个是包括登录还有验证码一系列的框*/
.form_wrap{
    width: 500px;
    height: 380px;
    position: fixed;
    top:50%;
    left: 50%;
    transform: translate(-50%,-50%);
    background: #fff;
    padding:10px 10px;/*子组件内部变距*/
    border-radius: 5px;
    border-radius: 7%;

}
.form_wrap button{

}
.form_wrap el-input{

  height: 900px;
}
/*这个是登录按钮*/
.login-btn
{ position: fixed;
    display: block;
    margin: 0px auto;
    top:80%;
    left:40%;
}

/*这个是角色选择 角色的名称  有三种  admin student teacher*/
#rolename
{
    position: fixed;
    top:4%;
    left: 10%;


}


/*}*/
/*鼠标移动到验证码显示一个手*/
.code {
    cursor: pointer;
    width: 160px;
    height: 50px;
}
</style>

vue3启动
在这里插入图片描述
dev代表启动的环境

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 OADC:开放原子云社区正式启航,Curve、Kyuubi获奖

12月16-17日&#xff0c;2023开放原子开发者大会&#xff08;OADC&#xff09;在江苏省无锡市召开。大会首日&#xff0c;由网易数帆联合发起的“开放原子云社区”宣告成立&#xff0c;随后网易数帆资深云原生专家侯诗军分享了稳定性保障的前沿实践&#xff0c;Curve、Apache K…

引领位置服务驱动:腾讯地图 WebService 服务端 API 实用指南

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Web前端-JavaScript(js表达式)

文章目录 JavaScript基础第01天1.编程语言概述1.1 编程1.2 计算机语言1.2.1 机器语言1.2.2 汇编语言1.2.3 高级语言 1.4 翻译器 2.计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 3.初始JavaScript3.1 JavaScript 是什么3.2 JavaScript的作用3.3 HTML/CSS/…

修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)

现象&#xff1a; 这个问题是直接指向了我使用的第三方库good-storage&#xff0c;这是一个对localStorage/sessionStorage做了简单封装的库&#xff0c;因为项目代码有一个缓存cache.ts有用到 原因分析&#xff1a; 从表象上看是storage对象找不到getItem方法&#xff0c; 但…

大数据基础-测试过程

一、大数据&#xff1a; 大数据是一个大的数据集合&#xff0c;通过传统的计算技术无法处理。这些数据集的测试需要用各种工具、技术、框架进行处理。大数据涉及数据创建&#xff0c;存储、检索、分析&#xff0c;而且它在数量、多样性、速度都很出色。 二、大数据的测试类型…

【JAVA】CyclicBarrier源码解析以及示例

文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协同应用示例 CyclicBarrier和CountDownLatch的区别循环性&#xff1a;计数器的变化&#xff1a;用途…

【Spark面试】Spark面试题答案

目录 1、spark的有几种部署模式&#xff0c;每种模式特点&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 2、Spark为什么比MapReduce块&#xff1f;&#xff08;☆☆☆☆☆&#xff09; 3、简单说一下hadoop和spark的shuffle相同和差异&#xff1f;&#xff08;☆☆☆☆☆…

【HTML5、CSS3】新增特性总结!

文章目录 23 HTML5 新增特性23.1 语义化标签23.2 多媒体标签23.2.1 视频<video>标签23.2.2 音频<audio>标签 23.3 input属性值23.4 表单属性 24 CSS3 新增特性24.1 属性选择器24.2 结构伪类选择器24.2.1 选择第n个元素24.2.2 常用的6个结构伪类选择器 24.3 伪元素选…

Qt for Android设置安卓程序默认横屏+全屏

我的qt版本是5.14.1&#xff0c;网上查到的方法是&#xff0c;把编译出的build文件夹中的AndroidManifest.xml文件复制出来然后修改&#xff0c;然后把修改后的xml文件加入pro文件&#xff0c;语法为ANDROID_PACKAGE_SOURCE_DIR $$PWD/AndroidManifest.xml&#xff08;具体&am…

Window和Linux设置代理和取消代理(http_proxy)

前言 需要git clone下载项目的时候&#xff0c;一直clone不下来&#xff0c;则需要添加代理 特别注意&#xff0c;在图形界面中设置代理之后&#xff0c;还需要在终端命令行中设置&#xff0c;否则终端无法使用 1. Window 临时设置代理&#xff1a; export http_proxyhttp…

【运维笔记】Hyperf正常情况下Xdebug报错死循环解决办法

问题描述 在使用hyperf进行数据库迁移时&#xff0c;迁移报错&#xff1a; 查看报错信息&#xff0c;错误描述是Xdebug检测到死循环&#xff0c;可是打印的堆栈确实正常堆栈&#xff0c;没看到死循环。 寻求解决 gpt 说的跟没说一样。。 google一下 直接把报错信息粘贴上去…

LV.13 D5 uboot概述及SD卡启动盘制作 学习笔记

一、uboot概述 1.1 开发板启动过程 开发板上电后首先运行SOC内部iROM中固化的代码(BL0)&#xff0c;这段代码先对基本的软硬件环境(时钟等...)进行初始化&#xff0c;然后再检测拨码开关位置获取启动方式&#xff0c;然后再将对应存储器中的uboot搬移到内存&#xff0c;然后跳…

如何提高RAG增强的准确性

在一个典型的RAG应用开发中&#xff0c;必要的步骤为文档加载&#xff0c;文档拆分&#xff0c;向量化&#xff0c;向量存储。然后基于向量存储进行相似性查询&#xff0c;或基于向量距离的查询。这类查询就叫检索&#xff0c;LangChain所提供的对应组件就是检索器。 但这种方…

数据分析为何要学统计学(10)——如何进行比率检验

比率检验是通过样本推测某种事件的总体占比水平。要求事件仅有互斥的两种情况&#xff0c;即&#xff0c;概率分别为p与1-p。 比率检验分单样本和双样本两种情况&#xff0c;以下我们分别介绍。 1. 单样本比率检验 形如这样的问题&#xff1a;“小学生近视比例日益提高&#…

mybatis 批量新增(返回主键),批量查询,批量更新数据

1.配置连接允许批量操作 配置url后面 &allowMultiQueriestrue2.数据层 2.1 mapper // 新增void saveNewStudyPartyDatums(List<StudyDatum> list);// 查询List<Party> getParties(Param("partIds") List<Long> partIds); // 更新void updat…

惯性导航基础知识学习----惯性器件相关

&#x1f308;武汉大学惯性导航课程合集是入门惯导的精品课程~ 作为导航路上的鼠鼠我&#xff0c;要开始学习惯性导航了~ 需要达到的要求是大致了解惯导的原理等~ 后期会陆续更新惯导相关的知识和笔记等~ &#x1f42c; 本blog为 武汉大学惯性导航课程 的记录~ 感谢团队提供的开…

实验八 A/D模数转换(汇编与微机原理)

实验目的&#xff1a; 掌握ADC0809模数转换的工作原理。 掌握用ADC0809来进行电压转换的使用方法。 实验内容&#xff1a; 用模数转换器件ADC0809测量外部输入的模拟电压&#xff0c;将转换结果输出到数码管的最右边两位上显示。 实验原理&#xff1a; 0809A/D转换芯片有8…

查询某个类是在哪个JAR的什么版本开始出现的方法

背景 我们在依赖第三方JAR时&#xff0c;同时也会间接的依赖第三方JAR引用的依赖&#xff0c;而当我们项目中某个依赖的版本与第三方JAR依赖的版本不一致时&#xff0c;可能会导致第三方JAR的在运行时无法找到某些方法或类&#xff0c;从而无法正常使用。 如我正在开发的一个…

SpringIOC之作用域Scope

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

JUC并发编程 06——Synchronized与锁升级

一.Java对象内存布局和对象头 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头(Header) 、实例数据 (Instance Data) 和 对文填充 (Padding)。 对象内部结构分为&#xff1a;对象头、实例数据、对齐填充&#xff08;保证8个字节的…