分布式文件系统 SpringBoot+FastDFS+Vue.js【二】

分布式文件系统 SpringBoot+FastDFS+Vue.js【二】

  • 六、实现上传功能并展示数据
    • 6.1.创建数据库
    • 6.2.创建spring boot项目fastDFS-java
    • 6.3.引入依赖
    • 6.3.fastdfs-client配置文件
    • 6.4.跨域配置GlobalCrosConfig.java
    • 6.5.创建模型--实体类
      • 6.5.1.FastDfsFile.java
      • 6.5.2.FastDfsFileType.java
      • 6.5.3.PageBean.java
      • 6.5.4.R.java
      • 6.5.5.Result.java
    • 6.6.创建application.yml
    • 6.7.创建Service
      • 6.7.1.FastDfsFileService
      • 6.7.2.FastDfsFileServiceImpl
      • 6.7.3.FastDfsFileTypeService
      • 6.7.4.FastDfsFileTypeServiceImpl
    • 6.8.创建Mapper
      • 6.8.1.FastDfsFileMapper
      • 6.8.2.FastDfsFileMapper.xml
      • 6.8.3.FastDfsFileTypeMapper
      • 6.8.4.FastDfsFileTypeMapper.xml
    • 6.9.创建fastDFS客户端
    • 6.10.创建全局异常处理器
    • 6.11.创建Controller
    • 6.13.创建vue2项目
    • 6.14.安装相关模块
    • 6.15.main.js
    • 6.16.src/router/index.js
    • 6.17.src/utils/request.js
    • 6.18.src/api/fastdfs/fast.js
    • 6.19.上传图片页面fastdfsuploadimg.vue
    • 6.20.图片管理页面fastdfsimg.vue
    • 6.21.效果演示
  • endl

六、实现上传功能并展示数据

在这里插入图片描述

6.1.创建数据库

CREATE DATABASE IF NOT EXISTS fastdfs CHARACTER SET utf8mb4;

show databases;

USE fastdfs;

CREATE TABLE `fast_dfs_file` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
  `file_id` varchar(200) NOT NULL COMMENT '文件的fileId',
  `file_path` varchar(200) NOT NULL COMMENT '文件路径',
  `file_size` bigint(25) NOT NULL COMMENT '文件大小',
  `file_name` varchar(25) NOT NULL COMMENT '文件名',
  `ext` varchar(30) NOT NULL COMMENT '文件的扩展名,不包含(.)',
  `file_type` varchar(50) NOT NULL COMMENT '文件类型',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '最后修改时间'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='文件表';

CREATE TABLE `fast_dfs_file_type` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
  `file_type` varchar(50) NOT NULL COMMENT '文件类型',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '最后修改时间'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='文件类型表';

insert into fast_dfs_file_type(file_type)values('image/jpeg'),('image/png'),('image/jpg');

6.2.创建spring boot项目fastDFS-java

6.3.引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/>
    </parent>

    <groupId>com.orange</groupId>
    <artifactId>fastDFS-java</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--fastdfs-client-java依赖需要自己手动打包上传到本地仓库-->
        <dependency>
            <groupId>org.csource</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.31-SNAPSHOT</version>
        </dependency>

        <!--mybatis起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--springboot单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--pagehelper分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!--json处理器-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <!--fastJson是一个JSON的处理工具包,由阿里巴巴公司研发推出。我们使用它将List或者Map转换成JSON对象-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!--shiro安全依赖包-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>

    </dependencies>

    <build>
        <!--项目打包时会将Java目录中的*.xml文件也进行打包-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

6.3.fastdfs-client配置文件

## fastdfs-client.properties

#fastDFS连接超时时间,针对socket套接字函数connect
connect_timeout_in_seconds = 5
#fastDFS网络超时时间
network_timeout_in_seconds = 30

#编码格式
charset = UTF-8

