From 7d8cda234ef970f3f7725b06b5d152ce2592a67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com> Date: Sat, 19 Jul 2025 16:43:22 +0800 Subject: [PATCH 1/4] =?UTF-8?q?v2.0.1=20=E6=9B=B4=E6=96=B0=EF=BC=9A=20=20?= =?UTF-8?q?=201=E3=80=81=E5=B8=B8=E8=A7=84BUG=E4=BF=AE=E5=A4=8D=EF=BC=8C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=8D=E7=A7=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/somkit/fmt/entity/LoggerMessage.java | 14 ++++++-------- .../static/common/js/LogMonitorAdaptive.js | 4 ++-- src/main/resources/templates/logging.html | 2 +- 版本记录/readme.md | 4 +++- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 31841aa..2f8e538 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ cn.somkit fmt - 2.0.0 + 2.0.1 fmt File Manage System for by SpringBoot diff --git a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java index a25c154..e58551d 100644 --- a/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java +++ b/src/main/java/cn/somkit/fmt/entity/LoggerMessage.java @@ -1,16 +1,14 @@ package cn.somkit.fmt.entity; -import java.time.LocalDateTime; - public class LoggerMessage { String level; - String loggerName; + String name; String message; String timestamp; public LoggerMessage(String level, String loggerName, String message, String timestamp) { this.level = level; - this.loggerName = loggerName; + this.name = loggerName; this.message = message; this.timestamp = timestamp; } @@ -23,12 +21,12 @@ public class LoggerMessage { this.level = level; } - public String getLoggerName() { - return loggerName; + public String getName() { + return name; } - public void setLoggerName(String loggerName) { - this.loggerName = loggerName; + public void setName(String name) { + this.name = name; } public String getMessage() { diff --git a/src/main/resources/static/common/js/LogMonitorAdaptive.js b/src/main/resources/static/common/js/LogMonitorAdaptive.js index b6f279a..8bf7ff8 100644 --- a/src/main/resources/static/common/js/LogMonitorAdaptive.js +++ b/src/main/resources/static/common/js/LogMonitorAdaptive.js @@ -26,7 +26,7 @@ class LogMonitorAdaptive { timeFormat: 'HH:mm:ss.SSS', // 时间戳格式,可自定义 /* --- 日志级别 & 过滤 --- */ - levels: ['debug', 'info', 'warn', 'error', 'success', 'system'], // 可用日志级别 + levels: ['DEBUG', 'INFO', 'WARN', 'ERROR', 'SUCCESS', 'SYSTEM'], // 可用日志级别 // 过滤功能基于 levels;如只想显示 info/warn,可在这里删减 /* --- 功能开关 --- */ @@ -51,7 +51,7 @@ class LogMonitorAdaptive { /* 强制确保 levels 是数组,防止 forEach 报错 */ if (!Array.isArray(this.cfg.levels)) { - this.cfg.levels = ['info', 'warn', 'error']; + this.cfg.levels = ['INFO', 'WARN', 'ERROR']; } this.isPaused = false; diff --git a/src/main/resources/templates/logging.html b/src/main/resources/templates/logging.html index 3a31b6c..c37a76a 100644 --- a/src/main/resources/templates/logging.html +++ b/src/main/resources/templates/logging.html @@ -56,7 +56,7 @@ ws.onmessage = function (event) { if(event.data){ let data = JSON.parse(event.data); - logger.log(data.loggerName + ' : ' + data.message, data.level, data.timestamp); + logger.log(data.name + ' : ' + data.message, data.level, data.timestamp); } } diff --git a/版本记录/readme.md b/版本记录/readme.md index c18ccec..1f05bf0 100644 --- a/版本记录/readme.md +++ b/版本记录/readme.md @@ -26,4 +26,6 @@ 引入metona-cache-spring-boot-starter,使用此缓存方案 重构在线日志页面及实现方式,不再使用读取日志文件方式,自定义日志拦截器实时获取日志 不再生成自定义日志文件,日志打印从INFO改为DEBUG,打印更详细的内容 -``` \ No newline at end of file +``` +> v2.0.1 + 常规BUG修复,参数名称修改 \ No newline at end of file From bb99e48275ee19484793df39e0a659f7bd5678bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com> Date: Wed, 23 Jul 2025 18:27:16 +0800 Subject: [PATCH 2/4] =?UTF-8?q?v2.1.0=20=E6=9B=B4=E6=96=B0=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=201=E3=80=81=E5=BC=95=E5=85=A5metona-mq-mini-pro?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E6=97=A5=E5=BF=97=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++- .../java/cn/somkit/fmt/FmtApplication.java | 13 +++++++ .../cn/somkit/fmt/action/LoggingAction.java | 14 ++++++-- .../cn/somkit/fmt/filter/LogStashFilter.java | 13 +++++-- .../fmt/socket/WebSocketServerHandler.java | 35 ++++++++++++++----- 5 files changed, 70 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 2f8e538..94627f0 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ cn.somkit fmt - 2.0.1 + 2.1.0 fmt File Manage System for by SpringBoot @@ -51,6 +51,12 @@ metona-cache-spring-boot-starter 1.0.0 + + + cn.metona + metona-mq-mini-pro + 1.0.1 + diff --git a/src/main/java/cn/somkit/fmt/FmtApplication.java b/src/main/java/cn/somkit/fmt/FmtApplication.java index bb94f44..dd84694 100644 --- a/src/main/java/cn/somkit/fmt/FmtApplication.java +++ b/src/main/java/cn/somkit/fmt/FmtApplication.java @@ -1,13 +1,26 @@ package cn.somkit.fmt; +import cn.metona.mq.consumer.MessageListener; +import cn.metona.mq.core.Message; +import cn.metona.mq.exception.MessageConsumeException; +import cn.metona.mq.util.MetonaMQUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FmtApplication { + private static final Logger logger = LoggerFactory.getLogger(FmtApplication.class); + public static void main(String[] args) { SpringApplication.run(FmtApplication.class, args); + + if(!MetonaMQUtil.isInitialized()){ + logger.info("Metona MQ Mini Pro 初始化..."); + MetonaMQUtil.init(); + } } } diff --git a/src/main/java/cn/somkit/fmt/action/LoggingAction.java b/src/main/java/cn/somkit/fmt/action/LoggingAction.java index 68d173f..f1e2a6f 100644 --- a/src/main/java/cn/somkit/fmt/action/LoggingAction.java +++ b/src/main/java/cn/somkit/fmt/action/LoggingAction.java @@ -1,6 +1,10 @@ package cn.somkit.fmt.action; import cn.metona.cache.Cache; +import cn.metona.mq.util.MetonaMQUtil; +import cn.somkit.fmt.socket.WebSocketServerHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -12,8 +16,10 @@ import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping("/logging") public class LoggingAction { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired - private Cache cache; + private Cache cache; @GetMapping("/index") public String index() throws Exception{ @@ -23,6 +29,10 @@ public class LoggingAction { @ResponseBody @PostMapping("/close") public void close(Boolean closed) throws Exception { - cache.put("closed", closed); + cache.put("closed", String.valueOf(closed)); + logger.info("Metona MQ Mini Pro 停止消费者(顺序消息)..."); + if(closed){ + MetonaMQUtil.stopOrderedConsuming(); + } } } diff --git a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java index 2c28cac..3ae8c2a 100644 --- a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java +++ b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java @@ -5,8 +5,10 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import cn.metona.mq.exception.MessageSendException; +import cn.metona.mq.util.MetonaMQUtil; import cn.somkit.fmt.entity.LoggerMessage; -import cn.somkit.fmt.utils.LoggerQueue; import java.time.Instant; import java.time.ZoneId; @@ -27,7 +29,14 @@ public class LogStashFilter extends Filter { DateUtil.format(Instant.ofEpochMilli(e.getTimeStamp()).atZone(ZoneId.systemDefault()).toLocalDateTime(), "yyyy-MM-dd HH:mm:ss.SSS") ); - LoggerQueue.getInstance().push(msg); // 单例阻塞队列 + try { + System.out.println(MetonaMQUtil.getConsumerStatus()); + if(MetonaMQUtil.isInitialized() && MetonaMQUtil.isOrderedConsumerRunning()){ + MetonaMQUtil.send("log-topic", "log-monitor", JSONUtil.toJsonStr(msg)); + } + } catch (MessageSendException ex) { + System.out.println("发送消息队列失败"); + } return FilterReply.NEUTRAL; } diff --git a/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java index 15d399c..382fd41 100644 --- a/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java +++ b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java @@ -1,10 +1,10 @@ package cn.somkit.fmt.socket; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; import cn.metona.cache.Cache; -import cn.somkit.fmt.entity.LoggerMessage; -import cn.somkit.fmt.utils.LoggerQueue; +import cn.metona.mq.consumer.MessageListener; +import cn.metona.mq.core.Message; +import cn.metona.mq.util.MetonaMQUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +19,7 @@ public class WebSocketServerHandler implements WebSocketHandler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired - private Cache cache; + private Cache cache; @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { @@ -27,10 +27,29 @@ public class WebSocketServerHandler implements WebSocketHandler { } private void push(WebSocketSession session) throws IOException { - while (StrUtil.isBlankIfStr(cache.get("closed")) || !Boolean.parseBoolean(String.valueOf(cache.get("closed")))) { - LoggerMessage log = LoggerQueue.getInstance().poll(); - if(log != null){ - session.sendMessage(new TextMessage(JSONUtil.toJsonStr(log))); + boolean closed = StrUtil.isNotBlank(cache.get("closed")) && Boolean.parseBoolean(cache.get("closed")); + if(!closed){ + try { + if(MetonaMQUtil.isInitialized()){ + logger.info("Metona MQ Mini Pro 订阅主题(log-topic)(顺序消息)..."); + MetonaMQUtil.subscribeOrdered("log-topic", new MessageListener() { + @Override + public void onMessage(Message message) { + try { + session.sendMessage(new TextMessage(message.getBody())); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + + if(!MetonaMQUtil.isOrderedConsumerRunning()){ + logger.info("Metona MQ Mini Pro 启动消费者(顺序消息)..."); + MetonaMQUtil.startOrderedConsuming(); + } + } + } catch (Exception e) { + logger.error("Metona MQ Mini Pro 异常", e); } } } From e17e31edfd5379a74280de4ebde23af4b34c79d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com> Date: Wed, 23 Jul 2025 23:26:56 +0800 Subject: [PATCH 3/4] =?UTF-8?q?v2.1.0=20=E6=9B=B4=E6=96=B0=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=201=E3=80=81=E5=BC=95=E5=85=A5metona-mq-mini-pro?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E6=97=A5=E5=BF=97=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/somkit/fmt/FmtApplication.java | 3 --- .../cn/somkit/fmt/action/UploadAction.java | 27 ++++++++++++------- .../cn/somkit/fmt/filter/LogStashFilter.java | 1 - .../fmt/socket/WebSocketServerHandler.java | 8 +++--- .../static/common/js/LogMonitorAdaptive.js | 2 +- src/main/resources/templates/logging.html | 24 ++++++++++++----- 7 files changed, 40 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 94627f0..88f1555 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ cn.metona metona-mq-mini-pro - 1.0.1 + 1.0.2 diff --git a/src/main/java/cn/somkit/fmt/FmtApplication.java b/src/main/java/cn/somkit/fmt/FmtApplication.java index dd84694..513204a 100644 --- a/src/main/java/cn/somkit/fmt/FmtApplication.java +++ b/src/main/java/cn/somkit/fmt/FmtApplication.java @@ -1,8 +1,5 @@ package cn.somkit.fmt; -import cn.metona.mq.consumer.MessageListener; -import cn.metona.mq.core.Message; -import cn.metona.mq.exception.MessageConsumeException; import cn.metona.mq.util.MetonaMQUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/cn/somkit/fmt/action/UploadAction.java b/src/main/java/cn/somkit/fmt/action/UploadAction.java index 2014d39..96b5a78 100644 --- a/src/main/java/cn/somkit/fmt/action/UploadAction.java +++ b/src/main/java/cn/somkit/fmt/action/UploadAction.java @@ -2,6 +2,8 @@ package cn.somkit.fmt.action; import cn.somkit.fmt.utils.OsInfoUtil; import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -18,6 +20,8 @@ import java.util.*; @RequestMapping("/upload") public class UploadAction { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Value("${somkit.upload.path.windows}") private String windows_path; @@ -40,7 +44,7 @@ public class UploadAction { try { this.saveFile(file); // 保存上传信息 } catch (Exception e) { - e.printStackTrace(); + logger.error("文件保存失败:{}", e.getMessage()); } } } @@ -56,14 +60,19 @@ public class UploadAction { * @throws Exception 上传异常 */ public void saveFile(MultipartFile file) throws Exception { - String path = OsInfoUtil.isWindows() ? windows_path : - OsInfoUtil.isLinux() ? linux_path : null; - assert path != null; - String filePath = ""; - if (file != null && file.getSize() > 0) { // 有文件上传 - filePath = path + File.separator + file.getOriginalFilename(); - File saveFile = new File(filePath) ; - file.transferTo(saveFile); // 文件保存 + try { + String path = OsInfoUtil.isWindows() ? windows_path : + OsInfoUtil.isLinux() ? linux_path : null; + assert path != null; + String filePath = ""; + if (file != null && file.getSize() > 0) { // 有文件上传 + filePath = path + File.separator + file.getOriginalFilename(); + File saveFile = new File(filePath) ; + file.transferTo(saveFile); // 文件保存 + logger.info("文件保存成功:{}", filePath); + } + } catch (Exception e) { + throw new RuntimeException(e); } } } diff --git a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java index 3ae8c2a..87fe46d 100644 --- a/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java +++ b/src/main/java/cn/somkit/fmt/filter/LogStashFilter.java @@ -30,7 +30,6 @@ public class LogStashFilter extends Filter { "yyyy-MM-dd HH:mm:ss.SSS") ); try { - System.out.println(MetonaMQUtil.getConsumerStatus()); if(MetonaMQUtil.isInitialized() && MetonaMQUtil.isOrderedConsumerRunning()){ MetonaMQUtil.send("log-topic", "log-monitor", JSONUtil.toJsonStr(msg)); } diff --git a/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java index 382fd41..23446d4 100644 --- a/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java +++ b/src/main/java/cn/somkit/fmt/socket/WebSocketServerHandler.java @@ -30,7 +30,7 @@ public class WebSocketServerHandler implements WebSocketHandler { boolean closed = StrUtil.isNotBlank(cache.get("closed")) && Boolean.parseBoolean(cache.get("closed")); if(!closed){ try { - if(MetonaMQUtil.isInitialized()){ + if(MetonaMQUtil.isInitialized() && !MetonaMQUtil.isOrderedConsumerRunning()){ logger.info("Metona MQ Mini Pro 订阅主题(log-topic)(顺序消息)..."); MetonaMQUtil.subscribeOrdered("log-topic", new MessageListener() { @Override @@ -43,10 +43,8 @@ public class WebSocketServerHandler implements WebSocketHandler { } }); - if(!MetonaMQUtil.isOrderedConsumerRunning()){ - logger.info("Metona MQ Mini Pro 启动消费者(顺序消息)..."); - MetonaMQUtil.startOrderedConsuming(); - } + logger.info("Metona MQ Mini Pro 启动消费者(顺序消息)..."); + MetonaMQUtil.startOrderedConsuming(); } } catch (Exception e) { logger.error("Metona MQ Mini Pro 异常", e); diff --git a/src/main/resources/static/common/js/LogMonitorAdaptive.js b/src/main/resources/static/common/js/LogMonitorAdaptive.js index 8bf7ff8..34025a5 100644 --- a/src/main/resources/static/common/js/LogMonitorAdaptive.js +++ b/src/main/resources/static/common/js/LogMonitorAdaptive.js @@ -309,7 +309,7 @@ class LogMonitorAdaptive { debug: '#9c27b0', info: '#2196f3', warn: '#ff9800', error: '#f44336', success: '#4caf50', system: '#00bcd4' }; - lvlSpan.style.color = colors[entry.level] || colors.info; + lvlSpan.style.color = colors[entry.level.toLowerCase()] || colors.info; lvlSpan.style.minWidth = '70px'; lvlSpan.style.fontWeight = 'bold'; line.appendChild(lvlSpan); diff --git a/src/main/resources/templates/logging.html b/src/main/resources/templates/logging.html index c37a76a..d3c0224 100644 --- a/src/main/resources/templates/logging.html +++ b/src/main/resources/templates/logging.html @@ -14,6 +14,18 @@ let ws = null; + let logMonitor = async (closed = false) => { + const options = { + url: Fmt.ctx() + '/logging/close', + data: {closed: closed}, + method: 'post' + }; + await Fmt.axios(options).then(() => {}).catch((err) => console.error(err)); + if(ws){ + ws.send('发送日志'); + } + } + const logger = new LogMonitorAdaptive('#logContainer', { theme: 'dark', maxLines: 10000, @@ -32,13 +44,7 @@ wordWrap: true, // 日志内容是否自动换行(true=换行,false=横向滚动) //暂停/继续 回调函数 onTogglePause: async (isPaused) => { - const options = { - url: Fmt.ctx() + '/logging/close', - data: {closed: isPaused}, - method: 'post' - }; - await Fmt.axios(options).then((result) => console.log(result)).catch((err) => console.error(err)); - ws.send('发送日志'); + await logMonitor(isPaused); }, onCreated: () => { console.log('日志容器已创建'); @@ -53,6 +59,10 @@ return false; } + ws.onopen = function () { + + } + ws.onmessage = function (event) { if(event.data){ let data = JSON.parse(event.data); From b37da657fabd96364701e3ced7bb24d9050d5362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E5=BD=B1233?= <1440196015@qq.com> Date: Fri, 25 Jul 2025 09:29:34 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=92=8C=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 88 +++++++++++++++++++++++++++++++++++----------- 版本记录/readme.md | 6 +++- 2 files changed, 72 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index ba903c9..61bcbd2 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,77 @@ # fmt -#### 介绍 -1. 简易文件传输管理系统 -2. 文件下载、文件上传、在线日志 +## 介绍 -#### 软件架构 -1. Jdk 21 -2. Maven 3.6.3 -3. SpringBoot 3.5.3 -4. SpringBoot Starter Thymeleaf 3.5.3 -5. SpringBoot Starter WebSocket 3.5.3 -7. Hutool 5.8.25 -7. AXUI 2.1.1 +`fmt` 是一个基于 Spring Boot 的文件管理工具,旨在提供便捷的文件上传、下载、打包、删除等操作。它结合了简洁的前端界面与强大的后端功能,适用于需要进行文件管理的各类应用场景。 +## 软件架构 -#### 安装教程 +本项目采用前后端一体化架构,后端基于 Spring Boot 框架,使用 Java 语言开发,前端采用 HTML、CSS 和 JavaScript 技术,结合 `axui` 框架进行界面渲染。主要模块包括: -1. 项目导入IDEA,配置Jdk、Maven,根据自己实际环境修改配置文件,然后启动项目 -2. 下载发行版本压缩包,解压后,修改bin目录下的启动文件配置,然后执行即可 +- **文件上传模块**:支持文件上传并保存至服务器。 +- **文件下载模块**:支持文件下载及 ZIP 打包下载。 +- **文件管理模块**:支持文件删除、批量删除等操作。 +- **日志模块**:实时推送日志信息。 +- **WebSocket 模块**:用于前后端实时通信。 +- **工具类模块**:包括 MD5 工具、操作系统工具等。 -#### 使用说明 +## 安装教程 -1. 启动项目,访问http://127.0.0.1:8098/fmt +1. **克隆项目**: + ```bash + git clone https://gitee.com/thzxx/fmt.git + ``` -#### 参与贡献 +2. **构建项目**: + 使用 Maven 构建项目: + ```bash + cd fmt + mvn clean package + ``` -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request \ No newline at end of file +3. **运行项目**: + 启动 Spring Boot 应用: + ```bash + java -jar target/fmt.jar + ``` + +4. **访问项目**: + 打开浏览器访问: + ``` + http://localhost:8080 + ``` + +## 使用说明 + +- **上传文件**: + 访问 `/upload/index` 页面,选择文件进行上传。 + +- **下载文件**: + 访问 `/download/index` 页面,点击文件进行下载,或使用 `/download/file` 接口下载指定路径文件。 + +- **打包下载**: + 使用 `/download/packZip` 接口,传入文件名列表进行 ZIP 打包下载。 + +- **删除文件**: + 使用 `/download/delete` 或 `/download/batchDel` 接口进行单个或批量删除。 + +- **查看日志**: + 访问 `/logging/index` 页面,实时查看日志信息。 + +- **WebSocket 实时通信**: + 前端通过 WebSocket 连接 `/ws`,接收服务器推送的消息。 + +## 参与贡献 + +欢迎贡献代码和改进项目。请遵循以下步骤: + +1. Fork 项目。 +2. 创建新分支。 +3. 提交代码。 +4. 创建 Pull Request。 + +如发现 Bug 或有改进建议,请提交 Issue 或直接联系项目维护者。 + +## 许可证 + +本项目采用 MIT 许可证。详情请查看项目根目录下的 `LICENSE` 文件。 \ No newline at end of file diff --git a/版本记录/readme.md b/版本记录/readme.md index 1f05bf0..1fbf09e 100644 --- a/版本记录/readme.md +++ b/版本记录/readme.md @@ -28,4 +28,8 @@ 不再生成自定义日志文件,日志打印从INFO改为DEBUG,打印更详细的内容 ``` > v2.0.1 - 常规BUG修复,参数名称修改 \ No newline at end of file + 常规BUG修复,参数名称修改 +> v2.1.0 +``` + 引入metona-mq-mini-pro消息队列,重构实时日志获取方式 +``` \ No newline at end of file