Service层修改 单元测试

This commit is contained in:
禾几海
2020-05-25 21:43:53 +08:00
parent 9e6868b638
commit 67a1b1faf9
12 changed files with 317 additions and 253 deletions

View File

@@ -80,10 +80,10 @@ public class ArticleController {
public Response retrieveOneById(@PathVariable("articleID") long articleId, public Response retrieveOneById(@PathVariable("articleID") long articleId,
@RequestParam(value = "update", defaultValue = "false") boolean is4update, @RequestParam(value = "update", defaultValue = "false") boolean is4update,
HttpServletRequest request) { HttpServletRequest request) {
ArticleModel article = articleService.retrieveOneByID(articleId, is4update); ArticleModel article = articleService.retrieveOneById(articleId, is4update);
if (article.getOpen()) { if (article.getOpen()) {
return ResponseUtil.success(article); 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.success(article);
} }
return ResponseUtil.response(ResponseEnum.PERMISSION_ERROR, null); return ResponseUtil.response(ResponseEnum.PERMISSION_ERROR, null);

View File

@@ -1,9 +1,11 @@
package cn.celess.blog.entity.model; package cn.celess.blog.entity.model;
import cn.celess.blog.entity.Tag;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -57,40 +59,28 @@ public class ArticleModel {
/** /**
* 标签 * 标签
*/ */
private String[] tags; private List<Tag> tags;
/** /**
* 作者 * 作者
*/ */
private Long authorId; private UserModel author;
/** private ArticleModel preArticle;
* 作者名字
*/
private String authorName;
/** private ArticleModel nextArticle;
* 上一篇文章
*/
private Long preArticleId;
/**
* 下一篇文章
*/
private Long nextArticleId;
private String preArticleTitle;
private String nextArticleTitle;
/** /**
* 阅读数 * 阅读数
*/ */
private Long readingNumber; private Long readingNumber;
private Integer likeCount;
private Integer dislikeCount;
/** /**
* 文章的状态 true公开 false:不公开 * 文章的状态 true公开 false:不公开
*/ */
private Boolean open; private Boolean open;
} }

View 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;
}
}

View File

@@ -37,8 +37,14 @@ public interface ArticleMapper {
List<Article> findAllByCategoryId(long id); List<Article> findAllByCategoryId(long id);
List<Article> findAllByCategoryIdAndOpen(long id);
List<Article> findAll(); List<Article> findAll();
Article getPreArticle(Long id);
Article getNextArticle(Long id);
int updateReadingNumber(long id); int updateReadingNumber(long id);
long count(); long count();

View File

@@ -28,4 +28,8 @@ public interface ArticleTagMapper {
List<ArticleTag> findAllByArticleId(Long articleId); List<ArticleTag> findAllByArticleId(Long articleId);
int deleteMultiById(List<ArticleTag> articleTags); int deleteMultiById(List<ArticleTag> articleTags);
List<ArticleTag> findArticleByTag(Long tagId);
List<ArticleTag> findArticleByTagAndOpen(Long tagId);
} }

View File

