package com.qhw.service.impl;
import com.qhw.dao.UserRepository;
import com.qhw.pojo.User;
import com.qhw.util.ThymeleafUtils;
import com.qhw.dao.ContextRepository;
import com.qhw.pojo.Context;
import com.qhw.service.ContextService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thymeleaf.TemplateEngine;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* Created by asus on 2020/3/8 15:34
*/
@Service
public class ContextServiceImpl implements ContextService {
@Value("${CONTEXT_OUT_DIR}")
private String CONTEXT_OUT_DIR;
@Autowired
private ContextRepository contextRepository;
@Autowired
private UserRepository userRepository;
@Override
public List<Context> findAll() {
return contextRepository.findAll();
}
@Override
public List<Context> findContextByModel(Integer modelId) {
return contextRepository.findAllByModelId(modelId);
}
@Override
public Page<Context> findAllByModelIdAndPage(Context context, Integer pageNum, Integer pageSize) {
// Pageable pageable = new PageRequest(pageNum, pageSize, new Sort(Sort.Direction.ASC, "id"));
String sortName = context.getViewCount() == null? "createTime" : "viewCount";
Pageable pageable = PageRequest.of(pageNum, pageSize, new Sort(Sort.Direction.DESC, sortName));
Specification<Context> spec = new Specification<Context>() {
@Override
public Predicate toPredicate(Root<Context> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> list = new ArrayList<>();
if (context != null && context.getModelId() != null) {
// 根据modelId条件查询
list.add(criteriaBuilder.equal(root.get("modelId").as(Integer.class), context.getModelId()));
}
if (context != null && context.getTitle() != null) {
// 根据title模糊查询
list.add(criteriaBuilder.like(root.get("title").as(String.class), "%" + context.getTitle() + "%"));
}
return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
}
};
return contextRepository.findAll(spec, pageable);
}
@Override
public Context getOne(Integer id) {
return contextRepository.getOne(id);
}
@Override
public void updateViewCount(Context context) {
if (context.getId() == null) {
throw new RuntimeException("获取当前文章的id失败");
}
Context one = getOne(context.getId());
one.setViewCount(one.getViewCount() + 1);
save(one);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createHtmlAndSave(Context context) throws IOException {
TemplateEngine templateEngine = ThymeleafUtils.getTemplateEngine();
// 创建字符输出流并且自定义输出文件的位置和文件名
String newContentHtml = UUID.randomUUID().toString().replaceAll("-", "") + ".html";
// 获取文件存储的路径
String newHtmlPath = CONTEXT_OUT_DIR + context.getModelId() + "\\" + newContentHtml;
// 判断文件是否存在
File file = new File(newHtmlPath);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
file.createNewFile();
FileWriter fileWriter = new FileWriter(newHtmlPath);
// 创建Context对象(存放Model)
org.thymeleaf.context.Context thContext = new org.thymeleaf.context.Context();
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
// 放入数据
thContext.setVariable("content", context.getContent());
thContext.setVariable("title", context.getTitle());
// 获取当前登录的用户名
thContext.setVariable("author", "齐宏武");
thContext.setVariable("createDate",formatter.format(currentTime));
// 创建静态文件,"text"是模板html名字
templateEngine.process("contextTem", thContext, fileWriter);
// 释放文件流资源
fileWriter.close();
System.err.println("创建" + newHtmlPath + "成功");
context.setCreateTime(currentTime);
context.setViewCount(0);
// 如果创建静态页面成功
context.setContextPath(newHtmlPath);
// 获取当前登录的用户id,并设置 ***************************************
String username = SecurityContextHolder.getContext().getAuthentication().getName();
User userByUsername = userRepository.findUserByUsername(username);
context.setUserId(userByUsername.getId());
contextRepository.save(context);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateHtmlAndSave(Context context) {
FileWriter fileWriter = null;
Context repositoryOne = contextRepository.getOne(context.getId());
// 第一步,先删除原来的静态页面
try {
String contextPath = repositoryOne.getContextPath();
File html = new File(contextPath);
if (html.exists()) {
html.delete(); // 如果静态页面存在,删除
System.err.println("删除" + contextPath + "成功");
}
TemplateEngine templateEngine = ThymeleafUtils.getTemplateEngine();
// 创建字符输出流并且自定义输出文件的位置和文件名
String newContentHtml = UUID.randomUUID().toString().replaceAll("-", "") + ".html";
// 获取文件存储的路径
String newHtmlPath = CONTEXT_OUT_DIR + context.getModelId() + "\\" + newContentHtml;
// 判断文件是否存在
File file = new File(newHtmlPath);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
file.createNewFile();
fileWriter = new FileWriter(newHtmlPath);
// 根据id查询要修改哪一个context
repositoryOne.setUpdateTime(new Date()); // 设置修改时间
repositoryOne.setContextPath(newHtmlPath);
repositoryOne.setContent(context.getContent());
repositoryOne.setFlag(context.getFlag());
repositoryOne.setModelId(context.getModelId());
repositoryOne.setRemark(context.getRemark());
repositoryOne.setTitle(context.getTitle());
// 获取当前登录用户的id **************************************
// repositoryOne.setUserId(2);
// 创建Context对象(存放Model)
org.thymeleaf.context.Context thContext = new org.thymeleaf.context.Context();
// 放入数据
thContext.setVariable("content", repositoryOne.getContent());
thContext.setVariable("title", repositoryOne.getTitle());
// 创建静态文件,"text"是�
博士僧小星
- 粉丝: 2387
- 资源: 5995
最新资源
- 程序名称:麦弗逊悬架硬点布置 开发平台:基于matlab平台 计算内容:根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标 适用对象:学习群体、初
- 得物订单截图模拟器.apk
- 倒车雷达51单片机超声波测距(含仿真)
- c#生成1G图片软件含源码
- 基于stm32人体健康监测系统,包含pcb (心率,血氧,体温,语音播报,报警) 本设计采用STM32F103C8T6作为主控 使用MAX30102采集心率和血氧值 使用MLX90614测量体温 OL
- 数据结构:单链表的创建与遍历及优化
- 考虑需求侧响应的微电网多目标经济运行 建立了含风光储荷的微电网模型,以发电侧成本(包括风光储以及电网的购电成本)和负荷侧成本最小为目标,考虑功率平衡以及储能SOC约束,建立了多目标优化模型,通过分时
- Postman:高级功能:数据文件与参数化测试详解
- 三菱PLC项目案例学习之自动寻槽铣槽机 器件:三菱FX3UPLC,威纶通触摸屏,三菱伺服,基恩士光纤传感器,三菱变频器等 控制方式:PLC接收恩士光纤传感器信号控制伺服驱动器寻槽,寻槽后,变频器控
- usbgps2.apk
- 2024~2025跨年
- LP3_PLC程序培训_01.zip
- Django全栈开发高级实战项目 知识领域:编程 技术关键词:Django, 全栈开发 内容关键词:实战项目 用途:学习
- PMSG永磁同步发电机并网仿真模型 (1)主要包括发电机、整流器、逆变器(双pwm控制)、电网、控制、显示等部分; (2)风机最大功率跟踪mppt采用最佳叶尖速比法; (3)机侧控制(发电控制):采用
- 音乐推荐系统 系统算法:基于用户的协同过滤推荐算法 编程语言:python 数据库:sqlite 框架:MVC web应用框架:Django 解压就可以运行(自己需要有调试项目环境的能力),需要软件p
- (172577216)2020数模国赛A题国一论文1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