package me.jcala.blog.service; import lombok.extern.slf4j.Slf4j; import me.jcala.blog.domain.Archive; import me.jcala.blog.domain.BlogView; import me.jcala.blog.mapping.BlogMapper; import me.jcala.blog.service.inter.BlogSer; import me.jcala.blog.utils.TimeTools; import me.jcala.blog.utils.Tools; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import java.sql.Date; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Slf4j public class BlogSerImpl implements BlogSer { private BlogMapper blogMapper; @Autowired public BlogSerImpl(BlogMapper blogMapper) { this.blogMapper = blogMapper; } @Override public BlogView adminGetBlog(int vid){ return blogMapper.selectAdmin(vid); } @Override @Caching(evict = { @CacheEvict(value = "archives",key = "1"), @CacheEvict(value = "tagList",key = "1"), @CacheEvict(value = "archivePageNum",key = "1") }) @Transactional(isolation = Isolation.READ_COMMITTED) public void addBlog(BlogView blogView){ blogView.setDate(new Date(System.currentTimeMillis())); blogMapper.insertBlog(blogView); addViewTag(blogView.getTags(),blogView.getVid()); } @Override public List<BlogView> getBlogPage(int id){ int start=(id-1)*10; return blogMapper.selectTenBlogs(start); } @Override public int adminGetPageNum(){ int num=blogMapper.selectBlogNum(); return num%10==0?num/10:num/10+1; } @Override @Caching(evict = { @CacheEvict(value = "archives",key = "1"), @CacheEvict(value = "tagList",key = "1") }) @Transactional(isolation = Isolation.READ_COMMITTED) public void updateBlog(BlogView blogView){ blogMapper.updateBlogView(blogView); updateViewTag(blogView.getTags(),blogView.getVid()); } @Override @Caching(evict = { @CacheEvict(value = "archives",key = "1"), @CacheEvict(value = "tagList",key = "1"), @CacheEvict(value = "archivePageNum",key = "1") }) @Transactional(isolation = Isolation.READ_COMMITTED) public void deleteBlogById(int vid) { blogMapper.deleteBlogView(vid); } @Override @Cacheable(value = "tagList",key = "1") public List<String> getTagList(){ return blogMapper.selectTags(); } @Override @Cacheable(value = "archives",condition = "#page==1",key = "1") public List<Archive> getArchive(int page){ int start=(page-1)*12; return bv2Ar(blogMapper.selectArc(start)); } @Override @Cacheable(value = "archivePageNum",key = "1") public int getArchiveNum(){ int blogNum=blogMapper.selectBlogNum(); return blogNum%12==0?blogNum/12:blogNum/12+1; } @Override public BlogView getBlog(int vid){ return blogMapper.selectView(vid); } @Override public BlogView getPrevBlog(int vid){ return blogMapper.selectPreView(vid); } @Override public BlogView getNextBlog(int vid) { BlogView blogView=null; try { blogView=blogMapper.selectNextView(vid); } catch (Exception e) { log.error(e.getMessage()); } return blogView; } @Override public List<BlogView> getBlogByTag(String tagName){ List<BlogView> views=new ArrayList<>(); List<Integer> vids=blogMapper.selectVidBytag(tagName); for (int vid:vids){ BlogView view=blogMapper.selectTagView(vid); if (view!=null){ view.setVid(vid); String monthDay=TimeTools.getEdate(view.getDate()); view.setMonthDay(monthDay); views.add(view); } } return views; } private List<Archive> bv2Ar(List<BlogView> views){ List<Archive> archives=new ArrayList<>(); Map<Integer,Archive> years2Ar=new HashMap<>(); for (BlogView view:views){ Date date=view.getDate(); view.setMonthDay(TimeTools.getEdate(date)); int year=TimeTools.getYear(date); if (years2Ar.containsKey(year)){ years2Ar.get(year).getList().add(view); }else { Archive archive=new Archive(year,new ArrayList<BlogView>()); years2Ar.put(year,archive); archive.getList().add(view); archives.add(archive); } } return archives; } private void addViewTag(String tagStr,int vid){ List<String> tagList=Tools.getTagList(tagStr); for (String tag:tagList){ blogMapper.insertViewTag(tag,vid); } } private void updateViewTag(String tagStr,int vid){ blogMapper.deleteViewTag(vid); List<String> tagList=Tools.getTagList(tagStr); for (String tag:tagList){ blogMapper.insertViewTag(tag,vid); } } }