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

静态资源配置

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

注意事项

1、D:\qr_code_duct\qr_code_back\images\ 这个路径一定要是项目下的路径,不然静态资源配置将会找不到。

2、D:\qr_code_duct\qr_code_back\images\这个路径最后结束一定要加\ ,不然资源也会找不到。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于 Spring BootVue.js 的前后端分离项目的步骤: 1. 创建 Spring Boot 项目 可以使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择需要的依赖,例如 Spring Web、Spring Data JPA、MySQL 等。创建后,可以在 IDE 中打开该项目并运行,以确保项目可以正常启动。 2. 创建 Vue.js 项目 使用 Vue CLI 创建一个新的 Vue.js 项目,选择需要的配置,例如使用 Babel、ESLint 等。创建后,可以在命令行中进入该项目并运行 `npm run serve` 命令,以启动开发服务器并在浏览器中查看项目。 3. 配置跨域 在 Spring Boot 项目中,需要配置跨域支持,以便于 Vue.js 项目可以访问后端 API 接口。可以使用 `@CrossOrigin` 注解或在配置类中添加 `CorsFilter` 过滤器来实现跨域。 4. 编写 API 接口 在 Spring Boot 项目中,编写 API 接口,提供后端服务。可以使用 Spring MVC 框架来编写控制器,并使用 Spring Data JPA 或其他 ORM 框架来操作数据库。 5. 编写前端页面 在 Vue.js 项目中,编写前端页面,访问后端 API 接口,获取数据并显示。可以使用 Vue.js 的组件、路由、状态管理等功能来实现页面的功能和交互。 6. 打包部署 完成开发后,需要将前端代码打包为静态文件,并将其放置在 Spring Boot 项目中的静态资源目录中。然后可以使用 Maven 或 Gradle 等工具将整个项目打包为可执行的 Jar 或 War 文件,并部署到服务器上。 以上就是基于 Spring BootVue.js 的前后端分离项目的步骤,需要注意的是,前后端分离开发需要进行良好的协作和沟通,确保接口的正确性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值