微服務項目收獲和總結---第2,3天(分庫分表思想,文章業務)

①分庫分表思想

文章表一對一為什么要拆分?因為文章的內容會非常大,查詢效率會很低,我們經常操作文章的基本信息,不會很經常查詢文章內容。充分發揮高頻數據的操作效率。?

②freemarker和minIO

由于文章內容數據量過大,我們通過freemarker創建出靜態頁面并且上傳到minIO中存儲,前端訪問時直接訪問靜態頁面。

③自媒體素材管理

?數據庫表:

素材表:創作者可上傳素材到其中,并且可以設置收藏與否
文章表:創作者所發布的文章的表,包括每一篇文章的用戶ID,標題,內容,封面格式,頻道,當前狀態
文章素材關系表:文章與素材引用的關系表格

業務邏輯:!!!!非常重要要捋清楚

①你寫一篇文章,可以選擇保存草稿或者直接發布。

②如果你是保存草稿,先要判斷該文章是否已經存在,疑問點:為什么草稿也要判斷是否已經存在,因為還有編輯草稿的操作,當你把之前的草稿進行重新編輯時提交就要判斷是否存在。如果是新增草稿,就新增一篇文章,并把內容中的圖片與素材的關系表添加數據進行綁定,而且也要把封面的圖片與素材進行綁定。然后就可以結束。

③如果是發布文章,因為文章也有編輯發布和直接發布操作。所以也是要判斷是否已經存在該文章。如果是直接發布文章,則不會存在ID,然后把內容和封面的圖片與素材的綁定關系添加到數據庫的文章素材關系表中即可。但是如果是把已經發布的文章進行編輯然后再發布,首先也是要判斷是否存在當然這一步判斷肯定是存在的,然后就需要把舊版本的文章內容和封面所綁定的圖片進行刪除,然后再更新新的綁定關系。

代碼實現:

首先要熟悉前端傳過來的參數:

