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