SpringBoot项目前端Vue访问后端(图片静态资源) 配置
静态资源配置
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {@Value("${file.save-path}")private String fileSavePath;@Overrideprotected 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>
相关文章:
SpringBoot项目前端Vue访问后端(图片静态资源) 配置
静态资源配置 Configuration public class WebMvcConfig extends WebMvcConfigurationSupport {Value("${file.save-path}")private String fileSavePath;Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//映射本地文件夹registry…...
colab中数据集保存到drive与取出的方法
from google.colab import drive drive.mount(/content/drive) 一、下载数据集 from datasets import load_dataset max_length 32 # Maximum length of the captions in tokens coco_dataset_ratio 50 # 50% of the COCO2014 dataset# Load the COCO2014 dataset for tr…...
React 应该如何学习?
学习 React 是现代 Web 前端开发中的重要一步,因为它是一个流行且强大的 JavaScript 库,用于构建用户界面。React 的学习过程需要掌握一系列的概念、技术和最佳实践。 1. 基础知识 1.1 HTML、CSS 和 JavaScript React 本质上是一个 JavaScript 库&…...
跨平台无缝操作:ShareMouse让多电脑协同更高效
ShareMouse是一款功能强大的鼠标和键盘共享软件,它支持多台计算机之间的无缝连接,让用户能够通过一套键鼠设备轻松控制多台电脑,提高工作效率。此外,ShareMouse还具备剪贴板共享、文件拖放等功能,实现不同计算机间的便…...
Vue使用pandoc-wasm进行各格式转换
前端使用pandoc-wasm的问题和建议 docx转md npm install --save pandoc-wasmimport { Pandoc } from "pandoc-wasm";const pandoc new Pandoc()pandoc.init().then(async (pandoc) > {const result await pandoc.run({text: "Some input text",opti…...
springboot284基于HTML5的问卷调查系统的设计与实现
问卷调查系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,问卷信息因为其管理内容繁杂,管理数量繁多导…...
AI短视频制作一本通:文本生成视频、图片生成视频、视频生成视频
第一部分:文本生成视频 1. 文本生成视频概述 随着人工智能(AI)技术的飞速发展,视频制作领域也迎来了创新的浪潮。文本生成视频是其中的一项令人激动的进展,它利用自然语言处理技术将文本内容转化为视频。这项技术在广…...
详谈分布式事务
目录 前言 1.sharding的分布式事务 2.分布式事务的产生原因 3.分布式事务的解决方案 3.1.DTP模型 3.2.分阶段提交 3.3.TCC模式 3.4.可靠消息服务 3.5.AT模式 3.6.Seata 前言 本文是前面一篇文章聊了基于sharding的分库分表后拓展出来的关于分布式事务的讨论…...
Java基础知识八股
1.为什么静态方法无法调用非静态方法? 回答:因为静态方法是随着类的加载而加载,而非静态方法则是随着类的实例化才会被加载,生存周期不一样,所以静态方法的生命周期更长 2.Java–内部类持有外部类导致内存泄露的原因和…...
【Linux】网络基础一
网络基础一 1.计算机网络背景1.1 网络发展1.2 认识 “协议” 2.网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程3.1 网络传输流程图 4.数据包封装和分用5.网络中的地址管理 从今天开始我们将要从系统横跨到网络的学习了,因…...
Redis-2 Redis基础数据类型与基本使用
高级Redis应用进阶 一站式Redis解决方案-Redis-2 Redis基础数据类型与基本使用 源代码在GitHub - 629y/food-social-contact-parent: redis项目-美食社交APP 1. Redis基本数据类型 1.字符串(strings) set username zhangsan get username mset age 18 …...
python提取身份证中的生日和性别
1.代码 def sfzAnalysis(idNum):#检查身份证长度是否正确if len(idNum)!18:raise ValueError("身份证号码长度不正确,请输入一个18位的身份证号码。")#raise关键字在Python中有多种用途,主要涉及异常的抛出和错误处理#提取出生日期year idN…...
opencv 傅里叶变换(低通滤波 + 高通滤波)
文章目录 1、傅里叶变换2、通过numpy实现3、高通滤波器5、通过opencv实现傅里叶变换6、低通滤波器7、C实现傅里叶变换 1、傅里叶变换 时域分析:以时间作为参照物,世间万物都是随着时间变化而变化,并且不会停止 频域分析:认为世间万…...
Educational Codeforces Round 163 (Rated for Div. 2)(A,B,C,D,E)
比赛链接 好忙好忙好忙,慢慢补老比赛的题解了。 这场没啥算法,全是思维。有也是BFS,屎。 A. Special Characters 题意: 您将得到一个整数 n n n 。 您的任务是构建一串大写的拉丁字母。此字符串中必须正好有 n n n 个特殊字…...
索引常见面试题
面试中,MySQL 索引相关的问题基本都是一系列问题,都是先从索引的基本原理,再到索引的使用场景,比如: 索引底层使用了什么数据结构和算法?为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构?什…...
【Unity】旋转的尽头是使用四元数让物体旋转
// 导入必要的命名空间 using System.Collections; using System.Collections.Generic; using UnityEngine;// 创建一个名为 RotateObj 的 MonoBehaviour 类,该类可以附加到 Unity 中的游戏对象上并控制其行为 public class RotateObj : MonoBehaviour {// Update 函…...
哔哩哔哩秋招Java二面
前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 一面过后面试官叫我别走,然后就直接二面,二面比较简短,记录一下,希望可以…...
OSPF特殊区域(stub\nssa)
stub区域——只有1类、2类、3类;完全stub区域——只有1类、2类 NSSA区域:本区域将自己引入的外部路由发布给其他区域,但不需要接收其他区域的路由 在NSSA区域的路由器上,引入外部路由时,不会转换成5类LSA,…...
全球首位AI程序员诞生,将会对程序员的影响有多大?
随着全球首位AI程序员Devin的诞生,人工智能技术在编程领域的应用引发了广泛的讨论和思考。这一事件不仅标志着AI技术在软件开发领域的一大步进展,也引起了人们对未来编程职业发展的广泛关注。那么,AI程序员的出现究竟会对程序员的职业生涯产生…...
【晴问算法】提高篇—动态规划专题—最长上升子序列
题目描述 现有一个整数序列a1,a2,...,an,求最长的子序列(可以不连续),使得这个子序列中的元素是非递减的。输出该最大长度。 输入描述 第一行一个正整数n(1≤n≤100),表示序…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
