【第27章】Vue实战篇之用户头像修改

文章目录

  • 前言
  • 一、界面搭建
  • 二、头像回显
  • 三、头像上传
    • 1. 自动上传
      • 1.1 表单
      • 1.2 事件
    • 2. 更新用户头像
      • 2.1 调用接口
      • 2.2 界面代码
      • 2.3 事件代码
  • 总结


前言

这里来完成修改用户头像的功能。


一、界面搭建

<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>

二、头像回显

import useUserInfoStore from '@/stores/userInfo.js'const uploadRef = ref()//用户头像地址
const userInfoStore = useUserInfoStore()
const imgUrl= userInfoStore.getUserInfo().userPic?ref(userInfoStore.getUserInfo().userPic):avatar

三、头像上传

1. 自动上传

1.1 表单

<el-upload class="avatar-uploader" :auto-upload="true" action="/api/file/upload/avatar" :name="file" :headers="token" :before-upload="updateBefore" :on-success="uploadSuccess":show-file-list="false"><img v-if="imgUrl" :src="imgUrl" class="avatar" /><img v-else :src="avatar" width="278" />
</el-upload>

1.2 事件

import {useTokenStore} from '@/stores/token.js'//头像上传
const token=ref('')
const updateBefore=()=>{const tokenStore=useTokenStore()if(tokenStore.getToken()){token.value={'Authorization':'Bearer '+tokenStore.getToken()}}
}
const uploadSuccess=(response)=>{imgUrl.value=response.data
}

2. 更新用户头像

2.1 调用接口

export const userAvatarService = (avatar)=>{var params = new URLSearchParams()params.append('avatar', avatar)return request.patch('/user/avatar', params)
}

2.2 界面代码

<el-row><el-col :span="12"><el-upload class="avatar-uploader" :auto-upload="true" action="/api/file/upload/avatar" :name="file" :headers="token" :before-upload="updateBefore" :on-success="uploadSuccess":show-file-list="false"><img v-if="imgUrl" :src="'/avatar/'+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" @click="updateAvatar">上传头像</el-button></el-col>
</el-row>

2.3 事件代码

import { userAvatarService } from '@/api/user.js'
import { ElMessage } from 'element-plus'//更新用户头像
const updateAvatar=async()=>{const result = await userAvatarService(imgUrl.value)const message = result.messageif (result.code == 0) {ElMessage.success(message ? message : '上传成功!')userInfoStore.userInfo.userPic=imgUrl.value} else {ElMessage.error(message ? message : '上传失败,请稍后重试!')}
}

总结

回到顶部

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

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

相关文章

RabbitMQ的高可用机制有了解过嘛

面试官&#xff1a;RabbitMQ的高可用机制有了解过嘛 候选人&#xff1a; 嗯&#xff0c;熟悉的~ 我们当时项目在生产环境下&#xff0c;使用的集群&#xff0c;当时搭建是镜像模式集群&#xff0c;使用了3台机器。 镜像队列结构是一主多从&#xff0c;所有操作都是主节点完成&a…

Listary——最好用的电脑搜索文件软件

简易版&#xff1a; https://www.listary.com/download-completion?versionstable 完整功能版&#xff1a; Microsoft PowerToys | Microsoft Learn

android——解决bug的流程以及细节

