黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

2024-07-21 1507阅读

文章目录

  • app端文章列表
    • 需求分析
    • 实现思路
    • 实现步骤
        • 编写mapper文件
        • 编写控制器代码
        • 文章详情
          • 实现思路
          • Freemarker
          • minIO

            app端文章列表

            需求分析

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            实现思路

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            实现步骤

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            ArticleHomeDto

            package com.heima.model.article.dtos;
            import lombok.Data;
            import java.util.Date;
            @Data
            public class ArticleHomeDto {
                // 最大时间
                Date maxBehotTime;
                // 最小时间
                Date minBehotTime;
                // 分页size
                Integer size;
                // 频道ID
                String tag;
            }
            

            导入heima-leadnews-article微服务

            注意:需要在heima-leadnews-service的pom文件夹中添加子模块信息,如下:

                heima-leadnews-user
                heima-leadnews-article
            
            

            在idea中的maven中更新一下,如果工程还是灰色的,需要在重新添加文章微服务的pom文件,操作步骤如下:

            需要在nacos中添加对应的配置

            spring:
              datasource:
                driver-class-name: com.mysql.jdbc.Driver
                url: jdbc:mysql://localhost:3306/leadnews_article?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
                username: root
                password: root
            # 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
            mybatis-plus:
              mapper-locations: classpath*:mapper/*.xml
              # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
              type-aliases-package: com.heima.model.article.pojos
            

            定义接口

            package com.heima.article.controller.v1;
            import com.heima.model.article.dtos.ArticleHomeDto;
            import com.heima.model.common.dtos.ResponseResult;
            import org.springframework.web.bind.annotation.PostMapping;
            import org.springframework.web.bind.annotation.RequestBody;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;
            @RestController
            @RequestMapping("/api/v1/article")
            public class ArticleHomeController {
                @PostMapping("/load")
                public ResponseResult load(@RequestBody ArticleHomeDto dto) {
                    return null;
                }
                @PostMapping("/loadmore")
                public ResponseResult loadMore(@RequestBody ArticleHomeDto dto) {
                    return null;
                }
                @PostMapping("/loadnew")
                public ResponseResult loadNew(@RequestBody ArticleHomeDto dto) {
                    return null;
                }
            }
            
            编写mapper文件
            package com.heima.article.mapper;
            import com.baomidou.mybatisplus.core.mapper.BaseMapper;
            import com.heima.model.article.dtos.ArticleHomeDto;
            import com.heima.model.article.pojos.ApArticle;
            import org.apache.ibatis.annotations.Mapper;
            import org.apache.ibatis.annotations.Param;
            import java.util.List;
            @Mapper
            public interface ApArticleMapper extends BaseMapper {
                public List loadArticleList(@Param("dto") ArticleHomeDto dto, @Param("type") Short type);
            }
            

            对应的映射文件

            在resources中新建mapper/ApArticleMapper.xml 如下配置:

            
            
                
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                
                
                    SELECT
                    aa.*
                    FROM
                    `ap_article` aa
                    LEFT JOIN ap_article_config aac ON aa.id = aac.article_id
                    
                        and aac.is_delete != 1
                        and aac.is_down != 1
                        
                        
                            and aa.publish_time  #{dto.minBehotTime}
                        
                        
                            and aa.publish_time ]]> #{dto.maxBehotTime}
                        
                        
                            and aa.channel_id = #{dto.tag}
                        
                    
                    order by aa.publish_time desc
                    limit #{dto.size}
                
            
            

            编写业务层代码

            package com.heima.article.service;
            import com.baomidou.mybatisplus.extension.service.IService;
            import com.heima.model.article.dtos.ArticleHomeDto;
            import com.heima.model.article.pojos.ApArticle;
            import com.heima.model.common.dtos.ResponseResult;
            import java.io.IOException;
            public interface ApArticleService extends IService {
                /**
                 * 根据参数加载文章列表
                 * @param loadtype 1为加载更多  2为加载最新
                 * @param dto
                 * @return
                 */
                ResponseResult load(Short loadtype, ArticleHomeDto dto);
            }
            

            实现类:

            package com.heima.article.service.impl;
            import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
            import com.heima.article.mapper.ApArticleMapper;
            import com.heima.article.service.ApArticleService;
            import com.heima.common.constants.ArticleConstants;
            import com.heima.model.article.dtos.ArticleHomeDto;
            import com.heima.model.article.pojos.ApArticle;
            import com.heima.model.common.dtos.ResponseResult;
            import lombok.extern.slf4j.Slf4j;
            import org.apache.commons.lang3.StringUtils;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Service;
            import org.springframework.transaction.annotation.Transactional;
            import java.util.Date;
            import java.util.List;
            @Service
            @Transactional
            @Slf4j
            public class ApArticleServiceImpl  extends ServiceImpl implements ApArticleService {
                // 单页最大加载的数字
                private final static short MAX_PAGE_SIZE = 50;
                @Autowired
                private ApArticleMapper apArticleMapper;
                /**
                 * 根据参数加载文章列表
                 * @param loadtype 1为加载更多  2为加载最新
                 * @param dto
                 * @return
                 */
                @Override
                public ResponseResult load(Short loadtype, ArticleHomeDto dto) {
                    //1.校验参数
                    Integer size = dto.getSize();
                    if(size == null || size == 0){
                        size = 10;
                    }
                    size = Math.min(size,MAX_PAGE_SIZE);
                    dto.setSize(size);
                    //类型参数检验
                    if(!loadtype.equals(ArticleConstants.LOADTYPE_LOAD_MORE)&&!loadtype.equals(ArticleConstants.LOADTYPE_LOAD_NEW)){
                        loadtype = ArticleConstants.LOADTYPE_LOAD_MORE;
                    }
                    //文章频道校验
                    if(StringUtils.isEmpty(dto.getTag())){
                        dto.setTag(ArticleConstants.DEFAULT_TAG);
                    }
                    //时间校验
                    if(dto.getMaxBehotTime() == null) dto.setMaxBehotTime(new Date());
                    if(dto.getMinBehotTime() == null) dto.setMinBehotTime(new Date());
                    //2.查询数据
                    List apArticles = apArticleMapper.loadArticleList(dto, loadtype);
                    //3.结果封装
                    ResponseResult responseResult = ResponseResult.okResult(apArticles);
                    return responseResult;
                }
                
            }
            

            定义常量类

            package com.heima.common.constants;
            public class ArticleConstants {
                public static final Short LOADTYPE_LOAD_MORE = 1;
                public static final Short LOADTYPE_LOAD_NEW = 2;
                public static final String DEFAULT_TAG = "__all__";
            }
            
            编写控制器代码
            package com.heima.article.controller.v1;
            import com.heima.article.service.ApArticleService;
            import com.heima.common.constants.ArticleConstants;
            import com.heima.model.article.dtos.ArticleHomeDto;
            import com.heima.model.common.dtos.ResponseResult;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.web.bind.annotation.PostMapping;
            import org.springframework.web.bind.annotation.RequestBody;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;
            @RestController
            @RequestMapping("/api/v1/article")
            public class ArticleHomeController {
                @Autowired
                private ApArticleService apArticleService;
                @PostMapping("/load")
                public ResponseResult load(@RequestBody ArticleHomeDto dto) {
                    return apArticleService.load(ArticleConstants.LOADTYPE_LOAD_MORE,dto);
                }
                @PostMapping("/loadmore")
                public ResponseResult loadMore(@RequestBody ArticleHomeDto dto) {
                    return apArticleService.load(ArticleConstants.LOADTYPE_LOAD_MORE,dto);
                }
                @PostMapping("/loadnew")
                public ResponseResult loadNew(@RequestBody ArticleHomeDto dto) {
                    return apArticleService.load(ArticleConstants.LOADTYPE_LOAD_NEW,dto);
                }
            }
            

            页面展示

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            文章详情

            实现思路

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            Freemarker

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            创建一个freemarker-demo 的测试工程专门用于freemarker的功能测试与模板的测试。

            pom.xml如下

            
                
                    heima-leadnews-test
                    com.heima
                    1.0-SNAPSHOT
                
                4.0.0
                freemarker-demo
                
                    8
                    8
                
                
                    
                        org.springframework.boot
                        spring-boot-starter-web
                    
                    
                        org.springframework.boot
                        spring-boot-starter-freemarker
                    
                    
                        org.springframework.boot
                        spring-boot-starter-test
                    
                    
                    
                        org.projectlombok
                        lombok
                    
                    
                    
                        org.apache.commons
                        commons-io
                        1.3.2
                    
                
            
            

            在freemarker的测试工程下创建模型类型用于测试

            package com.heima.freemarker.entity;
            import lombok.Data;
            import java.util.Date;
            @Data
            public class Student {
                private String name;//姓名
                private int age;//年龄
                private Date birthday;//生日
                private Float money;//钱包
            }
            

            在resources下创建templates,此目录为freemarker的默认模板存放目录。

            在templates下创建模板文件 01-basic.ftl ,模板中的插值表达式最终会被freemarker替换成具体的数据。

            
            
                
                Hello World!
            
            
            普通文本 String 展示:

            Hello ${name}

            对象Student中的数据展示:
            姓名:${stu.name}
            年龄:${stu.age}

            创建Controller类,向Map中添加name,最后返回模板文件。

            package com.xuecheng.test.freemarker.controller;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Controller;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.client.RestTemplate;
            import java.util.Map;
            @Controller
            public class HelloController {
                @GetMapping("/basic")
                public String test(Model model) {
                    //1.纯文本形式的参数
                    model.addAttribute("name", "freemarker");
                    //2.实体类相关的参数
                    
                    Student student = new Student();
                    student.setName("小明");
                    student.setAge(18);
                    model.addAttribute("stu", student);
                    return "01-basic";
                }
            }
            

            01-basic.ftl,使用插值表达式填充数据

            
            
                
                Hello World!
            
            
            普通文本 String 展示:

            Hello ${name}

            对象Student中的数据展示:
            姓名:${stu.name}
            年龄:${stu.age}

            创建启动类

            package com.heima.freemarker;
            import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
            @SpringBootApplication
            public class FreemarkerDemotApplication {
                public static void main(String[] args) {
                    SpringApplication.run(FreemarkerDemotApplication.class,args);
                }
            }
            

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            minIO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            我们提供的镜像中已经有minio的环境

            我们可以使用docker进行环境部署和启动

            docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always \ 
              -e "MINIO_ROOT_USER=minio" \
              -e "MINIO_ROOT_PASSWORD=minio123" \
              -v /home/data:/data \
              -v /home/config:/root/.minio \
              minio/minio server /data --console-address ":9001"
            

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            导入pom依赖

            创建minio-demo,对应pom如下

            
                
                    heima-leadnews-test
                    com.heima
                    1.0-SNAPSHOT
                
                4.0.0
                minio-demo
                
                    8
                    8
                
                
                    
                        io.minio
                        minio
                        7.1.0
                    
                    
                        org.springframework.boot
                        spring-boot-starter-web
                    
                    
                        org.springframework.boot
                        spring-boot-starter-test
                    
                
            
            

            引导类:

            package com.heima.minio;
            import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
            @SpringBootApplication
            public class MinIOApplication {
                public static void main(String[] args) {
                    SpringApplication.run(MinIOApplication.class,args);
                }
            }
            

            创建测试类,上传html文件

            package com.heima.minio.test;
            import io.minio.MinioClient;
            import io.minio.PutObjectArgs;
            import java.io.FileInputStream;
            public class MinIOTest {
                public static void main(String[] args) {
                    FileInputStream fileInputStream = null;
                    try {
                        fileInputStream =  new FileInputStream("D:\\list.html");;
                        //1.创建minio链接客户端
                        MinioClient minioClient = MinioClient.builder().credentials("minio", "minio123").endpoint("http://192.168.200.130:9000").build();
                        //2.上传
                        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                                .object("list.html")//文件名
                                .contentType("text/html")//文件类型
                                .bucket("leadnews")//桶名词  与minio创建的名词一致
                                .stream(fileInputStream, fileInputStream.available(), -1) //文件流
                                .build();
                        minioClient.putObject(putObjectArgs);
                        System.out.println("http://192.168.200.130:9000/leadnews/ak47.jpg");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
            

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            创建模块heima-file-starter

            导入依赖

                
                    org.springframework.boot
                    spring-boot-autoconfigure
                
                
                    io.minio
                    minio
                    7.1.0
                
                
                    org.springframework.boot
                    spring-boot-starter
                
                
                    org.springframework.boot
                    spring-boot-configuration-processor
                    true
                
                
                    org.springframework.boot
                    spring-boot-starter-actuator
                
            
            

            配置类

            MinIOConfigProperties

            package com.heima.file.config;
            import lombok.Data;
            import org.springframework.boot.context.properties.ConfigurationProperties;
            import java.io.Serializable;
            @Data
            @ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss
            public class MinIOConfigProperties implements Serializable {
                private String accessKey;
                private String secretKey;
                private String bucket;
                private String endpoint;
                private String readPath;
            }
            

            MinIOConfig

            package com.heima.file.config;
            import com.heima.file.service.FileStorageService;
            import io.minio.MinioClient;
            import lombok.Data;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
            import org.springframework.boot.context.properties.EnableConfigurationProperties;
            import org.springframework.context.annotation.Bean;
            import org.springframework.context.annotation.Configuration;
            @Data
            @Configuration
            @EnableConfigurationProperties({MinIOConfigProperties.class})
            //当引入FileStorageService接口时
            @ConditionalOnClass(FileStorageService.class)
            public class MinIOConfig {
               @Autowired
               private MinIOConfigProperties minIOConfigProperties;
                @Bean
                public MinioClient buildMinioClient(){
                    return MinioClient
                            .builder()
                            .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
                            .endpoint(minIOConfigProperties.getEndpoint())
                            .build();
                }
            }
            

            封装操作minIO类

            FileStorageService

            package com.heima.file.service;
            import java.io.InputStream;
            /**
             * @author itheima
             */
            public interface FileStorageService {
                /**
                 *  上传图片文件
                 * @param prefix  文件前缀
                 * @param filename  文件名
                 * @param inputStream 文件流
                 * @return  文件全路径
                 */
                public String uploadImgFile(String prefix, String filename,InputStream inputStream);
                /**
                 *  上传html文件
                 * @param prefix  文件前缀
                 * @param filename   文件名
                 * @param inputStream  文件流
                 * @return  文件全路径
                 */
                public String uploadHtmlFile(String prefix, String filename,InputStream inputStream);
                /**
                 * 删除文件
                 * @param pathUrl  文件全路径
                 */
                public void delete(String pathUrl);
                /**
                 * 下载文件
                 * @param pathUrl  文件全路径
                 * @return
                 *
                 */
                public byte[]  downLoadFile(String pathUrl);
            }
            

            MinIOFileStorageService

            package com.heima.file.service.impl;
            import com.heima.file.config.MinIOConfig;
            import com.heima.file.config.MinIOConfigProperties;
            import com.heima.file.service.FileStorageService;
            import io.minio.GetObjectArgs;
            import io.minio.MinioClient;
            import io.minio.PutObjectArgs;
            import io.minio.RemoveObjectArgs;
            import lombok.extern.slf4j.Slf4j;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.boot.context.properties.EnableConfigurationProperties;
            import org.springframework.context.annotation.Import;
            import org.springframework.util.StringUtils;
            import java.io.ByteArrayOutputStream;
            import java.io.IOException;
            import java.io.InputStream;
            import java.text.SimpleDateFormat;
            import java.util.Date;
            @Slf4j
            @EnableConfigurationProperties(MinIOConfigProperties.class)
            @Import(MinIOConfig.class)
            public class MinIOFileStorageService implements FileStorageService {
                @Autowired
                private MinioClient minioClient;
                @Autowired
                private MinIOConfigProperties minIOConfigProperties;
                private final static String separator = "/";
                /**
                 * @param dirPath
                 * @param filename  yyyy/mm/dd/file.jpg
                 * @return
                 */
                public String builderFilePath(String dirPath,String filename) {
                    StringBuilder stringBuilder = new StringBuilder(50);
                    if(!StringUtils.isEmpty(dirPath)){
                        stringBuilder.append(dirPath).append(separator);
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                    String todayStr = sdf.format(new Date());
                    stringBuilder.append(todayStr).append(separator);
                    stringBuilder.append(filename);
                    return stringBuilder.toString();
                }
                /**
                 *  上传图片文件
                 * @param prefix  文件前缀
                 * @param filename  文件名
                 * @param inputStream 文件流
                 * @return  文件全路径
                 */
                @Override
                public String uploadImgFile(String prefix, String filename,InputStream inputStream) {
                    String filePath = builderFilePath(prefix, filename);
                    try {
                        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                                .object(filePath)
                                .contentType("image/jpg")
                                .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                                .build();
                        minioClient.putObject(putObjectArgs);
                        StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
                        urlPath.append(separator+minIOConfigProperties.getBucket());
                        urlPath.append(separator);
                        urlPath.append(filePath);
                        return urlPath.toString();
                    }catch (Exception ex){
                        log.error("minio put file error.",ex);
                        throw new RuntimeException("上传文件失败");
                    }
                }
                /**
                 *  上传html文件
                 * @param prefix  文件前缀
                 * @param filename   文件名
                 * @param inputStream  文件流
                 * @return  文件全路径
                 */
                @Override
                public String uploadHtmlFile(String prefix, String filename,InputStream inputStream) {
                    String filePath = builderFilePath(prefix, filename);
                    try {
                        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                                .object(filePath)
                                .contentType("text/html")
                                .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                                .build();
                        minioClient.putObject(putObjectArgs);
                        StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
                        urlPath.append(separator+minIOConfigProperties.getBucket());
                        urlPath.append(separator);
                        urlPath.append(filePath);
                        return urlPath.toString();
                    }catch (Exception ex){
                        log.error("minio put file error.",ex);
                        ex.printStackTrace();
                        throw new RuntimeException("上传文件失败");
                    }
                }
                /**
                 * 删除文件
                 * @param pathUrl  文件全路径
                 */
                @Override
                public void delete(String pathUrl) {
                    String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
                    int index = key.indexOf(separator);
                    String bucket = key.substring(0,index);
                    String filePath = key.substring(index+1);
                    // 删除Objects
                    RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
                    try {
                        minioClient.removeObject(removeObjectArgs);
                    } catch (Exception e) {
                        log.error("minio remove file error.  pathUrl:{}",pathUrl);
                        e.printStackTrace();
                    }
                }
                /**
                 * 下载文件
                 * @param pathUrl  文件全路径
                 * @return  文件流
                 *
                 */
                @Override
                public byte[] downLoadFile(String pathUrl)  {
                    String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
                    int index = key.indexOf(separator);
                    String bucket = key.substring(0,index);
                    String filePath = key.substring(index+1);
                    InputStream inputStream = null;
                    try {
                        inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
                    } catch (Exception e) {
                        log.error("minio down file error.  pathUrl:{}",pathUrl);
                        e.printStackTrace();
                    }
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    byte[] buff = new byte[100];
                    int rc = 0;
                    while (true) {
                        try {
                            if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        byteArrayOutputStream.write(buff, 0, rc);
                    }
                    return byteArrayOutputStream.toByteArray();
                }
            }
            

            对外加入自动配置

            在resources中新建META-INF/spring.factories

            org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
              com.heima.file.service.impl.MinIOFileStorageService
            

            其他微服务使用

            第一,导入heima-file-starter的依赖

            第二,在微服务中添加minio所需要的配置

            minio:
              accessKey: minio
              secretKey: minio123
              bucket: leadnews
              endpoint: http://192.168.200.130:9000
              readPath: http://192.168.200.130:9000
            

            第三,在对应使用的业务类中注入FileStorageService,样例如下:

            package com.heima.minio.test;
            import com.heima.file.service.FileStorageService;
            import com.heima.minio.MinioApplication;
            import org.junit.Test;
            import org.junit.runner.RunWith;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.boot.test.context.SpringBootTest;
            import org.springframework.test.context.junit4.SpringRunner;
            import java.io.FileInputStream;
            import java.io.FileNotFoundException;
            @SpringBootTest(classes = MinioApplication.class)
            @RunWith(SpringRunner.class)
            public class MinioTest {
                @Autowired
                private FileStorageService fileStorageService;
                @Test
                public void testUpdateImgFile() {
                    try {
                        FileInputStream fileInputStream = new FileInputStream("E:\\tmp\\ak47.jpg");
                        String filePath = fileStorageService.uploadImgFile("", "ak47.jpg", fileInputStream);
                        System.out.println(filePath);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
            

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            黑马头条微服务学习day02-app端文章查看,静态化freemarker,分布式文件系统MinlO

            在文章微服务中导入依赖

                
                    org.springframework.boot
                    spring-boot-starter-freemarker
                
                
                    com.heima
                    heima-file-starter
                    1.0-SNAPSHOT
                
            
            

            新建ApArticleContentMapper

            package com.heima.article.mapper;
            import com.baomidou.mybatisplus.core.mapper.BaseMapper;
            import com.heima.model.article.pojos.ApArticleContent;
            import org.apache.ibatis.annotations.Mapper;
            @Mapper
            public interface ApArticleContentMapper extends BaseMapper {
            }
            

            6.在artile微服务中新增测试类(后期新增文章的时候创建详情静态页,目前暂时手动生成)

            package com.heima.article.test;
            import com.alibaba.fastjson.JSONArray;
            import com.baomidou.mybatisplus.core.toolkit.Wrappers;
            import com.heima.article.ArticleApplication;
            import com.heima.article.mapper.ApArticleContentMapper;
            import com.heima.article.mapper.ApArticleMapper;
            import com.heima.file.service.FileStorageService;
            import com.heima.model.article.pojos.ApArticle;
            import com.heima.model.article.pojos.ApArticleContent;
            import freemarker.template.Configuration;
            import freemarker.template.Template;
            import org.apache.commons.lang3.StringUtils;
            import org.junit.Test;
            import org.junit.runner.RunWith;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.boot.test.context.SpringBootTest;
            import org.springframework.test.context.junit4.SpringRunner;
            import java.io.ByteArrayInputStream;
            import java.io.InputStream;
            import java.io.StringWriter;
            import java.util.HashMap;
            import java.util.Map;
            @SpringBootTest(classes = ArticleApplication.class)
            @RunWith(SpringRunner.class)
            public class ArticleFreemarkerTest {
                @Autowired
                private Configuration configuration;
                @Autowired
                private FileStorageService fileStorageService;
                @Autowired
                private ApArticleMapper apArticleMapper;
                @Autowired
                private ApArticleContentMapper apArticleContentMapper;
                @Test
                public void createStaticUrlTest() throws Exception {
                    //1.获取文章内容
                    ApArticleContent apArticleContent = apArticleContentMapper.selectOne(Wrappers.lambdaQuery().eq(ApArticleContent::getArticleId, 1390536764510310401L));
                    if(apArticleContent != null && StringUtils.isNotBlank(apArticleContent.getContent())){
                        //2.文章内容通过freemarker生成html文件
                        StringWriter out = new StringWriter();
                        Template template = configuration.getTemplate("article.ftl");
                        Map params = new HashMap();
                        params.put("content", JSONArray.parseArray(apArticleContent.getContent()));
                        template.process(params, out);
                        InputStream is = new ByteArrayInputStream(out.toString().getBytes());
                        //3.把html文件上传到minio中
                        String path = fileStorageService.uploadHtmlFile("", apArticleContent.getArticleId() + ".html", is);
                        //4.修改ap_article表,保存static_url字段
                        ApArticle article = new ApArticle();
                        article.setId(apArticleContent.getArticleId());
                        article.setStaticUrl(path);
                        apArticleMapper.updateById(article);
                    }
                }
            }
            
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]