package me.wuwenbin.noteblog.v4.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import me.wuwenbin.modules.utils.http.WebUtils;
import me.wuwenbin.modules.utils.lang.LangUtils;
import me.wuwenbin.modules.utils.util.function.TemplateSupplier;
import me.wuwenbin.noteblog.v4.common.FileType;
import me.wuwenbin.noteblog.v4.common.TagType;
import me.wuwenbin.noteblog.v4.model.Article;
import me.wuwenbin.noteblog.v4.model.Tag;
import me.wuwenbin.noteblog.v4.model.TagRefer;
import me.wuwenbin.noteblog.v4.model.Upload;
import me.wuwenbin.noteblog.v4.repository.ArticleRepository;
import me.wuwenbin.noteblog.v4.repository.TagReferRepository;
import me.wuwenbin.noteblog.v4.repository.TagRepository;
import me.wuwenbin.noteblog.v4.repository.UploadRepository;
import me.wuwenbin.noteblog.v4.service.ArticleService;
import me.wuwenbin.noteblog.v4.service.support.NkUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import static java.time.LocalDateTime.now;
/**
* created by Wuwenbin on 2018/1/16 at 16:17
*/
@Slf4j
@Service
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public class ArticleServiceImpl implements ArticleService {
@Autowired
private DataSourceTransactionManager tm;
@Autowired
private Environment environment;
@Autowired
private ArticleRepository articleRepository;
@Autowired
private TagRepository tagRepository;
@Autowired
private TagReferRepository tagReferRepository;
@Autowired
private UploadRepository uploadRepository;
@Override
public boolean postArticle(Article article, String tagNames) {
if (LangUtils.string.isEmpty(tagNames)) {
throw new RuntimeException("tagName不能为空!");
}
String[] tagNameArray = tagNames.split(",");
DefaultTransactionDefinition def = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = tm.getTransaction(def);
try {
//博客没啥并发吧,那就按秒来吧
long articleId = System.currentTimeMillis() / 1000;
article.setId(articleId);
getSumByFilterContent(article);
int savePostArticle = articleRepository.savePk(article);
if (savePostArticle == 0) {
throw new RuntimeException("博文未发布成功...");
}
int cnt = 0;
for (String name : Arrays.asList(tagNameArray)) {
long tagId;
if (tagRepository.countByName(name) == 0) {
tagId = tagRepository.save(Tag.builder().name(name).build()).getId();
} else {
tagId = tagRepository.findIdByName(name);
}
tagReferRepository.save(TagRefer.builder().referId(articleId).tagId(tagId).show(cnt < 4).type(TagType.article.name()).build());
cnt++;
}
tm.commit(status);
return true;
} catch (Exception e) {
tm.rollback(status);
log.error("发布博文出错,回滚数据...", e);
throw new RuntimeException(e);
}
}
@Override
public boolean updateArticle(Article article, String tagNames) {
String[] tagNameArray = tagNames.split(",");
DefaultTransactionDefinition def = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = tm.getTransaction(def);
try {
article.setModify(now());
getSumByFilterContent(article);
if (articleRepository.updateById(article) == 1) {
tagReferRepository.deleteByReferId(article.getId());
int cnt = 0;
for (String name : Arrays.asList(tagNameArray)) {
long tagId;
if (tagRepository.countByName(name) == 0) {
tagId = tagRepository.save(Tag.builder().name(name).build()).getId();
} else {
tagId = tagRepository.findIdByName(name);
}
tagReferRepository.save(TagRefer.builder().referId(article.getId()).tagId(tagId).show(cnt < 4).type(TagType.article.name()).build());
cnt++;
}
tm.commit(status);
return true;
} else return false;
} catch (Exception e) {
tm.rollback(status);
log.error("发布博文出错,回滚数据...", e);
throw new RuntimeException(e);
}
}
@Override
public Map<String, Object> upload(MultipartFile file) {
log.info("上传 [{}] 类型文件", file.getContentType());
String path = file.getContentType().contains("image/") ? FileType.IMAGE : FileType.FILE;
String fileName = file.getOriginalFilename();
//扩展名,包括点符号
String ext = fileName.substring(fileName.lastIndexOf("."));
fileName = LangUtils.random.uuidCool().concat(ext);
return upload(path, fileName, file::getBytes, file.getContentType());
}
@Override
public Map<String, Object> upload(String type, String base64Data) {
log.info("上传 [{}] 类型文件", type);
String path = type.contains("image/") ? FileType.IMAGE : FileType.FILE;
String ext = type.split("/")[1].replace(";", "");
String fileName = LangUtils.random.uuidCool().concat(".").concat(ext);
return upload(path, fileName, () -> Base64Utils.decodeFromString(base64Data), type);
}
@Override
public boolean updateTopById(long articleId, boolean top) throws Exception {
if (top) {
int maxTop = articleRepository.findMaxTop();
return articleRepository.updateTopById(maxTop + 1, articleId) == 1;
} else {
int currentTop = articleRepository.findTopById(articleId);
int isModifyTops = articleRepository.updateTopsByTop(currentTop);
return articleRepository.updateTopById(0, articleId) == 1;
}
}
private Map<String, Object> upload(String path, String fileName, TemplateSupplier<byte[]> fileBytes, String fileType) {
try {
File targetFile = new File(path);
boolean m = true;
if (!targetFile.exists()) {
m = targetFile.mkdirs();
}
if (m) {
String prefix = environment.getProperty("spring.resources.static-locations");
String filePath = prefix + path + "/" + fileName;
filePath = FileUtil.getAbsolutePath(filePath);
FileOutputStream out = new FileOutputStream(filePath);
out.write(fileBytes.get());
out.flush();
out.close();
String virtualPath = "/upload" + path + "/" + fileName;
uploadRepository.save(Upload.builder().diskPath(filePath).virtualPath(virtualPath).type(fileType).upload(now()).build());
return NkUpload.ok(virtualPath);
} else {
return NkUpload.err("文件创建失败!");
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
环境要求 + OS:支持Mac/Linux/Windows及一切支持Java运行环境的操作系统 + Java版本:JDK8及以上 + 数据库:MySQL数据库(5.7及以上) 项目技术 + `SpringBoot 2(项目骨架,基于此框架开发的)` + `Spring Data JPA(项目中使用的ORM框架)` + `Mybatis(项目中已集成,包含分页方法。方便不熟悉JPA的同学使用) ` + `Hutool 4.1.1(超级强大的工具类)` + `Maven 3(项目管理工具和编译工具)` + `Lombok(精简代码量)` + `Layui 2.2.3(前端UI/JS框架,美观大气UI)` + `LayuiXTree (展示树结构模型,对源码做了些许修改以适应本应用)` + `formSelects - 4.x (基于layui的select的下拉多选方案插件)` + `treetable-lay (用于菜单权限模块的操作)` + `Vue.js(前端js框架,MVVM模式,负责DOM/数据处理以及组件化html)` + `vipspa(前端js路由,单页面体验较
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot的笔记博客系统,优秀毕业设计系统! (675个子文件)
layui.css 58KB
animate.min.css 54KB
font-awesome.css 37KB
font-awesome.min.css 30KB
editor.css 27KB
editor.css 27KB
editor.css 27KB
editor.css 27KB
upload.css 22KB
editor.css 21KB
editor.min.css 20KB
editor.min.css 20KB
editor.min.css 20KB
editor.min.css 20KB
common.css 18KB
editor.min.css 17KB
wangEditor.css 16KB
upload.min.css 15KB
wangEditor.min.css 14KB
layer.css 14KB
style.css 13KB
layui.mobile.css 10KB
JDialog.css 8KB
scrawl.css 7KB
laydate.css 7KB
admin.css 2KB
login.css 2KB
code.css 1KB
prettify.css 986B
jquery.tagsinput.min.css 770B
filemanager.min.css 0B
fontawesome-webfont.eot 162KB
iconfont.eot 38KB
loader1.gif 82KB
static.gif 35KB
35.gif 13KB
42.gif 13KB
59.gif 10KB
40.gif 10KB
22.gif 10KB
18.gif 8KB
19.gif 8KB
24.gif 8KB
11.gif 8KB
13.gif 7KB
jdialog_confirm_icon.gif 7KB
32.gif 7KB
16.gif 7KB
39.gif 6KB
64.gif 6KB
49.gif 6KB
63.gif 6KB
50.gif 6KB
29.gif 6KB
loading-0.gif 6KB
4.gif 6KB
1.gif 5KB
42.gif 5KB
71.gif 5KB
97.gif 5KB
65.gif 5KB
21.gif 5KB
31.gif 5KB
46.gif 5KB
20.gif 5KB
57.gif 5KB
29.gif 5KB
45.gif 5KB
8.gif 5KB
70.gif 4KB
5.gif 4KB
17.gif 4KB
27.gif 4KB
43.gif 4KB
33.gif 4KB
9.gif 4KB
68.gif 4KB
44.gif 4KB
11.gif 4KB
8.gif 4KB
3.gif 4KB
26.gif 4KB
14.gif 4KB
7.gif 4KB
23.gif 4KB
icons-all.gif 4KB
icons-all.gif 4KB
51.gif 4KB
10.gif 4KB
gb_tips_ie6.gif 4KB
34.gif 4KB
47.gif 4KB
72.gif 4KB
41.gif 4KB
38.gif 4KB
65.gif 3KB
6.gif 3KB
32.gif 3KB
94.gif 3KB
84.gif 3KB
共 675 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
- hejubin2023-07-01资源很好用,有较大的参考价值,资源不错,支持一下。
振华OPPO
- 粉丝: 27w+
- 资源: 532
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功