当前位置: 首页 > news >正文

黑马头条_SpringCloud项目阶段三:HTML文件生成以及素材文章CRUD

知识点一:freemarker结合MinIO生成HTML文件

  1. 流程:通过文章id查询到文章content表中的数据,取出content内容,并解析content内容中的json和tfl模版集合生成html,最后将生成的html上传到minio中,并返回minio中的访问地址。将地址存储在ap_article表中的static_url字段中
  2. 实现
package com.heima.article.test;import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.Template;
import freemarker.template.TemplateException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import freemarker.template.Configuration;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;@SpringBootTest(classes = ArticleApplication.class)
@RunWith(SpringRunner.class)
public class ArticleTest {@AutowiredConfiguration configurable;@AutowiredFileStorageService fileStorageService;@Autowiredprivate ApArticleContentMapper apArticleContentMapper;@Autowiredprivate ApArticleMapper apArticleMapper;@Testpublic void test() throws TemplateException, IOException {// 第一步:获取到文章内容ApArticleContent apArticleContent = apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, 1302862387124125698L));//判断是否有内容if (apArticleContent !=null && StringUtils.isNotBlank(apArticleContent.getContent())) {// 生成html文件Template template = configurable.getTemplate("article.ftl");Map<String, Object> map = new HashMap<>();map.put("content", JSONArray.parseArray(apArticleContent.getContent()));StringWriter stringWriter = new StringWriter();template.process(map,stringWriter);System.out.println(map.get("content"));// 上传InputStream byteArrayInputStream = new ByteArrayInputStream(stringWriter.toString().getBytes());String static_url = fileStorageService.uploadHtmlFile("", apArticleContent.getArticleId() + ".html", byteArrayInputStream);System.out.println(static_url);// 修改 article表ApArticle apArticle = new ApArticle();apArticle.setId(apArticleContent.getArticleId());apArticle.setStaticUrl(static_url);apArticleMapper.updateById(apArticle);// 存储}System.out.println("a");}
}

知识点二:Interceptor拦截器中使用ThreadLoad存储WmUser对象

  1. 流程

  1. 步骤1从过滤器中将token中取出来的id存入到header中
       // 获取token解析后的idObject id = claimsBody.get("id");// 存ID到header中ServerHttpRequest id1 = request.mutate().headers(headers -> headers.add("id", id.toString())).build();exchange.mutate().request(id1).build();
  1. 将header内容放入到threadLoad中
package com.heima.utils.thread;import com.heima.model.wemedia.pojos.WmUser;public class WmThreadLoadUtil {private final static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();// 添加public static void addWmUser(WmUser wmUser){WM_USER_THREAD_LOCAL.set(wmUser);}// 获取public static WmUser getWmUser(){return WM_USER_THREAD_LOCAL.get();}//清除public static void removeWmUser(){WM_USER_THREAD_LOCAL.remove();}
}
  1. 建立拦截器
 package com.heima.wemedia.interceptor;import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.thread.WmThreadLoadUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;@Slf4j
public class WmTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String userId = request.getHeader("userId");if (userId !=null) {// 创建一个wmUser对象并存储到threadLoad中WmUser wmUser = new WmUser();wmUser.setId(Integer.valueOf(userId));WmThreadLoadUtil.addWmUser(wmUser);}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 请求结束,清除用户WmThreadLoadUtil.removeWmUser();}//}
  1. 建立拦截器配置类
package com.heima.wemedia.config;import com.heima.wemedia.interceptor.WmTokenInterceptor;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WmMvcConfig implements WebMvcConfigurer {//添加拦截器并拦截所有@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");}
}

知识点三:实现图片上传接口

