【黑马头条之文章详情-静态文件生成】

news2024/11/18 7:24:37

本笔记内容为黑马头条项目的文章详情-静态文件生成部分

目录

一、思路分析

二、实现步骤


基础知识可参考下面两篇文章 

【黑马头条之对象存储服务MinIO】_蛋饼吧的博客-CSDN博客

【黑马头条之freemarker入门】_蛋饼吧的博客-CSDN博客

 

一、思路分析


文章端创建app相关文章时,生成文章详情静态页上传到MinIO中

二、实现步骤


1.新建ArticleFreemarkerService创建静态文件并上传到minIO中

package com.heima.article.service;

import com.heima.model.article.pojos.ApArticle;

public interface ArticleFreemarkerService {

    /**
     * 生成静态文件上传到minIO中
     * @param apArticle
     * @param content
     */
    public void buildArticleToMinIO(ApArticle apArticle,String content);
}

实现

package com.heima.article.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.article.mapper.ApArticleContentMapper;
import com.heima.article.service.ApArticleService;
import com.heima.article.service.ArticleFreemarkerService;
import com.heima.file.service.FileStorageService;
import com.heima.model.article.pojos.ApArticle;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
@Transactional
public class ArticleFreemarkerServiceImpl implements ArticleFreemarkerService {

    @Autowired
    private ApArticleContentMapper apArticleContentMapper;

    @Autowired
    private Configuration configuration;

    @Autowired
    private FileStorageService fileStorageService;

    @Autowired
    private ApArticleService apArticleService;

    /**
     * 生成静态文件上传到minIO中
     * @param apArticle
     * @param content
     */
    @Async
    @Override
    public void buildArticleToMinIO(ApArticle apArticle, String content) {
        //已知文章的id
        //4.1 获取文章内容
        if(StringUtils.isNotBlank(content)){
            //4.2 文章内容通过freemarker生成html文件
            Template template = null;
            StringWriter out = new StringWriter();
            try {
                template = configuration.getTemplate("article.ftl");
                //数据模型
                Map<String,Object> contentDataModel = new HashMap<>();
                contentDataModel.put("content", JSONArray.parseArray(content));
                //合成
                template.process(contentDataModel,out);
            } catch (Exception e) {
                e.printStackTrace();
            }

            //4.3 把html文件上传到minio中
            InputStream in = new ByteArrayInputStream(out.toString().getBytes());
            String path = fileStorageService.uploadHtmlFile("", apArticle.getId() + ".html", in);


            //4.4 修改ap_article表,保存static_url字段
            apArticleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId,apArticle.getId())
                    .set(ApArticle::getStaticUrl,path));


        }
    }

}

2.在ApArticleService的saveArticle实现方法中添加调用生成文件的方法

/**
     * 保存app端相关文章
     * @param dto
     * @return
     */
@Override
public ResponseResult saveArticle(ArticleDto dto) {

    //        try {
    //            Thread.sleep(3000);
    //        } catch (InterruptedException e) {
    //            e.printStackTrace();
    //        }
    //1.检查参数
    if(dto == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    ApArticle apArticle = new ApArticle();
    BeanUtils.copyProperties(dto,apArticle);

    //2.判断是否存在id
    if(dto.getId() == null){
        //2.1 不存在id  保存  文章  文章配置  文章内容

        //保存文章
        save(apArticle);

        //保存配置
        ApArticleConfig apArticleConfig = new ApArticleConfig(apArticle.getId());
        apArticleConfigMapper.insert(apArticleConfig);

        //保存 文章内容
        ApArticleContent apArticleContent = new ApArticleContent();
        apArticleContent.setArticleId(apArticle.getId());
        apArticleContent.setContent(dto.getContent());
        apArticleContentMapper.insert(apArticleContent);

    }else {
        //2.2 存在id   修改  文章  文章内容

        //修改  文章
        updateById(apArticle);

        //修改文章内容
        ApArticleContent apArticleContent = apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, dto.getId()));
        apArticleContent.setContent(dto.getContent());
        apArticleContentMapper.updateById(apArticleContent);
    }

    //异步调用 生成静态文件上传到minio中
    articleFreemarkerService.buildArticleToMinIO(apArticle,dto.getContent());


    //3.结果返回  文章的id
    return ResponseResult.okResult(apArticle.getId());
}