代碼:
public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper,WmNews> implements WmNewsService {@Overridepublic ResponseResult findList(WmNewsPageReqDto dto) {//檢查參數dto.checkParam();//分頁查詢IPage page =new Page(dto.getPage(),dto.getSize());LambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper();//狀態精確查詢if(dto.getStatus() != null){lambdaQueryWrapper.eq(WmNews::getStatus,dto.getStatus());}//頻道精確查詢if(dto.getChannelId() != null){lambdaQueryWrapper.eq(WmNews::getChannelId,dto.getChannelId());}//時間范圍查詢if(dto.getBeginPubDate() != null && dto.getEndPubDate() != null){lambdaQueryWrapper.between(WmNews::getPublishTime,dto.getBeginPubDate(),dto.getEndPubDate());}//關鍵字模糊查詢if (StringUtils.isNotBlank(dto.getKeyword())){lambdaQueryWrapper.like(WmNews::getTitle,dto.getKeyword());}//查詢當前登錄人的文章lambdaQueryWrapper.eq(WmNews::getUserId, WmThreadLocalUtil.getUser().getId());//按照發布時間倒序查詢lambdaQueryWrapper.orderByDesc(WmNews::getPublishTime);//查詢page = page(page, lambdaQueryWrapper);ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());responseResult.setData(page.getRecords());//結果返回return responseResult;}@Overridepublic ResponseResult submitNews(WmNewsDto dto) {//條件判斷,判斷前端穿過來的值不為空if(dto == null || dto.getContent() == null){return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);}//保存或者修改文章,把基本信息保存到News文章對象中WmNews wmNews = new WmNews();BeanUtils.copyProperties(dto,wmNews);//圖片的類型轉換,把字符串中的封面圖片路徑提取出來,保存到Nes對象中if(dto.getImages() != null && dto.getImages().size()>0){String imgesStr = StringUtils.join(dto.getImages(), ",");wmNews.setImages(imgesStr);}//如果封面類型為自動,先把封面類型設置為空if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){wmNews.setType(null);}//直接保存到數據庫中,并且把圖片和素材的關系刪除saveOrUpdateNews(wmNews);//判斷是否為草稿就可以直接返回,如果是,結束方法if(dto.getStatus().equals(WmNews.Status.NORMAL.getCode())){return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);}//不是草稿,保存文章內容圖片與素材的關系//獲取到內容中的圖片信息List<String> materials = ectractUrlInfo(dto.getContent());//將正文中的圖片信息+文章的ID,即正文圖片與素材的綁定關系保存到數據庫中saveRelativeInfoForContent(materials,wmNews.getId());//保存文章封面圖片與素材的關系saveRelativeInfoForCover(dto,wmNews,materials);return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);}/*** 根據封面規則去存儲* @param dto* @param wmNews* @param materials*///內容圖片等于1  小于3  單圖 type 1//大于3 多圖 type 3//沒圖  無圖 type 0//保存封面與素材的關系@Autowiredprivate WmMaterialMapper wmMaterialMapper;@Autowiredprivate WmNewsMaterialMapper wmNewsMaterialMapper;//保存或修改文章private void saveOrUpdateNews(WmNews wmNews) {//補全屬性wmNews.setUserId(WmThreadLocalUtil.getUser().getId());wmNews.setCreatedTime(new Date());wmNews.setSubmitedTime(new Date());wmNews.setEnable((short) 1); //默認為上架if(wmNews.getId() == null){//保存save(wmNews);}else{//修改//刪除文章圖片與素材的關系wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId,wmNews.getId()));updateById(wmNews);}}//提取文章內容的圖片信息private List<String> ectractUrlInfo(String content) {List<String> materials = new ArrayList<>();List<Map> maps = JSON.parseArray(content, Map.class);for (Map map : maps) {if(map.get("type").equals("image")){String imgUrl  = (String) map.get("value");materials.add(imgUrl);}}return materials;}//處理文章內容圖片與素材的關系private void saveRelativeInfoForContent(List<String> materials, Integer newsId) {saveRelativeInfo(materials,newsId, WemediaConstants.WM_CONTENT_REFERENCE);}//保存文章內容圖片和素材的關系到數據庫中private void saveRelativeInfo(List<String> materials, Integer newsId, Short type) {if(materials != null && !materials.isEmpty()){//通過圖片查詢素材的idList<WmMaterial> dbMaterials = wmMaterialMapper.selectList(Wrappers.<WmMaterial>lambdaQuery().in(WmMaterial::getUrl, materials));//判斷素材是否有效if(dbMaterials == null || dbMaterials.size() == 0){//手動拋異常throw new CustomException(AppHttpCodeEnum.MATERIAL_REFERENCE_FALL);}if(materials.size() != dbMaterials.size()){throw new CustomException(AppHttpCodeEnum.MATERIAL_REFERENCE_FALL);}List<Integer> idList = dbMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList());//批量保存wmNewsMaterialMapper.saveRelations(idList,newsId,type);}}//保存封面圖片和素材的關系到數據庫中private void saveRelativeInfoForCover(WmNewsDto dto, WmNews wmNews, List<String> materials) {List<String> images = dto.getImages();if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){//多圖if(materials.size() >= 3){wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);images = materials.stream().limit(3).collect(Collectors.toList());}else if(materials.size() >1 && materials.size() <3){//單圖wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);images = materials.stream().limit(1).collect(Collectors.toList());}else{//無圖wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);}//修改文章if(images != null && images.size() > 0){wmNews.setImages(StringUtils.join(images,","));}updateById(wmNews);}if(images != null && images.size() > 0){saveRelativeInfo(images,wmNews.getId(),WemediaConstants.WM_COVER_REFERENCE);}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13953.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git clone 出現的問題

問題: core源碼ref新API % git clone https://github.com/xxxx.git Cloning into core... remote: Enumerating objects: 58033, done. remote: Counting objects: 100% (1393/1393), done. remote: Compressing objects: 100% (750/750), done. error: 432 bytes of body are …

辦公自動化-Python如何提取Word標題并保存到Excel中?

辦公自動化-Python如何提取Word標題并保存到Excel中&#xff1f; 應用場景需求分析實現思路實現過程安裝依賴庫打開需求文件獲取word中所有標題去除不需要的標題創建工作簿和工作表分割標題功能名稱存入測試對象GN-TC需求標識符存入測試項標識存入需求標識符 完整源碼實現效果學…

Nginx學習與使用記錄

這里寫自定義目錄標題 定義域名&#xff08;本地&#xff09;Nginx的一下常用命令記錄win系統使用 .bat來啟動nginx配置 定義域名&#xff08;本地&#xff09; 本地定義域名不需要證書&#xff0c;直接更改hosts文件。 注意&#xff1a;在這個文件夾中是無法更改hosts文件的&…

Vue02-黑馬程序員學習筆記

一、今日學習目標 1.指令補充 指令修飾符v-bind對樣式增強的操作v-model應用于其他表單元素 2.computed計算屬性 基礎語法計算屬性vs方法計算屬性的完整寫法成績案例 3.watch偵聽器 基礎寫法完整寫法 4.綜合案例 &#xff08;演示&#xff09; 渲染 / 刪除 / 修改數量 …

一個簡約高級視差效果PR動態圖文開場視頻模板

這是一個高質量且易于定制的pr模板。具有模塊化結構&#xff0c;可以輕松更改內容。包括視頻教程&#xff0c;即使是新手小白也可以輕松套用模板制作視頻。 主要特點&#xff1a; 水平&#xff08;19201080&#xff09;和垂直&#xff08;10801920&#xff09;分辨率&#xff…

c語言:利用隨機函數產生20個[120, 834] 之間互不相等的隨機數, 并利用選擇排序法將其從小到大排序后輸出(每行輸出5個)

利用隨機函數產生20個[120, 834] 之間互不相等的隨機數&#xff0c; 并利用選擇排序法將其從小到大排序后輸出&#xff08;每行輸出5個&#xff09; 代碼如下&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> int shenchen(int a[…

三維模型相互轉換(obj文件轉inp文件)

三維模型文件根據其含義都是可以進行相互轉換的&#xff0c;這里主要介紹obj文件轉化為inp文件。 什么是inp文件&#xff1f; inp文件是以.inp為后綴的文本文件&#xff0c;它包括了模型的全部數據信息&#xff0c;ABAQUS求解器分析的對象是inp文件&#xff0c;軟件生成的.ca…

PHP身份證真偽驗證、身份證二、三要素核驗、身份證ocr接口

實名認證有利于網絡綠化&#xff0c;所以在互聯網發展迅速的今天&#xff0c;實名認證成了“剛需”。而OCR與實名認證兩種產品的結和更是擦出了美麗的火花。翔云人工智能開放平臺提供的實名認證OCR接口良好的展現出兩種功能結合的效果。以身份實名認證產品舉例來說&#xff0c;…

AI智能體|扣子Coze“圖像流”功能速覽

大家好&#xff0c;我是無界生長。 AI智能體&#xff5c;扣子Coze“圖像流”功能速覽Coze提供易上手的圖像處理工作流&#xff0c;包含智能生成、智能編輯和基礎編輯三類節點&#xff0c;旨在通過AI技術簡化圖像處理過程。本文對扣子Coze“圖像流”功能做了簡單介紹&#xff0…

【qt】初識模型和視圖

模型和視圖 一.模型和視圖的概念1.關系2.模型3.數據4.視圖5.特點 二.文件系統模型1.那種數據&#xff1f;2.界面拖放3.創建模型4.模型設置數據5.視圖設置模型6.模型索引7.模型操作數據①文件名②文件大小③文件類型④是否是目錄⑤文件路徑 三.字符串鏈表模型1.那種數據&#xf…

論Promise在前端江湖的地位及作用

系列文章&#xff1a; 先擼清楚&#xff1a;并發/并行、單線程/多線程、同步/異步 論Promise在前端江湖的地位及作用 前言 上篇文章闡述了并發/并行、單線程/多線程、同步/異步等概念&#xff0c;這篇將會分析Promise的江湖地位。 通過本篇文章&#xff0c;你將了解到&#x…

100base-tx、100base-fx的區別

100表示網線設計的頻率&#xff0c;單位MHz。值越大&#xff0c;網線的速度越快。baseBASEband的縮寫&#xff0c;基帶t物理介質是雙絞線纜f物理介質是光纖x同一個傳輸效率下的多種不同的標準 T表示雙絞線&#xff0c;base-tx是運行超五類雙絞線的快速以太網端口&#xff0c;全…

AI崛起,掌握它,開啟智能新生活!

AI崛起&#xff0c;掌握它&#xff0c;開啟智能新生活&#xff01; &#x1f604;生命不息&#xff0c;寫作不止 &#x1f525; 繼續踏上學習之路&#xff0c;學之分享筆記 &#x1f44a; 總有一天我也能像各位大佬一樣 &#x1f3c6; 博客首頁 怒放吧德德 To記錄領地 &…

Linux中vim的基本使用

目錄 vim中的三種模式以及基本操作命令模式(默認模式)插入模式底行模式 命令模式下的命令底行模式下的命令 vim是Linux和Unix環境下最基本的文本編輯器&#xff0c;類似于windows上的記事本 vim和Visual studio相比&#xff0c;vim并不集成&#xff0c;vim只能用來寫代碼 VS把寫…

Nginx限制IP訪問詳解

在Web服務器管理中&#xff0c;限制某些IP地址訪問網站是一個常見的需求。Nginx作為一款高性能的HTTP服務器和反向代理服務器&#xff0c;提供了靈活強大的配置選項來實現這一功能。本文將詳細講解如何在Nginx中限制IP訪問&#xff0c;并通過示例代碼展示具體操作。 一、Nginx…

使用 Python 簡單幾步去除 PDF 水印

推薦一個AI網站&#xff0c;免費使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鯨AI 在處理 PDF 文件時&#xff0c;水印有時會影響文件的可讀性或美觀性。幸運的是&#xff0c;Python 提供了多種庫來操作 PDF 文件&#xff0c;其中 PyMuPDF&#xff08;又名 fitz&#xf…

2024年5月24日 十二生肖 今日運勢

小運播報&#xff1a;2024年5月24日&#xff0c;星期五&#xff0c;農歷四月十七 &#xff08;甲辰年己巳月戊子日&#xff09;&#xff0c;法定工作日。 紅榜生肖&#xff1a;龍、牛、猴 需要注意&#xff1a;兔、羊、馬 喜神方位&#xff1a;東南方 財神方位&#xff1a;…

深度學習之基于Matlab的BP神經網絡交通標志識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著智能交通系統&#xff08;ITS&#xff09;的快速發展&#xff0c;交通標志識別&#xff0…

BUUCTF---misc---[MRCTF2020]ezmisc

1、附件下載后是一張圖片 2、查看屬性&#xff0c;winhex分析&#xff0c;沒發現什么 3、在kali中binwalk和foremost也沒找到什么信息 4、用stegsolve分析也沒發現什么 5、這里幾乎常見的misc方法都試過了&#xff0c;還是沒有發現什么 6、回歸到圖片本身&#xff0c;想到的…

Nginx性能調優:深入剖析配置與調優技巧

一、引言 Nginx作為一款高性能的HTTP和反向代理服務器&#xff0c;已經被廣泛應用于各種Web服務中。然而&#xff0c;要想充分發揮Nginx的性能優勢&#xff0c;僅僅安裝和配置默認設置是遠遠不夠的。本文將深入剖析Nginx的配置與調優技巧&#xff0c;幫助讀者打造更加高效、穩…