/*
|
Copyright [2020] [https://www.xiaonuo.vip]
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
you may not use this file except in compliance with the License.
|
You may obtain a copy of the License at
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
Unless required by applicable law or agreed to in writing, software
|
distributed under the License is distributed on an "AS IS" BASIS,
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
See the License for the specific language governing permissions and
|
limitations under the License.
|
|
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
|
1.请不要删除和修改根目录下的LICENSE文件。
|
2.请不要删除和修改Snowy源码头部的版权声明。
|
3.请保留源码和相关描述文件的项目出处,作者声明等。
|
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
|
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
|
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
|
*/
|
package vip.xiaonuo.modular.blogStatistics;
|
|
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUtil;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
import vip.xiaonuo.core.annotion.BusinessLog;
|
import vip.xiaonuo.core.consts.MyConstant;
|
import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum;
|
import vip.xiaonuo.core.exception.BlogException;
|
import vip.xiaonuo.core.pojo.response.ResponseData;
|
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
|
import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveDetailVo;
|
import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveVo;
|
import vip.xiaonuo.modular.blogStatistics.vo.BlogStatisticsVo;
|
import vip.xiaonuo.modular.blogarticle.entity.BlogArticle;
|
import vip.xiaonuo.modular.blogarticle.service.BlogArticleService;
|
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
|
import vip.xiaonuo.modular.blogarticlecomment.service.BlogArticleCommentService;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
/**
|
* blog文章控制器 (提供给外部blog系统查询)
|
*
|
* @author inleft
|
* @date 2022-02-09 18:20:22
|
*/
|
@RestController
|
@RequestMapping("/outside")
|
public class BlogStatisticsController {
|
|
@Resource
|
private BlogArticleService blogArticleService;
|
|
@Resource
|
private BlogArticleCommentService commentService;
|
|
/**
|
* @author inleft
|
* @date 2022-02-09 18:20:22
|
*/
|
@GetMapping("/blog/statistics")
|
@BusinessLog(title = "外部blog系统_统计_查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData statistics() {
|
|
String updateDate = "--";
|
BlogArticle lastUpdateBlog = blogArticleService.lambdaQuery().orderByDesc(BlogArticle::getUpdateDate).last(MyConstant.limit).one();
|
if (lastUpdateBlog != null && lastUpdateBlog.getUpdateDate() != null) {
|
updateDate = DateUtil.formatDate(lastUpdateBlog.getUpdateDate());
|
}
|
|
//新增最近的评论时间
|
BlogArticleComment comment = commentService.lambdaQuery()
|
.eq(BlogArticleComment::getVisitorNickName, MyConstant.inleft)
|
.orderByDesc(BlogArticleComment::getCreateDate)
|
.last(MyConstant.limit)
|
.select(BlogArticleComment::getId, BlogArticleComment::getCreateDate)
|
.one();
|
|
if (comment != null && comment.getUpdateDate() != null
|
&& lastUpdateBlog != null
|
&& lastUpdateBlog.getCreateDate().before(comment.getCreateDate())) {
|
updateDate = DateUtil.formatDate(comment.getCreateDate());
|
}
|
|
String startFrom = "从这开始: 2020-05-27 ";
|
String aliveDayCount = "已稳定运行:" + DateUtil.between(DateUtil.parseDate("2022-02-14"), new Date(), DateUnit.DAY) + "天";
|
String lastUpdateDate = "上次活跃于:" + updateDate;
|
String visitCount = "累计访问:1010次"; //24小时ip 访问次数
|
String visitorCount = "累计访客:1001名";//所有时间ip个数
|
|
List<BlogStatisticsVo.simpleVo> res = new ArrayList<>();
|
res.add(new BlogStatisticsVo.simpleVo().setName(startFrom));
|
res.add(new BlogStatisticsVo.simpleVo().setName(aliveDayCount));
|
res.add(new BlogStatisticsVo.simpleVo().setName(lastUpdateDate));
|
// res.add(new BlogStatisticsVo.simpleVo().setName(visitCount));
|
// res.add(new BlogStatisticsVo.simpleVo().setName(visitorCount));
|
|
BlogStatisticsVo statisticsVo = new BlogStatisticsVo();
|
statisticsVo.setList(res);
|
statisticsVo.setTitle("统计信息");
|
return new SuccessResponseData(statisticsVo);
|
|
}
|
|
/**
|
* 查询blog归档
|
*
|
* @author inleft
|
* @date 2022-02-09 18:20:22
|
*/
|
@GetMapping("/blog/archive")
|
@BusinessLog(title = "外部blog系统_blog归档_查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData archive() {
|
//不考虑数据太多的情况,这里应该可以把数据全部捞出来
|
|
List<BlogArticle> articleList = blogArticleService.lambdaQuery()
|
.eq(BlogArticle::getIsEnable, MyConstant.Yes)
|
.eq(BlogArticle::getEditorStatus, MyConstant.Yes)
|
.orderByDesc(BlogArticle::getSeparateYear)
|
.groupBy(BlogArticle::getSeparateYear)
|
.select(BlogArticle::getSeparateYear)
|
.list();
|
|
List<BlogArchiveVo> res = new ArrayList<>(articleList.size());
|
BlogArchiveVo blogArchiveVo;
|
for (BlogArticle blogArticle : articleList) {
|
|
blogArchiveVo = new BlogArchiveVo();
|
blogArchiveVo.setYear(blogArticle.getSeparateYear().toString());
|
blogArchiveVo.setList(blogArticleService.searchMonthCount(blogArticle.getSeparateYear()));
|
res.add(blogArchiveVo);
|
}
|
|
return new SuccessResponseData(res);
|
}
|
|
@GetMapping("/blog/archiveGroup")
|
@BusinessLog(title = "外部blog系统_blog归档组列表_查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData archiveGroup(Integer year, Integer month) {
|
|
List<BlogArticle> articleList = blogArticleService.lambdaQuery()
|
.eq(BlogArticle::getIsEnable, MyConstant.Yes)
|
.eq(BlogArticle::getEditorStatus, MyConstant.Yes)
|
.eq(year != null, BlogArticle::getSeparateYear, year)
|
.eq(month != null, BlogArticle::getSeparateMonth, month)
|
.orderByDesc(BlogArticle::getSeparateYear)
|
.orderByDesc(BlogArticle::getSeparateMonth)
|
.select(BlogArticle::getId, BlogArticle::getTitle,
|
BlogArticle::getAuthStatus,
|
BlogArticle::getSeparateYear,
|
BlogArticle::getSeparateMonth,
|
BlogArticle::getSeparateDay)
|
.list();
|
|
Map<Integer, List<BlogArticle>> groupMap = articleList.stream()
|
.collect(Collectors.groupingBy(e -> e.getSeparateYear(), LinkedHashMap::new,
|
Collectors.mapping(Function.identity(), Collectors.toList())));
|
|
List<BlogArchiveVo> res = new ArrayList<>(groupMap.size());
|
BlogArchiveVo archiveVo;
|
|
Map<String, List<BlogArchiveDetailVo.simpleVo>> detailGroup;
|
List<BlogArchiveDetailVo> tempDetailList;
|
|
for (Integer key : groupMap.keySet()) {
|
archiveVo = new BlogArchiveVo();
|
archiveVo.setYear(key.toString());
|
|
detailGroup = groupMap.get(key).stream().sorted(
|
Comparator.comparing(BlogArticle::getSeparateMonth)
|
.thenComparing(BlogArticle::getSeparateDay).reversed())
|
.collect(Collectors.groupingBy(e -> e.getSeparateMonth().toString() + "月" + e.getSeparateDay() + "日", LinkedHashMap::new,
|
Collectors.mapping(e -> {
|
BlogArchiveDetailVo.simpleVo simpleVo = new BlogArchiveDetailVo.simpleVo();
|
simpleVo.setName(e.getTitle());
|
simpleVo.setId(e.getId());
|
simpleVo.setAuthStatus(e.getAuthStatus());
|
return simpleVo;
|
}, Collectors.toList())));
|
|
tempDetailList = new ArrayList<>(detailGroup.size());
|
archiveVo.setList(tempDetailList);
|
for (String monthAndDay : detailGroup.keySet()) {
|
BlogArchiveDetailVo detailVo = new BlogArchiveDetailVo();
|
detailVo.setMonth(monthAndDay);
|
detailVo.setList(detailGroup.get(monthAndDay));
|
tempDetailList.add(detailVo);
|
}
|
|
res.add(archiveVo);
|
}
|
|
return new SuccessResponseData(res);
|
}
|
|
|
@GetMapping("/blog/option")
|
@BusinessLog(title = "外部blog系统_blog统计数据_添加", opType = LogAnnotionOpTypeEnum.EDIT)
|
public ResponseData option(Long articleId, Integer option) {
|
BlogArticle find = blogArticleService.lambdaQuery()
|
.eq(BlogArticle::getIsEnable, MyConstant.Yes)
|
.eq(BlogArticle::getEditorStatus, MyConstant.Yes)
|
.eq(BlogArticle::getId, articleId)
|
.one();
|
if (find == null) {
|
throw new BlogException("查询不到相关日志");
|
}
|
/**
|
* 同一个ip,24小时之内只统计一次 访问次数,访问人数(ip)
|
*/
|
return null;
|
}
|
}
|