华为云云耀云服务器L实例评测|Docker版的Minio安装 Springboot项目中的使用 结合vue进行图片的存取

在这里插入图片描述

前言

最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,Redis被攻击的情况,教训是密码不能太简单。在使用服务器时,学习到很多运维相关的知识。

本篇博客介绍如何在Linux中安装minio,并且在spring中的使用,以及vue中的图片上传以及回显。

其他相关的华为云云耀云服务器L实例评测文章列表如下:

  • 初始化配置SSH连接 & 安装MySQL的docker镜像 & 安装redis以及主从搭建 & 7.2版本redis.conf配置文件

  • 安装Java8环境 & 配置环境变量 & spring项目部署 &【!】存在问题未解决

  • 部署spring项目端口开放问题的解决 & 服务器项目环境搭建MySQL,Redis,Minio…指南

  • 由于自己原因导致MySQL数据库被攻击 & MySQL的binlog日志文件的理解

  • 认识redis未授权访问漏洞 & 漏洞的部分复现 & 设置连接密码 & redis其他命令学习

  • 拉取创建canal镜像配置相关参数 & 搭建canal连接MySQL数据库 & spring项目应用canal初步

文章目录

  • 前言
  • 引出
  • 一、docker 版本的minio的安装和使用
    • 1.docker版本的安装
    • 2.端口开放
    • 3.浏览器访问控制台
    • 4.创建bucket并开放权限
    • 5.上传图片与访问
  • 二、spring项目的配置使用minio
    • 1.引入依赖
    • 2.配置文件
    • 3.写配置类
    • 4.写接口上传图片
    • 5.前端进行上传
    • 6.图片上传的路径处理
    • 7.图片的回显
  • 三、图片相关效果演示
  • 附录:前后端完整代码
    • 1.后端代码ervice
    • 2.前端vue代码
  • 总结

在这里插入图片描述

引出


1.docker版的minio的安装和使用;
2.在spring项目中使用minio作为图片存储的数据库;
3.结合vue用element-ui进行图片的上传与回显;

在这里插入图片描述
相关网址

Java Client API Reference 参考文档

官网

各个版本的minio

一、docker 版本的minio的安装和使用

1.docker版本的安装

执行下面命令,注意用户名和密码有要求

docker run -itd --name minio_9091 \
-p 9001:9000 -p 9091:9090 \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin123" \
e31e0721a96b server \
/data --console-address ":9090" -address ":9000"

在这里插入图片描述

查看运行日志

在这里插入图片描述

2.端口开放

在这里插入图片描述

3.浏览器访问控制台

http://124.70.138.34:9091/login

在这里插入图片描述

4.创建bucket并开放权限

创建bucket

在这里插入图片描述

公开访问权限

在这里插入图片描述

5.上传图片与访问

在这里插入图片描述

http://124.70.138.34:9000/hello/123.jpg

在这里插入图片描述

二、spring项目的配置使用minio

1.引入依赖

        <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version><!-- minio 依赖于 okhttp 且版本较高。注意,spring-boot-dependencies 中的不够高 --></dependency><!--        minio的依赖--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.9</version></dependency>

2.配置文件

在这里插入图片描述

# minio 文件存储配置信息,配置类引入
minio:endpoint: http://124.70.138.34:9000username: minioadminpassword: minioadmin# 图片的前缀配置,数据库存图片名称,前缀是ip+端口+buckets名字imgPrefix: http://124.70.138.34:9000/hello/

3.写配置类

写配置类,进行minio的配置

在这里插入图片描述

用户获取配置文件里的属性值

package com.tianju.fresh.config.minio;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "minio")public class MinioPro {// 如果用@Value("${}")只能一个一个获取private String endpoint;private String username;private String password;
}

生成 MinioClient客户端放到spring容器中

package com.tianju.fresh.config.minio;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 获取minio的客户端* (通过客户端,就可以创建通,上传图片这类。。。)*/@Configuration
@EnableConfigurationProperties(MinioPro.class)public class MinioConfig {@Autowiredprivate MinioPro minioPro;@Beanpublic MinioClient minioClient() throws Exception {return MinioClient.builder().endpoint(minioPro.getEndpoint()).credentials(minioPro.getUsername(), minioPro.getPassword()).build();}
}

