硅谷甄选二(登录)

news2024/9/27 23:29:49

一、登录路由静态组件

src\views\login\index.vue

<template>
  <div class="login_container">
    <!-- Layout 布局 -->
    <el-row>
      <el-col :span="12" :xs="0"></el-col>
      <el-col :span="12" :xs="24">
        <el-form class="login_form">
          <h1>Hello</h1>
          <h2>欢迎来到硅谷甄选</h2>
          <el-form-item>
            <el-input
              :prefix-icon="User"
              v-model="loginForm.username"
              ></el-input>
          </el-form-item>
          <el-form-item>
            <el-input
              type="password"
              :prefix-icon="Lock"
              v-model="loginForm.password"
              show-password
              ></el-input>
          </el-form-item>
          <el-form-item>
            <el-button class="login_btn" type="primary" size="default">
              登录
            </el-button>
          </el-form-item>
        </el-form>
      </el-col>
    </el-row>
  </div>
</template>

<script setup lang="ts">
  import { User, Lock } from '@element-plus/icons-vue'
  import { reactive } from 'vue'
  //收集账号与密码数据
  let loginForm = reactive({ username: 'admin', password: '111111' })
</script>

<style lang="scss" scoped>
  .login_container {
    width: 100%;
    height: 100vh;
    background: url('@/assets/images/background.jpg') no-repeat;
    background-size: cover;
    .login_form {
      position: relative;
      width: 80%;
      top: 30vh;
      background: url('@/assets/images/login_form.png') no-repeat;
      background-size: cover;
      padding: 40px;
      h1 {
        color: white;
        font-size: 40px;
      }
      h2 {
        color: white;
        font-size: 20px;
        margin: 20px 0px;
      }
      .login_btn {
        width: 100%;
      }
    }
  }
</style>

注意:el-col是24份的,在此左右分为了12份。我们在右边放置我们的结构。:xs="0"是为了响应式。el-form下的element-plus元素都用el-form-item包裹起来。

二、登陆业务实现 

1)安装大仓库(笔记只写一次)

安装pinia:pnpm i pinia@2.0.34

src\store\index.ts

//仓库大仓库
import { createPinia } from 'pinia'
//创建大仓库
const pinia = createPinia()
//对外暴露:入口文件需要安装仓库
export default pinia

main.ts引入

//引入仓库
import pinia from './store'
app.use(pinia);

2)用户相关的小仓库

src\store\modules\user.ts

//创建用户相关的小仓库
import { defineStore } from 'pinia'
//创建用户小仓库
const useUserStore = defineStore('User', {
  //小仓库存储数据地方
  state: () => {},
  //处理异步|逻辑地方
  actions: {},
  getters: {},
})
//对外暴露小仓库
export default useUserStore

使用

//引入用户相关的小仓库
    import useUserStore from '@/store/moudles/user'
    let useUserStore2 = useUserStore()

3)按钮回调

//引入路由
import { useRouter } from 'vue-router'
import { ElNotification } from 'element-plus'
//引入ElNotification
import { ElNotification } from 'element-plus'
let $router = useRouter();
//登录按钮的回调
const login = async () => {
  //按钮加载效果
  loading.value = true
  //点击登录按钮以后干什么
  //通知仓库发起请求
  //请求成功->路由跳转
  //请求失败->弹出登陆失败信息
  try {
    //也可以书写.then语法
    await useStore.userLogin(loginForm)
    //编程式导航跳转到展示数据的首页
    $router.push('/')
    //登录成功的提示信息
    ElNotification({
      type: 'success',
      message: '登录成功!',
    })
    //登录成功,加载效果也消失
    loading.value = false
  } catch (error) {
    //登陆失败加载效果消失
    loading.value = false
    //登录失败的提示信息
    ElNotification({
      type: 'error',
      message: (error as Error).message,
    })
  }
}

4)用户仓库