  1. 接口信息
说明
接口路径/api/v1/material/upload_picture
请求方式POST
参数MultipartFile
响应结果ResponseResult
  1. Controller
package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.wemedia.service.WmMaterialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
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;@RestController
@RequestMapping("/api/v1/material/")
public class WmMaterialController {@Autowiredprivate WmMaterialService wmMaterialService;@PostMapping("/upload_picture")public ResponseResult upLoadImg(MultipartFile multipartFile){return wmMaterialService.upLoad_image(multipartFile);}
}
  1. Mapper
package com.heima.wemedia.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.wemedia.pojos.WmMaterial;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface WmMaterialMapper extends BaseMapper<WmMaterial> {
}
  1. ServiceImpl
package com.heima.wemedia.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.file.service.FileStorageService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.utils.thread.WmThreadLoadUtil;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.service.WmMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.Date;
import java.util.UUID;@Service
@Transactional
@Slf4j
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {@Autowiredprivate FileStorageService fileStorageService;@Overridepublic ResponseResult upLoad_image(MultipartFile multipartFile ) {if (multipartFile !=null &&multipartFile.getSize()!=0) {ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);}// 拼接名称String replace = UUID.randomUUID().toString().replace("-", "");String originalFilename = multipartFile.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 上传String url = "";try {url= fileStorageService.uploadImgFile("", replace + suffix, multipartFile.getInputStream());} catch (IOException e) {throw new RuntimeException(e);}System.out.println(url);System.out.println(WmThreadLoadUtil.getWmUser());WmMaterial wmMaterial = new WmMaterial();wmMaterial.setUserId(WmThreadLoadUtil.getWmUser().getId());wmMaterial.setUrl(url);wmMaterial.setType((short)0);wmMaterial.setCreatedTime(new Date());wmMaterial.setIsCollection((short)0);save(wmMaterial);return ResponseResult.okResult(wmMaterial);}
}
  1. 效果图

知识点四:素材列表查询

| | **说明** | | --- | --- | | 接口路径 | /api/v1/material/list | | 请求方式 | POST | | 参数 | WmMaterialDto | | 响应结果 | ResponseResult |
  1. controller
@PostMapping("/list")
public ResponseResult list(@RequestBody WmMaterialDto wmMaterialDto ){return wmMaterialService.findList(wmMaterialDto);
}
  1. 建立Dto
package com.heima.model.wemedia.dtos;import com.heima.model.common.dtos.PageRequestDto;
import lombok.Data;@Data
public class WmMaterialDto  extends PageRequestDto {/*** 1 收藏* 0 未收藏*/private Short isCollection;
}
  1. service
@Override
public ResponseResult findList(WmMaterialDto wmMaterialDto) {
// 检查参数
wmMaterialDto.checkParam();
//分页查询
IPage page = new Page(wmMaterialDto.getPage(),wmMaterialDto.getSize());
LambdaQueryWrapper<WmMaterial> queryWrapper = new LambdaQueryWrapper<WmMaterial>();
// 是否收藏
if (wmMaterialDto.getIsCollection() !=null && wmMaterialDto.getIsCollection()==1) {queryWrapper.eq(WmMaterial::getIsCollection,wmMaterialDto.getIsCollection());}// 按照用户id查询
queryWrapper.eq(WmMaterial::getUserId,WmThreadLoadUtil.getWmUser().getId());
// 创建时间倒序
queryWrapper.orderByDesc(WmMaterial::getCreatedTime);page = page(page, queryWrapper);PageResponseResult pageResponseResult = new PageResponseResult(wmMaterialDto.getPage(), wmMaterialDto.getSize(), (int) page.getTotal());
pageResponseResult.setData(page.getRecords());return pageResponseResult;
}

知识点五:素材列表查询

  1. 接口
说明
接口路径/api/v1/news/list
请求方式POST
参数WmNewsPageReqDto
响应结果ResponseResult
  1. controller
package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.wemedia.service.WmChannelService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/v1/channel/")public class WmChannelController {@Autowiredprivate WmChannelService wmChannelService;@GetMapping("/channels")public ResponseResult findALl(){return wmChannelService.findAll();}
}
  1. mapper
package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.wemedia.service.WmChannelService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/v1/channel/")public class WmChannelController {@Autowiredprivate WmChannelService wmChannelService;@GetMapping("/channels")public ResponseResult findALl(){return wmChannelService.findAll();}
}
  1. pojo
package com.heima.model.wemedia.pojos;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** <p>* 频道信息表* </p>** @author itheima*/
@Data
@TableName("wm_channel")
public class WmChannel implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Integer id;/*** 频道名称*/@TableField("name")private String name;/*** 频道描述*/@TableField("description")private String description;/*** 是否默认频道* 1:默认     true* 0:非默认   false*/@TableField("is_default")private Boolean isDefault;/*** 是否启用* 1:启用   true* 0:禁用   false*/@TableField("status")private Boolean status;/*** 默认排序*/@TableField("ord")private Integer ord;/*** 创建时间*/@TableField("created_time")private Date createdTime;}
  1. serivceImpl
package com.heima.wemedia.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.pojos.WmChannel;
import com.heima.wemedia.mapper.WmChannelMapper;
import com.heima.wemedia.service.WmChannelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Transactional
@Slf4j
public class WmChannelServiceImpl   extends ServiceImpl<WmChannelMapper, WmChannel> implements WmChannelService {@Overridepublic ResponseResult findAll() {return ResponseResult.okResult(list());}
}
  1. 预览

知识点六:文章列表加载

  1. 接口
说明
接口路径/api/v1/news/list
请求方式POST
参数WmNewsPageReqDto
响应结果ResponseResult
  1. Controller
package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.dtos.WmNewsPageReqDto;
import com.heima.model.wemedia.pojos.WmChannel;
import com.heima.wemedia.service.WmNewsService;
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/news")
public class WnNewsController {@Autowiredprivate WmNewsService wmNewsService;@PostMapping("/list")public ResponseResult list(@RequestBody WmNewsPageReqDto wmNewsPageReqDto){return wmNewsService.findList(wmNewsPageReqDto);}
}
  1. Mapper
