当前位置: 首页 > news >正文

vue3后台管理系统之登录界面和业务的实现

1.静态页面的搭建

<template><div class="login_container"><el-row><el-col :span="12" :xs="0" /><el-col :span="12" :xs="24"><!-- 登录的表单 --><el-form ref="loginForms" class="login_form" :model="loginForm" :rules="rules"><h1>Hello</h1><h2>欢迎来到xxx管理系统</h2><el-form-item prop="username"><el-input v-model="loginForm.username" :prefix-icon="User" /></el-form-item><el-form-item prop="password"><el-input v-model="loginForm.password" type="password" :prefix-icon="Lock" show-password /></el-form-item><el-form-item><el-button :loading="loading" class="login_btn" type="primary" size="default" @click="login">登录</el-button></el-form-item></el-form></el-col></el-row></div>
</template><script setup lang="ts">
import { Lock, User } from '@element-plus/icons-vue'
import { reactive, ref } from 'vue'
//引入用户相关的小仓库
// import useUserStore from '@/store/moudules/user'
// const useStore = useUserStore()
//获取el-form组件
const loginForms = ref()
//获取路由器//定义变量控制按钮加载效果
const loading = ref(false)
//收集账号与密码的数据
const loginForm = reactive({ username: 'admin', password: '111111' })//自定义校验规则函数
const validatorUserName = (value: any, callback: any) => {//rule:即为校验规则对象//value:即为表单元素文本内容//函数:如果符合条件callBack放行通过即为//如果不符合条件callBack方法,注入错误提示信息if (value.length >= 5) {callback()} else {callback(new Error('账号长度至少五位'))}
}const validatorPassword = (value: any, callback: any) => {if (value.length >= 6) {callback()} else {callback(new Error('密码长度至少六位'))}
}//定义表单校验需要配置对象
const rules = {//规则对象属性://required,代表这个字段务必要校验的//min:文本长度至少多少位//max:文本长度最多多少位//message:错误的提示信息//trigger:触发校验表单的时机 change->文本发生变化触发校验,blur:失去焦点的时候触发校验规则username: [// { required: true, min: 6, max: 10, message: '账号长度至少六位', trigger: 'change' }{ trigger: 'change', validator: validatorUserName }],password: [// { required: true, min: 6, max: 15, message: '密码长度至少6位', trigger: 'change' }{ trigger: 'change', validator: validatorPassword }]
}//登录请求
const login = () => {console.log(111)// useStore.userLogin(loginForm)
}
</script><style scoped lang="scss">
.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 {font-size: 20px;color: white;margin: 20px 0px;}.login_btn {width: 100%;}}
}
</style>

2.登录业务逻辑处理

// 创建用户仓库
import { defineStore } from 'pinia'
// 引入接口
import { reqLogin } from '@/api/user'
// u引入数据类型
import type { loginForm, loginResponseData } from '@/api/user/type'
import type { UserState } from './types/type'
// 引入操作本地存储
import { SET_TOKEN, GET_TOKEN } from '@/utils/token'
const useUserStore = defineStore('User', {// 小仓库存储数据state: (): UserState => {return {token: GET_TOKEN(),}},// 异步逻辑actions: {async userLogin(data: loginForm) {// 登录请求const res: loginResponseData = await reqLogin(data)console.log(res)if (res.code === 200) {this.token = res.data.token as stringSET_TOKEN(res.data.token as string)return 'ok'} else {return Promise.reject(new Error(res.data.message))}},},getters: {},
})
export default useUserStore

定义token数据类型

修改登录返回结果数据类型

封装本地存储数据和读取数据的方法

完善登录界面

封装判断时间函数