//创建用户相关的小仓库
import { defineStore } from 'pinia'
//引入接口
import { reqLogin } from '@/api/user'
//引入数据类型
import type { loginForm } from '@/api/user/type'
//创建用户小仓库
const useUserStore = defineStore('User', {
  //小仓库存储数据地方
  state: () => {
    return {
      token: localStorage.getItem('TOKEN'), //用户唯一标识token
    }
  },
  //处理异步|逻辑地方
  actions: {
    //用户登录的方法
    async userLogin(data: loginForm) { //返回一个promise对象
      //登录请求
      const result: any = await reqLogin(data)
      if (result.code == 200) {
        //pinia仓库存储token
        //由于pinia|vuex存储数据其实利用js对象
        this.token = result.data.token
        //本地存储持久化存储一份
        localStorage.setItem('TOKEN', result.data.token)
        //保证当前async函数返回一个成功的promise函数
        return 'ok'
      } else {
        return Promise.reject(new Error(result.data.message))
      }
    },
  },
  getters: {},
})
//对外暴露小仓库
export default useUserStore

5)小结

Element-plus中ElNotification用法(弹窗):

引入:import { ElNotification } from 'element-plus'

使用:

//登录失败的提示信息
    ElNotification({
      type: 'error',
      message: (error as Error).message//类型断言,Error是ts内置类型
    })
//登录成功的提示信息
ElNotification({
  type: 'success',
  message: '登录成功!'
})
  1. Element-plus中el-buttonloading属性。
  2. pinia使用actions、state的方式和vuex不同:需要引入函数创建实例
  3. $router的使用:也需要引入函数创建实例
  4. 在actions中使用state的token数据:this.token
  5. 类型定义需要注意。
  6. promise的使用和vue2现在看来是一样的。

三、模板封装登陆业务

1)result返回类型封装

//src\api\user\type.ts
interface dataType {
  token?: string
  message?: string
}

//登录接口返回的数据类型
export interface loginResponseData {
  code: number
  data: dataType
}

2)State仓库类型封装 

//src\store\modules\types\type.ts
//定义小仓库数据state类型
export interface UserState {
  token: string | null
}

3)本地存储封装

将本地存储的方法封装到一起 

//src\utils\token.ts
//封装本地存储存储数据与读取数据方法
export const SET_TOKEN = (token: string) => {
  localStorage.setItem('TOKEN', token)
}

export const GET_TOKEN = () => {
  return localStorage.getItem('TOKEN')
}

 4)登录时间的判断

//src\utils\time.ts
//封装函数:获取当前时间段
export const getTime = () => {
  let message = ''
  //通过内置构造函数Date
  const hour = new Date().getHours()
  if (hour <= 9) {
    message = '早上'
  } else if (hour <= 14) {
    message = '上午'
  } else if (hour <= 18) {
    message = '下午'
  } else {
    message = '晚上'
  }
  return message
}

使用

ElNotification({
                 type: 'success',
                 message: '欢迎回来',
                 title: `HI,${getTime()}好`
            })

五、表单校验规则

1)表单校验

表单绑定项

<el-form class="login_form" :model="loginForm" :rules="rules" ref="loginForms"> 
</el-form>

Form 组件提供了表单验证的功能,只需为 rules 属性传入约定的验证规则,并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可

 

定义

//收集账号与密码数据
    let loginForm = reactive({ username: 'admin', password: '111111' })
    //定义表单校验需要的配置对象
    const rules = {
      username: [
        //规则对象属性:
        {
          required: true, // required,代表这个字段务必要校验的
          min: 5, //min:文本长度至少多少位
          max: 10, // max:文本长度最多多少位
          message: '长度应为6-10位', // message:错误的提示信息
          trigger: 'change', //trigger:触发校验表单的时机 change->文本发生变化触发校验, blur:失去焦点的时候触发校验规则
        }, 
        
      ],
      password: [
      {
          required: true,
          min: 6,
          max: 10,
          message: '长度应为6-15位',
          trigger: 'change',
        }, 
      ],
    }
    //获取表单元素
    let loginForms = ref()

校验规则通过后运行

const login = async () => {
  //保证全部表单项校验通过
  await loginForms.value.validate()
	。。。。。。
}

2)自定义表单校验

