调整数据库字段,优化部分接口 #1
@@ -80,10 +80,10 @@ public class ArticleController {
|
||||
public Response retrieveOneById(@PathVariable("articleID") long articleId,
|
||||
@RequestParam(value = "update", defaultValue = "false") boolean is4update,
|
||||
HttpServletRequest request) {
|
||||
ArticleModel article = articleService.retrieveOneByID(articleId, is4update);
|
||||
ArticleModel article = articleService.retrieveOneById(articleId, is4update);
|
||||
if (article.getOpen()) {
|
||||
return ResponseUtil.success(article);
|
||||
} else if (article.getAuthorId().equals(redisUserUtil.get().getId())) {
|
||||
} else if (article.getAuthor().getId().equals(redisUserUtil.get().getId())) {
|
||||
return ResponseUtil.success(article);
|
||||
}
|
||||
return ResponseUtil.response(ResponseEnum.PERMISSION_ERROR, null);
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import cn.celess.blog.entity.Tag;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
@@ -57,40 +59,28 @@ public class ArticleModel {
|
||||
/**
|
||||
* 标签
|
||||
*/
|
||||
private String[] tags;
|
||||
private List<Tag> tags;
|
||||
|
||||
/**
|
||||
* 作者
|
||||
*/
|
||||
private Long authorId;
|
||||
private UserModel author;
|
||||
|
||||
/**
|
||||
* 作者名字
|
||||
*/
|
||||
private String authorName;
|
||||
private ArticleModel preArticle;
|
||||
|
||||
/**
|
||||
* 上一篇文章
|
||||
*/
|
||||
private Long preArticleId;
|
||||
|
||||
/**
|
||||
* 下一篇文章
|
||||
*/
|
||||
private Long nextArticleId;
|
||||
|
||||
private String preArticleTitle;
|
||||
|
||||
private String nextArticleTitle;
|
||||
private ArticleModel nextArticle;
|
||||
|
||||
/**
|
||||
* 阅读数
|
||||
*/
|
||||
private Long readingNumber;
|
||||
|
||||
private Integer likeCount;
|
||||
|
||||
private Integer dislikeCount;
|
||||
|
||||
/**
|
||||
* 文章的状态 true:公开 false:不公开
|
||||
*/
|
||||
private Boolean open;
|
||||
|
||||
}
|
||||
|
||||
38
src/main/java/cn/celess/blog/entity/model/PageData.java
Normal file
38
src/main/java/cn/celess/blog/entity/model/PageData.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2020-05-25 17:13
|
||||
* @Desc:
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class PageData<T> {
|
||||
|
||||
private List<T> list;
|
||||
|
||||
private long total;
|
||||
|
||||
private int pageSize;
|
||||
|
||||
private int pageNum;
|
||||
|
||||
public PageData(PageInfo pageInfo) {
|
||||
this.pageNum = pageInfo.getPageNum();
|
||||
this.pageSize = pageInfo.getPageSize();
|
||||
this.total = pageInfo.getTotal();
|
||||
}
|
||||
|
||||
public PageData(PageInfo pageInfo, List<T> data) {
|
||||
this(pageInfo);
|
||||
this.list = data;
|
||||
}
|
||||
}
|
||||
@@ -37,8 +37,14 @@ public interface ArticleMapper {
|
||||
|
||||
List<Article> findAllByCategoryId(long id);
|
||||
|
||||
List<Article> findAllByCategoryIdAndOpen(long id);
|
||||
|
||||
List<Article> findAll();
|
||||
|
||||
Article getPreArticle(Long id);
|
||||
|
||||
Article getNextArticle(Long id);
|
||||
|
||||
int updateReadingNumber(long id);
|
||||
|
||||
long count();
|
||||
|
||||
@@ -28,4 +28,8 @@ public interface ArticleTagMapper {
|
||||
List<ArticleTag> findAllByArticleId(Long articleId);
|
||||
|
||||
int deleteMultiById(List<ArticleTag> articleTags);
|
||||
|
||||
List<ArticleTag> findArticleByTag(Long tagId);
|
||||
|
||||
List<ArticleTag> findArticleByTagAndOpen(Long tagId);
|
||||
}
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
package cn.celess.blog.service.serviceimpl;
|
||||
|
||||
import cn.celess.blog.enmu.LevelEnum;
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
import cn.celess.blog.enmu.RoleEnum;
|
||||
import cn.celess.blog.entity.*;
|
||||
import cn.celess.blog.entity.model.ArticleModel;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.request.ArticleReq;
|
||||
import cn.celess.blog.exception.MyException;
|
||||
import cn.celess.blog.mapper.*;
|
||||
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 cn.celess.blog.util.*;
|
||||
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 lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -26,7 +23,6 @@ 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;
|
||||
|
||||
|
||||
@@ -35,8 +31,8 @@ import java.util.List;
|
||||
* @date : 2019/03/28 15:21
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class ArticleServiceImpl implements ArticleService {
|
||||
public static final Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class);
|
||||
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@@ -86,22 +82,16 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
|
||||
}
|
||||
// 查看是否存在已有的分类
|
||||
Category category = (Category) categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
if (category == null) {
|
||||
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
|
||||
|
||||
// 构建 需要写入数据库的对象数据
|
||||
Article article = new Article();
|
||||
article.setTitle(reqBody.getTitle());
|
||||
article.setOpen(reqBody.getOpen());
|
||||
article.setMdContent(reqBody.getMdContent());
|
||||
article.setUrl(reqBody.getUrl());
|
||||
article.setType(reqBody.getType());
|
||||
BeanUtils.copyProperties(reqBody, article);
|
||||
|
||||
article.setUser(redisUserUtil.get());
|
||||
article.setPublishDate(new Date());
|
||||
|
||||
//markdown->html->summary
|
||||
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
@@ -113,14 +103,13 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
|
||||
//文章存数据库
|
||||
articleMapper.insert(article);
|
||||
|
||||
//将标签写入数据库
|
||||
for (String tagName : reqBody.getTags()) {
|
||||
if (tagName.replaceAll(" ", "").length() == 0) {
|
||||
//单个标签只含空格
|
||||
continue;
|
||||
}
|
||||
Tag tag = (Tag) tagMapper.findTagByName(tagName);
|
||||
Tag tag = tagMapper.findTagByName(tagName);
|
||||
if (tag == null) {
|
||||
tag = new Tag();
|
||||
tag.setName(tagName);
|
||||
@@ -129,9 +118,12 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
ArticleTag articleTag = new ArticleTag(article, tag);
|
||||
articleTagMapper.insert(articleTag);
|
||||
}
|
||||
return fullTransform(article);
|
||||
}
|
||||
Article articleFromDb = articleMapper.findArticleById(article.getId());
|
||||
|
||||
ArticleModel articleModel = ModalTrans.articleToModal(articleFromDb);
|
||||
articleModel.setPreArticle(ModalTrans.articleToModal(articleMapper.getPreArticle(article.getId())));
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@@ -189,7 +181,7 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
article.setUrl(reqBody.getUrl());
|
||||
}
|
||||
if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
|
||||
Category category = (Category) categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
if (category == null) {
|
||||
category = new Category();
|
||||
category.setName(reqBody.getCategory());
|
||||
@@ -198,12 +190,8 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
article.setCategory(category);
|
||||
}
|
||||
|
||||
if (reqBody.getTags() != null && reqBody.getTags().length != 0) {
|
||||
|
||||
}
|
||||
|
||||
//写入数据库的数据
|
||||
article.setOpen(reqBody.getOpen() ? article.getOpen() : reqBody.getOpen());
|
||||
article.setOpen(reqBody.getOpen() == null ? article.getOpen() : reqBody.getOpen());
|
||||
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
|
||||
articleMapper.update(article);
|
||||
@@ -213,12 +201,13 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
List<ArticleTag> updateList = new ArrayList<>();
|
||||
List<ArticleTag> deleteList = new ArrayList<>();
|
||||
|
||||
// 获取要更新 的标签
|
||||
for (String tag : reqBody.getTags()) {
|
||||
boolean contain = allByArticleId.stream().anyMatch(articleTag -> articleTag.getTag().getName().equals(tag));
|
||||
if (!contain) {
|
||||
ArticleTag articleTag = new ArticleTag();
|
||||
articleTag.setArticle(article);
|
||||
Tag tagByName = (Tag) tagMapper.findTagByName(tag);
|
||||
Tag tagByName = tagMapper.findTagByName(tag);
|
||||
if (tagByName == null) {
|
||||
tagByName = new Tag(tag);
|
||||
tagMapper.insert(tagByName);
|
||||
@@ -227,7 +216,7 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
updateList.add(articleTag);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取要删除的标签
|
||||
allByArticleId.forEach(articleTag -> {
|
||||
boolean contain = false;
|
||||
for (String tag : reqBody.getTags()) {
|
||||
@@ -251,12 +240,14 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
|
||||
//更新完成移除
|
||||
request.getSession().removeAttribute("article4update");
|
||||
return fullTransform(article);
|
||||
ArticleModel articleModel = ModalTrans.articleToModal(articleMapper.findArticleById(article.getId()));
|
||||
setPreAndNextArticle(articleModel);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArticleModel retrieveOneByID(long articleID, boolean is4update) {
|
||||
Article article = articleMapper.findArticleById(articleID);
|
||||
public ArticleModel retrieveOneById(long articleId, boolean is4update) {
|
||||
Article article = articleMapper.findArticleById(articleId);
|
||||
if (article == null) {
|
||||
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
|
||||
}
|
||||
@@ -266,178 +257,101 @@ public class ArticleServiceImpl implements ArticleService {
|
||||
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
|
||||
}
|
||||
}
|
||||
article.setReadingNumber(article.getReadingNumber() + 1);
|
||||
ArticleModel articleModel = ModalTrans.articleToModal(article);
|
||||
|
||||
if (is4update) {
|
||||
//因更新而获取文章 不需要增加阅读量
|
||||
request.getSession().setAttribute("article4update", article);
|
||||
return fullTransform(article);
|
||||
return articleModel;
|
||||
}
|
||||
articleMapper.setReadingNumber(article.getReadingNumber() + 1, articleID);
|
||||
return fullTransform(article);
|
||||
setPreAndNextArticle(articleModel);
|
||||
articleMapper.updateReadingNumber(articleId);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param count 数目
|
||||
* @param page 页面 默认减1
|
||||
* @return
|
||||
* @return PageInfo
|
||||
*/
|
||||
@Override
|
||||
public PageInfo adminArticles(int count, int page) {
|
||||
public PageData<ArticleModel> 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;
|
||||
PageData<ArticleModel> pageData = new PageData<ArticleModel>(new PageInfo<Article>(articleList));
|
||||
List<ArticleModel> articleModelList = new ArrayList<>();
|
||||
articleList.forEach(article -> {
|
||||
ArticleModel articleModel = ModalTrans.articleToModal(article);
|
||||
articleModel.setMdContent(null);
|
||||
articleModelList.add(articleModel);
|
||||
});
|
||||
pageData.setList(articleModelList);
|
||||
return pageData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo retrievePageForOpen(int count, int page) {
|
||||
public PageData<ArticleModel> 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;
|
||||
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<Article>(articleList));
|
||||
|
||||
List<ArticleModel> articleModelList = new ArrayList<>();
|
||||
|
||||
articleList.forEach(article -> {
|
||||
ArticleModel model = ModalTrans.articleToModal(article);
|
||||
setPreAndNextArticle(model);
|
||||
model.setOpen(null);
|
||||
model.setMdContent(null);
|
||||
articleModelList.add(model);
|
||||
});
|
||||
|
||||
pageData.setList(articleModelList);
|
||||
return pageData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo findByCategory(String name, int page, int count) {
|
||||
Long idByName = categoryMapper.getIdByName(name);
|
||||
if (idByName == null) {
|
||||
public PageData<ArticleModel> findByCategory(String name, int page, int count) {
|
||||
Category category = categoryMapper.findCategoryByName(name);
|
||||
if (category == null) {
|
||||
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
PageHelper.startPage(page, count);
|
||||
PageInfo pageInfo = new PageInfo(articleMapper.getSimpleInfoByCategory(idByName));
|
||||
return pageInfo;
|
||||
List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
|
||||
|
||||
List<ArticleModel> modelList = new ArrayList<>();
|
||||
|
||||
open.forEach(article -> {
|
||||
ArticleModel model = ModalTrans.articleToModal(article);
|
||||
model.setMdContent(null);
|
||||
model.setTags(null);
|
||||
model.setOpen(null);
|
||||
setPreAndNextArticle(model);
|
||||
});
|
||||
return new PageData<ArticleModel>(new PageInfo<Article>(open), modelList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo findByTag(String name, int page, int count) {
|
||||
Tag tag = (Tag) tagMapper.findTagByName(name);
|
||||
public PageData<ArticleModel> findByTag(String name, int page, int count) {
|
||||
Tag tag = tagMapper.findTagByName(name);
|
||||
if (tag == null) {
|
||||
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
|
||||
}
|
||||
// TODO :
|
||||
PageHelper.startPage(page, count);
|
||||
List<String> list = Arrays.asList(null);
|
||||
List<Article> articleList = articleMapper.getSimpleInfoByTag(list);
|
||||
PageInfo pageInfo = new PageInfo(articleList);
|
||||
return pageInfo;
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
|
||||
List<ArticleModel> modelList = new ArrayList<>();
|
||||
articleByTag.forEach(articleTag -> {
|
||||
ArticleModel model = ModalTrans.articleToModal(articleTag.getArticle());
|
||||
model.setMdContent(null);
|
||||
model.setOpen(null);
|
||||
});
|
||||
return new PageData<ArticleModel>(new PageInfo<ArticleTag>(articleByTag), modelList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
private void setPreAndNextArticle(ArticleModel articleModel) {
|
||||
if (articleModel == null) {
|
||||
return;
|
||||
}
|
||||
content.add(model);
|
||||
articleModel.setPreArticle(ModalTrans.articleToModal(articleMapper.getPreArticle(articleModel.getId())));
|
||||
articleModel.setNextArticle(ModalTrans.articleToModal(articleMapper.getNextArticle(articleModel.getId())));
|
||||
}
|
||||
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.setAuthor(a.getUser());
|
||||
// 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
37
src/main/java/cn/celess/blog/util/ModalTrans.java
Normal file
37
src/main/java/cn/celess/blog/util/ModalTrans.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package cn.celess.blog.util;
|
||||
|
||||
import cn.celess.blog.entity.Article;
|
||||
import cn.celess.blog.entity.User;
|
||||
import cn.celess.blog.entity.model.ArticleModel;
|
||||
import cn.celess.blog.entity.model.UserModel;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2020-05-24 18:04
|
||||
* @Desc:
|
||||
*/
|
||||
public class ModalTrans {
|
||||
|
||||
public static ArticleModel articleToModal(Article article) {
|
||||
if (article == null) {
|
||||
return null;
|
||||
}
|
||||
ArticleModel articleModel = new ArticleModel();
|
||||
BeanUtils.copyProperties(article, articleModel);
|
||||
articleModel.setPublishDateFormat(DateFormatUtil.get(article.getPublishDate()));
|
||||
articleModel.setUpdateDateFormat(DateFormatUtil.get(article.getUpdateDate()));
|
||||
articleModel.setOriginal(article.getType());
|
||||
articleModel.setCategory(article.getCategory().getName());
|
||||
articleModel.setAuthor(userToModal(article.getUser()));
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
|
||||
public static UserModel userToModal(User user) {
|
||||
UserModel userModel = new UserModel();
|
||||
BeanUtils.copyProperties(user, userModel);
|
||||
return userModel;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -43,8 +43,8 @@
|
||||
|
||||
<delete id="deleteMultiById">
|
||||
delete from article_tag where at_id in
|
||||
<foreach item="item" collection="list" separator=",">
|
||||
(#{articleTag.id})
|
||||
<foreach item="item" collection="list" open="(" close=")" separator=",">
|
||||
#{item.id}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
@@ -73,4 +73,28 @@
|
||||
and tag_category.t_id = article_tag.t_id
|
||||
</select>
|
||||
|
||||
|
||||
<select id="findArticleByTag" resultMap="articleTagResultMap">
|
||||
select *
|
||||
from tag_category,
|
||||
article,
|
||||
article_tag
|
||||
where tag_category.t_id = #{tagId}
|
||||
and is_category = false
|
||||
and tag_category.t_id = article_tag.t_id
|
||||
and article_tag.a_id = article.a_id
|
||||
</select>
|
||||
|
||||
<select id="findArticleByTagAndOpen" resultMap="articleTagResultMap">
|
||||
select *
|
||||
from tag_category,
|
||||
article,
|
||||
article_tag
|
||||
where tag_category.t_id = #{tagId}
|
||||
and is_category = false
|
||||
and tag_category.t_id = article_tag.t_id
|
||||
and article.a_is_open = true
|
||||
and article_tag.a_id = article.a_id
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -141,6 +141,15 @@
|
||||
order by articleId desc
|
||||
</select>
|
||||
|
||||
<select id="findAllByCategoryIdAndOpen" resultMap="articleViewResultMap">
|
||||
select *
|
||||
from articleView
|
||||
where categoryId = #{id}
|
||||
and isDelete = false
|
||||
and isOpen = true
|
||||
order by articleId desc
|
||||
</select>
|
||||
|
||||
|
||||
<select id="findAll" resultMap="articleViewResultMap">
|
||||
select *
|
||||
@@ -155,5 +164,22 @@
|
||||
from article;
|
||||
</select>
|
||||
|
||||
<select id="getPreArticle" resultMap="articleViewResultMap">
|
||||
select *
|
||||
from articleView
|
||||
where articleId = (select max(articleId)
|
||||
from articleView
|
||||
where articleId < #{id}
|
||||
)
|
||||
</select>
|
||||
<select id="getNextArticle" resultMap="articleViewResultMap">
|
||||
select *
|
||||
from articleView
|
||||
where articleId = (select min(articleId)
|
||||
from articleView
|
||||
where articleId > #{id}
|
||||
)
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -3,10 +3,11 @@ package cn.celess.blog.controller;
|
||||
import cn.celess.blog.BaseTest;
|
||||
import cn.celess.blog.entity.Article;
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.entity.Tag;
|
||||
import cn.celess.blog.entity.model.ArticleModel;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.request.ArticleReq;
|
||||
import cn.celess.blog.mapper.ArticleMapper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import net.sf.json.JSONObject;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -31,7 +32,8 @@ public class ArticleControllerTest extends BaseTest {
|
||||
articleReq.setTitle("test-" + UUID.randomUUID().toString());
|
||||
articleReq.setMdContent("# test title");
|
||||
articleReq.setCategory("随笔");
|
||||
articleReq.setTags("test,SpringMvc");
|
||||
String[] tagList = {"tag", "category"};
|
||||
articleReq.setTags(tagList);
|
||||
articleReq.setOpen(true);
|
||||
articleReq.setType(true);
|
||||
articleReq.setUrl("http://xxxx.com");
|
||||
@@ -80,13 +82,11 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertNotNull(articleModel.getCategory());
|
||||
assertNotNull(articleModel.getPublishDateFormat());
|
||||
assertNotNull(articleModel.getMdContent());
|
||||
assertNotNull(articleModel.getNextArticleId());
|
||||
assertNotNull(articleModel.getNextArticleTitle());
|
||||
assertNotNull(articleModel.getPreArticleId());
|
||||
assertNotNull(articleModel.getPreArticleTitle());
|
||||
assertNotNull(articleModel.getPreArticle());
|
||||
assertNull(articleModel.getNextArticle());
|
||||
assertNotNull(articleModel.getOpen());
|
||||
assertNotNull(articleModel.getReadingNumber());
|
||||
assertNotNull(articleModel.getAuthorName());
|
||||
assertNotNull(articleModel.getAuthor());
|
||||
assertNotNull(articleModel.getUrl());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
@@ -96,11 +96,11 @@ public class ArticleControllerTest extends BaseTest {
|
||||
|
||||
@Test
|
||||
public void delete() {
|
||||
long articleId = articleMapper.getLastestArticleId();
|
||||
Article article = articleMapper.getLastestArticle();
|
||||
|
||||
try {
|
||||
// 未登录删除文章
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + articleId)
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
|
||||
).andDo(result -> {
|
||||
assertEquals(HAVE_NOT_LOG_IN.getCode(),
|
||||
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
|
||||
@@ -108,14 +108,14 @@ public class ArticleControllerTest extends BaseTest {
|
||||
});
|
||||
// user 权限删除文章
|
||||
String token = userLogin();
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + articleId)
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
|
||||
.header("Authorization", token))
|
||||
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(),
|
||||
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
|
||||
);
|
||||
// admin 权限删除文章
|
||||
token = adminLogin();
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + articleId)
|
||||
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
|
||||
.header("Authorization", token))
|
||||
.andDo(result -> {
|
||||
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
|
||||
@@ -140,8 +140,8 @@ public class ArticleControllerTest extends BaseTest {
|
||||
articleReq.setOpen(!article.getOpen());
|
||||
String tag1 = randomStr(4);
|
||||
String tag2 = randomStr(4);
|
||||
String tag = "test," + tag1 + "," + tag2;
|
||||
articleReq.setTags(tag);
|
||||
String[] tagList = {"test", tag1, tag2};
|
||||
articleReq.setTags(tagList);
|
||||
articleReq.setTitle("test-" + article.getTitle());
|
||||
try {
|
||||
// Admin 权限
|
||||
@@ -160,15 +160,11 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertEquals(articleReq.getTitle(), a.getTitle());
|
||||
assertEquals(articleReq.getType(), a.getOriginal());
|
||||
// Tag
|
||||
List<String> asList = Arrays.asList(a.getTags());
|
||||
assertTrue(asList.contains("test"));
|
||||
assertTrue(asList.contains(tag1));
|
||||
assertTrue(asList.contains(tag2));
|
||||
List<Tag> asList = a.getTags();
|
||||
assertEquals(3, asList.size());
|
||||
assertEquals(articleReq.getOpen(), a.getOpen());
|
||||
assertEquals(articleReq.getId(), a.getId());
|
||||
});
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -207,17 +203,13 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertNotNull(a.getMdContent());
|
||||
assertNotNull(a.getUrl());
|
||||
assertNotNull(a.getUpdateDateFormat());
|
||||
assertNotNull(a.getPreArticleId());
|
||||
assertNotNull(a.getPreArticleId());
|
||||
assertNotNull(a.getNextArticleId());
|
||||
assertNotNull(a.getNextArticleTitle());
|
||||
assertTrue(a.getPreArticle() != null || a.getNextArticle() != null);
|
||||
assertNotNull(a.getReadingNumber());
|
||||
// assertNotNull(a.getOpen());
|
||||
assertNotNull(a.getOriginal());
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getCategory());
|
||||
assertNotNull(a.getTags());
|
||||
assertNotNull(a.getAuthorName());
|
||||
assertNotNull(a.getAuthor());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -242,14 +234,12 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertNotNull(response.getResult());
|
||||
// 判断pageInfo是否包装完全
|
||||
JSONObject resultJson = JSONObject.fromObject(response.getResult());
|
||||
PageInfo pageInfo = (PageInfo) JSONObject.toBean(resultJson, PageInfo.class);
|
||||
assertNotEquals(0, pageInfo.getTotal());
|
||||
assertNotEquals(0, pageInfo.getStartRow());
|
||||
assertNotEquals(0, pageInfo.getEndRow());
|
||||
assertEquals(1, pageInfo.getPageNum());
|
||||
assertEquals(5, pageInfo.getPageSize());
|
||||
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(resultJson, PageData.class);
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(5, pageData.getPageSize());
|
||||
// 内容完整
|
||||
for (Object arc : pageInfo.getList()) {
|
||||
for (Object arc : pageData.getList()) {
|
||||
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
|
||||
assertNotNull(a.getTitle());
|
||||
assertNotNull(a.getId());
|
||||
@@ -258,7 +248,9 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getCategory());
|
||||
assertNotNull(a.getTags());
|
||||
assertNotNull(a.getAuthorName());
|
||||
assertNotNull(a.getAuthor());
|
||||
assertNull(a.getOpen());
|
||||
assertNull(a.getMdContent());
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
@@ -299,14 +291,12 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertEquals(SUCCESS.getCode(), adminLogin.getInt(Code));
|
||||
assertNotNull(adminLogin.getString(Result));
|
||||
// 判断pageInfo是否包装完全
|
||||
PageInfo pageInfo = (PageInfo) JSONObject.toBean(adminLogin.getJSONObject(Result), PageInfo.class);
|
||||
assertNotEquals(0, pageInfo.getTotal());
|
||||
assertNotEquals(0, pageInfo.getStartRow());
|
||||
assertNotEquals(0, pageInfo.getEndRow());
|
||||
assertEquals(1, pageInfo.getPageNum());
|
||||
assertEquals(10, pageInfo.getPageSize());
|
||||
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(adminLogin.getJSONObject(Result), PageData.class);
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(10, pageData.getPageSize());
|
||||
// 内容完整
|
||||
for (Object arc : pageInfo.getList()) {
|
||||
for (Object arc : pageData.getList()) {
|
||||
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
|
||||
assertNotNull(a.getTitle());
|
||||
assertNotNull(a.getId());
|
||||
@@ -314,6 +304,9 @@ public class ArticleControllerTest extends BaseTest {
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getOpen());
|
||||
assertNotNull(a.getReadingNumber());
|
||||
assertNotNull(a.getLikeCount());
|
||||
assertNotNull(a.getDislikeCount());
|
||||
assertNull(a.getMdContent());
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
@@ -338,13 +331,11 @@ public class ArticleControllerTest extends BaseTest {
|
||||
.andDo(result -> {
|
||||
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
|
||||
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code));
|
||||
PageInfo pageInfo = (PageInfo) JSONObject.toBean(jsonObject.getJSONObject(Result), PageInfo.class);
|
||||
assertNotEquals(0, pageInfo.getTotal());
|
||||
assertNotEquals(0, pageInfo.getStartRow());
|
||||
assertNotEquals(0, pageInfo.getEndRow());
|
||||
assertEquals(1, pageInfo.getPageNum());
|
||||
assertEquals(10, pageInfo.getPageSize());
|
||||
for (Object arc : pageInfo.getList()) {
|
||||
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class);
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(10, pageData.getPageSize());
|
||||
for (Object arc : pageData.getList()) {
|
||||
JSONObject jsonObject1 = JSONObject.fromObject(arc);
|
||||
assertNotEquals(0, jsonObject1.getInt("id"));
|
||||
assertNotNull(jsonObject1.getString("title"));
|
||||
@@ -373,14 +364,12 @@ public class ArticleControllerTest extends BaseTest {
|
||||
.andDo(result -> {
|
||||
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
|
||||
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code));
|
||||
PageInfo pageInfo = (PageInfo) JSONObject.toBean(jsonObject.getJSONObject(Result), PageInfo.class);
|
||||
assertNotEquals(0, pageInfo.getTotal());
|
||||
assertNotEquals(0, pageInfo.getStartRow());
|
||||
assertNotEquals(0, pageInfo.getEndRow());
|
||||
assertEquals(1, pageInfo.getPageNum());
|
||||
assertEquals(10, pageInfo.getPageSize());
|
||||
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class);
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(10, pageData.getPageSize());
|
||||
|
||||
for (Object arc : pageInfo.getList()) {
|
||||
for (Object arc : pageData.getList()) {
|
||||
JSONObject jsonObject1 = JSONObject.fromObject(arc);
|
||||
assertNotEquals(0, jsonObject1.getInt("id"));
|
||||
assertNotNull(jsonObject1.getString("title"));
|
||||
|
||||
@@ -162,6 +162,13 @@ public class ArticleMapperTest extends BaseTest {
|
||||
assertNotEquals(0, allByCategoryId.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findAllByCategoryIdAndOpen() {
|
||||
List<Article> allByCategoryId = articleMapper.findAllByCategoryId(1);
|
||||
assertNotEquals(0, allByCategoryId.size());
|
||||
allByCategoryId.forEach(article -> assertTrue(article.getOpen()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findAll() {
|
||||
List<Article> allByCategoryId = articleMapper.findAll();
|
||||
@@ -173,6 +180,21 @@ public class ArticleMapperTest extends BaseTest {
|
||||
assertNotEquals(0, articleMapper.count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPreArticle() {
|
||||
ArticleTag articleTag = generateArticle();
|
||||
Article preArticle = articleMapper.getPreArticle(articleTag.getArticle().getId());
|
||||
assertNotNull(preArticle);
|
||||
assertTrue(preArticle.getId() < articleTag.getArticle().getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getNextArticle() {
|
||||
Article getNextArticle = articleMapper.getNextArticle(3L);
|
||||
assertNotNull(getNextArticle);
|
||||
assertTrue(getNextArticle.getId() > 3L);
|
||||
}
|
||||
|
||||
private ArticleTag generateArticle() {
|
||||
String randomText = UUID.randomUUID().toString();
|
||||
|
||||
@@ -199,5 +221,4 @@ public class ArticleMapperTest extends BaseTest {
|
||||
|
||||
return articleTag;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -90,11 +90,27 @@ public class ArticleTagMapperTest extends BaseTest {
|
||||
articleTagMapper.insert(articleTag);
|
||||
|
||||
List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(-1L);
|
||||
assertEquals(6, allByArticleId.size());
|
||||
assertTrue(allByArticleId.size() >= 6);
|
||||
int lines = articleTagMapper.deleteMultiById(allByArticleId);
|
||||
assertEquals(6, lines);
|
||||
assertTrue(lines >= 6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findArticleByTag() {
|
||||
ArticleTag articleTag = generateArticle();
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(21L);
|
||||
assertNotEquals(0, articleByTag.size());
|
||||
articleByTag.forEach(articleTag1 -> assertEquals(articleTag.getTag().getName(), articleTag1.getTag().getName()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findArticleByTagAndOpen() {
|
||||
ArticleTag articleTag = generateArticle();
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(21L);
|
||||
assertNotEquals(0, articleByTag.size());
|
||||
articleByTag.forEach(articleTag1 -> assertEquals(articleTag.getTag().getName(), articleTag1.getTag().getName()));
|
||||
articleByTag.forEach(articleTag1 -> assertTrue(articleTag1.getArticle().getOpen()));
|
||||
}
|
||||
|
||||
private ArticleTag generateArticle() {
|
||||
String randomText = UUID.randomUUID().toString();
|
||||
@@ -122,5 +138,4 @@ public class ArticleTagMapperTest extends BaseTest {
|
||||
|
||||
return articleTag;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user