//封装一个函数:获取一个结果:当前早上|上午|下午|晚上
export const getTime = () => {let message = ''//通过内置构造函数Dateconst hours = new Date().getHours()//情况的判断if (hours <= 9) {message = '早上'} else if (hours < 12) {message = '上午'} else if (hours <= 18) {message = '下午'} else {message = '晚上'}return message
}
<template><div class="login_container"><el-row><el-col :span="12" :xs="0"></el-col><el-col :span="12" :xs="24"><!-- 登录的表单 --><el-form class="login_form" :model="loginForm" :rules="rules" ref="loginForms"><h1>Hello</h1><h2>欢迎来到硅谷甄选</h2><el-form-item prop="username"><el-input :prefix-icon="User" v-model="loginForm.username"></el-input></el-form-item><el-form-item prop="password"><el-input type="password" :prefix-icon="Lock" v-model="loginForm.password" show-password></el-input></el-form-item><el-form-item><el-button :loading="loading" class="login_btn" type="primary" size="default" @click="login">登录</el-button></el-form-item></el-form></el-col></el-row></div>
</template><script setup lang="ts">
import { Lock, User } from '@element-plus/icons-vue'
import { reactive, ref } from 'vue'
import { ElNotification } from 'element-plus'
// 引入获取当前时间的函数
import { getTime } from '@/utils/time'
//引入用户相关的小仓库
import useUserStore from '@/store/moudules/user'
import { useRouter } from 'vue-router'
let useStore = useUserStore()
//获取el-form组件
let loginForms = ref()
//获取路由器
let $router = useRouter()
//定义变量控制按钮加载效果
let loading = ref(false)
//收集账号与密码的数据
let loginForm = reactive({ username: 'admin', password: '111111' })//自定义校验规则函数
const validatorUserName = (value: any, callback: any) => {//rule:即为校验规则对象//value:即为表单元素文本内容//函数:如果符合条件callBack放行通过即为//如果不符合条件callBack方法,注入错误提示信息if (value.length >= 5) {callback()} else {callback(new Error('账号长度至少五位'))}
}const validatorPassword = (value: any, callback: any) => {if (value.length >= 6) {callback()} else {callback(new Error('密码长度至少六位'))}
}//定义表单校验需要配置对象
const rules = {//规则对象属性://required,代表这个字段务必要校验的//min:文本长度至少多少位//max:文本长度最多多少位//message:错误的提示信息//trigger:触发校验表单的时机 change->文本发生变化触发校验,blur:失去焦点的时候触发校验规则username: [// { required: true, min: 6, max: 10, message: '账号长度至少六位', trigger: 'change' }{ trigger: 'change', validator: validatorUserName },],password: [// { required: true, min: 6, max: 15, message: '密码长度至少6位', trigger: 'change' }{ trigger: 'change', validator: validatorPassword },],
}//登录请求
const login = async () => {// 加载效果loading.value = truetry {await useStore.userLogin(loginForm)$router.push('/')ElNotification({type: 'success',message: '登录成功',title: ` HI,${getTime()}好 `,})loading.value = false} catch (error) {// 登录失败loading.value = falseElNotification({type: 'error',message: '账号和密码不正确',})}
}
</script><style scoped lang="scss">
.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 {font-size: 20px;color: white;margin: 20px 0px;}.login_btn {width: 100%;}}
}
</style>

相关文章:

vue3后台管理系统之登录界面和业务的实现

1.静态页面的搭建 <template><div class"login_container"><el-row><el-col :span"12" :xs"0" /><el-col :span"12" :xs"24"><!-- 登录的表单 --><el-form ref"loginForms&qu…...

GEE19:基于Landsat8的常见的植被指数逐年获取

植被指数逐年获取 1. 常见的植被指数1.1 比值植被指数&#xff08;Ratio vegetation index&#xff0c;RVI&#xff09;1.2 归一化植被指数&#xff08;Normalized Difference Vegetation Index&#xff0c;NDVI&#xff09;1.3 增强植被指数&#xff08;Enhanced Vegetation I…...

Python【多分支实际应用的练习】

要求:某商店T恤的价格为35元/件&#xff08;2件9折&#xff0c;3件以上8折&#xff09;,裤子的价格为120 元/条&#xff08;2条以上9折&#xff09;小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱? 代码如下&#xff1a; tshirt_price 35 # T恤的单价 pan…...

LeetCode 343. 整数拆分(动态规划)

LeetCode 343. 整数拆分 思路&#xff1a; 通过题目我们可以知道&#xff0c;一个正整数最少拆成2个数&#xff0c;最多拆成n个数&#xff0c;即可拆分的个数为2&#xff5e;n 若将拆除的第一个正整数令为k&#xff0c;那么剩下的数则为n-k&#xff0c;此时可以不拆分&#x…...

C++对象模型(12)-- 构造函数语义学:构造函数

1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数&#xff0c;但在下列情况下&#xff0c;编译器会生成默认构造函数。 &#xff08;1&#xff09;该类没有任何构造函数&#xff0c;但包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认构造函数。 …...

[23] T^3Bench: Benchmarking Current Progress in Text-to-3D Generation

3D生成蓬勃发展&#xff0c;主流方法通过事例比较和用户调查来评价方法好坏&#xff0c;缺少客观比较指标&#xff1b;本文提出Bench&#xff0c;首次综合比较了不同生成方法&#xff1b;具体来说&#xff0c;本文设计了质量评估&#xff08;Quality Assessment&#xff09;和对…...

