从"Blog"仓库中分离出来

This commit is contained in:
小海
2019-11-28 19:18:16 +08:00
commit 16cc30f513
119 changed files with 11291 additions and 0 deletions

View File

@@ -0,0 +1,544 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.LevelEnum;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CategoryMapper;
import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.TagMapper;
import cn.celess.blog.service.ArticleService;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.RegexUtil;
import cn.celess.blog.util.StringFromHtmlUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.youbenzi.mdtool.tool.MDTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @author : xiaohai
* @date : 2019/03/28 15:21
*/
@Service
public class ArticleServiceImpl implements ArticleService {
public static final Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class);
@Autowired
ArticleMapper articleMapper;
@Autowired
TagMapper tagMapper;
@Autowired
CategoryMapper categoryMapper;
@Autowired
CommentMapper commentMapper;
@Autowired
UserService userService;
@Autowired
HttpServletRequest request;
@Autowired
RedisUserUtil redisUserUtil;
@Override
@Transactional(rollbackFor = Exception.class)
public ArticleModel create(ArticleReq reqBody) {
if (reqBody == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
//数据判断
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
//转载 判断链接
if (!reqBody.getType()) {
if (reqBody.getUrl() == null || reqBody.getUrl().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (!RegexUtil.urlMatch(reqBody.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
}
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
//写入数据库的数据
Article article = new Article();
article.setTitle(reqBody.getTitle());
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
article.setAuthorId(redisUserUtil.get(request).getId());
article.setPublishDate(new Date());
//防止出现 “null,xxx”这种情况
article.setTagsId("");
//是否需要更新上一篇文章
boolean isUpdatePreArticle = true;
Article preArticle = null;
if (articleMapper.count() == 0) {
isUpdatePreArticle = false;
} else {
//获取最新的一条数据
preArticle = articleMapper.getLastestArticle();
}
if (isUpdatePreArticle) {
logger.info("上一篇文章的id为" + preArticle.getId());
//设置上一篇文章的id
article.setPreArticleId(preArticle.getId());
}
//markdown->html->summary
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
//获取摘要 摘要长度为255个字符
String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str;
//去除转换后存在的空格
String tagStr = reqBody.getTags().replaceAll(" ", "");
article.setSummary(summary);
if (articleMapper.existsByTitle(article.getTitle())) {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
//将分类写入数据库
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setArticles("");
category1.setName(reqBody.getCategory());
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
//文章存数据库
articleMapper.insert(article);
//获取新增的文章
if (isUpdatePreArticle) {
//更新上一篇文章的“下一篇文章ID”
articleMapper.updateNextArticleId(preArticle.getId(), article.getId());
}
//无效
// articleMapper.updatePreArticleId(article.getId(), preArticle == null ? -1 : preArticle.getId());
article.setPreArticleId(preArticle == null ? -1 : preArticle.getId());
category1.setArticles(category1.getArticles() + article.getId() + ",");
categoryMapper.update(category1);
//将标签写入数据库
for (String t : tagStr.split(",")) {
if (t.replaceAll(" ", "").length() == 0) {
//单个标签只含空格
continue;
}
Tag tag = tagMapper.findTagByName(t);
if (tag == null) {
tag = new Tag();
tag.setName(t);
tag.setArticles("");
tagMapper.insert(tag);
}
tag.setArticles(tag.getArticles() + article.getId() + ",");
article.setTagsId(article.getTagsId() + tag.getId() + ",");
tagMapper.update(tag);
}
articleMapper.update(article);
return fullTransform(articleMapper.getLastestArticle());
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean delete(long articleID) {
Article articleForDel = articleMapper.findArticleById(articleID);
if (articleForDel == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);//文章不存在
}
Article preArticle = articleMapper.findArticleById(articleForDel.getPreArticleId());
Article nextArticle = articleMapper.findArticleById(articleForDel.getNextArticleId());
//对访问情况进行判断 非博主/非自己文章 拒绝访问
User user = redisUserUtil.get(request);
if (!user.getRole().contains("admin") && !articleForDel.getAuthorId().equals(user.getId())) {
throw new MyException(ResponseEnum.PERMISSION_ERROR);
}
//删除的文章处于中间位置
if (nextArticle != null && preArticle != null) {
//修改上一篇文章的“下一篇文章”y
articleMapper.updateNextArticleId(articleForDel.getPreArticleId(), articleForDel.getNextArticleId());
//修改下一篇文章的 “上一篇文章”
articleMapper.updatePreArticleId(articleForDel.getNextArticleId(), articleForDel.getPreArticleId());
}
if (preArticle == null && nextArticle != null) {
//删除的是第一篇文章
articleMapper.updatePreArticleId(nextArticle.getId(), -1);
}
if (nextArticle == null && preArticle != null) {
//删除的是最后一篇文章
articleMapper.updateNextArticleId(preArticle.getId(), -1);
}
// delete count 为删除的数据数量
int deleteCount = commentMapper.deleteByArticleId(articleID);
//删除标签中的文章id
String tag = articleForDel.getTagsId();
if (tag.length() > 0) {
String[] tags = tag.split(",");
for (String t : tags) {
if (t != null) {
//查询标签
Tag tag1 = tagMapper.findTagById(Long.parseLong(t));
//去除标签中的articleId中的待删除的文章id
String s = tag1.getArticles().replaceAll(articleForDel.getId() + ",", "");
tag1.setArticles(s);
tagMapper.update(tag1);
}
}
}
//删除分类中的文章id
//获取文章的分类
long categoryId = articleForDel.getCategoryId();
Category category = categoryMapper.findCategoryById(categoryId);
//删除文章id
category.setArticles(category.getArticles().replaceAll(articleForDel.getId() + ",", ""));
//更新
categoryMapper.update(category);
//删除指定文章
articleMapper.delete(articleID);
return true;
}
@Transactional(rollbackFor = Exception.class)
@Override
public ArticleModel update(ArticleReq reqBody) {
if (reqBody == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
//数据判断
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
//转载 判断链接
if (!reqBody.getType()) {
if (reqBody.getUrl() == null || reqBody.getUrl().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (!RegexUtil.urlMatch(reqBody.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
}
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
// 暂时不更新tags
// if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) {
// throw new MyException(ResponseEnum.PARAMETERS_ERROR);
// }
//写入数据库的数据
Article article = new Article();
if (reqBody.getId() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不能为空");
}
article.setId(reqBody.getId());
article.setTitle(reqBody.getTitle());
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
Article oldArticle = articleMapper.findArticleById(reqBody.getId());
Category category = categoryMapper.findCategoryById(oldArticle.getCategoryId());
if (!(category.getName()).equals(reqBody.getCategory())) {
//修改更新之前数据 的分类
category.setArticles(category.getArticles().replace(reqBody.getId() + ",", ""));
//更新
categoryMapper.update(category);
//更新 更新之后的分类
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setName(reqBody.getCategory());
category1.setArticles(reqBody.getId() + ",");
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
} else {
article.setCategoryId(oldArticle.getCategoryId());
}
// String[] newTags = reqBody.getTags().replaceAll(" ", "").split(",");
// //防止出现 null2这种情况
// article.setTagsId("");
// for (String t : newTags) {
// Tag tag = tagMapper.findTagByName(t);
// if (tag == null) {
// tag = new Tag();
// tag.setName(t);
// tag.setArticles(oldArticle.getId() + ",");
// tag = tagMapper.save(tag);
// article.setTagsId(article.getTagsId() + tag.getId() + ",");
// continue;
// }
// article.setTagsId(article.getTagsId() + tag.getId() + ",");
// }
// TODO:::: tag的更新
article.setTagsId(oldArticle.getTagsId());
article.setUpdateDate(new Date());
// TODO::::换用beansUtil
// 设置不定参数
article.setReadingNumber(oldArticle.getReadingNumber());
article.setPublishDate(oldArticle.getPublishDate());
article.setAuthorId(redisUserUtil.get(request).getId());
article.setPreArticleId(oldArticle.getPreArticleId());
article.setNextArticleId(oldArticle.getNextArticleId());
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
articleMapper.update(article);
//更新完成移除
request.getSession().removeAttribute("article4update");
return fullTransform(article);
}
@Override
public ArticleModel retrieveOneByID(long articleID, boolean is4update) {
Article article = articleMapper.findArticleById(articleID);
if (article == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
}
if (!article.getOpen()) {
User user = redisUserUtil.getWithOutExc(request);
if (user == null || "user".equals(user.getRole())) {
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
}
}
article.setReadingNumber(article.getReadingNumber() + 1);
if (is4update) {
//因更新而获取文章 不需要增加阅读量
request.getSession().setAttribute("article4update", article);
return fullTransform(article);
}
articleMapper.setReadingNumber(article.getReadingNumber() + 1, articleID);
return fullTransform(article);
}
/**
* @param count 数目
* @param page 页面 默认减1
* @return
*/
@Override
public PageInfo adminArticles(int count, int page) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAll();
PageInfo pageInfo = new PageInfo(articleList);
pageInfo.setList(list2list(articleList, LevelEnum.BETWEEN_M_AND_H));
return pageInfo;
}
@Override
public PageInfo retrievePageForOpen(int count, int page) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAllByOpen(true);
PageInfo pageInfo = new PageInfo(articleList);
pageInfo.setList(list2list(articleList, LevelEnum.MIDDLE));
return pageInfo;
}
@Override
public PageInfo findByCategory(String name, int page, int count) {
Long idByName = categoryMapper.getIDByName(name);
if (idByName == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
}
PageHelper.startPage(page, count);
PageInfo pageInfo = new PageInfo(articleMapper.getSimpleInfoByCategory(idByName));
return pageInfo;
}
@Override
public PageInfo findByTag(String name, int page, int count) {
Tag tag = tagMapper.findTagByName(name);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
PageHelper.startPage(page, count);
String[] split = tag.getArticles().split(",");
List<String> list = Arrays.asList(split);
List<Article> articleList = articleMapper.getSimpleInfoByTag(list);
PageInfo pageInfo = new PageInfo(articleList);
return pageInfo;
}
/**
* page转换
*
* @param articleList 数据源
* @param level 转换级别
* @return list
*/
private List<ArticleModel> list2list(List<Article> articleList, LevelEnum level) {
List<ArticleModel> content = new ArrayList<>();
for (Article a : articleList) {
ArticleModel model;
switch (level.getLevelCode()) {
case 0:
model = simpleTransform(a);
break;
case 1:
model = suitableTransform(a);
break;
case 2:
model = suitableTransformForAdmin(a);
break;
case 3:
default:
model = fullTransform(a);
}
content.add(model);
}
return content;
}
/**
* 简单的模型转换
* [id,title,summary]
*
* @param a 源数据
* @return 模型
*/
private ArticleModel simpleTransform(Article a) {
ArticleModel model = new ArticleModel();
model.setId(a.getId());
model.setTitle(a.getTitle());
model.setSummary(a.getSummary());
return model;
}
/**
* 中等转换
* [id,title,summary]
* +
* [original,tags,category]
*
* @param a
* @return
*/
private ArticleModel suitableTransform(Article a) {
ArticleModel model = simpleTransform(a);
model.setAuthorName(userService.getNameById(a.getAuthorId()));
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setOriginal(a.getType());
model.setCategory(categoryMapper.getNameById(a.getCategoryId()));
String[] split = a.getTagsId().split(",");
String[] tags = new String[split.length];
for (int i = 0; i < split.length; i++) {
if (split[i] == null || "".equals(split[i])) {
continue;
}
tags[i] = tagMapper.getNameById(Long.parseLong(split[i]));
}
model.setTags(tags);
return model;
}
/**
* 中等转换 for admin页面
* [id,title]
* +
* [original,UpdateDate,open,readingNumber]
*
* @param a
* @return
*/
private ArticleModel suitableTransformForAdmin(Article a) {
ArticleModel model = simpleTransform(a);
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setReadingNumber(a.getReadingNumber());
model.setOpen(a.getOpen());
model.setOriginal(a.getType());
model.setSummary(null);
return model;
}
/**
* 全转换
* [id,title,summary,original,tags,category]
* +
* [UpdateDate,MdContent,NextArticleId,NextArticleTitle,preArticleId,preArticleTitle,open,url,readingNumber]
*
* @param a
* @return
*/
private ArticleModel fullTransform(Article a) {
ArticleModel model = suitableTransform(a);
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setMdContent(a.getMdContent());
model.setNextArticleId(a.getNextArticleId());
model.setNextArticleTitle(a.getNextArticleId() == -1 ? "" : articleMapper.getTitleById(a.getNextArticleId()));
model.setPreArticleId(a.getPreArticleId());
model.setPreArticleTitle(a.getPreArticleId() == -1 ? "" : articleMapper.getTitleById(a.getPreArticleId()));
model.setOpen(a.getOpen());
model.setUrl(a.getUrl());
model.setReadingNumber(a.getReadingNumber());
return model;
}
}