从0开始搭建vue + flask 旅游景点数据分析系统(十三)vue + flask 图片上传、用户头像更改

news2024/9/21 11:01:41

项目是基于我的博文:vue + flask 旅游景点数据分析系统 基础上做的,可以参考之前的博客文章。

1 前端修改

主要是修改Profile.vue

   <!-- 头像上传 -->
        <el-form-item label="头像">
          <el-upload
              class=""
              action="/api/upload_avatar"
              :on-success="handleAvatarSuccess"
              :before-upload="beforeAvatarUpload"
              :show-file-list="false"
          >
            <el-button size="small" type="primary">上传头像</el-button>
          </el-upload>
          <img v-if="form.avatarUrl" :src="form.avatarUrl" class="avatar" alt="头像"/>
        </el-form-item>
 
 beforeAvatarUpload(file) {
      const isJPG = file.type === 'image/jpeg';
      const isPNG = file.type === 'image/png';
      const isLt2M = file.size / 1024 / 1024 < 2;

      if (!(isJPG || isPNG)) {
        this.$message('上传头像图片只能是 JPG 或 PNG 格式!', 'error');
      }
      if (!isLt2M) {
        this.$message('上传头像图片大小不能超过 2MB!', 'error');
      }
      return (isJPG || isPNG) && isLt2M;
    },
    handleAvatarSuccess(response, file) {
      // console.log(response.message)
      // 假设后端返回的头像 URL 在 response.data.url
      console.log(response.data.url)
      this.form.avatar = response.data.url;
      localStorage.setItem('avatar', response.data.url)// 设置头像
      this.form = {...this.form}
    },

.avatar {
  width: 100px; /* 自定义宽度 */
  height: 100px; /* 自定义高度 */
  object-fit: cover; /* 确保图片覆盖整个方框 */
  border: 1px solid #ccc; /* 添加边框以显示方框效果 */
}

Layout.vue 我们修改头像之后,希望标题栏上的头像也可以修改:

  // avatarUrl: require("@/assets/avatar.png") // 也可以使用 require 语法引入图片
  avatarUrl: localStorage.getItem('avatar') //获取头像

2 后端修改

新建一个upload文件夹,用于保存图片。

修改config的内容

ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
UPLOAD_FOLDER = 'upload'

class Config:
    # scrapy_demo 就是之前旅游爬虫教程中建的数据库,如果不清楚,可以去看之前的教程
    # 视频:https://www.bilibili.com/video/BV1Vx4y147wQ
    # 博客:https://blog.csdn.net/roccreed?type=blog
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:12345678@localhost/scrapy_demo?charset=utf8'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 设置上传文件夹
    UPLOAD_FOLDER = UPLOAD_FOLDER
    # 允许的文件扩展名
    ALLOWED_EXTENSIONS = ALLOWED_EXTENSIONS

修改routes.py,增加上传相关内容:

# 上传图片
@main.route('/upload_avatar', methods=['POST'])
def upload_avatar():
    if 'file' not in request.files:
        return make_response(code=400, message='没有文件部分')

    file = request.files['file']

    if file.filename == '':
        return make_response(code=400, message='没有选择文件')

    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file_path = os.path.join(UPLOAD_FOLDER, filename)
        file.save(file_path)

        # 返回头像的 URL
        return make_response(code=0, message="上传成功",
                             data=dict(url=f'/api/upload/{filename}'))

    return make_response(code=400, message='不支持的文件类型')

# 查看图片
@main.route('/upload/<filename>/', methods=['GET'])
def uploaded_file(filename):
    current_directory = os.getcwd()
    uoload_path = current_directory + '/' + UPLOAD_FOLDER
    # print(uoload_path)
    return send_from_directory(uoload_path, filename, as_attachment=False)
    
    

同时用户的更新接口需要增加更新字段avatar:

# 更新用户接口
@main.route('/user/<int:id>', methods=['PUT'])
def update_user(id):
    data = request.json  # 获取JSON数据
    user = User.query.get(id)  # 根据ID查找

    if not user:
        return make_response(code=1, message='用户不存在')

    # 更新字段
    for field in ['realname', 'job', 'addr', 'intro', 'phone', 'email', 'age',
                  'avatar']:
        if field in data:
            setattr(user, field, data[field])

3 测试一下

测试一下,已经上传到服务端了。
在这里插入图片描述

右上角的头像不会变,但是我们可以刷新一下就可以了,刷新一下,重新读取localStorage,就更新到了。
在这里插入图片描述
在这里插入图片描述

原因是我们的头像更新(localStorage中,这个实际上是文件了)vue是不会监听的。

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

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

相关文章

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

按钮(Buttons)-Qt-思维导图-学习笔记

按钮(Buttons) 按钮在 Qt 中的重要性 按钮是 Qt 中最常用的控件之一 通过点击按钮&#xff0c;可以响应事件&#xff0c;实现人机交互效果 按钮在嵌入式系统和 PC 端的界面交互中都是不可或缺的 Qt 内置的六种按钮部件 QPushButton&#xff1a;下压按钮 用法示例 项目创建与…

指针详解(三)

目录 1. 数组名 2. 使用指针访问数组 3. 一维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名 在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];/…

CV党福音:YOLOv8实现实例分割(二)之训练过程

在上一篇博客中&#xff0c;我们已经了解了YOLOv8实例分割的基本流程&#xff0c;本章则是对数据集、以及训练过程等进行进一步的学习。 文章目录 训练整体流程语义分割与实例分割数据集开启训练训练Debug数据封装损失函数初始化前向传播 总结 训练整体流程 训练模型的整体流…

