10vue3实战-----实现登录的基本功能

news/2025/2/9 8:26:02 标签: 前端, vue3实战, 后台管理, typescript, 登录功能

10vue3实战-----实现登录的基本功能

  • 1.基本页面的搭建
  • 2.账号登录的验证规则配置
  • 3.点击登录按钮
  • 4.表单的校验
  • 5.账号的登录逻辑和登录状态保存
  • 6.定义IAccount对象类型

1.基本页面的搭建

大概需要搭建成这样子的页面:
在这里插入图片描述
具体的搭建界面就不多讲。各个项目都有自己的登录界面,搭建方法大同小异,这是基础,在这不做赘叙。

2.账号登录的验证规则配置

直接使用element-plus中现成的表单校验功能。
template:

<template>
  <div class="pane-account">
    <el-form
      :model="account"
      :rules="accountRules"
      label-width="60px"
      size="large"
      status-icon
      ref="formRef"
    >
      <el-form-item label="帐号" prop="name">
        <el-input v-model="account.name" />
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input v-model="account.password" show-password />
      </el-form-item>
    </el-form>
  </div>
</template>

script:

<script setup lang="ts">
import { reactive} from 'vue'
import type { FormRules} from 'element-plus'
// 1.定义account数据
const account = reactive({
  name: '',
  password: ''
})
// 2.定义校验规则
//这里accountRules不需要用reactive进行响应式,因为一般不会改变。
const accountRules: FormRules = {
  name: [
    { required: true, message: '必须输入帐号信息~', trigger: 'blur' },
    {
      pattern: /^[a-z0-9]{6,20}$/,
      message: '必须是6~20数字或字母组成~',
      trigger: 'blur'
    }
  ],
  password: [
    { required: true, message: '必须输入密码信息~', trigger: 'blur' },
    {
      pattern: /^[a-z0-9]{3,}$/,
      message: '必须是3位以上数字或字母组成',
      trigger: 'blur'
    }
  ]
}
</script>

3.点击登录按钮

上面的登录界面把它封装成了多个组件。登录模块目录结构如下:
在这里插入图片描述
如上,Login.vue有一个login-panel登录面板子组件,登录面板组件下有pane-account和pane-phone两个子组件。
在这里插入图片描述
这里“立即登录”按钮是在login-panel组件中,点击按钮后需要用到账号和密码的信息,但他们都在子组件。有一种方法是把子组件传到父组件;还有一种方法是login-panel父组件中调用子组件的方法。这里我用第二种方法:
以账号登录为例,子组件pane-account文件:

<script setup lang="ts">
import { reactive, ref } from 'vue'
// 1.定义account数据
const account = reactive({
  name: '',
  password: ''
})
...
// 3.执行帐号的登录逻辑
function loginAction() {
   console.log("用户正在登录",account.name,account.password);
}
//一定要暴露出来,父组件才能使用子组件的方法:
defineExpose({
  loginAction
})
</script>

父组件login-panel.vue文件:

<script setup lang="ts">
import { ref } from 'vue'
import PaneAccount from './pane-account.vue'
import PanePhone from './pane-phone.vue'

const activeName = ref('account')
//下面这行代码要特别注意,经常会用到
//一般都是用InstanceType<typeof xxx>这种方法
//这里最好不要const accountRef = ref<any>()
//虽然万事都可以any,但那样子的话就没有相关提示了
const accountRef = ref<InstanceType<typeof PaneAccount>>()
//点击登录按钮
function handleLoginBtnClick() {
  if (activeName.value === 'account') {
    //简写方式,accountRef存在才执行accountRef.value.loginAction()
    accountRef.value?.loginAction()
  } else {
    console.log('用户在进行手机登录')
  }
}
</script>

4.表单的校验

子组件pane-account文件:

<script setup lang="ts">
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import type { FormRules, ElForm } from 'element-plus'
// 1.定义account数据
const account = reactive({
  name: '',
  password: ''
})
...
// 3.执行帐号的登录逻辑
//这个与上面的accountRef是一样的道理
const formRef = ref<InstanceType<typeof ElForm>>()
function loginAction() {
  formRef.value?.validate((valid) => {
    if (valid) {
      console.log("验证成功","登录的操作")
    } else {
      ElMessage.error('Oops, 请您输入正确的格式后再操作~~.')
    }
  })
}

defineExpose({
  loginAction
})
</script>

5.账号的登录逻辑和登录状态保存

