Vue3項目練習詳細步驟(第五部分:用戶模塊的功能)

頂部導航欄個人信息顯示

接口文檔

接口請求與綁定?

導航欄下拉菜單功能

路由實現

退出登錄和路由跳轉實現

基本資料修改

頁面結構

?接口文檔

?接口請求與綁定?

修改頭像

頁面結構?

頭像回顯

頭像上傳

?接口文檔

重置密碼

頁面結構

接口文檔

接口請求與綁定

?

頂部導航欄個人信息顯示

????????在Layout.vue中,頁面加載完就發送請求,獲取個人信息展示,并存儲到pinia中,因為將來在個人中心中修改信息的時候還需要使用 。

?接口文檔

接口請求與綁定?

在stores目錄下新建userInfo.js并定義Store用于將數據存儲到pinia中

import { defineStore } from "pinia"
import {ref} from 'vue'export const useUserInfoStore = defineStore('userInfo',()=>{//1.定義用戶信息const info = ref({})//2.定義修改用戶信息的方法const setInfo = (newInfo)=>{info.value = newInfo}//3.定義清空用戶信息的方法const removeInfo = ()=>{info.value={}}return{info,setInfo,removeInfo}
},{persist:true
})

在user.js中提供獲取個人信息的函數

//獲取個人信息
export const userInfoGetService = ()=>{return request.get('/user/userInfo');
}

?在Layout.vue中獲取個人信息,并存儲到pinia中

