硅谷甄選4(項目主體)

1.路由配置

1.1路由組件的雛形

src\views\home\index.vue(以home組件為例)

安裝插件:?

1.2路由配置

1.2.1路由index文件

src\router\index.ts

?//通過vue-router插件實現模板路由配置
import { createRouter, createWebHashHistory } from 'vue-router'
import { constantRoute } from './router'
//創建路由器
const router = createRouter({
? //路由模式hash
? history: createWebHashHistory(),
? routes: constantRoute,
? //滾動行為
? scrollBehavior() {
? ? return {
? ? ? left: 0,
? ? ? top: 0,
? ? }
? },
})
export default router

1.2.2路由配置

src\router\router.ts

//對外暴露配置路由(常量路由)
export const constantRoute = [
? {
? ? //登錄路由
? ? path: '/login',
? ? component: () => import('@/views/login/index.vue'),
? ? name: 'login', //命名路由
? },
? {
? ? //登錄成功以后展示數據的路由
? ? path: '/',
? ? component: () => import('@/views/home/index.vue'),
? ? name: 'layout',
? },
? {
? ? path: '/404',
? ? component: () => import('@/views/404/index.vue'),
? ? name: '404',
? },
? {
? ? //重定向
? ? path: '/:pathMatch(.*)*',
? ? redirect: '/404',
? ? name: 'Any',
? },
]

?

1.3路由出口

src\App.vue

?

2.登錄模塊

2.1 登錄路由靜態組件(布局)

src\views\login\index.vue

<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"><h1>Hello</h1><h2>歡迎來到硅谷甄選</h2><el-form-item><el-input:prefix-icon="User"v-model="loginForm.username"></el-input></el-form-item><el-form-item><el-inputtype="password":prefix-icon="Lock"v-model="loginForm.password"show-password></el-input></el-form-item><el-form-item><el-button class="login_btn" type="primary" size="default">登錄</el-button></el-form-item></el-form></el-col></el-row></div>
</template><script setup lang="ts">import { User, Lock } from '@element-plus/icons-vue'import { reactive } from 'vue'//收集賬號與密碼數據let loginForm = reactive({ username: 'admin', password: '111111' })
</script><style lang="scss" scoped>.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 {color: white;font-size: 20px;margin: 20px 0px;}.login_btn {width: 100%;}}}
</style>

注意:

  • el-col是24份的,在此左右分為了12份。我們在右邊放置我們的結構。
  • :xs="0"是為了響應式。
  • el-form下的element-plus元素都用el-form-item包裹起來。?
  • 通過?row?(行)和?col?(列)組件,并通過 col 組件的?span?屬性我們就可以自由地組合布局。
  • row?行提供?gutter?屬性來指定列之間的間距,其默認值為0。
  • 通過制定 col 組件的?offset?屬性可以指定分欄偏移的欄數。
  • 參照了 Bootstrap 的 響應式設計,預設了五個響應尺寸:xs、sm、md、lg 和 xl。

2.2 登陸業務實現

2.2.1 登錄按鈕綁定回調

?

回調應該做的事情?

const login = ?() => {
? //點擊登錄按鈕以后干什么
? //通知倉庫發起請求
? //請求成功->路由跳轉
? //請求失敗->彈出登陸失敗信息
}?

2.2.2 倉庫store初始化
  1. 大倉庫(筆記只寫一次)

安裝pinia:pnpm i pinia@2.0.34

src\store\index.ts

//創建用戶相關的小倉庫
import { defineStore } from 'pinia'
//創建用戶小倉庫
const useUserStore = defineStore('User', {
? //小倉庫存儲數據地方
? state: () => {},
? //處理異步|邏輯地方
? actions: {},
? getters: {},
})
//對外暴露小倉庫
export default useUserStore

?

2.2.3 按鈕回調