//自定义校验规则函数
    const validatorUserName = (rule: any, value: any, callback: any) => {
      //rule:校验规则对象
      //value:表单元素文本内容
      //callback:符合条件,callback放行通过,不符合:注入错误提示信息
      if (value.length >= 5) {
        callback()
      } else {
        callback(new Error('账号长度至少5位'))
      }
    }

    const validatorPassword = (rule: any, value: any, callback: any) => {
      if (value.length >= 6) {
        callback()
      } else {
        callback(new Error('密码长度至少6位'))
      }
    }
    //定义表单校验需要的配置对象
    const rules = {
      username: [
        //规则对象属性:
        /* {
          required: true, // required,代表这个字段务必要校验的
          min: 5, //min:文本长度至少多少位
          max: 10, // max:文本长度最多多少位
          message: '长度应为6-10位', // message:错误的提示信息
          trigger: 'change', //trigger:触发校验表单的时机 change->文本发生变化触发校验, blur:失去焦点的时候触发校验规则
        }, */
        { trigger: 'change', validator: validatorUserName },
      ],
      password: [
        { trigger: 'change', validator: validatorPassword },
      ],
    }

 

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

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

相关文章

Qt基础控件总结—多页面切换(QStackWidget类、QTabBar类和QTabWidget类)

QStackedWidget 类 QStackedWidget 类是在 QStackedLayout 之上构造的一个便利的部件,其使用方法与步骤和 QStackedLayout 是一样的。QStackedWidget 类的成员函数与 QStackedLayout 类也基本上是一致的,使用该类就和使用 QStackedLayout 一样。 使用该类可以参考QStackedL…

施罗德数列SQL实现

在组合数学中,施罗德数用来描述从(0,0)到(n,n)的格路中,只能使用(1,0)、(0,1)、(1,1)三种移动方式,始终位于对角线下方且不越过对角线的路径数 DECLARE n INT 10 DECLARE i INT DECLARE rst INT DECLARE old INT1CREATE TABLE #rst (i INT ,rst int )INSERT INTO #rst values(…

Python 中创建当前日期和时间的文件名技巧详解

概要 在日常开发中,经常需要创建带有当前日期和时间的文件名,以便进行日志记录、数据备份或版本控制等操作。Python 提供了丰富的库和函数,可以方便地获取当前日期和时间,并将其格式化为字符串,用于生成文件名。本文将详细介绍如何使用 Python 创建带有当前日期和时间的文…

springboot大学生竞赛管理系统-计算机毕业设计源码37276

摘 要 随着教育信息化的不断发展&#xff0c;大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题&#xff0c;如信息不透明、效率低下、管理不便等。为了解决这些问题&#xff0c;提高竞赛组织和管理效率&#xff0c;本文设计并实现了一个基于Sp…

STM32(二):STM32工作原理

0、参考1、寄存器和存储器基本概念&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;主要区别&#xff08;3&#xff09;联系&#xff08;4&#xff09;实际应用中的案例&#xff08;5&#xff09;总结&#xff08;6&#xff09;一些名词解释 2、STM32指南者板子-存…

免费GPU——Google Colab使用

免费GPU——Google Colab使用 1、创建新的Notebook 网址&#xff1a;https://colab.research.google.com/ 点击“新建笔记本”进行创建 2、设置免费GPU 点击“更改运行时类型”&#xff0c;打开界面如下所示&#xff1a; 选择“T4 GPU”&#xff0c;然后“保存”即可使用…

秒速将油管视频转换为博客文章!

摘要&#xff1a; 本文提供了一个免费试用的分步指南&#xff0c;介绍如何在短时间内将YouTube视频内容转换为博客文章&#xff0c;以扩展网络营销效果。通过使用特定的模板和自动化工具&#xff0c;可以显著提高内容转换的效率。 关键词&#xff1a; YouTube视频&#xff0c;…

会员运营体系设计及SOP梳理

一些做会员的经验和方法分享给大家&#xff0c;包括顶层思考、流程的梳理、组织的建立&#xff0c;后续会做成系列&#xff0c;最近几期主要围绕顶层策略方面&#xff0c;以下是核心内容的整理&#xff1a; 1、会员运营体系设计 顶层设计与关键业务定位&#xff1a;建立客户运营…

中霖教育:考完一建后二建证书还有用吗?

