diff --git a/electrmangnetic-backup/pom.xml b/electrmangnetic-backup/pom.xml new file mode 100644 index 0000000..18290fb --- /dev/null +++ b/electrmangnetic-backup/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.electromagnetic.data + electromagnetic-data-new + 1.0-SNAPSHOT + + + electrmangnetic-backup + + + 8 + 8 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + cn.hutool + hutool-all + 5.8.22 + + + com.electromagnetic.data + electromagnetic-common + 1.0-SNAPSHOT + compile + + + + + electrmangnetic-backup + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.12 + + + + com.electromagnetic.industry.software.backup.MainApp + + + repackage + + + + + + + + + \ No newline at end of file diff --git a/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/MainApp.java b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/MainApp.java new file mode 100644 index 0000000..dbd6c9c --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/MainApp.java @@ -0,0 +1,11 @@ +package com.electromagnetic.industry.software.backup; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MainApp { + public static void main(String[] args) { + SpringApplication.run(MainApp.class, args); + } +} diff --git a/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/controller/FileController.java b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/controller/FileController.java new file mode 100644 index 0000000..727999b --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/controller/FileController.java @@ -0,0 +1,53 @@ +package com.electromagnetic.industry.software.backup.controller; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONUtil; +import com.electromagnetic.industry.software.backup.pojo.BackupPro; +import com.electromagnetic.industry.software.common.pojo.BackupFileResLog; +import com.electromagnetic.industry.software.backup.service.FileService; +import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; +import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.Date; + +@RestController +@RequestMapping("/data/file/backup") +@Slf4j +public class FileController { + + @Resource + private FileService fileService; + @Resource + private BackupPro backupPro; + + @RequestMapping("/upload") + public ElectromagneticResult upload(@RequestParam("file") MultipartFile file, @RequestParam("path") String path) { + BackupFileResLog backupFileResLog = BackupFileResLog.builder().backupStartTime(new Date()).fileName(file.getOriginalFilename()).backupStatus(true).build(); + try { + fileService.upload(file, path); + } catch (Exception e) { + String details = ExceptionUtil.stacktraceToString(e); + backupFileResLog.setBackupStatus(false); + backupFileResLog.setFailInfoDetail(details); + log.error("备份文件失败,原因--->{}", e.getMessage(), e); + } + JSONConfig jsonConfig = JSONConfig.create(); + jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); + backupFileResLog.setBackupEndTime(new Date()); + StringBuffer info = new StringBuffer() + .append("\n") + .append("#") + .append("\n") + .append(JSONUtil.toJsonStr(backupFileResLog, jsonConfig)); + FileUtil.appendUtf8String(info.toString(), backupPro.getLogPath()); + return ElectromagneticResultUtil.success(JSONUtil.toJsonStr(backupFileResLog, jsonConfig)); + } +} diff --git a/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/pojo/BackupPro.java b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/pojo/BackupPro.java new file mode 100644 index 0000000..c690ea4 --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/pojo/BackupPro.java @@ -0,0 +1,16 @@ +package com.electromagnetic.industry.software.backup.pojo; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "ele.backup") +public class BackupPro { + + private String saveFolder; + + private String logPath; + +} diff --git a/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/service/FileService.java b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/service/FileService.java new file mode 100644 index 0000000..8234da0 --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/service/FileService.java @@ -0,0 +1,11 @@ +package com.electromagnetic.industry.software.backup.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface FileService { + + void upload(MultipartFile file, String path) throws IOException; + +} diff --git a/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/serviceimp/FileServiceImpl.java b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/serviceimp/FileServiceImpl.java new file mode 100644 index 0000000..c62d818 --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/serviceimp/FileServiceImpl.java @@ -0,0 +1,28 @@ +package com.electromagnetic.industry.software.backup.serviceimp; + +import cn.hutool.core.io.FileUtil; +import com.electromagnetic.industry.software.backup.pojo.BackupPro; +import com.electromagnetic.industry.software.backup.service.FileService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; + +@Service +public class FileServiceImpl implements FileService { + + @Resource + private BackupPro backupPro; + + @Override + public void upload(MultipartFile file, String path) throws IOException { + String saveFolder = backupPro.getSaveFolder(); + String fileName = file.getOriginalFilename(); + String destPath = saveFolder + File.separator + path + File.separator + fileName; + if (!FileUtil.exist(destPath)) { + FileUtil.writeFromStream(file.getInputStream(), destPath); + } + } +} diff --git a/electrmangnetic-backup/src/main/resources/application.yml b/electrmangnetic-backup/src/main/resources/application.yml new file mode 100644 index 0000000..1999a62 --- /dev/null +++ b/electrmangnetic-backup/src/main/resources/application.yml @@ -0,0 +1,11 @@ + +ele: + backup: + saveFolder: "E:/szsd/ele/data/backup/" + logPath: "E:/szsd/ele/data/backup.log" + +spring: + servlet: + multipart: + max-file-size: 500MB + max-request-size: 500MB \ No newline at end of file diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EleFileBackupLogMapper.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EleFileBackupLogMapper.java new file mode 100644 index 0000000..e9f0607 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EleFileBackupLogMapper.java @@ -0,0 +1,9 @@ +package com.electromagnetic.industry.software.manage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.electromagnetic.industry.software.manage.pojo.models.EleFileBackupLog; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface EleFileBackupLogMapper extends BaseMapper { +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EleFileBackupLog.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EleFileBackupLog.java new file mode 100644 index 0000000..21faa29 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EleFileBackupLog.java @@ -0,0 +1,35 @@ +package com.electromagnetic.industry.software.manage.pojo.models; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@TableName("ele_file_backup_log") +@Data +@NoArgsConstructor +public class EleFileBackupLog { + + public EleFileBackupLog(Date reqStartTime, Date reqEndTime, long fileTime, String id) { + this.reqStartTime = reqStartTime; + this.reqEndTime = reqEndTime; + this.fileTime = fileTime; + this.id = id; + } + + private String id; + private Date reqStartTime; + private Date backupStartTime; + private Date backupEndTime; + private Date reqEndTime; + private Date createTime; + + private String fileName; + + private Boolean backupStatus; + + private String failInfoDetail; + + private long fileTime; +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/BackupTask.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/BackupTask.java new file mode 100644 index 0000000..bd59433 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/BackupTask.java @@ -0,0 +1,93 @@ +package com.electromagnetic.industry.software.manage.tasks; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.text.StrFormatter; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.electromagnetic.industry.software.common.pojo.BackupFileResLog; +import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; +import com.electromagnetic.industry.software.manage.mapper.EleFileBackupLogMapper; +import com.electromagnetic.industry.software.manage.pojo.models.EleFileBackupLog; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.io.File; +import java.io.FileFilter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class BackupTask extends ServiceImpl { + + private String host; + private int port; + + private String prjDir; + + @Resource + private Environment environment; + + @PostConstruct + public void init() { + String osName = System.getProperty("os.name").toLowerCase(); + String tmp = osName.startsWith("win") ? environment.getProperty("data.windows.path") : environment.getProperty("data.linux.path"); + prjDir = FileUtil.getParent(tmp, 1); + } + +// @Scheduled(cron = "0 0 1 * * ?") + public void backup() { + long lastFileTime = getLastFileTime(); + List files = filter(lastFileTime, prjDir); + for (File file : files) { + String fileCode = getFileCode(file); + Date reqStartTime = new Date(); + BackupFileResLog resLog = backup(file.getAbsolutePath()); + Date reqEndTime = new Date(); + EleFileBackupLog resDb = new EleFileBackupLog(reqStartTime, reqEndTime, file.lastModified(), fileCode); + BeanUtil.copyProperties(resLog, resDb); + this.saveOrUpdate(resDb); + } + } + + private static List filter(long time, String dir) { + FileFilter filter = file -> file.lastModified() > time; + return FileUtil.loopFiles(dir, filter); + } + + private String getFileCode(File file) { + String fileName = file.getName(); + int index = fileName.lastIndexOf("."); + return fileName.substring(index + 1); + } + + private long getLastFileTime() { + List eleFileBackupLogs = this.baseMapper.selectList(Wrappers.lambdaQuery(EleFileBackupLog.class) + .select(EleFileBackupLog::getFileTime) + .orderByDesc(EleFileBackupLog::getFileTime) + .last("limit 1")); + if (eleFileBackupLogs.isEmpty()) { + return 0L; + } + return eleFileBackupLogs.get(0).getFileTime(); + } + + private BackupFileResLog backup(String filePath) { + String prjPath = ""; + Map map = new HashMap<>(); + map.put("file", new File(filePath)); + map.put("path", prjPath); + String url = StrFormatter.format("http://{}:{}/data/file/backup/upload", host, port); + String res = HttpUtil.post(url, map); + ElectromagneticResult resObj = JSONUtil.toBean(res, ElectromagneticResult.class); + String data = JSONUtil.toJsonStr(resObj.getData()); + return JSONUtil.toBean(data, BackupFileResLog.class); + } +} diff --git a/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/pojo/BackupFileResLog.java b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/pojo/BackupFileResLog.java new file mode 100644 index 0000000..146d91e --- /dev/null +++ b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/pojo/BackupFileResLog.java @@ -0,0 +1,16 @@ +package com.electromagnetic.industry.software.common.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +@Data +@Builder +public class BackupFileResLog { + private Date backupStartTime; + private String fileName; + private Boolean backupStatus; + private Date backupEndTime; + private String failInfoDetail; +} diff --git a/pom.xml b/pom.xml index d003aa6..17b4071 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ electrmangnetic electromagnetic-common + electrmangnetic-backup