//登錄按鈕的回調
const login = async () => {
? //按鈕加載效果
? loading.value = true
? //點擊登錄按鈕以后干什么
? //通知倉庫發起請求
? //請求成功->路由跳轉
? //請求失敗->彈出登陸失敗信息
? try {
? ? //也可以書寫.then語法
? ? await useStore.userLogin(loginForm)
? ? //編程式導航跳轉到展示數據的首頁
? ? $router.push('/')
? ? //登錄成功的提示信息
? ? ElNotification({
? ? ? type: 'success',
? ? ? message: '登錄成功!',
? ? })
? ? //登錄成功,加載效果也消失
? ? loading.value = false
? } catch (error) {
? ? //登陸失敗加載效果消失
? ? loading.value = false
? ? //登錄失敗的提示信息
? ? ElNotification({
? ? ? type: 'error',
? ? ? message: (error as Error).message,
? ? })
? }
}

2.2.4 用戶倉庫?

//創建用戶相關的小倉庫
import {defineStore} from "pinia";
// 引入接口
import {reqLogin} from "../../api/user";
//引入數據類型
import type {loginForm} from '@/api/user/type'
//創建用戶小倉庫
const useUserStore = defineStore('User', {
小倉庫存儲數據地方
state: () => {
return {
token: localStorage.getItem('TOKEN')//用戶的唯一標識
}
},
//處理異步|邏輯地方
actions: {
async userLogin(data: loginForm) {
//登陸的請求
async
userLogin(data
:
loginForm
)
{
//登陸的請求
const result: any = await reqLogin(data)
if (result.code == 200) {
this.token = result.data.token
localStorage.setItem('TOKEN', result.data.token)
return 'ok'
} else {
return Promise.reject(new Error(result.data.message))
}

}
}
},
getters: {},
})
export default useUserStore

?2.2.5 小結
  1. Element-plus中ElNotification用法(彈窗):

引入:import { ElNotification } from 'element-plus'

使用:

//登錄失敗的提示信息
? ? ElNotification({
? ? ? type: 'error',
? ? ? message: (error as Error).message,
? ? })

  1. Element-plus中el-buttonloading屬性。
  2. pinia使用actions、state的方式和vuex不同:需要引入函數創建實例
  3. $router的使用:也需要引入函數創建實例
  4. 在actions中使用state的token數據:this.token
  5. 類型定義需要注意。
  6. promise的使用和vue2現在看來是一樣的

?2.3模板封裝登陸業務

2.3.1 result返回類型封裝

?src\api\user\type.ts

interface dataType {
? token?: string
? message?: string
}

//登錄接口返回的數據類型
export interface loginResponseData {
? code: number
? data: dataType
}

2.3.2 State倉庫類型封裝?

src\store\modules\types\type.ts

?//定義小倉庫數據state類型
export interface UserState {
? token: string | null
}

2.3.3 本地存儲封裝

將本地存儲的方法封裝到一起

?src\utils\token.ts

//封裝本地存儲存儲數據與讀取數據方法
export const SET_TOKEN = (token: string) => {
? localStorage.setItem('TOKEN', token)
}

export const GET_TOKEN = () => {
? return localStorage.getItem('TOKEN')
}
?

2.4 登錄時間的判斷

  1. 封裝函數

?src\utils\time.ts

//封裝函數:獲取當前時間段
export const getTime = () => {
? let message = ''
? //通過內置構造函數Date
? const hour = new Date().getHours()
? if (hour <= 9) {
? ? message = '早上'
? } else if (hour <= 14) {
? ? message = '上午'
? } else if (hour <= 18) {
? ? message = '下午'
? } else {
? ? message = '晚上'
? }
? return message
}
?

2.5 表單校驗規則

2.5.1 表單校驗
  1. 表單綁定項

?

  1. 表單元素綁定項

Form 組件提供了表單驗證的功能,只需為 rules 屬性傳入約定的驗證規則,并將 form-Item 的 prop 屬性設置為需要驗證的特殊鍵值即可

?

  1. 使用規則rules

