inleft
2022-08-22 20e5fce06a68b79b4a24b8188a64214ffe25fa30
上下篇日志查询
8 files modified
150 ■■■■■ changed files
snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/MyConstant.java 8 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogStatistics/BlogStatisticsController.java 4 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/controller/BlogArticleOutsideController.java 29 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/entity/BlogArticleVo.java 10 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/mapper/mapping/BlogArticleMapper.xml 3 ●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/param/BlogArticleQueryDto.java 6 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/BlogArticleService.java 16 ●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/impl/BlogArticleServiceImpl.java 74 ●●●●● patch | view | raw | blame | history
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 &lt; 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);
    }
}