//導入接口函數
import {userInfoGetService} from '@/api/user.js'
//導入pinia
import {useUserInfoStore} from '@/stores/userInfo.js'
const userInfoStore = useUserInfoStore();
import {ref} from 'vue'//獲取個人信息
const getUserInf = async ()=>{let result = await userInfoGetService();if(result.code === 0){//成功//存儲piniauserInfoStore.info =result.data;}else{//失敗alert('獲取信息失敗')}
}getUserInf()

?Layout.vue的頂部導航欄中,綁定展示昵稱和頭像

<div>用戶:<strong>{{ userInfoStore.info.nickname ? userInfoStore.info.nickname : userInfoStore.info.usrename }}</strong></div><el-avatar :src="userInfoStore.info.userPic ? userInfoStore.info.userPic : avatar" />

保存后刷新頁面可以看到用戶名稱和頭像正常顯示?

?

導航欄下拉菜單功能

?在el-dropdown中有四個子條目

  • 基本資料
  • 更換頭像
  • 重置密碼
  • 退出登錄

其中其三個起到路由功能,跟左側菜單中【個人中心】下面的二級菜單是同樣的功能,退出登錄需要刪除本地pinia中存儲的token以及userInfo

路由實現

?在el-dropdown標簽上綁定command事件,當有條目被點擊后,會觸發這個事件

<el-dropdown placement="bottom-end" @command="handleCommand">

在el-dropdown-item標簽上添加command屬性,屬性值和路由表中/user/xxx保持一致

<el-dropdown-item command="info" :icon="User">基本資料</el-dropdown-item>
<el-dropdown-item command="avatar" :icon="Crop">更換頭像</el-dropdown-item>
<el-dropdown-item command="password" :icon="EditPen">重置密碼</el-dropdown-item>
<el-dropdown-item command="logout" :icon="SwitchButton">退出登錄</el-dropdown-item>

退出登錄和路由跳轉實現

定義并編寫handleCommand函數

import {useRouter} from 'vue-router'
const router = useRouter();
import {ElMessage,ElMessageBox} from 'element-plus'
import { useTokenStore } from '@/stores/token.js'
const tokenStore = useTokenStore()
const handleCommand = (command) => {if (command === 'logout') {//退出登錄ElMessageBox.confirm('是否退出登錄','提示',{confirmButtonText: '確認',cancelButtonText: '取消',type: 'warning',}).then(async () => {//用戶點擊了確認//清空pinia中的token和個人信息userInfoStore.info={}tokenStore.token=''//跳轉到登錄頁router.push('/login')ElMessage.success('成功退出登錄')}).catch(() => {//用戶點擊了取消ElMessage({type: 'info',message: '取消退出',})})} else {//路由router.push('/user/' + command)}
}

?保存后刷新既可以完成跳轉和退出登錄

?

基本資料修改

頁面結構

在UserInfo.vue文件中完成用戶資料修改的頁面結構組件

<script setup>
import { ref } from 'vue'
const userInfo = ref({id: 0,username: 'zhangsan',nickname: 'zs',email: 'zs@163.com',
})
const rules = {nickname: [{ required: true, message: '請輸入用戶昵稱', trigger: 'blur' },{pattern: /^\S{2,10}$/,message: '昵稱必須是2-10位的非空字符串',trigger: 'blur'}],email: [{ required: true, message: '請輸入用戶郵箱', trigger: 'blur' },{ type: 'email', message: '郵箱格式不正確', trigger: 'blur' }]
}
</script>
<template><el-card class="page-container"><template #header><div class="header"><span>基本資料</span></div></template><el-row><el-col :span="12"><el-form :model="userInfo" :rules="rules" label-width="100px" size="large"><el-form-item label="登錄名稱"><el-input v-model="userInfo.username" disabled></el-input></el-form-item><el-form-item label="用戶昵稱" prop="nickname"><el-input v-model="userInfo.nickname"></el-input></el-form-item><el-form-item label="用戶郵箱" prop="email"><el-input v-model="userInfo.email"></el-input></el-form-item><el-form-item><el-button type="primary">提交修改</el-button></el-form-item></el-form></el-col></el-row></el-card>
</template>

個人信息之前已經存儲到了pinia中,只需要從pinia中獲取個人信息,替換模板數據即可

import { ref } from 'vue'
//導入Store
import { useUserInfoStore } from '@/stores/userInfo.js';
const userInfoStore = useUserInfoStore()
//數據模型
const userInfo = ref({...userInfoStore.info}) //...用于展開可迭代對象 拆出其中的每個元素

?接口文檔

?

?接口請求與綁定?

?在src/api/user.js中提供修改基本資料的函數

//修改個人信息
export const userInfoUpdateService = (userInfo)=>{return request.put('/user/update',userInfo)
}

在UserInfo.vue文件中提供updateUserInfo請求函數

//修改用戶信息
import {userInfoUpdateService} from '@/api/user.js'
import { ElMessage } from 'element-plus';
const updateUserInfo = async ()=>{let result = await userInfoUpdateService(userInfo.value)ElMessage.success(result.message? result.message:'修改成功')//更新pinia中的數據userInfoStore.info.nickname=userInfo.value.nicknameuserInfoStore.info.email = userInfo.value.email
}

?給修改按鈕綁定單擊事件

<el-button type="primary" @click="updateUserInfo">提交修改</el-button>

?保存刷新后能正常完成用戶信息的數據回顯和更新

修改頭像

頁面結構?

在UserAvatar.vue文件中完成用戶資料修改的頁面結構組件

<script setup>
import { Plus, Upload } from '@element-plus/icons-vue'
import {ref} from 'vue'
import avatar from '@/assets/default.png'
const uploadRef = ref()//用戶頭像地址
const imgUrl= avatar</script><template><el-card class="page-container"><template #header><div class="header"><span>更換頭像</span></div></template><el-row><el-col :span="12"><el-upload ref="uploadRef"class="avatar-uploader" :show-file-list="false"><img v-if="imgUrl" :src="imgUrl" class="avatar" /><img v-else src="avatar" width="278" /></el-upload><br /><el-button type="primary" :icon="Plus" size="large"  @click="uploadRef.$el.querySelector('input').click()">選擇圖片</el-button><el-button type="success" :icon="Upload" size="large">上傳頭像</el-button></el-col></el-row></el-card>
</template><style lang="scss" scoped>
.avatar-uploader {:deep() {.avatar {width: 278px;height: 278px;display: block;}.el-upload {border: 1px dashed var(--el-border-color);border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;transition: var(--el-transition-duration-fast);}.el-upload:hover {border-color: var(--el-color-primary);}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 278px;height: 278px;text-align: center;}}
}
</style>

頭像回顯

?從pinia中讀取用戶的頭像數據

//讀取用戶信息
//導入Store
import {useUserInfoStore} from '@/stores/userInfo.js'
const userInfoStore = useUserInfoStore()
//用戶頭像地址
const imgUrl=ref(userInfoStore.info.userPic)

img標簽上綁定圖片地址(三元運輸符判斷)

<img v-if="imgUrl" :src="imgUrl" class="avatar" />
<img v-else :src="avatar" width="278" />

?保存刷新查看頭像回顯

?

頭像上傳

  • action: 服務器接口路徑
  • headers: 設置請求頭,需要攜帶token
  • on-success: 上傳成功的回調函數
  • name: 上傳圖片的字段名稱

?為el-upload指定屬性值

                <el-upload ref="uploadRef"class="avatar-uploader" :show-file-list="false":auto-upload="true"action="/api/upload"name="'file'":headers="{'Authorization':tokenStore.token}":on-success="uploadSuccess">

?提供上傳成功的回調函數

//導入tokenStore
import {useTokenStore} from '@/stores/token.js'const tokenStore = useTokenStore();
//頭像上傳成功回調函數
const uploadSuccess = (result)=>{//回顯圖片imgUrl.value = result.data
}

?接口文檔

?接口請求與綁定

在user.js中提供修改頭像的函數

//修改頭像
export const userAvatarUpdateService=(avatarUrl)=>{let params = new URLSearchParams();params.append('avatarUrl',avatarUrl)return request.patch('/user/updateAvatar',params)
}

在UserAvatar.vue文件中提供updateAvatar函數,完成頭像更新 ?

//調用接口,更新頭像url
import {userAvatarUpdateService} from '@/api/user.js'
//導入Element-Plus提示框組件
import {ElMessage} from 'element-plus'
const updateAvatar = async ()=>{let result = await userAvatarUpdateService(imgUrl.value)if(result.code === 0){//成功ElMessage.success(result.message? result.message:'修改成功')//更新pinia中的數據userInfoStore.info.userPic=imgUrl.value}else{ElMessage.error('修改失敗')}}

?在【上傳頭像】按鈕綁定單擊事件

<el-button type="success" :icon="Upload" size="large" @click="updateAvatar">
上傳頭像
</el-button>

如果是用的網絡存儲服務器那么到這一步修改頭像就完成了!

練習項目后端使用的是本地文件存儲,所以沒有用到網絡url,傳入本地文件地址后端會報如下錯誤

?

點擊上傳由于這里練習項目沒有網絡服務器 數據是上傳到本地的所以瀏覽器會攔截本地文件加載導致不能造成數據回顯,但是目錄下是有圖片成功上傳到的。

后續繼續完成項目建議修改src中的值為模擬的固定網絡圖片url地址:https://ts1.cn.mm.bing.net/th/id/R-C.4bdc8f7f0e0201905fe400fb5156b7c7?rik=MVFo1SU7cYgFqg&riu=http%3A%2F%2Fwww.spasvo.com%2Fckfinder%2Fuserfiles%2Fimages%2F2020061536450116.jpg&ehk=r7Pp%2FX3wIOhP%2FcuW0ITLAHeD0sZPNatsyfpC3XWOM0s%3D&risl=&pid=ImgRaw&r=0

??如果自己有網絡服務器可以使用網絡服務器的圖片url

?

重置密碼

頁面結構

在UserResetPassword.vue文件中完成重置密碼的頁面的結構組件?

<script setup>
import { ref } from 'vue'
const password = ref({
"old_pwd":"",
"new_pwd":"",
"re_pwd":""
})
const rules = {oldPassword: [{ required: true, message: '請輸入原密碼', trigger: 'blur' },{pattern: /^\S{5,12}$/,message: '密碼必須是5-12位的非空字符串',trigger: 'blur'}],newPassword: [{ required: true, message: '請輸入新密碼', trigger: 'blur' },{pattern: /^\S{5,12}$/,message: '密碼必須是5-12位的非空字符串',trigger: 'blur'}],rePassword: [{ required: true, message: '請輸入確認新密碼', trigger: 'blur' },{pattern: /^\S{5,12}$/,message: '密碼必須是5-12位的非空字符串',trigger: 'blur'}]}
</script>
<template><el-card class="page-container"><template #header><div class="header"><span>重置密碼</span></div></template><el-row><el-col :span="12"><el-form :model="password" :rules="rules" label-width="100px" size="large"><el-form-item label="原密碼" prop="oldPassword"><el-input type="password" placeholder="請輸入原密碼" show-password v-model="password.old_pwd"></el-input></el-form-item><el-form-item label="新密碼" prop="newPassword"><el-input type="password" placeholder="請輸入新密碼" show-password v-model="password.new_pwd"></el-input></el-form-item><el-form-item label="確認新密碼" prop="rePassword"><el-input type="password" placeholder="請輸入確認密碼" show-password v-model="password.re_pwd"></el-input></el-form-item><el-form-item><el-button type="primary">修改密碼</el-button><el-button type="primary">重置</el-button></el-form-item></el-form></el-col></el-row></el-card>
</template>

?定義清空數據模型的函數

在重置按鈕處綁定清空文本框數據的單擊事件

<el-button type="primary" @click="clearData()">重置</el-button>

接口文檔

接口請求與綁定

??在src/api/user.js中提供重置密碼的函數

//重置密碼
export const userPasswordUpdateService = (password) => {return request.patch('/user/updatePwd',password)
}

?在UserResetPassword.vue文件中提供userPasswordUpdate請求函數

//導入路由
import {useRouter} from 'vue-router'
const router = useRouter();
//導入element提示框組件
import { ElMessage,ElMessageBox } from 'element-plus';
//導入userPasswordUpdateService函數
import {userPasswordUpdateService} from '@/api/user.js'const userPasswordUpdate = async() => {ElMessageBox.confirm('確認是否重置密碼,重置之后將退出登錄','提示',{confirmButtonText: '確認',cancelButtonText: '取消',type: 'warning',}).then(async () => {//用戶點擊了確認let result = userPasswordUpdateService(password.value)if(result.code ===0){//成功//跳轉到登錄頁router.push('/login')ElMessage.success(result.message?result.message:'重置成功')ElMessage.success('退出登錄')}else{ElMessage.error('操作失敗')}}).catch(() => {//用戶點擊了取消ElMessage({type: 'info',message: '取消重置',})})
}

?在修改密碼按鈕處綁定該函數單擊事件

<el-button type="primary" @click="userPasswordUpdate()">修改密碼</el-button>

?保存后查看效果

項目練習完結

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

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

相關文章

自然語言處理學習路線

學習目標 NLP 系統知識&#xff08;從入門到入土&#xff09; 學習內容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本預處理&#xff08;標點符號處理、繁體轉簡體、分詞Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;詞袋模型&#xff08;TF…

【T+】暢捷通T+軟件固定資產模塊反啟用

【問題描述】 暢捷通T軟件&#xff0c;固定資產模塊反啟用。 【解決方法】 針對賬套庫執行如下腳本清除資產的所有數據&#xff0c; 執行前請與客戶確認資產的所有數據都不要了&#xff0c;確認后備份賬套再執行腳本&#xff0c;切記&#xff01;&#xff01;&#xff01; 然后…

Flutter 中的 ChipTheme 小部件:全面指南

Flutter 中的 ChipTheme 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它提供了一套豐富的組件集合&#xff0c;用于構建現代化的、響應式的移動和 Web 應用。ChipTheme 是 Flutter 中一個專門用于統一設置應用中所有 Chip 組件樣式的…

紅外熱成像觀驅一體儀,夜間驅鳥新利器

夜間驅鳥是機場鳥防工作的重點和難點&#xff0c;但紅外熱成像觀驅一體儀的出現解決了這個問題&#xff0c;它結合了紅外熱成像技術和激光驅鳥技術&#xff0c;極大地提升了夜間驅鳥工作的效率和安全性。 驅鳥技術詳解&#xff1a; 在夜晚低能見度的環境下&#xff0c;紅外熱成…

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試 ?本篇硬件電路和代碼來源于此開源項目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件電路和項目介紹&#xff0c;立創開源廣場&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

【bug】在 Windows 上安裝 SDKMAN! 的完整指南

在 Windows 系統上&#xff0c;安裝 SDKMAN! 可能會遇到一些小問題。本文將詳細介紹如何解決這些問題并成功安裝 SDKMAN!。 問題描述 當在 PowerShell 中運行以下命令以安裝 SDKMAN! 時&#xff1a; curl -s get.sdkman.io | bash你可能會遇到以下錯誤&#xff1a; bash : …

前端面試題日常練-day45 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪個類用于創建一個具有響應式的導航欄&#xff1f; a) .navbar-responsive b) .responsive-nav c) .navbar-collapse d) .collapse-navbar 2. 哪個Bootstrap類用…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判斷是thinkphp 3.2 參考官方手冊:https://www.kancloud.cn/manual/thinkphp/1697 判斷路由模式 URL_CASE_INSENSITIVE > true, // 默認false 表示URL區分大小寫 true則表示不區分大小寫URL_MODEL > 1, // URL訪問模式,可選參數0、1、…

Python使用動態代理的多元應用

Python作為一種功能強大且易于學習的編程語言&#xff0c;在網絡編程領域具有廣泛的應用。當Python與動態代理技術結合時&#xff0c;便開啟了一扇通往更多可能性的大門。以下將深入探討Python使用動態代理可以實現的多種應用。 首先&#xff0c;Python結合動態代理在網絡爬蟲…

中文多模態InternVL-Chat-V1-5,中文理解能力強勁,8 項指標超越商業模型,性能媲美 GPT-4V

前言 近年來&#xff0c;多模態大型語言模型&#xff08;MLLM&#xff09;的快速發展&#xff0c;為人工智能在圖像、文本等多模態信息理解和處理方面帶來了前所未有的突破。然而&#xff0c;現有的主流多模態模型多以英文為訓練語言&#xff0c;在中文理解和處理方面存在著明…

可用于嵌入式的解釋器調研對比,及lua解釋器介紹

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手動分割線-------------------------------------------------------------------------------- 本文章參考了以下文章&#xff1a; 這里是引用 ------------…

1113 錢串子的加法

idea 測試點3&#xff1a;輸入的兩個整數都是0測試點4.5&#xff1a;大數&#xff0c;需要用大數加法 solution1(測試點4&#xff0c;5不通過) 直接相加再轉30進制 #include<iostream> #include<string> using namespace std; typedef long long ll; string a,…

linux sed命令替換文件端口

1、需求描述&#xff1a;因sed -i ‘s/舊端口/新端口/g’ 文件&#xff0c;替換會直接增加端口導致端口直接追加后面&#xff0c;因此需要修改 要求&#xff1a;2300替換為23003&#xff0c;23001替換為23004 <value>192.168.1.133</value></constructor-arg>…

RGMII接口--->(001)FPGA實現RGMII接口(一)

&#xff08;001&#xff09;FPGA實現RGMII接口(一) 1 目錄 &#xff08;a&#xff09;FPGA簡介 &#xff08;b&#xff09;IC簡介 &#xff08;c&#xff09;Verilog簡介 &#xff08;d&#xff09;FPGA實現RGMII接口(一) &#xff08;e&#xff09;結束 1 FPGA簡介 &…

【科普向】【文末附gpt升級秘笈】《慶余年》鳳冠之工藝探究——Blender建模與3D打印之奧秘

《慶余年》鳳冠之工藝探究——Blender建模與3D打印之奧秘 一、引言 昔者&#xff0c;《慶余年》之熱播&#xff0c;引發天下觀眾之熱議。今者&#xff0c;其續作《慶余年2》之中&#xff0c;一場盛大的婚禮更是矚目。而此婚禮之上&#xff0c;唯一之鳳冠&#xff0c;竟出自一…

windows 10下conda環境目錄轉移

目錄 一&#xff1a;背景 二&#xff1a;轉移過程 三&#xff1a;環境驗證 一&#xff1a;背景 最近用conda安裝了幾個python環境&#xff0c;隨著安裝包和數據的不斷增大&#xff0c;發現C盤占用空間一直在增加&#xff0c;已經有十幾個G了&#xff0c;系統也變的越來越慢。…

Mac/Linux getline 無法讀取文件內容(讀取內容無法顯示)

如下面代碼 #include <iostream> #include <fstream>using namespace std;int main() {string file_name "1.txt";std::ifstream file(file_name);if (file.is_open()) {std::string line;while (std::getline(file, line)) {char c line.back();cout…

【深度學習】安全帽檢測,目標檢測,yolov10算法,yolov10訓練

文章目錄 一、數據集二、yolov10介紹三、數據voc轉換為yolo四、訓練五、驗證六、數據、模型、訓練后的所有文件 尋求幫助請看這里&#xff1a; https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2一、數據集 安全帽佩戴檢測 數據集&#xff1a;https://github.com/njvi…

MySql part1 安裝和介紹

MySql part1 安裝和介紹 數據 介紹 什么是數據庫&#xff0c;數據很好理解&#xff0c;一般來說數據通常是我們所認識的 描述事物的符號記錄&#xff0c; 可以是數字、 文字、圖形、圖像、聲音、語言等&#xff0c;數據有多種形式&#xff0c;它們都以經過數字化后存入計算機…

Nuxt3項目實現 OG:Image

目錄 前言 1、安裝 2、設置網站 URL 3、啟用 Nuxt DevTools 4、創建您的第一個Og:Image a. 定義OG鏡像 b. 查看您的Og:Image 5、自定義NuxtSeo模板 a. 定義 NuxtSeo模板 b. 使用其他可用的社區模板 6、創建自己的模板 a. 定義組件 BlogPost.vue b. 使用新模板 c.…