?
//定義表單校驗需要的配置對象
const rules = {
? username: [
? ? //規則對象屬性:
? ? {
? ? ? required: true, // required,代表這個字段務必要校驗的
? ? ? min: 5, //min:文本長度至少多少位
? ? ? max: 10, // max:文本長度最多多少位
? ? ? message: '長度應為6-10位', // message:錯誤的提示信息
? ? ? trigger: 'change', //trigger:觸發校驗表單的時機 change->文本發生變化觸發校驗, blur:失去焦點的時候觸發校驗規則
? ? },?
? ??
? ],
? password: [
? ?{
? ? ? required: true,
? ? ? min: 6,
? ? ? max: 10,
? ? ? message: '長度應為6-15位',
? ? ? trigger: 'change',
? ? },?
? ],
}

  1. 校驗規則通過后運行

?const login = async () => {
? //保證全部表單項校驗通過
? await loginForms.value.validate()
?? ?。。。。。。
}

2.5.2自定義表單校驗
  1. 修改使用規則rules

使用自己編寫的函數作為規則校驗。

//定義表單校驗需要的配置對象
const rules = {
? username: [
? ? //規則對象屬性:
? ? /* {
? ? ? required: true, // required,代表這個字段務必要校驗的
? ? ? min: 5, //min:文本長度至少多少位
? ? ? max: 10, // max:文本長度最多多少位
? ? ? message: '長度應為6-10位', // message:錯誤的提示信息
? ? ? trigger: 'change', //trigger:觸發校驗表單的時機 change->文本發生變化觸發校驗, blur:失去焦點的時候觸發校驗規則
? ? }, */
? ? { trigger: 'change', validator: validatorUserName },
? ],
? password: [
? ? { trigger: 'change', validator: validatorPassword },
? ],
}

  1. 自定義校驗規則函數

//自定義校驗規則函數
const validatorUserName = (rule: any, value: any, callback: any) => {
? //rule:校驗規則對象
? //value:表單元素文本內容
? //callback:符合條件,callback放行通過,不符合:注入錯誤提示信息
? if (value.length >= 5) {
? ? callback()
? } else {
? ? callback(new Error('賬號長度至少5位'))
? }
}

const validatorPassword = (rule: any, value: any, callback: any) => {
? if (value.length >= 6) {
? ? callback()
? } else {
? ? callback(new Error('密碼長度至少6位'))
? }
}

3. Layout模塊(主界面)

3.1 組件的靜態頁面

3.1.1 組件的靜態頁面

注意:我們將主界面單獨放一個文件夾(頂替原來的home路由組件)。注意修改一下路由配置

?src\layout\index.vue

<template>
? <div class="layout_container">
? ? <!-- 左側菜單 -->
? ? <div class="layout_slider"></div>
? ? <!-- 頂部導航 -->
? ? <div class="layout_tabbar"></div>
? ? <!-- 內容展示區域 -->
? ? <div class="layout_main">
? ? ? <p style="height: 1000000px"></p>
? ? </div>
? </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
.layout_container {
? width: 100%;
? height: 100vh;
? .layout_slider {
? ? width: $base-menu-width;
? ? height: 100vh;
? ? background: $base-menu-background;
? }
? .layout_tabbar {
? ? position: fixed;
? ? width: calc(100% - $base-menu-width);
? ? height: $base-tabbar-height;
? ? background: cyan;
? ? top: 0;
? ? left: $base-menu-width;
? }
? .layout_main {
? ? position: absolute;
? ? width: calc(100% - $base-menu-width);
? ? height: calc(100vh - $base-tabbar-height);
? ? background-color: yellowgreen;
? ? left: $base-menu-width;
? ? top: $base-tabbar-height;
? ? padding: 20px;
? ? overflow: auto;
? }
}
</style>
?

?

3.1.2定義部分全局變量&滾動條

scss全局變量

src\styles\variable.scss?

//左側菜單寬度
$base-menu-width :260px;
//左側菜單背景顏色
$base-menu-background: #001529;

//頂部導航的高度
$base-tabbar-height:50px;

?

滾動條?

src\styles\index.scss