4.写接口上传图片

在这里插入图片描述

package com.tianju.fresh.controller.api;import com.alibaba.fastjson.JSONObject;import com.tianju.fresh.Resp.dto.HttpResp;
import com.tianju.fresh.util.MinioUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api/img")
@Slf4j
public class ImagController {@Autowiredprivate MinioUtils minioUtils;@PostMapping("/upload")public HttpResp uploadImg(MultipartFile file){JSONObject jsonObject = null;try {jsonObject = minioUtils.uploadFile(file, "hello");} catch (Exception e) {throw new RuntimeException(e);}log.debug("uploadFile>>>>>"+jsonObject.toJSONString());return HttpResp.ok(jsonObject);}}

Minio的工具类

package com.tianju.fresh.util;import com.alibaba.fastjson.JSONObject;import com.tianju.fresh.config.minio.MinioPro;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;/*** 进行图片的上传*/
@Slf4j
@Component
public class MinioUtils {@Autowiredprivate MinioClient client;@Autowiredprivate MinioPro minioPro;/*** 创建bucket*/public void createBucket(String bucketName) {BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build();MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();try {if (client.bucketExists(bucketExistsArgs))return;client.makeBucket(makeBucketArgs);} catch (Exception e) {log.error("创建桶失败:{}", e.getMessage());throw new RuntimeException(e);}}/*** @param file       文件* @param bucketName 存储桶* @return*/public JSONObject uploadFile(MultipartFile file, String bucketName) throws Exception {JSONObject res = new JSONObject();res.put("code", 0);// 判断上传文件是否为空if (null == file || 0 == file.getSize()) {res.put("msg", "上传文件不能为空");return res;}// 判断存储桶是否存在createBucket(bucketName);// 文件名String originalFilename = file.getOriginalFilename();// 新的文件名 = 存储桶名称_时间戳.后缀名String fileName = bucketName + "_" + System.currentTimeMillis() +                              									originalFilename.substring(originalFilename.lastIndexOf("."));// 开始上传InputStream inputStream = file.getInputStream();PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream,inputStream.available(),-1).build();client.putObject(args);res.put("code", 1);res.put("msg", minioPro.getEndpoint() + "/" + bucketName + "/" + fileName);return res;}
}

5.前端进行上传

在这里插入图片描述

