Vue3+Vite+TypeScript+Element Plus开发-08.登录设计

系列文档目录

Vue3+Vite+TypeScript安装

Element Plus安装与配置

主页设计与router配置

静态菜单设计

Pinia引入

Header响应式菜单缩展

Mockjs引用与Axios封装

登录设计

登录成功跳转主页

多用户动态加载菜单

 


文章目录

目录

系列文档目录

文章目录

前言

一、登录mock资料模拟

二、界面设计

三、路由定义

四、运行效果

五、登录验证与多用户资料模拟

后续


前言

本章节的核心内容包括:界面设计的优化、Mock.js 模拟用户登录 API 数据的生成,以及登录验证和多用户登录功能的实现。


一、登录mock资料模拟

1.在mockData下新建loginData.ts

// src/mock/mockData/loginData.ts
import Mock from 'mockjs';
import { Document, Setting } from '@element-plus/icons-vue'; // 假设你使用的是 Element Plus 的图标// 模拟登录数据
const loginData = Mock.mock({data: {"status_code": 200,"status": "success","message": "Operation successful.","data": {"api_key": "Test","username": "admin","token_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicTEyMzQ1NjdBYSIsInVzZXJuYW1lIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJleHAiOjE3NDQ2MTQ3MjR9.ZN1CwvBgSa7hSTjvAdduEiJjxlQpxqQp15tM7TEl4xc","role": "admin","email": "user@example.com"}
},
});export default loginData;

2.修改mock文件

新增login的api模拟应用

// src/mock/index.ts
import Mock from 'mockjs';
import menuData from '@/mock/mockData/menuData';
import loginData from '@/mock/mockData/loginData' ;Mock.mock(/menu/, 'get', (req: any) => {return menuData.data;
});Mock.mock(/login/, 'post', (req: any) => {return loginData.data;
});

二、界面设计

在src/views下新建文件login.vue

<template><div class="login-container"><el-card class="box-card"><template #header><span>登录</span></template><el-form :model="loginForm" :rules="rules" ref="loginFormRef" label-width="100px" class="demo-loginForm"><el-form-item label="用户名" prop="username"><el-input v-model="loginForm.username"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="loginForm.password" show-password></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm">登录</el-button><el-button @click="resetForm">重置</el-button></el-form-item></el-form></el-card></div></template><script lang="ts" setup>import { reactive, ref } from 'vue';import { ElForm, ElFormItem, ElInput, ElButton, ElCard, ElMessage } from 'element-plus';import type { FormInstance, FormRules } from 'element-plus';import { login } from '@/api/user';const loginForm = reactive({username: '',password: ''});const rules: FormRules = {username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],password: [{ required: true, message: '请输入密码', trigger: 'blur' }]};const loginFormRef = ref<FormInstance | null>(null);// 封装登录请求处理逻辑// 定义 API 返回的数据结构interface LoginResponse {status_code: number;status: string;message?: string;data?: {api_key: string;username: string;token_key: string;role: string;email: string;};}const fetchLoginData = async () => {try {const responseData: LoginResponse = await login(loginForm); // 假设 login 返回的是 LoginResponseif (responseData.status_code === 200 && responseData.status === 'success') {ElMessage.success('登录成功!');} else {ElMessage.error(`登录失败: ${responseData.message || '未知错误'}`);console.error('登录失败:', responseData);}} catch (error) {ElMessage.error('登录请求失败,请稍后再试');}
};const submitForm = () => {if (!loginFormRef.value) return;loginFormRef.value.validate((valid) => {if (valid) {fetchLoginData();} else {console.log('验证失败!');ElMessage.error('验证失败!');}});};const resetForm = () => {if (!loginFormRef.value) return;loginFormRef.value.resetFields();};</script><style scoped>.login-container {display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f2f5;}.box-card {width: 480px;}</style>

三、路由定义

1.修改路由文件(views\router\index.ts)

2.重点增加 RouteRecordRaw与增加login路由

3.完整代码

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Main from '@/views/Main.vue'; //
import Home from '@/views/Home.vue';
import UserInfo from '@/views/SysSettings/UserInfo.vue';
import AccountSetting from '@/views/SysSettings/AccountSetting.vue';
import Login from '@/views/login.vue';// 定义路由配置
const routes: RouteRecordRaw[] = [{path: '/',name: 'main',component: Main,children: [{path: 'home',name: 'home',component: Home,},{path: 'UserInfo',name: 'UserInfo',component: UserInfo,},{path: 'AccountSetting',name: 'AccountSetting',component: AccountSetting,},],},{path: '/login',name: 'login',component: Login,},
];// 创建路由器
const router = createRouter({history: createWebHistory(),routes, // 使用已定义的路由配置
});export default router;

四、运行效果

输入网址:http://localhost:5173/login,切记要加上/login