#是否启用token验证(针对fdfs配置文件/etc/fdfs/http.conf,防盗链)
http_anti_steal_token = false
#连接密钥(http.conf要配置一样的密钥)
http_secret_key = FastDFS1234567890
#tracker服务器访问端口
http_tracker_http_port = 80

#tracker服务器地址,多个以逗号隔开
fastdfs.tracker_servers = 192.168.229.141:22122

6.4.跨域配置GlobalCrosConfig.java

/**
 * 跨域配置文件
 **/
@Configuration
public class GlobalCrosConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")// 对所有路径应用跨域配置,所有的当前站点的请求地址,都支持跨域访问。
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedHeaders("*")
                .allowedMethods("POST", "GET", "HEAD", "PUT", "OPTIONS", "DELETE")
                .allowedOriginPatterns("*")// 所有的外部域都可跨域访问。
                // 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
                .maxAge(3600);// 超时时长设置为1小时。 时间单位是秒。
    }
}

/*
@Configuration
public class GlobalCrosConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")    //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置
                        //.allowedOrigins("*")    //开放哪些ip、端口、域名的访问权限
                        .allowedOriginPatterns("*")    //开放哪些ip、端口、域名的访问权限
                        .allowCredentials(true)  //是否允许发送Cookie信息
                        .allowedMethods("GET", "POST", "PUT", "DELETE")     //开放哪些Http方法,允许跨域访问
                        .allowedHeaders("*")     //允许HTTP请求中的携带哪些Header信息
                        .exposedHeaders("*");   //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
            }
        };
    }
}*/

6.5.创建模型–实体类

6.5.1.FastDfsFile.java

