Vue3+Element Plus+TS开发企业管理后台(二)

使用vite初始化项目

确保你的开发环境中已经安装了Node.js,而且有npm,yarn等包管理工具,然后可以按照vite官方提供的方式初始化项目:

yarn create vite

跟随提示选择即可:
在这里插入图片描述

或者可以直接克隆下面的仓库
https://github.com/iicoom/vat

安装项目依赖

➜  vat yarn add vue-router element-plus echarts nprogress

新增router、layouts目录

在src目录下新增router用于配制项目路由,layouts用于存放项目的布局组建。

在layouts中新增login.vue文件用来处理登录页面的样式和登录、注册校验等逻辑。

<template><div class="login-container"><div class="login-form" v-if="mode === 'login'"><h1>Hello!</h1><h2>欢迎来到 Vue Admin TS!</h2><el-form :model="form" ref="ruleFormRef" :rules="rules"><el-form-item label="" prop="name"><el-input v-model="form.name" :prefix-icon="User" size="large" placeholder="用户名" clearable /></el-form-item><el-form-item label="" prop="password"><el-input v-model="form.password" :prefix-icon="Lock" size="large" placeholder="密码" show-password clearable /></el-form-item><el-button :loading="submitting" :loading-icon="Eleme" size="large" type="primary" style="width: 50%"@click="confirm(ruleFormRef)">登录</el-button></el-form><div><el-link type="primary" @click="switchMode('register')">没有账号?去注册</el-link></div></div><div class="login-form" v-if="mode === 'register'"><h1>注册账号</h1><h2>速度超快,注册账号后免费试用!</h2><el-form :model="registerForm" ref="registerFormRef" :rules="rules"><el-form-item label="" prop="name"><el-input v-model="registerForm.name" :prefix-icon="User" size="large" placeholder="用户名" clearable /></el-form-item><el-form-item label="" prop="password"><el-input v-model="registerForm.password" :prefix-icon="Lock" size="large" placeholder="密码" show-passwordclearable /></el-form-item><el-form-item label="" prop="confirm_password"><el-input v-model="registerForm.confirm_password" :prefix-icon="Lock" size="large" placeholder="确认密码"show-password clearable /></el-form-item><el-button size="large" type="primary" style="width: 50%" @click="submit">提交</el-button></el-form><div><el-link type="primary" @click="switchMode('login')">去登录</el-link></div></div><VatFooter theme="dark" /></div>
</template><script setup lang="ts">
import { reactive, ref } from 'vue'
import VatFooter from '@/components/VatFooter.vue'
import { User, Lock, Eleme } from '@element-plus/icons-vue'
import type { FormInstance, FormRules } from 'element-plus'
import { ElNotification, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'const ruleFormRef = ref<FormInstance>()
const form = reactive({name: '',password: ''
})const rules = reactive<FormRules>({name: [{ required: true, message: '请输入' }],password: [{ required: true, message: '请输入' }],confirm_password: [{ required: true, message: '请输入' },{validator: (rule, value, callback) => {if (value !== registerForm.password) {callback(new Error("两次输入的密码不匹配!"))} else {callback()}}}]
})const router = useRouter()
const submitting = ref(false)
function confirm(formEl: FormInstance | undefined) {if (!formEl) returnformEl.validate(async (valid) => {if (valid) {submitting.value = truetry {submitting.value = falserouter.push({ path: '/' })ElNotification({title: '欢迎登录 VAT!',message: '',type: 'success',showClose: false})} catch (e) {submitting.value = false}}})
}document.onkeydown = function (event) {if (event.key === 'Enter') {confirm(ruleFormRef.value)}
}const mode = ref('login')
function switchMode(val: string) {mode.value = val
}const registerForm = reactive({name: '',password: '',confirm_password: '',
})
const registerFormRef = ref<FormInstance>()
function submit() {registerFormRef.value?.validate(async (valid) => {if (valid) {ElMessage.success('注册成功!')}})
}
</script><style scoped lang="scss">
.login-container {background-image: url(@/assets/login-bg.jpg);background-size: cover;background-repeat: no-repeat;height: 100vh;width: 100%;.login-form {position: fixed;top: 50%;right: 100px;background-color: rgb(102, 51, 153, 0.4);height: 70%;overflow-y: scroll;width: 28%;transform: translateY(-50%);border-radius: 20px;padding: 40px;display: flex;flex-direction: column;gap: 20px;color: #fff;h1 {font-size: 50px;}}.login-form::-webkit-scrollbar {display: none;}
}@media (max-width: 480px) {.login-form {width: 90% !important;right: 5% !important;}
}
</style>

在router中新增index.ts管理项目路由

import { createRouter, createWebHistory } from "vue-router";
import LoginLayout from "../layouts/login.vue";
import NProgress from "nprogress";
import "nprogress/nprogress.css";const router = createRouter({history: createWebHistory(),routes: [{path: "/login",name: "Login",component: LoginLayout,},],
});NProgress.configure({easing: "ease",speed: 500,trickleSpeed: 200,showSpinner: false,
});export default router;

现在我们启动项目访问http://localhost:5174/login,你本地的端口可能不是5174,按你自己的实际情况访问。

这样登录注册页面就完成了,并且在移动端浏览器中访问也有不错的样式。

OK,下一篇做一下首页的页面布局。

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

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

相关文章

PyQt-QtWidgets-QFileDialog

文章目录 1.打开文件对话框2.保存文件对话框3.选择文件夹对话框4.多文件选择5.设置过滤器和默认目录 1.打开文件对话框 QFileDialog.getOpenFileName 方法的输出结果是一个元组&#xff0c;包含两个元素&#xff1a; 第一个元素是用户选择的文件的路径&#xff08;如果用户取消…

flask_restful规范返回值之参数设置

设置重命名属性和默认值 使用 attribute 配置这种映射 , 比如&#xff1a; fields.String(attributeusername) 使用 default 指定默认值&#xff0c;比如&#xff1a; fields.String(defaultsxt) from flask import Flask,render_template from flask_restful import A…

selenium自动化测试-unittest框架

unittest框架的优点 (1)能够组织多个用例去执行 (2)提供丰富的断言方法 (3)能够生成测试报告 unittest框架的核心要素 1. TestCase测试用例 TestCase(测试用例)&#xff0c;最小的测试单元&#xff0c;创建的测试类需要继承该基类 步骤&#xff1a; &#xff08;1&#x…

风丘EV能量流测试解决方案 提高电动汽车续航能力

电动汽车&#xff08;EV&#xff09;近些年发展迅猛&#xff0c;已被汽车业内普遍认为是未来汽车发展的新方向&#xff0c;但现如今电动汽车仍然存在一些短板&#xff0c;导致其还无法替代传统燃油车。对此&#xff0c;首先想到的肯定就是电动车的续航问题。其实解决电动车续航…

VBA技术资料MF133:隐藏编辑栏及计算字符串

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

centos7 使用docker安装了mongo 怎么设置远程链接,必须使用密码才能连接

docker run -d –name mongodb_container -e MONGO_INITDB_ROOT_USERNAMEroot -e MONGO_INITDB_ROOT_PASSWORDroot -e MONGO_INITDB_DATABASEdataserver -p 27017:27017 \ 无法在mongo容器里编辑文件 如果你无法直接编辑 MongoDB 容器内的配置文件&#xff0c;你可以尝试…

基于java+springboot+vue实现的大学生二手物品交易商城(文末源码+Lw+ppt)23-329

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这…

Java:包装类简单认识泛型

一、包装类 包装类指的是基本数据类型&#xff08;如int、double等&#xff09;对应的类类型&#xff0c;我们可以通过包装类直接调用里面的方法&#xff01; 基本数据类型 包装类 byte Byte short …

Java 小题 1

Java 小题 1 单选题 以下关于构造方法的描述错误的是 。 A. 构造方法的返回类型只能是void型。 B. 构造方法是类的一种特殊方法&#xff0c;它的方法名必须与类名相同。 C. 构造方法的主要作用是完成对类的对象的初始化工作。 D. 一个类可以定义多个构造方法。 正确答案…

09 网络ARP请求,响应,ICMP协议

arp协议_arp请求_arp回应 ICMP包构造ping搜狐服务器参考 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <string.h> #includ…

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色&#xff1a;管理员、患者、医生 基于springboot vue实现的医院管理系统&#xff0c;有管理员、医生和患者三种角色。系统拥有丰富的功能&#xff0c;能够满足各类用户的需求&#xff0c;系统提供了登录和注册…

Leetcode_27移除元素_26删除有序数组中的重复项_80删除有序数组中的重复项 II_169多数元素

文章目录 一、移除元素1.1 题目描述1.2 思路 二、删除有序数组中的重复项三、删除有序数组中的重复项 II四、多数元素 一、移除元素 1.1 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 …

PVE如何在CT中挂载目录

pct set 100 -mp1 /pveDir,mp/ctDir "pct set" pve命令 "100" ct编号 "-mp1" 挂载点1&#xff08;-mp2挂载点2&#xff09; "/pveDir" pve上的路径 "/ctDir" ct上的路径 若出现无权限写数据&#xff0c;参考下面的博客&…

2024年华为OD机试真题-文件缓存系统-Java-OD统一考试(C卷)

题目描述: 请设计一个文件缓存系统,该文件缓存系统可以指定缓存的最大值(单位为字节)。 文件缓存系统有两种操作:存储文件(put)和读取文件(get) 操作命令为put fileName fileSize或者get fileName 存储文件是把文件放入文件缓存系统中;读取文件是从文件缓存系统中访问已存…

ARM IHI0069F GIC architecture specification (1)

CH1.1 关于通用中断控制器 (GIC) GICv3 架构设计用于与 Armv8-A 和 Armv8-R 兼容的处理元件、PE 一起运行。 通用中断控制器 (GIC) 架构定义&#xff1a; • 处理连接到GIC 的任何PE 的所有中断源的架构要求。 • 适用于单处理器或多处理器系统的通用中断控制器编程接口。 GIC …

Day20 代码随想录(1刷) 二叉树

目录 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数…

最长公共子序列、LCS算法模型

LCS问题就是给定两个序列A和B&#xff0c;求他们最长的公共子序列。 在求解时&#xff0c;我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中&#xff08;不规定结尾&#xff09;的最长子序列的长度。 if(a[i]b[i]) dp[i][j]dp[i-1][j-1]1; else dp[i][j]max(dp[i-1][j],dp…

局部静态变量实现单例模式,线程安全(推荐使用)c++11

class Singleton{ public:~Singleton();static Singleton& getInstance(){static Singleton instance;return instance; } private:Singleton(); };原因是C 11标准中新增了一个特性叫Magic Static&#xff1a;如果变量在初始化时&#xff0c;并发线程同时进入到static声明语…

白话模电:4.耦合、差分、无源滤波、反馈(考研面试常问问题)

一、介绍一下三极管多级放大电路的三种耦合方式及其特点&#xff1f;耦合的目的是什么&#xff1f; 多级放大电路中各放大级之间的连接方式称为耦合方式。常见的耦合方式有三种&#xff1a;阻容耦合&#xff08;RC耦合&#xff09;、直接耦合和变压器耦合。 耦合的目的是将信号…

Dubbo的服务降级

Dubbo的服务降级是一种容错机制&#xff0c;用于在分布式系统中处理在异常或故障情况下保障系统的可用性和稳定性。服务降级的核心思想是当调用远程服务失败或超时时&#xff0c;不会让整个业务流程崩溃&#xff0c;而是通过提供备用方案来保持部分功能的正常运行。 在Dubbo中&…