vue3的大致使用

news/2024/7/10 3:02:45 标签: vue

<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.niftyadmin.cn/n/5270758.html

相关文章

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…

【数据结构】八大排序之希尔排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.优化直接插入排序算法 我们在之前对直接插入排序算法的优化部分通过对直接插入排序的分析可以得到一个结论,即: 进行直接插入排序的数组,如果越接近局部有序,则后续进行直…

机器学习算法---聚类

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

【react.js + hooks】基于事件机制的跨组件数据共享

跨组件通信和数据共享不是一件容易的事&#xff0c;如果通过 prop 一层层传递&#xff0c;太繁琐&#xff0c;而且仅适用于从上到下的数据传递&#xff1b;建立一个全局的状态 Store&#xff0c;每个数据可能两三个组件间需要使用&#xff0c;其他地方用不着&#xff0c;挂那么…

优质全套SpringMVC教程

三、SpringMVC 在SSM整合中&#xff0c;MyBatis担任的角色是持久层框架&#xff0c;它能帮我们访问数据库&#xff0c;操作数据库 Spring能利用它的两大核心IOC、AOP整合框架 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff08;不是设计模式-思想就是我们…

使用IDEA创建springboot依赖下载很慢,解决方法

显示一直在resolving dependencies&#xff0c;速度很慢 原因&#xff1a;maven会使用远程仓库来加载依赖&#xff0c;是一个国外的网站&#xff0c;所以会很慢。应该使用阿里云的镜像&#xff0c;这样速度会提升很多。 步骤&#xff1a;1.右击pom.xml&#xff0c;选择"m…

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求&#xff1a;http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

C#实现一个安全的事件订阅器

1.解释下什么是事件订阅器 在C#的上下文中&#xff0c;事件订阅器是一种用于处理特定事件的机制。 事件&#xff08;Event&#xff09;&#xff1a;事件是在软件应用程序中发生的事物&#xff0c;如按钮被点击、数据被更改等。在C#中&#xff0c;事件是通过使用event关键字声…