/*
|
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.blogarticlecomment.controller;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.lang.Dict;
|
import cn.hutool.core.util.PageUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.extra.template.Template;
|
import cn.hutool.extra.template.TemplateConfig;
|
import cn.hutool.extra.template.TemplateEngine;
|
import cn.hutool.extra.template.TemplateUtil;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
import vip.xiaonuo.core.annotion.BusinessLog;
|
import vip.xiaonuo.core.consts.MyConstant;
|
import vip.xiaonuo.core.context.constant.ConstantContextHolder;
|
import vip.xiaonuo.core.email.MailSender;
|
import vip.xiaonuo.core.email.modular.model.SendMailParam;
|
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.blogarticle.entity.BlogArticle;
|
import vip.xiaonuo.modular.blogarticle.service.BlogArticleService;
|
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
|
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogCommentVo;
|
import vip.xiaonuo.modular.blogarticlecomment.param.BlogArticleCommentAddDto;
|
import vip.xiaonuo.modular.blogarticlecomment.param.BlogCommentQueryDto;
|
import vip.xiaonuo.modular.blogarticlecomment.service.BlogArticleCommentService;
|
|
import javax.annotation.Resource;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* blog 留言/评论 控制器 (提供给外部blog系统查询)
|
*
|
* @author inleft
|
* @date 2022-02-09 18:20:22
|
*/
|
@RestController
|
@RequestMapping("/outside")
|
public class BlogArticleCommentOutsideController {
|
|
@Resource
|
private BlogArticleService blogArticleService;
|
|
@Resource
|
private BlogArticleCommentService commentService;
|
|
|
@Resource
|
private MailSender mailSender;
|
|
@PostMapping("/blogComment/add")
|
@BusinessLog(title = "外部blog系统_blog留言/评论_增加", opType = LogAnnotionOpTypeEnum.ADD)
|
public ResponseData add(@RequestBody @Validated(BlogArticleCommentAddDto.add.class) BlogArticleCommentAddDto addDto) {
|
BlogArticle checkArticle = null;
|
|
//自我认证
|
if (MyConstant.myIds.contains(addDto.getVisitorNickName())) {
|
if (StrUtil.isEmpty(addDto.getAuthCode()) || !addDto.getAuthCode().equals(ConstantContextHolder.getPushCode())) {
|
throw new BlogException("此名称在这里使用需要正确的授权码..");
|
}
|
}
|
|
if (MyConstant.Yes.equals(addDto.getIsReceiveMail()) && StrUtil.isEmpty(addDto.getVisitorEmail())) {
|
throw new BlogException("如果是想接收通知的话,你可能需要填上一个邮箱..");
|
}
|
|
if (addDto.getCommentType().equals(MyConstant.CommentType.type_2)) {
|
if (addDto.getArticleId() == null) {
|
throw new BlogException("评论类型为日志评论,日志id不能为空");
|
}
|
checkArticle = blogArticleService.getById(addDto.getArticleId());
|
if (checkArticle == null) {
|
throw new BlogException("查询不到相关日志");
|
}
|
|
if (checkArticle.getIsAllowedComment().equals(MyConstant.No)) {
|
throw new BlogException("该日志评论已经关闭..");
|
}
|
}
|
BlogArticleComment insert = new BlogArticleComment();
|
BeanUtil.copyProperties(addDto, insert);
|
insert.setIsCheck(MyConstant.Yes);
|
insert.setIsEnable(MyConstant.Yes);
|
insert.setIsReceiveCallback(addDto.getIsReceiveMail());
|
|
//自己留言已读
|
if (MyConstant.myIds.contains(addDto.getVisitorNickName())) {
|
insert.setIsRead(MyConstant.Yes);
|
}
|
|
commentService.save(insert);
|
|
if (addDto.getReplyId() == null || addDto.getReplyId() == 0L) {
|
//这里为根节点,预留通知我
|
return new SuccessResponseData();
|
}
|
|
BlogArticleComment lastComment = commentService.getById(addDto.getReplyId());
|
|
if (lastComment == null) {
|
return new SuccessResponseData();
|
}
|
|
//发送者是我本体,标记回复该条回复消息已读
|
if (MyConstant.myIds.contains(addDto.getVisitorNickName())) {
|
commentService.lambdaUpdate()
|
.eq(BlogArticleComment::getId, lastComment.getId())
|
.set(BlogArticleComment::getIsRead, MyConstant.Yes)
|
.update();
|
}
|
|
//前一个留言接收邮件回复(如果是给评论者自己的追加可以跳过)
|
if (MyConstant.Yes.equals(lastComment.getIsReceiveCallback())
|
&& StrUtil.isNotEmpty(lastComment.getVisitorEmail())
|
// && !lastComment.getVisitorNickName().equals(MyConstant.inleft)
|
// && !lastComment.getVisitorEmail().equals(MyConstant.email)
|
&& !lastComment.getVisitorNickName().equals(addDto.getVisitorNickName())
|
&& !lastComment.getVisitorEmail().equals(addDto.getVisitorEmail())) {
|
|
String title = MyConstant.msgTitle;
|
String address;
|
//跳转地址
|
if (addDto.getCommentType().equals(MyConstant.CommentType.type_1)) {
|
//留言板
|
address = String.format(MyConstant.url_1, insert.getId());
|
} else {
|
//文章详情
|
address = String.format(MyConstant.url_2, addDto.getArticleId(), insert.getId());
|
title = checkArticle.getTitle();
|
}
|
|
TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig(MyConstant.ftlModel.path, TemplateConfig.ResourceMode.CLASSPATH));
|
Template template = engine.getTemplate(MyConstant.ftlModel.reply);
|
|
Dict dict = Dict.create()
|
.set("lastGuest", lastComment.getVisitorNickName())
|
.set("commentContent", lastComment.getCommentContent())
|
.set("address", address)
|
.set("title", title)
|
.set("sender", addDto.getVisitorNickName())
|
.set("sendContent", addDto.getCommentContent());
|
String result = template.render(dict);
|
|
SendMailParam param = new SendMailParam();
|
param.setContent(result);
|
param.setTitle("先前您在 [inleft的小木屋] 的留言有了新的回复!\n");
|
param.setTo(lastComment.getVisitorEmail());
|
mailSender.sendMailHtml(param);
|
}
|
|
|
return new SuccessResponseData();
|
}
|
|
|
@GetMapping("/blogComment/queryBlogCommentList")
|
@BusinessLog(title = "外部blog系统_blog留言/评论_查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData queryBlogCommentList(BlogCommentQueryDto queryDto) {
|
if (queryDto.getArticleId() != null && blogArticleService.getById(queryDto.getArticleId()) == null) {
|
throw new BlogException("查询不到相关日志");
|
}
|
|
Page queryPage = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
|
|
|
List<BlogArticleComment> commentList = commentService.lambdaQuery()
|
.eq(queryDto.getArticleId() != null, BlogArticleComment::getArticleId, queryDto.getArticleId())
|
.eq(BlogArticleComment::getCommentType, queryDto.getArticleId() == null ? MyConstant.CommentType.type_1 : MyConstant.CommentType.type_2)
|
.eq(BlogArticleComment::getIsCheck, MyConstant.Yes)
|
.eq(BlogArticleComment::getIsEnable, MyConstant.Yes)
|
.eq(BlogArticleComment::getParentId, 0)
|
.orderByDesc(BlogArticleComment::getCreateDate)
|
.page(queryPage).getRecords();
|
|
int limitCount = 2;
|
List<BlogCommentVo> res = commentList.stream().map(e -> {
|
BlogCommentVo vo = new BlogCommentVo();
|
BeanUtil.copyProperties(e, vo);
|
vo.setIsHasNext(MyConstant.No);
|
List<BlogCommentVo> replyList = commentService.getReplyListById(e.getId(), limitCount);
|
vo.setReplyList(replyList);
|
|
if (e.getAuthStatus().equals(MyConstant.AuthStatus.privateCode)) {
|
vo.setCommentContent(MyConstant.privateComment);
|
}
|
|
if (CollUtil.isNotEmpty(replyList)
|
&& commentService.lambdaQuery()
|
.eq(BlogArticleComment::getParentId, e.getId())
|
.eq(BlogArticleComment::getIsCheck, MyConstant.Yes)
|
.eq(BlogArticleComment::getIsEnable, MyConstant.Yes)
|
.count() > limitCount) {
|
vo.setIsHasNext(MyConstant.Yes);
|
}
|
return vo;
|
}
|
).collect(Collectors.toList());
|
|
queryPage.setRecords(res);
|
return new SuccessResponseData(queryPage);
|
}
|
|
@GetMapping("/blogComment/queryBlogCommentSubList")
|
@BusinessLog(title = "外部blog系统_blog留言/评论子列表_查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData queryBlogCommentSubList(BlogCommentQueryDto queryDto) {
|
if (queryDto.getArticleId() != null && commentService.getById(queryDto.getCommentId()) == null) {
|
throw new BlogException("查询不到相关评论");
|
}
|
|
|
List<BlogCommentVo> replyList = commentService.getReplyListById(queryDto.getCommentId(), null);
|
// for (BlogCommentVo vo : replyList) {
|
// vo.setIsHasNext(MyConstant.No);
|
// if (vo.getAuthStatus().equals(MyConstant.AuthStatus.privateCode)) {
|
// vo.setCommentContent(MyConstant.privateComment);
|
// }
|
// }
|
|
return new SuccessResponseData(replyList);
|
}
|
|
@GetMapping("/blogComment/history")
|
@BusinessLog(title = "外部blog系统_blog留言/最近留言查询", opType = LogAnnotionOpTypeEnum.QUERY)
|
public ResponseData history(BlogCommentQueryDto queryDto) {
|
Page queryPage = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
|
|
//查询最近未读留言,无穷分页,(注意*号隐蔽,登录可见)
|
int unreadCommentListCount = commentService.lambdaQuery()
|
.eq(BlogArticleComment::getIsCheck, MyConstant.Yes)
|
.eq(BlogArticleComment::getIsEnable, MyConstant.Yes)
|
.eq(BlogArticleComment::getIsRead, MyConstant.No)
|
.count();
|
|
//取出所有未读消息+最多10条已读消息
|
long limitTotal = unreadCommentListCount + MyConstant.limitRead;
|
|
//最大页数不能超出限制
|
if (PageUtil.getEnd(queryDto.getPageNo() - 1, queryDto.getPageSize()) > limitTotal
|
&& PageUtil.getEnd(queryDto.getPageNo() - 2, queryDto.getPageSize()) > limitTotal) {
|
queryPage.setMaxLimit(limitTotal);
|
return new SuccessResponseData(queryPage);
|
}
|
|
//当前页超出起始页,未达尾页, 限制当前查询个数
|
long limitSize = queryDto.getPageSize();
|
if (PageUtil.getEnd(queryDto.getPageNo() - 1, queryDto.getPageSize()) > limitTotal) {
|
limitSize = limitTotal % queryDto.getPageSize();
|
}
|
|
List<BlogArticleComment> commentList = commentService.lambdaQuery()
|
.eq(BlogArticleComment::getIsCheck, MyConstant.Yes)
|
.eq(BlogArticleComment::getIsEnable, MyConstant.Yes)
|
.orderByAsc(BlogArticleComment::getIsRead)
|
.orderByDesc(BlogArticleComment::getCreateDate)
|
.page(queryPage).getRecords();
|
|
//queryPage.setTotal(limitTotal - (limitTotal % queryDto.getPageSize()));
|
queryPage.setTotal(limitTotal);
|
List<BlogCommentVo> res = commentList.stream()
|
.limit(limitSize)
|
.map(e -> {
|
BlogCommentVo vo = new BlogCommentVo();
|
BeanUtil.copyProperties(e, vo);
|
if (e.getAuthStatus().equals(MyConstant.AuthStatus.privateCode)) {
|
vo.setCommentContent(MyConstant.privateComment);
|
}
|
if (MyConstant.CommentType.type_2 == e.getCommentType()) {
|
vo.setArticleTitle(blogArticleService.lambdaQuery()
|
.eq(BlogArticle::getId, e.getArticleId())
|
.select(BlogArticle::getTitle).one().getTitle());
|
} else {
|
vo.setArticleTitle(MyConstant.msgTitle);
|
}
|
|
return vo;
|
}
|
).collect(Collectors.toList());
|
|
queryPage.setRecords(res);
|
return new SuccessResponseData(queryPage);
|
}
|
|
// @GetMapping("/blogComment/test")
|
public ResponseData test() {
|
|
|
TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH));
|
Template template = engine.getTemplate("emailReplyModel.ftl");
|
Dict dict = Dict.create()
|
.set("lastGuest", "回复人")
|
.set("commentContent", "评论内容")
|
.set("address", "http://blog.inleft.com")
|
.set("title", "回复标题")
|
.set("sendTime", DateUtil.now())
|
.set("sender", "发送人")
|
.set("sendContent", "发送内容");
|
String result = template.render(dict);
|
|
SendMailParam param = new SendMailParam();
|
param.setContent(result);
|
param.setTitle("先前您在 [inleft的小木屋] 的留言有了新的回复!\n");
|
param.setTo("1479853828@qq.com");
|
mailSender.sendMailHtml(param);
|
return new SuccessResponseData();
|
}
|
}
|