目录 心态 一、如何定位到有问题的bug代码 (1)搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 二、解决棘手bug的步骤 (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了&#xff0c;那就解决提出…

华为仓颉编程语言震撼发布!Hello Cangjie!

引言 2024 年度华为开发者大会&#xff08;HDC&#xff09;在 6 月 21 日拉开帷幕&#xff0c;鸿蒙 NEXT&#xff08;HarmonyOS NEXT&#xff09;操作系统在万众瞩目中横空出世。 华为常务董事、终端 BG 董事长余承东激动地表示 &#xff0c;从 2019 年 8 月 9 日至今共 1778 天…

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长&#xff0c;在这个色彩缤纷的季节&#xff0c;SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心&#xff08;北京朝阳馆&#xff09;隆重开幕。新老朋友共聚一堂&#xff0c;把酒话桑麻。 为期4天的国际学术会…

【FFmpeg】AVPacket结构体

【FFmpeg】AVPacket结构体 1.AVPacket结构体的定义 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流程分析&#xff1a; 【FFmpeg】编码链…

Cython 是什么

Cython 是一个 Python 编译器&#xff0c;它将 Python 代码编译成 C 代码。这意味着您可以使用 Python 的语法来编写代码&#xff0c;但通过 Cython 编译后&#xff0c;它将以接近 C 语言的速度运行。 特点 静态类型&#xff1a;Cython 提供了静态类型检查&#xff0c;这意味着…

不出网上线CS的各种姿势(内网横向)

情况一&#xff1a;存在一台中转机器 存在一台中转机器&#xff0c;这台机器出网&#xff0c;这种是最常见的情况。 经常是拿下一台边缘机器&#xff0c;其有多块网卡&#xff0c;用于连接内外网&#xff0c;内网机器都不出网。这种情况下拿这个边缘机器做中转&#xff0c;就…

分享几个小红书获取笔记详情API接口调用实例

item_get_video-获得小红书笔记详情 smallredbook.item_get_video 公共参数 名称类型必须描述keyString是调用key&#xff08;API支持测试&#xff0c;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[i…

react 父子组件的渲染机制 优化手段

**优化后** 优化思路&#xff1a;将使用了state的组件拆分为一个子组件&#xff0c;state在子组件中使用(将state下发到子组件)&#xff0c;state变化时仅当前组件重渲染。// 优化后写法 const Component () > { return ( ) } const ButtonWithDialog () > { const […

HTML(14)——结构伪类选择器和伪元素选择器

结构伪类选择器 作用&#xff1a; 根据元素的结构关系查找元素 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E元素(第一个元素N值为1) 例如&#xff1a;查找第一个li标签&#xff0c;将背景改为绿色 <style> li:fir…

【OpenGL基础教程】OpenGL的介绍

文章目录 前言可编程管线(核心模式)状态机总结 前言 在计算机图形学领域&#xff0c;OpenGL&#xff08;Open Graphics Library&#xff09;是一个标准&#xff0c;它定义了一套跨语言、跨平台的编程接口。它用于渲染2D、3D矢量图形。这个接口由近350个不同的函数调用组成&…

Android C++系列:C++最佳实践5const

1. 背景 在Java中我们定义常量通常用final static TYPE variableName = xxx来实现,在C语言中我们通常用预编译宏来实现:#define MAX 100,在C++中虽然我们仍可以使用预编译宏,但是已经不推荐这么干了。在Effective c++ 的条款1中:提到“尽量用编译器而不用预处理”,因为#…

周报 | 24.6.17-24.6.23文章汇总

为了更好地整理文章和发表接下来的文章&#xff0c;以后每周都汇总一份周报。 天才程序员周弈帆 | Stable Diffusion 解读&#xff08;三&#xff09;&#xff1a;原版实现源码解读(篇幅略长&#xff0c;建议收藏&#xff01;)-CSDN博客 周报 | 24.6.10-24.6.16文章汇总-CSDN…

APP启动流程

文章目录 主要构成详细启动流程参考链接 主要构成 App的启动流程主要涉及几个关键步骤和组件的交互&#xff0c;包括Launcher进程、ActivityManagerService&#xff08;AMS&#xff09;、Zygote进程、以及App进程本身。以下是详细的启动流程&#xff1a; 用户操作&#xff1a;…

[职场] 怎么写个人简历模板 #其他#知识分享

怎么写个人简历模板 怎么写个人简历模板1 姓名&#xff1a;xxx 性别&#xff1a;x 年龄&#xff1a;x岁 婚姻状况&#xff1a;x 最高学历&#xff1a;xx 政治面貌&#xff1a;xx 现居城市&#xff1a;xx 籍贯&#xff1a;xx 联系电话&#xff1a;xxxxxx 电子邮箱&#xff1a;xx…

SPN-PLMN运营商名称更新的一些规则及代码逻辑

规则简介 EONS也是更新PLMN,而不是SPN,SPN都是依据卡信息。 在MTK平台上,提供lookupOperatorName逻辑,根据SPN/EONS/NITZ刷新运营商名称显示内容,也可以自定义优先级。 流程接口 [SST] refreshSPN 更新SPN => Note:MTK源码是通过lookupOperatorName,客制化加入con…

vue的学习之路(Axios 基本使用)

<script src"js/axios.min.js"></script> 3、在页面中引用 4、发送异步请求 url?xxx rest请求【GET,POST,DELETE,PATCH】 5、准备一个SpringBoot的控制层与axios进行交互 实体类 public class User { private Integer id; private String user…

家政小程序开发,打造方便快捷的家政市场

随着生活水平的提高&#xff0c;对家政的需求也在逐渐增加。不过在市场中&#xff0c;传统的家政服务存在严重的信息差&#xff0c;需要花费大量时间才可以找到合适的家政人员&#xff0c;效率较低。 互联网家政小程序因此出现&#xff0c;它能够直接连接用户与家政人员&#…

【Homebrew】包管理器清理软件包,释放mac空间

Homebrew 包管理器安装了大量的 kegs(软件包)、文件,并且占用了mac 空间 如果你想管理这些空间或者获取哪些软件包占用了最多空间的详细信息,可以使用以下 Homebrew 命令: 列出所有已安装的软件包: brew list查看每个已安装软件包的大小: brew list --formula --versio…