From 41354cfd359a67c339a38ce830bf67176413d3c6 Mon Sep 17 00:00:00 2001
From: xuxueli <931591021@qq.com>
Date: Sat, 15 Nov 2025 19:55:54 +0800
Subject: [PATCH 01/20] =?UTF-8?q?chore(deps):=20=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=E5=B9=B6=E9=87=8D=E6=9E=84?=
=?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=8C=85=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 将 JUnit Jupiter 版本从 5.14.0 升级到 6.0.1
- 将 Spring 版本从 6.2.12 更新至 6.2.13
- 将 MySQL Connector/J 版本从 9.4.0 升级到 9.5.0
- 将 Spring AI 版本从 1.0.3 升级到 1.1.0
- 将 Dify Java Client 版本从 1.1.9 升级到 1.2.0
- 重命名测试类包名:adminbiz 和 executorbiz 包改为 openapi
- 在 FramelessApplicationTest 中替换 System.out 为 SLF4J 日志记录
- 添加 JUnit Platform Launcher 依赖(被注释)
- 更新 OllamaOptions 类引用为 OllamaChatOptions
- 为简单聊天和流式聊天接口添加默认输入值及模型配置选项
---
pom.xml | 6 +++---
.../job/{adminbiz => openapi}/AdminBizTest.java | 2 +-
.../{executorbiz => openapi}/ExecutorBizTest.java | 2 +-
.../xxl-job-executor-sample-frameless/pom.xml | 6 ++++++
.../frameless/test/FramelessApplicationTest.java | 13 +++++++++++--
.../xxl-job-executor-sample-springboot-ai/pom.xml | 4 ++--
.../job/executor/controller/IndexController.java | 14 +++++++-------
.../com/xxl/job/executor/jobhandler/AIXxlJob.java | 4 ++--
8 files changed, 33 insertions(+), 18 deletions(-)
rename xxl-job-admin/src/test/java/com/xxl/job/{adminbiz => openapi}/AdminBizTest.java (98%)
rename xxl-job-admin/src/test/java/com/xxl/job/{executorbiz => openapi}/ExecutorBizTest.java (99%)
diff --git a/pom.xml b/pom.xml
index 00c69570..37f57495 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,17 +32,17 @@
0.9.0
2.0.17
- 5.14.0
+ 6.0.1
3.0.0
3.5.7
- 6.2.12
+ 6.2.13
3.0.5
- 9.4.0
+ 9.5.0
4.2.7.Final
diff --git a/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java
similarity index 98%
rename from xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java
rename to xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java
index b9aa23e6..be1dc508 100644
--- a/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java
+++ b/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java
@@ -1,4 +1,4 @@
-package com.xxl.job.adminbiz;
+package com.xxl.job.openapi;
import com.xxl.job.core.constant.RegistType;
import com.xxl.job.core.openapi.AdminBiz;
diff --git a/xxl-job-admin/src/test/java/com/xxl/job/executorbiz/ExecutorBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/openapi/ExecutorBizTest.java
similarity index 99%
rename from xxl-job-admin/src/test/java/com/xxl/job/executorbiz/ExecutorBizTest.java
rename to xxl-job-admin/src/test/java/com/xxl/job/openapi/ExecutorBizTest.java
index e095ac36..cdde86ef 100644
--- a/xxl-job-admin/src/test/java/com/xxl/job/executorbiz/ExecutorBizTest.java
+++ b/xxl-job-admin/src/test/java/com/xxl/job/openapi/ExecutorBizTest.java
@@ -1,4 +1,4 @@
-package com.xxl.job.executorbiz;
+package com.xxl.job.openapi;
import com.xxl.job.core.constant.Const;
import com.xxl.job.core.openapi.ExecutorBiz;
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml
index 46010b73..f0b2ea6f 100644
--- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml
+++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml
@@ -31,6 +31,12 @@
${junit-jupiter.version}
test
+
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java
index 1f9be9a9..1446c51c 100644
--- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java
+++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java
@@ -1,12 +1,21 @@
package com.xxl.job.executor.sample.frameless.test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import org.junit.platform.commons.annotation.Testable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+@Testable
public class FramelessApplicationTest {
+ private static final Logger logger = LoggerFactory.getLogger(FramelessApplicationTest.class);
@Test
- public void test(){
- System.out.println("111");
+ @DisplayName("test1")
+ public void test1(){
+ logger.info("111");
+ Assertions.assertNull( null);
}
}
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml
index 9581fe49..01b5abef 100644
--- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml
+++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml
@@ -16,8 +16,8 @@
https://www.xuxueli.com/
- 1.0.3
- 1.1.9
+ 1.1.0
+ 1.2.0
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java
index af5f2cd9..903c3efc 100644
--- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java
+++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java
@@ -18,7 +18,7 @@ import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.ollama.OllamaChatModel;
-import org.springframework.ai.ollama.api.OllamaOptions;
+import org.springframework.ai.ollama.api.OllamaChatOptions;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@@ -57,20 +57,20 @@ public class IndexController {
*/
@GetMapping("/chat/simple")
@ResponseBody
- public String simpleChat(@RequestParam(value = "input") String input) {
+ public String simpleChat(@RequestParam(value = "input", required = false, defaultValue = "介绍你自己") String input) {
// build chat-client
ChatClient ollamaChatClient = ChatClient
.builder(ollamaChatModel)
- .defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build())
- .defaultAdvisors(SimpleLoggerAdvisor.builder().build())
+ .defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build()) // add memory
+ .defaultAdvisors(SimpleLoggerAdvisor.builder().build()) // add logger
+ .defaultOptions(OllamaChatOptions.builder().model(modle).build()) // assign model
.build();
// call ollama
String response = ollamaChatClient
.prompt(prompt)
.user(input)
- .options(OllamaOptions.builder().model(modle).build())
.call()
.content();
@@ -82,7 +82,7 @@ public class IndexController {
* ChatClient 流式调用
*/
@GetMapping("/chat/stream")
- public Flux streamChat(HttpServletResponse response, @RequestParam(value = "input") String input) {
+ public Flux streamChat(HttpServletResponse response, @RequestParam(value = "input", required = false, defaultValue = "介绍你自己") String input) {
response.setCharacterEncoding("UTF-8");
// build chat-client
@@ -90,13 +90,13 @@ public class IndexController {
.builder(ollamaChatModel)
.defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build())
.defaultAdvisors(SimpleLoggerAdvisor.builder().build())
+ .defaultOptions(OllamaChatOptions.builder().model(modle).build())
.build();
// call ollama
return ollamaChatClient
.prompt(prompt)
.user(input)
- .options(OllamaOptions.builder().model(modle).build())
.stream()
.content();
}
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
index bd7c6589..5ba22f89 100644
--- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
+++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
@@ -14,7 +14,7 @@ import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.ollama.OllamaChatModel;
-import org.springframework.ai.ollama.api.OllamaOptions;
+import org.springframework.ai.ollama.api.OllamaChatOptions;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@@ -86,13 +86,13 @@ public class AIXxlJob {
.builder(ollamaChatModel)
.defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build())
.defaultAdvisors(SimpleLoggerAdvisor.builder().build())
+ .defaultOptions(OllamaChatOptions.builder().model(ollamaParam.getModel()).build())
.build();
// call ollama
String response = ollamaChatClient
.prompt(ollamaParam.getPrompt())
.user(ollamaParam.getInput())
- .options(OllamaOptions.builder().model(ollamaParam.getModel()).build())
.call()
.content();
From 08696b57156bfab2e3441fbe0a29a4753b6fb2e2 Mon Sep 17 00:00:00 2001
From: xuxueli <931591021@qq.com>
Date: Sat, 15 Nov 2025 23:25:58 +0800
Subject: [PATCH 02/20] =?UTF-8?q?feat(admin):=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=A1=E8=AE=A1=E6=97=A5=E5=BF=97=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在JobCodeController和XxlJobServiceImpl中添加操作日志记录
- 记录任务新建、更新、删除、启停、触发及GLUE代码更新等敏感操作
- 日志包含操作人、操作类型和操作内容,便于安全审计和问题追溯
- 优化字符串判空逻辑,使用StringTool工具类替代手动判断
- 更新文档,增加审计日志特性说明和接入公司名单
- 调整HTTP任务参数示例展示方式,提升可读性
- 重构部分校验逻辑,提高代码健壮性和可维护性
---
README.md | 15 +++++
doc/XXL-JOB官方文档.md | 52 ++++++++++++----
.../controller/biz/JobCodeController.java | 12 +++-
.../admin/service/impl/XxlJobServiceImpl.java | 61 +++++++++++++------
4 files changed, 105 insertions(+), 35 deletions(-)
diff --git a/README.md b/README.md
index c400f57b..47e5fb9d 100644
--- a/README.md
+++ b/README.md
@@ -113,6 +113,7 @@ XXL-JOB 是一个开源且免费项目,其正在进行的开发完全得益于
- 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
- 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
- 37、AI任务:原生提供AI执行器,并内置多个AI任务Handler,与spring-ai、ollama、dify等集成打通,支持快速开发AI类任务。
+- 38、审计日志:记录任务操作敏感信息,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题。
## Development
于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
@@ -845,6 +846,20 @@ XXL-JOB 是一个开源且免费项目,其正在进行的开发完全得益于
- 691、联通云
- 692、北京爱话本科技有限公司
- 693、北京起创科技有限公司
+ - 694、平安证券【平安证券】
+ - 695、合肥中科类脑智能技术有限公司
+ - 696、南京同仁堂健康产业有限公司【同仁堂】
+ - 697、铜仁市碧江区智惠加油站
+ - 698、惟客数据
+ - 699、凤凰新闻【凤凰新闻】
+ - 700、深圳王力智能
+ - 701、返利网数字科技股份有限公司
+ - 702、上海阜能信息科技有限公司
+ - 703、深圳市极能超电数字科技有限公司
+ - 704、海目星激光科技集团股份有限公司
+ - 705、深圳市极能超电数字科技有限公司
+ - 706、安克创新科技股份有限公司【安克】
+ - 707、大庆点神科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md
index 97e407a8..2035d81c 100644
--- a/doc/XXL-JOB官方文档.md
+++ b/doc/XXL-JOB官方文档.md
@@ -58,6 +58,8 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
- 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
- 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
- 37、AI任务:原生提供AI执行器,并内置多个AI任务Handler,与spring-ai、ollama、dify等集成打通,支持快速开发AI类任务。
+- 38、审计日志:记录任务操作敏感信息,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题。
+
### 1.4 发展
于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
@@ -788,6 +790,20 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
- 691、联通云
- 692、北京爱话本科技有限公司
- 693、北京起创科技有限公司
+ - 694、平安证券【平安证券】
+ - 695、合肥中科类脑智能技术有限公司
+ - 696、南京同仁堂健康产业有限公司【同仁堂】
+ - 697、铜仁市碧江区智惠加油站
+ - 698、惟客数据
+ - 699、凤凰新闻【凤凰新闻】
+ - 700、深圳王力智能
+ - 701、返利网数字科技股份有限公司
+ - 702、上海阜能信息科技有限公司
+ - 703、深圳市极能超电数字科技有限公司
+ - 704、海目星激光科技集团股份有限公司
+ - 705、深圳市极能超电数字科技有限公司
+ - 706、安克创新科技股份有限公司【安克】
+ - 707、大庆点神科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
@@ -2606,11 +2622,11 @@ public void execute() {
- 10、【修复】脚本任务process销毁逻辑优化,解决风险情况下脚本进程无法终止问题;
- 11、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性;
- 12、【修复】合并PR-2369,修复脚本任务参数取值问题;
-- 13、【强化】通用HTTP任务(httpJobHandler)强化,支持更丰富请求参数设置,完整参数示例如下:
+- 13、【强化】通用HTTP任务(httpJobHandler)强化,支持更丰富请求参数设置,完整参数示例如下:
- 完整参数示例参考:
-
+ 完整参数示例参考:
+
```
{
"url": "http://www.baidu.com",
@@ -2636,15 +2652,19 @@ public void execute() {
- 16、【重构】规范API交互协议,通用响应结构体调整为Response,调度中心API统一为Response封装数据;
(注意:响应结构体从ReturnT升级为Response,其中属性值“content”会调整为“data”,取值逻辑需注意)
- 17、【升级】Http通讯组件升级,基于接口代理方式重构通讯组件,提升组件性能及扩展性;
-- 18、【ING】UI框架重构升级,提升交互体验;
-- 19、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率;
+- 18、【新增】任务审计日志,记录任务操作敏感日志信息,如任务新建/更新/删除/启停/触发以及GLUE代码更新等,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题等。
+ (当前任务审计日志以Info级别输出在系统日志中,可通过关键词 "xxl-job operation log:" 检索过滤)
+- 19、【ING】UI框架重构升级,提升交互体验;
+- 20、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率;
+
### TODO LIST
- 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。
- 2、任务优先级:调度与执行阶段按照优先级分配资源。
- 3、多数据库支持,DAO层通过JPA实现,不限制数据库类型。
-- 4、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件;
+- 4、OpenApi:
+ - 执行器Log文件清理:支持调度中心远程删除执行器中指定任务的Log文件;
- 5、性能优化:任务、执行器数据全量本地缓存;新增消息表广播通知;
- 6、DAG流程任务
- 子任务:废弃
@@ -2653,10 +2673,8 @@ public void execute() {
- 分片任务:全部完成后才会出发后置节点;
- 配置并列的"a-b、b-c"路径列表,构成串行、并行、dag任务流程,"dagre-d3"绘图;任务依赖,流程图,子任务+会签任务,各节点日志;支持根据成功、失败选择分支;
- 7、任务标签:方便搜索;
-- 8、告警增强:
- - 邮件告警:支持自定义标题、模板格式;
- - webhook告警:支持自定义告警URL、请求体格式;
-- 9、安全强化:AccessToken动态生成、动态启停;控制调度、回调;
+- 8、GLUE 模式 Web Ide 版本对比功能;
+- 9、自定义失败重试时间间隔;
- 10、任务导入导出工具,灵活支持版本升级、迁移等场景。
- 11、任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。
- 普通任务:只记录一条主任务;
@@ -2664,13 +2682,21 @@ public void execute() {
- 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。
- 12、分片任务:全部完成后才会出发后置节点;
- 13、日期过滤:支持多个时间段排除;
-- 13、GLUE 模式 Web Ide 版本对比功能;
- 14、提供执行器Docker镜像;
- 15、脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
- 17、批量调度:调度请求入queue,调度线程批量获取调度请求并发起远程调度;提高线程效率;
- 18、执行器端口复用,复用容器端口提供通讯服务;
-- 19、自定义失败重试时间间隔;
-- 20、安全功能增强,通讯加密参数改用加密数据避免AccessToken明文, 降低token泄漏风险;
+- 19、安全功能增强,通讯加密参数改用加密数据避免AccessToken明文, 降低token泄漏风险;
+- 20、告警增强:
+ - 邮件告警:支持自定义标题、模板格式;
+ - webhook告警:支持自定义告警URL、请求体格式;
+- 21、公共告警策略:执行器维度设置多告警策略,任务勾选启用;待评估任务或执行器维度;
+- 20、日志策略:
+ - 调度日志:全局配置:废弃; 新增“调度日志策略”:任务维度自定义,保留3天、7天、1个月、3个月、一年、永久;
+ - 执行日志:新增“执行RollingLog开关”:任务维度自定义,支持:RollingLog、普通日志(slf4j输出)、关闭(不输出);
+- 21、AccessToken:废弃全局配置;支持在线管理,动态生成、动态启停;
+
+
## 八、其他
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java
index 7097d3e4..ffb4b4f6 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java
@@ -7,10 +7,14 @@ import com.xxl.job.admin.model.XxlJobLogGlue;
import com.xxl.job.admin.util.I18nUtil;
import com.xxl.job.admin.util.JobGroupPermissionUtil;
import com.xxl.job.core.glue.GlueTypeEnum;
+import com.xxl.sso.core.model.LoginInfo;
import com.xxl.tool.core.StringTool;
+import com.xxl.tool.gson.GsonTool;
import com.xxl.tool.response.Response;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -27,6 +31,7 @@ import java.util.List;
@Controller
@RequestMapping("/jobcode")
public class JobCodeController {
+ private static final Logger logger = LoggerFactory.getLogger(JobCodeController.class);
@Resource
private XxlJobInfoMapper xxlJobInfoMapper;
@@ -79,7 +84,7 @@ public class JobCodeController {
}
// valid jobGroup permission
- JobGroupPermissionUtil.validJobGroupPermission(request, existsJobInfo.getJobGroup());
+ LoginInfo loginInfo = JobGroupPermissionUtil.validJobGroupPermission(request, existsJobInfo.getJobGroup());
// update new code
existsJobInfo.setGlueSource(glueSource);
@@ -103,7 +108,10 @@ public class JobCodeController {
// remove code backup more than 30
xxlJobLogGlueMapper.removeOld(existsJobInfo.getId(), 30);
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobcode-update", GsonTool.toJson(xxlJobLogGlue));
return Response.ofSuccess();
}
-
+
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
index f10a6dbd..40cf80ce 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
@@ -18,6 +18,8 @@ import com.xxl.job.core.constant.ExecutorBlockStrategyEnum;
import com.xxl.job.core.glue.GlueTypeEnum;
import com.xxl.sso.core.model.LoginInfo;
import com.xxl.tool.core.DateTool;
+import com.xxl.tool.core.StringTool;
+import com.xxl.tool.gson.GsonTool;
import com.xxl.tool.response.PageModel;
import com.xxl.tool.response.Response;
import jakarta.annotation.Resource;
@@ -70,10 +72,10 @@ public class XxlJobServiceImpl implements XxlJobService {
if (group == null) {
return Response.ofFail (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup"));
}
- if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {
+ if (StringTool.isBlank(jobInfo.getJobDesc())) {
return Response.ofFail ( (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
}
- if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {
+ if (StringTool.isBlank(jobInfo.getAuthor())) {
return Response.ofFail ( (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
}
@@ -91,7 +93,7 @@ public class XxlJobServiceImpl implements XxlJobService {
return Response.ofFail ( (I18nUtil.getString("schedule_type")) );
}
try {
- int fixSecond = Integer.valueOf(jobInfo.getScheduleConf());
+ int fixSecond = Integer.parseInt(jobInfo.getScheduleConf());
if (fixSecond < 1) {
return Response.ofFail ( (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) );
}
@@ -104,7 +106,7 @@ public class XxlJobServiceImpl implements XxlJobService {
if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {
return Response.ofFail ( (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) );
}
- if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) {
+ if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && StringTool.isBlank(jobInfo.getExecutorHandler()) ) {
return Response.ofFail ( (I18nUtil.getString("system_please_input")+"JobHandler") );
}
// 》fix "\r" in shell
@@ -124,10 +126,10 @@ public class XxlJobServiceImpl implements XxlJobService {
}
// 》ChildJobId valid
- if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {
+ if (StringTool.isNotBlank(jobInfo.getChildJobId())) {
String[] childJobIds = jobInfo.getChildJobId().split(",");
for (String childJobIdItem: childJobIds) {
- if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {
+ if (StringTool.isNotBlank(childJobIdItem) && StringTool.isNumeric(childJobIdItem)) {
XxlJobInfo childJobInfo = xxlJobInfoMapper.loadById(Integer.parseInt(childJobIdItem));
if (childJobInfo==null) {
return Response.ofFail (
@@ -165,26 +167,21 @@ public class XxlJobServiceImpl implements XxlJobService {
return Response.ofFail ( (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
}
- return Response.ofSuccess(String.valueOf(jobInfo.getId()));
- }
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-save", GsonTool.toJson(jobInfo));
- private boolean isNumeric(String str){
- try {
- int result = Integer.valueOf(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
+ return Response.ofSuccess(String.valueOf(jobInfo.getId()));
}
@Override
public Response update(XxlJobInfo jobInfo, LoginInfo loginInfo) {
// valid base
- if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {
+ if (StringTool.isBlank(jobInfo.getJobDesc())) {
return Response.ofFail ( (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
}
- if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {
+ if (StringTool.isBlank(jobInfo.getAuthor())) {
return Response.ofFail ( (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
}
@@ -202,7 +199,7 @@ public class XxlJobServiceImpl implements XxlJobService {
return Response.ofFail ( (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) );
}
try {
- int fixSecond = Integer.valueOf(jobInfo.getScheduleConf());
+ int fixSecond = Integer.parseInt(jobInfo.getScheduleConf());
if (fixSecond < 1) {
return Response.ofFail ( (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) );
}
@@ -223,10 +220,10 @@ public class XxlJobServiceImpl implements XxlJobService {
}
// 》ChildJobId valid
- if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {
+ if (StringTool.isNotBlank(jobInfo.getChildJobId())) {
String[] childJobIds = jobInfo.getChildJobId().split(",");
for (String childJobIdItem: childJobIds) {
- if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {
+ if (StringTool.isNotBlank(childJobIdItem) && StringTool.isNumeric(childJobIdItem)) {
// parse child
int childJobId = Integer.parseInt(childJobIdItem);
if (childJobId == jobInfo.getId()) {
@@ -310,6 +307,10 @@ public class XxlJobServiceImpl implements XxlJobService {
exists_jobInfo.setUpdateTime(new Date());
xxlJobInfoMapper.update(exists_jobInfo);
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-update", GsonTool.toJson(exists_jobInfo));
+
return Response.ofSuccess();
}
@@ -329,6 +330,11 @@ public class XxlJobServiceImpl implements XxlJobService {
xxlJobInfoMapper.delete(id);
xxlJobLogMapper.delete(id);
xxlJobLogGlueMapper.deleteByJobId(id);
+
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-remove", id);
+
return Response.ofSuccess();
}
@@ -372,6 +378,11 @@ public class XxlJobServiceImpl implements XxlJobService {
xxlJobInfo.setUpdateTime(new Date());
xxlJobInfoMapper.update(xxlJobInfo);
+
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-start", id);
+
return Response.ofSuccess();
}
@@ -395,6 +406,11 @@ public class XxlJobServiceImpl implements XxlJobService {
xxlJobInfo.setUpdateTime(new Date());
xxlJobInfoMapper.update(xxlJobInfo);
+
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-stop", id);
+
return Response.ofSuccess();
}
@@ -417,6 +433,11 @@ public class XxlJobServiceImpl implements XxlJobService {
}
XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(jobId, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList);
+
+ // write operation log
+ logger.info(">>>>>>>>>>> xxl-job operation log: operator = {}, type = {}, content = {}",
+ loginInfo.getUserName(), "jobinfo-trigger", jobId);
+
return Response.ofSuccess();
}
From 66459d3f8d4e1e6bd27f1f2b305d75a978badbde Mon Sep 17 00:00:00 2001
From: xuxueli <931591021@qq.com>
Date: Sun, 16 Nov 2025 01:07:12 +0800
Subject: [PATCH 03/20] update doc
---
doc/XXL-JOB官方文档.md | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md
index 2035d81c..67f2f458 100644
--- a/doc/XXL-JOB官方文档.md
+++ b/doc/XXL-JOB官方文档.md
@@ -2611,14 +2611,14 @@ public void execute() {
### 7.41 版本 v3.2.1 Release Notes[规划中]
- 1、【新增】执行器新增“任务扫描排除路径”配置项(xxl.job.executor.excludedpackage),任务扫描时忽略指定包路径下的Bean;支持配置多个包路径、逗号分隔;
-- 2、【优化】执行器任务Bean扫描逻辑优化,完善懒加载Bean检测及过滤机制;
-- 3、【优化】调度时间轮强化,保障不重不漏:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度;
-- 4、【优化】任务调度中心调度锁逻辑优化,事务SQL下沉至Mapper层统一管理,并增加测试用例,提升代码可读性以及可维护性;
+- 2、【优化】执行器任务Bean扫描逻辑调整,优化懒加载Bean检测及过滤机制,避免提前初始化类问题;
+- 3、【优化】调度时间轮组件强化,保障不重不漏:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度;
+- 4、【优化】任务调度锁逻辑优化,事务SQL下沉至Mapper层统一管理,并增加测试用例,提升代码可读性以及可维护性;
- 5、【优化】报表统计SQL优化,修复小概率情况下查询null值问题;报表初始化SQL优化,修复小概率情况增改竞争问题;
- 6、【优化】任务回调失败日志读写磁盘逻辑优化,解决极端情况下大文件读写内存问题;
- 7、【重构】调度过期策略、调度类型策略逻辑重构,代码组件化拆分并完善日志,提升健壮性及可维护性;
-- 8、【重构】任务调度中心底层组件重构,组件初始化以及销毁逻辑统一处理,任务触发及和回调逻辑优化,避免资源泄漏风险;
-- 9、【重构】任务调度中心底层组件模块化拆分,移除组件单例以及静态代码逻辑,提升组件可维护性;
+- 8、【重构】调度中心底层组件重构,组件初始化以及销毁逻辑统一处理,任务触发及和回调逻辑优化,避免资源泄漏风险;
+- 9、【重构】调度中心底层组件模块化拆分,移除组件单例以及静态代码逻辑,提升组件可维护性;
- 10、【修复】脚本任务process销毁逻辑优化,解决风险情况下脚本进程无法终止问题;
- 11、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性;
- 12、【修复】合并PR-2369,修复脚本任务参数取值问题;
@@ -2654,8 +2654,9 @@ public void execute() {
- 17、【升级】Http通讯组件升级,基于接口代理方式重构通讯组件,提升组件性能及扩展性;
- 18、【新增】任务审计日志,记录任务操作敏感日志信息,如任务新建/更新/删除/启停/触发以及GLUE代码更新等,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题等。
(当前任务审计日志以Info级别输出在系统日志中,可通过关键词 "xxl-job operation log:" 检索过滤)
-- 19、【ING】UI框架重构升级,提升交互体验;
-- 20、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率;
+- 19、【升级】升级多项maven依赖至较新版本,如 springboot、spring、mybatis、xxl-sso 等;
+- 20、【ING】UI框架重构升级,提升交互体验;
+- 21、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率;
From 896feaa128e07c53fd48387bb55f2257cccfba40 Mon Sep 17 00:00:00 2001
From: xuxueli <931591021@qq.com>
Date: Sun, 16 Nov 2025 15:42:01 +0800
Subject: [PATCH 04/20] =?UTF-8?q?feat(admin):=20=E9=87=8D=E6=9E=84?=
=?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E5=8C=85=E7=BB=93=E6=9E=84=E5=B9=B6?=
=?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=9B=BD=E9=99=85=E5=8C=96=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 将 IndexController 和 LoginController 移至 base 包下统一管理
- 为菜单资源创建新的 DTO 类 XxlBootResourceDTO 支持权限控制
- 增强 I18nUtil 工具类实现 InitializingBean 接口以便初始化枚举标题
- 更新多语言配置文件,增加系统操作相关词条及帮助文档链接
- 调整用户与任务组控制器中的请求映射路径和参数验证逻辑
- 修改视图返回路径适配新的包结构调整
- 删除旧的 CommonDataInterceptor 并通过 FreeMarker 配置共享静态模型
- 优化登录逻辑使用 Cookie 进行 SSO 校验并支持密码修改功能
- 统一异常页面处理方式提升用户体验
- 完善日期绑定编辑器确保前端传参格式正确解析
---
.../job/admin/controller/IndexController.java | 74 -
.../controller/base/IndexController.java | 127 ++
.../{login => base}/LoginController.java | 57 +-
.../controller/biz/JobGroupController.java | 20 +-
.../controller/biz/JobUserController.java | 24 +-
.../admin/model/dto/XxlBootResourceDTO.java | 185 ++
.../config/XxlJobAdminBootstrap.java | 15 +-
.../java/com/xxl/job/admin/util/I18nUtil.java | 89 +-
.../admin/util/old/CommonDataInterceptor.java | 39 +
.../interceptor/CommonDataInterceptor.java | 39 -
.../main/resources/i18n/message_en.properties | 46 +-
.../resources/i18n/message_zh_CN.properties | 46 +-
.../resources/i18n/message_zh_TC.properties | 46 +-
.../bower_components/PACE/pace.min.js | 2 -
.../PACE/themes/blue/pace-theme-flash.css | 77 -
.../bower_components/ckeditor/ckeditor.js | 1236 ++++++++++
.../bower_components/ckeditor/config.js | 37 +
.../bower_components/ckeditor/contents.css | 208 ++
.../bower_components/ckeditor/lang/zh-cn.js | 5 +
.../ckeditor/plugins/image/dialogs/image.js | 44 +
.../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes
.../ckeditor/plugins/link/dialogs/anchor.js | 8 +
.../ckeditor/plugins/link/dialogs/link.js | 30 +
.../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 752 bytes
.../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes
.../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes
.../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes
.../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes
.../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes
.../ckeditor/plugins/scayt/dialogs/dialog.css | 23 +
.../ckeditor/plugins/scayt/dialogs/options.js | 32 +
.../plugins/scayt/dialogs/toolbar.css | 71 +
.../plugins/scayt/skins/moono-lisa/scayt.css | 25 +
.../plugins/specialchar/dialogs/lang/zh-cn.js | 9 +
.../specialchar/dialogs/specialchar.js | 14 +
.../ckeditor/plugins/table/dialogs/table.js | 21 +
.../tableselection/styles/tableselection.css | 36 +
.../plugins/wsc/skins/moono-lisa/wsc.css | 43 +
.../ckeditor/skins/moono-lisa/dialog.css | 5 +
.../ckeditor/skins/moono-lisa/dialog_ie.css | 5 +
.../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 +
.../skins/moono-lisa/dialog_iequirks.css | 5 +
.../ckeditor/skins/moono-lisa/editor.css | 5 +
.../skins/moono-lisa/editor_gecko.css | 5 +
.../ckeditor/skins/moono-lisa/editor_ie.css | 5 +
.../ckeditor/skins/moono-lisa/editor_ie8.css | 5 +
.../skins/moono-lisa/editor_iequirks.css | 5 +
.../ckeditor/skins/moono-lisa/icons.png | Bin 0 -> 10175 bytes
.../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 0 -> 33431 bytes
.../skins/moono-lisa/images/arrow.png | Bin 0 -> 191 bytes
.../skins/moono-lisa/images/close.png | Bin 0 -> 615 bytes
.../skins/moono-lisa/images/hidpi/close.png | Bin 0 -> 1238 bytes
.../moono-lisa/images/hidpi/lock-open.png | Bin 0 -> 1071 bytes
.../skins/moono-lisa/images/hidpi/lock.png | Bin 0 -> 1062 bytes
.../skins/moono-lisa/images/hidpi/refresh.png | Bin 0 -> 1623 bytes
.../skins/moono-lisa/images/lock-open.png | Bin 0 -> 511 bytes
.../ckeditor/skins/moono-lisa/images/lock.png | Bin 0 -> 506 bytes
.../skins/moono-lisa/images/refresh.png | Bin 0 -> 757 bytes
.../skins/moono-lisa/images/spinner.gif | Bin 0 -> 2984 bytes
.../ckeditor/skins/moono-lisa/readme.md | 46 +
.../bower_components/ckeditor/styles.js | 137 ++
.../css/dataTables.bootstrap.min.css | 1 -
.../js/dataTables.bootstrap.min.js | 8 -
.../js/jquery.dataTables.min.js | 166 --
.../bower_components/select2/select2.min.css | 1 +
.../bower_components/select2/select2.min.js | 2 +
.../static/biz/common/admin.setting.js | 421 ++++
.../resources/static/biz/common/admin.tab.css | 218 ++
.../resources/static/biz/common/admin.tab.js | 580 +++++
.../static/biz/common/admin.table.js | 476 ++++
.../resources/static/biz/common/admin.util.js | 38 +
.../src/main/resources/static/js/common.1.js | 181 --
.../src/main/resources/static/js/index.js | 207 --
.../resources/static/js/jobgroup.index.1.js | 378 ---
.../resources/static/js/joblog.detail.1.js | 89 -
.../resources/static/js/joblog.index.1.js | 377 ---
.../src/main/resources/static/js/login.1.js | 66 -
.../main/resources/static/js/user.index.1.js | 336 ---
.../bootstrap-table/bootstrap-table.min.css | 10 +
.../bootstrap-table/bootstrap-table.min.js | 10 +
.../treegrid/bootstrap-table-treegrid.min.js | 10 +
.../locale/bootstrap-table-en-US.min.js | 10 +
.../locale/bootstrap-table-zh-CN.min.js | 10 +
.../locale/bootstrap-table-zh-TW.min.js | 10 +
.../plugins/fullscreen/jquery.fullscreen.js | 180 ++
.../plugins/jquery-treegrid/img/collapse.png | Bin 0 -> 2886 bytes
.../plugins/jquery-treegrid/img/expand.png | Bin 0 -> 2894 bytes
.../jquery-treegrid/jquery.treegrid.css | 6 +
.../jquery-treegrid/jquery.treegrid.min.js | 2 +
.../static/plugins/jquery/jquery.cookie.js | 117 -
.../static/plugins/nprogress/nprogress.css | 74 +
.../static/plugins/nprogress/nprogress.js | 476 ++++
.../zTree/css/metroStyle/img/line_conn.png | Bin 0 -> 933 bytes
.../zTree/css/metroStyle/img/loading.gif | Bin 0 -> 381 bytes
.../zTree/css/metroStyle/img/metro.gif | Bin 0 -> 4679 bytes
.../zTree/css/metroStyle/img/metro.png | Bin 0 -> 5283 bytes
.../zTree/css/metroStyle/metroStyle.css | 96 +
.../plugins/zTree/js/jquery.ztree.core.js | 2019 +++++++++++++++++
.../plugins/zTree/js/jquery.ztree.excheck.js | 652 ++++++
.../resources/templates/base/dashboard.ftl | 337 +++
.../main/resources/templates/base/help.ftl | 41 +
.../main/resources/templates/base/index.ftl | 188 ++
.../main/resources/templates/base/login.ftl | 125 +
.../resources/templates/biz/group.list.ftl | 385 ++++
.../resources/templates/biz/user.list.ftl | 350 +++
.../templates/common/common.macro.ftl | 280 +--
.../src/main/resources/templates/help.ftl | 68 -
.../src/main/resources/templates/index.ftl | 157 --
.../templates/jobgroup/jobgroup.index.ftl | 216 --
.../src/main/resources/templates/login.ftl | 53 -
.../resources/templates/user/user.index.ftl | 210 --
.../{jobcode => v2}/jobcode.index.ftl | 0
.../{jobinfo => v2}/jobinfo.index.ftl | 0
.../v2/static2}/js/jobcode.index.1.js | 0
.../v2/static2}/js/jobinfo.index.1.js | 0
115 files changed, 9398 insertions(+), 3195 deletions(-)
delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/controller/base/IndexController.java
rename xxl-job-admin/src/main/java/com/xxl/job/admin/controller/{login => base}/LoginController.java (63%)
create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/model/dto/XxlBootResourceDTO.java
create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/CommonDataInterceptor.java
delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/web/interceptor/CommonDataInterceptor.java
delete mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js
delete mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/ckeditor.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/config.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/contents.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/lang/zh-cn.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/image/dialogs/image.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/image/images/noimage.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/anchor.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/link.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/images/anchor.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/images/hidpi/anchor.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/magicline/images/hidpi/icon.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/magicline/images/icon-rtl.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/magicline/images/icon.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/dialog.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/options.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/toolbar.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/skins/moono-lisa/scayt.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/specialchar/dialogs/specialchar.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/table/dialogs/table.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/tableselection/styles/tableselection.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/wsc/skins/moono-lisa/wsc.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_ie.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_ie8.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_iequirks.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_gecko.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_ie.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_ie8.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_iequirks.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/icons.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/icons_hidpi.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/arrow.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/close.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/hidpi/close.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/hidpi/lock.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/hidpi/refresh.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/lock-open.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/lock.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/refresh.png
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/images/spinner.gif
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/readme.md
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/styles.js
delete mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css
delete mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js
delete mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/select2/select2.min.css
create mode 100644 xxl-job-admin/src/main/resources/static/adminlte/bower_components/select2/select2.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/biz/common/admin.setting.js
create mode 100644 xxl-job-admin/src/main/resources/static/biz/common/admin.tab.css
create mode 100644 xxl-job-admin/src/main/resources/static/biz/common/admin.tab.js
create mode 100644 xxl-job-admin/src/main/resources/static/biz/common/admin.table.js
create mode 100644 xxl-job-admin/src/main/resources/static/biz/common/admin.util.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/common.1.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/index.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/joblog.index.1.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/login.1.js
delete mode 100644 xxl-job-admin/src/main/resources/static/js/user.index.1.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.min.css
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/extensions/treegrid/bootstrap-table-treegrid.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/locale/bootstrap-table-en-US.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/bootstrap-table/locale/bootstrap-table-zh-TW.min.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/fullscreen/jquery.fullscreen.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/jquery-treegrid/img/collapse.png
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/jquery-treegrid/img/expand.png
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/jquery-treegrid/jquery.treegrid.css
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/jquery-treegrid/jquery.treegrid.min.js
delete mode 100644 xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.cookie.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/nprogress/nprogress.css
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/nprogress/nprogress.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/img/line_conn.png
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/img/loading.gif
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/img/metro.gif
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/img/metro.png
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/metroStyle.css
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/js/jquery.ztree.core.js
create mode 100644 xxl-job-admin/src/main/resources/static/plugins/zTree/js/jquery.ztree.excheck.js
create mode 100644 xxl-job-admin/src/main/resources/templates/base/dashboard.ftl
create mode 100644 xxl-job-admin/src/main/resources/templates/base/help.ftl
create mode 100644 xxl-job-admin/src/main/resources/templates/base/index.ftl
create mode 100644 xxl-job-admin/src/main/resources/templates/base/login.ftl
create mode 100644 xxl-job-admin/src/main/resources/templates/biz/group.list.ftl
create mode 100644 xxl-job-admin/src/main/resources/templates/biz/user.list.ftl
delete mode 100644 xxl-job-admin/src/main/resources/templates/help.ftl
delete mode 100644 xxl-job-admin/src/main/resources/templates/index.ftl
delete mode 100644 xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl
delete mode 100644 xxl-job-admin/src/main/resources/templates/login.ftl
delete mode 100644 xxl-job-admin/src/main/resources/templates/user/user.index.ftl
rename xxl-job-admin/src/main/resources/templates/{jobcode => v2}/jobcode.index.ftl (100%)
rename xxl-job-admin/src/main/resources/templates/{jobinfo => v2}/jobinfo.index.ftl (100%)
rename xxl-job-admin/src/main/resources/{static => templates/v2/static2}/js/jobcode.index.1.js (100%)
rename xxl-job-admin/src/main/resources/{static => templates/v2/static2}/js/jobinfo.index.1.js (100%)
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
deleted file mode 100644
index 0d138f21..00000000
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.service.XxlJobService;
-import com.xxl.sso.core.annotation.XxlSso;
-import com.xxl.tool.response.Response;
-import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.beans.propertyeditors.CustomDateEditor;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Map;
-
-/**
- * index controller
- * @author xuxueli 2015-12-19 16:13:16
- */
-@Controller
-public class IndexController {
-
- @Resource
- private XxlJobService xxlJobService;
-
-
- @RequestMapping("/")
- public String index(Model model) {
-
- Map dashboardMap = xxlJobService.dashboardInfo();
- model.addAllAttributes(dashboardMap);
-
- return "index";
- }
-
- @RequestMapping("/chartInfo")
- @ResponseBody
- public Response