package com.xcong.farmer.cms.modules.system.service.Impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileWriter; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xcong.farmer.cms.common.exception.GlobalException; import com.xcong.farmer.cms.common.response.Result; import com.xcong.farmer.cms.common.utils.FileUtils; import com.xcong.farmer.cms.configurations.properties.CmsProperties; import com.xcong.farmer.cms.modules.system.dto.AdminSaveTemplateInfoDto; import com.xcong.farmer.cms.modules.system.dto.TemplateListDto; import com.xcong.farmer.cms.modules.system.entity.CmsTemplateEntity; import com.xcong.farmer.cms.modules.system.mapper.CmsTemplateMapper; import com.xcong.farmer.cms.modules.system.service.ICmsTemplateService; import com.xcong.farmer.cms.modules.system.util.LoginUserUtil; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; /** * @author wzy * @date 2022-07-04 **/ @Service public class CmsTemplateServiceImpl extends ServiceImpl implements ICmsTemplateService { @Autowired private CmsProperties properties; private List fileSuffix = Arrays.asList(".zip", ".html"); @Override public void updateTemplate(MultipartFile upload) { String templatePath = properties.getTemplatePath(); String staticPath = properties.getStaticPath(); Long companyId = LoginUserUtil.getCompanyId(); String filename = upload.getOriginalFilename(); String suffix = filename.substring(filename.lastIndexOf(".")); if (!fileSuffix.contains(suffix)) { throw new GlobalException("请上传正确格式文件"); } try { String path = FileUtils.path(templatePath, filename); File file = new File(path); upload.transferTo(file); if (".zip".equals(suffix)) { ZipUtil.unzip(file, new File(templatePath)); FileUtil.del(file); File template = new File(templatePath); File[] files = template.listFiles(); if (files == null) { return; } for (File templateFile : files) { if (!templateFile.isFile()) { FileUtil.move(templateFile, new File(staticPath), true); continue; } if (!"html".equals(FileUtil.extName(templateFile))) { continue; } String name = templateFile.getName(); if (!name.endsWith(".list.html") && !name.endsWith(".article.html") && !name.endsWith("index.html")) { continue; } insertTemplate(templateFile, companyId); } } if (".html".equals(suffix)) { FileUtil.touch(file); insertTemplate(file, companyId); } } catch (IOException e) { e.printStackTrace(); throw new GlobalException("模板上传失败"); } } private void insertTemplate(File file, Long companyId) throws IOException { Document parse = Jsoup.parse(file, null); String attr = parse.head().attr("name"); staticPathParser(parse, "img", "src"); staticPathParser(parse, "link", "href"); staticPathParser(parse, "script", "src"); FileOutputStream outputStream = new FileOutputStream(file); outputStream.write(parse.html().getBytes()); outputStream.close(); CmsTemplateEntity cmsTemplate = new CmsTemplateEntity(); cmsTemplate.setCompanyId(companyId); if (file.getName().endsWith(".list.html")) { cmsTemplate.setType(2); } else if (file.getName().endsWith(".article.html")) { cmsTemplate.setType(3); } else { cmsTemplate.setType(1); } cmsTemplate.setName(StrUtil.isNotBlank(attr) ? attr : file.getName()); cmsTemplate.setPath(file.getName()); this.baseMapper.insert(cmsTemplate); } private void staticPathParser(Document document, String tagName, String attrKey) { Elements elements = document.getElementsByTag(tagName); if (elements.isEmpty()) { return; } for (Element element : elements) { String attr = element.attr(attrKey); if (StrUtil.isNotBlank(attr) && !attr.contains("http://") && !attr.contains("https://")) { element.attr(attrKey, cmsProperties.getStaticUrl() + attr); } } } @Override public IPage findInPage(TemplateListDto templateListDto) { Long companyId = LoginUserUtil.getCompanyId(); IPage page = new Page<>(templateListDto.getPageNum(), templateListDto.getPageSize()); CmsTemplateEntity template = new CmsTemplateEntity(); template.setCompanyId(companyId); return this.baseMapper.selectInPage(page, template); } @Override public void delete(Long id) { Long companyId = LoginUserUtil.getCompanyId(); this.baseMapper.delete(id, companyId); } @Override public Result dropdownList() { Long companyId = LoginUserUtil.getCompanyId(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("company_id",companyId); List cmsTemplateEntities = this.baseMapper.selectList(objectQueryWrapper); return Result.ok(cmsTemplateEntities); } @Autowired private CmsProperties cmsProperties; @Override public Result viewTemplateInfo(Long id) { Result result = new Result(); CmsTemplateEntity cmsTemplateEntity = this.baseMapper.selectById(id); String templatePath = cmsProperties.getTemplatePath(); String pathName = FileUtils.path(templatePath, cmsTemplateEntity.getPath()); byte[] bytes = new byte[0]; try { bytes = Files.readAllBytes(Paths.get(pathName)); } catch (IOException e) { e.printStackTrace(); return result.fail("未找到模板"); } String content = new String(bytes, StandardCharsets.UTF_8); result.setData(content); return result; } @Override @Transactional public Result saveTemplateInfo(AdminSaveTemplateInfoDto adminSaveTemplateInfoDto) { Long companyId = LoginUserUtil.getCompanyId(); Long id = adminSaveTemplateInfoDto.getId(); CmsTemplateEntity cmsTemplateEntity = this.baseMapper.selectByIdAndCompanyId(id,companyId); String name = cmsTemplateEntity.getName(); Integer type = cmsTemplateEntity.getType(); String templatePath = cmsProperties.getTemplatePath(); String path = cmsTemplateEntity.getPath(); this.baseMapper.delete(id,companyId); String pathNew = FileUtils.path(templatePath, path); File file = new File(pathNew); FileUtil.touch(file); //文件写入,直接覆盖 FileWriter writer = new FileWriter(file); writer.write(adminSaveTemplateInfoDto.getTemplateInfo(), false); CmsTemplateEntity cmsTemplate = new CmsTemplateEntity(); cmsTemplate.setCompanyId(companyId); cmsTemplate.setType(type); cmsTemplate.setName(name); cmsTemplate.setPath(path); this.baseMapper.insert(cmsTemplate); return Result.ok("保存成功"); } }