snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/MyConstant.java
@@ -33,6 +33,14 @@ int authCode = 3; } /** * 编辑状态 0:草稿 1:发布 */ interface EditorStatus { int status_0 = 0; int status_1 = 1; } /** * 文件类型 snowy-main/src/main/java/vip/xiaonuo/modular/blogStatistics/BlogStatisticsController.java
@@ -86,7 +86,7 @@ .select(BlogArticleComment::getId, BlogArticleComment::getCreateDate) .one(); if (comment != null && comment.getUpdateDate() != null if (comment != null && comment.getCreateDate() != null && lastUpdateBlog != null && lastUpdateBlog.getCreateDate().before(comment.getCreateDate())) { updateDate = DateUtil.formatDate(comment.getCreateDate()); @@ -126,6 +126,7 @@ List<BlogArticle> articleList = blogArticleService.lambdaQuery() .eq(BlogArticle::getIsEnable, MyConstant.Yes) .eq(BlogArticle::getEditorStatus, MyConstant.Yes) .le(BlogArticle::getPublishDate,DateUtil.date()) .orderByDesc(BlogArticle::getSeparateYear) .groupBy(BlogArticle::getSeparateYear) .select(BlogArticle::getSeparateYear) @@ -153,6 +154,7 @@ .eq(BlogArticle::getEditorStatus, MyConstant.Yes) .eq(year != null, BlogArticle::getSeparateYear, year) .eq(month != null, BlogArticle::getSeparateMonth, month) .le(BlogArticle::getPublishDate,DateUtil.date()) .orderByDesc(BlogArticle::getSeparateYear) .orderByDesc(BlogArticle::getSeparateMonth) .select(BlogArticle::getId, BlogArticle::getTitle, snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/controller/BlogArticleOutsideController.java
@@ -31,6 +31,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import vip.xiaonuo.core.annotion.BusinessLog; @@ -56,6 +57,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Future; import java.util.stream.Collectors; /** @@ -66,6 +68,7 @@ */ @RestController @RequestMapping("/outside") @Slf4j public class BlogArticleOutsideController { @Resource @@ -163,7 +166,7 @@ } } //前端根据条件标注小红点(发布时间和更新时间在7天内) //前端根据条件标注小红点(发布时间小于更新时间,且在7天内) if (e.getPublishDate().before(e.getUpdateDate()) && DateUtil.between(e.getUpdateDate(), now, DateUnit.DAY) <= 7) { e.setIsAnyUpdate(MyConstant.Yes); @@ -210,6 +213,9 @@ throw new BlogException(BlogExceptionEnum.article_auth_private_error); } //异步查询相邻记录 Future<List<BlogArticleVo>> adjoiningRecord = blogArticleService.getAdjoiningRecord(queryDto); BlogArticleVo vo = new BlogArticleVo(); BeanUtil.copyProperties(find, vo); @@ -218,10 +224,29 @@ String tempURL = this.getBlogSourceURL(find.getArticleFileId()); //if (StrUtil.isEmpty(tempURL)) //throw new BlogException(BlogExceptionEnum.article_file_lose); //throw new BlogException(BlogExceptionEnum.article_file_lose); vo.setArticleFileURL(tempURL); vo.setCoverFileURL(this.getBlogSourceURL(vo.getCoverFileId())); //特殊类型强制关联类型(如前方高能分类) //如果有typeId,上下篇查询关联类型(默认按首页自然排序) while (!adjoiningRecord.isDone()) { try { Thread.sleep(100); } catch (InterruptedException e) { } } try { vo.setPreviousRecord(adjoiningRecord.get().get(0)); vo.setNextRecord(adjoiningRecord.get().get(1)); } catch (Exception e) { log.error("异步获取上下相邻日志id异常,id:{} ,msg:{}", queryDto.getId(), e.getMessage()); } return new SuccessResponseData(vo); } snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/entity/BlogArticleVo.java
@@ -126,4 +126,14 @@ */ private String jumpURL; /** * 上篇日志 */ private BlogArticleVo previousRecord; /** * 下篇日志 */ private BlogArticleVo nextRecord; } snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/mapper/mapping/BlogArticleMapper.xml
@@ -45,7 +45,7 @@ <choose> <when test="param.typeId != null"> AND a.article_type_id = #{param.typeId} order by a.is_top desc,a.top_value asc , a.create_date desc order by a.is_top desc,a.top_value asc , a.publish_date desc </when> <otherwise> AND a.article_type_id != 4 @@ -98,6 +98,7 @@ is_enable = 1 AND editor_status = 1 AND separate_year = #{separateYear} AND publish_date < now() ) GROUP BY separate_month snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/param/BlogArticleQueryDto.java
@@ -20,8 +20,14 @@ private Long id; /** * 日志分类id */ private Long typeId; /** * 文件类型 */ private Long fileType; snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/BlogArticleService.java
@@ -25,14 +25,17 @@ package vip.xiaonuo.modular.blogarticle.service; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.scheduling.annotation.Async; import vip.xiaonuo.core.pojo.page.PageResult; import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveDetailVo; import vip.xiaonuo.modular.blogarticle.entity.BlogArticle; import vip.xiaonuo.modular.blogarticle.param.BlogArticleParam; import vip.xiaonuo.modular.blogarticle.entity.BlogArticleVo; import vip.xiaonuo.modular.blogarticle.param.BlogArticleParam; import vip.xiaonuo.modular.blogarticle.param.BlogArticleQueryDto; import java.util.List; import java.util.Map; import java.util.concurrent.Future; /** * blog文章主体service接口 @@ -88,7 +91,7 @@ * @author inleft * @date 2022-01-22 16:53:06 */ BlogArticle detail(BlogArticleParam blogArticleParam); BlogArticle detail(BlogArticleParam blogArticleParam); /** * 导出blog文章主体 @@ -96,12 +99,17 @@ * @author inleft * @date 2022-01-22 16:53:06 */ void export(BlogArticleParam blogArticleParam); void export(BlogArticleParam blogArticleParam); List<BlogArticleVo> searchList(Map<String,Object> param); List<BlogArticleVo> searchList(Map<String, Object> param); long searchListCount(Map<String, Object> param); List<BlogArchiveDetailVo> searchMonthCount(Integer separateYear); /** * 获取相邻上下记录的日志id */ @Async Future<List<BlogArticleVo>> getAdjoiningRecord(BlogArticleQueryDto queryDto); } snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/impl/BlogArticleServiceImpl.java
@@ -25,24 +25,35 @@ package vip.xiaonuo.modular.blogarticle.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.core.consts.MyConstant; import vip.xiaonuo.core.exception.ServiceException; import vip.xiaonuo.core.factory.PageFactory; import vip.xiaonuo.core.pojo.page.PageResult; import vip.xiaonuo.core.util.PoiUtil; import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveDetailVo; import vip.xiaonuo.modular.blogarticle.entity.BlogArticle; import vip.xiaonuo.modular.blogarticle.entity.BlogArticleVo; import vip.xiaonuo.modular.blogarticle.enums.BlogArticleExceptionEnum; import vip.xiaonuo.modular.blogarticle.mapper.BlogArticleMapper; import vip.xiaonuo.modular.blogarticle.param.BlogArticleParam; import vip.xiaonuo.modular.blogarticle.param.BlogArticleQueryDto; import vip.xiaonuo.modular.blogarticle.service.BlogArticleService; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Future; /** * blog文章service接口实现类 @@ -167,4 +178,67 @@ return this.baseMapper.searchMonthCount(separateYear); } /** * 异步获取上下相邻日志id */ @Async @Override public Future<List<BlogArticleVo>> getAdjoiningRecord(BlogArticleQueryDto queryDto) { int pageNum = 1; Page<BlogArticle> queryPage = new Page<>(pageNum, 10); LambdaQueryWrapper<BlogArticle> queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(BlogArticle::getIsEnable, MyConstant.Yes) .eq(BlogArticle::getEditorStatus, MyConstant.EditorStatus.status_1) .le(BlogArticle::getPublishDate, DateUtil.date()) .eq(queryDto.getTypeId() != null, BlogArticle::getArticleTypeId, queryDto.getTypeId()) .eq(queryDto.getFileType() != null, BlogArticle::getArticleFileType, queryDto.getFileType()) .notIn(queryDto.getFileType() == null && queryDto.getTypeId() == null, BlogArticle::getArticleFileType, new Integer[]{3, 4}) .orderByDesc(BlogArticle::getIsTop) .orderByAsc(BlogArticle::getTopValue) .orderByAsc(queryDto.getTypeId() != null, BlogArticle::getPublishDate) .orderByAsc(queryDto.getTypeId() == null, BlogArticle::getUpdateDate) .select(BlogArticle::getId); Long[] recordId = new Long[]{null, null}; List<BlogArticle> tempRecordList; while (true) { tempRecordList = this.page(queryPage, queryWrapper).getRecords(); if (CollUtil.isEmpty(tempRecordList)) { break; } for (int i = 0; i < tempRecordList.size(); i++) { if (queryDto.getId().equals(tempRecordList.get(i))) { //防止边界 recordId[0] = i - 1 >= 0 ? tempRecordList.get(i - 1).getId() : recordId[0]; recordId[1] = i + 1 < tempRecordList.size() ? tempRecordList.get(i + 1).getId() : recordId[1]; } //记录此页最后一条作为下一页起始记录 recordId[0] = tempRecordList.get(i).getId(); } queryPage = new Page<>(++pageNum, 10); } List<BlogArticleVo> result = new ArrayList<>(2); for (int i = 0; i < recordId.length; i++) { if (recordId[i] != null) { result.add(this.lambdaQuery() .eq(BlogArticle::getId, recordId[i]) .oneOpt().map(e -> { BlogArticleVo vo = new BlogArticleVo(); BeanUtil.copyProperties(e, vo); return vo; }).orElse(null)); } else { result.add(null); } } return new AsyncResult<>(result); } }