package cn.lili.modules.page.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dos.ArticleCategory; import cn.lili.modules.page.entity.enums.ArticleCategoryEnum; import cn.lili.modules.page.entity.enums.ArticleEnum; import cn.lili.modules.page.entity.vos.ArticleCategoryVO; import cn.lili.modules.page.mapper.ArticleCategoryMapper; import cn.lili.modules.page.service.ArticleCategoryService; import cn.lili.modules.page.service.ArticleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * 文章分类业务层实现 * * @author pikachu * @since 2020-05-5 15:10:16 */ @Service public class ArticleCategoryServiceImpl extends ServiceImpl implements ArticleCategoryService { /** * 缓存 */ @Autowired private Cache cache; /** * 文章 */ @Autowired private ArticleService articleService; /** * 顶级父分类ID */ private String parentId = "0"; /** * 最大分类等级 */ private int maxLevel = 2; @Override @Transactional(rollbackFor = Exception.class) public ArticleCategory saveArticleCategory(ArticleCategory articleCategory) { //非顶级分类 if (articleCategory.getParentId() != null && !parentId.equals(articleCategory.getParentId())) { ArticleCategory parent = this.getById(articleCategory.getParentId()); if (parent == null) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_PARENT_NOT_EXIST); } if (articleCategory.getLevel() >= maxLevel) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_BEYOND_TWO); } } articleCategory.setType(ArticleCategoryEnum.OTHER.name()); this.save(articleCategory); //清除文章分类缓存 this.clearCache(); return articleCategory; } @Override public ArticleCategory updateArticleCategory(ArticleCategory articleCategory) { //非顶级分类校验是否存在 if (!parentId.equals(articleCategory.getParentId())) { ArticleCategory parent = this.getById(articleCategory.getParentId()); if (parent == null) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_PARENT_NOT_EXIST); } //替换catPath 根据path规则来匹配级别 if (articleCategory.getLevel() >= maxLevel) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_BEYOND_TWO); } } //验证分类名称是否重复 ArticleCategory category = this.getOne( new LambdaQueryWrapper().eq(ArticleCategory::getArticleCategoryName, articleCategory.getArticleCategoryName())); if (category != null && !category.getId().equals(articleCategory.getId())) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_NAME_EXIST); } if (this.updateById(articleCategory)) { //清除文章分类 this.clearCache(); return category; } return null; } @Override public boolean deleteById(String id) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(ArticleCategory::getParentId, id); //查看文章分类下是否有分类 if (this.count(lambdaQueryWrapper) > 0) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_DELETE_ERROR); } //查看文章分类下是否有文章 LambdaQueryWrapper
articleLambdaQueryWrapper = new LambdaQueryWrapper<>(); articleLambdaQueryWrapper.eq(Article::getCategoryId, id); if (articleService.count(articleLambdaQueryWrapper) > 0) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_HAS_ARTICLE); } //判断是否为默认的分类 if (!this.getById(id).getType().equals(ArticleEnum.OTHER.name())) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_NO_DELETION); } //清除文章分类缓存 this.clearCache(); //删除文章分类 return this.removeById(id); } @Override public List allChildren() { //从缓存取所有的分类 Object all = cache.get(CachePrefix.ARTICLE_CATEGORY.getPrefix()); List articleCategories; if (all == null) { //调用初始化分类缓存方法 articleCategories = initCategory(); } else { articleCategories = (List) all; } return articleCategories; } /** * 初始化所有文章分类 * * @return 文章分类集合 */ private List initCategory() { List articleCategories = this.list(); List tree = new ArrayList<>(); articleCategories.forEach(item -> { if (item.getLevel() == 0) { ArticleCategoryVO articleCategoryVO = new ArticleCategoryVO(item); initChild(articleCategoryVO, articleCategories); tree.add(articleCategoryVO); } }); //对一级菜单排序 tree.sort(new Comparator() { @Override public int compare(ArticleCategoryVO o1, ArticleCategoryVO o2) { return o1.getSort().compareTo(o2.getSort()); } }); cache.put(CachePrefix.ARTICLE_CATEGORY.getPrefix(), tree); return tree; } /** * 递归初始化子树 * * @param tree 树结构 * @param articleCategories 数据库对象集合 */ private void initChild(ArticleCategoryVO tree, List articleCategories) { if (articleCategories == null) { return; } articleCategories.stream() .filter(item -> (item.getParentId().equals(tree.getId()))) .forEach(child -> { ArticleCategoryVO childTree = new ArticleCategoryVO(child); initChild(childTree, articleCategories); tree.getChildren().add(childTree); }); } /** * 清除缓存中的文章分类 */ private void clearCache() { cache.remove(CachePrefix.ARTICLE_CATEGORY.getPrefix()); } @Autowired public void setArticleService(ArticleService articleService) { this.articleService = articleService; } }