SpringBoot项目前端Vue访问后端(图片静态资源) 配置

news2024/11/28 8:41:27

静态资源配置

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Value("${file.save-path}")
    private String fileSavePath;


    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        //映射本地文件夹
        registry.addResourceHandler("/images/**").addResourceLocations("file:" + fileSavePath);
        super.addResourceHandlers(registry);
    }
}

 application.yml

file:
   save-path: D:\qr_code_duct\qr_code_back\images\

详细说明 

由于要展示的图片可能比较大,从后端数据库中获取base64编码明显不可能(base64大部分适用于KB级别的),数据库正常来说也只存放图片的地址,而不是图片的内容。

CREATE TABLE `card_record_image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `card_record_id` int(11) DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `operator_id` int(11) DEFAULT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `card_record_id` (`card_record_id`),
  CONSTRAINT `card_record_image_ibfk_1` FOREIGN KEY (`card_record_id`) REFERENCES `card_record` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4;
    public RespondDto saveCardRecord(RequestData requestData) {
        // 解析前端传递的数据, 创建CardRecord对象并保存到数据库
        CardRecord cardRecord = new CardRecord();
        cardRecord.setProductId(requestData.getProductId());
        cardRecord.setCurrentLocation(requestData.getCurrentLocation());
        cardRecord.setDescription(requestData.getDesc());
        cardRecord.setCreateTime(new Date());
        cardRecordMapper.insert(cardRecord);

        // 保存卡记录图片
        List<String> imageList = requestData.getImageList();
        List<String> imageUrlList = new ArrayList<>();

        for (String base64Image : imageList) {
            // 移除可能的前缀信息(如"data:image/jpeg;base64,"),只保留base64编码部分
            String base64Data = base64Image.replaceAll("data:image/.*;base64,", "");
            // 从 base64 解码成二进制数据
            byte[] imageBytes = Base64.getDecoder().decode(base64Data);
            // 生成文件名,这里可以根据需要生成唯一的文件名
            String fileName = "image_" + UUID.randomUUID() + ".png";

            // 构建文件保存路径
//            String fileSavePath = "D:" + File.separator + "qr_code_duct" + File.separator + "qr_code_back" + File.separator +"images" +File.separator +fileName;

            String fileSavePath = fileProperties.getSavePath() + fileName;

            try (FileOutputStream fos = new FileOutputStream(fileSavePath)) {
                fos.write(imageBytes);
                // 替换为实际的域名和路径
                imageUrlList.add("/images/" + fileName);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            // 保存图片信息到数据库
            CardRecordImage cardRecordImage = new CardRecordImage();
            cardRecordImage.setCardRecordId(Math.toIntExact(cardRecord.getId()));
            // 替换为实际的域名和路径
            cardRecordImage.setImageUrl("/images/" + fileName);
            cardRecordImage.setCreateTime(new Date());
            cardRecordImageMapper.insert(cardRecordImage);
        }
        return new RespondDto(ResultCode.OK, "保存成功!!");
    }
<template>
  <div>
    <div class="return-button-container">
      <el-button size="small"  @click="goBack">返回</el-button>
    </div>
    <el-table :data="cardRecords" style="width: 100%">
      <el-table-column prop="productId" label="板卡编号"></el-table-column>
      <el-table-column prop="currentLocation" label="记录人"></el-table-column>
      <el-table-column label="图片">
        <template slot-scope="scope">
          <div v-if="Array.isArray(scope.row.images)">
            <div v-for="(image, index) in scope.row.images" :key="index">
              <img :src="getImageUrl(image.imageUrl)" style="max-width: 100px; max-height: 100px">
            </div>
          </div>
        </template>
      </el-table-column>
      <el-table-column prop="description" label="说明备注"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      cardRecords: []
    };
  },
  created() {
    this.getAllCardRecordsWithImages();
  },
  methods: {
    goBack() {
      window.location.href = 'http://localhost:8889/login'
    },
    getImageUrl(imageUrl) {
      return 'http://192.168.**.**:9999' + imageUrl;
    },
    getAllCardRecordsWithImages() {
      this.$request.get('/cardRecord/allWithImages')
          .then(res => {
            console.log('Response data:', res.data);
            if (Array.isArray(res.data) && res.data.length > 0) {
              this.cardRecords = res.data.map(item => this.parseData(item));
            } else {
              console.error('Error fetching card records: Data is empty');
            }
          })
          .catch(error => {
            console.error('Error fetching card records:', error);
          });
    },
    parseData(data) {
      return {
        productId: data.productId,
        currentLocation: data.currentLocation,
        images: Array.isArray(data.images) ? data.images.map(image => ({
          id: image.id,
          imageUrl: image.imageUrl
        })) : [],
        description: data.description
      };
    }
  }
};
</script>
<style scoped>
.return-button-container {
  position: absolute;
  top: 16px;
  right: 16px;
}
</style>

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

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

相关文章

python大学生健身爱好者交流网站flask-django-nodejs-php

任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于python技术、django/flask框架、B/S机构、Mysql数据…

每日一练:LeeCode-167. 两数之和 II - 输入有序数组【双指针】

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers.…

WanAndroid(鸿蒙版)开发的第六篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

自然语言处理学习总结

目录 1、词表示 2、语言模型&#xff08;LM&#xff09; 3、常用学习网址 自然语言处理 1、词表示 词表示&#xff1a;自然语言中最基本的语言单位表示成机器理解的方式 方式一&#xff1a;词与词之间的相似度 方式二&#xff1a;词与词之间的关系 词义的表示方法&…

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

FPGA控制AD7606_AD7606解读

目录 一、AD7606解读二、引脚说明三、时序图 一、AD7606解读 AD7606特点&#xff1a; 8通道同步采样模拟通道数为8分辨率&#xff1a;16bit&#xff0c;即最小采样的电压为5V/(2^16) 0,00007V&#xff0c;即数字量的1就代表模拟量的0,00007V&#xff0c;2代表0,00014V有效位数…

Android14 - AMS之Activity启动过程(3)

Android14 - AMS之Activity启动过程&#xff08;1&#xff09;-CSDN博客 Android14 - AMS之Activity启动过程&#xff08;2&#xff09;-CSDN博客 上篇中我们梳理完ActivityStarter的startActivityInner&#xff0c;本篇从这里开始&#xff1a; platform/frameworks/base/servi…

Linux实践 - 命令行解释器 简易版

~~~~ 前言解决的问题为什么shell要以子进程的方式执行我们的命令&#xff1f;为什么直接使用程序名ls&#xff0c;而不是路径/usr/bin/ls&#xff1f; 头文件包含命令行提示符接受用户命令行输入解析用户的输入内建命令&&特殊处理ls 时目录等文件不带高亮颜色cd时目录不…

[OpenCV学习笔记]获取鼠标处图像的坐标和像素值

目录 1、介绍2、效果展示3、代码实现4、源码展示 1、介绍 实现获取鼠标点击处的图像的坐标和像素值&#xff0c;灰度图显示其灰度值&#xff0c;RGB图显示rgb的值。 OpenCV获取灰度值及彩色像素值的方法&#xff1a; //灰度图像&#xff1a; image.at<uchar>(j, i) //j…

学习笔记Day12:初探LInux 2

Linux初探 同一个目录中不允许出现文件及文件夹重名 查看文件 cat &#xff08;Concatenate&#xff09;查看文本文件内容&#xff0c;输出到屏幕&#xff08;标准输出流&#xff09; 常用参数 -A打印所有字符&#xff0c;包括特殊字符&#xff08;换行符、制表符等&#xff…

前端项目,个人笔记(三)【Vue-cli - api封装-axios使用举例】

目录 前言 1、axios配置与测试 1.1、配置 1.2、测试 2、使用axios案例-渲染header 3、Pinia优化重复请求 3.1、为什么&#xff1f; 3.2、使用Pinia优化代码步骤 步骤一&#xff1a;在main.js中创建 Pinia 实例&#xff0c;并将其作为插件添加到 Vue 应用中 步骤二&am…

redis和rabbitmq实现延时队列

redis和rabbitmq实现延时队列 延迟队列使用场景Redis中zset实现延时队列Rabbitmq实现延迟队列 延迟队列使用场景 1. 订单超时处理 延迟队列可以用于处理订单超时问题。当用户下单后&#xff0c;将订单信息放入延迟队列&#xff0c;并设置一定的超时时间。如果在超时时间内用户…

【LabVIEW FPGA入门】使用FPGA实现串行同步接口(SSI)

SSI&#xff08;串行同步接口&#xff09;是连接绝对位置传感器和控制器的广泛应用的串行接口。SSI利用控制器发出一个时钟脉冲序列&#xff0c;初始化传感器的门限输出。 传感器不断更新位置数据&#xff0c;并传送到移位寄存器中。在每一个时钟脉冲序列之间&#xff…

了解常见字符函数

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

.NET 异步编程(异步方法、异步委托、CancellationToken、WhenAll、yield)

文章目录 异步方法异步委托async方法缺点CancellationTokenWhenAllyield 异步方法 “异步方法”&#xff1a;用async关键字修饰的方法 异步方法的返回值一般是Task<T>&#xff0c;T是真正的返回值类型&#xff0c;Task<int>。惯例&#xff1a;异步方法名字以 Asy…

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

为什么要写这么一篇介绍ArcGis的文章呢&#xff1f;因为大部分人也包括ArcGisdada&#xff0c;在使用ArcMap应用程序创建工程时总以为我们就是使用了ArcGis这个软件的所有。其实不然&#xff0c;在后期的接触和使用中慢慢发现原来ArcMap只是ArcGis这个综合平台的一部分&#xf…

HarmonyOS NEXT应用开发之动态路由

介绍 本示例将介绍如何使用动态路由跳转到模块中的页面&#xff0c;以及如何使用动态import的方式加载模块 使用说明 通过动态import的方式&#xff0c;在需要进入页面时加载对应的模块。配置动态路由&#xff0c;通过WrapBuilder接口&#xff0c;动态创建页面并跳转。动态i…

2024.3.19

思维导图 模拟面试 1.友元的作用 答&#xff1a;通过关键字friend&#xff0c;可以让一些函数或者类&#xff0c;可以访问一个类中的私有数据成员。 2.匿名对象的作用 答&#xff1a;匿名对象就是没有名字的对象&#xff0c;是用来给有名对象进行初始化工作的。 3.常成员函…

【S5PV210】 | GPIO编程

【S5PV210】 | GPIO编程 时间:2024年3月17日22:02:32 目录 文章目录 【`S5PV210`】 | `GPIO`编程目录1.参考2.`DataSheet`2.1.概述2.1.1.特色2.1.2 输入/输出配置2.1.3 `S5PV210` 输入/输出类型2.1.4 IO驱动强度**2.1.4.1 类型A IO驱动强度****2.1.4.2 类型A IO驱动强度****2…

安泰电子:前置微小信号放大器是什么东西

前置微小信号放大器是一种用于放大微弱信号的设备&#xff0c;在电子和通信领域中有广泛的应用。它的主要功能是将输入的微小信号放大到足够的水平&#xff0c;以便后续电路能够准确地测量、处理和分析这些信号。本文将详细介绍前置微小信号放大器的原理、组成部分和应用领域。…