从0开始写Vue项目-Vue实现用户个人信息界面上传头像

2023-10-31

  1. 从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客
  2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客
  3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客
  4. 从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能_慕言要努力的博客-CSDN博客_mybatisplus登陆
  5. 从0开始写Vue项目-SpringBoot实现增删改查和分页查询_慕言要努力的博客-CSDN博客
  6. 从0开始写Vue项目-Vue实现数据渲染和数据的增删改查_慕言要努力的博客-CSDN博客
  7. 从0开始写Vue项目-Vue实现用户数据批量上传和数据导出_慕言要努力的博客-CSDN博客

一、前言

        都知道,我们在写项目的时候,最想给自己项目增加实用性了,例如我们的头像上传以及个人的各种信息等等。我们刚刚已经做好了我们的上传接口,那么我们现在就趁热打铁,将我们的头像上传功能解决一下。

二、个人信息界面

        我们的个人信息界面由我们的头像以及我们的表格组成,那么就说明我们需要去获取我们用户的数据了

        我们之前是做过用户数据存储的,就是利用token来将我们用户的数据存放在我们的浏览器里面,然后利用localStorage来查找出我们的用户数据。

三、头像上传 

对于头像上传,我们依然用到我们之前的接口和组件来实现该功能。

<template>
  <div>
    <el-card style="width: 800px; margin-left: 10px; margin-top: 10px;" shadow="hover">
      <el-form label-width="80px" size="small">

        <el-upload
            class="avatar-uploader"
            :action="'http://localhost:9090/file/upload'"
            :show-file-list="false"
            :on-success="handleAvatarSuccess">
          <img v-if="form.avatarUrl" :src="form.avatarUrl" class="avatar">
          <i v-else class="el-icon-plus avatar-uploader-icon" />
        </el-upload>

        <el-form-item label="用户名" style="margin-left: 200px; margin-top: -150px">
          <el-input v-model="form.username" disabled autocomplete="off" style="width: 400px"></el-input>
        </el-form-item>
        <el-form-item label="昵称" style="margin-left: 200px">
          <el-input v-model="form.nickname" autocomplete="off" style="width: 400px"></el-input>
        </el-form-item>
        <el-form-item label="性别" style="margin-left: 200px">
          <el-select v-model="form.sex" placeholder="请选择您的性别" style="width: 400px">
            <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="邮箱" style="margin-left: 200px">
          <el-input v-model="form.email" autocomplete="off" style="width: 400px"></el-input>
        </el-form-item>
        <el-form-item label="电话" style="margin-left: 200px">
          <el-input v-model="form.phone" autocomplete="off" style="width: 400px"></el-input>
        </el-form-item>
        <el-form-item label="地址" style="margin-left: 200px" >
          <el-input type="textarea" v-model="form.address" autocomplete="off" style="width: 400px"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="save">保 存</el-button>
          <el-button type="primary" @click="sign"><i class="el-icon-location" />定位</el-button>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>

<script>