linux系统如何定时关机

立刻关机 poweroff 10分钟后自动关机 shutdown -h 10 如果希望终止上面执行的10分钟关机&#xff0c;则执行&#xff1a; shutdown -c 希望在22:00关闭计算机 shutdown -h 22:00...

构建高性能物联网数据平台:EMQX和CnosDB的完整教程

CnosDB 是一款高性能、高压缩率、高易用性的开源分布式时序数据库。主要应用场景为物联网、工业互联网、车联网和IT运维。所有代码均已在GitHub开源。本文将介绍如何使用EMQX 这一MQTT 服务器 CnosDB 构建物联网数据平台&#xff0c;实现物联网数据的实时流处理。 前言 在物联…...

【vim 学习系列文章 11 -- vim filetype | execute | runtimepath 详细介绍】

文章目录 filetype plugin indent on 什么功能&#xff1f;vim runtimepath 详细介绍vim 中 execute 命令详细介绍execute pathogen#infect() 详细介绍 filetype plugin indent on 什么功能&#xff1f; 在网上我们经常可以看到vimrc配置中有 filetype plugin indent on 这个配…...

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用

Windows上 查看端口占用&#xff1a; netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例&#xff1a; Linux 上 查看端口占用&#xff1a; netstat -tuln | grep <端口号> lsof -i:<端口号&…...

函数的扩展

文章目录 函数的扩展1.函数参数的默认值1.1 基本用法-- 参数变量是默认声明的&#xff0c;所以不能用 let或const 再次声明-- 使用参数默认值时&#xff0c;函数不能有同名参数1.2 与解构赋值默认值结合使用☆☆☆ 函数参数的默认值生效以后&#xff0c;参数解构赋值依然会进行…...

Cypress安装使用

node.js 安装使用Cypress总是会看见node.js&#xff0c;那就先看看node.js是什么。JavaScript以前运行需要在浏览器中&#xff08;浏览器内置解释器&#xff09;&#xff0c;通过node.js框架内置v8引擎&#xff08;也就是可以执行js脚本所需的工具&#xff09;&#xff0c;这样…...

怎么把图片改成jpg格式?

怎么把图片改成jpg格式&#xff1f;大家都知道&#xff0c;随着计算机被发明到现在已经存在了很多年&#xff0c;在这么多的的技术发展过程中&#xff0c;也形成了种类非常多的图片文件格式&#xff0c;例如平时我们能接触到的图片格式有jpg、png、gif、bmp、heic、tiff、jfif、…...

[一带一路金砖 2023 CTF]Crypto

题1 题目描述&#xff1a; from Crypto.Util.number import * from flag import flag import gmpy2 assert(len(flag)38) flag bytes_to_long(flag)p getPrime(512) q getPrime(512)e 304 enc pow(flag,e,p*q) print(p) print(q) print(enc) #9794998439882070838464987…...

FPGA【Verilog语法】

关键字&#xff1a; and always assign begin buf bufif0 bufif1 case casex casez cmos deassign default defparam disable edge else end endcase endfunction endprimitive endmodule endspecify endtable …...

Flume 整合 Kafka

1.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合后的数据输入到 Storm 等分布式计算框架中,可能就会超过集群的处理能力,这时采用 Kaf…...

VUE:侧边弹出栏组件,组件中有树状图,搜索框可筛选树状图节点,可收缩

作者:CSDN @ _乐多_ 本文记录了一个侧边弹出栏组件代码。代码即插即用。 弹出栏中有树状图,搜索框,可收缩。 其中,搜索框可筛选树状图节点。点击右侧小按钮可以收缩弹出框,点击X号也可以收缩弹出框。 文章目录 一、组件代码代码依赖element-plus库。且需要下载几个svg图…...

如何使用pytorch定义一个多层感知神经网络模型——拓展到所有模型知识

# 导入必要的库 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, random_split import torchvision.transforms as transforms import torchvision.datasets as datasets# 定义MLP模型 class MLP(nn.Module):def __…...

为什么引入SVG文件,给它定义属性不生效原理分析

背景&#xff1a; 我使用antd 的Icon组件引入SVG图片&#xff0c;但给svg图片定义styles样式时&#xff0c;不生效&#xff0c;为什么呢&#xff1f; 我们平时用antd组件库的 < ArrowRightOutlined style{{color: red }}>时为什么会生效呢&#xff0c;但我图一这样定义就…...

