41、web前端開發之Vue3保姆教程(五 實戰案例)

一、項目簡介和需求概述

1、項目目標

1.能夠基于Vue3創建項目

2.能夠基本Vue3相關的技術棧進行項目開發

3.能夠使用Vue的第三方組件進行項目開發

4.能夠理解前后端分離的開發模式

2、項目概述

使用Vue3結合ElementPlus,ECharts工具實現后臺管理系統頁面,包含登錄功能,主頁布局和導航條功能,客戶和保單管理功能,分頁展示功能,表單添加功能,報表生成功能等。使用axios調用遠程接口,使用Apifox模擬遠程接口,使用vuex存儲登錄信息。

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

3、使用的主要技術棧和工具

Vue3
TypeScript
ElementPlus
ECharts
Apifox

二、項目初始化

1、項目創建

使用vite或vue_cli創建項目

npm create vue@latest
或者
//npm install -g cnpm --registry=http://registry.npm.taobao.org 
npm install -g cnpm --registry=https://registry.npmmirror.com 
cnpm create vue@latest

2、配置Vue路由

import router from './route
const app = createApp(App);
app.use(router)

3、配置 axios 庫

安裝:

npm install --save vue-axios
或
npm install -g pnpm
pnpm install --save vue-axios

引入:

import axios from 'axios';

4、配置Element Plus

npm install -g pnpm

安裝 Element Plus:

pnpm install element-plus --save

安裝Element Plus圖標

pnpm install @element-plus/icons-vue

在 main.js 中引入 Element Plus

import { createApp } from 'vue';
import App from './App.vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');

在 main.js 中引入 Element Plus Icon

import * as ElementPlusIconsVue from '@element-plus/icons-vue'
//const app = createApp(App);for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}

也可以在使用時再導入

import { Delete, Edit, Search, Share, Upload } from '@element-plus/icons-vue'

在上述代碼中,我們首先導入 Element Plus,并使用 createApp 方法創建 Vue 應用程序實例。然后使用 app.use 方法注冊 Element Plus 插件,并使用 app.mount方法將應用程序掛載到 DOM 元素上。

在組件中使用 Element Plus 的組件,如下:

<template><el-button type="primary">按鈕</el-button>
</template>
<el-icon><delete /></el-icon>

5、初始化 git 遠程倉庫

多人合作時需要上傳項目到倉庫

6、將本地項目托管到GitHub或Gitee中

三、界面實現

1、登錄頁面

在這里插入圖片描述

1、創建Login.vue
1.1、添加表單:
<template>    <div class="login-container"><div class="login-card"><el-header></el-header><el-form class="login-form"><el-form-item label="用戶名:" label-width="90px"><el-input  class="input-item" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px"><el-input class="input-item" placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary">登錄</el-button></el-form-item></el-form></div></div>
</template><style scope>.login-card{width:400px}  .input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}</style>

在這里插入圖片描述

