diff --git a/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java b/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java index 83f20c7b..7596f4fc 100644 --- a/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java +++ b/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java @@ -30,6 +30,7 @@ public class FrontConfig { "/api/article/list", "/api/pc/getConfig", "/api/pc/index", + "/api/pc/articleDetail", "/api/login/getScanCode", "/api/login/scanLogin", diff --git a/server/like-front/src/main/java/com/mdd/front/controller/PcController.java b/server/like-front/src/main/java/com/mdd/front/controller/PcController.java index 301554f5..a16431e8 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/PcController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/PcController.java @@ -1,9 +1,14 @@ package com.mdd.front.controller; import com.mdd.common.core.AjaxResult; +import com.mdd.common.validator.annotation.IDMust; +import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.service.IPcService; +import com.mdd.front.vo.PcArticleDetailVo; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @@ -19,9 +24,14 @@ public class PcController { @Resource IPcService iPcService; + /** + * 主页 + * + * @author cjh + * @return AjaxResult> + */ @GetMapping("/index") - public AjaxResult> index() - { + public AjaxResult> index() { Map index = iPcService.index(); return AjaxResult.success(index); } @@ -37,4 +47,18 @@ public class PcController { return AjaxResult.success(config); } + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @return AjaxResult + */ + @GetMapping("/articleDetail") + public AjaxResult articleDetail(@Validated @IDMust() @RequestParam("id") Integer id) { + Integer userId = LikeFrontThreadLocal.getUserId(); + PcArticleDetailVo vo = iPcService.articleDetail(id, userId); + return AjaxResult.success(vo); + } + } diff --git a/server/like-front/src/main/java/com/mdd/front/service/IPcService.java b/server/like-front/src/main/java/com/mdd/front/service/IPcService.java index ad3b3a9e..81ac2ea0 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/IPcService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/IPcService.java @@ -1,5 +1,7 @@ package com.mdd.front.service; +import com.mdd.front.vo.PcArticleDetailVo; + import java.util.Map; public interface IPcService { @@ -17,4 +19,14 @@ public interface IPcService { * @return Map */ Map getConfig(); + + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @return Object + */ + PcArticleDetailVo articleDetail(Integer id, Integer userId); + } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java b/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java index ab19705c..f7ef6c2a 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java @@ -4,20 +4,21 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mdd.common.config.GlobalConfig; import com.mdd.common.entity.DecoratePage; import com.mdd.common.entity.article.Article; +import com.mdd.common.entity.article.ArticleCategory; +import com.mdd.common.entity.article.ArticleCollect; +import com.mdd.common.exception.OperateException; import com.mdd.common.mapper.DecoratePageMapper; +import com.mdd.common.mapper.article.ArticleCategoryMapper; +import com.mdd.common.mapper.article.ArticleCollectMapper; import com.mdd.common.mapper.article.ArticleMapper; -import com.mdd.common.util.ArrayUtils; -import com.mdd.common.util.ConfigUtils; -import com.mdd.common.util.TimeUtils; -import com.mdd.common.util.UrlUtils; +import com.mdd.common.util.*; import com.mdd.front.service.IPcService; +import com.mdd.front.vo.PcArticleDetailVo; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; @Service public class PcServiceImpI implements IPcService { @@ -25,9 +26,20 @@ public class PcServiceImpI implements IPcService { @Resource DecoratePageMapper decoratePageMapper; + @Resource + ArticleCategoryMapper articleCategoryMapper; + + @Resource + ArticleCollectMapper articleCollectMapper; + @Resource ArticleMapper articleMapper; + /** + * 配置 + * @author cjh + * @return Map + */ @Override public Map index() { Map indexData = new LinkedHashMap<>(); @@ -106,6 +118,11 @@ public class PcServiceImpI implements IPcService { return indexData; } + /** + * 配置 + * @author cjh + * @return Map + */ @Override public Map getConfig() { Map config = new LinkedHashMap<>(); @@ -146,4 +163,84 @@ public class PcServiceImpI implements IPcService { config.put("qrcode",qrCodeMap); return config; } + + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @param userId 用户ID + * @return PcArticleDetailVo + */ + @Override + public PcArticleDetailVo articleDetail(Integer id, Integer userId) { + // 文章详情 + Article article = articleMapper.selectOne(new QueryWrapper
() + .select(Article.class, info-> + !info.getColumn().equals("is_show") && + !info.getColumn().equals("is_delete") && + !info.getColumn().equals("delete_time")) + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + if (StringUtils.isNull(article)) { + throw new OperateException("文章数据不存在!"); + } + + // 分类名称 + ArticleCategory articleCategory = articleCategoryMapper.selectOne( + new QueryWrapper() + .eq("id", article.getId()) + .eq("is_delete", 0)); + + // 上一条记录 + Article prev = articleMapper.selectOne(new QueryWrapper
() + .select() + .lt("id", id) + .eq("is_delete", 0) + .orderByDesc(Arrays.asList("sort", "id")) + .last("limit 1")); + + // 下一条记录 + Article next = articleMapper.selectOne(new QueryWrapper
() + .select("id,title") + .gt("id", id) + .eq("is_delete", 0) + .orderByDesc(Arrays.asList("sort", "id")) + .last("limit 1")); + + // 是否收藏 + ArticleCollect collect = articleCollectMapper.selectOne(new QueryWrapper() + .eq("article_id", article.getId()) + .eq("user_id", userId) + .eq("is_delete", 0) + .last("limit 1")); + + // 处理数据 + PcArticleDetailVo vo = new PcArticleDetailVo(); + BeanUtils.copyProperties(article, vo); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + vo.setCategory(StringUtils.isNotNull(articleCategory) ? articleCategory.getName() : ""); + vo.setIsCollect(StringUtils.isNotNull(collect) ? 1 : 0); + vo.setPrev(null); + vo.setNext(null); + + if (StringUtils.isNotNull(prev)) { + Map prevMap = new LinkedHashMap<>(); + prevMap.put("id", prev.getId()); + prevMap.put("title", prev.getTitle()); + vo.setPrev(prevMap); + } + + if (StringUtils.isNotNull(next)) { + Map nextMap = new LinkedHashMap<>(); + nextMap.put("id", next.getId()); + nextMap.put("title", next.getTitle()); + vo.setNext(nextMap); + } + + return vo; + } } diff --git a/server/like-front/src/main/java/com/mdd/front/vo/PcArticleDetailVo.java b/server/like-front/src/main/java/com/mdd/front/vo/PcArticleDetailVo.java new file mode 100644 index 00000000..f420da96 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/vo/PcArticleDetailVo.java @@ -0,0 +1,30 @@ +package com.mdd.front.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * PC端文章详情 + */ +@Data +public class PcArticleDetailVo implements Serializable { + + private Integer id; + private Integer cid; + private String category; + private String intro; + private String summary; + private String image; + private String content; + private String author; + private Integer visit; + private Integer sort; + private Integer isCollect; + private String createTime; + private String updateTime; + private Object prev; + private Object next; + + +}