/**
 * 文件类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Repository
public class FastDfsFile {
    private Long id;
    private String fileId;//文件的fileId
    private String filePath;//文件路径
    private Long fileSize;//文件大小
    private String fileName;//文件名
    private String ext;//文件的扩展名,不包含(.)
    private String fileType;//文件类型
    private LocalDateTime createTime; //创建时间
    private LocalDateTime updateTime; //修改时间
}

6.5.2.FastDfsFileType.java

/**
 * 文件类型表
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Repository
public class FastDfsFileType {
    private Long id;
    private String fileType;//文件类型
    private LocalDateTime createTime; //创建时间
    private LocalDateTime updateTime; //修改时间
}

6.5.3.PageBean.java

/**
 * 分页查询结果的封装类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean<T> {
    //当前页数
    private int currPageNo;

    //每页显示的记录数
    private int pageSize;

    //总记录数
    private int totalCount;

    //总页数=总条数/每页显示的条数
    private int totalPage;

    //每页的显示的数据
    private List<T> lists;
}

6.5.4.R.java

@Data
@Accessors(chain = true) //对R进行链式操作
public class R {

    private Integer code;//响应码
    private String message;//响应消息
    private Map<String,Object> data=new HashMap<>();

    public static R ok(){
        R r = new R();
        r.setCode(0);
        r.setMessage("成功");
        return r;
    }

    public static R error(){
        R r = new R();
        r.setCode(-1);
        r.setMessage("失败");
        return r;
    }

    public R data(String key,Object value){

        this.data.put(key, value);

        return this;
    }
}

6.5.5.Result.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应信息 描述字符串
    private Object data; //返回的数据

    //增删改 成功响应
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

6.6.创建application.yml

server:
  port: 9090

#Mybatis配置
mybatis:
  configuration: #sql日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #驼峰命名
    map-underscore-to-camel-case: true
  mapper-locations: classpath:com/orange/fastdfs/mapper/*.xml

#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

spring:
  #数据库连接信息
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.229.141:3306/fastdfs?characterEncoding=utf-8&&useSSL=false
    username: root
    password: 123456
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
# 文件上传的配置
# linux临时文件目录
# mkdir -p /data/tmp/updatefile
  servlet:
    multipart:
      location: /data/tmp/updatefile
      max-file-size: 10MB
      max-request-size: 10MB

6.7.创建Service

6.7.1.FastDfsFileService

public interface FastDfsFileService {
    void save(FastDfsFile fastDfsFile);

    void updateById(FastDfsFile fastDfsFile);

    FastDfsFile selectById(Long id);

    Long selectByFileId(String fileId);

    int deleteFastDfsFileById(Long id);

    List<FastDfsFile> selectAll();

    PageBean<FastDfsFile> findFastDfsFileByPage(int currPageNo, int pageSize);
}

6.7.2.FastDfsFileServiceImpl

@Service
public class FastDfsFileServiceImpl implements FastDfsFileService {

    @Resource
    private FastDfsFileMapper fastDfsFileMapper;

    /**
     * 存储数据
     *
     * @param fastDfsFile
     */
    @Override
    public void save(FastDfsFile fastDfsFile) {
        fastDfsFileMapper.insert(fastDfsFile);
    }

    @Override
    public void updateById(FastDfsFile fastDfsFile) {
        fastDfsFileMapper.updateById(fastDfsFile);
    }

    @Override
    public FastDfsFile selectById(Long id) {
        return fastDfsFileMapper.selectById(id);
    }

    /**
     * 根据fileId查询id
     *
     * @param fileId
     * @return
     */
    @Override
    public Long selectByFileId(String fileId) {
        return fastDfsFileMapper.selectByFileId(fileId);
    }

    /**
     * 根据id删除
     *
     * @param id
     * @return
     */
    @Override
    public int deleteFastDfsFileById(Long id) {
        return fastDfsFileMapper.deleteById(id);
    }

    /**
     * 查询所有
     *
     * @return
     */
    @Override
    public List<FastDfsFile> selectAll() {
        return fastDfsFileMapper.selectAll();
    }

    @Override
    public PageBean<FastDfsFile> findFastDfsFileByPage(int currPageNo, int pageSize) {
        PageBean<FastDfsFile> pageBean = new PageBean<>();

        //封装当前页数
        pageBean.setCurrPageNo(currPageNo);
        //每页显示的条数
        pageBean.setPageSize(pageSize);
        //总记录数
        int totalCount = fastDfsFileMapper.selectCount();
        pageBean.setTotalCount(totalCount);
        //总页数=总条数/每页显示的条数
        Double num = Math.ceil(totalCount / pageSize);
        int totalPage = num.intValue();
        pageBean.setTotalPage(totalPage);

        int offset = (currPageNo - 1) * pageSize;
        int limit = pageBean.getPageSize();
        //封装每页显示的数据
        List<FastDfsFile> list = fastDfsFileMapper.findeByPage(offset, limit);
        pageBean.setLists(list);

        return pageBean;
    }
}

6.7.3.FastDfsFileTypeService

public interface FastDfsFileTypeService {
    int selectByFileType(String fileType);
}

6.7.4.FastDfsFileTypeServiceImpl

@Service
public class FastDfsFileTypeServiceImpl implements FastDfsFileTypeService {

    @Resource
    private FastDfsFileTypeMapper fastDfsFileTypeMapper;

    @Override
    public int selectByFileType(String fileType) {
        return fastDfsFileTypeMapper.select(fileType);
    }
}

6.8.创建Mapper

6.8.1.FastDfsFileMapper

@Mapper
public interface FastDfsFileMapper {
    void insert(FastDfsFile fastDfsFile);

    Long selectByFileId(String fileId);

    int deleteById(Long id);

    List<FastDfsFile> selectAll();

    int selectCount();

    List<FastDfsFile> findeByPage(int offset, int limit);

    void updateById(FastDfsFile fastDfsFile);

    FastDfsFile selectById(Long id);
}