//滾動條外觀設置

::-webkit-scrollbar{
? width: 10px;
}

::-webkit-scrollbar-track{
? background: $base-menu-background;
}

::-webkit-scrollbar-thumb{
? width: 10px;
? background-color: yellowgreen;
? border-radius: 10px;
}

?3.2 Logo子組件的搭建

頁面左上角的這部分,我們將它做成子組件,并且封裝方便維護以及修改。

3.2.1 Logo子組件

在這里我們引用了封裝好的setting

src\layout\logo\index.vue

<template>
? <div class="logo" v-if="setting.logoHidden">
? ? <img :src="setting.logo" alt="" />
? ? <p>{{ setting.title }}</p>
? </div>
</template>

<script setup lang="ts">
? //引入設置標題與logo配置文件
? import setting from '@/setting'
</script>

<style lang="scss" scoped>
? .logo {
? ? width: 100%;
? ? height: $base-menu-logo-height;
? ? color: white;
? ? display: flex;
? ? align-items: center;
? ? padding: 20px;
? ? img {
? ? ? width: 40px;
? ? ? height: 40px;
? ? }
? ? p {
? ? ? font-size: $base-logo-title-fontSize;
? ? ? margin-left: 10px;
? ? }
? }
</style>
?

3.2.2 封裝setting

為了方便我們以后對logo以及標題的修改。

?//用于項目logo|標題配置
export default {
? title: '硅谷甄選運營平臺', //項目的標題
? logo: '/public/logo.png', //項目logo設置
? logoHidden: true, //logo組件是否隱藏
}

3.2.3 使用

在layout組件中引入并使用

?

3.3 左側菜單組件

3.3.1靜態頁面(未封裝)

主要使用到了element-plus的menu組件。附帶使用了滾動組件

src\layout\index.vue

?<!-- 左側菜單 -->
<div class="layout_slider">
? <Logo></Logo>
? <!-- 展示菜單 -->
? <!-- 滾動組件 -->
? <el-scrollbar class="scrollbar">
? ? <!-- 菜單組件 -->
? ? <el-menu background-color="#001529" text-color="white">
? ? ? <el-menu-item index="1">首頁</el-menu-item>
? ? ? <el-menu-item index="2">數據大屏</el-menu-item>
? ? ? <!-- 折疊菜單 -->
? ? ? <el-sub-menu index="3">
? ? ? ? <template #title>
? ? ? ? ? <span>權限管理</span>
? ? ? ? </template>
? ? ? ? <el-menu-item index="3-1">用戶管理</el-menu-item>
? ? ? ? <el-menu-item index="3-2">角色管理</el-menu-item>
? ? ? ? <el-menu-item index="3-3">菜單管理</el-menu-item>
? ? ? </el-sub-menu>
? ? </el-menu>
? </el-scrollbar>
</div>

3.3.2 遞歸組件生成動態菜單

在這一部分,我們要根據路由生成左側的菜單欄??

?

  1. 動態菜單子組件:src\layout\menu\index.vue
  2. 根據路由生成左側的菜單欄
  3. 處理路由--->因為我們要根據路由以及其子路由作為我們菜單的一級|二級標題。因此我們要獲取路由信息。

? ? ? ? ? ?給路由中加入了路由元信息meta:它包含了2個屬性:title以及hidden?

? ? 4.倉庫引入路由并對路由信息類型聲明(vue-router有對應函數)

? ?5. 父組件拿到倉庫路由信息并傳遞給子組件

? ?6.子組件prps接收并且處理結構

注意:

1:因為每一個項我們要判斷倆次(是否要隱藏,以及子組件個數),所以在el-menu-item外面又套了一層模板

2:當子路由個數大于等于一個時,并且或許子路由還有后代路由時。這里我們使用了遞歸組件。遞歸組件需要命名(另外使用一個script標簽,vue2格式)。

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

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

相關文章

B站學習Java路線

