From e7052f07d03908e4480a5270714f7fbf8cc20c6f Mon Sep 17 00:00:00 2001 From: xpecya Date: Wed, 11 Dec 2024 08:46:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=96=B0=E9=97=BB=E8=AF=A6=E6=83=85=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/NewsController.java | 29 ++++ .../reference/core/mapper/NewsMapper.java | 12 ++ .../reference/core/mapper/TagMapper.java | 20 +++ .../reference/core/model/entity/Column.java | 13 ++ .../core/model/vo/news/NewsDetailColumn.java | 45 ++++++ .../model/vo/news/NewsDetailColumnVip.java | 44 ++++++ .../core/model/vo/news/NewsDetailTag.java | 25 +++ .../core/model/vo/news/NewsDetailTagItem.java | 25 +++ .../core/model/vo/news/NewsDetailVO.java | 97 ++++++++++++ .../reference/core/service/NewsService.java | 147 ++++++++++++++++++ 10 files changed, 457 insertions(+) create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumn.java create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumnVip.java create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTag.java create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTagItem.java create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java index 980e044..9300568 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.jinrui.reference.core.model.dto.news.SaveNewsDTO; import com.jinrui.reference.admin.model.entity.AdminUser; import com.jinrui.reference.core.model.vo.ResultObject; +import com.jinrui.reference.core.model.vo.news.NewsDetailVO; import com.jinrui.reference.core.model.vo.news.NewsVO; import com.jinrui.reference.admin.service.AdminJwtService; import com.jinrui.reference.core.model.vo.PageObject; @@ -35,6 +36,34 @@ public class NewsController { this.objectMapper = objectMapper; } + @GetMapping("/detail") + public ResultObject detail(@RequestHeader("auth-token") String token, + @RequestParam("id") Long id) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + Long adminUserId = adminUser.getId(); + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUserId); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /news/detail, method: GET, request user id: {}, news id: {}", adminUserId, id); + return newsService.detail(id); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } + @DeleteMapping public ResultObject deleteNews(@RequestHeader("auth-token") String token, @RequestParam("id") Long id) { diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java index 8cb8326..b709a8b 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java @@ -18,6 +18,18 @@ public interface NewsMapper { @Delete("delete from news_draft where id = #{draftId}") void deleteDraft(@Param("draftId") Long draftId); + @Select("select id, title, summary, picture, content, " + + "create_time as createTime, " + + "update_time as updateTime " + + "from news_draft where id = #{id}") + NewsDraft getDraftDetail(@Param("id") Long id); + + @Select("select id, title, summary, picture, content, " + + "create_time as createTime, " + + "update_time as updateTime " + + "from news where id = #{id}") + News getNewsDetail(@Param("id") Long id); + @Update("update news " + "set draft_id = #{draftId}," + "editor_id = #{editorId}," + diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java index 13b3d66..9947cda 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java @@ -1,5 +1,7 @@ package com.jinrui.reference.core.mapper; +import com.jinrui.reference.core.model.entity.DraftTagRel; +import com.jinrui.reference.core.model.entity.NewsTagRel; import com.jinrui.reference.core.model.entity.Tag; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; @@ -14,6 +16,24 @@ import java.util.List; public interface TagMapper { + @Results({ + @Result(column = "id", property = "id", id = true), + @Result(column = "parent_id", property = "parentId"), + @Result(column = "name", property = "name"), + @Result(column = "create_time", property = "createTime", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(column = "update_time", property = "updateTime", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP) + }) + @Select("select * from tag") + List queryAll(); + + @Select("select id, draft_id as draftId, tag_id as tagId " + + "from draft_tag_rel where draft_id = #{draftId}") + List getDraftTagRelList(@Param("draftId") Long draftId); + + @Select("select id, news_id as newsId, tag_id as tagId " + + "from news_tag_rel where news_id = #{newsId}") + List getNewsTagRelList(@Param("newsId") Long newsId); + @Delete("delete from news_tag_rel where news_id = #{newsId}") void deleteNews(@Param("newsId") Long newsId); diff --git a/core/src/main/java/com/jinrui/reference/core/model/entity/Column.java b/core/src/main/java/com/jinrui/reference/core/model/entity/Column.java index a8a89a2..96e4fca 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/entity/Column.java +++ b/core/src/main/java/com/jinrui/reference/core/model/entity/Column.java @@ -13,6 +13,11 @@ public class Column { */ private Long id; + /** + * 上级栏目ID + */ + private Long parentId; + /** * 栏目名称 */ @@ -41,6 +46,14 @@ public class Column { this.id = id; } + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + public String getName() { return name; } diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumn.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumn.java new file mode 100644 index 0000000..cbad37d --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumn.java @@ -0,0 +1,45 @@ +package com.jinrui.reference.core.model.vo.news; + +import com.jinrui.reference.core.model.dto.news.SaveDraftColumnItem; + +@SuppressWarnings("unused") +public class NewsDetailColumn { + + private NewsDetailColumnVip vip; + + private SaveDraftColumnItem earlyKnow; + + private boolean showEverything = false; + + public NewsDetailColumnVip getVip() { + return vip; + } + + public void setVip(NewsDetailColumnVip vip) { + this.vip = vip; + } + + public boolean isShowEverything() { + return showEverything; + } + + public void setShowEverything(boolean showEverything) { + this.showEverything = showEverything; + } + + public SaveDraftColumnItem getEarlyKnow() { + return earlyKnow; + } + + public void setEarlyKnow(SaveDraftColumnItem earlyKnow) { + this.earlyKnow = earlyKnow; + } + + public Boolean getShowEverything() { + return showEverything; + } + + public void setShowEverything(Boolean showEverything) { + this.showEverything = showEverything; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumnVip.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumnVip.java new file mode 100644 index 0000000..c8ff4be --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailColumnVip.java @@ -0,0 +1,44 @@ +package com.jinrui.reference.core.model.vo.news; + +public class NewsDetailColumnVip { + + private Long id; + + private String name; + + private Integer type; + + private NewsDetailColumnVip child; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public NewsDetailColumnVip getChild() { + return child; + } + + public void setChild(NewsDetailColumnVip child) { + this.child = child; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTag.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTag.java new file mode 100644 index 0000000..4b22555 --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTag.java @@ -0,0 +1,25 @@ +package com.jinrui.reference.core.model.vo.news; + +@SuppressWarnings("unused") +public class NewsDetailTag { + + private NewsDetailTagItem source; + + private NewsDetailTagItem field; + + public NewsDetailTagItem getSource() { + return source; + } + + public void setSource(NewsDetailTagItem source) { + this.source = source; + } + + public NewsDetailTagItem getField() { + return field; + } + + public void setField(NewsDetailTagItem field) { + this.field = field; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTagItem.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTagItem.java new file mode 100644 index 0000000..246c11e --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailTagItem.java @@ -0,0 +1,25 @@ +package com.jinrui.reference.core.model.vo.news; + +@SuppressWarnings("unused") +public class NewsDetailTagItem { + + private Long id; + + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java new file mode 100644 index 0000000..146390e --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java @@ -0,0 +1,97 @@ +package com.jinrui.reference.core.model.vo.news; + +import com.jinrui.reference.core.model.dto.news.SaveDraftColumn; +import com.jinrui.reference.core.model.dto.news.SaveDraftTag; +import com.jinrui.reference.core.model.entity.News; +import com.jinrui.reference.core.model.entity.NewsDraft; + +@SuppressWarnings("unused") +public class NewsDetailVO { + + private Long id; + + private String title; + + private String summary; + + private String picture; + + private NewsDetailTag tag; + + private NewsDetailColumn column; + + private String content; + + public NewsDetailVO() {} + + public NewsDetailVO(News news) { + this.id = news.getId(); + this.title = news.getTitle(); + this.summary = news.getSummary(); + this.picture = news.getPicture(); + this.content = news.getContent(); + } + + public NewsDetailVO(NewsDraft newsDraft) { + this.title = newsDraft.getTitle(); + this.summary = newsDraft.getSummary(); + this.picture = newsDraft.getPicture(); + this.content = newsDraft.getContent(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + public NewsDetailTag getTag() { + return tag; + } + + public void setTag(NewsDetailTag tag) { + this.tag = tag; + } + + public NewsDetailColumn getColumn() { + return column; + } + + public void setColumn(NewsDetailColumn column) { + this.column = column; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java index a9129e8..60b7109 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java @@ -12,12 +12,20 @@ import com.jinrui.reference.core.model.dto.news.SaveNewsDTO; import com.jinrui.reference.core.model.dto.news.SaveDraftTag; import com.jinrui.reference.core.model.entity.Column; import com.jinrui.reference.core.model.entity.DraftColumnRel; +import com.jinrui.reference.core.model.entity.DraftTagRel; import com.jinrui.reference.core.model.entity.News; import com.jinrui.reference.core.model.entity.NewsColumnRel; import com.jinrui.reference.core.model.entity.NewsDraft; +import com.jinrui.reference.core.model.entity.NewsTagRel; +import com.jinrui.reference.core.model.entity.Tag; import com.jinrui.reference.core.model.vo.PageObject; import com.jinrui.reference.core.model.vo.ResultObject; import com.jinrui.reference.core.model.vo.column.ColumnVO; +import com.jinrui.reference.core.model.vo.news.NewsDetailColumn; +import com.jinrui.reference.core.model.vo.news.NewsDetailColumnVip; +import com.jinrui.reference.core.model.vo.news.NewsDetailTag; +import com.jinrui.reference.core.model.vo.news.NewsDetailTagItem; +import com.jinrui.reference.core.model.vo.news.NewsDetailVO; import com.jinrui.reference.core.model.vo.news.NewsVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,8 +34,10 @@ import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -51,6 +61,143 @@ public class NewsService { this.tagMapper = tagMapper; } + public ResultObject detail(Long id) { + News news = newsMapper.getById(id); + if (news == null) { + return ResultObject.success(); + } + + List allTags = tagMapper.queryAll(); + Map tagMap = allTags.stream().collect(Collectors.toMap(Tag::getId, Function.identity())); + List allColumns = columnMapper.queryAll(); + Map columnMap = allColumns.stream().collect(Collectors.toMap(Column::getId, Function.identity())); + Long draftId = news.getDraftId(); + if (draftId != null) { + NewsDraft newsDraft = newsMapper.getDraftDetail(draftId); + NewsDetailVO newsDetailVO = new NewsDetailVO(newsDraft); + newsDetailVO.setId(id); + + Set set = new HashSet<>(); + set.add(draftId); + List columnRelList = columnMapper.queryDraftRel(set); + NewsDetailColumn newsDetailColumn = new NewsDetailColumn(); + newsDetailVO.setColumn(newsDetailColumn); + if (!CollectionUtils.isEmpty(columnRelList)) { + for (DraftColumnRel rel : columnRelList) { + Long columnId = rel.getColumnId(); + int type = rel.getType(); + if (columnId == 13) { + SaveDraftColumnItem item = new SaveDraftColumnItem(); + newsDetailColumn.setEarlyKnow(item); + item.setShow(true); + item.setType(type); + } else if (columnId == 14) { + newsDetailColumn.setShowEverything(true); + } else { + NewsDetailColumnVip vip = new NewsDetailColumnVip(); + vip.setId(columnId); + vip.setType(type); + Column column = columnMap.get(columnId); + String name = column.getName(); + vip.setName(name); + Long parentId = column.getParentId(); + if (parentId != null && parentId != 1L) { + Column parentColumn = columnMap.get(parentId); + NewsDetailColumnVip parent = new NewsDetailColumnVip(); + parent.setId(parentId); + parent.setName(parentColumn.getName()); + parent.setType(type); + parent.setChild(vip); + newsDetailColumn.setVip(parent); + } else { + newsDetailColumn.setVip(vip); + } + } + } + } + List tagRelList = tagMapper.getDraftTagRelList(draftId); + NewsDetailTag newsDetailTag = new NewsDetailTag(); + newsDetailVO.setTag(newsDetailTag); + if (!CollectionUtils.isEmpty(tagRelList)) { + for (DraftTagRel rel : tagRelList) { + Long tagId = rel.getTagId(); + Tag tag = tagMap.get(tagId); + Long parentId = tag.getParentId(); + NewsDetailTagItem tagItem = new NewsDetailTagItem(); + tagItem.setId(tagId); + tagItem.setName(tag.getName()); + if (parentId == 1) { + newsDetailTag.setSource(tagItem); + } else { + newsDetailTag.setField(tagItem); + } + } + } + return ResultObject.success(newsDetailVO); + } + + news = newsMapper.getNewsDetail(id); + NewsDetailVO newsDetailVO = new NewsDetailVO(news); + + Set set = new HashSet<>(); + set.add(id); + List columnRelList = columnMapper.queryNewsRel(set); + NewsDetailColumn newsDetailColumn = new NewsDetailColumn(); + newsDetailVO.setColumn(newsDetailColumn); + if (!CollectionUtils.isEmpty(columnRelList)) { + for (NewsColumnRel rel : columnRelList) { + Long columnId = rel.getColumnId(); + int type = rel.getType(); + if (columnId == 13) { + SaveDraftColumnItem item = new SaveDraftColumnItem(); + newsDetailColumn.setEarlyKnow(item); + item.setShow(true); + item.setType(type); + } else if (columnId == 14) { + newsDetailColumn.setShowEverything(true); + } else { + NewsDetailColumnVip vip = new NewsDetailColumnVip(); + vip.setId(columnId); + vip.setType(type); + Column column = columnMap.get(columnId); + String name = column.getName(); + vip.setName(name); + Long parentId = column.getParentId(); + if (parentId != null && parentId != 1L) { + Column parentColumn = columnMap.get(parentId); + NewsDetailColumnVip parent = new NewsDetailColumnVip(); + parent.setId(parentId); + parent.setName(parentColumn.getName()); + parent.setType(type); + parent.setChild(vip); + newsDetailColumn.setVip(parent); + } else { + newsDetailColumn.setVip(vip); + } + } + } + } + List tagRelList = tagMapper.getNewsTagRelList(id); + NewsDetailTag newsDetailTag = new NewsDetailTag(); + newsDetailVO.setTag(newsDetailTag); + if (!CollectionUtils.isEmpty(tagRelList)) { + for (NewsTagRel rel : tagRelList) { + Long tagId = rel.getTagId(); + Tag tag = tagMap.get(tagId); + Long parentId = tag.getParentId(); + NewsDetailTagItem tagItem = new NewsDetailTagItem(); + tagItem.setId(tagId); + tagItem.setName(tag.getName()); + if (parentId == 1) { + newsDetailTag.setSource(tagItem); + } else { + newsDetailTag.setField(tagItem); + } + } + } + return ResultObject.success(newsDetailVO); + } + public ResultObject createPublish(Long editorId, SaveNewsDTO saveNewsDTO) { Long id = saveNewsDTO.getId(); Long newsId = saveNewsDTO.getId();