Integer包装类常用方法和属性

包装类 什么是包装类Integer包装类常用方法和属性 什么是包装类 Java 包装类是指为了方便处理基本数据类型而提供的对应的引用类型。Java 提供了八个基本数据类型&#xff08;boolean、byte、short、int、long、float、double、char&#xff09;&#xff0c;每个基本数据类型对…...

WaveTools鸣潮工具箱终极指南:画质优化与抽卡分析的完整解决方案

WaveTools鸣潮工具箱终极指南&#xff1a;画质优化与抽卡分析的完整解决方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的强大辅助工具&#xff0c;它…...

CTC语音唤醒模型在医疗语音录入系统中的应用案例

CTC语音唤醒模型在医疗语音录入系统中的应用案例 1. 引言 在医疗场景中&#xff0c;医生每天需要处理大量的病历记录工作。传统的手写或键盘输入方式不仅效率低下&#xff0c;还容易分散医生对患者的注意力。现在&#xff0c;通过CTC语音唤醒技术&#xff0c;医疗语音录入系统…...

PasteMD场景应用:微信聊天记录自动整理为会议纪要

PasteMD场景应用&#xff1a;微信聊天记录自动整理为会议纪要 1. 为什么你的会议纪要总是一团糟&#xff1f; 想象一下这个场景&#xff1a; 下午两点&#xff0c;项目组紧急拉了个微信群聊&#xff0c;大家七嘴八舌讨论了半小时&#xff0c;敲定了五个关键事项和三个责任人。…...

Cortex-M 配置控制寄存器(CCR)的实战应用与优化技巧

1. Cortex-M配置控制寄存器&#xff08;CCR&#xff09;基础解析 第一次接触Cortex-M处理器的CCR寄存器时&#xff0c;我完全被这个看似简单却功能强大的寄存器震撼到了。这个位于系统控制块&#xff08;SCB&#xff09;中的32位寄存器&#xff0c;地址固定在0xE000ED14&#x…...

OpenClaw浏览器控制:GLM-4.7-Flash实现自动化数据采集

OpenClaw浏览器控制&#xff1a;GLM-4.7-Flash实现自动化数据采集 1. 为什么选择OpenClaw进行网页数据采集 去年我在做一个市场分析项目时&#xff0c;遇到了一个棘手的问题——需要从十几个行业网站定期采集数据&#xff0c;但每个网站的页面结构都不一样。手动复制粘贴效率…...

OmenSuperHub:解锁惠普游戏本隐藏性能的开源控制方案

OmenSuperHub&#xff1a;解锁惠普游戏本隐藏性能的开源控制方案 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否厌倦了官方Omen Gaming Hub的臃肿体验&#xff1f;想要一个纯净、高效的硬件控制工具来释放你的惠普游…...

技术深度解析:Fritzing电路仿真与自动布线实现原理

技术深度解析&#xff1a;Fritzing电路仿真与自动布线实现原理 【免费下载链接】fritzing-app Fritzing desktop application 项目地址: https://gitcode.com/gh_mirrors/fr/fritzing-app Fritzing作为一款开源的电子设计自动化工具&#xff0c;其核心价值在于将复杂的电…...

基于51单片机与HX711的智能电子秤Proteus仿真与计价系统实现

1. 项目背景与核心功能 最近在整理实验室材料时&#xff0c;发现很多同学对电子秤项目的仿真实现存在困惑。这个基于51单片机和HX711的智能电子秤系统&#xff0c;不仅能够完成基础称重&#xff0c;还能实现商品计价、LCD显示等完整超市电子秤功能。我在实际调试中发现&#xf…...

RLT火了,但拧螺丝的真问题真是它解决的吗?

先说结论RLT的核心价值在于“分工”&#xff1a;让笨重但泛化好的VLA做感知和粗规划&#xff0c;让轻快但专精的小网络做在线微调&#xff0c;这是一种计算和样本成本的折中架构。它没有解决数据收集的根本成本&#xff0c;而是优化了“数据利用率”和“策略更新效率”&#xf…...

Bongo-Cat-Mver:实时键盘动画工具的创新应用与实践指南

Bongo-Cat-Mver&#xff1a;实时键盘动画工具的创新应用与实践指南 【免费下载链接】Bongo-Cat-Mver An Bongo Cat overlay written in C 项目地址: https://gitcode.com/gh_mirrors/bo/Bongo-Cat-Mver 在直播、教学和演示场景中&#xff0c;如何让观众清晰感知键盘操作…...