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.pswp.cn/news/900739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900739.shtml
英文地址,請注明出處:http://en.pswp.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 及以上&…