此时随便输入用户名与密码都可以正确登录,接下来模拟多用户与密码错误登录。

五、登录验证与多用户资料模拟

1、修改mockData登录模拟数据【src/mock/mockData/loginData.ts】

增加用户名与密码验证与多用户返回不同信息

// src/mock/mockData/loginData.ts
import Mock from 'mockjs';
import { Document, Setting } from '@element-plus/icons-vue'; // 假设你使用的是 Element Plus 的图标// 模拟登录数据
/*
const loginData = Mock.mock({data: {"status_code": 200,"status": "success","message": "Operation successful.","data": {"api_key": "Test","username": "admin","token_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicTEyMzQ1NjdBYSIsInVzZXJuYW1lIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJleHAiOjE3NDQ2MTQ3MjR9.ZN1CwvBgSa7hSTjvAdduEiJjxlQpxqQp15tM7TEl4xc","role": "admin","email": "user@example.com"}
},
});export default loginData;
*/// 动态生成登录数据
export default (data: any) => {// 解析传入的 data 参数const { username, password } = data;// 根据用户名和密码生成不同的响应if (username === 'admin' && password === 'admin') {return Mock.mock({status_code: 200,status: 'success',message: 'Operation successful.',data: {api_key: 'Test',username: 'admin',token_key: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicTEyMzQ1NjdBYSIsInVzZXJuYW1lIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJleHAiOjE3NDQ2MTQ3MjR9.ZN1CwvBgSa7hSTjvAdduEiJjxlQpxqQp15tM7TEl4xc',role: 'admin',email: 'admin@example.com',},});} else if (username === 'user' && password === 'password') {return Mock.mock({status_code: 200,status: 'success',message: 'Operation successful.',data: {api_key: 'TestUser',username: 'user',token_key: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicTEyMzQ1NjdBYSIsInVzZXJuYW1lIjoidXNlciIsInJvbGUiOiJ1c2VyIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiZXhwIjoxNzQ0NjE0NzI0fQ.ZN1CwvBgSa7hSTjvAdduEiJjxlQpxqQp15tM7TEl4xc',role: 'user',email: 'user@example.com',},});} else {return Mock.mock({status_code: 401,status: 'fail',message: 'Invalid username or password.',data: null,});}
};

2.修改mock api文件

增加了获取登录账号与密码信息传输

// src/mock/index.ts
import Mock from 'mockjs';
import menuData from '@/mock/mockData/menuData';
import loginData from '@/mock/mockData/loginData' ;Mock.mock(/menu/, 'get', (req: any) => {return menuData.data;
});/*
Mock.mock(/login/, 'post', (req: any) => {return loginData.data;
});
*/
Mock.mock(/\/login/, (options) => {const { body } = options;const data = JSON.parse(body); // 解析请求体中的数据return loginData(data); // 调用动态生成的登录数据函数
});

六、登录验证运行效果

输入网址:http://localhost:5173/login

输入错误密码

输入正确的密码:


后续

下一章节讲登录成功后跳转/main,菜单根据不同用户动态变化。

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

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

相关文章

全新二手罗德SMCV100B信号发生器SMBV100A

全新二手罗德SMCV100B信号发生器SMBV100A SMCV100B信号发生器SMBV100A主要特点 适用于广播电视、导航、蜂窝和无线应用的多标准平台 全软件选件定义的矢量信号发生器&#xff0c;具备 5″ 触摸屏 全新的射频信号生成概念&#xff0c;频率范围介于 4 kHz 至 7.125 GHz 输出功率…

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解&#xff0c;用于将方法返回的对象直接序列化为 HTTP 响应体&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通过视图解析器渲染为视图&#xff08;如 HTML&…

OpenCV——图像融合

OpenCV——图像融合 一、引言1.1 图像融合分类 二、C代码实现三、效果展示3.1 标准球3.2 铝制底座 一、引言 在许多计算机视觉应用中(例如机器人运动和医学成像)&#xff0c;需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量…

机器学习之PCA主成分分析详解

文章目录 引言一、PCA的概念二、PCA的基本数学原理2.1 内积与投影2.2 基2.3 基变换2.4 关键问题及优化目标2.5 方差2.6 协方差2.7 协方差矩阵2.8 协方差矩阵对角化 三、PCA执行步骤总结四、PCA参数解释五、代码实现六、PCA的优缺点七、总结 引言 在机器学习领域&#xff0c;我…

springboot自动配置原理例子讲解

Spring Boot 的自动配置是其核心特性之一&#xff0c;它帮助开发者**"开箱即用"**地使用各种第三方库或 Spring 组件&#xff0c;而无需手动配置 Bean。这一切的背后&#xff0c;都依赖于 Spring Boot 的自动配置机制。 我们分两部分来说&#xff1a; Spring Boot 自…