export default {
  name: "Person",
  data() {
    return {
      form: {},
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {},
      options: [{
        value: '男',
        label: '男'
      }, {
        value: '女',
        label: '女'
      }],
      value: ''
    }
  },
  mounted() {

    // 获取地理位置
    var geolocation = new BMapGL.Geolocation();
    geolocation.getCurrentPosition(function(r){
      if(this.getStatus() == BMAP_STATUS_SUCCESS){
        const province = r.address.province
        const city = r.address.city
        localStorage.setItem("location", province + city)
      }
    });
  },

  created() {
    this.load()
  },
  methods: {
    load() {
      const username = this.user.username
      if (!username) {
        this.$message.error("当前无法获取用户信息!请登录!")
        return
      }
      this.request.get("/user/username/" + username).then(res => {
        // console.log(res)
        this.form = res.data
      })
    },
    sign() {
      const location = localStorage.getItem("location")
      const username = this.user.username

      this.request.post("/sign", { user: username, location: location }).then(res => {
        if (res.code === '200') {
          this.$message.success("打卡成功")
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    save() {
      this.request.post("/user", this.form).then(res => {
        if (res.data) {
          this.$message.success("保存成功")
          this.load()

          this.$emit('refreshUser')
        } else {
          this.$message.error("保存失败")
        }
      })
    },
    // 头像上传
    handleAvatarSuccess(res) {
      // res就是头像文件路径
      this.form.avatarUrl = res
    },
  }
}
</script>

<style>
.avatar-uploader {
  text-align: left;
  padding-bottom: 10px;
}
.avatar-uploader .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409EFF;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 138px;
  height: 138px;
  line-height: 138px;
  text-align: center;
}
.avatar {
  width: 160px;
  height: 160px;
  display: block;
}
</style>

四、头部Header使用

        我们在我们的头部进行数据查询和引用,就是通过user,然后找到我们的头像的元素,最后进行展示 

        我们需要在我们的脚手架里面去获取用户User最新的数据,然后最后在我们的头部Header里面去进行引入并获取信息 

源码:

 

<template>
  <div style="display: flex; line-height: 60px">
    <div style="flex: 1">
      <span :class="collapseBtnClass" style="cursor: pointer; font-size: 18px"></span>
      <el-breadcrumb separator="/" style="display: inline-block; margin-left: 10px">
        <el-breadcrumb-item :to="'/mall/index'" >主页</el-breadcrumb-item>
        <el-breadcrumb-item >{{ currentPathName }}</el-breadcrumb-item>
      </el-breadcrumb>
    </div>

    <el-dropdown style="width: 130px; cursor: pointer">

      <div style="display: inline-block; float: right; margin-right: 10px">
        <img :src="user.avatarUrl" alt=""
             style="width: 30px; border-radius: 50%; position: relative; top: 10px; right: 5px">
        <span>{{user.nickname}}</span><i class="el-icon-arrow-down" style="margin-left: 5px"></i>
      </div>

      <el-dropdown-menu slot="dropdown" style="width: 100px; text-align: center">
        <el-dropdown-item style="font-size: 14px; padding: 5px 0">
          <span style="text-decoration: none" @click="person">个人信息</span>
        </el-dropdown-item>
        <el-dropdown-item style="font-size: 14px; padding: 5px 0">
          <span style="text-decoration: none" @click="logout">退出登录</span>
        </el-dropdown-item>
      </el-dropdown-menu>

    </el-dropdown>

  </div>
</template>

<script>
export default {
  name: "Header",
  props: {
    collapseBtnClass: String,
    user: Object
  },
  computed: {
    currentPathName () {
      return this.$store.state.currentPathName;  //需要监听的数据
    }
  },
  data() {
    return {
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {}
    }
  },
  methods: {
    logout() {
      this.$router.push("/login")
      this.$message.success("退出成功")
    },
    person(){
      this.$router.push("/mall/person")
    }
  }
}
</script>

<style scoped>

</style>

其他请见:SpringBoot+Vue实现个人信息以及头像数据联动_慕言要努力的博客-CSDN博客_vue个人信息界面

⛵小结

        以上就是对从0开始写Vue项目-Vue实现用户个人信息界面上传头像简单的概述,后面会陆续更新其他的代码,请持续关注!!! 

        如果这篇文章有帮助到你,希望可以给作者点个赞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0开始写Vue项目-Vue实现用户个人信息界面上传头像 的相关文章

  • 抽象超类的默认接口方法

    可以说我有以下结构 abstract class A abstract boolean foo interface B default boolean foo return doBlah class C extends A implemen
  • 哪个类调用了我的静态方法?

    假设我有一个带有静态方法的 Java 类 如下所示 class A static void foo Which class invoked me 进一步假设 A 类有任意数量的子类 class B extends A class C ext
  • 不同的 JDK 更新会产生不同的 Java 字节码吗?

    假设场景 我有一个项目 其源合规性级别指定为 1 5 现在 我使用两种不同的 JDK 编译此项目 首先使用 JDK 6 Update 7 然后使用 JDK 6 Update 20 这两个不同的 JDK 是否会生成不同的 Java 字节代码
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • Java 套接字:可以从一个线程发送并在另一个线程上接收吗?

    这可能是一个非常基本的问题 但我很难找到答案 让一个线程写入 Socket 的输出流 而另一个线程从 Socket 的输入流读取数据 这样可以吗 编辑 这是一个与外部服务器通信的客户端应用程序 我并不是想让两个线程互相交谈 很抱歉含糊不清
  • Java中的OR运算(BitSet.class)

    如何编写一个程序 该程序需要001010101110000100100 011100010001000011000 000000000010000000000100 作为输入 位 输出将是OR其中 3 个 OR 0 0 0 0 1 1 1
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 在Vue.js 3中添加全局变量

    如何在 Vue js 3 中添加全局变量 在 Vue js 2 中 我们在main js file Vue prototype myGlobalVariable globalVariable 最直接的替换就是app config globa
  • 使用链接列表插入优先级队列的方法

    首先 我觉得我应该提到这是一项作业 我并不是在寻找直接的代码答案 只是为了指出正确的方向 我们被要求在链表中实现优先级队列 我正在努力编写 insert 函数的第一部分 在代码中我尝试检查是否head包含任何内容 如果没有则设置为head
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • 将带有时区的 Joda-Time `DateTime` 转换为没有时区的 DateTime?

    Given a DateTime http www joda org joda time apidocs org joda time DateTime html例如2015 07 09T05 10 00 02 00 using 乔达时间 h
  • 升级到 Tomcat 8 时出现 ClassNotFoundException

    我最近将 NetBeans IDE 从 v7 3 升级到 v8 突然我的应用程序在连接到数据库时在服务器启动时抛出异常 这两个版本的 IDE 之间的唯一区别是后者使用 Tomcat 8 异常日志 javax naming NamingExc
  • 使用 Hibernate 防止无限循环数据检索

    我想知道 想象一个场景 例如 POJO public class User private String userName private String name private String surname private List

随机推荐

  • Python字符串的常用方法(3-3)

    目录 一 字符串编码格式 二 字符串的格式化 三 字符串格式化函数 format 四 Python3 6加入的新格式化方案一f strings 五 格式化符号 六 format的使用方法 七 字符串的特殊字符 一 字符串编码格式 1 什么是
  • bootcmd和bootargs环境变量

    从网络启动 setenv bootargs console tty0 console ttymxc0 115200 root dev mmcblk1p2 rootwait rw setenv bootcmd tftp 80800000 zI
  • cuda c语言编程指南,CUDA C编程权威指南

    译者序 推荐序 自序 作者简介 技术审校者简介 前言 致谢 章基于CUDA的异构并行计算1 1 1并行计算1 1 1 1串行编程和并行编程2 1 1 2并行性3 1 1 3计算机架构4 1 2异构计算6 1 2 1异构架构7 1 2 2异构
  • PSIM联合VS--PLL锁相环

    在学习使用PSIM联合VS的过程中 有一项为采样三相电压信号建立软件锁相环练习PI的使用 在查询资料的过程中 网上的百度百科讲PLL作为产生n倍频来使用 这与我之前做电机控制中的PLL概念不太一致 所以产生了疑问 当时的许多知识 现在回头看
  • JetBrains IntelliJ IDEA Ultimate 2022.1.1 Win/macOS 中文

    下载链接 https sbww work 16343 IntelliJ IDEA安装和设置 IntelliJ IDEA 安装要求 硬件需求 至少需要 2 GB RAM 但是推荐使用 4 GB RAM 至少需要 1 5 GB 硬盘空间 1 G
  • 文件文档在线预览转换解决方案和应用

    文章目录 Java Word转PDF文件方案评测 一 kkFileView应用场景一 官网原始部署与应用 二 kkFileView应用场景二 编译 自定义制作docker镜像部署 三 kkfileview预览pdf文件以及关键词高亮和定位
  • Nacos配置管理

    目录 1 Nacos配置管理 1 1 统一配置管理 1 1 1 在nacos中添加配置文件 1 1 2 从微服务拉取配置 1 2 配置热更新 1 2 1 方式一 1 2 2 方式二 1 3 配置共享 1 添加一个环境共享配置 2 在user
  • 财报解读:份额企稳、均价上浮,小米高端化驶入正轨?

    时隔半个月 在雷军那场颇有反响的以 成长 为主题的个人演讲之后 小米发布了今年二季度财报 二季报中亮眼的财务数据 为雷军的演讲提供了一份更加有力的注解 小米经过三年探索 似乎已经找到了高端化的诀窍 因而实现了 成长 但当高端化转型已经成为市
  • 第一章 计算机系统的概述①

    一 操作系统概述 1 操作系统的概念 什么是操作系统 概念 操作系统 Operating System 0s 是指控制和管理整个计算机系统的硬件和软件资源 并合理地组织调度计算机的工作和资源的分配 以提供给用户和其他软件方便的接口和环境 它
  • 失传已久的广工Dr.com路由器最简单最小白的配置方法

    失传已久的广工路由器最简单最小白的配置方法 零 前言 一 准备工作 1 所需物品 2 原理及工具介绍 没兴趣的请直接跳过 二 路由器权限获取 须时两周 三 分析心跳包 1 安装wireshark 2 进行抓包 四 尝试第一次拨号 1 打开W
  • Xcode 之自己编译静态库

    今天介绍下 如何利用Xcode 新建一个静态库 以及如何编译成i386 armv7 armv7s 等平台架构 开发环境 MAC OS X 10 9 4 Xcode 5 0 2 背景知识 库分两种 静态库 a lib 和 动态库 so dll
  • 学员管理系统——面向对象

    文章目录 前言 基本思路 Student py main py StudentManage py 菜单 menu 根据菜单实现程序的大概逻辑 add student 添加学员信息 delete student 删除学员信息 modify s
  • STM32-定时器详解

    目录 前言 一 定时器基本介绍 1 STM32定时器 2 通用定时器功能和特点 3 计数器模式 4 定时器工作原理 a 定时器框图 b 时钟产生器部分 c 时基单元 d 输入捕获通道 e 输出比较通道 PWM 二 定时器中断应用 1 内部时
  • SpringBoot基本操作(四)——SpringBoot使用RedisTemplate整合Redis(有demo)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • Visual Studio Community 2019 评估期结束,登录一直失败问题

    今天打开VS2019 发现它试用期过期了需要登录 点击登录 发现一直说浏览器版本太低 需要升级浏览器 真正点击下载Edge浏览器 它又不直接跳转到该浏览器中 反复试了好多次 简直让人崩溃 后来网上搜索到用设备代码流的方式可以解决 https
  • 简图记录-驱动debug之打印总结(printk、dmesg、logcat)

    简图记录总结 在驱动开发过程中 常会用到一些打印做问题定位 无论是提前设计或者调试过程中添加 打印都是一种常用的手段 以下为打印相关问题总结 一 常见驱动打印的添加与查看 1 内核打印printk 概念 printk是内核中根据日志级别向控
  • shell编程必须会的30道题目

    linux运维人员必会的30道shell编程面试题 一 序言 前几天一个做开发的朋友发给我一个链接 http oldboy blog 51cto com 2561410 1632876 from singlemessage isappins
  • linux启动jar包指定日志输出目录下,linux 启动jar包 指定yml配置文件和输入日志文件...

    命令为 nohup java jar project jar spring config location home project conf application yml gt home project conf nohup out 2
  • ZK的选举算法

    一 前言 前面学习了Zookeeper服务端的相关细节 其中对于集群启动而言 很重要的一部分就是Leader选举 接着就开始深入学习Leader选举 二 Leader选举 2 1 Leader选举概述 Leader选举是保证分布式数据一致性
  • 从0开始写Vue项目-Vue实现用户个人信息界面上传头像

    从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue页面主体布局和登录 注册页面 慕言要