                  <el-form-item label="上传图片" label-width="120px"><div style="margin-left: 23px; display: inline-block; border: 1px solid #ccc; padding: 16px;"><el-upload class="avatar-uploader" action="/api/img/upload" :show-file-list="false":on-success="addGoodsUploadImgSuccess"><div class="avatar-container"><img v-if="goods.imgSrc" :src="goods.imgSrc" class="avatar" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></div></el-upload></div></el-form-item>
    // 图片上传成功,回调方法addGoodsUploadImgSuccess(res, file) {this.goods.imgSrc = res.results.msg// uploadFile>>>>>{"msg":"http://192.168.111.130:9000/hello/hello_1693810266596.jpg","code":1}console.log(res)},

6.图片上传的路径处理

在这里插入图片描述

7.图片的回显

在这里插入图片描述

三、图片相关效果演示

分页显示商品信息

在这里插入图片描述

修改商品信息,修改图片

在这里插入图片描述

修改成功,返回分页页面

在这里插入图片描述

新增商品进行图片上传

在这里插入图片描述

minio中的图片

在这里插入图片描述

修改后的数据库

在这里插入图片描述

附录:前后端完整代码

1.后端代码ervice

package com.tianju.fresh.service.goods.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tianju.fresh.Resp.dto.HttpResp;
import com.tianju.fresh.entity.goods.Goods;
import com.tianju.fresh.entity.goods.GoodsType;
import com.tianju.fresh.entity.goods.vo.GoodsManageVo;
import com.tianju.fresh.entity.page.FindGoods;
import com.tianju.fresh.entity.page.PageParam;
import com.tianju.fresh.mapper.goods.GoodsDao;
import com.tianju.fresh.mapper.goods.GoodsMapper;
import com.tianju.fresh.mapper.goods.GoodsTypeMapper;
import com.tianju.fresh.mapper.goods.UnitMapper;
import com.tianju.fresh.service.goods.IGoodsService;
import com.tianju.fresh.util.NoUtil;
import com.tianju.fresh.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.util.Date;
import java.util.List;@Service
public class GoodsServiceImpl implements IGoodsService {@Autowiredprivate GoodsDao goodsDao;@Autowiredprivate GoodsMapper goodsMapper;@Autowiredprivate RedisUtil redisUtil;@Autowiredprivate GoodsTypeMapper typeMapper;@Autowiredprivate UnitMapper unitMapper;@Value("${minio.imgPrefix}")private String imgPrefix;@Overridepublic HttpResp findPageGoodsInfo(PageParam<FindGoods> param) {PageHelper.startPage(param.getPageNum(), param.getPageSize());FindGoods pa = param.getParam();if (StringUtils.isNotBlank(pa.getGoodsNo())){pa.setGoodsNo("%"+pa.getGoodsNo()+"%");}if (StringUtils.isNotBlank(pa.getName())){pa.setName("%"+pa.getName()+"%");}List<GoodsManageVo> list = goodsDao.findGoodsBy(pa.getName(),pa.getGoodsNo(),pa.getType(), pa.getUnit(), pa.getSupplier(),pa.getStatus(), pa.getPrice() + "", pa.getStock(), pa.getLevel());// 图片的连接地址拼出来list.forEach(g->{g.setImg(imgPrefix+g.getImg());});PageInfo pageInfo = new PageInfo(list);return HttpResp.ok(pageInfo);}@Overridepublic HttpResp addGoodsInfo(Goods goods) {// 生成商品的编号// TODO:这个根据id查类型能不能放到redis里面,已完成QueryWrapper<GoodsType> queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", goods.getTypeId());GoodsType goodsType = typeMapper.selectOne(queryWrapper);String goodsNo = goodsType.getPrefix() + NoUtil.getDateRandNo();// 设置图片名称goods.setImgSrc(dealImgSrc(goods));// 设置商品的编号,创建时间,修改时间等goods.setGoodsNo(goodsNo);goods.setCreateTime(new Date());goods.setUpdateTime(new Date());goodsMapper.insert(goods);return HttpResp.ok(goods);}/*** 处理修改和新增商品时图片名字的问题,* @param goods 新增或者修改的商品对象* @return 输出:hello_1695026372539.png*/private String dealImgSrc(Goods goods){// http://124.70.138.34:9000/hello/hello_1695027224400.pngString imgName = "";// 处理图片的问题if (StringUtils.isNotBlank(goods.getImgSrc())){int lastIndex = goods.getImgSrc().lastIndexOf("/");if (lastIndex != -1) {imgName = goods.getImgSrc().substring(lastIndex + 1);}}return imgName;}@Overridepublic HttpResp<Goods> findById(Integer id) {QueryWrapper<Goods> queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);Goods goods = goodsMapper.selectOne(queryWrapper);goods.setImgSrc(imgPrefix+goods.getImgSrc());return HttpResp.ok(goods);}@Overridepublic HttpResp updateById(Goods goods) {Goods goodsDB = findById(goods.getId()).getResults();if (!goodsDB.getLevel().equals(goods.getLevel())){return HttpResp.fail("失败,不能修改商品级别");}goods.setUpdateTime(new Date());// 处理图片名称的问题goods.setImgSrc(dealImgSrc(goods));goodsMapper.updateById(goods);goodsDB = findById(goods.getId()).getResults();return HttpResp.ok(goodsDB);}@Overridepublic HttpResp findAll() {List<Goods> goods = goodsMapper.selectList(null);return HttpResp.ok(goods);}}

2.前端vue代码

<template><div class="text item"><el-row><el-col :span="24"><!-- 查询条件列表 --><div style="margin-left: 35px; display: inline-block;"><el-form :inline="true" ref="form" label-width="100px"><el-form-item label="商品名称"><el-input v-model="query.name" clearable style="width: 221px;margin-right:20px;margin-left:6px"></el-input></el-form-item><el-form-item label="商品编号"><el-input v-model="query.goodsNo" clearablestyle="width: 221px;margin-right:19px;margin-left:6px"></el-input></el-form-item><el-form-item label="商品类型" clearable style="width: px;margin-right:px;margin-left:6px"><el-select v-model="query.type" placeholder="请选择"><el-option v-for="item in data.results.type" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品单位" clearable style="width: px;margin-right:30px;margin-left:6px"><el-select v-model="query.unit" placeholder="请选择商品单位"><el-option v-for="item in data.results.unit" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品供应商" clearable style="width: px;margin-right:30px;margin-left:6px"><el-select v-model="query.supplier" placeholder="请选择"><el-option v-for="item in data.results.supplier" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品状态" clearable style="width: px;margin-right:px;margin-left:6px"><el-select v-model="query.status" placeholder="请选择"><el-option v-for="item in data.results.status" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品售价≥"><el-input v-model="query.price" clearable style="width: 221px;margin-right:18px;margin-left:6px"></el-input></el-form-item><el-form-item label="商品库存≥"><el-input v-model="query.stock" clearable style="width: 221px;margin-right:21px;margin-left:6px"></el-input></el-form-item><el-form-item label="商品级别" clearable style="width:px;margin-right:px;margin-left:6px"><el-select v-model="query.level" placeholder="请选择"><el-option v-for="item in data.results.level" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" @click=" queryPage()">查 询</el-button></el-form-item><el-form-item><el-button type="warning" icon=" el-icon-refresh-left" @click="resetQuery()">清 空</el-button></el-form-item><div style="margin-left:845px"></div></el-form><el-button type="primary" icon=" el-icon-circle-plus" @click="open()">添加商品</el-button><div class="table-container"><!-- 商品展示列表 --><el-table :data="tableData" style="width: 150"><el-table-column prop="name" label="商品名称" width="180"></el-table-column><el-table-column prop="type" label="类别" width="80"></el-table-column><el-table-column prop="goodsNo" label="商品编号" width="240"></el-table-column><el-table-column prop="lossRate" label="损耗率" width="80"></el-table-column><el-table-column prop="nums" label="当前库存" width="80"></el-table-column><el-table-column prop="unit" label="单位" width="90"></el-table-column><el-table-column prop="level" label="成/次品" width="80"><template slot-scope="scope"><span v-if="scope.row.level == '0'" style="color: rgb(31, 228, 126);">成品</span><span v-if="scope.row.level == '1'" style="color: rgb(229, 73, 52);">次品</span></template></el-table-column><el-table-column prop="price" label="商品售价" width="80"></el-table-column><el-table-column prop="supplier" label="供应商" width="250"></el-table-column><el-table-column prop="img" label="图片" width="90"><template slot-scope="scope"><img :src=scope.row.img style="width: 50%;"></template></el-table-column><el-table-column label="操作" width="250"><template slot-scope="scope"><el-button type="danger" style="background-color:red;border: none">删除</el-button><el-button type="warning" @click="queryGoodsById(scope.row.id)"style="background-color:rgb(255, 179, 0);border: none">编辑</el-button><el-button type="danger" style="background-color:rgb(224, 69, 66);border: none">停用</el-button></template></el-table-column></el-table></div><!-- 新增商品弹窗 ******* --><el-dialog title="新增商品" :visible.sync="b"><el-form><el-row><el-col :span="12"><el-form-item label="商品名称" clearable :label-width="formLabelWidth"><el-input v-model="goods.name"></el-input></el-form-item><el-form-item label="商品单位" clearable><el-select v-model="goods.unitId" placeholder="请选择商品单位"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.unit" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品类型" clearable><el-select v-model="goods.typeId" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.type" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品供应商" clearable><el-select v-model="goods.supplierId" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.supplier" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品描述" :label-width="formLabelWidth"><el-input type="textarea" :rows="4"v-model="goods.detail" autocomplete="off"></el-input></el-form-item><el-form-item label="商品价格" :label-width="formLabelWidth"><el-input v-model="goods.price" autocomplete="off"></el-input></el-form-item><el-form-item label="库存上限" :label-width="formLabelWidth"><el-input v-model="goods.stockUp" autocomplete="off"></el-input></el-form-item><el-form-item label="库存下限" :label-width="formLabelWidth"><el-input v-model="goods.stockLo" autocomplete="off"></el-input></el-form-item><el-form-item label="商品级别" clearable><el-select v-model="goods.level" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.level" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="上传图片" label-width="120px"><div style="margin-left: 23px; display: inline-block; border: 1px solid #ccc; padding: 16px;"><el-upload class="avatar-uploader" action="/api/img/upload" :show-file-list="false":on-success="addGoodsUploadImgSuccess"><div class="avatar-container"><img v-if="goods.imgSrc" :src="goods.imgSrc" class="avatar" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></div></el-upload></div></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button @click="b = false">取 消</el-button><el-button type="primary" @click="addGoods()">确 定</el-button></div></el-dialog><!-- 修改商品弹窗 ###################### --><el-dialog title="修改商品" :visible.sync="c"><el-form><el-row><el-col :span="12"><el-form-item label="商品名称" clearable :label-width="formLabelWidth"><el-input v-model="queryGoods.name"></el-input></el-form-item><el-form-item label="商品单位" clearable><el-select v-model="queryGoods.unitId" placeholder="请选择商品单位"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.unit" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品类型" clearable><el-select v-model="queryGoods.typeId" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.type" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品供应商" clearable><el-select v-model="queryGoods.supplierId" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.supplier" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="商品描述" :label-width="formLabelWidth"><el-input type="textarea" :rows="4" v-model="queryGoods.detail" autocomplete="off"></el-input></el-form-item><el-form-item label="商品价格" :label-width="formLabelWidth"><el-input v-model="queryGoods.price" autocomplete="off"></el-input></el-form-item><el-form-item label="库存上限" :label-width="formLabelWidth"><el-input v-model="queryGoods.stockUp" autocomplete="off"></el-input></el-form-item><el-form-item label="库存下限" :label-width="formLabelWidth"><el-input v-model="queryGoods.stockLo" autocomplete="off"></el-input></el-form-item><el-form-item label="商品级别" clearable><el-select v-model="queryGoods.level" placeholder="请选择"style="width: 355px;margin-right:px;margin-left:px"><el-option v-for="item in data.results.level" :key="item.value" :label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item label="更换图片" label-width="100px"><el-upload class="avatar-uploader" action="/api/img/upload" :show-file-list="false":on-success="updateGoodsUploadImgSuccess"><div style="width: 40%;"><img v-if="queryGoods.imgSrc" :src="queryGoods.imgSrc" class="avatar" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></div></el-upload></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button @click="c = false">取 消</el-button><el-button type="primary" @click="updateGoods()">确 定</el-button></div></el-dialog></div></el-col></el-row><el-row><el-col :span="24"><!-- 放分页部分 --><!-- :page-size="100" 指定每页多少条,默认10条--><el-pagination background :page-sizes="[3, 5, 10]" :page-size="pageSize" :current-page="pageNum"layout="sizes,total,prev, pager, next" :total="total" @next-click="nextpage" @prev-click="prevpage"@size-change="sizePage" @current-change="currentPage"></el-pagination></el-col></el-row></div>
</template><script>
export default {data() {return {// formLabelWidth: '120px',goods: {name: '',unitId: '',typeId: '',supplierId: '',detail: '',price: '',stockUp: '',stockLo: '',level: '',imgSrc: ''},// 根据id查出来的商品i: '1',// 查询商品的条件queryGoods: {name: '',unitId: '',typeId: '',supplierId: '',detail: '',price: '',stockUp: '',stockLo: '',level: '',imgSrc: ''},// 新增商品弹窗控制变量b: false,// 修改商品弹窗控制变量c: false,tableData: [],pageSize: 5,pageNum: 1,total: 0,// common的数据data: {"results": {"unit": [{ "value": "1", "label": "千克" }],"level": [{ "value": "0", "label": "成品" },{ "value": "1", "label": "次品" }],"supplier": [{ "value": "1", "label": "南京总部基地供应总店" },],"type": [{"label": "2", "value": "新鲜水果/苹果"},],"status": [{ "value": "0", "label": "正常" },]}},// 多条件查询的查询条件query: {// name: '', goodsNo: '', price: '', stock: '', supplier: '', unit: '', status: '', level: '', type: '' "name": "", "goodsNo": "", "type": "", "unit": "", "supplier": "", "status": "", "price": "", "stock": "", "level": ""},formLabelWidth: '100px',}},methods: {// 图片上传成功,回调方法addGoodsUploadImgSuccess(res, file) {this.goods.imgSrc = res.results.msg// uploadFile>>>>>{"msg":"http://192.168.111.130:9000/hello/hello_1693810266596.jpg","code":1}console.log(res)},updateGoodsUploadImgSuccess(res, file) {this.queryGoods.imgSrc = res.results.msg// uploadFile>>>>>{"msg":"http://192.168.111.130:9000/hello/hello_1693810266596.jpg","code":1}console.log(res)},queryAllMenu() {this.$axios.get('api/common/goodsCommon').then(res => {console.log(res.data)if (res.data.resultCode.code == 20000) {this.data = res.data}})},queryPage() {let param = {}param.pageNum = this.pageNum;param.pageSize = this.pageSize;param.param = this.querythis.$axios.post('api/goods/mange/findPage', param).then(res => {if (res.data.resultCode.code == 20000) {console.log(res.data.results.list)this.tableData = res.data.results.list;this.total = res.data.results.total;this.pageNum = res.data.results.pageNum;this.pageSize = res.data.results.pageSize;}})},addGoods() {this.b = falsethis.$axios.post('api/goods/mange/add', this.goods).then(res => {if (res.data.resultCode.code == 20000) {this.queryPage();alert('添加成功')}})},updateGoods() {this.c = falsethis.$axios.put('api/goods/mange/update', this.queryGoods).then(res => {if (res.data.resultCode.code == 20000) {this.queryPage();alert('修改成功')} else {this.queryPage();alert(res.data.results)}})},queryGoodsById(val) {this.c = truethis.$axios.get("/api/goods/mange/findById?id=" + val).then(res => {console.log(res.data)if (res.data.resultCode.code == 20000) {this.queryGoods = res.data.results.resultsconsole.log(this.queryGoods)this.queryGoods.typeId = this.queryGoods.typeId.toString();this.queryGoods.unitId = this.queryGoods.unitId.toString();this.queryGoods.level = this.queryGoods.level.toString();this.queryGoods.supplierId = this.queryGoods.supplierId.toString();}})},open() {this.b = true},resetQuery() { // 定义重置查询对象的方法this.query = {name: '',goodsNo: '',price: '',stock: '',supplier: '',unit: '',status: '',level: '',type: '',}this.queryPage()},prevpage(val) {//上一页this.pageNum = val;this.queryPage();},nextpage(val) {this.pageNum = val;//下一页this.queryPage();},sizePage(val) {//每页多少条改变时触发this.pageSize = val;this.pageNum = 1;this.queryPage();},//跳转currentPage(val) {this.pageNum = val;this.queryPage();},handleAvatarSuccess(res, flie) {// 上传图片回显this.goods.imageUrl = res.msg},},created() {this.queryPage()this.queryAllMenu();}
}
</script><style scoped>
.avatar-container {position: relative;width: 100px;height: 100px;
}.avatar {width: 100%;height: 100%;object-fit: cover;
}.avatar-uploader-icon {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);font-size: 28px;color: #999;
}.table-container {border: 0px solid #ccc;border-radius: 1px;overflow: hidden;
}.el-table .el-table__row {border-bottom: 1px solid #ccc;
}.el-table .el-table__column:not(:last-child) {border-right: 1px solid #ccc;
}
</style>

总结

1.docker版的minio的安装和使用;
2.在spring项目中使用minio作为图片存储的数据库;
3.结合vue用element-ui进行图片的上传与回显;

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

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

相关文章

vue element 搜索框根据后台的接口实现模糊查询 + 分页特殊处理+重置表格

模糊查询效果图 1.配置接口 search: "/api/goods/search", //搜索接口/goods/search 2.get接口 search(params) { return axios.get(base.search, { params });//后台传参 再写这个params }, 3.异步请求接口 // 搜索接口async search(search){let res await this…

大模型的最大bug,回答正确率几乎为零,GPT到Llama无一幸免

目录 前言 1.名字和描述颠倒一下&#xff0c;大模型就糊涂了 2.实验及结果 3.未来展望 前言 大模型的逻辑&#xff1f;不存在的。 我让 GPT-3 和 Llama 学会一个简单的知识&#xff1a;A 就是 B&#xff0c;然后反过来问 B 是什么&#xff0c;结果发现 AI 回答的正确率竟然是…

**20.迭代器模式(Iterator)

意图&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 上下文&#xff1a;集合对象内部结构常常变化各异。对于这些集合对象&#xff0c;能否在不暴露其内部结构的同时&#xff0c;让外部Client透明地访问其中包含的元素…

github 网页显示不全?

问题 解决 1、检查网页&#xff0c;打开 network&#xff0c;重新刷新 github 网页 2、查看无法加载的资源&#xff08;如 css 文件&#xff09; 3、查看域名地址 https://tool.chinaz.com/dns/&#xff0c;github.githubassets.com&#xff08;检查网页元素&#xff0c;点击无…

文件系统详解

目录 文件系统&#xff08;1&#xff09; 第一节文件系统的基本概念 一、文件系统的任务 二、文件的存储介质及存储方式 三、文件的分类 第二节 文件的逻辑结构和物理结构 一、文件的逻辑结构 二、文件的物理结构 文件系统&#xff08;2&#xff09; 第三节 文件目…

uniapp webview实现双向通信

需求&#xff1a;uniapp webview嵌套一个h5 实现双向通信 uniapp 代码 <template><view><web-view src"http://192.168.3.150:9003/" message"onMessage"></web-view></view> </template><script>export defau…

前端uniapp如何转base64使用uniapp插件市场

插件市场 网址 使用 可以下载&#xff0c;也可以引用&#xff0c;我是下载下来的引用 代码 正常使用 pathToBase64(img).then(path > {img pathresolve(path)}).catch(error > {console.error(error)reject(error)})使用出现[object Promise]错误 解决方法 let img …

程序运行时增加语音提示

目录 前言 一、认识SAPI 二、使用方法 三、测试效果​编辑 总结 前言 在测试过程中为了更高效的提示操作者&#xff0c;在程序执行时增加语音提醒会方便很多&#xff0c;利用微软的SAPI可以很方便的在程序有问题时提示操作者。 一、认识SAPI SpVoice类是支持语音合成(TTS)的核…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

基于springboot+vue的入校申报审批系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…

C语言每日一题(10):无人生还

文章主题&#xff1a;无人生还&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&#x1f…

全套配置细节:缺省路由实验配置

1、实验目的 掌握默认路由的适用场合和配置方法 2、实验拓扑 默认路由的配置 3、实验步骤 &#xff08;1&#xff09;配置网络连通性如下。 1&#xff09;R1 的配置如下 &#xff1a; <Huawei>system-view Enter system view, return user view with CtrlZ. [Huaw…

网络安全——(黑客)自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01;&#xff01;&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队…

Xshell工具连接本地虚拟机Linux系统

你知道的越多&#xff0c;你不知道的越多&#xff1b;本文仅做记录&#xff0c;方便以后备阅。希望也能帮到正在看这篇文章的你。 使用Xshell工具连接Linux系统具有方便&#xff0c;易于操作等诸多特点。对于Xshell的介绍&#xff0c;我就不详细说了。我相信百度百科上的介绍更…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

算法基础之差分和前缀和

差分 差分介绍 结论&#xff1a;差分是前缀和的逆运算 举例 一维差分 //一维前缀和 a[i]部分就是一维差分数组 s[i] s[i-1]a[i]; //一维差分 a[i] s[i]-s[i-1];二维差分 //二维前缀和 a[i][j]部分就是一维差分数组 s[i][j] s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; //二…

Python四大数据结构整理

Python四大数据结构整理 列表列表本身的基础造作操作列表的增删改查列表总结 字典字典的创建获取字典视图遍历字典字典生成式 元组与集合元组的创建元组的获取集合集合的创建方式集合的相关操作 对比归纳总结 列表 列表的特点   1.列表元素按顺序有序排放   2.索引映射唯一…

2023-09-19 LeetCode每日一题(打家劫舍 IV)

2023-09-19每日一题 一、题目编号 2560. 打家劫舍 IV二、题目链接 点击跳转到题目位置 三、题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取…

基于微信小程序的宠物交易商城系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…