通过一级建造师考试后&#xff0c;二建证书依然有效。如果一建和二建证书是不同专业&#xff0c;通过一级建造师考试&#xff0c;二级建造师资格同样保持有效。对于相同专业的情况&#xff0c;两种证书亦也在相同单位同时注册&#xff0c;不会注销。 一级与二级建造师的区别&a…

python入门综合篇—资源爬取与exe打包(图形界面)

了解我的人都知道&#xff0c;我是一个谨言慎行且兴趣爱好广泛的IT&#xff0c;作为一个合格的前端&#xff0c;没事捣鼓一下python很合理吧&#xff0c;再没事搞搞java和php也很合乎逻辑吧&#xff0c;实在没事&#xff0c;玩玩linux服务器也是合乎常理的吧。所以&#xff0c;…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

鲁班猫系统镜像烧录

http://t.csdnimg.cn/0FQ0w2. 系统镜像烧录 — 快速使用手册—基于LubanCat-RK3588系列板卡 文档 烧录鲁班猫系统镜像&#xff0c;配置鲁班猫环境&#xff0c;将整个环境打包用于其他鲁班猫。 先将一个空镜像烧到SD卡中&#xff0c;使用SD卡将鲁班猫开机&#xff0c;使用dd备…

深入理解Python密码学:使用PyCrypto库进行加密和解密

深入理解Python密码学&#xff1a;使用PyCrypto库进行加密和解密 引言 在现代计算领域&#xff0c;信息安全逐渐成为焦点话题。密码学&#xff0c;作为信息保护的关键技术之一&#xff0c;允许我们加密&#xff08;保密&#xff09;和解密&#xff08;解密&#xff09;数据。P…

window下载安装clang

执行clang报错&#xff1a; c:/>clang test.cclang: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found] clang: error: unable to execute command: program not executable clang: error: li…

智慧园区能源管理可视化应用

应用图扑可视化技术&#xff0c;实时监控管理智慧园区内的光伏及其他能源系统&#xff0c;优化能耗配置&#xff0c;提高能源利用效率&#xff0c;推动绿色环保和可持续发展。

Ansys Zemax|什么是点扩散函数( PSF )

附件下载 联系工作人员获取附件 概览 这篇文章讲述了&#xff1a; 什么是点扩散函数&#xff1f; 点列图 快速傅里叶变换计算的点扩散函数&#xff08;FFT PSF&#xff09; 惠更斯算法计算的点扩散函数&#xff08;Huygens PSF&#xff09; 如何使用非序列模式下的透镜和…

一篇教会你 位置式PID 在写码中的应用。

前言&#xff1a;编写不易&#xff0c;仅供学习&#xff0c;参考&#xff0c;谢谢理解&#xff0c;请勿转载。 #位置式|增量式PID区别 本系列的前两篇讲的是位置式PID 没有增量式 PID &#xff0c;PID的变种有很多&#xff0c;常见的有 位置式PID 增量式PID PI PD 抗…

小公司是如何染上大公司病的

小公司&#xff0c;顾名思义就是小&#xff0c;船小好调头。​本应该是最具拼搏精神和灵活性的小公司却不幸染上了大公司病。创业难&#xff0c;守业更难&#xff0c;这些小公司是如何染上大公司病的&#xff1f; 一、管理过度 某公司规定&#xff0c;员工出差&#xff0c;到…

AIGC技术引领创意设计行业革新,“谁”能成职业发展新引擎?

随着科技的日新月异&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;技术正迅速崛起&#xff0c;成为创意设计领域的一股强大新势力。该技术不仅显著提升了设计师的工作效率&#xff0c;更为他们打开了前所未有的创意空间。在这一波技术浪潮中&#xff0c;Adobe国际认证…

高考志愿怎么选专业,哪些是热门专业?

选专业看上去非常简单&#xff0c;但是真正做起来的时候确实不容易&#xff0c;因为对于很多结束高考的学生来说&#xff0c;选专业就意味着他们选择自己的未来&#xff0c;这可是直接关系到未来的学习和职业发展&#xff0c;关系到将来的就业方向&#xff0c;再加上现在的社会…