一款基于 .NET 8 + Vue 开源的、企业级中后台权限管理系统

前言 今天大姚给大家分享一款基于 .NET 8 Vue 开源、前后端分离的企业级中后台权限管理系统&#xff0c;助力快速完成常规业务需求开发&#xff1a;ApeVolo.Admin。 项目介绍 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分离、开源&#xff08;…

vue3腾讯云直播 前端推流

1、在index.html文件中引入&#xff08;在body体中&#xff09; <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中&#xff0c;添加video推流&#xff08;我用的推流地…

蓝叠模拟器过检测全攻略

BlueStacks蓝叠MagiskLsposed安装和过应用检测教程 蓝叠MagiskLsposed安装和过应用检测教程 引言 蓝叠模拟器凭借其出色的性能和兼容性&#xff0c;在电脑上运行安卓应用和游戏方面备受青睐。然而&#xff0c;众多应用和游戏为确保公平性与安全性&#xff0c;加入了模拟器检测…

Flutter Invalid constant value.

0x00 问题 参数传入变量&#xff0c;报错&#xff01; 代码 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 参数报错&#xff1a;Invalid constant value. 0x01 原因 这种情况&#xff0c;多发生于&#xff…

搜广推校招面经七十一

滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法&#xff0c;尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好&#xff0c;从而推荐他们可能喜欢的内容。 1.1. 直观理解&…

实习技能记录【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象&#xff0c;所有的可见 UI 元素最终都会添加到某个屏幕上&#xff08;通常是活动屏幕&#xff09;。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…

【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、列表初始化 1. 大括号初始化 2. initializer_list 二、右值引用和移动语义 1. 左值和右值 2. 左值引用和右值引用 引用延长生命周期 左…

软考中级-软件设计师 2022年下半年上午题真题解析:通关秘籍+避坑指南

&#x1f4da; 目录&#xff08;快速跳转&#xff09; 选择题&#xff08;上午题&#xff09;&#xff08;每题1分&#xff0c;共75分&#xff09;一、 计算机系统基础知识 &#x1f5a5;️&#x1f4bb; 题目1&#xff1a;计算机硬件基础知识 - RISC&#xff08;精简指令集计算…

基于MCP协议调用的大模型agent开发02

目录 在AI agent的开发过程中&#xff0c;如何使用mcp服务器作为大模型的工具调用‘百宝箱’&#xff1f; FastAPI FastMCP 本系列&#xff1a; 基于MCP协议调用的大模型agent开发01-CSDN博客 基于MCP协议调用的大模型agent开发02-CSDN博客 在AI agent的开发过程中&#xff0c;…

ES6(8) Fetch API 详解

1. Fetch API 简介 fetch 是 ES6 提供的基于 Promise 的 API&#xff0c;用于发送 HTTP 请求并处理服务器响应数据。与传统的 XMLHttpRequest 相比&#xff0c;fetch 语法更加简洁&#xff0c;使用 Promise 进行异步处理&#xff0c;避免了回调地狱。 1.1 fetch() 的基本用法 …

原生SSE实现AI智能问答+Vue3前端打字机流效果

实现流程&#xff1a; 1.用户点击按钮从右侧展开抽屉&#xff08;drawer&#xff09;&#xff0c;打开模拟对话框 2.用户输入问题&#xff0c;点击提问按钮&#xff0c;创建一个SSE实例请求后端数据&#xff0c;由于SSE是单向流&#xff0c;所以每提一个问题都需要先把之前的实…

CUDA 工具链将全面原生支持 Python

根据 NVIDIA 在 2025 年 GTC 大会上的官宣&#xff0c;CUDA 工具链将全面原生支持 Python 编程&#xff0c;这一重大更新旨在降低 GPU 编程门槛&#xff0c;吸引更广泛的 Python 开发者进入 CUDA 生态。以下是核心信息整合&#xff1a; 1. 原生支持的意义与背景 无需 C/C 基础…

jupyter notebook 显示conda虚拟环境

使用 nb_conda_kernels 安装 nb_conda_kernels&#xff1a;这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。

【AI】MCP概念

一文讲透 MCP&#xff08;附 Apifox MCP Server 内测邀请&#xff09; 7分钟讲清楚MCP是什么&#xff1f;统一Function calling规范&#xff0c;工作量锐减至1/6&#xff0c;人人手搓Manus&#xff01;&#xff1f; | 一键链接千台服务器&#xff0c;几行代码接入海量外部工具…

WSL1升级到WSL2注意事项

今天要在WSL上安装docker&#xff0c;因为机器上安装了wsl1&#xff0c;docker安装后启动不了&#xff0c;通过询问deepseek发现docker只能在wsl2上安装&#xff0c;因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10&#xff08;版本 1903 及以上&…