@@ -1,24 +1,21 @@
package cn.celess.blog.service.serviceimpl; package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.LevelEnum;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum; import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.entity.*; import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.ArticleModel; 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.entity.request.ArticleReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.*; import cn.celess.blog.mapper.*;
import cn.celess.blog.service.ArticleService; import cn.celess.blog.service.ArticleService;
import cn.celess.blog.service.UserService; import cn.celess.blog.service.UserService;
import cn.celess.blog.util.DateFormatUtil; import cn.celess.blog.util.*;
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.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.youbenzi.mdtool.tool.MDTool; import com.youbenzi.mdtool.tool.MDTool;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -26,7 +23,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
@@ -35,8 +31,8 @@ import java.util.List;
* @date : 2019/03/28 15:21 * @date : 2019/03/28 15:21
*/ */
@Service @Service
@Slf4j
public class ArticleServiceImpl implements ArticleService { public class ArticleServiceImpl implements ArticleService {
public static final Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class);
@Autowired @Autowired
ArticleMapper articleMapper; ArticleMapper articleMapper;
@@ -86,22 +82,16 @@ public class ArticleServiceImpl implements ArticleService {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST); throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
} }
// 查看是否存在已有的分类 // 查看是否存在已有的分类
Category category = (Category) categoryMapper.findCategoryByName(reqBody.getCategory()); Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) { if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST); throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
} }
// 构建 需要写入数据库的对象数据 // 构建 需要写入数据库的对象数据
Article article = new Article(); Article article = new Article();
article.setTitle(reqBody.getTitle()); BeanUtils.copyProperties(reqBody, article);
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
article.setUser(redisUserUtil.get()); article.setUser(redisUserUtil.get());
article.setPublishDate(new Date());
//markdown->html->summary //markdown->html->summary
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent())); String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
@@ -113,14 +103,13 @@ public class ArticleServiceImpl implements ArticleService {
//文章存数据库 //文章存数据库
articleMapper.insert(article); articleMapper.insert(article);
//将标签写入数据库 //将标签写入数据库
for (String tagName : reqBody.getTags()) { for (String tagName : reqBody.getTags()) {
if (tagName.replaceAll(" ", "").length() == 0) { if (tagName.replaceAll(" ", "").length() == 0) {
//单个标签只含空格 //单个标签只含空格
continue; continue;
} }
Tag tag = (Tag) tagMapper.findTagByName(tagName); Tag tag = tagMapper.findTagByName(tagName);
if (tag == null) { if (tag == null) {
tag = new Tag(); tag = new Tag();
tag.setName(tagName); tag.setName(tagName);
@@ -129,9 +118,12 @@ public class ArticleServiceImpl implements ArticleService {
ArticleTag articleTag = new ArticleTag(article, tag); ArticleTag articleTag = new ArticleTag(article, tag);
articleTagMapper.insert(articleTag); 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -189,7 +181,7 @@ public class ArticleServiceImpl implements ArticleService {
article.setUrl(reqBody.getUrl()); article.setUrl(reqBody.getUrl());
} }
if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) { if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
Category category = (Category) categoryMapper.findCategoryByName(reqBody.getCategory()); Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) { if (category == null) {
category = new Category(); category = new Category();
category.setName(reqBody.getCategory()); category.setName(reqBody.getCategory());
@@ -198,12 +190,8 @@ public class ArticleServiceImpl implements ArticleService {
article.setCategory(category); 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())); String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str); article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
articleMapper.update(article); articleMapper.update(article);
@@ -213,12 +201,13 @@ public class ArticleServiceImpl implements ArticleService {
List<ArticleTag> updateList = new ArrayList<>(); List<ArticleTag> updateList = new ArrayList<>();
List<ArticleTag> deleteList = new ArrayList<>(); List<ArticleTag> deleteList = new ArrayList<>();
// 获取要更新 的标签
for (String tag : reqBody.getTags()) { for (String tag : reqBody.getTags()) {
boolean contain = allByArticleId.stream().anyMatch(articleTag -> articleTag.getTag().getName().equals(tag)); boolean contain = allByArticleId.stream().anyMatch(articleTag -> articleTag.getTag().getName().equals(tag));
if (!contain) { if (!contain) {
ArticleTag articleTag = new ArticleTag(); ArticleTag articleTag = new ArticleTag();
articleTag.setArticle(article); articleTag.setArticle(article);
Tag tagByName = (Tag) tagMapper.findTagByName(tag); Tag tagByName = tagMapper.findTagByName(tag);
if (tagByName == null) { if (tagByName == null) {
tagByName = new Tag(tag); tagByName = new Tag(tag);
tagMapper.insert(tagByName); tagMapper.insert(tagByName);
@@ -227,7 +216,7 @@ public class ArticleServiceImpl implements ArticleService {
updateList.add(articleTag); updateList.add(articleTag);
} }
} }
// 获取要删除的标签
allByArticleId.forEach(articleTag -> { allByArticleId.forEach(articleTag -> {
boolean contain = false; boolean contain = false;
for (String tag : reqBody.getTags()) { for (String tag : reqBody.getTags()) {
@@ -251,12 +240,14 @@ public class ArticleServiceImpl implements ArticleService {
//更新完成移除 //更新完成移除
request.getSession().removeAttribute("article4update"); request.getSession().removeAttribute("article4update");
return fullTransform(article); ArticleModel articleModel = ModalTrans.articleToModal(articleMapper.findArticleById(article.getId()));
setPreAndNextArticle(articleModel);
return articleModel;
} }
@Override @Override
public ArticleModel retrieveOneByID(long articleID, boolean is4update) { public ArticleModel retrieveOneById(long articleId, boolean is4update) {
Article article = articleMapper.findArticleById(articleID); Article article = articleMapper.findArticleById(articleId);
if (article == null) { if (article == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST); throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
} }
@@ -266,178 +257,101 @@ public class ArticleServiceImpl implements ArticleService {
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC); throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
} }
} }
article.setReadingNumber(article.getReadingNumber() + 1); ArticleModel articleModel = ModalTrans.articleToModal(article);
if (is4update) { if (is4update) {
//因更新而获取文章 不需要增加阅读量 //因更新而获取文章 不需要增加阅读量
request.getSession().setAttribute("article4update", article); request.getSession().setAttribute("article4update", article);
return fullTransform(article); return articleModel;
} }
articleMapper.setReadingNumber(article.getReadingNumber() + 1, articleID); setPreAndNextArticle(articleModel);
return fullTransform(article); articleMapper.updateReadingNumber(articleId);
return articleModel;
} }
/** /**
* @param count 数目 * @param count 数目
* @param page 页面 默认减1 * @param page 页面 默认减1
* @return * @return PageInfo
*/ */
@Override @Override
public PageInfo adminArticles(int count, int page) { public PageData<ArticleModel> adminArticles(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAll(); List<Article> articleList = articleMapper.findAll();
PageInfo pageInfo = new PageInfo(articleList); PageData<ArticleModel> pageData = new PageData<ArticleModel>(new PageInfo<Article>(articleList));
pageInfo.setList(list2list(articleList, LevelEnum.BETWEEN_M_AND_H)); List<ArticleModel> articleModelList = new ArrayList<>();
return pageInfo; articleList.forEach(article -> {
ArticleModel articleModel = ModalTrans.articleToModal(article);
articleModel.setMdContent(null);
articleModelList.add(articleModel);
});
pageData.setList(articleModelList);
return pageData;
} }
@Override @Override
public PageInfo retrievePageForOpen(int count, int page) { public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAllByOpen(true); List<Article> articleList = articleMapper.findAllByOpen(true);
PageInfo pageInfo = new PageInfo(articleList); PageData<ArticleModel> pageData = new PageData<>(new PageInfo<Article>(articleList));
pageInfo.setList(list2list(articleList, LevelEnum.MIDDLE));
return pageInfo; 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 @Override
public PageInfo findByCategory(String name, int page, int count) { public PageData<ArticleModel> findByCategory(String name, int page, int count) {
Long idByName = categoryMapper.getIdByName(name); Category category = categoryMapper.findCategoryByName(name);
if (idByName == null) { if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST); throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
} }
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
PageInfo pageInfo = new PageInfo(articleMapper.getSimpleInfoByCategory(idByName)); List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
return pageInfo;
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 @Override
public PageInfo findByTag(String name, int page, int count) { public PageData<ArticleModel> findByTag(String name, int page, int count) {
Tag tag = (Tag) tagMapper.findTagByName(name); Tag tag = tagMapper.findTagByName(name);
if (tag == null) { if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST); throw new MyException(ResponseEnum.TAG_NOT_EXIST);
} }
// TODO :
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<String> list = Arrays.asList(null); List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
List<Article> articleList = articleMapper.getSimpleInfoByTag(list); List<ArticleModel> modelList = new ArrayList<>();
PageInfo pageInfo = new PageInfo(articleList); articleByTag.forEach(articleTag -> {
return pageInfo; ArticleModel model = ModalTrans.articleToModal(articleTag.getArticle());
model.setMdContent(null);
model.setOpen(null);
});
return new PageData<ArticleModel>(new PageInfo<ArticleTag>(articleByTag), modelList);
} }
/** private void setPreAndNextArticle(ArticleModel articleModel) {
* page转换 if (articleModel == null) {
* return;
* @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); 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;
}
} }

View 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;
}
}

View File

@@ -43,8 +43,8 @@
<delete id="deleteMultiById"> <delete id="deleteMultiById">
delete from article_tag where at_id in delete from article_tag where at_id in
<foreach item="item" collection="list" separator=","> <foreach item="item" collection="list" open="(" close=")" separator=",">
(#{articleTag.id}) #{item.id}
</foreach> </foreach>
</delete> </delete>
@@ -73,4 +73,28 @@
and tag_category.t_id = article_tag.t_id and tag_category.t_id = article_tag.t_id
</select> </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> </mapper>

View File

@@ -141,6 +141,15 @@
order by articleId desc order by articleId desc
</select> </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 id="findAll" resultMap="articleViewResultMap">
select * select *
@@ -155,5 +164,22 @@
from article; from article;
</select> </select>
<select id="getPreArticle" resultMap="articleViewResultMap">
select *
from articleView
where articleId = (select max(articleId)
from articleView
where articleId &lt; #{id}
)
</select>
<select id="getNextArticle" resultMap="articleViewResultMap">
select *
from articleView
where articleId = (select min(articleId)
from articleView
where articleId &gt; #{id}
)
</select>
</mapper> </mapper>

View File

@@ -3,10 +3,11 @@ package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Article; import cn.celess.blog.entity.Article;
import cn.celess.blog.entity.Response; 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.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq; import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import com.github.pagehelper.PageInfo;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -31,7 +32,8 @@ public class ArticleControllerTest extends BaseTest {
articleReq.setTitle("test-" + UUID.randomUUID().toString()); articleReq.setTitle("test-" + UUID.randomUUID().toString());
articleReq.setMdContent("# test title"); articleReq.setMdContent("# test title");
articleReq.setCategory("随笔"); articleReq.setCategory("随笔");
articleReq.setTags("test,SpringMvc"); String[] tagList = {"tag", "category"};
articleReq.setTags(tagList);
articleReq.setOpen(true); articleReq.setOpen(true);
articleReq.setType(true); articleReq.setType(true);
articleReq.setUrl("http://xxxx.com"); articleReq.setUrl("http://xxxx.com");
@@ -80,13 +82,11 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(articleModel.getCategory()); assertNotNull(articleModel.getCategory());
assertNotNull(articleModel.getPublishDateFormat()); assertNotNull(articleModel.getPublishDateFormat());
assertNotNull(articleModel.getMdContent()); assertNotNull(articleModel.getMdContent());
assertNotNull(articleModel.getNextArticleId()); assertNotNull(articleModel.getPreArticle());
assertNotNull(articleModel.getNextArticleTitle()); assertNull(articleModel.getNextArticle());
assertNotNull(articleModel.getPreArticleId());
assertNotNull(articleModel.getPreArticleTitle());
assertNotNull(articleModel.getOpen()); assertNotNull(articleModel.getOpen());
assertNotNull(articleModel.getReadingNumber()); assertNotNull(articleModel.getReadingNumber());
assertNotNull(articleModel.getAuthorName()); assertNotNull(articleModel.getAuthor());
assertNotNull(articleModel.getUrl()); assertNotNull(articleModel.getUrl());
}); });
} catch (Exception e) { } catch (Exception e) {
@@ -96,11 +96,11 @@ public class ArticleControllerTest extends BaseTest {
@Test @Test
public void delete() { public void delete() {
long articleId = articleMapper.getLastestArticleId(); Article article = articleMapper.getLastestArticle();
try { try {
// 未登录删除文章 // 未登录删除文章
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + articleId) mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
).andDo(result -> { ).andDo(result -> {
assertEquals(HAVE_NOT_LOG_IN.getCode(), assertEquals(HAVE_NOT_LOG_IN.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code) JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
@@ -108,14 +108,14 @@ public class ArticleControllerTest extends BaseTest {
}); });
// user 权限删除文章 // user 权限删除文章
String token = userLogin(); 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)) .header("Authorization", token))
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), .andDo(result -> assertEquals(PERMISSION_ERROR.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)) JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
); );
// admin 权限删除文章 // admin 权限删除文章
token = adminLogin(); token = adminLogin();
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + articleId) mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
.header("Authorization", token)) .header("Authorization", token))
.andDo(result -> { .andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
@@ -140,8 +140,8 @@ public class ArticleControllerTest extends BaseTest {
articleReq.setOpen(!article.getOpen()); articleReq.setOpen(!article.getOpen());
String tag1 = randomStr(4); String tag1 = randomStr(4);
String tag2 = randomStr(4); String tag2 = randomStr(4);
String tag = "test," + tag1 + "," + tag2; String[] tagList = {"test", tag1, tag2};
articleReq.setTags(tag); articleReq.setTags(tagList);
articleReq.setTitle("test-" + article.getTitle()); articleReq.setTitle("test-" + article.getTitle());
try { try {
// Admin 权限 // Admin 权限
@@ -160,15 +160,11 @@ public class ArticleControllerTest extends BaseTest {
assertEquals(articleReq.getTitle(), a.getTitle()); assertEquals(articleReq.getTitle(), a.getTitle());
assertEquals(articleReq.getType(), a.getOriginal()); assertEquals(articleReq.getType(), a.getOriginal());
// Tag // Tag
List<String> asList = Arrays.asList(a.getTags()); List<Tag> asList = a.getTags();
assertTrue(asList.contains("test")); assertEquals(3, asList.size());
assertTrue(asList.contains(tag1));
assertTrue(asList.contains(tag2));
assertEquals(articleReq.getOpen(), a.getOpen()); assertEquals(articleReq.getOpen(), a.getOpen());
assertEquals(articleReq.getId(), a.getId()); assertEquals(articleReq.getId(), a.getId());
}); });
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -207,17 +203,13 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(a.getMdContent()); assertNotNull(a.getMdContent());
assertNotNull(a.getUrl()); assertNotNull(a.getUrl());
assertNotNull(a.getUpdateDateFormat()); assertNotNull(a.getUpdateDateFormat());
assertNotNull(a.getPreArticleId()); assertTrue(a.getPreArticle() != null || a.getNextArticle() != null);
assertNotNull(a.getPreArticleId());
assertNotNull(a.getNextArticleId());
assertNotNull(a.getNextArticleTitle());
assertNotNull(a.getReadingNumber()); assertNotNull(a.getReadingNumber());
// assertNotNull(a.getOpen());
assertNotNull(a.getOriginal()); assertNotNull(a.getOriginal());
assertNotNull(a.getPublishDateFormat()); assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getCategory()); assertNotNull(a.getCategory());
assertNotNull(a.getTags()); assertNotNull(a.getTags());
assertNotNull(a.getAuthorName()); assertNotNull(a.getAuthor());
}); });
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -242,14 +234,12 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(response.getResult()); assertNotNull(response.getResult());
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
JSONObject resultJson = JSONObject.fromObject(response.getResult()); JSONObject resultJson = JSONObject.fromObject(response.getResult());
PageInfo pageInfo = (PageInfo) JSONObject.toBean(resultJson, PageInfo.class); PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(resultJson, PageData.class);
assertNotEquals(0, pageInfo.getTotal()); assertNotEquals(0, pageData.getTotal());
assertNotEquals(0, pageInfo.getStartRow()); assertEquals(1, pageData.getPageNum());
assertNotEquals(0, pageInfo.getEndRow()); assertEquals(5, pageData.getPageSize());
assertEquals(1, pageInfo.getPageNum());
assertEquals(5, pageInfo.getPageSize());
// 内容完整 // 内容完整
for (Object arc : pageInfo.getList()) { for (Object arc : pageData.getList()) {
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class); ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
assertNotNull(a.getTitle()); assertNotNull(a.getTitle());
assertNotNull(a.getId()); assertNotNull(a.getId());
@@ -258,7 +248,9 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(a.getPublishDateFormat()); assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getCategory()); assertNotNull(a.getCategory());
assertNotNull(a.getTags()); assertNotNull(a.getTags());
assertNotNull(a.getAuthorName()); assertNotNull(a.getAuthor());
assertNull(a.getOpen());
assertNull(a.getMdContent());
} }
}); });
} catch (Exception e) { } catch (Exception e) {
@@ -299,14 +291,12 @@ public class ArticleControllerTest extends BaseTest {
assertEquals(SUCCESS.getCode(), adminLogin.getInt(Code)); assertEquals(SUCCESS.getCode(), adminLogin.getInt(Code));
assertNotNull(adminLogin.getString(Result)); assertNotNull(adminLogin.getString(Result));
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
PageInfo pageInfo = (PageInfo) JSONObject.toBean(adminLogin.getJSONObject(Result), PageInfo.class); PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(adminLogin.getJSONObject(Result), PageData.class);
assertNotEquals(0, pageInfo.getTotal()); assertNotEquals(0, pageData.getTotal());
assertNotEquals(0, pageInfo.getStartRow()); assertEquals(1, pageData.getPageNum());
assertNotEquals(0, pageInfo.getEndRow()); assertEquals(10, pageData.getPageSize());
assertEquals(1, pageInfo.getPageNum());
assertEquals(10, pageInfo.getPageSize());
// 内容完整 // 内容完整
for (Object arc : pageInfo.getList()) { for (Object arc : pageData.getList()) {
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class); ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
assertNotNull(a.getTitle()); assertNotNull(a.getTitle());
assertNotNull(a.getId()); assertNotNull(a.getId());
@@ -314,6 +304,9 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(a.getPublishDateFormat()); assertNotNull(a.getPublishDateFormat());
assertNotNull(a.getOpen()); assertNotNull(a.getOpen());
assertNotNull(a.getReadingNumber()); assertNotNull(a.getReadingNumber());
assertNotNull(a.getLikeCount());
assertNotNull(a.getDislikeCount());
assertNull(a.getMdContent());
} }
}); });
} catch (Exception e) { } catch (Exception e) {
@@ -338,13 +331,11 @@ public class ArticleControllerTest extends BaseTest {
.andDo(result -> { .andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString()); JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code)); assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code));
PageInfo pageInfo = (PageInfo) JSONObject.toBean(jsonObject.getJSONObject(Result), PageInfo.class); PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class);
assertNotEquals(0, pageInfo.getTotal()); assertNotEquals(0, pageData.getTotal());
assertNotEquals(0, pageInfo.getStartRow()); assertEquals(1, pageData.getPageNum());
assertNotEquals(0, pageInfo.getEndRow()); assertEquals(10, pageData.getPageSize());
assertEquals(1, pageInfo.getPageNum()); for (Object arc : pageData.getList()) {
assertEquals(10, pageInfo.getPageSize());
for (Object arc : pageInfo.getList()) {
JSONObject jsonObject1 = JSONObject.fromObject(arc); JSONObject jsonObject1 = JSONObject.fromObject(arc);
assertNotEquals(0, jsonObject1.getInt("id")); assertNotEquals(0, jsonObject1.getInt("id"));
assertNotNull(jsonObject1.getString("title")); assertNotNull(jsonObject1.getString("title"));
@@ -373,14 +364,12 @@ public class ArticleControllerTest extends BaseTest {
.andDo(result -> { .andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString()); JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code)); assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code));
PageInfo pageInfo = (PageInfo) JSONObject.toBean(jsonObject.getJSONObject(Result), PageInfo.class); PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class);
assertNotEquals(0, pageInfo.getTotal()); assertNotEquals(0, pageData.getTotal());
assertNotEquals(0, pageInfo.getStartRow()); assertEquals(1, pageData.getPageNum());
assertNotEquals(0, pageInfo.getEndRow()); assertEquals(10, pageData.getPageSize());
assertEquals(1, pageInfo.getPageNum());
assertEquals(10, pageInfo.getPageSize());
for (Object arc : pageInfo.getList()) { for (Object arc : pageData.getList()) {
JSONObject jsonObject1 = JSONObject.fromObject(arc); JSONObject jsonObject1 = JSONObject.fromObject(arc);
assertNotEquals(0, jsonObject1.getInt("id")); assertNotEquals(0, jsonObject1.getInt("id"));
assertNotNull(jsonObject1.getString("title")); assertNotNull(jsonObject1.getString("title"));

View File

@@ -162,6 +162,13 @@ public class ArticleMapperTest extends BaseTest {
assertNotEquals(0, allByCategoryId.size()); 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 @Test
public void findAll() { public void findAll() {
List<Article> allByCategoryId = articleMapper.findAll(); List<Article> allByCategoryId = articleMapper.findAll();
@@ -173,6 +180,21 @@ public class ArticleMapperTest extends BaseTest {
assertNotEquals(0, articleMapper.count()); 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() { private ArticleTag generateArticle() {
String randomText = UUID.randomUUID().toString(); String randomText = UUID.randomUUID().toString();
@@ -199,5 +221,4 @@ public class ArticleMapperTest extends BaseTest {
return articleTag; return articleTag;
} }
} }

View File

@@ -90,11 +90,27 @@ public class ArticleTagMapperTest extends BaseTest {
articleTagMapper.insert(articleTag); articleTagMapper.insert(articleTag);
List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(-1L); List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(-1L);
assertEquals(6, allByArticleId.size()); assertTrue(allByArticleId.size() >= 6);
int lines = articleTagMapper.deleteMultiById(allByArticleId); 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() { private ArticleTag generateArticle() {
String randomText = UUID.randomUUID().toString(); String randomText = UUID.randomUUID().toString();
@@ -122,5 +138,4 @@ public class ArticleTagMapperTest extends BaseTest {
return articleTag; return articleTag;
} }
} }