3.文章微服务开启异步调用

 

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

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

相关文章

如何获得SOLIDWORKS全认证资格证书!

SolidWorks认证考试 完成SolidWorks认证考试并获得专业SolidWorks认证是一项伟大的成就。它不仅在你的简历上自豪地闪耀&#xff0c;而且还向雇主、决策者和同事展示了你对软件的技能和知识水平。公司通常会将某些策略和标准设定为一项业务&#xff0c;以帮助保持在竞争中的领头…

桃子叶片病害数据集

1.分为三类 健康的桃子叶片 &#xff0c;251张 桃疮痂病一般&#xff0c;857张 桃疮痂病严重&#xff0c;770 张 数据集链接 import os import jsonimport torch from PIL import Image from torchvision import transforms import tkinter as tk from tkinter import file…

MySQL 日志管理

目录 一、四种日志介绍 1.1 错误日志 1.2 通用查询日志 1.3 二进制日志 1.4 慢查询日志 三、查询日志是否已开启 四、分割二进制日志 MySQL的日志默认保存在数据库文件的存储目录&#xff08;一般为/usr/local/mysql/data/&#xff09;。也可以修改配置文件&#xff0c;…

低代码可视化开发,是时候去学一学了!

低代码一词&#xff0c;有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为它是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。 即使这样&#xff0c;至今也有不少人还不知道这项技术&#xff0c;今天笼统的介绍一下低代…

认识需求不得不思考的5大因素

需求对项目非常重要&#xff0c;如果对需求认识不清晰不明确&#xff0c;往往会导致需求不完整&#xff0c;需求重复等问题&#xff0c;引起很多不必要的风险&#xff0c;因此如何认识需求&#xff0c;需要思考哪些因素&#xff0c;就显得尤为重要。以下5大因素&#xff0c;是我…

Spring 6【Lombok、基于注解方式的IoC】(六)-全面详解(学习总结---从入门到深化)

目录 十一、Lombok 十二、基于注解方式的IoC 十一、Lombok 在上面的课程讲解过程中&#xff0c;每次修改类的属性&#xff0c;都需要重新生成Getter/Setter方法及toString()方法。我 们可以借助Lombok来简化代码。 1 环境准备 下载Lombok插件 IDEA 2022.3.2 默认集成Lomb…

ICASSP 2023 | MCROOD: MULTI-CLASS RADAR OUT-OF-DISTRIBUTION DETECTION

原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486484&idx1&snd43f92ca0230753e77f54557054653d6&chksmcf51beedf82637fb27d4cbb9279f273298779dabe25f7775cb93469787bcc12c1b6b2caec979#rd ICASSP 2023 | MCROOD: MULTI-CLASS…

golang利用go mod巧妙替换使用本地项目的包

问题 拉了两个项目下来&#xff0c;其中一个项目依赖另一个项目&#xff0c;因为改动了被依赖的项目&#xff0c;想重新导入测试一下。 解决办法 go.mod文件的require中想要被代替的包名在replace中进行一个替换&#xff0c;注意&#xff1a;用来替换的需要用绝对路径&#xf…

IDEA打开text文本文件弹出窗口“选择一个应用以打开此.text文件“

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【React】版本正确安装echarts-liquidfill(水球图表)包引入不成功问题

目标效果图&#xff1a; 安装&#xff1a; npm install echarts npm install echarts-liquidfill 引入&#xff1a; Import:import * as echarts from echarts; import echarts-liquidfill 或 import echarts-liquidfill/src/liquidFill.jsOr:import * as echarts from…

4.4. 深拷贝 vs 浅拷贝