6.8.2.FastDfsFileMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.orange.fastdfsjava.mapper.FastDfsFileMapper">

    <insert id="insert" parameterType="com.orange.fastdfsjava.pojo.FastDfsFile">
        insert into fast_dfs_file
        (file_id, file_path, file_size, ext, file_name, file_type, create_time, update_time)
        values (#{fileId}, #{filePath}, #{fileSize}, #{ext}, #{fileName}, #{fileType}, #{createTime}, #{updateTime})
    </insert>

    <update id="updateById">
        update fast_dfs_file
        set file_id     = #{fileId},
            file_path   = #{filePath},
            file_size   = #{fileSize},
            ext         = #{ext},
            file_name   = #{fileName},
            file_type   = #{fileType},
            create_time = #{createTime},
            update_time = #{updateTime}
        where id = #{id}
    </update>

    <delete id="deleteById">
        delete
        from fast_dfs_file
        where id = #{id}
    </delete>

    <select id="selectByFileId" resultType="java.lang.Long">
        select id
        from fast_dfs_file
        where file_id = #{fileId}
    </select>

    <select id="selectAll" resultType="com.orange.fastdfsjava.pojo.FastDfsFile">
        select *
        from fast_dfs_file
    </select>

    <select id="selectCount" resultType="java.lang.Integer">
        select count(*)
        from fast_dfs_file
    </select>

    <select id="findeByPage" resultType="com.orange.fastdfsjava.pojo.FastDfsFile">
        select *
        from fast_dfs_file limit #{offset},#{limit}
    </select>

    <select id="selectById" resultType="com.orange.fastdfsjava.pojo.FastDfsFile">
        select *
        from fast_dfs_file
        where id = #{id}
    </select>

</mapper>

6.8.3.FastDfsFileTypeMapper

@Mapper
public interface FastDfsFileTypeMapper {
    int select(String fileType);
}

6.8.4.FastDfsFileTypeMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.orange.fastdfsjava.mapper.FastDfsFileTypeMapper">

    <select id="select" resultType="java.lang.Integer">
        select count(*)
        from fast_dfs_file_type
        where file_type = #{fileType}
    </select>
</mapper>

6.9.创建fastDFS客户端

@Slf4j
public class FastDFSClient {

    static {
        //加载fastDFS客户端的配置文件
        try {
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            log.info("network_timeout = {} ms", ClientGlobal.g_network_timeout);
            log.info("charset= {}", ClientGlobal.g_charset);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文件
     * @param file
     * @param fastDFSFile
     * @return
     * @throws IOException
     */
    public static FastDfsFile upload(MultipartFile file, FastDfsFile fastDFSFile) throws IOException {
        byte[] file_buff = null;
        //把文件转成输入流
        InputStream inputStream = file.getInputStream();
        if (inputStream != null) {
            //获取输入流中可读取的数据大小
            int len = inputStream.available();
            //创建足够大的缓冲区
            file_buff = new byte[len];
            //一次性把输入流中的数据全都读入到缓冲区file_buff,那file_buff就要足够大,占用内存也会很大
            inputStream.read(file_buff);
        }
        //关闭输入流
        inputStream.close();

        //通过fastDSF的client代码访问tracker和storage
        try {
            //创建tracker的客户端
            TrackerClient trackerClient = new TrackerClient(ClientGlobal.getG_tracker_group());
            //通过TrackerClient对象获取TrackerServer信息
            TrackerServer trackerServer = trackerClient.getTrackerServer();
            StorageServer storageServer = null;

            //定义storage的客户端,建立与Storage服务器的连接
            StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);

            //文件元信息
            NameValuePair[] metaList = new NameValuePair[1];
            metaList[0] = new NameValuePair("fileName", fastDFSFile.getFileName());

            //执行上传
            String fileId = storageClient.upload_file1(file_buff, fastDFSFile.getExt(), metaList);
            log.info("upload success. file id is: {}", fileId);
            fastDFSFile.setFileId(fileId);
            fastDFSFile.setFilePath(fileId);
            fastDFSFile.setFileSize(file.getSize());
            fastDFSFile.setCreateTime(LocalDateTime.now());
            fastDFSFile.setUpdateTime(LocalDateTime.now());
            //通过调用service及dao将文件的路径存储到数据库中

            //关闭storage客户端
            storageClient.close();
            return fastDFSFile;
        } catch (Exception e) {
            log.error("上传文件失败:", e);
            e.printStackTrace();
            return null;
        }
    }

}

6.10.创建全局异常处理器

/**
 * 全局异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class) //捕获所有的异常
    public Result ex(Exception ex){
        ex.printStackTrace();
        return Result.error("对不起,操作失败,请联系管理员");
    }

}

6.11.创建Controller

@Slf4j
@RestController
@RequestMapping("/fastDFSFile")
public class FileServerController {

    @Resource
    private FastDfsFileService fastDfsFileService;

    @Resource
    private FastDfsFileTypeService fastDfsFileTypeService;

    @PostMapping("/upload")
    @ResponseBody
    public R upload(@RequestParam("file") MultipartFile file) throws IOException {
        //将文件先存储在web服务器上(本机),在调用fastDFS的client将文件上传到 fastDFS服务器
        FastDfsFile fastDFSFile = new FastDfsFile();

        String contentType = file.getContentType();
        //检验当前文件是否在上述集合中
        log.info("上传的文件类型为:{}", contentType);
        int count = fastDfsFileTypeService.selectByFileType(contentType);
        if (count < 1) {
            log.info("不支持此文件类型上传 : {}", contentType);
            return R.error().setCode(208).setMessage("不支持此文件类型上传 : " + contentType);
        }
        log.info("此文件类型为 : {}", contentType);
        fastDFSFile.setFileType(contentType);

        //文件原始名称
        String originalFilename = file.getOriginalFilename();
        log.info("原始文件名称 : {}", originalFilename);
        fastDFSFile.setFileName(originalFilename);

        //文件扩展名比如22.jpg
        String filenameExtension = StringUtils.getFilenameExtension(originalFilename);
        log.info("文件类型 = {}", filenameExtension);//jpg
        if (filenameExtension == null) {
            return R.error().setCode(208).setMessage("此文件没有文件扩展名");
        }
        fastDFSFile.setExt(filenameExtension);

        //新文件名称
        String fileName = UUID.randomUUID().toString().replace("-", "") + "." + filenameExtension;
        log.info("新文件名称 = {}", fileName);

        FastDfsFile fastDfsFile1 = FastDFSClient.upload(file, fastDFSFile);
        if (fastDfsFile1 != null) {
            fastDfsFileService.save(fastDfsFile1);
            Long id = fastDfsFileService.selectByFileId(fastDfsFile1.getFileId());
            fastDfsFile1.setId(id);
            return R.ok().setCode(200).setMessage("上传成功").data("fastDfsFile",fastDfsFile1);
        }
        return R.error().setCode(208).setMessage("上传失败");
    }

    @GetMapping("/getPageFastImg/{page}/{limit}")
    public R getPageFastImg(@PathVariable int page, @PathVariable int limit) {
        PageBean<FastDfsFile> pageBean = fastDfsFileService.findFastDfsFileByPage(page, limit);
        return R.ok().setCode(200).setMessage("查询成功").data("pageBean",pageBean);
    }
}

6.13.创建vue2项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.14.安装相关模块

npm install axios@1.5.0
npm install vue-axios
npm install vue-router@3.0.1
npm i element-ui -S

6.15.main.js

import App from './App.vue'
//引入Vue
import Vue from 'vue'
//引入axios
import axios from 'axios'
//引入VueAxios
//安装VueAxios模块后,不需要在每个组件中单独导入axios,只需将axios请求改为this.axios
import VueAxios from 'vue-axios'
//引入VueRouter
import VueRouter from 'vue-router'
//完整引入
//引入ElementUI组件库
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
//新建一个router文件夹,在文件夹下新建一个index.js文件
//引入路由器
import router from './router/index'

// 设置全局变量
Vue.prototype.$baseImagePath = 'http://192.168.229.141'
//this.$baseImagePath直接引用
//把axios挂载到vue上
Vue.prototype.$axios = axios;
//使用Vue.use来注册安装插件
Vue.use(VueRouter)
Vue.use(router)
Vue.use(VueAxios, axios)
//使用ElementUI组件库
Vue.use(ElementUI)
//关闭Vue的生产提示
Vue.config.productionTip = false

// 创建和挂载根实例
new Vue({
    router, //将路由器注入到new Vue实例中,建立关联
    render: h => h(App), //将App组件放入容器中
    data: {
        // 空的实例放到根组件下,所有的子组件都能调用
        Bus: new Vue()
    }
}).$mount('#app');

6.16.src/router/index.js

//在路由文件router/index.js中配置
// 该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";

//引入组件
import fastdfsuploadimg from '../view/fastdfs/fastdfsuploadimg'//上传页
import fastdfsimg from "../view/fastdfs/fastdfsimg"

//创建路由
const routes = [
    //定义路由
    {
        path: '/',
        name: 'fastdfsuploadimg',
        component: fastdfsuploadimg
    },
    {
        path: '/fastdfsimg',
        name: 'fastdfsimg',
        component: fastdfsimg
    },
]

//创建并暴露一个路由器
const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

6.17.src/utils/request.js

import axios from 'axios'

// 创建axios实例
const service = axios.create({
  baseURL: 'http://localhost:9090', // api 的 base_url
  timeout: 1000000 // 请求超时时间
})

// http request 拦截器
// 请求拦截器
service.interceptors.request.use(
    config => {
        // 可以在这里添加请求头等信息
        return config;
    },
    error => {
        // 请求错误处理
        console.log(error);
        return Promise.reject(error);
    }
);

// http response 拦截器
// 响应拦截器
service.interceptors.response.use(
    response => {
        // 对响应数据做处理,例如只返回data部分
        const data = response.data;
        return data;
    },
    error => {
        // 响应错误处理
        console.log('err' + error); // for debug
        return Promise.reject(error);
    }
);

export default service;

6.18.src/api/fastdfs/fast.js

import request from "../../utils/request";

const api_name = '/fastDFSFile'

export default {
    //上传图片
    uploadImg() {
        return request({
            url: `${api_name}/upload`,
            method: 'post',
        })
    },
    getPageFastImg(page, limit) {
        return request({
            url: `${api_name}/getPageFastImg/${page}/${limit}`,
            method: 'get',
        })
    },
}

6.19.上传图片页面fastdfsuploadimg.vue

<template>
  <div>
    <h2>上传图片</h2>
    <el-form>
      <el-form-item>
        <el-upload
            list-type="picture-card"
            :multiple="false"
            :action="uploadUrl"
            :limit="1"
            :on-success="onUploadSuccessIdCard"
        >
          <i class="el-icon-plus"></i>
        </el-upload>
      </el-form-item>
    </el-form>
    <span v-if="dialogImageUrl != ''">图片地址:
      <a target="_blank" v-if="dialogImageUrl != ''" :href="dialogImageUrl">{{ dialogImageUrl }}</a>
    </span>
    <br/>
  </div>
</template>

<script>
import service from "../../utils/request";

export default {
  name: "UploadImg",
  data() {
    return {
      dialogImageUrl: "",
      file_id: "",
      dialogVisible: false,
      //uploadUrl: "http://localhost:9090/fastDFSFile/upload", //文件上传地址
      uploadUrl: "", //文件上传地址
      datas: {},
    };
  },
  created() {
    this.uploadUrl = service.defaults.baseURL + "/fastDFSFile/upload"
  },
  methods: {
    onUploadSuccessIdCard(response) {
      this.file_id = response.data.fastDfsFile.fileId;
      this.datas = response.fastDfsFile.data;
      //this.dialogImageUrl = "http://192.168.229.141/" + response.data.fastDfsFile.filePath;
      this.dialogImageUrl = this.$baseImagePath+"/" + response.data.fastDfsFile.filePath;
    },
    },
  },
};
</script>

<style scoped>
</style>

6.20.图片管理页面fastdfsimg.vue

<template>
  <div>
    <h2>图片管理</h2>
    <!--图片列表-->
    <el-table
        size="small"
        style="margin: 30px;"
        empty-text="无数据"
        :data="imgList"
        highlight-current-row v-loading="loading" border element-loading-text="拼命加载中">
      <el-table-column align="center" sortable prop="filePath" label="文件路径" width="450"></el-table-column>
      <el-table-column align="center" sortable prop="fileSize" label="文件大小" width="100"></el-table-column>
      <el-table-column align="center" sortable prop="fileName" label="文件名" width="130"></el-table-column>
      <el-table-column align="center" sortable prop="ext" label="扩展名" width="100"></el-table-column>
      <el-table-column align="center" sortable prop="fileType" label="文件类型" width="100"></el-table-column>
      <el-table-column align="center" sortable prop="filePath" label="预览图片" width="100">
        <template slot-scope="scope">
          <img :src="getImageUrl(scope.row.filePath)" style="max-width: 100px;max-height: 100px" alt="图标"/>
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页 -->
    <el-pagination class="pagination" style="text-align: center;margin-top: 50px"
                   layout="prev, pager, next"
                   :current-page="page"
                   :total="total"
                   :page-size="limit">
    </el-pagination>
  </div>
</template>

<script>
import fastApi from "@/api/fastdfs/fast";

export default {
  name: "FastdfsImg",
  data() {
    return {
      total: 0, // 数据库中的总记录数
      page: 1, // 默认页码
      limit: 5, // 每页记录数
      imgList: {},
      //baseImagePath: 'http://192.168.229.141/', // 图片的基础路径
    }
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      fastApi.getPageFastImg(this.page, this.limit).then(response => {
        this.imgList = response.data.pageBean.lists
        this.total = response.data.pageBean.totalCount
      })
    },

    getImageUrl(filePath) {
      //return `${this.imagePath}${filePath}`; // 拼接图片路径
      return this.$baseImagePath + '/' + filePath; // 拼接图片路径
    },

  },
}
</script>

<style scoped>

</style>

6.21.效果演示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

endl

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01;

(三十九)大数据实战——Prometheus监控平台的部署搭建

前言 Prometheus监控&#xff08;Prometheus Monitoring&#xff09;是一种开源的系统监控和警报工具。它最初由SoundCloud开发并于2012年发布&#xff0c;并在2016年加入了云原生计算基金会&#xff08;CNCF&#xff09;。Prometheus监控旨在收集、存储和查询各种指标数据&am…

Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库 AGP 8. 根目录的 settings.gradle dependencyResolutionManagement {...repositories {...maven { url https://jitpack.io }} } AGP 8. 根目录如果是 settings.gradle.kts 文件 dependencyResolutionManagement {...repositories {...…

A. Desorting

链接 : Problem - A - Codeforces 题意 : 思路 : 先判断序列是否排好序 &#xff0c; 不是排好序的&#xff0c;直接输出0即可&#xff0c;排好序的 : 先求出相邻元素之间的最小间隔&#xff0c;因为&#xff0c;要使有序非递减序列&#xff0c;变得不排序&#xff0c;…

OLMo 以促进语言模型科学之名 —— OLMo Accelerating the Science of Language Models —— 全文翻译

OLMo: Accelerating the Science of Language Models OLMo 以促进语言模型科学之名 摘要 语言模型在自然语言处理的研究中和商业产品中已经变得无所不在。因为其商业上的重要性激增&#xff0c;所以&#xff0c;其中最强大的模型已经闭源&#xff0c;控制在专有接口之中&#…

Leetcode-1572. 矩阵对角线元素的和

题目&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线…

Apache httpd 换行解析漏洞复现(CVE-2017-15715)

Web页面&#xff1a; 新建一个一句话木马&#xff1a; 0.php <?php system($_GET[0]); ?> 上传木马&#xff0c; burpsuite 抓包。 直接上传是回显 bad file。 我们查看数据包的二进制内容&#xff08;hex&#xff09;&#xff0c;内容是以16进制显示的&#xff0c;…

挑战杯 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

html的列表标签

列表标签 列表在html里面经常会用到的&#xff0c;主要使用来布局的&#xff0c;使其整齐好看. 无序列表 无序列表[重要]&#xff1a; ul &#xff0c;li 示例代码1&#xff1a; 对应的效果&#xff1a; 无序列表的属性 属性值描述typedisc&#xff0c;square&#xff0c;…

U盘重装系统

因为系统管理员密码忘记&#xff0c;登录不了window系统&#xff0c;使用老毛桃制作U盘启动盘 1、下载老毛桃 下载地址为http://lmt.psydrj.com/index.html 安装后&#xff0c;桌面上显示为 2、制作U盘启动盘 启动老毛桃U盘启动装机工具&#xff0c;插入U盘&#xff0c;点击一…

[Java][算法 滑动窗口]Day 03---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

【十九】【C++】 priority_queue简单使用和仿函数

priority_queue文档介绍翻译 优先队列是一种容器适配器&#xff0c;专门设计成其中的第一个元素始终是根据某种严格的弱排序准则最大的元素。 这种上下文类似于堆&#xff0c;其中元素可以在任何时刻插入&#xff0c;而只能检索最大堆元素&#xff08;在优先队列中顶部的元素&a…

为自监督学习重构去噪扩散模型

在这项研究中&#xff0c;作者检验了最初用于图像生成的去噪扩散模型&#xff08;DDM&#xff09;的表示学习能力。其理念是解构DDM&#xff0c;逐渐将其转化为经典的去噪自动编码器&#xff08;DAE&#xff09;。这一解构过程让大家能够探索现代DDM的各个组成部分如何影响自监…

【Docker】Docker Container操作案例 | 综合实战

文章目录 Docker Container操作案例容器的基本操作容器状态迁移容器批量处理技巧容器交互模式attached模式detached模式interactive模式 容器与宿主机内容复制容器自动删除容器自动重启容器环境变量设置容器详情查看容器执行单行命令容器镜像导入导出容器日志查看容器资源查看 …

C++:多态

C&#xff1a;多态 虚函数虚函数语法虚函数重写协变接口继承 多态构成成员函数状态对比抽象类多态原理多继承与多态虚继承与多态 先看到多态的定义&#xff1a; C的多态是指在面向对象程序设计中&#xff0c;允许使用基类的指针或引用来调用派生类的虚函数的特性。这样的调用将…

数据结构-并查集

并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个 单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询一 个元素归属于那个集合的运算。适合于描述这类…

阿里云幻兽帕鲁服务器配置4核16G10M带宽够8个人玩吗?玩起来流畅度怎么样?

阿里云幻兽帕鲁服务器配置4核16G10M带宽这个&#xff0c;个人实测下来&#xff0c;五六个人玩是比较流畅的&#xff0c;不过8个人的话&#xff0c;估计会有点卡。如果是8个人的话&#xff0c;我建议选择8核32G那个配置&#xff0c;更加适合一些。 阿里云一键部署幻兽帕鲁详细教…

【lesson57】信号量和生产者消费者模型(环形队列版)

文章目录 信号量概念信号量接口初始化销毁等待发布 基于环形队列的生产者消费者模型编码Common.hLockGuard.hppTask.hppsem.hppRingQueue.hppConProd.cc 信号量概念 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的…

漫漫数学之旅022

文章目录 经典格言数学习题古今评注名人小传- 刘易斯卡罗尔 经典格言 艾丽斯笑着说&#xff1a;“去尝试也毫无用处&#xff0c;一个人无法相信不可能的事情。”——刘易斯卡罗尔&#xff08;Lewis Carroll&#xff09;《艾丽斯梦游仙境&#xff08;Alice in Wonderland&#…

零基础怎么学编程,免费版中文编程工具下载及构件用法教程

零基础怎么学编程&#xff0c;免费版中文编程工具下载及构件用法教程 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程工具及实例源码文件下载可以点击最下方官网…