1.2、添加頭部
<template>    <div class="login-container"><div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form"><el-form-item label="用戶名:" label-width="90px"><el-input  class="input-item" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px"><el-input class="input-item" placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary">登錄</el-button></el-form-item></el-form></div></div>
</template><style scope>.login-card{width:400px}  .login-header{width: 100%;background-color: #607A9E;height: 60px;text-align: center;font-size: 24px;font-weight: bold;line-height: 60px;color: #fff;}.input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}</style>

在這里插入圖片描述

1.3、添加登錄窗口的邊框和陰影
<template>    <div class="login-container"><div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form"><el-form-item label="用戶名:" label-width="90px"><el-input  class="input-item" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px"><el-input class="input-item" placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary">登錄</el-button></el-form-item></el-form></div></div>
</template><style scope>.login-card{width:400px;border-radius: 5px;overflow: hidden;box-shadow: 0px 0px 10px rgba(0,0,0,0.3);}  .login-header{width: 100%;background-color: #607A9E;height: 60px;text-align: center;font-size: 24px;font-weight: bold;line-height: 60px;color: #fff;}.input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}</style>

在這里插入圖片描述

1.4、設置登錄窗口居于頁面的中間

設置login-container中的內容居中:

<template>    <div class="login-container"><div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form"><el-form-item label="用戶名:" label-width="90px"><el-input  class="input-item" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px"><el-input class="input-item" placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary">登錄</el-button></el-form-item></el-form></div></div>
</template><style scope>.login-container{width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;       }.login-card{width:400px;border-radius: 5px;overflow: hidden;box-shadow: 0px 0px 10px rgba(0,0,0,0.3);}  .login-header{width: 100%;background-color: #607A9E;height: 60px;text-align: center;font-size: 24px;font-weight: bold;line-height: 60px;color: #fff;}.input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}</style>
1.5、重新設置#app的布局

重新設置#app布局為左對齊 默認是網格布局

修改src/assets/main.css文件,在文件中添加

#app
{height: 100%;width: 100%;display: flex !important; align-items: flex-start !important; /* 將項目在交叉軸上靠上對齊 */ justify-content: flex-start !important; /* 將項目在主軸上靠左對齊 */ margin: 0px !important;padding: 0px!important;max-width: none !important;}

在這里插入圖片描述

1.6、添加表單功能

添加表單元素的響應式和表單的驗證功能

<template>    <div class="login-container"><div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form" :model="loginData" :rules="loginRules"><el-form-item label="用戶名:" label-width="90px" prop="username" ><el-input  class="input-item" v-model="loginData.username" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px" prop="password"><el-input class="input-item" v-model="loginData.password" show-password placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary">登錄</el-button></el-form-item></el-form></div></div>
</template><script setup>import {reactive} from "vue";const loginData=reactive({username:'',password:''
})const loginRules={username:[{required:true,message:"請輸入用戶名",trigger:"blur"}],password:[{required:true,message:"請輸入密碼",trigger:"blur"}],
}</script><style scope>.login-container{width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;       }.login-card{width:400px;border-radius: 5px;overflow: hidden;box-shadow: 0px 0px 10px rgba(0,0,0,0.3);}  .login-header{width: 100%;background-color: #607A9E;height: 60px;text-align: center;font-size: 24px;font-weight: bold;line-height: 60px;color: #fff;}.input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}</style>

在這里插入圖片描述

1.7、模擬提交功能
<template>    <div class="login-container"><div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form" :model="loginData" :rules="loginRules"><el-form-item label="用戶名:" label-width="90px" prop="username" ><el-input  class="input-item" v-model="loginData.username" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" label-width="90px" prop="password"><el-input class="input-item" v-model="loginData.password" show-password placeholder="請輸入密碼" ></el-input></el-form-item><el-form-item ><el-button class="login-button" type="primary" @click="login">登錄</el-button></el-form-item><div class="error-msg">{{loginData.errorMsg}}</div></el-form></div></div>
</template><script setup>import {reactive} from "vue";
import {useRouter} from "vue-router";const loginData=reactive({username:'',password:'',errorMsg:''
})const loginRules={username:[{required:true,message:"請輸入用戶名",trigger:"blur"}],password:[{required:true,message:"請輸入密碼",trigger:"blur"}],
}const router=useRouter();function login(){if(loginData.username=="admin" && loginData.password=="admin123")router.push("/index");elseloginData.errorMsg="用戶名或密碼出錯"  }</script><style scope>.login-container{width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;       }.login-card{width:400px;border-radius: 5px;overflow: hidden;box-shadow: 0px 0px 10px rgba(0,0,0,0.3);}  .login-header{width: 100%;background-color: #607A9E;height: 60px;text-align: center;font-size: 24px;font-weight: bold;line-height: 60px;color: #fff;}.input-item{width:240px  !important;}.login-form{padding: 20px;}.login-button{width:100%;background-color: #607A9E !important;}.error-msg{text-align: center;color:red;}
</style>

在這里插入圖片描述

1.8、完整代碼
<template><div class="login-container">
<div class="login-card"><el-header class="login-header">登錄</el-header><el-form class="login-form"   :model="loginData" :rules="loginRules" ><el-form-item label="用戶名:" prop="username" label-width="90px"><el-input class="input-item" v-model="loginData.username" placeholder="請輸入用戶名"></el-input></el-form-item><el-form-item label="密碼:" prop="password" label-width="90px"><el-input class="input-item" v-model="loginData.password" placeholder="請輸入密碼" show-password></el-input></el-form-item><el-form-item><el-button class="login-button"  type="primary" @click="login">登錄</el-button></el-form-item><div class="error-msg">{{loginData.errorMsg}}</div></el-form>
</div>
</div></template><script setup>import {reactive} from "vue"import {useRouter} from "vue-router"const loginData = reactive({username:'',password:'',errorMsg:''})const loginRules = {username:[{required:true,message:"請輸入用戶名",trigger:"blur"}],password:[{required:true,message:"請輸入密碼",trigger:"blur"}]
}   const router=useRouter();function login(){if(loginData.username=="admin" && loginData.password=="admin123")//loginData.errorMsg="success";router.push("/index")elseloginData.errorMsg="用戶名或密碼錯誤";             }</script>
<style>.login-container{width: 1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900830.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV--圖像平滑處理

在數字圖像處理領域&#xff0c;圖像平滑處理是一項極為重要的技術&#xff0c;廣泛應用于計算機視覺、醫學影像分析、安防監控等多個領域。在 OpenCV 這一強大的計算機視覺庫的助力下&#xff0c;我們能便捷地實現多種圖像平滑算法。本文將深入探討圖像平滑的原理&#xff0c;…

性能優化利器:前后端防抖方案解析

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 在Web開發中&#xff0c;高頻觸發的事件&#xff08;如用戶輸入、按鈕點擊、滾動監聽等&#xff09;可能導致性能問題或資源浪費。防抖&#xff08;Debounce&…

【ES系列】Elasticsearch簡介:為什么需要它?(基礎篇)

?? 本文將詳細介紹Elasticsearch的前世今生,以及為什么它在當今的技術棧中如此重要。本文是ES起飛之路系列的基礎篇第一章,適合想要了解ES的讀者。 文章目錄 一、什么是Elasticsearch?1. ES的定義2. ES的核心特性2.1 分布式存儲2.2 實時搜索2.3 高可用性2.4 RESTful API3.…

用 HTML 網頁來管理 Markdown 標題序號

文章目錄 工具介紹核心優勢使用指南基本使用方法注意事項 部分截圖完整代碼 工具介紹 在日常的文檔編寫和博客創作中&#xff0c;Markdown因其簡潔的語法和良好的可讀性而廣受歡迎。然而&#xff0c;當文檔結構復雜、標題層級較多時&#xff0c;手動維護標題序號不僅耗時耗力&…

批量將 Markdown 轉換為 Word/PDF 等其它格式

在工作當中&#xff0c;我們經常會接觸到 Markdown 格式的文檔。這是一種非常方便我們做記錄&#xff0c;做筆記的一種格式文檔。現在很多互聯網編輯器都是支持 Markdown 格式的&#xff0c;編輯起文章來更加的方便簡介。有時候&#xff0c;我們會碰到需要將 Markdown 格式的文…

劍指Offer(數據結構與算法面試題精講)C++版——day8

劍指Offer&#xff08;數據結構與算法面試題精講&#xff09;C版——day8 題目一&#xff1a;鏈表中環的入口節點題目二&#xff1a;兩個鏈表的第1個重合節點題目三&#xff1a;反轉鏈表附錄&#xff1a;源碼gitee倉庫 題目一&#xff1a;鏈表中環的入口節點 這道題的有如下三個…

【BFT帝國】20250409更新PBFT總結

2411 2411 2411 Zhang G R, Pan F, Mao Y H, et al. Reaching Consensus in the Byzantine Empire: A Comprehensive Review of BFT Consensus Algorithms[J]. ACM COMPUTING SURVEYS, 2024,56(5).出版時間: MAY 2024 索引時間&#xff08;可被引用&#xff09;: 240412 被引:…

前端用用jsonp的方式解決跨域問題

前端用用jsonp的方式解決跨域問題 前端用用jsonp的方式解決跨域問題 前端用用jsonp的方式解決跨域問題限制與缺點&#xff1a;前端后端測試使用示例 限制與缺點&#xff1a; 不安全、只能使用get方式、后臺需要相應jsonp方式的傳參 前端 function jsonp(obj) {// 動態生成唯…

MySQL詳解最新的官方備份方式Clone Plugin

一、Clone Plugin的動態安裝 install plugin clone soname mysql_clone.so;select plugin_name,plugin_status from information_schema.plugins where plugin_name clone; 二、Clone Plugin配置持久化 在 MySQL 配置文件my.cnf中添加以下內容&#xff0c;確保插件在 MySQL …

解決python manage.py shell ModuleNotFoundError: No module named xxx

報錯如下&#xff1a; python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…

鴻蒙NEXT開發資源工具類(ArkTs)

import { AppUtil } from ./AppUtil; import { StrUtil } from ./StrUtil; import { resourceManager } from kit.LocalizationKit;/*** 資源工具類。* 提供訪問應用資源的能力&#xff0c;包括布爾值、數字、字符串等資源的獲取。** author 鴻蒙布道師* since 2025/04/08*/ ex…

css使用mix-blend-mode的值difference實現內容和父節點反色

1. 使用場景 往往開發過程中&#xff0c;經常遇到產品說你這個背景圖和文字顏色太接近了&#xff0c;能不能適配下背景圖&#xff0c;讓用戶能夠看清具體內容是啥。 這么說吧&#xff0c;這種需求場景非常合理&#xff0c;因為你做開發就是要給用戶一個交代&#xff0c;給他們…

el-input 中 select 方法使用報錯:屬性“select”在類型“HTMLElement”上不存在

要解決該錯誤&#xff0c;需明確指定元素類型為 HTMLInputElement&#xff0c;因為 select() 方法屬于輸入元素。 步驟解釋&#xff1a; 類型斷言&#xff1a;使用 as HTMLInputElement 將元素類型斷言為輸入元素。 可選鏈操作符&#xff1a;保持 ?. 避免元素為 null 時出錯…

Mybatis Plus與SpringBoot的集成

Mybatis Plus與SpringBoot的集成 1.引入Maven 依賴2.配置application.yml文件3.創建實體類4.分頁插件5.邏輯刪除功能6.忽略特定字段7.自動填充 1.引入Maven 依賴 提前創建好一個SpringBoot項目&#xff0c;然后在項目中引入MyBatis Plus依賴 <dependency><groupId&g…

大數據學習(104)-clickhouse與hdfs

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

【簡歷全景認知2】電子化時代對簡歷形式的降維打擊:從A4紙到ATS的生存游戲

一、當簡歷遇上數字洪流:傳統形式的式微 在1990年代,一份排版精美的紙質簡歷還能讓HR眼前一亮;但今天,超過75%的 Fortune 500 企業使用ATS(Applicant Tracking System)進行初篩,未優化的簡歷可能在5秒內就會淪為數字廢土。這種變遷本質上符合「技術接納生命周期」理論—…

esp32cam -> 服務器 | 手機 -> 服務器 直接服務器傳輸圖片

服務器先下載python &#xff1a; 一、Python環境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一條一條執行 安裝基礎依賴 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…

SeaTunnel系列之:Apache SeaTunnel編譯和安裝

Apache SeaTunnel編譯 Prepare編譯克隆源代碼本地安裝子項目從源代碼構建 SeaTunnel構建子模塊安裝 JetBrains IDEA Scala 插件安裝 JetBrains IDEA Lombok 插件代碼風格運行簡單示例不僅如此 安裝下載 SeaTunnel 發布包下載連接器插件從源代碼構建 SeaTunnel 運行 SeaTunnel 在…

JavaScript/React中,...(三個連續的點)被稱為 擴展運算符(Spread Operator) 或 剩余運算符(Rest Operator)

const processOrder (order) > {const tax order.total * 0.1;const finalAmount order.total tax;return { ...order, tax, finalAmount }; }; 解釋一下&#xff0c;特別&#xff1a;...?在JavaScript/React中&#xff0c;...&#xff08;三個連續的點&#xff09;被稱…

FRP的proxies只是建立通道,相當于建立與服務器溝通的不同通道而不是直接將路由器與服務器云端溝通

沒有更好的辦法了嗎&#xff0c;我看frpc.toml的里面可以設置兩個proxies那我esp32的監聽端口設置在frpc.toml里面它不也能跟云服務器建立聯系嗎&#xff0c;比如遠程與本地端口都配置為5112那云服務器接收到的5112訪問會以frp配置的本地端口5112轉發到frp客戶端的路由器&#…