diff --git a/electrmangnetic-backup/pom.xml b/electrmangnetic-backup/pom.xml new file mode 100644 index 0000000..d848fd8 --- /dev/null +++ b/electrmangnetic-backup/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.electromagnetic.data + electromagnetic-data-new + 1.0 + + + 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 + compile + + + + + electromagnetic-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..b4c5814 --- /dev/null +++ b/electrmangnetic-backup/src/main/java/com/electromagnetic/industry/software/backup/pojo/BackupPro.java @@ -0,0 +1,25 @@ +package com.electromagnetic.industry.software.backup.pojo; + +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Setter +@Component +@ConfigurationProperties(prefix = "ele.backup") +public class BackupPro { + + private String saveFolder; + + private String logPath; + + private String winPrefix; + + public String getSaveFolder() { + return System.getProperty("os.name").toLowerCase().startsWith("win") ? winPrefix + saveFolder : saveFolder; + } + + public String getLogPath() { + return System.getProperty("os.name").toLowerCase().startsWith("win") ? winPrefix + logPath : 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..cfe6996 --- /dev/null +++ b/electrmangnetic-backup/src/main/resources/application.yml @@ -0,0 +1,12 @@ + +ele: + backup: + saveFolder: "/szsd/ele/data/backup/" + logPath: "/szsd/ele/data/backup.log" + winPrefix: "D:/tmp" + +spring: + servlet: + multipart: + max-file-size: 500MB + max-request-size: 500MB \ No newline at end of file diff --git a/electrmangnetic/pom.xml b/electrmangnetic/pom.xml index 424fcca..8652bd5 100644 --- a/electrmangnetic/pom.xml +++ b/electrmangnetic/pom.xml @@ -6,7 +6,7 @@ com.electromagnetic.data electromagnetic-data-new - 1.0-SNAPSHOT + 1.0 electrmangnetic @@ -61,7 +61,7 @@ com.electromagnetic.data electromagnetic-common - 1.0-SNAPSHOT + 1.0 compile diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/RoleCheckAspect.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/RoleCheckAspect.java index 64c3237..42a2356 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/RoleCheckAspect.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/RoleCheckAspect.java @@ -8,7 +8,6 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; - @Component @Aspect public class RoleCheckAspect { 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/EdFileInfo.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java index d78e23a..ffaddb2 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java @@ -116,6 +116,16 @@ public class EdFileInfo extends BaseModel { @TableField(value = "prj_dir") private Boolean prjDir; + /** 当一个文件作废时,其所有的历史文件也会跟着作废,此时该文件及其历史文件的all_deleted=true**/ + @TableField(value = "all_deleted") + private Boolean allDeleted; + + /** + * 当文件被管理员永久物理删除,此时为true + */ + @TableField(value = "permanent_deleted") + private Boolean permanentDeleted; + public void newInit() { String userId = UserThreadLocal.getUserId(); String newFileDbId = IdWorker.getSnowFlakeIdString(); 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/service/serviceimpl/EdFileInfoServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java index 0e2c43c..16b1ca0 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java @@ -209,7 +209,8 @@ public class EdFileInfoServiceImpl extends ServiceImpl FileUtil.del(e.getAbsolutePath())); + FileUtil.del(path); return destColibPath; } @@ -1171,6 +1171,9 @@ public class EdFileInfoServiceImpl extends ServiceImpl Assert.isTrue(EleCommonUtil.isFileNameValid(folderName), NAME_VALID_MSG); // 检查当前目录下有文件,如果有则不允许添加 long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class) - .eq(EdFileInfo::getDataStatus, EleDataTypeEnum.FILE.code) + .eq(EdFileInfo::getFileType, EleDataTypeEnum.FILE.code) .eq(EdFileInfo::getParentId, parentId) .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); Assert.isTrue(count == 0, "该层级目录下存在文件,不允许再定义层级目录"); 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/electrmangnetic/src/main/resources/application.properties b/electrmangnetic/src/main/resources/application.properties index b63fb91..e364943 100644 --- a/electrmangnetic/src/main/resources/application.properties +++ b/electrmangnetic/src/main/resources/application.properties @@ -1,25 +1,27 @@ #required spring.application.name=electromagnetic-data spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource -spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true -spring.datasource.username=comac -spring.datasource.password=2024*Comac +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/em_data_dev?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true +spring.datasource.username=user +spring.datasource.password=123123 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl spring.servlet.multipart.max-file-size=500MB -spring.servlet.multipart.max-request-size=10MB +spring.servlet.multipart.max-request-size=500MB pagehelper.helperDialect=mysql pagehelper.reasonable=false -server.port=12395 -file.security.passwd=adknfhkj87654knd +server.port=12396 #windows文件存储目录,用于测试 -data.windows.path=D:/tmp/eleData/project/ -data.linux.path=/szsd/data/eleData/project/ -data.upload.windows.tmp.path=D:/tmp/eleData/upload/ -data.upload.linux.tmp.path=/szsd/data/eleData/upload/ -data.download.windows.tmp.path=D:/tmp/eleData/download/ -data.download.linux.tmp.path=/szsd/data/eleData/download/ +data.windows.path=D:/tmp/szsd/data/eleData/dev/project/ +data.upload.windows.tmp.path=D:/tmp/szsd/data/eleData/dev/upload/ +data.download.windows.tmp.path=D:/tmp/szsd/data/eleData/dev/download/ + +data.linux.path=/szsd/data/eleData/dev/project/ +data.upload.linux.tmp.path=/szsd/data/eleData/dev/upload/ +data.download.linux.tmp.path=/szsd/data/eleData/dev/download/ + prj.folder.max.length=6 +spring.jackson.time-zone=GMT+8 \ No newline at end of file diff --git a/electromagnetic-common/pom.xml b/electromagnetic-common/pom.xml index ecdbafb..bf830ed 100644 --- a/electromagnetic-common/pom.xml +++ b/electromagnetic-common/pom.xml @@ -6,7 +6,7 @@ com.electromagnetic.data electromagnetic-data-new - 1.0-SNAPSHOT + 1.0 electromagnetic-common 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..b3dfc52 100644 --- a/pom.xml +++ b/pom.xml @@ -6,11 +6,12 @@ com.electromagnetic.data electromagnetic-data-new - 1.0-SNAPSHOT + 1.0 pom electrmangnetic electromagnetic-common + electrmangnetic-backup