Java 基礎 【零基礎 快速學Java】韓順平 零基礎30天學會Java JVM 尚硅谷宋紅康JVM全套教程&#xff08;詳解java虛擬機&#xff09; Java 并發 JUC

react-router實現路由攔截,useLocation,useNavigate鉤子

路由攔截 react-router中沒有直接給出攔截路由的方法&#xff0c;需要手動的去監聽路由的變化來攔截路由 路由攔截的要點&#xff1a; 能夠識別出目標路由和原始路由&#xff08;區分跳轉前和跳轉后&#xff09;能夠在跳轉時&#xff08;跳轉前或者跳轉后&#xff09;執行一些…

Python redis獲取的結果是字節不是字符串

Python redis獲取的結果是字節不是字符串 pool redis.ConnectionPool(hostlocalhost,port6379, passwordREDIS_PWD, decode_responsesTrue)需要指明給結果解碼decode_responsesTrue才能返回字符串

圖論基礎概念(詳細講解)

今天&#xff0c;我們講解一下圖論的概念&#xff0c;首先我們知道圖是一個什么東西。 圖你可以理解成一個網絡系統&#xff0c;兩個節點之間可能會有邊&#xff0c;邊鏈接兩個節點&#xff0c;可能是有向&#xff08;就比如說a只能往b,或者b只能往c)&#xff0c;可能是無向&a…

Vulnhub靶場 | DC系列 - DC1

https://www.vulnhub.com/series/dc,199/ 環境搭建 靶機鏡像下載地址&#xff1a;https://www.vulnhub.com/entry/dc-1,292/&#xff1b;需要將靶機和 kali 攻擊機放在同一個局域網里&#xff1b;本實驗kali 的 IP 地址&#xff1a;192.168.10.146。 滲透測試 1. 信息收集 …

CH16-DOM元素增刪改

CH16-DOM元素增刪改 本章目標 掌握如何使用DOM獲取節點時使用的屬性熟練使用DOM節點進行創建、添加、刪除、替換 一、使用DOM獲取節點時使用的屬性 1.1 首尾子節點 firstChild&#xff1a;獲取當前節點的首個子節點&#xff0c;注意&#xff1a;換行符、空格等也是節點。 …

【逆向】-異或-分組異或2

IDA查看源代碼 src長度32&#xff0c;encrypt函數加密&#xff0c;工4個參數&#xff0c;_FFFC雙擊&#xff0c;可以看到是個長度為7的固定值FnTest! 加密函數將4個參數又重新命名&#xff0c;混淆視聽&#xff0c;但是還是可以看到是嵌套循環&#xff0c;動態調試直接看結果可…

ArcGIS Pro SDK (八)地理數據庫 8 拓撲

ArcGIS Pro SDK &#xff08;八&#xff09;地理數據庫 8 拓撲 文章目錄 ArcGIS Pro SDK &#xff08;八&#xff09;地理數據庫 8 拓撲1 開放拓撲和進程定義2 獲取拓撲規則3 驗證拓撲4 獲取拓撲錯誤5 標記和不標記為錯誤6 探索拓撲圖7 找到最近的元素 環境&#xff1a;Visual …

C++11中重要的新特性之 lambda表達式 Part two

序言 在上一篇文章中&#xff0c;我們主要介紹了 C11 中的新增的關鍵詞&#xff0c;以及 范圍for循環 這類語法糖的使用和背后的邏輯。在這篇文章中我們會繼續介紹一個特別重要的新特性分別是 lambda表達式 。 1. lambda表達式 1.1 lambda的定義 C11 中的 lambda表達式 是一種…

昇思25天學習打卡營第19天 | ResNet50遷移學習再續

訓練模型部分代碼解析 構建Resnet50網絡 兩行初始化代碼 weight_init Normal(mean0, sigma0.02)這行代碼定義了一個初始化器weight_init&#xff0c;它將使用均值為0&#xff0c;標準差為0.02的正態分布來初始化網絡中的權重。這種初始化策略有助于在網絡的初始階段避免梯度…

Java基礎之集合