文章目录 浅拷贝&#xff1a;对基本数据类型进行值传递&#xff0c;对引用数据类型进行引用传递般的拷贝&#xff0c;此为浅拷贝。深拷贝&#xff1a;对基本数据类型进行值传递&#xff0c;对引用数据类型&#xff0c;创建一个新的对象&#xff0c;并复制其内容&#xff0c;此为…

一招解决报错:pyassimp.errors.AssimpError: assimp library not found

文章目录 1 问题描述2 原因分析3 解决方法 1 问题描述 在使用pip install pyassimp安装pyassimp库后&#xff0c;调用时会出现错误&#xff1a; File"/root/anaconda3/envs/kgn/lib/python3.8/site-packages/pyassimp/helper.py", line 234, in search_library rais…

创造自己的宠物医院预约服务小程序,步骤详解

在现代社会&#xff0c;越来越多的人开始养宠物&#xff0c;而宠物的健康管理也成为了一个重要的话题。为了方便宠物主人随时随地进行宠物医院的管理和服务&#xff0c;开发一个宠物医院管理小程序是很有必要的。今天我们将分享一些制作宠物医院管理小程序的技巧&#xff0c;帮…

EasyExcel数据导出功能封装

起因&#xff1a; 最近需要用到excel导出功能&#xff0c;使用EasyExcel可以快速实现导出&#xff0c;又需要优雅的对EasyExcel进行封装&#xff0c;在实现自己的导出功能时又可以制定一定的规则&#xff0c;让其他同事方便使用&#xff0c;最近研究了下网上的常规写法&#x…

QT基于TCP协议实现数据传输以及波形绘制

这个玩意我做了两个&#xff0c;一个是安卓app&#xff0c;一个是Windows程序。代码并非全部都是由我从无到有实现&#xff0c;只是实现了我想要的功能。多亏了巨人的肩膀&#xff0c;开源万岁&#xff01;&#xff01;&#xff01; 我把程序放到GitHub上&#xff0c;需要的可…

【shell脚本编写使用mysqldump实现分库分表备份】

shell脚本编写使用mysqldump实现分库分表备份 #!/bin/bash# 检查MySQL是否启动 #systemctl list-units --typeservice命令查看可用的服务列表&#xff0c;并找到正确的MySQL服务名称 mysqld.service mysql_status$(systemctl is-active mysqld.service) if [ "$mysql_sta…

向伟大的中国人民解放军生日献礼 黄河千年清一回张国土考察青海

向伟大的中国人民解放军生日献礼 黄河千年清一回张国土考察青海 Birthday gift to the great Chinese Peoples Liberation Army The Yellow River visited Qinghaiin. the Millennium Qing Dynasty 八一前夕&#xff0c;建国七十周年最俱影响力人物、黄河千年清一回互联网电子…

【黑马头条之自管理敏感词】

本笔记内容为黑马头条项目的新需求-自管理敏感词部分 目录 一、需求分析 二、敏感词-过滤 三、DFA实现原理 SensitiveWordUtil工具类 四、自管理敏感词集成到文章审核中 一、需求分析 文章审核功能已经交付了&#xff0c;文章也能正常发布审核。突然&#xff0c;产品经理…

leetcode刷题(一)

目录标题 NO1:数组中重复的数字&#xff08;简单&#xff09;题目详细&做题链接解法一&#xff1a;辅助数组解法二&#xff1a;排序解法三&#xff1a;交换数据解法四&#xff1a;二分查找 NO2:二维数组的查找&#xff08;中等&#xff09;题目详细&做题链接解法一&…

揭秘APT团体常用的秘密武器——AsyncRAT

AsyncRAT 是 2019 年 1 月在 [GitHub](https://github.com/NYAN-x-CAT/AsyncRAT-C- Sharp)上开源的远控木马&#xff0c;旨在通过远程加密链接控制失陷主机&#xff0c;提供如下典型功能&#xff1a; 截取屏幕 键盘记录 上传/下载/执行文件 持久化 禁用 Windows Defender 关机/…