package com.aurora.service.impl;
import com.alibaba.fastjson.JSON;
import com.aurora.model.dto.*;
import com.aurora.entity.Article;
import com.aurora.entity.ArticleTag;
import com.aurora.entity.Category;
import com.aurora.entity.Tag;
import com.aurora.enums.FileExtEnum;
import com.aurora.enums.FilePathEnum;
import com.aurora.exception.BizException;
import com.aurora.mapper.ArticleMapper;
import com.aurora.mapper.ArticleTagMapper;
import com.aurora.mapper.CategoryMapper;
import com.aurora.mapper.TagMapper;
import com.aurora.service.ArticleService;
import com.aurora.service.ArticleTagService;
import com.aurora.service.RedisService;
import com.aurora.service.TagService;
import com.aurora.strategy.context.SearchStrategyContext;
import com.aurora.strategy.context.UploadStrategyContext;
import com.aurora.util.BeanCopyUtil;
import com.aurora.util.PageUtil;
import com.aurora.util.UserUtil;
import com.aurora.model.vo.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.SneakyThrows;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import static com.aurora.constant.RabbitMQConstant.SUBSCRIBE_EXCHANGE;
import static com.aurora.constant.RedisConstant.*;
import static com.aurora.enums.ArticleStatusEnum.*;
import static com.aurora.enums.StatusCodeEnum.ARTICLE_ACCESS_FAIL;
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {
@Autowired
private ArticleMapper articleMapper;
@Autowired
private ArticleTagMapper articleTagMapper;
@Autowired
private CategoryMapper categoryMapper;
@Autowired
private TagMapper tagMapper;
@Autowired
private TagService tagService;
@Autowired
private ArticleTagService articleTagService;
@Autowired
private RedisService redisService;
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private UploadStrategyContext uploadStrategyContext;
@Autowired
private SearchStrategyContext searchStrategyContext;
@SneakyThrows
@Override
public TopAndFeaturedArticlesDTO listTopAndFeaturedArticles() {
List<ArticleCardDTO> articleCardDTOs = articleMapper.listTopAndFeaturedArticles();
if (articleCardDTOs.size() == 0) {
return new TopAndFeaturedArticlesDTO();
} else if (articleCardDTOs.size() > 3) {
articleCardDTOs = articleCardDTOs.subList(0, 3);
}
TopAndFeaturedArticlesDTO topAndFeaturedArticlesDTO = new TopAndFeaturedArticlesDTO();
topAndFeaturedArticlesDTO.setTopArticle(articleCardDTOs.get(0));
articleCardDTOs.remove(0);
topAndFeaturedArticlesDTO.setFeaturedArticles(articleCardDTOs);
return topAndFeaturedArticlesDTO;
}
@SneakyThrows
@Override
public PageResultDTO<ArticleCardDTO> listArticles() {
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<Article>()
.eq(Article::getIsDelete, 0)
.in(Article::getStatus, 1, 2);
CompletableFuture<Integer> asyncCount = CompletableFuture.supplyAsync(() -> articleMapper.selectCount(queryWrapper));
List<ArticleCardDTO> articles = articleMapper.listArticles(PageUtil.getLimitCurrent(), PageUtil.getSize());
return new PageResultDTO<>(articles, asyncCount.get());
}
@SneakyThrows
@Override
public PageResultDTO<ArticleCardDTO> listArticlesByCategoryId(Integer categoryId) {
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<Article>().eq(Article::getCategoryId, categoryId);
CompletableFuture<Integer> asyncCount = CompletableFuture.supplyAsync(() -> articleMapper.selectCount(queryWrapper));
List<ArticleCardDTO> articles = articleMapper.getArticlesByCategoryId(PageUtil.getLimitCurrent(), PageUtil.getSize(), categoryId);
return new PageResultDTO<>(articles, asyncCount.get());
}
@SneakyThrows
@Override
public ArticleDTO getArticleById(Integer articleId) {
Article articleForCheck = articleMapper.selectOne(new LambdaQueryWrapper<Article>().eq(Article::getId, articleId));
if (Objects.isNull(articleForCheck)) {
return null;
}
if (articleForCheck.getStatus().equals(2)) {
Boolean isAccess;
try {
isAccess = redisService.sIsMember(ARTICLE_ACCESS + UserUtil.getUserDetailsDTO().getId(), articleId);
} catch (Exception exception) {
throw new BizException(ARTICLE_ACCESS_FAIL);
}
if (isAccess.equals(false)) {
throw new BizException(ARTICLE_ACCESS_FAIL);
}
}
updateArticleViewsCount(articleId);
CompletableFuture<ArticleDTO> asyncArticle = CompletableFuture.supplyAsync(() -> articleMapper.getArticleById(articleId));
CompletableFuture<ArticleCardDTO> asyncPreArticle = CompletableFuture.supplyAsync(() -> {
ArticleCardDTO preArticle = articleMapper.getPreArticleById(articleId);
if (Objects.isNull(preArticle)) {
preArticle = articleMapper.getLastArticle();
}
return preArticle;
});
CompletableFuture<ArticleCardDTO> asyncNextArticle = CompletableFuture.supplyAsync(() -> {
ArticleCardDTO nextArticle = articleMapper.getNextArticleById(articleId);
if (Objects.isNull(nextArticle)) {
nextArticle = articleMapper.getFirstArticle();
}
return nextArticle;
});
ArticleDTO article = asyncArticle.get();
if (Objects.isNull(article)) {
return null;
}
Double score = redisService.zScore(ARTICLE_VIEWS_COUNT, articleId);
if (Objects.nonNull(score)) {
article.setViewCount(score.intValue());
}
article.setPreArticleCard(asyncPreArticle.get());
article.setNextArticleCard(asyncNextArticle.get());
return article;
}
@Override
public void accessArticle(ArticlePasswordVO articlePasswordVO) {
Article article = articleMapper.selectOne(new LambdaQueryWrapper<Article>().eq(Article::getId, articlePasswordVO.getArticleId()));
if (Objects.isNull(article)) {
throw new BizException("文章不存在");
}
if (article.getPassword().equals(articlePasswordVO.getArticlePassword())) {
redisService.sAdd(ARTICLE_ACCESS + UserUtil.getUserDetailsDTO().getId(), articlePasswordVO.getArticleId());
} else {
throw new BizException("密码错误");
}
}
@SneakyThrows
@Override
public PageResultDTO<ArticleCardDTO> listArticlesByTagId(Integer tagId) {
LambdaQueryWrapper<ArticleTag> queryWrapper = new LambdaQueryWrapper<ArticleTag>().eq(ArticleTag::getTagId, tagId);
CompletableFuture<Integer> asyncCount = CompletableFuture.supplyAsync(() -> articleTagMapper.selectCount(queryWrapper));
List<ArticleCardDTO> articles = articleMapper.listArticlesByTagId(PageUtil.getLimitCurrent(), PageUtil.getSize(), tagId);
return new PageResultDTO<>(articles, asyncCount.get());
}
@SneakyThrows
@Override
public PageResultDTO<ArchiveDTO> listArchives() {
LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<Article>().eq(Article::getIsDelete, 0).eq(Article::getStatu
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源简介: 在数字时代,个人博客已经成为表达想法、分享技术、展示才华的重要平台。本项目是一个使用SpringBoot和Vue开发的全栈个人博客系统,专为技术博客而设计。它不仅具有现代化的界面,而且集成了内容管理、评论互动、数据统计等多项功能,旨在为用户提供一站式的博客解决方案。无论是IT专业人士、自由撰稿人还是技术爱好者,都可以利用这个项目搭建属于自己的专业博客平台。 主要特性: 前后端分离架构:前端使用Vue.js,后端使用SpringBoot,提供清晰的代码结构和高效的开发体验。 响应式设计:适配各种屏幕尺寸,确保在手机、平板和桌面设备上都能提供优秀的浏览体验。 功能全面:支持文章发布、编辑和删除,评论功能,分类管理,标签云,全文搜索以及实时数据统计等。 安全稳定:集成Spring Security进行用户认证和授权,确保平台的安全性。 易于部署和维护:提供详尽的部署文档和维护指南,使得项目的安装和升级变得简单快捷。 适用场景: 个人博客创建:适用于希望建立个人品牌的专业人士。 技术展示:开发者可以用作技术展示和个人技能的平台。 教育目的:理想的教学案例,适用于教学
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot+Vue开发的个人博客系统全栈个人博客系统 (551个子文件)
prism-aurora-future.css 8KB
prism.css 5KB
iconfont.css 3KB
index.css 1KB
ip2region.db 8.33MB
Dockerfile 388B
Dockerfile 272B
iconfont.eot 11KB
user.html 3KB
owner.html 2KB
common.html 2KB
index.html 768B
index.html 664B
favicon.ico 2KB
favicon.ico 2KB
ArticleServiceImpl.java 16KB
CommentServiceImpl.java 16KB
RedisServiceImpl.java 10KB
AuroraInfoServiceImpl.java 9KB
UserAuthServiceImpl.java 8KB
ResourceServiceImpl.java 8KB
MenuServiceImpl.java 7KB
UserInfoServiceImpl.java 7KB
ArticleController.java 6KB
PhotoServiceImpl.java 6KB
JobServiceImpl.java 5KB
RoleServiceImpl.java 5KB
AbstractSocialLoginStrategyImpl.java 5KB
AuroraQuartz.java 5KB
PhotoAlbumServiceImpl.java 5KB
TalkServiceImpl.java 5KB
WebsiteConfigVO.java 4KB
IpUtil.java 4KB
MySqlSearchStrategyImpl.java 4KB
JobInvokeUtil.java 4KB
WebSecurityConfig.java 4KB
EsSearchStrategyImpl.java 4KB
CategoryServiceImpl.java 3KB
UserInfoController.java 3KB
PhotoAlbumController.java 3KB
TokenServiceImpl.java 3KB
UserDetailServiceImpl.java 3KB
OperationLogAspect.java 3KB
PhotoController.java 3KB
AuroraInfoController.java 3KB
TagServiceImpl.java 3KB
TalkController.java 3KB
RedisService.java 3KB
ExceptionLogAspect.java 3KB
ScheduleUtil.java 3KB
QQLoginStrategyImpl.java 3KB
UserAuthController.java 3KB
JobLogServiceImpl.java 3KB
SubscribeConsumer.java 3KB
CommentController.java 3KB
AccessLimitInterceptor.java 3KB
UserDetailsDTO.java 3KB
JobController.java 2KB
AbstractQuartzJob.java 2KB
FilterInvocationSecurityMetadataSourceImpl.java 2KB
SpringUtil.java 2KB
AuthenticationSuccessHandlerImpl.java 2KB
MenuController.java 2KB
CategoryController.java 2KB
TagController.java 2KB
ResultVO.java 2KB
FileUtil.java 2KB
FriendLinkServiceImpl.java 2KB
ConditionVO.java 2KB
ArticleVO.java 2KB
FriendLinkController.java 2KB
JobLogController.java 2KB
ResourceController.java 2KB
NormalArticleImportStrategyImpl.java 2KB
RoleController.java 2KB
RedisConfig.java 2KB
JwtAuthenticationTokenFilter.java 2KB
OperationLogServiceImpl.java 2KB
ArticleMapper.java 2KB
MinioUploadStrategyImpl.java 2KB
CommonUtil.java 2KB
AbstractUploadStrategyImpl.java 2KB
MenuVO.java 2KB
RabbitMQConfig.java 1KB
ExceptionLogServiceImpl.java 1KB
EmailUtil.java 1KB
OperationLogController.java 1KB
Knife4jConfig.java 1KB
ExceptionLogController.java 1KB
AccessDecisionManagerImpl.java 1KB
MaxWellConsumer.java 1KB
CommentMapper.java 1KB
WebsiteConfigDTO.java 1KB
PaginationInterceptor.java 1KB
FriendLinkVO.java 1KB
ResourceVO.java 1KB
ArticleService.java 1KB
ControllerAdviceHandler.java 1KB
OssUploadStrategyImpl.java 1KB
WebMvcConfig.java 1KB
共 551 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
拉叭叭小能手
- 粉丝: 36
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- c语言文件读写操作代码c语言文件读写操作代码c语言文件读写操作代码c语言文件读写操作代码
- 商用手机+oai+open5gs配置文件
- 22计应专3王国长22206510201318.zip
- Spring Boot开发教程的主要步骤和要点
- linux常用命令大全linux常用命令大全linux常用命令大全linux常用命令大全.txt
- 扫雷c++小程序,修改了一些地方,好多printf()用于查看调试,可以删除,easyx是辅助小代码,安装一下,12张图片
- c语言火车票订票管理源码
- Fortran语言的基本知识和编程技巧
- Python教程-快速入门基础必看课程03-变量类型
- nvvp所需环境jdk8
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功