集合和數組的類比 數組: 長度固定可以存基本數據類型和引用數據類型 集合: 長度可變只能存引用數據類型存儲基本數據類型要把他轉化為對應的包裝類 ArrayList集合 ArrayList成員方法 添加元素 刪除元素 索引刪除 查詢 遍歷數組

day30【LeetCode力扣】18.四數之和

day30【LeetCode力扣】18.四數之和 1.題目描述 給你一個由 n 個整數組成的數組 nums &#xff0c;和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若兩個四元組元素一一對應&#xff0c;則認為兩個…

Linux: Mysql環境安裝

Mysql環境安裝&#xff08;Centos&#xff09; 前言一、卸載多余環境1.1 卸載mariadb1.2 查看并卸載系統mysql和mariadb安裝包 二、換取mysql官方yum源三、安裝并啟動mysql服務3.1 yum源加載3.2 安裝yum源3.3 安裝mysql服務3.3.1 安裝指令3.3.2 GPG密鑰問題解決方法3.3.3 查看是…

循環結構(一)——for語句【互三互三】

文章目錄 &#x1f341; 引言 &#x1f341; 一、語句格式 &#x1f341; 二、語句執行過程 &#x1f341; 三、語句格式舉例 &#x1f341;四、例題 &#x1f449;【例1】 &#x1f680;示例代碼: &#x1f449;【例2】 【方法1】 &#x1f680;示例代碼: 【方法2】…

【C++ 編程】引用 - 給變量起別名、淺復制

基本語法&#xff1a;數據類型 &別名 原名int a 10; int &b a;引用必須初始化 (? int &b;)&#xff0c;初始化后不可改變 (int c 5; b c&#xff1a;b 沒有變成c的別名&#xff0c;而是 a、b 對應的值變更為了 c 的值)本質是指針常量, 淺復制 【黑馬程序員匠…

Cartographer重入門到精通(二):運行作者demo及自己的數據集

在demo數據包上運行cartographer 現在Cartographer和Cartographer的Ros包已經都安裝好了&#xff0c;你可以下載官方的數據集到指定的目錄&#xff08;比如在Deutsches Museum用背包采集的2D和3D 數據&#xff09;&#xff0c;然后使用roslauch來啟動demo。 注&#xff1a;la…

IO半虛擬化-Virtio學習筆記

參考&#xff1a;《深入淺出DPDK》及大佬們的各種博客 Virtio簡介&運行環境 Virtio 是一種用于虛擬化環境中的半虛擬化 I/O 框架&#xff0c;目的是在虛擬機和主機之間提供一種高效的 I/O 機制。關于什么是半虛擬化和全虛擬化&#xff1a;見SR-IOV學習筆記。 YES&#xf…

PDMS二次開發(二十二)——關于1.0.3.1版本升級內容的說明

目錄 1.更新內容介紹2.效果演示3.關于重構自動添加焊口功能的說明3.1錯誤示例 3.問題交流1.創建焊口提示失敗2.程序崩潰 1.更新內容介紹 在添加焊口之前先清除當前branch已有焊口&#xff1b;顯示清除焊口的個數和添加焊口的個數&#xff1b;重構了自動添加焊口功能&#xff0…

值得關注的數據資產入表

不錯的講解視頻&#xff0c;來自&#xff1a;第122期-杜海博士-《數據資源入表及數據資產化》-大數據百家講壇-廈門大學數據庫實驗室主辦第122期-杜海博士-《數據資源入表及數據資產化》-大數據百家講壇-廈門大學數據庫實驗室主辦-20240708_嗶哩嗶哩_bilibili

《A++ 敏捷開發》- 10 二八原則

團隊成員協作&#xff0c;利用項目數據&#xff0c;分析根本原因&#xff0c;制定糾正措施&#xff0c;并立馬嘗試&#xff0c;判斷是否有效&#xff0c;是改善的“基本功”。10-12章會探索里面的注意事項&#xff0c;13章會看兩家公司的實施情況和常見問題。 如果已經獲得高層…