洗衣机洗衣服一些知识

01智能:按衣物多少自动调节合适水位的标准洗涤程序 (需要30分钟时间) 02:大物:较大,较厚的衣服洗涤 03:轻柔:毛织品或内衣洗涤 04:快速:少量清污衣服洗涤 (13分钟) 05:浸泡:先浸泡一段时间再洗涤 06:单洗:只洗衣不脱水 07:单脱:只脱水不洗衣 08:洁桶:清洁洗衣桶 准备工作: (1)…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一&#xff1a;构造函数 方法二&#xff1a;parseInt 方法三&#xff1a;locat…

龙门吊(天车)防撞方案

防撞雷达设备&#xff0c;是一款基于无线微波技术自主研发的应答式高精度无线防撞产品&#xff0c;该产品具有测距精度高&#xff08;最高可到10厘米&#xff09;&#xff0c;测距稳定&#xff0c;无累计误差&#xff0c;粉尘、水汽不影响测距精度&#xff0c;抗电磁干扰等特点…

oracle数据库目录及文件

oracle数据库目录及文件 oracle安装后所有根目录 1、admin 目录 里边有不同文件夹&#xff0c;代表一个实例&#xff0c;记录 Oracle 实例的配置&#xff0c;运行日志等文件。每个实例一个目录。 SID&#xff1a;System IDentifier 的缩写&#xff0c;是 Oracle 实例的唯一标记…

IT服务标准化知识体系攻略(至简)

标准是为了在一定范围内获得最佳秩序 &#xff0c;经协商一致制定并由公开机构批准共同使用和重复使用的和中规范性文件。标准是标准化活动的主要成果之一。国家标准的制定有一套正常程序&#xff0c;分为预阶段、立项阶段、起草阶段、征求意见阶段、审查阶段、批准阶段、出版阶…

【区块链+金融服务】第一创业证券开发银行间报价 Dapp | FISCO BCOS应用案例

在银行间市场现券交易的过程中&#xff0c;通过银保监会发牌的代理机构进行报价交易&#xff0c;已解决无代理阶段存在的许多问题。 但是由于业务需要&#xff0c;使用以前模式进行报价交易的仍占有一定比例。 针对这一现状&#xff0c;第一创业证券基于 FISCO BCOS 区块链底层…

工作 sql 数据库创建 表的修改 插入数据

一. 创建数据库 创建数据库 CREATE DATABASE (IF NOT EXISTS) 数据库名称;使用数据库 USE 数据库名称;查看当前数据库中存在的表 SHOW TABLES;删除数据库 DROP DATABASE demolibang 二. 创建表 格式&#xff1a; CREATE TABLE IF NOT EXISTS 表名&#xff08; 字段名 字…

Unity动画模块 之 3D模型导入基础设置 Materials

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 还是那句话&#xff0c;用到的时候再看看&#xff0c;死记硬背不是正经的学习方法&#xff0c;但是又不得不知道一下&…

javaweb_10:XML映射文件

一、规范 1、XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放在相同的包下&#xff08;同包同名&#xff09;。 2、XML映射文件的namesapce属性为Mapper接口全限定名一致。 3、 XML映射文件中sql语句的id与Mapper接口中的方法名一致&a…

培训第二十七天(lvs_nat模式与lvs_dr模式配置)

上午 核心&#xff1a;内核中的ipvs&#xff0c;ipvsadm1、安装ipvsadm[rootnat ~]# yum -y install ipvsadm2、配置规则查看所有的规则&#xff0c;如果已经配置好规则&#xff0c;重启之后也就没有了[rootnat ~]# ipvsadm -L -n 1、配置vip网卡 &#xff08;1&#xff09;在…

数组前缀和算法技巧

一、什么是数组前缀和 数组中前缀和技巧&#xff08;Prefix Sum Technique&#xff09;是一种常见且有用的算法技巧&#xff0c;特别适用于需要频繁查询数组区间和的问题。这种技巧通过创建一个额外的数组来存储原始数组中特定位置之前所有元素的和&#xff0c;从而在需要计算…

【图论】并查集(Union-find Sets)

文章目录 前言一、并查集(Union-find Sets)基本概念基本操作步骤 二、并查集的操作步骤1. 初始化 init2. 查询 find、合并 union&#xff08;未进行路径压缩&#xff09;3. 查询 find、合并 union&#xff08;路径压缩&#xff09; 三、Kruskal 算法中 环 的判断并查集的使用 总…

C++中的string介绍(常用函数)

string类 为什么学习string类C语言中的字符串 标准库中的string类string类(了解)auto和范围forauto关键字范围for string类的常用接口说明(注意下面只讲解最常用的接口)string类对象的常见构造 string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作strin…

洛谷 P6280 [USACO20OPEN] Exercise G

题目来源于&#xff1a;洛谷 题目本质&#xff1a;dp&#xff0c;素数筛法&#xff0c;质数 本题与P4161基本一模一样 首先&#xff0c;分析题目发现&#xff0c;某个排列的需要进行恰好 K 步变回原样&#xff0c;这个时候K的值就是这个排序中各个环的长的的最小公倍数(lcm)。…

wechatAssetsPicker组件的用法

文章目录 1. 概念介绍2. 思路与方法2.1 使用思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"ImagePicker使用总结"相关的内容&#xff0c;本章回中将介绍wechat_assets_picker这个三方包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介…

红外遥控设计验证

前言 红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机和手机系统中。本文…