From 4a7a2b7d1558e14a2924631ca4e6919999991ec4 Mon Sep 17 00:00:00 2001
From: jlzhou <12020042@qq.com>
Date: Tue, 11 Feb 2025 08:53:29 +0800
Subject: [PATCH] =?UTF-8?q?feat=20=E5=8A=A8=E6=80=81=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bi-ui/index.html | 2 +-
.../ruoyi/common/annotation/DynConfig.java | 17 ++++
.../ruoyi/common/event/DynConfigEvent.java | 13 +++
.../ruoyi/common/runner/DynConfigAspect.java | 18 ++++
.../common/runner/DynConfigProcessor.java | 98 +++++++++++++++++++
.../ruoyi/demo/controller/DynConfigApi.java | 34 +++++++
.../ruoyi/demo/dynconfig/TestDynConfig.java | 27 +++++
ruoyi.sql | 82 +++++++++++++++-
8 files changed, 288 insertions(+), 3 deletions(-)
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynConfig.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/event/DynConfigEvent.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigAspect.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigProcessor.java
create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DynConfigApi.java
create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/dynconfig/TestDynConfig.java
diff --git a/bi-ui/index.html b/bi-ui/index.html
index de91502..eb0d613 100644
--- a/bi-ui/index.html
+++ b/bi-ui/index.html
@@ -1,5 +1,5 @@
-
+
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynConfig.java
new file mode 100644
index 0000000..4912cec
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynConfig.java
@@ -0,0 +1,17 @@
+package com.ruoyi.common.annotation;
+
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 动态配置
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Component
+public @interface DynConfig {
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/event/DynConfigEvent.java b/ruoyi-common/src/main/java/com/ruoyi/common/event/DynConfigEvent.java
new file mode 100644
index 0000000..54264db
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/event/DynConfigEvent.java
@@ -0,0 +1,13 @@
+package com.ruoyi.common.event;
+
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * 动态配置发生改变事件
+ */
+public class DynConfigEvent extends ApplicationEvent {
+ public DynConfigEvent(Object source) {
+ super(source);
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigAspect.java b/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigAspect.java
new file mode 100644
index 0000000..45b32e8
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigAspect.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.runner;
+
+import com.ruoyi.common.utils.JsonUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.aop.framework.Advised;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+@Slf4j
+@DependsOn("dynConfigProcessor")
+public class DynConfigAspect {
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigProcessor.java b/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigProcessor.java
new file mode 100644
index 0000000..ec9bd34
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/runner/DynConfigProcessor.java
@@ -0,0 +1,98 @@
+package com.ruoyi.common.runner;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.collection.ConcurrentHashSet;
+import cn.hutool.crypto.digest.MD5;
+import com.ruoyi.common.annotation.DynConfig;
+import com.ruoyi.common.event.DynConfigEvent;
+import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.aop.framework.Advised;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.rowset.SqlRowSet;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+@Aspect
+@Configuration
+@RequiredArgsConstructor
+@Slf4j
+public class DynConfigProcessor implements BeanPostProcessor {
+
+ private final JdbcTemplate jdbc;
+
+ private final PlatformTransactionManager transactionManager;
+ private final MD5 md5 = MD5.create();
+
+ private final Map dynConfigMap = new ConcurrentHashMap<>();
+
+ private final Map saveBeans = new ConcurrentHashMap<>();
+
+
+ @Override
+ @SneakyThrows
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof Advised) {
+ Class cls = ((Advised) bean).getTargetClass();
+ Object target = ((Advised) bean).getTargetSource().getTarget();
+ beanName = cls.getName();
+ if (cls.isAnnotationPresent(DynConfig.class)) {
+ log.info("动态配置类:{}-{}", beanName, cls.getName());
+ SqlRowSet rs = jdbc.queryForRowSet("select * from sys_dyn_config where config_key = ?", beanName);
+ if (rs.next()) {
+ Object old = JsonUtils.parseObject(rs.getString("config_value"), bean.getClass());
+ BeanUtil.copyProperties(old, target, CopyOptions.create(cls, false));
+ } else {
+ jdbc.update("insert into sys_dyn_config (config_key,config_value) values (?,?)", beanName, JsonUtils.toJsonString(target));
+ }
+ dynConfigMap.put(beanName, md5.digestHex(JsonUtils.toJsonString(target)));
+ }
+ }
+ return bean;
+ }
+
+ @After("@within(com.ruoyi.common.annotation.DynConfig) && (execution(* *..set*(..)) || execution(* *..add*(..)) || execution(* *..remove*(..)) || execution(* *..put*(..)) || execution(* *..save()))")
+ public void afterSetter(JoinPoint jp) {
+ String hash = md5.digestHex(JsonUtils.toJsonString(jp.getTarget()));
+ String name = jp.getTarget().getClass().getName();
+ if (hash.equals(dynConfigMap.get(name))) {
+ return;
+ }
+ dynConfigMap.put(name, hash);
+ saveBeans.put(name, jp.getTarget());
+ if (log.isDebugEnabled()) {
+ log.debug("动态配置发生了变化:{} {}", name, JsonUtils.toJsonString(jp.getTarget()));
+ }
+ SpringUtils.publishEvent(new DynConfigEvent(jp.getTarget()));
+ }
+
+ @Scheduled(fixedRate = 1000)
+ public void save() {
+ for (String key : saveBeans.keySet()) {
+ jdbc.update("update sys_dyn_config set config_value=? where config_key=?", JsonUtils.toJsonString(saveBeans.get(key)), key);
+ if (log.isDebugEnabled()) {
+ log.debug("定时保存动态配置:{} {}", key, JsonUtils.toJsonString(saveBeans.get(key)));
+ }
+ }
+ saveBeans.clear();
+ }
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DynConfigApi.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DynConfigApi.java
new file mode 100644
index 0000000..446984b
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DynConfigApi.java
@@ -0,0 +1,34 @@
+package com.ruoyi.demo.controller;
+
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import com.ruoyi.common.annotation.Dev;
+import com.ruoyi.demo.dynconfig.TestDynConfig;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@SaIgnore
+@Dev
+@RequiredArgsConstructor
+@RequestMapping("/demo/dynconfig")
+public class DynConfigApi {
+
+ private final TestDynConfig config;
+
+ @GetMapping
+ public Object get(){
+// return config; //java中可以直接使用,但是不能JSON序列号,因为他是经过aop代理后的bean
+ return BeanUtil.toBean(config, TestDynConfig.class);
+ }
+
+
+ @PostMapping
+ public void set(@RequestBody TestDynConfig config){
+// this.config=config;//不能直接赋值
+ BeanUtil.copyProperties(config,this.config, CopyOptions.create(TestDynConfig.class,true));//使用属性copy的方法或setter(getter)完成
+ this.config.save();//主动异步保存(PS:属性的方法不会触发保存需要主动异步保存),执行set*,put*,add*,remove*方法后会自动异步保存
+ }
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/dynconfig/TestDynConfig.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/dynconfig/TestDynConfig.java
new file mode 100644
index 0000000..db7632a
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/dynconfig/TestDynConfig.java
@@ -0,0 +1,27 @@
+package com.ruoyi.demo.dynconfig;
+
+import com.ruoyi.common.annotation.DynConfig;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@DynConfig
+public class TestDynConfig {
+
+ /**
+ * 配置项编码
+ */
+ private String code;
+
+ private List list;
+
+ /**
+ * 配置项值
+ */
+ private String value;
+
+ public void save() {
+ }
+
+}
diff --git a/ruoyi.sql b/ruoyi.sql
index cea197e..df4cd98 100644
--- a/ruoyi.sql
+++ b/ruoyi.sql
@@ -11,7 +11,7 @@
Target Server Version : 100617
File Encoding : 65001
- Date: 24/10/2024 17:46:10
+ Date: 11/02/2025 08:51:59
*/
SET NAMES utf8mb4;
@@ -165,6 +165,21 @@ INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'ad
INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2023-08-16 10:35:07', '', NULL, '登录状态列表');
INSERT INTO `sys_dict_type` VALUES (11, '链接类型', 'sys_links_types', '0', 'admin', '2023-11-06 10:50:15', 'admin', '2024-03-07 10:12:12', '链接类型列表');
+-- ----------------------------
+-- Table structure for sys_dyn_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dyn_config`;
+CREATE TABLE `sys_dyn_config` (
+ `config_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置关键字',
+ `config_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置内容',
+ PRIMARY KEY (`config_key`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统配置' ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of sys_dyn_config
+-- ----------------------------
+INSERT INTO `sys_dyn_config` VALUES ('com.ruoyi.demo.dynconfig.TestDynConfig', '{\"code\":\"a\",\"value\":\"aaaaaaaaaaaaa1\"}');
+
-- ----------------------------
-- Table structure for sys_links
-- ----------------------------
@@ -217,6 +232,60 @@ INSERT INTO `sys_logininfor` VALUES (20241023000000001, 'admin', '127.0.0.1', '
INSERT INTO `sys_logininfor` VALUES (20241023000000002, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-23 15:11:46');
INSERT INTO `sys_logininfor` VALUES (20241024000000001, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-24 08:49:02');
INSERT INTO `sys_logininfor` VALUES (20241024000000002, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-24 14:27:40');
+INSERT INTO `sys_logininfor` VALUES (20241025000000001, 'admin', '192.168.3.122', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-25 15:37:21');
+INSERT INTO `sys_logininfor` VALUES (20241025000000002, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-25 15:48:07');
+INSERT INTO `sys_logininfor` VALUES (20241025000000003, 'admin', '192.168.3.122', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-25 16:34:23');
+INSERT INTO `sys_logininfor` VALUES (20241025000000004, 'admin', '192.168.3.122', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-25 19:52:53');
+INSERT INTO `sys_logininfor` VALUES (20241028000000001, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-28 15:34:09');
+INSERT INTO `sys_logininfor` VALUES (20241028000000002, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-28 17:37:53');
+INSERT INTO `sys_logininfor` VALUES (20241029000000001, 'admin', '192.168.3.122', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-29 16:08:00');
+INSERT INTO `sys_logininfor` VALUES (20241030000000001, 'admin', '192.168.3.122', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-30 09:07:18');
+INSERT INTO `sys_logininfor` VALUES (20241031000000001, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-10-31 09:39:28');
+INSERT INTO `sys_logininfor` VALUES (20241101000000001, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-01 09:39:09');
+INSERT INTO `sys_logininfor` VALUES (20241101000000002, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-01 11:06:41');
+INSERT INTO `sys_logininfor` VALUES (20241101000000003, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-01 14:05:26');
+INSERT INTO `sys_logininfor` VALUES (20241101000000004, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-01 17:17:05');
+INSERT INTO `sys_logininfor` VALUES (20241101000000005, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '退出成功', '2024-11-01 17:17:09');
+INSERT INTO `sys_logininfor` VALUES (20241104000000001, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-04 11:04:25');
+INSERT INTO `sys_logininfor` VALUES (20241107000000001, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-07 10:49:21');
+INSERT INTO `sys_logininfor` VALUES (20241107000000002, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-07 14:32:59');
+INSERT INTO `sys_logininfor` VALUES (20241108000000001, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-08 09:52:45');
+INSERT INTO `sys_logininfor` VALUES (20241113000000001, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '1', '密码错误1次', '2024-11-13 15:49:44');
+INSERT INTO `sys_logininfor` VALUES (20241113000000002, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-13 15:49:50');
+INSERT INTO `sys_logininfor` VALUES (20241115000000001, 'admin', '192.168.3.147', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-15 14:59:41');
+INSERT INTO `sys_logininfor` VALUES (20241115000000002, 'admin', '192.168.3.193', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-15 16:24:07');
+INSERT INTO `sys_logininfor` VALUES (20241115000000003, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-15 16:44:39');
+INSERT INTO `sys_logininfor` VALUES (20241115000000004, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-11-15 17:24:56');
+INSERT INTO `sys_logininfor` VALUES (20250107000000001, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-07 10:34:45');
+INSERT INTO `sys_logininfor` VALUES (20250107000000002, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-07 13:59:47');
+INSERT INTO `sys_logininfor` VALUES (20250107000000003, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-07 14:03:18');
+INSERT INTO `sys_logininfor` VALUES (20250107000000004, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '退出成功', '2025-01-07 14:15:44');
+INSERT INTO `sys_logininfor` VALUES (20250107000000005, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-07 14:26:34');
+INSERT INTO `sys_logininfor` VALUES (20250107000000006, 'admin', '127.0.0.1', '内网IP', 'Unknown', 'Unknown', '0', '登录成功', '2025-01-07 16:14:45');
+INSERT INTO `sys_logininfor` VALUES (20250108000000001, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-08 09:08:34');
+INSERT INTO `sys_logininfor` VALUES (20250108000000002, 'admin', '127.0.0.1', '内网IP', 'Unknown', 'Unknown', '0', '登录成功', '2025-01-08 10:56:08');
+INSERT INTO `sys_logininfor` VALUES (20250109000000003, 'admin', '127.0.0.1', '内网IP', 'Unknown', 'Unknown', '0', '登录成功', '2025-01-09 09:05:20');
+INSERT INTO `sys_logininfor` VALUES (20250109000000004, 'admin', '127.0.0.1', '内网IP', 'MicroMessenger', 'iPhone', '0', '登录成功', '2025-01-09 09:31:32');
+INSERT INTO `sys_logininfor` VALUES (20250109000000005, 'admin', '127.0.0.1', '内网IP', 'MicroMessenger', 'iPhone', '0', '登录成功', '2025-01-09 09:50:29');
+INSERT INTO `sys_logininfor` VALUES (20250109000000006, 'admin', '127.0.0.1', '内网IP', 'MicroMessenger', 'iPhone', '0', '登录成功', '2025-01-09 11:36:32');
+INSERT INTO `sys_logininfor` VALUES (20250109000000007, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'iPhone', '0', '登录成功', '2025-01-09 14:45:53');
+INSERT INTO `sys_logininfor` VALUES (20250109000000008, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'iPhone', '0', '登录成功', '2025-01-09 14:52:49');
+INSERT INTO `sys_logininfor` VALUES (20250109000000009, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-09 15:59:44');
+INSERT INTO `sys_logininfor` VALUES (20250122000000010, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-22 15:40:11');
+INSERT INTO `sys_logininfor` VALUES (20250123000000011, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-01-23 09:23:36');
+INSERT INTO `sys_logininfor` VALUES (20250208000000012, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 14:25:03');
+INSERT INTO `sys_logininfor` VALUES (20250208000000013, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 14:41:24');
+INSERT INTO `sys_logininfor` VALUES (20250208000000014, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 14:42:14');
+INSERT INTO `sys_logininfor` VALUES (20250208000000015, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 14:42:30');
+INSERT INTO `sys_logininfor` VALUES (20250208000000016, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 15:09:30');
+INSERT INTO `sys_logininfor` VALUES (20250208000000017, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 15:16:20');
+INSERT INTO `sys_logininfor` VALUES (20250208000000018, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 15:28:43');
+INSERT INTO `sys_logininfor` VALUES (20250208000000019, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 15:32:53');
+INSERT INTO `sys_logininfor` VALUES (20250208000000020, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 15:43:16');
+INSERT INTO `sys_logininfor` VALUES (20250208000000021, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-08 17:57:49');
+INSERT INTO `sys_logininfor` VALUES (20250210000000022, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-10 08:42:28');
+INSERT INTO `sys_logininfor` VALUES (20250210000000023, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-10 08:42:29');
+INSERT INTO `sys_logininfor` VALUES (20250210000000024, 'admin', '127.0.0.1', '内网IP', 'MSEdge', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2025-02-10 11:31:58');
-- ----------------------------
-- Table structure for sys_menu
@@ -437,6 +506,15 @@ INSERT INTO `sys_oper_log` VALUES (20241011000000018, '测试单表', 1, 'com.ru
INSERT INTO `sys_oper_log` VALUES (20241011000000019, '测试单表', 2, 'com.ruoyi.demo.controller.TestDemoController.edit()', 'PUT', 1, 'admin', '', '/demo/demo', '127.0.0.1', '内网IP', '{\"createBy\":\"admin\",\"createTime\":\"2023-08-16 10:35:31\",\"id\":1,\"deptId\":102,\"userId\":4,\"orderNum\":1,\"testKey\":\"测试数据权限\",\"value\":\"测试\"}', '{\"code\":200,\"msg\":\"操作成功\"}', 0, '', '2024-10-11 17:50:05');
INSERT INTO `sys_oper_log` VALUES (20241014000000020, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202410140000001,\"taskId\":\"5553036b32681350546531d871d5edc9\",\"groupId\":0,\"enabled\":true,\"createTime\":\"2024-10-14 09:04\",\"paramELs\":[],\"userId\":1}', '', 0, '', '2024-10-14 09:04:34');
INSERT INTO `sys_oper_log` VALUES (20241022000000021, '菜单管理', 1, 'com.ruoyi.web.controller.system.SysMenuController.add()', 'POST', 1, 'admin', '', '/system/menu', '127.0.0.1', '内网IP', '{\"createBy\":\"admin\",\"createTime\":\"2024-10-22 11:01:10\",\"updateBy\":\"admin\",\"updateTime\":\"2024-10-22 11:01:10\",\"parentId\":5,\"children\":[],\"menuId\":\"20241022000000001\",\"menuName\":\"文件图片上传\",\"orderNum\":99,\"path\":\"file\",\"component\":\"demo/file/index\",\"isFrame\":\"1\",\"isCache\":\"1\",\"menuType\":\"C\",\"visible\":\"0\",\"status\":\"0\",\"perms\":\"demo:file:index\",\"icon\":\"upload\"}', '{\"code\":200,\"msg\":\"操作成功\"}', 0, '', '2024-10-22 11:01:10');
+INSERT INTO `sys_oper_log` VALUES (20250107000000022, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202501070000002,\"groupId\":0,\"enabled\":true,\"createTime\":\"2025-01-07 16:41\",\"paramELs\":[],\"userId\":1}', '', 0, '', '2025-01-07 16:41:13');
+INSERT INTO `sys_oper_log` VALUES (20250107000000023, '定时任务', 3, 'com.ruoyi.cron.api.CronTaskApi.remove()', 'DELETE', 1, 'admin', '', '/system/cron/202501070000002', '127.0.0.1', '内网IP', '{}', '', 0, '', '2025-01-07 16:41:19');
+INSERT INTO `sys_oper_log` VALUES (20250108000000024, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202501080000003,\"groupId\":0,\"enabled\":true,\"createTime\":\"2025-01-08 09:12\",\"paramELs\":[],\"userId\":1}', '', 0, '', '2025-01-08 09:12:12');
+INSERT INTO `sys_oper_log` VALUES (20250108000000025, '定时任务', 3, 'com.ruoyi.cron.api.CronTaskApi.remove()', 'DELETE', 1, 'admin', '', '/system/cron/202501080000003', '127.0.0.1', '内网IP', '{}', '', 0, '', '2025-01-08 09:12:15');
+INSERT INTO `sys_oper_log` VALUES (20250108000000026, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202501080000004,\"taskId\":\"031b690bda610eb6b0baf12f10c82406\",\"groupId\":0,\"enabled\":true,\"createTime\":\"2025-01-08 14:51\",\"paramELs\":[\"0\",\"null\",\"null\"],\"userId\":1}', '', 0, '', '2025-01-08 14:51:39');
+INSERT INTO `sys_oper_log` VALUES (20250108000000027, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202501080000005,\"taskId\":\"031b690bda610eb6b0baf12f10c82406\",\"groupId\":0,\"enabled\":true,\"createTime\":\"2025-01-08 15:00\",\"paramELs\":[],\"userId\":1,\"cron\":\"\"}', '', 0, '', '2025-01-08 15:00:13');
+INSERT INTO `sys_oper_log` VALUES (20250108000000028, '定时任务', 3, 'com.ruoyi.cron.api.CronTaskApi.remove()', 'DELETE', 1, 'admin', '', '/system/cron/202501080000005', '127.0.0.1', '内网IP', '{}', '', 0, '', '2025-01-08 15:00:20');
+INSERT INTO `sys_oper_log` VALUES (20250108000000029, '定时任务', 3, 'com.ruoyi.cron.api.CronTaskApi.remove()', 'DELETE', 1, 'admin', '', '/system/cron/202501080000004', '127.0.0.1', '内网IP', '{}', '', 0, '', '2025-01-08 15:00:35');
+INSERT INTO `sys_oper_log` VALUES (20250108000000030, '定时任务', 1, 'com.ruoyi.cron.api.CronTaskApi.add()', 'POST', 1, 'admin', '', '/system/cron/', '127.0.0.1', '内网IP', '{\"id\":202501080000006,\"taskId\":\"031b690bda610eb6b0baf12f10c82406\",\"groupId\":0,\"enabled\":true,\"createTime\":\"2025-01-08 15:02\",\"paramELs\":[\"7\",\"null\",\"null\"],\"userId\":1}', '', 0, '', '2025-01-08 15:02:25');
-- ----------------------------
-- Table structure for sys_post
@@ -631,7 +709,7 @@ CREATE TABLE `sys_user` (
-- ----------------------------
-- Records of sys_user
-- ----------------------------
-INSERT INTO `sys_user` VALUES (1, 100, NULL, 'admin', '超级管理员', 'sys_user', 'admin@evolvecloud.cn', '13888888888', '1', '', '$2a$10$.ja7BDq5b8jxd6snbRvz8eAmg0loaDb05LR6SpR2F42huJb7GaOD6', '0', '0', '127.0.0.1', '2024-10-24 14:27:40', 'admin', '2024-01-03 10:35:07', 'admin', '2024-10-24 14:27:40', '管理员');
+INSERT INTO `sys_user` VALUES (1, 100, NULL, 'admin', '超级管理员', 'sys_user', 'admin@evolvecloud.cn', '13888888888', '1', '', '$2a$10$.ja7BDq5b8jxd6snbRvz8eAmg0loaDb05LR6SpR2F42huJb7GaOD6', '0', '0', '127.0.0.1', '2025-02-10 11:31:58', 'admin', '2024-01-03 10:35:07', 'admin', '2025-02-10 11:31:58', '管理员');
-- ----------------------------
-- Table structure for sys_user_post