首先要封装一下登录的网络接口:
在service文件夹中新建main和login模块:
在这里插入图片描述
service/login/login.ts:

import hyRequest from '..'
//这里account类型暂时为any,后面再处理
export function accountLoginRequest(account: any) {
  return hyRequest.post({
    url: '/login',
    data: account
  })
}

登录之后需要把用户信息保存到pinia中,所以在store里面也要新建login和main模块来处理相关业务:
在这里插入图片描述
store/login/login.ts:

import { defineStore } from 'pinia'
import { accountLoginRequest } from '@/service/login/login'
const useLoginStore = defineStore('login', {
  state: () => ({
    id: '',
    token:'',
    name: ''
  }),
  actions: {
    //account暂时为any,后面会再进行处理
    async loginAccountAction(account: any) {
      // 1.账号登录, 获取token等信息
      const loginResult = await accountLoginRequest(account)
      this.id = loginResult.data.id
      this.name = loginResult.data.name
      this.token = loginResult.data.token
      ...
    }
  }
})

export default useLoginStore

pinia中的数据一刷新就会消失,下一章节将会解决该问题。

6.定义IAccount对象类型

在上面很多文件里面都用到了一个对象,里面包含有账号和密码,但给它的类型都是any:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样子是不好的。我们可以把account的类型提取出来,放在一个文件中。
在src中新建一个types文件夹:
在这里插入图片描述
types/login.ts:

export interface IAccount {
  name: string
  password: string
}

types/index.ts:

 export * from './login'

然后在需要的文件中引入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5845832.html

相关文章

基于ESP32的远程开关灯控制(ESP32+舵机+Android+物联网云平台)

目录 材料环境准备物理材料软件环境 物联网平台配置&#xff08;MQTT&#xff09;MQTT阿里云平台配置创建产品添加设备自定义topic esp32配置接线代码 Android部分和云平台数据流转 前言&#xff1a;出租屋、宿舍网上关灯问题&#xff0c;计划弄一个智能开关以及带一点安防能力…

ElementUI的<el-image>组件引用网络图片加载失败

1. 验证图片 URL 是否有效 直接访问图片链接&#xff0c;确保 URL 正确且可公开访问 如果浏览器无法加载图片&#xff0c;可能是图片服务器限制了外链或已失效。 解决方法&#xff1a;更换为可用的图片 URL。 2. 检查浏览器开发者工具 打开浏览器开发者工具&#xff08;F12…

docker环境下部署face-search开源人脸识别模型

由于我们是直接将face-search部署在docker容器中的,所以,在部署之前一定要检查一下自己的docker环境,要不然部署过程中会出现各种各样的问题 我这里的docker环境是 一、安装docker环境 如果docker版本比较低或者docker-compose的版本比较低的情况下,部署的时候docker的yml…

[Meet DeepSeek] 如何顺畅使用DeepSeek?告别【服务器繁忙,请稍后再试。】

文章目录 [Meet DeepSeek] 如何顺畅使用DeepSeek&#xff1f;告别【服务器繁忙&#xff0c;请稍后再试。】引言使用渠道一&#xff1a;硅基流动 Chatbox AI【推荐】硅基流动 Chatbox AI的优势 使用渠道二&#xff1a;秘塔AI搜索秘塔AI搜索的优势 其它方案1. DeepSeek官网2. 纳…

B树详解及其C语言实现

目录 一、B树的基本原理 二、B树操作过程图形化演示 三、B树的应用场景 四、C语言实现B树及示例 五、代码执行结果说明 六、应用实例&#xff1a;文件系统目录索引 七、总结 一、B树的基本原理 B树&#xff08;B-Tree&#xff09; 是一种自平衡的树数据结构&#xff0c;…

数据结构--八大排序算法

1. 直接插入排序 当插入第 i(i>1) 个元素时&#xff0c;前面的 array[0],array[1],…,array[i-1] 已经排好序&#xff0c;此用 array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进行比较&#xff0c;找到插入位置即将 array[i] 插入&#xff0c;原来位置上的元素…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…

LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)

lvgl有触摸、键盘、实体按键、编码器四种输入设备 先来分析一下这四种输入设备有什么区别 &#xff08;1&#xff09;LV_INDEV_TYPE_POINTER 主要用于触摸屏 用到哪个输入设备保留哪个其他的也是&#xff0c;保留触摸屏输入的任务注册&#xff0c;其它几种种输入任务的注册&…