package com.heima.wemedia.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.wemedia.pojos.WmNews;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface WnNewsMapper extends BaseMapper<WmNews> {
}
  1. ServiceImpl
package com.heima.wemedia.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.WmNewsPageReqDto;
import com.heima.model.wemedia.pojos.WmNews;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.thread.WmThreadLoadUtil;
import com.heima.wemedia.mapper.WnNewsMapper;
import com.heima.wemedia.service.WmNewsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.util.HttpExceptionUtils;
import org.apache.hadoop.util.ThreadUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
@Slf4j
public class WmNewsServiceImpl extends ServiceImpl<WnNewsMapper, WmNews> implements WmNewsService {@Overridepublic ResponseResult findList(WmNewsPageReqDto wmNewsPageReqDto) {WmUser wmUser = WmThreadLoadUtil.getWmUser();if (wmUser==null || wmNewsPageReqDto==null) {return  ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);}// 检查参数wmNewsPageReqDto.checkParam();// 分页查询IPage page = new Page(wmNewsPageReqDto.getPage(), wmNewsPageReqDto.getSize());LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<WmNews>();// 状态精确查询if (wmNewsPageReqDto.getStatus()!=null) {queryWrapper.eq(WmNews::getStatus,wmNewsPageReqDto.getStatus());}//频道精确查询if (wmNewsPageReqDto.getChannelId() !=null) {queryWrapper.eq(WmNews::getChannelId,wmNewsPageReqDto.getChannelId());}// 发布时间模糊查询if (wmNewsPageReqDto.getBeginPubDate()!=null && wmNewsPageReqDto.getEndPubDate()!=null) {queryWrapper.between(WmNews::getPublishTime,wmNewsPageReqDto.getBeginPubDate(),wmNewsPageReqDto.getEndPubDate());}// 关键字模糊查询if (wmNewsPageReqDto.getKeyword() !=null) {queryWrapper.like(WmNews::getTitle,wmNewsPageReqDto.getKeyword());}// 当前用户登录查询queryWrapper.eq(WmNews::getUserId, WmThreadLoadUtil.getWmUser().getId());//发布时间倒序queryWrapper.orderByDesc(WmNews::getPublishTime);page = page(page, queryWrapper);ResponseResult responseResult = new PageResponseResult(wmNewsPageReqDto.getPage(),wmNewsPageReqDto.getSize(),(int)page.getTotal());responseResult.setData(page.getRecords());return responseResult;}
}
  1. 预览图

http://www.dtcms.com/a/390655.html

相关文章:

  • 精准模拟,实战赋能-比亚迪秦EV整车检测与诊断仿真实训系统
  • 学习路之PHP--生成测试数据:fakerphp的使用
  • 《UE5_C++多人TPS完整教程》学习笔记54 ——《P55 旋转根骨骼(Rotate Root Bone)》
  • go资深之路笔记(五)用系统信号实现优雅关机
  • C++实战㉔】解锁C++ STL魔法:list与deque实战秘籍
  • Linux 系统指令——助力信奥初赛
  • LVS详解:构建高性能Linux负载均衡集群
  • 【Linux网络编程】网络层协议-----IP协议
  • 电池AH的定义与WH关系
  • 谙流 ASK 技术解析(四):负载均衡引擎
  • 乾元通渠道商中标国家华中区域应急救援中心应急救援装备采购项目
  • 网络原理补充——NAT/NAPT、代理服务、内网穿透、交换机
  • 深入 HTTP 协议:剖析 1688 商品详情 API 的请求构造与签名机制
  • 共用体union和大小端模式
  • 2022年下半年 系统架构设计师 案例分析
  • LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)
  • go webrtc - 3 工程演示
  • JVM(五)-- 执行引擎
  • 微算法科技(NASDAQ:MLGO)量子架构搜索技术:突破变分量子算法性能瓶颈,实现量子计算的鲁棒优化
  • 海亮科技亮相第十一届亚教展,“教育 + AI”赋能县域教育振兴
  • JMeter的配置元件
  • Charles与Postman、JMeter结合使用教程:高效接口调试与性能测试方案
  • 【Haddop】Hive的离线分析与Sqoop的数据集成
  • 嵌入式 Linux 基础入门笔记(1)
  • Starlink 2.0与3GPP NTN技术对比分析:颠覆性优势与产业格局重构
  • 鸿蒙Next用户文件管理全解析:安全、高效、跨设备的未来体验
  • 简形电力JX2202 智能测试系统:重构新能源电力检测效率标准
  • AI识别视频中动物与人物的技术深度解析
  • iOS 上架完整流程指南 苹果应用发布步骤、App Store 上架流程
  • MySQL-CRUD 操作及常用查询语法详解