From f2892a672a495a78562836561f51a2a274cd16aa Mon Sep 17 00:00:00 2001
From: WangBQ
Date: Mon, 29 May 2023 02:26:10 +0000
Subject: [PATCH 001/115] =?UTF-8?q?!349=20=E4=BB=A3=E7=A0=81=E7=94=9F?=
=?UTF-8?q?=E6=88=90=20=E4=BB=8E=E5=AF=B9=E5=BA=94=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E6=BA=90=E5=8A=A0=E8=BD=BD=E8=A1=A8=E7=BB=93=E6=9E=84=E4=BF=A1?=
=?UTF-8?q?=E6=81=AF=20=E5=AD=98=E5=82=A8=E5=88=B0=E4=B8=BB=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=BA=90=20=E5=AE=9E=E7=8E=B0=E5=AD=98=E5=82=A8?=
=?UTF-8?q?=E7=BB=9F=E4=B8=80=20*=20=E6=95=B0=E6=8D=AE=E5=BA=93=E8=84=9A?=
=?UTF-8?q?=E6=9C=AC=E4=BF=AE=E6=94=B9=EF=BC=8Cgen=5Ftable=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0data=5Fname=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=AD=98?=
=?UTF-8?q?=E5=82=A8=E5=AF=B9=E5=BA=94=E6=95=B0=E6=8D=AE=E6=BA=90=E5=90=8D?=
=?UTF-8?q?=E7=A7=B0=20*=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=20?=
=?UTF-8?q?=E4=BB=8E=E5=AF=B9=E5=BA=94=E6=95=B0=E6=8D=AE=E6=BA=90=E5=8A=A0?=
=?UTF-8?q?=E8=BD=BD=E8=A1=A8=E7=BB=93=E6=9E=84=E4=BF=A1=E6=81=AF=20?=
=?UTF-8?q?=E5=AD=98=E5=82=A8=E5=88=B0=E4=B8=BB=E6=95=B0=E6=8D=AE=E6=BA=90?=
=?UTF-8?q?=20=E5=AE=9E=E7=8E=B0=E5=AD=98=E5=82=A8=E7=BB=9F=E4=B8=80(?=
=?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E9=9C=80=E8=A6=81=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E6=95=B0=E6=8D=AE=E6=9D=A5=E6=BA=90?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5)=20https://gitee.com/=E2=80=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/mybatis/helper/DataBaseHelper.java | 10 +++
.../generator/controller/GenController.java | 48 +++++++-----
.../dromara/generator/domain/GenTable.java | 6 ++
.../mapper/GenTableColumnMapper.java | 5 +-
.../generator/mapper/GenTableMapper.java | 3 +
.../service/GenTableServiceImpl.java | 78 +++++++++++--------
.../generator/service/IGenTableService.java | 22 +++---
.../mapper/generator/GenTableMapper.xml | 37 +++++++--
script/sql/oracle/oracle_ry_vue_5.X.sql | 2 +
script/sql/postgres/postgres_ry_vue_5.X.sql | 2 +
script/sql/ry_vue_5.X.sql | 1 +
script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 7 ++
12 files changed, 152 insertions(+), 69 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
index 4da965930..bb20f4b3a 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
@@ -12,6 +12,9 @@ import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
/**
* 数据库助手
@@ -69,4 +72,11 @@ public class DataBaseHelper {
// find_in_set(100 , '0,100,101')
return "find_in_set('%s' , %s) <> 0".formatted(var, var2);
}
+
+ /**
+ * 获取当前加载的数据库名
+ */
+ public static List getDataSourceNameList() {
+ return new ArrayList<>(DS.getDataSources().keySet());
+ }
}
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
index 32133c1af..25c510be3 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil;
import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.helper.DataBaseHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -94,11 +95,11 @@ public class GenController extends BaseController {
@SaCheckPermission("tool:gen:import")
@Log(title = "代码生成", businessType = BusinessType.IMPORT)
@PostMapping("/importTable")
- public R importTableSave(String tables) {
+ public R importTableSave(String tables, String dataName) {
String[] tableNames = Convert.toStrArray(tables);
// 查询表信息
- List tableList = genTableService.selectDbTableListByNames(tableNames);
- genTableService.importGenTable(tableList);
+ List tableList = genTableService.selectDbTableListByNames(tableNames, dataName);
+ genTableService.importGenTable(tableList, dataName);
return R.ok();
}
@@ -142,53 +143,53 @@ public class GenController extends BaseController {
/**
* 生成代码(下载方式)
*
- * @param tableName 表名
+ * @param tableId 表ID
*/
@SaCheckPermission("tool:gen:code")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
- @GetMapping("/download/{tableName}")
- public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException {
- byte[] data = genTableService.downloadCode(tableName);
+ @GetMapping("/download/{tableId}")
+ public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException {
+ byte[] data = genTableService.downloadCode(tableId);
genCode(response, data);
}
/**
* 生成代码(自定义路径)
*
- * @param tableName 表名
+ * @param tableId 表ID
*/
@SaCheckPermission("tool:gen:code")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
- @GetMapping("/genCode/{tableName}")
- public R genCode(@PathVariable("tableName") String tableName) {
- genTableService.generatorCode(tableName);
+ @GetMapping("/genCode/{tableId}")
+ public R genCode(@PathVariable("tableId") Long tableId) {
+ genTableService.generatorCode(tableId);
return R.ok();
}
/**
* 同步数据库
*
- * @param tableName 表名
+ * @param tableId 表ID
*/
@SaCheckPermission("tool:gen:edit")
@Log(title = "代码生成", businessType = BusinessType.UPDATE)
- @GetMapping("/synchDb/{tableName}")
- public R synchDb(@PathVariable("tableName") String tableName) {
- genTableService.synchDb(tableName);
+ @GetMapping("/synchDb/{tableId}")
+ public R synchDb(@PathVariable("tableId") Long tableId) {
+ genTableService.synchDb(tableId);
return R.ok();
}
/**
* 批量生成代码
*
- * @param tables 表名串
+ * @param tableIdStr 表ID串
*/
@SaCheckPermission("tool:gen:code")
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
@GetMapping("/batchGenCode")
- public void batchGenCode(HttpServletResponse response, String tables) throws IOException {
- String[] tableNames = Convert.toStrArray(tables);
- byte[] data = genTableService.downloadCode(tableNames);
+ public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException {
+ String[] tableIds = Convert.toStrArray(tableIdStr);
+ byte[] data = genTableService.downloadCode(tableIds);
genCode(response, data);
}
@@ -204,4 +205,13 @@ public class GenController extends BaseController {
response.setContentType("application/octet-stream; charset=UTF-8");
IoUtil.write(response.getOutputStream(), false, data);
}
+
+ /**
+ * 查询数据源名称列表
+ */
+ @SaCheckPermission("tool:gen:list")
+ @GetMapping(value = "/getDataNames")
+ public R getCurrentDataSourceNameList(){
+ return R.ok(DataBaseHelper.getDataSourceNameList());
+ }
}
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java
index 944fd2e91..f792cebc2 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java
@@ -31,6 +31,12 @@ public class GenTable extends BaseEntity {
@TableId(value = "table_id")
private Long tableId;
+ /**
+ * 数据源名称
+ */
+ @NotBlank(message = "数据源名称不能为空")
+ private String dataName;
+
/**
* 表名称
*/
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
index 3b5cb60ae..87f4f1eb7 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
@@ -1,5 +1,6 @@
package org.dromara.generator.mapper;
+import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.generator.domain.GenTableColumn;
@@ -17,8 +18,10 @@ public interface GenTableColumnMapper extends BaseMapperPlus selectDbTableColumnsByName(String tableName);
+ @DS("#dataName")
+ List selectDbTableColumnsByName(String tableName, String dataName);
}
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java
index 30e33e8ea..c2ff7b69e 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java
@@ -1,5 +1,6 @@
package org.dromara.generator.mapper;
+import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -55,4 +56,6 @@ public interface GenTableMapper extends BaseMapperPlus {
*/
GenTable selectGenTableByName(String tableName);
+ @DS("")
+ List selectTableNameList(String dataName);
}
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
index c505ec472..77ef30363 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
@@ -5,13 +5,18 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
import org.dromara.common.core.constant.Constants;
-import org.dromara.generator.constant.GenConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -20,6 +25,7 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.generator.constant.GenConstants;
import org.dromara.generator.domain.GenTable;
import org.dromara.generator.domain.GenTableColumn;
import org.dromara.generator.mapper.GenTableColumnMapper;
@@ -27,11 +33,6 @@ import org.dromara.generator.mapper.GenTableMapper;
import org.dromara.generator.util.GenUtils;
import org.dromara.generator.util.VelocityInitializer;
import org.dromara.generator.util.VelocityUtils;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.Velocity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -40,7 +41,11 @@ import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -49,7 +54,7 @@ import java.util.zip.ZipOutputStream;
*
* @author Lion Li
*/
-@DS("#header.datasource")
+// @DS("#header.datasource")
@Slf4j
@RequiredArgsConstructor
@Service
@@ -94,16 +99,19 @@ public class GenTableServiceImpl implements IGenTableService {
private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) {
Map params = genTable.getParams();
QueryWrapper wrapper = Wrappers.query();
- wrapper.like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName()))
+ wrapper
+ .eq(StringUtils.isNotEmpty(genTable.getDataName()),"data_name", genTable.getDataName())
+ .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName()))
.like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment()))
.between(params.get("beginTime") != null && params.get("endTime") != null,
"create_time", params.get("beginTime"), params.get("endTime"));
return wrapper;
}
-
+ @DS("#genTable.dataName")
@Override
public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) {
+ genTable.getParams().put("genTableNames",baseMapper.selectTableNameList(genTable.getDataName()));
Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable);
return TableDataInfo.build(page);
}
@@ -112,10 +120,12 @@ public class GenTableServiceImpl implements IGenTableService {
* 查询据库列表
*
* @param tableNames 表名称组
+ * @param dataName
* @return 数据库表集合
*/
+ @DS("#dataName")
@Override
- public List selectDbTableListByNames(String[] tableNames) {
+ public List selectDbTableListByNames(String[] tableNames, String dataName) {
return baseMapper.selectDbTableListByNames(tableNames);
}
@@ -166,19 +176,21 @@ public class GenTableServiceImpl implements IGenTableService {
* 导入表结构
*
* @param tableList 导入表列表
+ * @param dataName
*/
- @Transactional(rollbackFor = Exception.class)
+ @DSTransactional
@Override
- public void importGenTable(List tableList) {
+ public void importGenTable(List tableList, String dataName) {
String operName = LoginHelper.getUsername();
try {
for (GenTable table : tableList) {
String tableName = table.getTableName();
GenUtils.initTable(table, operName);
+ table.setDataName(dataName);
int row = baseMapper.insert(table);
if (row > 0) {
// 保存列信息
- List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
+ List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dataName);
List saveColumns = new ArrayList<>();
for (GenTableColumn column : genTableColumns) {
GenUtils.initColumnField(column, table);
@@ -231,14 +243,14 @@ public class GenTableServiceImpl implements IGenTableService {
/**
* 生成代码(下载方式)
*
- * @param tableName 表名称
+ * @param tableId 表名称
* @return 数据
*/
@Override
- public byte[] downloadCode(String tableName) {
+ public byte[] downloadCode(Long tableId) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
- generatorCode(tableName, zip);
+ generatorCode(tableId, zip);
IoUtil.close(zip);
return outputStream.toByteArray();
}
@@ -246,12 +258,12 @@ public class GenTableServiceImpl implements IGenTableService {
/**
* 生成代码(自定义路径)
*
- * @param tableName 表名称
+ * @param tableId 表名称
*/
@Override
- public void generatorCode(String tableName) {
+ public void generatorCode(Long tableId) {
// 查询表信息
- GenTable table = baseMapper.selectGenTableByName(tableName);
+ GenTable table = baseMapper.selectGenTableById(tableId);
// 设置主键列信息
setPkColumn(table);
@@ -280,16 +292,16 @@ public class GenTableServiceImpl implements IGenTableService {
/**
* 同步数据库
*
- * @param tableName 表名称
+ * @param tableId 表名称
*/
- @Transactional(rollbackFor = Exception.class)
+ @DSTransactional
@Override
- public void synchDb(String tableName) {
- GenTable table = baseMapper.selectGenTableByName(tableName);
+ public void synchDb(Long tableId) {
+ GenTable table = baseMapper.selectGenTableById(tableId);
List tableColumns = table.getColumns();
Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName);
- List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
+ List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(table.getTableName(), table.getDataName());
if (CollUtil.isEmpty(dbTableColumns)) {
throw new ServiceException("同步数据失败,原表结构不存在");
}
@@ -322,22 +334,24 @@ public class GenTableServiceImpl implements IGenTableService {
List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName()));
if (CollUtil.isNotEmpty(delColumns)) {
List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId);
- genTableColumnMapper.deleteBatchIds(ids);
+ if (CollUtil.isNotEmpty(ids)) {
+ genTableColumnMapper.deleteBatchIds(ids);
+ }
}
}
/**
* 批量生成代码(下载方式)
*
- * @param tableNames 表数组
+ * @param tableIds 表ID数组
* @return 数据
*/
@Override
- public byte[] downloadCode(String[] tableNames) {
+ public byte[] downloadCode(String[] tableIds) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
- for (String tableName : tableNames) {
- generatorCode(tableName, zip);
+ for (String tableId : tableIds) {
+ generatorCode(Long.parseLong(tableId), zip);
}
IoUtil.close(zip);
return outputStream.toByteArray();
@@ -346,9 +360,9 @@ public class GenTableServiceImpl implements IGenTableService {
/**
* 查询表信息并生成代码
*/
- private void generatorCode(String tableName, ZipOutputStream zip) {
+ private void generatorCode(Long tableId, ZipOutputStream zip) {
// 查询表信息
- GenTable table = baseMapper.selectGenTableByName(tableName);
+ GenTable table = baseMapper.selectGenTableById(tableId);
List menuIds = new ArrayList<>();
for (int i = 0; i < 6; i++) {
menuIds.add(identifierGenerator.nextId(null).longValue());
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java
index 643742b0c..51d3e230e 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java
@@ -43,9 +43,10 @@ public interface IGenTableService {
* 查询据库列表
*
* @param tableNames 表名称组
+ * @param dataName
* @return 数据库表集合
*/
- List selectDbTableListByNames(String[] tableNames);
+ List selectDbTableListByNames(String[] tableNames, String dataName);
/**
* 查询所有表信息
@@ -82,8 +83,9 @@ public interface IGenTableService {
* 导入表结构
*
* @param tableList 导入表列表
+ * @param dataName
*/
- void importGenTable(List tableList);
+ void importGenTable(List tableList, String dataName);
/**
* 预览代码
@@ -96,33 +98,33 @@ public interface IGenTableService {
/**
* 生成代码(下载方式)
*
- * @param tableName 表名称
+ * @param tableId 表名称
* @return 数据
*/
- byte[] downloadCode(String tableName);
+ byte[] downloadCode(Long tableId);
/**
* 生成代码(自定义路径)
*
- * @param tableName 表名称
+ * @param tableId 表名称
* @return 数据
*/
- void generatorCode(String tableName);
+ void generatorCode(Long tableId);
/**
* 同步数据库
*
- * @param tableName 表名称
+ * @param tableId 表名称
*/
- void synchDb(String tableName);
+ void synchDb(Long tableId);
/**
* 批量生成代码(下载方式)
*
- * @param tableNames 表数组
+ * @param tableIds 表ID数组
* @return 数据
*/
- byte[] downloadCode(String[] tableNames);
+ byte[] downloadCode(String[] tableIds);
/**
* 修改保存参数校验
diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
index 1ae784fe5..5641f8530 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
@@ -20,7 +20,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from information_schema.tables
where table_schema = (select database())
AND table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%'
- AND table_name NOT IN (select table_name from gen_table)
+
+ AND table_name NOT IN
+
+ #{item}
+
+
AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%'))
@@ -36,7 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and dt.table_name = uo.object_name
and uo.object_type = 'TABLE'
AND dt.table_name NOT LIKE 'XXL_JOB_%' AND dt.table_name NOT LIKE 'GEN_%'
- AND lower(dt.table_name) NOT IN (select table_name from gen_table)
+
+ AND lower(dt.table_name) NOT IN
+
+ #{item}
+
+
AND lower(dt.table_name) like lower(concat(concat('%', #{genTable.tableName}), '%'))
@@ -60,7 +70,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND n.nspname ]]> ''::name
) list_table
where table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%'
- AND table_name NOT IN (select table_name from gen_table)
+
+ AND table_name NOT IN
+
+ #{item}
+
+
AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%'))
@@ -78,7 +93,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
INNER JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID
AND F.MINOR_ID = 0 AND D.XTYPE = 'U' AND D.NAME != 'DTPROPERTIES'
AND D.NAME NOT LIKE 'xxl_job_%' AND D.NAME NOT LIKE 'gen_%'
- AND D.NAME NOT IN (select table_name from gen_table)
+
+ AND D.NAME NOT IN
+
+ #{item}
+
+
AND lower(D.NAME) like lower(concat(N'%', N'${genTable.tableName}', N'%'))
@@ -194,7 +214,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
+ SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
FROM gen_table t
LEFT JOIN gen_table_column c ON t.table_id = c.table_id
@@ -202,7 +222,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
+ SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
FROM gen_table t
LEFT JOIN gen_table_column c ON t.table_id = c.table_id
@@ -210,11 +230,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
+ SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
FROM gen_table t
LEFT JOIN gen_table_column c ON t.table_id = c.table_id
order by c.sort
+
+ select table_name from gen_table where data_name = #{dataName,jdbcType=VARCHAR}
+
diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql
index 0456f11ec..3e93ae98d 100644
--- a/script/sql/oracle/oracle_ry_vue_5.X.sql
+++ b/script/sql/oracle/oracle_ry_vue_5.X.sql
@@ -910,6 +910,7 @@ insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统
-- ----------------------------
create table gen_table (
table_id number(20) not null,
+ data_name varchar2(200) default '',
table_name varchar2(200) default '',
table_comment varchar2(500) default '',
sub_table_name varchar(64) default null,
@@ -936,6 +937,7 @@ alter table gen_table add constraint pk_gen_table primary key (table_id);
comment on table gen_table is '代码生成业务表';
comment on column gen_table.table_id is '编号';
+comment on column gen_table.data_name is '数据源名称';
comment on column gen_table.table_name is '表名称';
comment on column gen_table.table_comment is '表描述';
comment on column gen_table.sub_table_name is '关联子表的表名';
diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql
index bdf28b493..b51004246 100644
--- a/script/sql/postgres/postgres_ry_vue_5.X.sql
+++ b/script/sql/postgres/postgres_ry_vue_5.X.sql
@@ -935,6 +935,7 @@ drop table if exists gen_table;
create table if not exists gen_table
(
table_id int8,
+ data_name varchar(200) default ''::varchar,
table_name varchar(200) default ''::varchar,
table_comment varchar(500) default ''::varchar,
sub_table_name varchar(64) default ''::varchar,
@@ -960,6 +961,7 @@ create table if not exists gen_table
comment on table gen_table is '代码生成业务表';
comment on column gen_table.table_id is '编号';
+comment on column gen_table.data_name is '数据源名称';
comment on column gen_table.table_name is '表名称';
comment on column gen_table.table_comment is '表描述';
comment on column gen_table.sub_table_name is '关联子表的表名';
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 2b3ea0c1c..713d962d4 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -686,6 +686,7 @@ insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统
drop table if exists gen_table;
create table gen_table (
table_id bigint(20) not null comment '编号',
+ data_name varchar(200) default '' comment '数据源名称',
table_name varchar(200) default '' comment '表名称',
table_comment varchar(500) default '' comment '表描述',
sub_table_name varchar(64) default null comment '关联子表的表名',
diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
index f72dfffcd..4bff0ed57 100644
--- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
+++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
@@ -254,6 +254,7 @@ GO
CREATE TABLE gen_table
(
table_id bigint NOT NULL,
+ data_name nvarchar(200) DEFAULT '' NULL,
table_name nvarchar(200) DEFAULT '' NULL,
table_comment nvarchar(500) DEFAULT '' NULL,
sub_table_name nvarchar(64) NULL,
@@ -287,6 +288,12 @@ EXEC sys.sp_addextendedproperty
'TABLE', N'gen_table',
'COLUMN', N'table_id'
GO
+EXEC sys.sp_addextendedproperty
+ 'MS_Description', N'数据源名称' ,
+ 'SCHEMA', N'dbo',
+ 'TABLE', N'gen_table',
+ 'COLUMN', N'data_name'
+GO
EXEC sys.sp_addextendedproperty
'MS_Description', N'表名称' ,
'SCHEMA', N'dbo',
From ee7c5fbbd9fe0073713f5873c8bf7cc04c4d3677 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Mon, 29 May 2023 11:32:12 +0800
Subject: [PATCH 002/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20!pr349=20?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=20=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=A4=9A=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E6=BA=90=E7=BB=9F=E4=B8=80=E5=AD=98=E5=82=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../org/dromara/generator/mapper/GenTableColumnMapper.java | 2 +-
.../org/dromara/generator/service/GenTableServiceImpl.java | 7 ++-----
.../org/dromara/generator/service/IGenTableService.java | 7 ++-----
.../src/main/resources/mapper/generator/GenTableMapper.xml | 7 +++----
4 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
index 87f4f1eb7..2d8b886bd 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
@@ -18,7 +18,7 @@ public interface GenTableColumnMapper extends BaseMapperPlus selectDbTableListByNames(String[] tableNames, String dataName);
@@ -67,7 +67,6 @@ public interface IGenTableService {
* 修改业务
*
* @param genTable 业务信息
- * @return 结果
*/
void updateGenTable(GenTable genTable);
@@ -75,7 +74,6 @@ public interface IGenTableService {
* 删除业务信息
*
* @param tableIds 需要删除的表数据ID
- * @return 结果
*/
void deleteGenTableByIds(Long[] tableIds);
@@ -83,7 +81,7 @@ public interface IGenTableService {
* 导入表结构
*
* @param tableList 导入表列表
- * @param dataName
+ * @param dataName 数据源名称
*/
void importGenTable(List tableList, String dataName);
@@ -107,7 +105,6 @@ public interface IGenTableService {
* 生成代码(自定义路径)
*
* @param tableId 表名称
- * @return 数据
*/
void generatorCode(Long tableId);
diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
index 5641f8530..f4f86e6bb 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
@@ -125,7 +125,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and dt.table_name = uo.object_name
and uo.object_type = 'TABLE'
AND dt.table_name NOT LIKE 'XXL_JOB_%' AND dt.table_name NOT LIKE 'GEN_%'
- AND dt.table_name NOT IN (select table_name from gen_table)
and lower(dt.table_name) in
#{name}
@@ -161,9 +160,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND F.MINOR_ID = 0 AND D.XTYPE = 'U' AND D.NAME != 'DTPROPERTIES'
AND D.NAME NOT LIKE 'xxl_job_%' AND D.NAME NOT LIKE 'gen_%'
AND D.NAME in
-
- #{name}
-
+
+ #{name}
+
From f51c654c582815d5d7e9ec934a1f9f548fbad050 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Mon, 29 May 2023 11:45:42 +0800
Subject: [PATCH 003/115] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=205.0-5.1=20?=
=?UTF-8?q?=E5=8D=87=E7=BA=A7sql?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
script/sql/update/oracle/update_5.0-5.1.sql | 3 +++
script/sql/update/postgres/update_5.0-5.1.sql | 3 +++
script/sql/update/sqlserver/update_5.0-5.1.sql | 9 +++++++++
script/sql/update/update_5.0-5.1.sql | 1 +
4 files changed, 16 insertions(+)
create mode 100644 script/sql/update/oracle/update_5.0-5.1.sql
create mode 100644 script/sql/update/postgres/update_5.0-5.1.sql
create mode 100644 script/sql/update/sqlserver/update_5.0-5.1.sql
create mode 100644 script/sql/update/update_5.0-5.1.sql
diff --git a/script/sql/update/oracle/update_5.0-5.1.sql b/script/sql/update/oracle/update_5.0-5.1.sql
new file mode 100644
index 000000000..69fccd6ea
--- /dev/null
+++ b/script/sql/update/oracle/update_5.0-5.1.sql
@@ -0,0 +1,3 @@
+ALTER TABLE gen_table ADD (data_name VARCHAR2(200) DEFAULT '');
+
+COMMENT ON COLUMN gen_table.data_name IS '数据源名称';
diff --git a/script/sql/update/postgres/update_5.0-5.1.sql b/script/sql/update/postgres/update_5.0-5.1.sql
new file mode 100644
index 000000000..f802788fa
--- /dev/null
+++ b/script/sql/update/postgres/update_5.0-5.1.sql
@@ -0,0 +1,3 @@
+ALTER TABLE gen_table ADD data_name varchar(200) default ''::varchar;
+
+COMMENT ON COLUMN gen_table.data_name IS '数据源名称';
diff --git a/script/sql/update/sqlserver/update_5.0-5.1.sql b/script/sql/update/sqlserver/update_5.0-5.1.sql
new file mode 100644
index 000000000..8fd249f4b
--- /dev/null
+++ b/script/sql/update/sqlserver/update_5.0-5.1.sql
@@ -0,0 +1,9 @@
+ALTER TABLE gen_table ADD data_name nvarchar(200) DEFAULT '' NULL
+GO
+
+EXEC sp_addextendedproperty
+ 'MS_Description', N'数据源名称',
+ 'SCHEMA', N'dbo',
+ 'TABLE', N'gen_table',
+ 'COLUMN', N'data_name'
+GO
diff --git a/script/sql/update/update_5.0-5.1.sql b/script/sql/update/update_5.0-5.1.sql
new file mode 100644
index 000000000..897fb4c4c
--- /dev/null
+++ b/script/sql/update/update_5.0-5.1.sql
@@ -0,0 +1 @@
+ALTER TABLE gen_table ADD COLUMN data_name varchar(200) NULL DEFAULT '' COMMENT '数据源名称' AFTER table_id;
From 8de7fef44ae9590a0ad5a7ea6ecab02c96073cd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Mon, 29 May 2023 11:49:11 +0800
Subject: [PATCH 004/115] =?UTF-8?q?update=20=E7=89=88=E6=9C=AC=E5=8F=B7?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=205.1.0-SNAPSHOT?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
ruoyi-common/ruoyi-common-bom/pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 8f9d08bc8..b20e7f059 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
RuoYi-Vue-Plus多租户管理系统
- 5.0.0
+ 5.1.0-SNAPSHOT
3.0.7
UTF-8
UTF-8
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index ae16451ad..8a9e25a95 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -14,7 +14,7 @@
- 5.0.0
+ 5.1.0-SNAPSHOT
From f78df97bccf776927658abecd186a08c8175dcbb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Mon, 29 May 2023 21:45:09 +0800
Subject: [PATCH 005/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20OssClient=20?=
=?UTF-8?q?=E5=AE=9E=E4=BE=8B=E5=A4=9A=E7=A7=9F=E6=88=B7=E7=9B=B8=E5=90=8C?=
=?UTF-8?q?key=E7=BC=93=E5=AD=98=E8=A6=86=E7=9B=96=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/org/dromara/common/oss/factory/OssFactory.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java
index 911d9a86a..6503eb133 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java
@@ -51,13 +51,13 @@ public class OssFactory {
if (client == null) {
CLIENT_CACHE.put(key, new OssClient(configKey, properties));
log.info("创建OSS实例 key => {}", configKey);
- return CLIENT_CACHE.get(configKey);
+ return CLIENT_CACHE.get(key);
}
// 配置不相同则重新构建
if (!client.checkPropertiesSame(properties)) {
CLIENT_CACHE.put(key, new OssClient(configKey, properties));
log.info("重载OSS实例 key => {}", configKey);
- return CLIENT_CACHE.get(configKey);
+ return CLIENT_CACHE.get(key);
}
return client;
}
From d5c33b56040b19b14f1ca708179dcaf71a820f79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Tue, 30 May 2023 09:56:32 +0800
Subject: [PATCH 006/115] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20RedisUtils?=
=?UTF-8?q?=20=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=20hash=20key=20?=
=?UTF-8?q?=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/common/redis/utils/RedisUtils.java | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
index fd20ba09f..ccc036843 100644
--- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
@@ -1,8 +1,8 @@
package org.dromara.common.redis.utils;
-import org.dromara.common.core.utils.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import org.dromara.common.core.utils.SpringUtils;
import org.redisson.api.*;
import java.time.Duration;
@@ -374,6 +374,21 @@ public class RedisUtils {
return rMap.remove(hKey);
}
+ /**
+ * 删除Hash中的数据
+ *
+ * @param key Redis键
+ * @param hKeys Hash键
+ */
+ public static void delMultiCacheMapValue(final String key, final Set hKeys) {
+ RBatch batch = CLIENT.createBatch();
+ RMapAsync rMap = batch.getMap(key);
+ for (String hKey : hKeys) {
+ rMap.removeAsync(hKey);
+ }
+ batch.execute();
+ }
+
/**
* 获取多个Hash中的数据
*
From 512108cf5a6d1dee04d29df593814f7c4df80179 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Wed, 31 May 2023 22:40:36 +0800
Subject: [PATCH 007/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../service/GenTableServiceImpl.java | 4 ++--
.../org/dromara/generator/util/GenUtils.java | 21 +++++++++----------
2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
index 8d0e38f5e..d41881585 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
@@ -178,11 +178,11 @@ public class GenTableServiceImpl implements IGenTableService {
@DSTransactional
@Override
public void importGenTable(List tableList, String dataName) {
- String operName = LoginHelper.getUsername();
+ Long operId = LoginHelper.getUserId();
try {
for (GenTable table : tableList) {
String tableName = table.getTableName();
- GenUtils.initTable(table, operName);
+ GenUtils.initTable(table, operId);
table.setDataName(dataName);
int row = baseMapper.insert(table);
if (row > 0) {
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
index 948a9301d..93762ae32 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
@@ -1,14 +1,13 @@
package org.dromara.generator.util;
-import org.dromara.generator.constant.GenConstants;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.generator.config.GenConfig;
-import org.dromara.generator.domain.GenTable;
-import org.dromara.generator.domain.GenTableColumn;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.RegExUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.generator.config.GenConfig;
+import org.dromara.generator.constant.GenConstants;
+import org.dromara.generator.domain.GenTable;
+import org.dromara.generator.domain.GenTableColumn;
import java.util.Arrays;
@@ -23,14 +22,14 @@ public class GenUtils {
/**
* 初始化表信息
*/
- public static void initTable(GenTable genTable, String operName) {
+ public static void initTable(GenTable genTable, Long operId) {
genTable.setClassName(convertClassName(genTable.getTableName()));
genTable.setPackageName(GenConfig.getPackageName());
genTable.setModuleName(getModuleName(GenConfig.getPackageName()));
genTable.setBusinessName(getBusinessName(genTable.getTableName()));
genTable.setFunctionName(replaceText(genTable.getTableComment()));
genTable.setFunctionAuthor(GenConfig.getAuthor());
- genTable.setCreateBy(LoginHelper.getUserId());
+ genTable.setCreateBy(operId);
}
/**
@@ -185,7 +184,7 @@ public class GenUtils {
String text = replacementm;
for (String searchString : searchList) {
if (replacementm.startsWith(searchString)) {
- text = replacementm.replaceFirst(searchString, "");
+ text = replacementm.replaceFirst(searchString, StringUtils.EMPTY);
break;
}
}
@@ -209,7 +208,7 @@ public class GenUtils {
* @return 截取后的列类型
*/
public static String getDbType(String columnType) {
- if (StringUtils.indexOf(columnType, '(') > 0) {
+ if (StringUtils.indexOf(columnType, "(") > 0) {
return StringUtils.substringBefore(columnType, "(");
} else {
return columnType;
@@ -223,7 +222,7 @@ public class GenUtils {
* @return 截取后的列类型
*/
public static Integer getColumnLength(String columnType) {
- if (StringUtils.indexOf(columnType, '(') > 0) {
+ if (StringUtils.indexOf(columnType, "(") > 0) {
String length = StringUtils.substringBetween(columnType, "(", ")");
return Integer.valueOf(length);
} else {
From 7b6dc06a066ebb4c061cb8b031587155e8f35fe8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Wed, 31 May 2023 22:52:06 +0800
Subject: [PATCH 008/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/org/dromara/generator/controller/GenController.java | 2 +-
.../src/main/java/org/dromara/generator/util/GenUtils.java | 1 -
.../main/java/org/dromara/generator/util/VelocityUtils.java | 4 ++--
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
index 25c510be3..a4509b284 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java
@@ -56,7 +56,7 @@ public class GenController extends BaseController {
GenTable table = genTableService.selectGenTableById(tableId);
List tables = genTableService.selectGenTableAll();
List list = genTableService.selectGenTableColumnListByTableId(tableId);
- Map map = new HashMap();
+ Map map = new HashMap<>(3);
map.put("info", table);
map.put("rows", list);
map.put("tables", tables);
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
index 93762ae32..2e6b37b6d 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/GenUtils.java
@@ -178,7 +178,6 @@ public class GenUtils {
*
* @param replacementm 替换值
* @param searchList 替换列表
- * @return
*/
public static String replaceFirst(String replacementm, String[] searchList) {
String text = replacementm;
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java
index e2d89c76f..f5db391b8 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java
@@ -109,7 +109,7 @@ public class VelocityUtils {
* @return 模板列表
*/
public static List getTemplateList(String tplCategory) {
- List templates = new ArrayList();
+ List templates = new ArrayList<>();
templates.add("vm/java/domain.java.vm");
templates.add("vm/java/vo.java.vm");
templates.add("vm/java/bo.java.vm");
@@ -208,7 +208,7 @@ public class VelocityUtils {
*/
public static HashSet getImportList(GenTable genTable) {
List columns = genTable.getColumns();
- HashSet importList = new HashSet();
+ HashSet importList = new HashSet<>();
for (GenTableColumn column : columns) {
if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
importList.add("java.util.Date");
From 3303b9aa59d7093da379629900b22a49483932d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 1 Jun 2023 10:10:46 +0800
Subject: [PATCH 009/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=85=B3?=
=?UTF-8?q?=E9=97=AD=E5=A4=9A=E7=A7=9F=E6=88=B7=20=E8=84=B1=E6=95=8F?=
=?UTF-8?q?=E5=88=A4=E6=96=AD=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../system/service/impl/SysSensitiveServiceImpl.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
index 296574b7b..1302118db 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
@@ -2,6 +2,7 @@ package org.dromara.system.service.impl;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sensitive.core.SensitiveService;
+import org.dromara.common.tenant.helper.TenantHelper;
import org.springframework.stereotype.Service;
/**
@@ -20,7 +21,10 @@ public class SysSensitiveServiceImpl implements SensitiveService {
*/
@Override
public boolean isSensitive() {
- return !LoginHelper.isSuperAdmin() || !LoginHelper.isTenantAdmin();
+ if (TenantHelper.isEnable()) {
+ return !LoginHelper.isSuperAdmin() || !LoginHelper.isTenantAdmin();
+ }
+ return !LoginHelper.isSuperAdmin();
}
}
From 28d69701c9bdf6bb5d49dfae9b637e5b5463a1bc Mon Sep 17 00:00:00 2001
From: jenn <11@11.11>
Date: Sun, 4 Jun 2023 12:08:41 +0800
Subject: [PATCH 010/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20OssClient=20?=
=?UTF-8?q?=E5=88=87=E6=8D=A2=E6=9C=8D=E5=8A=A1=20=E5=AE=9E=E4=BE=8B?=
=?UTF-8?q?=E4=B8=8D=E6=AD=A3=E7=A1=AE=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/org/dromara/system/service/impl/SysOssServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
index 3923c6383..8eac49bdc 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
@@ -108,7 +108,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
}
FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
- OssClient storage = OssFactory.instance();
+ OssClient storage = OssFactory.instance(sysOss.getService());
try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {
int available = inputStream.available();
IoUtil.copy(inputStream, response.getOutputStream(), available);
From 2e5702dc8646d6f795f5c467e434027fe6d01b71 Mon Sep 17 00:00:00 2001
From: jenn <11@11.11>
Date: Sun, 4 Jun 2023 21:10:51 +0800
Subject: [PATCH 011/115] =?UTF-8?q?update=20Oss=E6=96=B0=E5=A2=9EFile?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/common/oss/core/OssClient.java | 17 +++++++++++++++++
.../system/service/ISysOssService.java | 3 +++
.../service/impl/SysOssServiceImpl.java | 19 ++++++++++++++++++-
3 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
index 992e3d4db..53e05c927 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
@@ -24,6 +24,7 @@ import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.properties.OssProperties;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
@@ -115,6 +116,18 @@ public class OssClient {
return UploadResult.builder().url(getUrl() + "/" + path).filename(path).build();
}
+ public UploadResult upload(File file, String path) {
+ try {
+ PutObjectRequest putObjectRequest = new PutObjectRequest(properties.getBucketName(), path, file);
+ // 设置上传对象的 Acl 为公共读
+ putObjectRequest.setCannedAcl(getAccessPolicy().getAcl());
+ client.putObject(putObjectRequest);
+ } catch (Exception e) {
+ throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");
+ }
+ return UploadResult.builder().url(getUrl() + "/" + path).filename(path).build();
+ }
+
public void delete(String path) {
path = path.replace(getUrl() + "/", "");
try {
@@ -132,6 +145,10 @@ public class OssClient {
return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType);
}
+ public UploadResult uploadSuffix(File file, String suffix) {
+ return upload(file, getPath(properties.getPrefix(), suffix));
+ }
+
/**
* 获取文件元数据
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java
index 000ecb436..2dfe01fe9 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java
@@ -7,6 +7,7 @@ import org.dromara.system.domain.vo.SysOssVo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
@@ -26,6 +27,8 @@ public interface ISysOssService {
SysOssVo upload(MultipartFile file);
+ SysOssVo upload(File file);
+
void download(Long ossId, HttpServletResponse response) throws IOException;
Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
index 8eac49bdc..76d7b731b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
@@ -27,11 +27,13 @@ import org.dromara.system.mapper.SysOssMapper;
import org.dromara.system.service.ISysOssService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.NotNull;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
@@ -130,12 +132,27 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
throw new ServiceException(e.getMessage());
}
// 保存文件信息
+ return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
+ }
+
+ @Override
+ public SysOssVo upload(File file) {
+ String originalfileName = file.getName();
+ String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
+ OssClient storage = OssFactory.instance();
+ UploadResult uploadResult = storage.uploadSuffix(file, suffix);
+ // 保存文件信息
+ return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
+ }
+
+ @NotNull
+ private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) {
SysOss oss = new SysOss();
oss.setUrl(uploadResult.getUrl());
oss.setFileSuffix(suffix);
oss.setFileName(uploadResult.getFilename());
oss.setOriginalName(originalfileName);
- oss.setService(storage.getConfigKey());
+ oss.setService(configKey);
baseMapper.insert(oss);
SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class);
return this.matchingUrl(sysOssVo);
From 789858199b96626be2844a39ee2849d2534c6081 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BB=A3=E6=98=9F=E7=99=BB?= <2283268848@qq.com>
Date: Mon, 5 Jun 2023 14:57:15 +0800
Subject: [PATCH 012/115] =?UTF-8?q?[update]=20=E6=9B=B4=E6=94=B9=20/auth/t?=
=?UTF-8?q?enant/list=20api,=E8=8E=B7=E5=8F=96=E7=A7=9F=E6=88=B7=E5=88=97?=
=?UTF-8?q?=E8=A1=A8=E6=97=B6=EF=BC=8C=E4=BB=8E=E8=AF=B7=E6=B1=82=E5=A4=B4?=
=?UTF-8?q?=E4=B8=ADreferer=E5=B1=9E=E6=80=A7=E4=B8=AD=E5=8F=96=E5=80=BC?=
=?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E6=9C=AC=E5=9C=B0=E9=80=9A=E8=BF=87?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9hosts=E6=96=87=E4=BB=B6=E6=9D=A5=E8=BE=BE?=
=?UTF-8?q?=E5=88=B0=E5=9F=9F=E5=90=8D=E6=B5=8B=E8=AF=95=E7=9A=84=E5=9C=BA?=
=?UTF-8?q?=E6=99=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/AuthController.java | 26 ++++++++++++++-----
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index f39fd3068..9defb8361 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -57,9 +57,9 @@ public class AuthController {
LoginVo loginVo = new LoginVo();
// 生成令牌
String token = loginService.login(
- body.getTenantId(),
- body.getUsername(), body.getPassword(),
- body.getCode(), body.getUuid());
+ body.getTenantId(),
+ body.getUsername(), body.getPassword(),
+ body.getCode(), body.getUuid());
loginVo.setToken(token);
return R.ok(loginVo);
}
@@ -74,7 +74,8 @@ public class AuthController {
public R smsLogin(@Validated @RequestBody SmsLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
- String token = loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
+ String token =
+ loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
@@ -89,7 +90,8 @@ public class AuthController {
public R emailLogin(@Validated @RequestBody EmailLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
- String token = loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
+ String token =
+ loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
@@ -140,9 +142,19 @@ public class AuthController {
List tenantList = tenantService.queryList(new SysTenantBo());
List voList = MapstructUtils.convert(tenantList, TenantListVo.class);
// 获取域名
- String host = new URL(request.getRequestURL().toString()).getHost();
+ String host = "";
+ String referer = request.getHeader("referer");
+ if (StringUtils.isNotBlank(referer)) {
+ //这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试
+ host = referer.split("//")[1].split("/")[0];
+ } else {
+ host = new URL(request.getRequestURL().toString()).getHost();
+ }
// 根据域名进行筛选
- List list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host));
+ String finalHost = host;
+ List list =
+ StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(),
+ finalHost));
// 返回对象
LoginTenantVo vo = new LoginTenantVo();
vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
From ffedfd89a1b3588a21fbc8b3042f6b628eb144ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Mon, 5 Jun 2023 15:12:46 +0800
Subject: [PATCH 013/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20!pr363=20?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9C=AC=E5=9C=B0=E8=99=9A=E6=8B=9F=E5=9F=9F?=
=?UTF-8?q?=E5=90=8D=E8=B0=83=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/AuthController.java | 28 ++++++++++---------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index 9defb8361..bba6113da 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,6 +2,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -20,9 +23,6 @@ import org.dromara.web.domain.vo.LoginVo;
import org.dromara.web.domain.vo.TenantListVo;
import org.dromara.web.service.SysLoginService;
import org.dromara.web.service.SysRegisterService;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.validation.constraints.NotBlank;
-import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -74,8 +74,10 @@ public class AuthController {
public R smsLogin(@Validated @RequestBody SmsLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
- String token =
- loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
+ String token = loginService.smsLogin(
+ body.getTenantId(),
+ body.getPhonenumber(),
+ body.getSmsCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
@@ -90,8 +92,10 @@ public class AuthController {
public R emailLogin(@Validated @RequestBody EmailLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
- String token =
- loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
+ String token = loginService.emailLogin(
+ body.getTenantId(),
+ body.getEmail(),
+ body.getEmailCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
@@ -142,19 +146,17 @@ public class AuthController {
List tenantList = tenantService.queryList(new SysTenantBo());
List voList = MapstructUtils.convert(tenantList, TenantListVo.class);
// 获取域名
- String host = "";
+ String host;
String referer = request.getHeader("referer");
if (StringUtils.isNotBlank(referer)) {
- //这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试
+ // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试
host = referer.split("//")[1].split("/")[0];
} else {
host = new URL(request.getRequestURL().toString()).getHost();
}
// 根据域名进行筛选
- String finalHost = host;
- List list =
- StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(),
- finalHost));
+ List list = StreamUtils.filter(voList, vo ->
+ StringUtils.equals(vo.getDomain(), host));
// 返回对象
LoginTenantVo vo = new LoginTenantVo();
vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
From 204d882a8ea2db9da493635089058e72a683e767 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 8 Jun 2023 18:28:22 +0800
Subject: [PATCH 014/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BC=A0?=
=?UTF-8?q?=E5=8F=82=E7=B1=BB=E5=9E=8B=E4=B8=8D=E6=AD=A3=E7=A1=AE=E5=AF=BC?=
=?UTF-8?q?=E8=87=B4=20postgreSql=20=E5=90=8C=E6=AD=A5=E5=A5=97=E9=A4=90?=
=?UTF-8?q?=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/system/controller/system/SysTenantController.java | 2 +-
.../main/java/org/dromara/system/service/ISysTenantService.java | 2 +-
.../org/dromara/system/service/impl/SysTenantServiceImpl.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
index de25b8ecf..dc8fbc03d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
@@ -174,7 +174,7 @@ public class SysTenantController extends BaseController {
@SaCheckPermission("system:tenant:edit")
@Log(title = "租户", businessType = BusinessType.UPDATE)
@GetMapping("/syncTenantPackage")
- public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, @NotBlank(message = "套餐ID不能为空") String packageId) {
+ public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, @NotBlank(message = "套餐ID不能为空") Long packageId) {
return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java
index f889f2b1b..d12ed95f1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java
@@ -78,5 +78,5 @@ public interface ISysTenantService {
/**
* 同步租户套餐
*/
- Boolean syncTenantPackage(String tenantId, String packageId);
+ Boolean syncTenantPackage(String tenantId, Long packageId);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
index 0cd574ad0..eb681519a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
@@ -337,7 +337,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
- public Boolean syncTenantPackage(String tenantId, String packageId) {
+ public Boolean syncTenantPackage(String tenantId, Long packageId) {
SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
List roles = roleMapper.selectList(
new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId));
From d34be960cb612c571bfd9bb07bdbe8f21494b940 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 8 Jun 2023 18:44:20 +0800
Subject: [PATCH 015/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=8F=82?=
=?UTF-8?q?=E6=95=B0=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9=20=E6=9C=AA?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=A1=E9=AA=8C=E6=B3=A8=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/system/controller/system/SysTenantController.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
index dc8fbc03d..865b57a9f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.baomidou.lock.annotation.Lock4j;
import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
@@ -174,7 +175,8 @@ public class SysTenantController extends BaseController {
@SaCheckPermission("system:tenant:edit")
@Log(title = "租户", businessType = BusinessType.UPDATE)
@GetMapping("/syncTenantPackage")
- public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, @NotBlank(message = "套餐ID不能为空") Long packageId) {
+ public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId,
+ @NotNull(message = "套餐ID不能为空") Long packageId) {
return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
}
From bb587607e147fd92f9cd653f837075455444249f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8F=8B=E6=9D=B0?= <273666957@qq.com>
Date: Fri, 9 Jun 2023 01:58:50 +0000
Subject: [PATCH 016/115] =?UTF-8?q?!367=20=E9=9B=86=E6=88=90sms4j=E7=9F=AD?=
=?UTF-8?q?=E4=BF=A1=20=E9=9B=86=E6=88=90sms4j=E7=9F=AD=E4=BF=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 17 ++--
.../web/controller/CaptchaController.java | 21 +++--
.../src/main/resources/application-dev.yml | 20 +++--
ruoyi-common/ruoyi-common-sms/pom.xml | 10 +--
.../dromara/common/sms/config/SmsConfig.java | 31 -------
.../sms/config/properties/SmsProperties.java | 26 ------
.../common/sms/core/AliyunSmsTemplate.java | 66 ---------------
.../dromara/common/sms/core/SmsTemplate.java | 26 ------
.../common/sms/core/TencentSmsTemplate.java | 82 -------------------
.../dromara/common/sms/entity/SmsResult.java | 31 -------
.../common/sms/exception/SmsException.java | 19 -----
.../demo/controller/SmsController.java | 23 +++---
12 files changed, 39 insertions(+), 333 deletions(-)
delete mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/AliyunSmsTemplate.java
delete mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/SmsTemplate.java
delete mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/TencentSmsTemplate.java
delete mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/entity/SmsResult.java
delete mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/exception/SmsException.java
diff --git a/pom.xml b/pom.xml
index b20e7f059..18e8448e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -48,8 +48,7 @@
1.12.400
- 2.0.23
- 3.1.687
+ 2.1.1
3.2.2
@@ -234,17 +233,11 @@
aws-java-sdk-s3
${aws-java-sdk-s3.version}
-
+
- com.aliyun
- dysmsapi20170525
- ${aliyun.sms.version}
-
-
-
- com.tencentcloudapi
- tencentcloud-sdk-java-sms
- ${tencent.sms.version}
+ org.dromara.sms4j
+ sms4j-spring-boot-starter
+ ${sms4j.version}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
index dd9fa196e..3977e3071 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -15,10 +15,11 @@ import org.dromara.common.mail.config.properties.MailProperties;
import org.dromara.common.mail.utils.MailUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sms.config.properties.SmsProperties;
-import org.dromara.common.sms.core.SmsTemplate;
-import org.dromara.common.sms.entity.SmsResult;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.common.web.enums.CaptchaType;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.core.factory.SmsFactory;
+import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.dromara.web.domain.vo.CaptchaVo;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
@@ -31,8 +32,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedHashMap;
/**
* 验证码操作处理
@@ -64,14 +64,13 @@ public class CaptchaController {
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可)
- String templateId = "";
- Map map = new HashMap<>(1);
+ String templateId = "SMS_460945446";
+ LinkedHashMap map = new LinkedHashMap<>(1);
map.put("code", code);
- SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
- SmsResult result = smsTemplate.send(phonenumber, templateId, map);
- if (!result.isSuccess()) {
- log.error("验证码短信发送异常 => {}", result);
- return R.fail(result.getMessage());
+ SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage(phonenumber, templateId, map);
+ if (!"OK".equals(smsResponse.getCode())) {
+ log.error("验证码短信发送异常 => {}", smsResponse);
+ return R.fail(smsResponse.getMessage());
}
return R.ok();
}
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 92a3640e9..f3dda8fa2 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -158,14 +158,16 @@ mail:
# Socket连接超时值,单位毫秒,缺省值不超时
connectionTimeout: 0
---- # sms 短信
+--- # sms 短信 https://wind.kim/doc/start/springboot.html
sms:
- enabled: false
+ enabled: true
# 阿里云 dysmsapi.aliyuncs.com
- # 腾讯云 sms.tencentcloudapi.com
- endpoint: "dysmsapi.aliyuncs.com"
- accessKeyId: xxxxxxx
- accessKeySecret: xxxxxx
- signName: 测试
- # 腾讯专用
- sdkAppId:
+ alibaba:
+ #阿里云的accessKey
+ accessKeyId: xxxxxxx
+ #阿里云的accessKeySecret
+ accessKeySecret: xxxxxxx
+ #短信签名
+ signature: 测试
+ #请求地址 默认为dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
+ requestUrl: dysmsapi.aliyuncs.com
diff --git a/ruoyi-common/ruoyi-common-sms/pom.xml b/ruoyi-common/ruoyi-common-sms/pom.xml
index b06c5caff..45b425631 100644
--- a/ruoyi-common/ruoyi-common-sms/pom.xml
+++ b/ruoyi-common/ruoyi-common-sms/pom.xml
@@ -22,16 +22,10 @@
- com.aliyun
- dysmsapi20170525
- true
+ org.dromara.sms4j
+ sms4j-spring-boot-starter
-
- com.tencentcloudapi
- tencentcloud-sdk-java-sms
- true
-
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
index 86881f1d8..eada97b42 100644
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
@@ -1,15 +1,8 @@
package org.dromara.common.sms.config;
import org.dromara.common.sms.config.properties.SmsProperties;
-import org.dromara.common.sms.core.AliyunSmsTemplate;
-import org.dromara.common.sms.core.SmsTemplate;
-import org.dromara.common.sms.core.TencentSmsTemplate;
import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
/**
* 短信配置类
@@ -21,28 +14,4 @@ import org.springframework.context.annotation.Configuration;
@EnableConfigurationProperties(SmsProperties.class)
public class SmsConfig {
- @Configuration
- @ConditionalOnProperty(value = "sms.enabled", havingValue = "true")
- @ConditionalOnClass(com.aliyun.dysmsapi20170525.Client.class)
- static class AliyunSmsConfig {
-
- @Bean
- public SmsTemplate aliyunSmsTemplate(SmsProperties smsProperties) {
- return new AliyunSmsTemplate(smsProperties);
- }
-
- }
-
- @Configuration
- @ConditionalOnProperty(value = "sms.enabled", havingValue = "true")
- @ConditionalOnClass(com.tencentcloudapi.sms.v20190711.SmsClient.class)
- static class TencentSmsConfig {
-
- @Bean
- public SmsTemplate tencentSmsTemplate(SmsProperties smsProperties) {
- return new TencentSmsTemplate(smsProperties);
- }
-
- }
-
}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
index da6d9400e..a080a34e2 100644
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
@@ -15,31 +15,5 @@ public class SmsProperties {
private Boolean enabled;
- /**
- * 配置节点
- * 阿里云 dysmsapi.aliyuncs.com
- * 腾讯云 sms.tencentcloudapi.com
- */
- private String endpoint;
-
- /**
- * key
- */
- private String accessKeyId;
-
- /**
- * 密匙
- */
- private String accessKeySecret;
-
- /*
- * 短信签名
- */
- private String signName;
-
- /**
- * 短信应用ID (腾讯专属)
- */
- private String sdkAppId;
}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/AliyunSmsTemplate.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/AliyunSmsTemplate.java
deleted file mode 100644
index 00d81523a..000000000
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/AliyunSmsTemplate.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.dromara.common.sms.core;
-
-import com.aliyun.dysmsapi20170525.Client;
-import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
-import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
-import com.aliyun.teaopenapi.models.Config;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.json.utils.JsonUtils;
-import org.dromara.common.sms.config.properties.SmsProperties;
-import org.dromara.common.sms.entity.SmsResult;
-import org.dromara.common.sms.exception.SmsException;
-import lombok.SneakyThrows;
-
-import java.util.Map;
-
-/**
- * Aliyun 短信模板
- *
- * @author Lion Li
- * @version 4.2.0
- */
-public class AliyunSmsTemplate implements SmsTemplate {
-
- private SmsProperties properties;
-
- private Client client;
-
- @SneakyThrows(Exception.class)
- public AliyunSmsTemplate(SmsProperties smsProperties) {
- this.properties = smsProperties;
- Config config = new Config()
- // 您的AccessKey ID
- .setAccessKeyId(smsProperties.getAccessKeyId())
- // 您的AccessKey Secret
- .setAccessKeySecret(smsProperties.getAccessKeySecret())
- // 访问的域名
- .setEndpoint(smsProperties.getEndpoint());
- this.client = new Client(config);
- }
-
- @Override
- public SmsResult send(String phones, String templateId, Map param) {
- if (StringUtils.isBlank(phones)) {
- throw new SmsException("手机号不能为空");
- }
- if (StringUtils.isBlank(templateId)) {
- throw new SmsException("模板ID不能为空");
- }
- SendSmsRequest req = new SendSmsRequest()
- .setPhoneNumbers(phones)
- .setSignName(properties.getSignName())
- .setTemplateCode(templateId)
- .setTemplateParam(JsonUtils.toJsonString(param));
- try {
- SendSmsResponse resp = client.sendSms(req);
- return SmsResult.builder()
- .isSuccess("OK".equals(resp.getBody().getCode()))
- .message(resp.getBody().getMessage())
- .response(JsonUtils.toJsonString(resp))
- .build();
- } catch (Exception e) {
- throw new SmsException(e.getMessage());
- }
- }
-
-}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/SmsTemplate.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/SmsTemplate.java
deleted file mode 100644
index eba38dfff..000000000
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/SmsTemplate.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.dromara.common.sms.core;
-
-import org.dromara.common.sms.entity.SmsResult;
-
-import java.util.Map;
-
-/**
- * 短信模板
- *
- * @author Lion Li
- * @version 4.2.0
- */
-public interface SmsTemplate {
-
- /**
- * 发送短信
- *
- * @param phones 电话号(多个逗号分割)
- * @param templateId 模板id
- * @param param 模板对应参数
- * 阿里 需使用 模板变量名称对应内容 例如: code=1234
- * 腾讯 需使用 模板变量顺序对应内容 例如: 1=1234, 1为模板内第一个参数
- */
- SmsResult send(String phones, String templateId, Map param);
-
-}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/TencentSmsTemplate.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/TencentSmsTemplate.java
deleted file mode 100644
index 18d738408..000000000
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/TencentSmsTemplate.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.dromara.common.sms.core;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ArrayUtil;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.json.utils.JsonUtils;
-import org.dromara.common.sms.config.properties.SmsProperties;
-import org.dromara.common.sms.entity.SmsResult;
-import org.dromara.common.sms.exception.SmsException;
-import com.tencentcloudapi.common.Credential;
-import com.tencentcloudapi.common.profile.ClientProfile;
-import com.tencentcloudapi.common.profile.HttpProfile;
-import com.tencentcloudapi.sms.v20190711.SmsClient;
-import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
-import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
-import com.tencentcloudapi.sms.v20190711.models.SendStatus;
-import lombok.SneakyThrows;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Tencent 短信模板
- *
- * @author Lion Li
- * @version 4.2.0
- */
-public class TencentSmsTemplate implements SmsTemplate {
-
- private SmsProperties properties;
-
- private SmsClient client;
-
- @SneakyThrows(Exception.class)
- public TencentSmsTemplate(SmsProperties smsProperties) {
- this.properties = smsProperties;
- Credential credential = new Credential(smsProperties.getAccessKeyId(), smsProperties.getAccessKeySecret());
- HttpProfile httpProfile = new HttpProfile();
- httpProfile.setEndpoint(smsProperties.getEndpoint());
- ClientProfile clientProfile = new ClientProfile();
- clientProfile.setHttpProfile(httpProfile);
- this.client = new SmsClient(credential, "", clientProfile);
- }
-
- @Override
- public SmsResult send(String phones, String templateId, Map param) {
- if (StringUtils.isBlank(phones)) {
- throw new SmsException("手机号不能为空");
- }
- if (StringUtils.isBlank(templateId)) {
- throw new SmsException("模板ID不能为空");
- }
- SendSmsRequest req = new SendSmsRequest();
- Set set = Arrays.stream(phones.split(StringUtils.SEPARATOR)).map(p -> "+86" + p).collect(Collectors.toSet());
- req.setPhoneNumberSet(ArrayUtil.toArray(set, String.class));
- if (CollUtil.isNotEmpty(param)) {
- req.setTemplateParamSet(ArrayUtil.toArray(param.values(), String.class));
- }
- req.setTemplateID(templateId);
- req.setSign(properties.getSignName());
- req.setSmsSdkAppid(properties.getSdkAppId());
- try {
- SendSmsResponse resp = client.SendSms(req);
- SmsResult.SmsResultBuilder builder = SmsResult.builder()
- .isSuccess(true)
- .message("send success")
- .response(JsonUtils.toJsonString(resp));
- for (SendStatus sendStatus : resp.getSendStatusSet()) {
- if (!"Ok".equals(sendStatus.getCode())) {
- builder.isSuccess(false).message(sendStatus.getMessage());
- break;
- }
- }
- return builder.build();
- } catch (Exception e) {
- throw new SmsException(e.getMessage());
- }
- }
-
-}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/entity/SmsResult.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/entity/SmsResult.java
deleted file mode 100644
index 232d61201..000000000
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/entity/SmsResult.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.dromara.common.sms.entity;
-
-import lombok.Builder;
-import lombok.Data;
-
-/**
- * 上传返回体
- *
- * @author Lion Li
- */
-@Data
-@Builder
-public class SmsResult {
-
- /**
- * 是否成功
- */
- private boolean isSuccess;
-
- /**
- * 响应消息
- */
- private String message;
-
- /**
- * 实际响应体
- *
- * 可自行转换为 SDK 对应的 SendSmsResponse
- */
- private String response;
-}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/exception/SmsException.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/exception/SmsException.java
deleted file mode 100644
index eb7730ae4..000000000
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/exception/SmsException.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.dromara.common.sms.exception;
-
-import java.io.Serial;
-
-/**
- * Sms异常类
- *
- * @author Lion Li
- */
-public class SmsException extends RuntimeException {
-
- @Serial
- private static final long serialVersionUID = 1L;
-
- public SmsException(String msg) {
- super(msg);
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
index e130cae35..bd16bd685 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -1,17 +1,18 @@
package org.dromara.demo.controller;
+import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.sms.config.properties.SmsProperties;
-import org.dromara.common.sms.core.SmsTemplate;
-import lombok.RequiredArgsConstructor;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.core.factory.SmsFactory;
+import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedHashMap;
/**
* 短信演示案例
@@ -44,11 +45,10 @@ public class SmsController {
if (!SpringUtils.containsBean("aliyunSmsTemplate")) {
return R.fail("阿里云依赖未引入!");
}
- SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
- Map map = new HashMap<>(1);
+ LinkedHashMap map = new LinkedHashMap<>(1);
map.put("code", "1234");
- Object send = smsTemplate.send(phones, templateId, map);
- return R.ok(send);
+ SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage(phones, templateId, map);
+ return R.ok(smsResponse);
}
/**
@@ -65,12 +65,11 @@ public class SmsController {
if (!SpringUtils.containsBean("tencentSmsTemplate")) {
return R.fail("腾讯云依赖未引入!");
}
- SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
- Map map = new HashMap<>(1);
+ LinkedHashMap map = new LinkedHashMap<>(1);
// map.put("2", "测试测试");
map.put("1", "1234");
- Object send = smsTemplate.send(phones, templateId, map);
- return R.ok(send);
+ SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.TENCENT).sendMessage(phones, templateId, map);
+ return R.ok(smsResponse);
}
}
From 60edd6148b128a755e61dd2c163d5eea3311e189 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 9 Jun 2023 10:25:05 +0800
Subject: [PATCH 017/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20!pr367=20?=
=?UTF-8?q?=E5=AE=8C=E6=88=90=20sms4j=20=E9=9B=86=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/CaptchaController.java | 9 +++--
.../src/main/resources/application-dev.yml | 21 +++++++++---
.../src/main/resources/application-prod.yml | 33 ++++++++++++++-----
ruoyi-common/ruoyi-common-sms/pom.xml | 11 ++++---
ruoyi-modules/ruoyi-demo/pom.xml | 10 ------
.../demo/controller/SmsController.java | 23 +++----------
6 files changed, 57 insertions(+), 50 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
index 3977e3071..8abada68a 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -17,6 +17,7 @@ import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sms.config.properties.SmsProperties;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.common.web.enums.CaptchaType;
+import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
@@ -57,17 +58,15 @@ public class CaptchaController {
*/
@GetMapping("/resource/sms/code")
public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
- if (!smsProperties.getEnabled()) {
- return R.fail("当前系统没有开启短信功能!");
- }
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可)
- String templateId = "SMS_460945446";
+ String templateId = "";
LinkedHashMap map = new LinkedHashMap<>(1);
map.put("code", code);
- SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage(phonenumber, templateId, map);
+ SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
+ SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
if (!"OK".equals(smsResponse.getCode())) {
log.error("验证码短信发送异常 => {}", smsResponse);
return R.fail(smsResponse.getMessage());
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index f3dda8fa2..5adc8aed8 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -158,16 +158,29 @@ mail:
# Socket连接超时值,单位毫秒,缺省值不超时
connectionTimeout: 0
---- # sms 短信 https://wind.kim/doc/start/springboot.html
+--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
+# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
sms:
- enabled: true
# 阿里云 dysmsapi.aliyuncs.com
alibaba:
+ #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
+ requestUrl: dysmsapi.aliyuncs.com
#阿里云的accessKey
accessKeyId: xxxxxxx
#阿里云的accessKeySecret
accessKeySecret: xxxxxxx
#短信签名
signature: 测试
- #请求地址 默认为dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
- requestUrl: dysmsapi.aliyuncs.com
+ tencent:
+ #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
+ requestUrl: sms.tencentcloudapi.com
+ #腾讯云的accessKey
+ accessKeyId: xxxxxxx
+ #腾讯云的accessKeySecret
+ accessKeySecret: xxxxxxx
+ #短信签名
+ signature: 测试
+ #短信sdkAppId
+ sdkAppId: appid
+ #地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
+ territory: ap-guangzhou
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index e760823ad..4b29d1cec 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -161,14 +161,29 @@ mail:
# Socket连接超时值,单位毫秒,缺省值不超时
connectionTimeout: 0
---- # sms 短信
+--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
+# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
sms:
- enabled: false
# 阿里云 dysmsapi.aliyuncs.com
- # 腾讯云 sms.tencentcloudapi.com
- endpoint: "dysmsapi.aliyuncs.com"
- accessKeyId: xxxxxxx
- accessKeySecret: xxxxxx
- signName: 测试
- # 腾讯专用
- sdkAppId:
+ alibaba:
+ #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
+ requestUrl: dysmsapi.aliyuncs.com
+ #阿里云的accessKey
+ accessKeyId: xxxxxxx
+ #阿里云的accessKeySecret
+ accessKeySecret: xxxxxxx
+ #短信签名
+ signature: 测试
+ tencent:
+ #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
+ requestUrl: sms.tencentcloudapi.com
+ #腾讯云的accessKey
+ accessKeyId: xxxxxxx
+ #腾讯云的accessKeySecret
+ accessKeySecret: xxxxxxx
+ #短信签名
+ signature: 测试
+ #短信sdkAppId
+ sdkAppId: appid
+ #地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
+ territory: ap-guangzhou
diff --git a/ruoyi-common/ruoyi-common-sms/pom.xml b/ruoyi-common/ruoyi-common-sms/pom.xml
index 45b425631..c50f222ac 100644
--- a/ruoyi-common/ruoyi-common-sms/pom.xml
+++ b/ruoyi-common/ruoyi-common-sms/pom.xml
@@ -16,14 +16,17 @@
-
- org.dromara
- ruoyi-common-json
-
org.dromara.sms4j
sms4j-spring-boot-starter
+
+
+
+ com.alibaba
+ fastjson
+
+
diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml
index 09bf0bfae..4fd43bc5f 100644
--- a/ruoyi-modules/ruoyi-demo/pom.xml
+++ b/ruoyi-modules/ruoyi-demo/pom.xml
@@ -97,16 +97,6 @@
org.dromara
ruoyi-common-websocket
-
-
-
-
-
-
-
-
-
-
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
index bd16bd685..048b5141e 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.sms.config.properties.SmsProperties;
+import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
@@ -27,10 +28,6 @@ import java.util.LinkedHashMap;
@RequestMapping("/demo/sms")
public class SmsController {
- private final SmsProperties smsProperties;
-// private final SmsTemplate smsTemplate; // 可以使用spring注入
-// private final AliyunSmsTemplate smsTemplate; // 也可以注入某个厂家的模板工具
-
/**
* 发送短信Aliyun
*
@@ -39,15 +36,10 @@ public class SmsController {
*/
@GetMapping("/sendAliyun")
public R sendAliyun(String phones, String templateId) {
- if (!smsProperties.getEnabled()) {
- return R.fail("当前系统没有开启短信功能!");
- }
- if (!SpringUtils.containsBean("aliyunSmsTemplate")) {
- return R.fail("阿里云依赖未引入!");
- }
LinkedHashMap map = new LinkedHashMap<>(1);
map.put("code", "1234");
- SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage(phones, templateId, map);
+ SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
+ SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
@@ -59,16 +51,11 @@ public class SmsController {
*/
@GetMapping("/sendTencent")
public R sendTencent(String phones, String templateId) {
- if (!smsProperties.getEnabled()) {
- return R.fail("当前系统没有开启短信功能!");
- }
- if (!SpringUtils.containsBean("tencentSmsTemplate")) {
- return R.fail("腾讯云依赖未引入!");
- }
LinkedHashMap map = new LinkedHashMap<>(1);
// map.put("2", "测试测试");
map.put("1", "1234");
- SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.TENCENT).sendMessage(phones, templateId, map);
+ SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT);
+ SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
From 0b79ada24c9ba00fcd02e841ef53d108841d236c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 9 Jun 2023 11:18:10 +0800
Subject: [PATCH 018/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A=E6=8E=89=E6=9A=82=E6=97=B6=E7=94=A8=E4=B8=8D=E4=B8=8A?=
=?UTF-8?q?=E7=9A=84=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/common/sms/config/SmsConfig.java | 4 +-
.../sms/config/properties/SmsProperties.java | 38 +++++++++----------
2 files changed, 20 insertions(+), 22 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
index eada97b42..6b5a84442 100644
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsConfig.java
@@ -1,8 +1,6 @@
package org.dromara.common.sms.config;
-import org.dromara.common.sms.config.properties.SmsProperties;
import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
/**
* 短信配置类
@@ -11,7 +9,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
* @version 4.2.0
*/
@AutoConfiguration
-@EnableConfigurationProperties(SmsProperties.class)
+//@EnableConfigurationProperties(SmsProperties.class)
public class SmsConfig {
}
diff --git a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
index a080a34e2..c7b3ef1a5 100644
--- a/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
+++ b/ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/properties/SmsProperties.java
@@ -1,19 +1,19 @@
-package org.dromara.common.sms.config.properties;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-/**
- * SMS短信 配置属性
- *
- * @author Lion Li
- * @version 4.2.0
- */
-@Data
-@ConfigurationProperties(prefix = "sms")
-public class SmsProperties {
-
- private Boolean enabled;
-
-
-}
+//package org.dromara.common.sms.config.properties;
+//
+//import lombok.Data;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//
+///**
+// * SMS短信 配置属性
+// *
+// * @author Lion Li
+// * @version 4.2.0
+// */
+//@Data
+//@ConfigurationProperties(prefix = "sms")
+//public class SmsProperties {
+//
+// private Boolean enabled;
+//
+//
+//}
From 99689123225505fc616f7e9a17b7d8cc029ebfaf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 9 Jun 2023 11:20:19 +0800
Subject: [PATCH 019/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A=E6=8E=89=E6=9A=82=E6=97=B6=E7=94=A8=E4=B8=8D=E4=B8=8A?=
=?UTF-8?q?=E7=9A=84=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/org/dromara/web/controller/CaptchaController.java | 2 --
.../main/java/org/dromara/demo/controller/SmsController.java | 2 --
2 files changed, 4 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
index 8abada68a..70d79ca4f 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -14,7 +14,6 @@ import org.dromara.common.core.utils.reflect.ReflectUtils;
import org.dromara.common.mail.config.properties.MailProperties;
import org.dromara.common.mail.utils.MailUtils;
import org.dromara.common.redis.utils.RedisUtils;
-import org.dromara.common.sms.config.properties.SmsProperties;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.common.web.enums.CaptchaType;
import org.dromara.sms4j.api.SmsBlend;
@@ -48,7 +47,6 @@ import java.util.LinkedHashMap;
public class CaptchaController {
private final CaptchaProperties captchaProperties;
- private final SmsProperties smsProperties;
private final MailProperties mailProperties;
/**
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
index 048b5141e..fb1973148 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -2,8 +2,6 @@ package org.dromara.demo.controller;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
-import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.common.sms.config.properties.SmsProperties;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
From 014550c81617b442a53546b94e97dd58326f61ef Mon Sep 17 00:00:00 2001
From: konbai <1527468660@qq.com>
Date: Thu, 8 Jun 2023 20:24:24 +0800
Subject: [PATCH 020/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?=
=?UTF-8?q?=E5=BD=95=E6=A0=A1=E9=AA=8C=E9=94=99=E8=AF=AF=E6=AC=A1=E6=95=B0?=
=?UTF-8?q?=E6=9C=AA=E8=BE=BE=E5=88=B0=E4=B8=8A=E9=99=90=E6=97=B6=EF=BC=8C?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=E6=AC=A1=E6=95=B0=E7=BC=93=E5=AD=98=E6=9C=AA?=
=?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=9C=89=E6=95=88=E6=97=B6=E9=97=B4=E9=97=AE?=
=?UTF-8?q?=E9=A2=98=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/web/service/SysLoginService.java | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 689a55de1..2d816d148 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -340,25 +340,24 @@ public class SysLoginService {
String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
String loginFail = Constants.LOGIN_FAIL;
- // 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
- Integer errorNumber = RedisUtils.getCacheObject(errorKey);
+ // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip)
+ int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
// 锁定时间内登录 则踢出
- if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
+ if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
}
if (supplier.get()) {
- // 是否第一次
- errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
+ // 错误次数递增
+ errorNumber++;
+ RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
// 达到规定错误次数 则锁定登录
- if (errorNumber.equals(maxRetryCount)) {
- RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
+ if (errorNumber >= maxRetryCount) {
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} else {
- // 未达到规定错误次数 则递增
- RedisUtils.setCacheObject(errorKey, errorNumber);
+ // 未达到规定错误次数
recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
}
From e4b405491fa2ba0ede349b8f92b5b86172e2da3a Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Sat, 10 Jun 2023 21:39:31 +0800
Subject: [PATCH 021/115] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E6=8E=88=E6=9D=83=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 ++
ruoyi-admin/pom.xml | 15 +++
.../web/controller/AuthController.java | 83 +++++++++++++
.../dromara/web/service/SysLoginService.java | 65 ++++++++++
ruoyi-common/pom.xml | 1 +
ruoyi-common/ruoyi-common-auth/pom.xml | 22 ++++
.../utils/AuthUtils.java | 112 ++++++++++++++++++
.../dromara/common/core/enums/DeviceType.java | 4 +-
.../dromara/system/domain/SysAuthUser.java | 40 +++++++
.../dromara/system/mapper/SysUserMapper.java | 45 ++++++-
.../mapper/system/SysAuthUserMapper.xml | 60 ++++++++++
script/AuthSQL/sys_auth_user.sql | 14 +++
12 files changed, 466 insertions(+), 3 deletions(-)
create mode 100644 ruoyi-common/ruoyi-common-auth/pom.xml
create mode 100644 ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
create mode 100644 script/AuthSQL/sys_auth_user.sql
diff --git a/pom.xml b/pom.xml
index b20e7f059..a1e7524b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@
1.72
2.7.0
+ 1.15.6
1.33
@@ -291,6 +292,13 @@
${snakeyaml.version}
+
+
+ me.zhyd.oauth
+ JustAuth
+ ${justauth.version}
+
+
org.bouncycastle
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index af5f23967..dd4fc58e7 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,21 @@
spring-boot-starter-test
test
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.dromara
+ ruoyi-common-auth
+ 5.1.0-SNAPSHOT
+
+
+ com.aliyun
+ credentials-java
+ 0.2.4
+ compile
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index bba6113da..6d0ef7bce 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,9 +2,21 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
+import me.zhyd.oauth.cache.AuthDefaultStateCache;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthRequest;
+import me.zhyd.oauth.utils.AuthStateUtils;
+import org.dromara.common.auth.utils.AuthUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -16,6 +28,8 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -26,8 +40,11 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import java.io.IOException;
import java.net.URL;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* 认证
@@ -41,10 +58,18 @@ import java.util.List;
@RequestMapping("/auth")
public class AuthController {
+ private AuthStateCache authStateCache;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
+ private final SysUserMapper userMapper;
+ private final Map auths = new HashMap<>();
+ {
+ auths.put("gitee", "{\"clientId\":\"38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81\",\"clientSecret\":\"2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff\",\"redirectUri\":\"http://127.0.0.1:8888/social-login?source=gitee\"}");
+ auths.put("github", "{\"clientId\":\"Iv1.1be0cdcd71aca63b\",\"clientSecret\":\"0d59d28b43152bc8906011624db37b0fed88d154\",\"redirectUri\":\"http://127.0.0.1:80/social-login?source=github\"}");
+ authStateCache = AuthDefaultStateCache.INSTANCE;// 使用默认的缓存
+ }
/**
* 登录方法
@@ -115,6 +140,64 @@ public class AuthController {
return R.ok(loginVo);
}
+
+
+
+ /**
+ * 认证授权
+ * @param source
+ * @throws IOException
+ */
+ @GetMapping("/binding/{source}")
+ @ResponseBody
+ public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
+ SysUserVo userLoding = new SysUserVo();
+ if (ObjectUtil.isNull(userLoding)) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ if (userMapper.checkAuthUser(userLoding.getUserId(),source) > 0)
+ {
+ return R.fail(source + "平台账号已经绑定");
+ }
+ String obj = auths.get(source);
+ if (StringUtils.isEmpty(obj))
+ {
+ return R.fail(source + "平台账号暂不支持");
+ }
+ JSONObject json = JSONUtil.parseObj(obj);
+ AuthRequest authRequest = AuthUtils.getAuthRequest(source,
+ json.getStr("clientId"),
+ json.getStr("clientSecret"),
+ json.getStr("redirectUri"), authStateCache);
+ String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
+ return R.ok(authorizeUrl);
+ }
+
+ /**
+ * @param source
+ * @param callback
+ * @param request
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @GetMapping("/social-login/{source}")
+ public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
+ String obj = auths.get(source);
+ if (StringUtils.isEmpty(obj))
+ {
+ return R.fail("第三方平台系统不支持或未提供来源");
+ }
+ JSONObject json = JSONUtil.parseObj(obj);
+ AuthRequest authRequest = AuthUtils.getAuthRequest(source,
+ json.getStr("clientId"),
+ json.getStr("clientSecret"),
+ json.getStr("redirectUri"), authStateCache);
+ AuthResponse response = authRequest.login(callback);
+ return loginService.socialLogin(source, response, request);
+ }
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 689a55de1..b152710cb 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,11 +6,15 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -28,6 +32,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -37,6 +42,7 @@ import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -154,6 +160,65 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
+
+ /**
+ * 认证授权登录
+ * @param source
+ * @throws IOException
+ */
+ /**
+ * 社交登录
+ * @param source 登录来源
+ * @param authUser 授权响应实体
+ * @param request Http请求对象
+ * @return 统一响应实体
+ * @throws IOException
+ */
+ public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
+ // 判断授权响应是否成功
+ if (!authUser.ok()) {
+ return R.fail("对不起,授权信息验证不通过,请联系管理员");
+ }
+ AuthUser authUserData = authUser.getData();
+ // 判断数据库中是否已存在该用户
+ SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
+ if (ObjectUtil.isNotNull(user)) {
+ checkTenant(user.getTenantId());
+ SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
+ // 登录
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
+ recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(user.getUserId());
+ return R.ok(StpUtil.getTokenValue());
+ } else {
+ if (LoginHelper.getUserId() == null) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ // 组装授权用户信息
+ SysAuthUser sysAuthUser = new SysAuthUser();
+ sysAuthUser.setAvatar(authUserData.getAvatar());
+ sysAuthUser.setUuid(source + authUserData.getUuid());
+ sysAuthUser.setUserId(LoginHelper.getUserId());
+ sysAuthUser.setUserName(authUserData.getUsername());
+ sysAuthUser.setNickName(authUserData.getNickname());
+ sysAuthUser.setEmail(authUserData.getEmail());
+ sysAuthUser.setSource(source);
+ sysAuthUser.setCreateTime(new Date().toString());
+ // 新用户,绑定第三方账号
+ userMapper.insertAuthUser(sysAuthUser);
+ SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
+ checkTenant(lodingData.getTenantId());
+ LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
+ recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(sysAuthUser.getUserId());
+ return R.ok(StpUtil.getTokenValue());
+ }
+ }
+
+
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 0428aea78..4813f7985 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,6 +11,7 @@
ruoyi-common-bom
+ ruoyi-common-auth
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-auth/pom.xml b/ruoyi-common/ruoyi-common-auth/pom.xml
new file mode 100644
index 000000000..9af89e612
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-auth/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ org.dromara
+ ruoyi-common
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ ruoyi-common-auth
+
+ ruoyi-common-auth 认证模块
+
+
+
+ me.zhyd.oauth
+ JustAuth
+
+
+
diff --git a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
new file mode 100644
index 000000000..981b3be6d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
@@ -0,0 +1,112 @@
+package org.dromara.common.auth.utils;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.request.*;
+
+/**
+ * 认证授权工具类
+ *
+ * @author ruoyi
+ */
+public class AuthUtils {
+ public static AuthRequest getAuthRequest(String source, String clientId, String clientSecret, String redirectUri,
+ AuthStateCache authStateCache)
+ {
+ AuthRequest authRequest = null;
+ switch (source.toLowerCase()) {
+ case "dingtalk" ->
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "baidu" ->
+ authRequest = new AuthBaiduRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "github" ->
+ authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "gitee" ->
+ authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "weibo" ->
+ authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "coding" ->
+ authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).codingGroupName("").build(), authStateCache);
+ case "oschina" ->
+ authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "alipay" ->
+ // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
+ authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .alipayPublicKey("").redirectUri(redirectUri).build(), authStateCache);
+ case "qq" ->
+ authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "csdn" ->
+ authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "taobao" ->
+ authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "douyin" ->
+ authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "linkedin" ->
+ authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "mi" ->
+ authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "toutiao" ->
+ authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "renren" ->
+ authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build(),
+ authStateCache);
+ case "huawei" ->
+ authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "wechat_enterprise" ->
+ authRequest = new AuthWeChatEnterpriseRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build(), authStateCache);
+ case "kujiale" ->
+ authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "gitlab" ->
+ authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "meituan" ->
+ authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "eleme" ->
+ authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_mp" ->
+ authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "aliyun" ->
+ authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ default -> {
+ }
+ }
+ if (null == authRequest)
+ {
+ throw new AuthException("未获取到有效的Auth配置");
+ }
+ return authRequest;
+ }
+}
+
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 09bf44b6d..7127bbb83 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,7 +26,9 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx");
+ XCX("xcx"),
+
+ auth("auth");
private final String device;
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
new file mode 100644
index 000000000..5008786e3
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
@@ -0,0 +1,40 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName("sys_auth_user")
+public class SysAuthUser {
+
+ private static final long serialVersionUID = 1L;
+
+ /** 授权ID */
+ private Long authId;
+
+ /** 第三方平台用户唯一ID */
+ private String uuid;
+
+ /** 系统用户ID */
+ private Long userId;
+
+ /** 登录账号 */
+ private String userName;
+
+ /** 用户昵称 */
+ private String nickName;
+
+ /** 头像地址 */
+ private String avatar;
+
+ /** 用户邮箱 */
+ private String email;
+
+ /** 用户来源 */
+ private String source;
+
+ private String createTime;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
index 81bd1ff3d..94c9c1e75 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysUserVo;
import org.apache.ibatis.annotations.Param;
@@ -123,8 +124,8 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@DataPermission({
- @DataColumn(key = "deptName", value = "d.dept_id"),
- @DataColumn(key = "userName", value = "u.user_id")
+ @DataColumn(key = "deptName", value = "d.dept_id"),// 部门权限
+ @DataColumn(key = "userName", value = "u.user_id")// 用户权限
})
SysUserVo selectUserById(Long userId);
@@ -142,4 +143,44 @@ public interface SysUserMapper extends BaseMapperPlus {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
+ /**
+ * 根据用户编号查询授权列表
+ *
+ * @param userId 用户编号
+ * @return 授权列表
+ */
+ public List selectAuthUserListByUserId(Long userId);
+
+ /**
+ * 根据uuid查询用户信息
+ *
+ * @param uuid 唯一信息
+ * @return 结果
+ */
+ public SysUserVo selectAuthUserByUuid(String uuid);
+
+ /**
+ * 校验source平台是否绑定
+ *
+ * @param userId 用户编号
+ * @param source 绑定平台
+ * @return 结果
+ */
+ public int checkAuthUser(@Param("userId") Long userId, @Param("source") String source);
+
+ /**
+ * 新增第三方授权信息
+ *
+ * @param authUser 用户信息
+ * @return 结果
+ */
+ public int insertAuthUser(SysAuthUser authUser);
+
+ /**
+ * 根据编号删除第三方授权信息
+ *
+ * @param authId 授权编号
+ * @return 结果
+ */
+ public int deleteAuthUser(Long authId);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
new file mode 100644
index 000000000..864b3ba32
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select b.user_id as user_id, b.user_name as user_name, b.password as password , a.tenant_id as tenant_id
+ from sys_auth_user a left join sys_user b on a.user_id = b.user_id
+ where a.uuid = #{uuid} and b.del_flag = '0'
+
+
+
+ select auth_id, uuid, user_id, user_name, nick_name, avatar, email, source, create_time, tenant_id from sys_auth_user where user_id = #{userId}
+
+
+
+ select count(1) from sys_auth_user where user_id=#{userId} and source=#{source} limit 1
+
+
+
+ insert into sys_auth_user(
+ uuid,
+ user_id,
+ user_name,
+ nick_name,
+ avatar,
+ email,
+ source,
+ create_time
+ )values(
+ #{uuid},
+ #{userId},
+ #{userName},
+ #{nickName},
+ #{avatar},
+ #{email},
+ #{source},
+ now()
+ )
+
+
+
+ delete from sys_auth_user where auth_id = #{authId}
+
+
+
diff --git a/script/AuthSQL/sys_auth_user.sql b/script/AuthSQL/sys_auth_user.sql
new file mode 100644
index 000000000..4a416753b
--- /dev/null
+++ b/script/AuthSQL/sys_auth_user.sql
@@ -0,0 +1,14 @@
+CREATE TABLE `sys_auth_user` (
+ `auth_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权ID',
+ `uuid` varchar(500) NOT NULL COMMENT '第三方平台用户唯一ID',
+ `user_id` bigint(20) unsigned NOT NULL COMMENT '系统用户ID',
+ `user_name` varchar(30) NOT NULL COMMENT '登录账号',
+ `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
+ `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
+ `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
+ `source` varchar(255) DEFAULT '' COMMENT '用户来源',
+ ` tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户id',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `tenant_id` varchar(25) NOT NULL DEFAULT '000000',
+ PRIMARY KEY (`auth_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COMMENT='第三方平台授权用户信息表';
From 2d894c13096c43ae6d6cf6a4462e1153881ab864 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=B8=89=E4=B8=AA=E4=B8=89?= <2029364173@qq.com>
Date: Sun, 11 Jun 2023 19:26:14 +0000
Subject: [PATCH 022/115] =?UTF-8?q?Revert=20"=E6=96=B0=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit e4b405491fa2ba0ede349b8f92b5b86172e2da3a.
---
pom.xml | 8 --
ruoyi-admin/pom.xml | 15 ---
.../web/controller/AuthController.java | 83 -------------
.../dromara/web/service/SysLoginService.java | 65 ----------
ruoyi-common/pom.xml | 1 -
ruoyi-common/ruoyi-common-auth/pom.xml | 22 ----
.../utils/AuthUtils.java | 112 ------------------
.../dromara/common/core/enums/DeviceType.java | 4 +-
.../dromara/system/domain/SysAuthUser.java | 40 -------
.../dromara/system/mapper/SysUserMapper.java | 45 +------
.../mapper/system/SysAuthUserMapper.xml | 60 ----------
script/AuthSQL/sys_auth_user.sql | 14 ---
12 files changed, 3 insertions(+), 466 deletions(-)
delete mode 100644 ruoyi-common/ruoyi-common-auth/pom.xml
delete mode 100644 ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
delete mode 100644 script/AuthSQL/sys_auth_user.sql
diff --git a/pom.xml b/pom.xml
index a1e7524b6..b20e7f059 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,6 @@
1.72
2.7.0
- 1.15.6
1.33
@@ -292,13 +291,6 @@
${snakeyaml.version}
-
-
- me.zhyd.oauth
- JustAuth
- ${justauth.version}
-
-
org.bouncycastle
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index dd4fc58e7..af5f23967 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,21 +75,6 @@
spring-boot-starter-test
test
-
- me.zhyd.oauth
- JustAuth
-
-
- org.dromara
- ruoyi-common-auth
- 5.1.0-SNAPSHOT
-
-
- com.aliyun
- credentials-java
- 0.2.4
- compile
-
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index 6d0ef7bce..bba6113da 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,21 +2,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSON;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
-import me.zhyd.oauth.cache.AuthDefaultStateCache;
-import me.zhyd.oauth.cache.AuthStateCache;
-import me.zhyd.oauth.model.AuthCallback;
-import me.zhyd.oauth.model.AuthResponse;
-import me.zhyd.oauth.model.AuthUser;
-import me.zhyd.oauth.request.AuthRequest;
-import me.zhyd.oauth.utils.AuthStateUtils;
-import org.dromara.common.auth.utils.AuthUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -28,8 +16,6 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
-import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -40,11 +26,8 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.io.IOException;
import java.net.URL;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* 认证
@@ -58,18 +41,10 @@ import java.util.Map;
@RequestMapping("/auth")
public class AuthController {
- private AuthStateCache authStateCache;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
- private final SysUserMapper userMapper;
- private final Map auths = new HashMap<>();
- {
- auths.put("gitee", "{\"clientId\":\"38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81\",\"clientSecret\":\"2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff\",\"redirectUri\":\"http://127.0.0.1:8888/social-login?source=gitee\"}");
- auths.put("github", "{\"clientId\":\"Iv1.1be0cdcd71aca63b\",\"clientSecret\":\"0d59d28b43152bc8906011624db37b0fed88d154\",\"redirectUri\":\"http://127.0.0.1:80/social-login?source=github\"}");
- authStateCache = AuthDefaultStateCache.INSTANCE;// 使用默认的缓存
- }
/**
* 登录方法
@@ -140,64 +115,6 @@ public class AuthController {
return R.ok(loginVo);
}
-
-
-
- /**
- * 认证授权
- * @param source
- * @throws IOException
- */
- @GetMapping("/binding/{source}")
- @ResponseBody
- public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
- SysUserVo userLoding = new SysUserVo();
- if (ObjectUtil.isNull(userLoding)) {
- return R.fail("授权失败,请先登录再绑定");
- }
- if (userMapper.checkAuthUser(userLoding.getUserId(),source) > 0)
- {
- return R.fail(source + "平台账号已经绑定");
- }
- String obj = auths.get(source);
- if (StringUtils.isEmpty(obj))
- {
- return R.fail(source + "平台账号暂不支持");
- }
- JSONObject json = JSONUtil.parseObj(obj);
- AuthRequest authRequest = AuthUtils.getAuthRequest(source,
- json.getStr("clientId"),
- json.getStr("clientSecret"),
- json.getStr("redirectUri"), authStateCache);
- String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
- return R.ok(authorizeUrl);
- }
-
- /**
- * @param source
- * @param callback
- * @param request
- * @return
- */
- @SuppressWarnings("unchecked")
- @GetMapping("/social-login/{source}")
- public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
- String obj = auths.get(source);
- if (StringUtils.isEmpty(obj))
- {
- return R.fail("第三方平台系统不支持或未提供来源");
- }
- JSONObject json = JSONUtil.parseObj(obj);
- AuthRequest authRequest = AuthUtils.getAuthRequest(source,
- json.getStr("clientId"),
- json.getStr("clientSecret"),
- json.getStr("redirectUri"), authStateCache);
- AuthResponse response = authRequest.login(callback);
- return loginService.socialLogin(source, response, request);
- }
-
-
-
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index b152710cb..689a55de1 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,15 +6,11 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import me.zhyd.oauth.model.AuthResponse;
-import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
-import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -32,7 +28,6 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
-import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -42,7 +37,6 @@ import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
-import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -160,65 +154,6 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
-
- /**
- * 认证授权登录
- * @param source
- * @throws IOException
- */
- /**
- * 社交登录
- * @param source 登录来源
- * @param authUser 授权响应实体
- * @param request Http请求对象
- * @return 统一响应实体
- * @throws IOException
- */
- public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
- // 判断授权响应是否成功
- if (!authUser.ok()) {
- return R.fail("对不起,授权信息验证不通过,请联系管理员");
- }
- AuthUser authUserData = authUser.getData();
- // 判断数据库中是否已存在该用户
- SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
- if (ObjectUtil.isNotNull(user)) {
- checkTenant(user.getTenantId());
- SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
- // 登录
- LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
- recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(user.getUserId());
- return R.ok(StpUtil.getTokenValue());
- } else {
- if (LoginHelper.getUserId() == null) {
- return R.fail("授权失败,请先登录再绑定");
- }
- // 组装授权用户信息
- SysAuthUser sysAuthUser = new SysAuthUser();
- sysAuthUser.setAvatar(authUserData.getAvatar());
- sysAuthUser.setUuid(source + authUserData.getUuid());
- sysAuthUser.setUserId(LoginHelper.getUserId());
- sysAuthUser.setUserName(authUserData.getUsername());
- sysAuthUser.setNickName(authUserData.getNickname());
- sysAuthUser.setEmail(authUserData.getEmail());
- sysAuthUser.setSource(source);
- sysAuthUser.setCreateTime(new Date().toString());
- // 新用户,绑定第三方账号
- userMapper.insertAuthUser(sysAuthUser);
- SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
- checkTenant(lodingData.getTenantId());
- LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
- recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(sysAuthUser.getUserId());
- return R.ok(StpUtil.getTokenValue());
- }
- }
-
-
-
-
-
/**
* 退出登录
*/
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 4813f7985..0428aea78 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,7 +11,6 @@
ruoyi-common-bom
- ruoyi-common-auth
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-auth/pom.xml b/ruoyi-common/ruoyi-common-auth/pom.xml
deleted file mode 100644
index 9af89e612..000000000
--- a/ruoyi-common/ruoyi-common-auth/pom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- org.dromara
- ruoyi-common
- ${revision}
- ../pom.xml
-
- 4.0.0
- ruoyi-common-auth
-
- ruoyi-common-auth 认证模块
-
-
-
- me.zhyd.oauth
- JustAuth
-
-
-
diff --git a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
deleted file mode 100644
index 981b3be6d..000000000
--- a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.dromara.common.auth.utils;
-import me.zhyd.oauth.cache.AuthStateCache;
-import me.zhyd.oauth.config.AuthConfig;
-import me.zhyd.oauth.exception.AuthException;
-import me.zhyd.oauth.request.*;
-
-/**
- * 认证授权工具类
- *
- * @author ruoyi
- */
-public class AuthUtils {
- public static AuthRequest getAuthRequest(String source, String clientId, String clientSecret, String redirectUri,
- AuthStateCache authStateCache)
- {
- AuthRequest authRequest = null;
- switch (source.toLowerCase()) {
- case "dingtalk" ->
- authRequest = new AuthDingTalkRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "baidu" ->
- authRequest = new AuthBaiduRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "github" ->
- authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "gitee" ->
- authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "weibo" ->
- authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "coding" ->
- authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).codingGroupName("").build(), authStateCache);
- case "oschina" ->
- authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "alipay" ->
- // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
- authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .alipayPublicKey("").redirectUri(redirectUri).build(), authStateCache);
- case "qq" ->
- authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "csdn" ->
- authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "taobao" ->
- authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "douyin" ->
- authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "linkedin" ->
- authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "mi" ->
- authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "toutiao" ->
- authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "renren" ->
- authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build(),
- authStateCache);
- case "huawei" ->
- authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "wechat_enterprise" ->
- authRequest = new AuthWeChatEnterpriseRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build(), authStateCache);
- case "kujiale" ->
- authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "gitlab" ->
- authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "meituan" ->
- authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "eleme" ->
- authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build());
- case "wechat_mp" ->
- authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "aliyun" ->
- authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- default -> {
- }
- }
- if (null == authRequest)
- {
- throw new AuthException("未获取到有效的Auth配置");
- }
- return authRequest;
- }
-}
-
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 7127bbb83..09bf44b6d 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,9 +26,7 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx"),
-
- auth("auth");
+ XCX("xcx");
private final String device;
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
deleted file mode 100644
index 5008786e3..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.dromara.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@TableName("sys_auth_user")
-public class SysAuthUser {
-
- private static final long serialVersionUID = 1L;
-
- /** 授权ID */
- private Long authId;
-
- /** 第三方平台用户唯一ID */
- private String uuid;
-
- /** 系统用户ID */
- private Long userId;
-
- /** 登录账号 */
- private String userName;
-
- /** 用户昵称 */
- private String nickName;
-
- /** 头像地址 */
- private String avatar;
-
- /** 用户邮箱 */
- private String email;
-
- /** 用户来源 */
- private String source;
-
- private String createTime;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
index 94c9c1e75..81bd1ff3d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysUserVo;
import org.apache.ibatis.annotations.Param;
@@ -124,8 +123,8 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@DataPermission({
- @DataColumn(key = "deptName", value = "d.dept_id"),// 部门权限
- @DataColumn(key = "userName", value = "u.user_id")// 用户权限
+ @DataColumn(key = "deptName", value = "d.dept_id"),
+ @DataColumn(key = "userName", value = "u.user_id")
})
SysUserVo selectUserById(Long userId);
@@ -143,44 +142,4 @@ public interface SysUserMapper extends BaseMapperPlus {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
- /**
- * 根据用户编号查询授权列表
- *
- * @param userId 用户编号
- * @return 授权列表
- */
- public List selectAuthUserListByUserId(Long userId);
-
- /**
- * 根据uuid查询用户信息
- *
- * @param uuid 唯一信息
- * @return 结果
- */
- public SysUserVo selectAuthUserByUuid(String uuid);
-
- /**
- * 校验source平台是否绑定
- *
- * @param userId 用户编号
- * @param source 绑定平台
- * @return 结果
- */
- public int checkAuthUser(@Param("userId") Long userId, @Param("source") String source);
-
- /**
- * 新增第三方授权信息
- *
- * @param authUser 用户信息
- * @return 结果
- */
- public int insertAuthUser(SysAuthUser authUser);
-
- /**
- * 根据编号删除第三方授权信息
- *
- * @param authId 授权编号
- * @return 结果
- */
- public int deleteAuthUser(Long authId);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
deleted file mode 100644
index 864b3ba32..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- select b.user_id as user_id, b.user_name as user_name, b.password as password , a.tenant_id as tenant_id
- from sys_auth_user a left join sys_user b on a.user_id = b.user_id
- where a.uuid = #{uuid} and b.del_flag = '0'
-
-
-
- select auth_id, uuid, user_id, user_name, nick_name, avatar, email, source, create_time, tenant_id from sys_auth_user where user_id = #{userId}
-
-
-
- select count(1) from sys_auth_user where user_id=#{userId} and source=#{source} limit 1
-
-
-
- insert into sys_auth_user(
- uuid,
- user_id,
- user_name,
- nick_name,
- avatar,
- email,
- source,
- create_time
- )values(
- #{uuid},
- #{userId},
- #{userName},
- #{nickName},
- #{avatar},
- #{email},
- #{source},
- now()
- )
-
-
-
- delete from sys_auth_user where auth_id = #{authId}
-
-
-
diff --git a/script/AuthSQL/sys_auth_user.sql b/script/AuthSQL/sys_auth_user.sql
deleted file mode 100644
index 4a416753b..000000000
--- a/script/AuthSQL/sys_auth_user.sql
+++ /dev/null
@@ -1,14 +0,0 @@
-CREATE TABLE `sys_auth_user` (
- `auth_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权ID',
- `uuid` varchar(500) NOT NULL COMMENT '第三方平台用户唯一ID',
- `user_id` bigint(20) unsigned NOT NULL COMMENT '系统用户ID',
- `user_name` varchar(30) NOT NULL COMMENT '登录账号',
- `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
- `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
- `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
- `source` varchar(255) DEFAULT '' COMMENT '用户来源',
- ` tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户id',
- `create_time` datetime DEFAULT NULL COMMENT '创建时间',
- `tenant_id` varchar(25) NOT NULL DEFAULT '000000',
- PRIMARY KEY (`auth_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COMMENT='第三方平台授权用户信息表';
From 1275e416cd6ef56c91657524532bea4c66a42c62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Mon, 12 Jun 2023 14:04:53 +0800
Subject: [PATCH 023/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20common-core?=
=?UTF-8?q?=20=E5=8C=85=E4=BD=BF=E7=94=A8aop=E6=B3=A8=E8=A7=A3=20=E4=BD=86?=
=?UTF-8?q?=E6=9C=AA=E6=B7=BB=E5=8A=A0aop=E5=AE=9E=E7=8E=B0=E7=B1=BB?=
=?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8D=95=E7=8B=AC=E4=BD=BF=E7=94=A8=E6=8A=A5?=
=?UTF-8?q?=E9=94=99=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-common/ruoyi-common-core/pom.xml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml
index 8f3740fd9..33f9f7fc4 100644
--- a/ruoyi-common/ruoyi-common-core/pom.xml
+++ b/ruoyi-common/ruoyi-common-core/pom.xml
@@ -34,6 +34,11 @@
spring-boot-starter-validation
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
org.apache.commons
From be774f5ca6acaf3dc448b125f44b7a1315ec1c0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Mon, 12 Jun 2023 15:45:52 +0800
Subject: [PATCH 024/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=84=B1?=
=?UTF-8?q?=E5=AF=86=E9=80=BB=E8=BE=91=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/system/service/impl/SysSensitiveServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
index 1302118db..1202c33f2 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java
@@ -22,7 +22,7 @@ public class SysSensitiveServiceImpl implements SensitiveService {
@Override
public boolean isSensitive() {
if (TenantHelper.isEnable()) {
- return !LoginHelper.isSuperAdmin() || !LoginHelper.isTenantAdmin();
+ return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin();
}
return !LoginHelper.isSuperAdmin();
}
From 76dc2398757a4038f1930fb475a55983a9a8077a Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 00:58:01 +0800
Subject: [PATCH 025/115] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 +
ruoyi-admin/pom.xml | 10 +
.../dromara/web/service/SysLoginService.java | 90 +-
ruoyi-common/pom.xml | 1 +
ruoyi-common/ruoyi-common-social/pom.xml | 38 +
.../common/social/config/SocialConfig.java | 24 +
.../config/properties/SocialProperties.java | 39 +
.../common/social/utils/SocialUtils.java | 119 ++
.../system/SocialUserController.java | 105 ++
.../org/dromara/system/domain/SocialUser.java | 136 ++
.../system/domain/bo/SocialUserBo.java | 141 ++
.../system/domain/vo/SocialUserVo.java | 162 ++
.../system/mapper/SocialUserMapper.java | 23 +
.../system/service/ISocialUserService.java | 71 +
.../service/impl/SocialUserServiceImpl.java | 162 ++
.../mapper/system/SocialUserMapper.xml | 68 +
script/sql/ry_vue_5.X.sql | 1622 +++++++++++------
17 files changed, 2223 insertions(+), 596 deletions(-)
create mode 100644 ruoyi-common/ruoyi-common-social/pom.xml
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
diff --git a/pom.xml b/pom.xml
index b20e7f059..e69ab1532 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,7 @@
0.2.0
1.18.26
1.72
+ 1.16.5
2.7.0
@@ -111,6 +112,13 @@
import
+
+
+ me.zhyd.oauth
+ JustAuth
+ ${justauth.version}
+
+
org.dromara
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index af5f23967..e57c444a7 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,16 @@
spring-boot-starter-test
test
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.dromara
+ ruoyi-common-social
+ 5.1.0-SNAPSHOT
+ compile
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 689a55de1..3628b05d7 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,11 +6,15 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -29,14 +33,21 @@ import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SocialUserMapper;
import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
+import org.dromara.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -53,6 +64,8 @@ import java.util.function.Supplier;
public class SysLoginService {
private final SysUserMapper userMapper;
+ private final ISocialUserService socialUserService;
+ private final ISysUserService userService;
private final CaptchaProperties captchaProperties;
private final ISysPermissionService permissionService;
private final ISysTenantService tenantService;
@@ -154,6 +167,44 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
+ /**
+ * 社交登录
+ *
+ * @param source 登录来源
+ * @param authUser 授权响应实体
+ * @param request Http请求对象
+ * @return 统一响应实体
+ */
+ public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
+ // 判断授权响应是否成功
+ if (!authUser.ok()) {
+ return R.fail("对不起,授权信息验证不通过,请退出重试!");
+ }
+ AuthUser authUserData = authUser.getData();
+ // 查询社交用户信息,判断是否已经绑定,如果已经绑定则直接登录,否则验证是否登录,未登录则先登录再绑定
+ SocialUserVo user = socialUserService.selectSocialUserByAuthId(source + authUserData.getUuid());
+ if (ObjectUtil.isNotNull(user)) {
+ checkTenant(user.getTenantId());
+ SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
+ recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(user.getUserId());
+ } else {
+ // 判断是否已登录
+ if (LoginHelper.getUserId() == null) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ SocialUserBo socialUserBo = new SocialUserBo();
+ socialUserService.insertByBo(setAuthUserData(authUserData, socialUserBo));
+ SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
+ checkTenant(lodingData.getTenantId());
+ LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.SOCIAL);
+ recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(socialUserBo.getUserId());
+ }
+ return R.ok(StpUtil.getTokenValue());
+ }
+
/**
* 退出登录
*/
@@ -235,9 +286,9 @@ public class SysLoginService {
private SysUserVo loadUserByUsername(String tenantId, String username) {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
- .select(SysUser::getUserName, SysUser::getStatus)
- .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
- .eq(SysUser::getUserName, username));
+ .select(SysUser::getUserName, SysUser::getStatus)
+ .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+ .eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
@@ -253,9 +304,9 @@ public class SysLoginService {
private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
- .select(SysUser::getPhonenumber, SysUser::getStatus)
- .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
- .eq(SysUser::getPhonenumber, phonenumber));
+ .select(SysUser::getPhonenumber, SysUser::getStatus)
+ .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+ .eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber);
throw new UserException("user.not.exists", phonenumber);
@@ -383,10 +434,35 @@ public class SysLoginService {
log.info("登录租户:{} 已被停用.", tenantId);
throw new TenantException("tenant.blocked");
} else if (ObjectUtil.isNotNull(tenant.getExpireTime())
- && new Date().after(tenant.getExpireTime())) {
+ && new Date().after(tenant.getExpireTime())) {
log.info("登录租户:{} 已超过有效期.", tenantId);
throw new TenantException("tenant.expired");
}
}
+
+ public SocialUserBo setAuthUserData(AuthUser authUserData, SocialUserBo socialUser) {
+ socialUser.setUserId(LoginHelper.getUserId());
+ socialUser.setAuthId(authUserData.getSource() + authUserData.getUuid());
+ socialUser.setSource(authUserData.getSource());
+ socialUser.setUserName(authUserData.getUsername());
+ socialUser.setNickName(authUserData.getNickname());
+ socialUser.setAvatar(authUserData.getAvatar());
+ socialUser.setEmail(authUserData.getEmail());
+ socialUser.setOpenId(authUserData.getUuid());
+ socialUser.setAccessToken(authUserData.getToken().getAccessToken());
+ socialUser.setExpireIn(authUserData.getToken().getExpireIn());
+ socialUser.setRefreshToken(authUserData.getToken().getRefreshToken());
+ socialUser.setAccessCode(authUserData.getToken().getAccessCode());
+ socialUser.setUnionId(authUserData.getToken().getUnionId());
+ socialUser.setScope(authUserData.getToken().getScope());
+ socialUser.setTokenType(authUserData.getToken().getTokenType());
+ socialUser.setIdToken(authUserData.getToken().getIdToken());
+ socialUser.setMacAlgorithm(authUserData.getToken().getMacAlgorithm());
+ socialUser.setMacKey(authUserData.getToken().getMacKey());
+ socialUser.setCode(authUserData.getToken().getCode());
+ socialUser.setOauthToken(authUserData.getToken().getOauthToken());
+ socialUser.setOauthTokenSecret(authUserData.getToken().getOauthTokenSecret());
+ return socialUser;
+ }
}
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 0428aea78..45493d3e9 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,6 +11,7 @@
ruoyi-common-bom
+ ruoyi-common-social
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml
new file mode 100644
index 000000000..b87479b4b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/pom.xml
@@ -0,0 +1,38 @@
+
+
+
+ org.dromara
+ ruoyi-common
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ ruoyi-common-social
+
+ ruoyi-common-auth 认证模块
+
+
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.projectlombok
+ lombok
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.dromara
+ ruoyi-common-redis
+
+
+
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
new file mode 100644
index 000000000..c50c56038
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
@@ -0,0 +1,24 @@
+package org.dromara.common.social.config;
+
+import me.zhyd.oauth.cache.AuthStateCache;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.AuthRedisStateCache;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * Social 配置属性
+ * @author thiszhc
+ */
+@AutoConfiguration
+@EnableConfigurationProperties(SocialProperties.class)
+public class SocialConfig {
+
+ @Bean
+ public AuthStateCache redis() {
+ return new AuthRedisStateCache();
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
new file mode 100644
index 000000000..4240ebabd
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
@@ -0,0 +1,39 @@
+package org.dromara.common.social.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * Social 配置属性
+ * @author thiszhc
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "justauth")
+public class SocialProperties {
+
+ /**
+ * 是否启用
+ */
+ private boolean enabled;
+
+ /**
+ * 授权类型
+ */
+ private Map type;
+
+ /**
+ * 授权过期时间
+ */
+ private long timeout;
+
+ /**
+ * 授权缓存配置
+ */
+ private CacheProperties cache = new CacheProperties();
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
new file mode 100644
index 000000000..b3a1cd1f4
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -0,0 +1,119 @@
+package org.dromara.common.social.utils;
+
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.request.*;
+
+/**
+ * 认证授权工具类
+ *
+ * @author thiszhc
+ */
+public class SocialUtils {
+
+ public static AuthRequest getAuthRequest(String source,
+ String clientId,
+ String clientSecret,
+ String redirectUri) throws AuthException {
+ AuthRequest authRequest = null;
+ switch (source.toLowerCase()) {
+ case "dingtalk" ->
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder().
+ clientId(clientId).
+ clientSecret(clientSecret)
+ .redirectUri(redirectUri).
+ build());
+ case "baidu" ->
+ authRequest = new AuthBaiduRequest(AuthConfig.builder().
+ clientId(clientId).
+ clientSecret(clientSecret)
+ .redirectUri(redirectUri).
+ build());
+ case "github" ->
+ authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "gitee" ->
+ authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "weibo" ->
+ authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "coding" ->
+ authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "oschina" ->
+ authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "alipay" ->
+ // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
+ authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .alipayPublicKey("").redirectUri(redirectUri).build());
+ case "qq" ->
+ authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "csdn" ->
+ authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "taobao" ->
+ authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "douyin" ->
+ authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "linkedin" ->
+ authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "mi" ->
+ authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "toutiao" ->
+ authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "renren" ->
+ authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build());
+ case "huawei" ->
+ authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_enterprise" ->
+ authRequest = new AuthWeChatEnterpriseQrcodeRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build());
+ case "kujiale" ->
+ authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "gitlab" ->
+ authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "meituan" ->
+ authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "eleme" ->
+ authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_mp" ->
+ authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "aliyun" ->
+ authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ default -> {
+ }
+ }
+ if (null == authRequest) {
+ throw new AuthException("未获取到有效的Auth配置");
+ }
+ return authRequest;
+ }
+}
+
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
new file mode 100644
index 000000000..91994062f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
@@ -0,0 +1,105 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.service.ISocialUserService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 社会化关系
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/socialUser")
+public class SocialUserController extends BaseController {
+
+ private final ISocialUserService socialUserService;
+
+ /**
+ * 查询社会化关系列表
+ */
+ @SaCheckPermission("system:user:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SocialUserBo bo, PageQuery pageQuery) {
+ return socialUserService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出社会化关系列表
+ */
+ @SaCheckPermission("system:user:export")
+ @Log(title = "社会化关系", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SocialUserBo bo, HttpServletResponse response) {
+ List list = socialUserService.queryList(bo);
+ ExcelUtil.exportExcel(list, "社会化关系", SocialUserVo.class, response);
+ }
+
+ /**
+ * 获取社会化关系详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:user:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(socialUserService.queryById(id));
+ }
+
+ /**
+ * 新增社会化关系
+ */
+ @SaCheckPermission("system:user:add")
+ @Log(title = "社会化关系", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SocialUserBo bo) {
+ return toAjax(socialUserService.insertByBo(bo));
+ }
+
+ /**
+ * 修改社会化关系
+ */
+ @SaCheckPermission("system:user:edit")
+ @Log(title = "社会化关系", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SocialUserBo bo) {
+ return toAjax(socialUserService.updateByBo(bo));
+ }
+
+ /**
+ * 删除社会化关系
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:user:remove")
+ @Log(title = "社会化关系", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(socialUserService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
new file mode 100644
index 000000000..5258b36cc
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
@@ -0,0 +1,136 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 社会化关系对象 social_user
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("social_user")
+public class SocialUser extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ private Long userId;
+
+ /**
+ * 授权的第三方账号
+ */
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ private String avatar;
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ private String scope;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
new file mode 100644
index 000000000..8d9ae6099
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
@@ -0,0 +1,141 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.system.domain.SocialUser;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 社会化关系业务对象 social_user
+ *
+ * @author Lion Li
+ * @date 2023-06-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SocialUser.class, reverseConvertGenerate = false)
+public class SocialUserBo extends TenantEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ @NotBlank(message = "的唯一ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ @NotBlank(message = "用户的 open id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ @NotBlank(message = "用户的 ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ private String scope;
+
+ /**
+ * 授权的第三方账号
+ */
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ private String avatar;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
new file mode 100644
index 000000000..77643ac96
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
@@ -0,0 +1,162 @@
+package org.dromara.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.system.domain.SocialUser;
+
+import java.io.Serial;
+
+
+
+/**
+ * 社会化关系视图对象 social_user
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SocialUser.class)
+public class SocialUserVo extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ @ExcelProperty(value = "授权UUID")
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ @ExcelProperty(value = "用户来源")
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ @ExcelProperty(value = "用户的授权令牌")
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ @ExcelProperty(value = "用户的授权令牌的有效期,部分平台可能没有")
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ @ExcelProperty(value = "刷新令牌,部分平台可能没有")
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ @ExcelProperty(value = "用户的 open id")
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ @ExcelProperty(value = "用户的 ID")
+ private Long userId;
+
+ /**
+ * 授权的第三方账号
+ */
+ @ExcelProperty(value = "授权的第三方账号")
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ @ExcelProperty(value = "授权的第三方昵称")
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ @ExcelProperty(value = "授权的第三方邮箱")
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ @ExcelProperty(value = "授权的第三方头像地址")
+ private String avatar;
+
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ @ExcelProperty(value = "平台的授权信息,部分平台可能没有")
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ @ExcelProperty(value = "用户的 unionid")
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ @ExcelProperty(value = "授予的权限,部分平台可能没有")
+ private String scope;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ @ExcelProperty(value = "个别平台的授权信息,部分平台可能没有")
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ @ExcelProperty(value = "id token,部分平台可能没有")
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "小米平台用户的附带属性,部分平台可能没有")
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "小米平台用户的附带属性,部分平台可能没有")
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ @ExcelProperty(value = "用户的授权code,部分平台可能没有")
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "Twitter平台用户的附带属性,部分平台可能没有")
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "Twitter平台用户的附带属性,部分平台可能没有")
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
new file mode 100644
index 000000000..f110d5d2a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
@@ -0,0 +1,23 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 社会化关系Mapper接口
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+public interface SocialUserMapper extends BaseMapperPlus {
+
+ /**
+ * 根据authId查询SocialUser表和SysUser表,返回SocialUserAuthResult映射的对象
+ * @param authId 认证ID
+ * @return SocialUser
+ */
+ SocialUserVo selectSocialUserByAuthId(String authId);
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
new file mode 100644
index 000000000..f16cf1646
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
@@ -0,0 +1,71 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.vo.SysUserVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 社会化关系Service接口
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+public interface ISocialUserService {
+
+ /**
+ * 查询授权关系
+ */
+ SocialUserVo queryById(Long id);
+
+ /**
+ * 查询授权列表
+ */
+ TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询授权列表
+ */
+ List queryList(SocialUserBo bo);
+
+ /**
+ * 新增授权关系
+ */
+ Boolean insertByBo(SocialUserBo bo);
+
+ /**
+ * 修改授权关系
+ */
+ Boolean updateByBo(SocialUserBo bo);
+
+ /**
+ * 校验并批量删除社会化关系信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 删除社会化关系信息
+ */
+ Boolean deleteWithValidById(Long id);
+
+
+ /**
+ * 根据用户ID查询授权关系
+ */
+ Boolean isExistByUserIdAndSource(Long userId, String source);
+
+
+ /**
+ * 根据authId查询SocialUser表和SysUser表,返回SocialUserAuthResult映射的对象
+ * @param authId 认证ID
+ * @return SocialUser
+ */
+ SocialUserVo selectSocialUserByAuthId(String authId);
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
new file mode 100644
index 000000000..c130fb7e6
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
@@ -0,0 +1,162 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.mapper.SocialUserMapper;
+import org.dromara.system.service.ISocialUserService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 社会化关系Service业务层处理
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@RequiredArgsConstructor
+@Service
+public class SocialUserServiceImpl implements ISocialUserService {
+
+ private final SocialUserMapper baseMapper;
+
+ /**
+ * 查询社会化关系
+ */
+ @Override
+ public SocialUserVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询社会化关系列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询社会化关系列表
+ */
+ @Override
+ public List queryList(SocialUserBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SocialUserBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getAuthId()), SocialUser::getAuthId, bo.getAuthId());
+ lqw.eq(StringUtils.isNotBlank(bo.getSource()), SocialUser::getSource, bo.getSource());
+ lqw.eq(StringUtils.isNotBlank(bo.getAccessToken()), SocialUser::getAccessToken, bo.getAccessToken());
+ lqw.eq(bo.getExpireIn() != 0, SocialUser::getExpireIn, bo.getExpireIn());
+ lqw.eq(StringUtils.isNotBlank(bo.getRefreshToken()), SocialUser::getRefreshToken, bo.getRefreshToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), SocialUser::getOpenId, bo.getOpenId());
+ lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
+ lqw.eq(StringUtils.isNotBlank(bo.getAccessCode()), SocialUser::getAccessCode, bo.getAccessCode());
+ lqw.eq(StringUtils.isNotBlank(bo.getUnionId()), SocialUser::getUnionId, bo.getUnionId());
+ lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
+ lqw.eq(StringUtils.isNotBlank(bo.getTokenType()), SocialUser::getTokenType, bo.getTokenType());
+ lqw.eq(StringUtils.isNotBlank(bo.getIdToken()), SocialUser::getIdToken, bo.getIdToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getMacAlgorithm()), SocialUser::getMacAlgorithm, bo.getMacAlgorithm());
+ lqw.eq(StringUtils.isNotBlank(bo.getMacKey()), SocialUser::getMacKey, bo.getMacKey());
+ lqw.eq(StringUtils.isNotBlank(bo.getCode()), SocialUser::getCode, bo.getCode());
+ lqw.eq(StringUtils.isNotBlank(bo.getOauthToken()), SocialUser::getOauthToken, bo.getOauthToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getOauthTokenSecret()), SocialUser::getOauthTokenSecret, bo.getOauthTokenSecret());
+ return lqw;
+ }
+
+ /**
+ * 新增社会化关系
+ */
+ @Override
+ public Boolean insertByBo(SocialUserBo bo) {
+ SocialUser add = MapstructUtils.convert(bo, SocialUser.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改社会化关系
+ */
+ @Override
+ public Boolean updateByBo(SocialUserBo bo) {
+ SocialUser update = MapstructUtils.convert(bo, SocialUser.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(SocialUser entity) {
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除社会化关系
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+
+ /**
+ * 删除社会化关系
+ */
+ @Override
+ public Boolean deleteWithValidById(Long id) {
+ return baseMapper.deleteById(id) > 0;
+ }
+
+ /**
+ * 根据用户id和来源查询用户是否存在
+ *
+ * @param userId 用户id
+ * @param source 来源
+ * @return 是否存在
+ */
+ @Override
+ public Boolean isExistByUserIdAndSource(Long userId, String source) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(SocialUser::getUserId, userId);
+ lqw.eq(SocialUser::getSource, source);
+ return baseMapper.selectCount(lqw) > 0;
+ }
+
+ /**
+ * 根据authId查询用户信息
+ *
+ * @param authId 用户id
+ * @return 用户信息
+ */
+ @Override
+ public SocialUserVo selectSocialUserByAuthId(String authId) {
+ return baseMapper.selectSocialUserByAuthId(authId);
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
new file mode 100644
index 000000000..fb636b162
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+ select id,
+ user_id,
+ tenant_id,
+ auth_id,
+ source,
+ open_id,
+ access_token,
+ expire_in,
+ refresh_token,
+ access_code,
+ union_id,
+ scope,
+ token_type,
+ id_token,
+ mac_algorithm,
+ mac_key,
+ code,
+ oauth_token,
+ oauth_token_secret,
+ create_dept,
+ create_by,
+ create_time,
+ update_by,
+ update_time
+ from social_user
+
+
+
+
+ select b.*
+ from social_user a
+ left join sys_user b on a.user_id = b.user_id
+ where a.user_id = #{userId}
+
+
+
+
+
+ select b.user_id as userId,
+ b.tenant_id as tenantId,
+ b.user_name as userName,
+ b.password as password,
+ a.auth_id as authId,
+ a.source as source
+ from social_user a
+ left join sys_user b on a.user_id = b.user_id
+ where a.auth_id = #{authId}
+
+
+
+
+ select count(*)
+ from social_user
+ where user_id = #{userId} and source = #{source} limit 1
+
+
+
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 713d962d4..8c10bb2c2 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -1,136 +1,208 @@
+
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+CREATE TABLE `social_user`
+(
+ `id` bigint unsigned NOT NULL COMMENT '主键',
+ `user_id` bigint NOT NULL COMMENT '用户ID',
+ `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id',
+ `auth_id` varchar(255) NOT NULL COMMENT '授权+授权openid',
+ `source` varchar(255) NOT NULL COMMENT '用户来源',
+ `open_id` varchar(255) DEFAULT NULL COMMENT '原生open id',
+ `user_name` varchar(30) NOT NULL COMMENT '登录账号',
+ `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
+ `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
+ `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
+ `access_token` varchar(255) NOT NULL COMMENT '用户的授权令牌',
+ `expire_in` int DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+ `refresh_token` varchar(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
+ `access_code` varchar(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+ `union_id` varchar(255) DEFAULT NULL COMMENT '用户的 unionid',
+ `scope` varchar(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+ `token_type` varchar(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+ `id_token` varchar(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+ `mac_algorithm` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ `mac_key` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ `code` varchar(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+ `oauth_token` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ `oauth_token_secret` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint NOT NULL COMMENT '创建人',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_by` bigint NOT NULL COMMENT '更新人',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE = utf8mb4_general_ci
+ ROW_FORMAT = DYNAMIC COMMENT ='社会化关系表';
+
-- ----------------------------
-- 租户表
-- ----------------------------
drop table if exists sys_tenant;
create table sys_tenant
(
- id bigint(20) not null comment 'id',
- tenant_id varchar(20) not null comment '租户编号',
- contact_user_name varchar(20) comment '联系人',
- contact_phone varchar(20) comment '联系电话',
- company_name varchar(50) comment '企业名称',
- license_number varchar(30) comment '统一社会信用代码',
- address varchar(200) comment '地址',
- intro varchar(200) comment '企业简介',
- domain varchar(200) comment '域名',
- remark varchar(200) comment '备注',
- package_id bigint(20) comment '租户套餐编号',
- expire_time datetime comment '过期时间',
- account_count int default -1 comment '用户数量(-1不限制)',
- status char(1) default '0' comment '租户状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) comment '创建部门',
- create_by bigint(20) comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) comment '更新者',
- update_time datetime comment '更新时间',
+ id bigint(20) not null comment 'id',
+ tenant_id varchar(20) not null comment '租户编号',
+ contact_user_name varchar(20) comment '联系人',
+ contact_phone varchar(20) comment '联系电话',
+ company_name varchar(50) comment '企业名称',
+ license_number varchar(30) comment '统一社会信用代码',
+ address varchar(200) comment '地址',
+ intro varchar(200) comment '企业简介',
+ domain varchar(200) comment '域名',
+ remark varchar(200) comment '备注',
+ package_id bigint(20) comment '租户套餐编号',
+ expire_time datetime comment '过期时间',
+ account_count int default -1 comment '用户数量(-1不限制)',
+ status char(1) default '0' comment '租户状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
primary key (id)
-) engine=innodb comment = '租户表';
+) engine = innodb comment = '租户表';
-- ----------------------------
-- 初始化-租户表数据
-- ----------------------------
-insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 103, 1, sysdate(), NULL, NULL);
+insert into sys_tenant
+values (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL,
+ NULL, -1, '0', '0', 103, 1, sysdate(), NULL, NULL);
-- ----------------------------
-- 租户套餐表
-- ----------------------------
drop table if exists sys_tenant_package;
-create table sys_tenant_package (
- package_id bigint(20) not null comment '租户套餐id',
- package_name varchar(20) comment '套餐名称',
- menu_ids varchar(3000) comment '关联菜单id',
- remark varchar(200) comment '备注',
- menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
- status char(1) default '0' comment '状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) comment '创建部门',
- create_by bigint(20) comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) comment '更新者',
- update_time datetime comment '更新时间',
+create table sys_tenant_package
+(
+ package_id bigint(20) not null comment '租户套餐id',
+ package_name varchar(20) comment '套餐名称',
+ menu_ids varchar(3000) comment '关联菜单id',
+ remark varchar(200) comment '备注',
+ menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
primary key (package_id)
-) engine=innodb comment = '租户套餐表';
+) engine = innodb comment = '租户套餐表';
-- ----------------------------
-- 1、部门表
-- ----------------------------
drop table if exists sys_dept;
-create table sys_dept (
- dept_id bigint(20) not null comment '部门id',
- tenant_id varchar(20) default '000000' comment '租户编号',
- parent_id bigint(20) default 0 comment '父部门id',
- ancestors varchar(500) default '' comment '祖级列表',
- dept_name varchar(30) default '' comment '部门名称',
- order_num int(4) default 0 comment '显示顺序',
- leader varchar(20) default null comment '负责人',
- phone varchar(11) default null comment '联系电话',
- email varchar(50) default null comment '邮箱',
- status char(1) default '0' comment '部门状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- primary key (dept_id)
-) engine=innodb comment = '部门表';
+create table sys_dept
+(
+ dept_id bigint(20) not null comment '部门id',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ parent_id bigint(20) default 0 comment '父部门id',
+ ancestors varchar(500) default '' comment '祖级列表',
+ dept_name varchar(30) default '' comment '部门名称',
+ order_num int(4) default 0 comment '显示顺序',
+ leader varchar(20) default null comment '负责人',
+ phone varchar(11) default null comment '联系电话',
+ email varchar(50) default null comment '邮箱',
+ status char(1) default '0' comment '部门状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (dept_id)
+) engine = innodb comment = '部门表';
-- ----------------------------
-- 初始化-部门表数据
-- ----------------------------
-insert into sys_dept values(100, '000000', 0, '0', 'XXX科技', 0, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(101, '000000', 100, '0,100', '深圳总公司', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(102, '000000', 100, '0,100', '长沙分公司', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(103, '000000', 101, '0,100,101', '研发部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(104, '000000', 101, '0,100,101', '市场部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(105, '000000', 101, '0,100,101', '测试部门', 3, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(106, '000000', 101, '0,100,101', '财务部门', 4, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(107, '000000', 101, '0,100,101', '运维部门', 5, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(108, '000000', 102, '0,100,102', '市场部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(109, '000000', 102, '0,100,102', '财务部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept
+values (100, '000000', 0, '0', 'XXX科技', 0, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(),
+ null, null);
+insert into sys_dept
+values (101, '000000', 100, '0,100', '深圳总公司', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (102, '000000', 100, '0,100', '长沙分公司', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (103, '000000', 101, '0,100,101', '研发部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (104, '000000', 101, '0,100,101', '市场部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (105, '000000', 101, '0,100,101', '测试部门', 3, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (106, '000000', 101, '0,100,101', '财务部门', 4, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (107, '000000', 101, '0,100,101', '运维部门', 5, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (108, '000000', 102, '0,100,102', '市场部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (109, '000000', 102, '0,100,102', '财务部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
-- ----------------------------
-- 2、用户信息表
-- ----------------------------
drop table if exists sys_user;
-create table sys_user (
- user_id bigint(20) not null comment '用户ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dept_id bigint(20) default null comment '部门ID',
- user_name varchar(30) not null comment '用户账号',
- nick_name varchar(30) not null comment '用户昵称',
- user_type varchar(10) default 'sys_user' comment '用户类型(sys_user系统用户)',
- email varchar(50) default '' comment '用户邮箱',
- phonenumber varchar(11) default '' comment '手机号码',
- sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
- avatar bigint(20) comment '头像地址',
- password varchar(100) default '' comment '密码',
- status char(1) default '0' comment '帐号状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- login_ip varchar(128) default '' comment '最后登录IP',
- login_date datetime comment '最后登录时间',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (user_id)
-) engine=innodb comment = '用户信息表';
+create table sys_user
+(
+ user_id bigint(20) not null comment '用户ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dept_id bigint(20) default null comment '部门ID',
+ user_name varchar(30) not null comment '用户账号',
+ nick_name varchar(30) not null comment '用户昵称',
+ user_type varchar(10) default 'sys_user' comment '用户类型(sys_user系统用户)',
+ email varchar(50) default '' comment '用户邮箱',
+ phonenumber varchar(11) default '' comment '手机号码',
+ sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
+ avatar bigint(20) comment '头像地址',
+ password varchar(100) default '' comment '密码',
+ status char(1) default '0' comment '帐号状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ login_ip varchar(128) default '' comment '最后登录IP',
+ login_date datetime comment '最后登录时间',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (user_id)
+) engine = innodb comment = '用户信息表';
-- ----------------------------
-- 初始化-用户信息表数据
-- ----------------------------
-insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员');
-insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com', '15666666666', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '测试员');
+insert into sys_user
+values (1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null,
+ '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1,
+ sysdate(), null, null, '管理员');
+insert into sys_user
+values (2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com', '15666666666', '1', null,
+ '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1,
+ sysdate(), null, null, '测试员');
-- ----------------------------
@@ -139,339 +211,626 @@ insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sy
drop table if exists sys_post;
create table sys_post
(
- post_id bigint(20) not null comment '岗位ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- post_code varchar(64) not null comment '岗位编码',
- post_name varchar(50) not null comment '岗位名称',
- post_sort int(4) not null comment '显示顺序',
- status char(1) not null comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (post_id)
-) engine=innodb comment = '岗位信息表';
+ post_id bigint(20) not null comment '岗位ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ post_code varchar(64) not null comment '岗位编码',
+ post_name varchar(50) not null comment '岗位名称',
+ post_sort int(4) not null comment '显示顺序',
+ status char(1) not null comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (post_id)
+) engine = innodb comment = '岗位信息表';
-- ----------------------------
-- 初始化-岗位信息表数据
-- ----------------------------
-insert into sys_post values(1, '000000', 'ceo', '董事长', 1, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(2, '000000', 'se', '项目经理', 2, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(3, '000000', 'hr', '人力资源', 3, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(4, '000000', 'user', '普通员工', 4, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (1, '000000', 'ceo', '董事长', 1, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (2, '000000', 'se', '项目经理', 2, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (3, '000000', 'hr', '人力资源', 3, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (4, '000000', 'user', '普通员工', 4, '0', 103, 1, sysdate(), null, null, '');
-- ----------------------------
-- 4、角色信息表
-- ----------------------------
drop table if exists sys_role;
-create table sys_role (
- role_id bigint(20) not null comment '角色ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- role_name varchar(30) not null comment '角色名称',
- role_key varchar(100) not null comment '角色权限字符串',
- role_sort int(4) not null comment '显示顺序',
- data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
- menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
- dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
- status char(1) not null comment '角色状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (role_id)
-) engine=innodb comment = '角色信息表';
+create table sys_role
+(
+ role_id bigint(20) not null comment '角色ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ role_name varchar(30) not null comment '角色名称',
+ role_key varchar(100) not null comment '角色权限字符串',
+ role_sort int(4) not null comment '显示顺序',
+ data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+ menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
+ dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
+ status char(1) not null comment '角色状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (role_id)
+) engine = innodb comment = '角色信息表';
-- ----------------------------
-- 初始化-角色信息表数据
-- ----------------------------
-insert into sys_role values(1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员');
-insert into sys_role values(2, '000000', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '普通角色');
+insert into sys_role
+values (1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员');
+insert into sys_role
+values (2, '000000', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '普通角色');
-- ----------------------------
-- 5、菜单权限表
-- ----------------------------
drop table if exists sys_menu;
-create table sys_menu (
- menu_id bigint(20) not null comment '菜单ID',
- menu_name varchar(50) not null comment '菜单名称',
- parent_id bigint(20) default 0 comment '父菜单ID',
- order_num int(4) default 0 comment '显示顺序',
- path varchar(200) default '' comment '路由地址',
- component varchar(255) default null comment '组件路径',
- query_param varchar(255) default null comment '路由参数',
- is_frame int(1) default 1 comment '是否为外链(0是 1否)',
- is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
- menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
- visible char(1) default 0 comment '显示状态(0显示 1隐藏)',
- status char(1) default 0 comment '菜单状态(0正常 1停用)',
- perms varchar(100) default null comment '权限标识',
- icon varchar(100) default '#' comment '菜单图标',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default '' comment '备注',
- primary key (menu_id)
-) engine=innodb comment = '菜单权限表';
+create table sys_menu
+(
+ menu_id bigint(20) not null comment '菜单ID',
+ menu_name varchar(50) not null comment '菜单名称',
+ parent_id bigint(20) default 0 comment '父菜单ID',
+ order_num int(4) default 0 comment '显示顺序',
+ path varchar(200) default '' comment '路由地址',
+ component varchar(255) default null comment '组件路径',
+ query_param varchar(255) default null comment '路由参数',
+ is_frame int(1) default 1 comment '是否为外链(0是 1否)',
+ is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
+ menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
+ visible char(1) default 0 comment '显示状态(0显示 1隐藏)',
+ status char(1) default 0 comment '菜单状态(0正常 1停用)',
+ perms varchar(100) default null comment '权限标识',
+ icon varchar(100) default '#' comment '菜单图标',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default '' comment '备注',
+ primary key (menu_id)
+) engine = innodb comment = '菜单权限表';
-- ----------------------------
-- 初始化-菜单信息表数据
-- ----------------------------
-- 一级菜单
-insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null, '系统管理目录');
-insert into sys_menu values('6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null, '租户管理目录');
-insert into sys_menu values('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录');
-insert into sys_menu values('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录');
-insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址');
+insert into sys_menu
+values ('1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null,
+ '系统管理目录');
+insert into sys_menu
+values ('6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null,
+ '租户管理目录');
+insert into sys_menu
+values ('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null,
+ null, '系统监控目录');
+insert into sys_menu
+values ('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null,
+ '系统工具目录');
+insert into sys_menu
+values ('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '',
+ 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址');
-- 二级菜单
-insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单');
-insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单');
-insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 103, 1, sysdate(), null, null, '菜单管理菜单');
-insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 103, 1, sysdate(), null, null, '部门管理菜单');
-insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 103, 1, sysdate(), null, null, '岗位管理菜单');
-insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 103, 1, sysdate(), null, null, '字典管理菜单');
-insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 103, 1, sysdate(), null, null, '参数设置菜单');
-insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 103, 1, sysdate(), null, null, '通知公告菜单');
-insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null, '日志管理菜单');
-insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
-insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
-insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate(), null, null, '表单构建菜单');
-insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单');
-insert into sys_menu values ('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
-insert into sys_menu values ('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
+insert into sys_menu
+values ('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user',
+ 103, 1, sysdate(), null, null, '用户管理菜单');
+insert into sys_menu
+values ('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list',
+ 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单');
+insert into sys_menu
+values ('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list',
+ 'tree-table', 103, 1, sysdate(), null, null, '菜单管理菜单');
+insert into sys_menu
+values ('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree',
+ 103, 1, sysdate(), null, null, '部门管理菜单');
+insert into sys_menu
+values ('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post',
+ 103, 1, sysdate(), null, null, '岗位管理菜单');
+insert into sys_menu
+values ('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict',
+ 103, 1, sysdate(), null, null, '字典管理菜单');
+insert into sys_menu
+values ('106', '参数设置', '1', '7', 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list',
+ 'edit', 103, 1, sysdate(), null, null, '参数设置菜单');
+insert into sys_menu
+values ('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list',
+ 'message', 103, 1, sysdate(), null, null, '通知公告菜单');
+insert into sys_menu
+values ('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null,
+ '日志管理菜单');
+insert into sys_menu
+values ('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list',
+ 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
+insert into sys_menu
+values ('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list',
+ 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
+insert into sys_menu
+values ('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build',
+ 103, 1, sysdate(), null, null, '表单构建菜单');
+insert into sys_menu
+values ('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1,
+ sysdate(), null, null, '代码生成菜单');
+insert into sys_menu
+values ('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list',
+ 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
+insert into sys_menu
+values ('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0',
+ 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
-- springboot-admin监控
-insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单');
+insert into sys_menu
+values ('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list',
+ 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单');
-- oss菜单
-insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate(), null, null, '文件管理菜单');
+insert into sys_menu
+values ('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload',
+ 103, 1, sysdate(), null, null, '文件管理菜单');
-- xxl-job-admin控制台
-insert into sys_menu values('120', '任务调度中心', '2', '5', 'XxlJob', 'monitor/xxljob/index', '', 1, 0, 'C', '0', '0', 'monitor:xxljob:list', 'job', 103, 1, sysdate(), null, null, 'Xxl-Job控制台菜单');
+insert into sys_menu
+values ('120', '任务调度中心', '2', '5', 'XxlJob', 'monitor/xxljob/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:xxljob:list', 'job', 103, 1, sysdate(), null, null, 'Xxl-Job控制台菜单');
-- 三级菜单
-insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单');
-insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单');
+insert into sys_menu
+values ('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单');
+insert into sys_menu
+values ('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单');
-- 用户管理按钮
-insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1003', '用户修改', '100', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1004', '用户删除', '100', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1005', '用户导出', '100', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1006', '用户导入', '100', '6', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1007', '重置密码', '100', '7', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1003', '用户修改', '100', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1004', '用户删除', '100', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1005', '用户导出', '100', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1006', '用户导入', '100', '6', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1007', '重置密码', '100', '7', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, sysdate(),
+ null, null, '');
-- 角色管理按钮
-insert into sys_menu values('1008', '角色查询', '101', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1009', '角色新增', '101', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1010', '角色修改', '101', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1011', '角色删除', '101', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1012', '角色导出', '101', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1008', '角色查询', '101', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1009', '角色新增', '101', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1010', '角色修改', '101', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1011', '角色删除', '101', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1012', '角色导出', '101', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 菜单管理按钮
-insert into sys_menu values('1013', '菜单查询', '102', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1014', '菜单新增', '102', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1015', '菜单修改', '102', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1016', '菜单删除', '102', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1013', '菜单查询', '102', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1014', '菜单新增', '102', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1015', '菜单修改', '102', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1016', '菜单删除', '102', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, sysdate(),
+ null, null, '');
-- 部门管理按钮
-insert into sys_menu values('1017', '部门查询', '103', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1018', '部门新增', '103', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1019', '部门修改', '103', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1020', '部门删除', '103', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1017', '部门查询', '103', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1018', '部门新增', '103', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1019', '部门修改', '103', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1020', '部门删除', '103', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, sysdate(),
+ null, null, '');
-- 岗位管理按钮
-insert into sys_menu values('1021', '岗位查询', '104', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1022', '岗位新增', '104', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1023', '岗位修改', '104', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1024', '岗位删除', '104', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1025', '岗位导出', '104', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1021', '岗位查询', '104', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1022', '岗位新增', '104', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1023', '岗位修改', '104', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1024', '岗位删除', '104', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1025', '岗位导出', '104', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 字典管理按钮
-insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 参数设置按钮
-insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 通知公告按钮
-insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1,
+ sysdate(), null, null, '');
-- 操作日志按钮
-insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 登录日志按钮
-insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1,
+ sysdate(), null, null, '');
-- 在线用户按钮
-insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1,
+ sysdate(), null, null, '');
-- 代码生成按钮
-insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null,
+ null, '');
+insert into sys_menu
+values ('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, sysdate(), null,
+ null, '');
-- oss相关按钮
-insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit', '#', 103, 1, sysdate(),
+ null, null, '');
-- 租户管理相关按钮
-insert into sys_menu values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 租户套餐管理相关按钮
-insert into sys_menu values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103,
+ 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103,
+ 1, sysdate(), null, null, '');
-- ----------------------------
-- 6、用户和角色关联表 用户N-1角色
-- ----------------------------
drop table if exists sys_user_role;
-create table sys_user_role (
- user_id bigint(20) not null comment '用户ID',
- role_id bigint(20) not null comment '角色ID',
- primary key(user_id, role_id)
-) engine=innodb comment = '用户和角色关联表';
+create table sys_user_role
+(
+ user_id bigint(20) not null comment '用户ID',
+ role_id bigint(20) not null comment '角色ID',
+ primary key (user_id, role_id)
+) engine = innodb comment = '用户和角色关联表';
-- ----------------------------
-- 初始化-用户和角色关联表数据
-- ----------------------------
-insert into sys_user_role values ('1', '1');
-insert into sys_user_role values ('2', '2');
+insert into sys_user_role
+values ('1', '1');
+insert into sys_user_role
+values ('2', '2');
-- ----------------------------
-- 7、角色和菜单关联表 角色1-N菜单
-- ----------------------------
drop table if exists sys_role_menu;
-create table sys_role_menu (
- role_id bigint(20) not null comment '角色ID',
- menu_id bigint(20) not null comment '菜单ID',
- primary key(role_id, menu_id)
-) engine=innodb comment = '角色和菜单关联表';
+create table sys_role_menu
+(
+ role_id bigint(20) not null comment '角色ID',
+ menu_id bigint(20) not null comment '菜单ID',
+ primary key (role_id, menu_id)
+) engine = innodb comment = '角色和菜单关联表';
-- ----------------------------
-- 初始化-角色和菜单关联表数据
-- ----------------------------
-insert into sys_role_menu values ('2', '1');
-insert into sys_role_menu values ('2', '2');
-insert into sys_role_menu values ('2', '3');
-insert into sys_role_menu values ('2', '4');
-insert into sys_role_menu values ('2', '100');
-insert into sys_role_menu values ('2', '101');
-insert into sys_role_menu values ('2', '102');
-insert into sys_role_menu values ('2', '103');
-insert into sys_role_menu values ('2', '104');
-insert into sys_role_menu values ('2', '105');
-insert into sys_role_menu values ('2', '106');
-insert into sys_role_menu values ('2', '107');
-insert into sys_role_menu values ('2', '108');
-insert into sys_role_menu values ('2', '109');
-insert into sys_role_menu values ('2', '110');
-insert into sys_role_menu values ('2', '111');
-insert into sys_role_menu values ('2', '112');
-insert into sys_role_menu values ('2', '113');
-insert into sys_role_menu values ('2', '114');
-insert into sys_role_menu values ('2', '115');
-insert into sys_role_menu values ('2', '116');
-insert into sys_role_menu values ('2', '500');
-insert into sys_role_menu values ('2', '501');
-insert into sys_role_menu values ('2', '1000');
-insert into sys_role_menu values ('2', '1001');
-insert into sys_role_menu values ('2', '1002');
-insert into sys_role_menu values ('2', '1003');
-insert into sys_role_menu values ('2', '1004');
-insert into sys_role_menu values ('2', '1005');
-insert into sys_role_menu values ('2', '1006');
-insert into sys_role_menu values ('2', '1007');
-insert into sys_role_menu values ('2', '1008');
-insert into sys_role_menu values ('2', '1009');
-insert into sys_role_menu values ('2', '1010');
-insert into sys_role_menu values ('2', '1011');
-insert into sys_role_menu values ('2', '1012');
-insert into sys_role_menu values ('2', '1013');
-insert into sys_role_menu values ('2', '1014');
-insert into sys_role_menu values ('2', '1015');
-insert into sys_role_menu values ('2', '1016');
-insert into sys_role_menu values ('2', '1017');
-insert into sys_role_menu values ('2', '1018');
-insert into sys_role_menu values ('2', '1019');
-insert into sys_role_menu values ('2', '1020');
-insert into sys_role_menu values ('2', '1021');
-insert into sys_role_menu values ('2', '1022');
-insert into sys_role_menu values ('2', '1023');
-insert into sys_role_menu values ('2', '1024');
-insert into sys_role_menu values ('2', '1025');
-insert into sys_role_menu values ('2', '1026');
-insert into sys_role_menu values ('2', '1027');
-insert into sys_role_menu values ('2', '1028');
-insert into sys_role_menu values ('2', '1029');
-insert into sys_role_menu values ('2', '1030');
-insert into sys_role_menu values ('2', '1031');
-insert into sys_role_menu values ('2', '1032');
-insert into sys_role_menu values ('2', '1033');
-insert into sys_role_menu values ('2', '1034');
-insert into sys_role_menu values ('2', '1035');
-insert into sys_role_menu values ('2', '1036');
-insert into sys_role_menu values ('2', '1037');
-insert into sys_role_menu values ('2', '1038');
-insert into sys_role_menu values ('2', '1039');
-insert into sys_role_menu values ('2', '1040');
-insert into sys_role_menu values ('2', '1041');
-insert into sys_role_menu values ('2', '1042');
-insert into sys_role_menu values ('2', '1043');
-insert into sys_role_menu values ('2', '1044');
-insert into sys_role_menu values ('2', '1045');
-insert into sys_role_menu values ('2', '1050');
-insert into sys_role_menu values ('2', '1046');
-insert into sys_role_menu values ('2', '1047');
-insert into sys_role_menu values ('2', '1048');
-insert into sys_role_menu values ('2', '1055');
-insert into sys_role_menu values ('2', '1056');
-insert into sys_role_menu values ('2', '1057');
-insert into sys_role_menu values ('2', '1058');
-insert into sys_role_menu values ('2', '1059');
-insert into sys_role_menu values ('2', '1060');
+insert into sys_role_menu
+values ('2', '1');
+insert into sys_role_menu
+values ('2', '2');
+insert into sys_role_menu
+values ('2', '3');
+insert into sys_role_menu
+values ('2', '4');
+insert into sys_role_menu
+values ('2', '100');
+insert into sys_role_menu
+values ('2', '101');
+insert into sys_role_menu
+values ('2', '102');
+insert into sys_role_menu
+values ('2', '103');
+insert into sys_role_menu
+values ('2', '104');
+insert into sys_role_menu
+values ('2', '105');
+insert into sys_role_menu
+values ('2', '106');
+insert into sys_role_menu
+values ('2', '107');
+insert into sys_role_menu
+values ('2', '108');
+insert into sys_role_menu
+values ('2', '109');
+insert into sys_role_menu
+values ('2', '110');
+insert into sys_role_menu
+values ('2', '111');
+insert into sys_role_menu
+values ('2', '112');
+insert into sys_role_menu
+values ('2', '113');
+insert into sys_role_menu
+values ('2', '114');
+insert into sys_role_menu
+values ('2', '115');
+insert into sys_role_menu
+values ('2', '116');
+insert into sys_role_menu
+values ('2', '500');
+insert into sys_role_menu
+values ('2', '501');
+insert into sys_role_menu
+values ('2', '1000');
+insert into sys_role_menu
+values ('2', '1001');
+insert into sys_role_menu
+values ('2', '1002');
+insert into sys_role_menu
+values ('2', '1003');
+insert into sys_role_menu
+values ('2', '1004');
+insert into sys_role_menu
+values ('2', '1005');
+insert into sys_role_menu
+values ('2', '1006');
+insert into sys_role_menu
+values ('2', '1007');
+insert into sys_role_menu
+values ('2', '1008');
+insert into sys_role_menu
+values ('2', '1009');
+insert into sys_role_menu
+values ('2', '1010');
+insert into sys_role_menu
+values ('2', '1011');
+insert into sys_role_menu
+values ('2', '1012');
+insert into sys_role_menu
+values ('2', '1013');
+insert into sys_role_menu
+values ('2', '1014');
+insert into sys_role_menu
+values ('2', '1015');
+insert into sys_role_menu
+values ('2', '1016');
+insert into sys_role_menu
+values ('2', '1017');
+insert into sys_role_menu
+values ('2', '1018');
+insert into sys_role_menu
+values ('2', '1019');
+insert into sys_role_menu
+values ('2', '1020');
+insert into sys_role_menu
+values ('2', '1021');
+insert into sys_role_menu
+values ('2', '1022');
+insert into sys_role_menu
+values ('2', '1023');
+insert into sys_role_menu
+values ('2', '1024');
+insert into sys_role_menu
+values ('2', '1025');
+insert into sys_role_menu
+values ('2', '1026');
+insert into sys_role_menu
+values ('2', '1027');
+insert into sys_role_menu
+values ('2', '1028');
+insert into sys_role_menu
+values ('2', '1029');
+insert into sys_role_menu
+values ('2', '1030');
+insert into sys_role_menu
+values ('2', '1031');
+insert into sys_role_menu
+values ('2', '1032');
+insert into sys_role_menu
+values ('2', '1033');
+insert into sys_role_menu
+values ('2', '1034');
+insert into sys_role_menu
+values ('2', '1035');
+insert into sys_role_menu
+values ('2', '1036');
+insert into sys_role_menu
+values ('2', '1037');
+insert into sys_role_menu
+values ('2', '1038');
+insert into sys_role_menu
+values ('2', '1039');
+insert into sys_role_menu
+values ('2', '1040');
+insert into sys_role_menu
+values ('2', '1041');
+insert into sys_role_menu
+values ('2', '1042');
+insert into sys_role_menu
+values ('2', '1043');
+insert into sys_role_menu
+values ('2', '1044');
+insert into sys_role_menu
+values ('2', '1045');
+insert into sys_role_menu
+values ('2', '1050');
+insert into sys_role_menu
+values ('2', '1046');
+insert into sys_role_menu
+values ('2', '1047');
+insert into sys_role_menu
+values ('2', '1048');
+insert into sys_role_menu
+values ('2', '1055');
+insert into sys_role_menu
+values ('2', '1056');
+insert into sys_role_menu
+values ('2', '1057');
+insert into sys_role_menu
+values ('2', '1058');
+insert into sys_role_menu
+values ('2', '1059');
+insert into sys_role_menu
+values ('2', '1060');
-- ----------------------------
-- 8、角色和部门关联表 角色1-N部门
-- ----------------------------
drop table if exists sys_role_dept;
-create table sys_role_dept (
- role_id bigint(20) not null comment '角色ID',
- dept_id bigint(20) not null comment '部门ID',
- primary key(role_id, dept_id)
-) engine=innodb comment = '角色和部门关联表';
+create table sys_role_dept
+(
+ role_id bigint(20) not null comment '角色ID',
+ dept_id bigint(20) not null comment '部门ID',
+ primary key (role_id, dept_id)
+) engine = innodb comment = '角色和部门关联表';
-- ----------------------------
-- 初始化-角色和部门关联表数据
-- ----------------------------
-insert into sys_role_dept values ('2', '100');
-insert into sys_role_dept values ('2', '101');
-insert into sys_role_dept values ('2', '105');
+insert into sys_role_dept
+values ('2', '100');
+insert into sys_role_dept
+values ('2', '101');
+insert into sys_role_dept
+values ('2', '105');
-- ----------------------------
@@ -480,46 +839,49 @@ insert into sys_role_dept values ('2', '105');
drop table if exists sys_user_post;
create table sys_user_post
(
- user_id bigint(20) not null comment '用户ID',
- post_id bigint(20) not null comment '岗位ID',
- primary key (user_id, post_id)
-) engine=innodb comment = '用户与岗位关联表';
+ user_id bigint(20) not null comment '用户ID',
+ post_id bigint(20) not null comment '岗位ID',
+ primary key (user_id, post_id)
+) engine = innodb comment = '用户与岗位关联表';
-- ----------------------------
-- 初始化-用户与岗位关联表数据
-- ----------------------------
-insert into sys_user_post values ('1', '1');
-insert into sys_user_post values ('2', '2');
+insert into sys_user_post
+values ('1', '1');
+insert into sys_user_post
+values ('2', '2');
-- ----------------------------
-- 10、操作日志记录
-- ----------------------------
drop table if exists sys_oper_log;
-create table sys_oper_log (
- oper_id bigint(20) not null comment '日志主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- title varchar(50) default '' comment '模块标题',
- business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
- method varchar(100) default '' comment '方法名称',
- request_method varchar(10) default '' comment '请求方式',
- operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
- oper_name varchar(50) default '' comment '操作人员',
- dept_name varchar(50) default '' comment '部门名称',
- oper_url varchar(255) default '' comment '请求URL',
- oper_ip varchar(128) default '' comment '主机地址',
- oper_location varchar(255) default '' comment '操作地点',
- oper_param varchar(2000) default '' comment '请求参数',
- json_result varchar(2000) default '' comment '返回参数',
- status int(1) default 0 comment '操作状态(0正常 1异常)',
- error_msg varchar(2000) default '' comment '错误消息',
- oper_time datetime comment '操作时间',
- cost_time bigint(20) default 0 comment '消耗时间',
- primary key (oper_id),
- key idx_sys_oper_log_bt (business_type),
- key idx_sys_oper_log_s (status),
- key idx_sys_oper_log_ot (oper_time)
-) engine=innodb comment = '操作日志记录';
+create table sys_oper_log
+(
+ oper_id bigint(20) not null comment '日志主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ title varchar(50) default '' comment '模块标题',
+ business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
+ method varchar(100) default '' comment '方法名称',
+ request_method varchar(10) default '' comment '请求方式',
+ operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
+ oper_name varchar(50) default '' comment '操作人员',
+ dept_name varchar(50) default '' comment '部门名称',
+ oper_url varchar(255) default '' comment '请求URL',
+ oper_ip varchar(128) default '' comment '主机地址',
+ oper_location varchar(255) default '' comment '操作地点',
+ oper_param varchar(2000) default '' comment '请求参数',
+ json_result varchar(2000) default '' comment '返回参数',
+ status int(1) default 0 comment '操作状态(0正常 1异常)',
+ error_msg varchar(2000) default '' comment '错误消息',
+ oper_time datetime comment '操作时间',
+ cost_time bigint(20) default 0 comment '消耗时间',
+ primary key (oper_id),
+ key idx_sys_oper_log_bt (business_type),
+ key idx_sys_oper_log_s (status),
+ key idx_sys_oper_log_ot (oper_time)
+) engine = innodb comment = '操作日志记录';
-- ----------------------------
@@ -528,29 +890,37 @@ create table sys_oper_log (
drop table if exists sys_dict_type;
create table sys_dict_type
(
- dict_id bigint(20) not null comment '字典主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dict_name varchar(100) default '' comment '字典名称',
- dict_type varchar(100) default '' comment '字典类型',
- status char(1) default '0' comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (dict_id),
- unique (tenant_id, dict_type)
-) engine=innodb comment = '字典类型表';
+ dict_id bigint(20) not null comment '字典主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dict_name varchar(100) default '' comment '字典名称',
+ dict_type varchar(100) default '' comment '字典类型',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_id),
+ unique (tenant_id, dict_type)
+) engine = innodb comment = '字典类型表';
-insert into sys_dict_type values(1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, sysdate(), null, null, '用户性别列表');
-insert into sys_dict_type values(2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, sysdate(), null, null, '菜单状态列表');
-insert into sys_dict_type values(3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, sysdate(), null, null, '系统开关列表');
-insert into sys_dict_type values(6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, sysdate(), null, null, '系统是否列表');
-insert into sys_dict_type values(7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, sysdate(), null, null, '通知类型列表');
-insert into sys_dict_type values(8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, sysdate(), null, null, '通知状态列表');
-insert into sys_dict_type values(9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, sysdate(), null, null, '操作类型列表');
-insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, sysdate(), null, null, '登录状态列表');
+insert into sys_dict_type
+values (1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, sysdate(), null, null, '用户性别列表');
+insert into sys_dict_type
+values (2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, sysdate(), null, null, '菜单状态列表');
+insert into sys_dict_type
+values (3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, sysdate(), null, null, '系统开关列表');
+insert into sys_dict_type
+values (6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, sysdate(), null, null, '系统是否列表');
+insert into sys_dict_type
+values (7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, sysdate(), null, null, '通知类型列表');
+insert into sys_dict_type
+values (8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, sysdate(), null, null, '通知状态列表');
+insert into sys_dict_type
+values (9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, sysdate(), null, null, '操作类型列表');
+insert into sys_dict_type
+values (10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, sysdate(), null, null, '登录状态列表');
-- ----------------------------
@@ -559,239 +929,313 @@ insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_statu
drop table if exists sys_dict_data;
create table sys_dict_data
(
- dict_code bigint(20) not null comment '字典编码',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dict_sort int(4) default 0 comment '字典排序',
- dict_label varchar(100) default '' comment '字典标签',
- dict_value varchar(100) default '' comment '字典键值',
- dict_type varchar(100) default '' comment '字典类型',
- css_class varchar(100) default null comment '样式属性(其他样式扩展)',
- list_class varchar(100) default null comment '表格回显样式',
- is_default char(1) default 'N' comment '是否默认(Y是 N否)',
- status char(1) default '0' comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (dict_code)
-) engine=innodb comment = '字典数据表';
+ dict_code bigint(20) not null comment '字典编码',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dict_sort int(4) default 0 comment '字典排序',
+ dict_label varchar(100) default '' comment '字典标签',
+ dict_value varchar(100) default '' comment '字典键值',
+ dict_type varchar(100) default '' comment '字典类型',
+ css_class varchar(100) default null comment '样式属性(其他样式扩展)',
+ list_class varchar(100) default null comment '表格回显样式',
+ is_default char(1) default 'N' comment '是否默认(Y是 N否)',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_code)
+) engine = innodb comment = '字典数据表';
-insert into sys_dict_data values(1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, sysdate(), null, null, '性别男');
-insert into sys_dict_data values(2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别女');
-insert into sys_dict_data values(3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别未知');
-insert into sys_dict_data values(4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '显示菜单');
-insert into sys_dict_data values(5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '隐藏菜单');
-insert into sys_dict_data values(6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '停用状态');
-insert into sys_dict_data values(12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '系统默认是');
-insert into sys_dict_data values(13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '系统默认否');
-insert into sys_dict_data values(14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, sysdate(), null, null, '通知');
-insert into sys_dict_data values(15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, sysdate(), null, null, '公告');
-insert into sys_dict_data values(16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '关闭状态');
-insert into sys_dict_data values(29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '其他操作');
-insert into sys_dict_data values(18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '新增操作');
-insert into sys_dict_data values(19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '修改操作');
-insert into sys_dict_data values(20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '删除操作');
-insert into sys_dict_data values(21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null, '授权操作');
-insert into sys_dict_data values(22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '导出操作');
-insert into sys_dict_data values(23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '导入操作');
-insert into sys_dict_data values(24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '强退操作');
-insert into sys_dict_data values(25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '生成操作');
-insert into sys_dict_data values(26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '清空操作');
-insert into sys_dict_data values(27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '停用状态');
+insert into sys_dict_data
+values (1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, sysdate(), null, null, '性别男');
+insert into sys_dict_data
+values (2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别女');
+insert into sys_dict_data
+values (3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别未知');
+insert into sys_dict_data
+values (4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '显示菜单');
+insert into sys_dict_data
+values (5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '隐藏菜单');
+insert into sys_dict_data
+values (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '停用状态');
+insert into sys_dict_data
+values (12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '系统默认是');
+insert into sys_dict_data
+values (13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '系统默认否');
+insert into sys_dict_data
+values (14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, sysdate(), null, null,
+ '通知');
+insert into sys_dict_data
+values (15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, sysdate(), null, null,
+ '公告');
+insert into sys_dict_data
+values (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '关闭状态');
+insert into sys_dict_data
+values (29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null,
+ '其他操作');
+insert into sys_dict_data
+values (18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '新增操作');
+insert into sys_dict_data
+values (19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '修改操作');
+insert into sys_dict_data
+values (20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '删除操作');
+insert into sys_dict_data
+values (21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null,
+ '授权操作');
+insert into sys_dict_data
+values (22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '导出操作');
+insert into sys_dict_data
+values (23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '导入操作');
+insert into sys_dict_data
+values (24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '强退操作');
+insert into sys_dict_data
+values (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '生成操作');
+insert into sys_dict_data
+values (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '清空操作');
+insert into sys_dict_data
+values (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '停用状态');
-- ----------------------------
-- 13、参数配置表
-- ----------------------------
drop table if exists sys_config;
-create table sys_config (
- config_id bigint(20) not null comment '参数主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- config_name varchar(100) default '' comment '参数名称',
- config_key varchar(100) default '' comment '参数键名',
- config_value varchar(500) default '' comment '参数键值',
- config_type char(1) default 'N' comment '系统内置(Y是 N否)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (config_id)
-) engine=innodb comment = '参数配置表';
+create table sys_config
+(
+ config_id bigint(20) not null comment '参数主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ config_name varchar(100) default '' comment '参数名称',
+ config_key varchar(100) default '' comment '参数键名',
+ config_value varchar(500) default '' comment '参数键值',
+ config_type char(1) default 'N' comment '系统内置(Y是 N否)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (config_id)
+) engine = innodb comment = '参数配置表';
-insert into sys_config values(1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, sysdate(), null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
-insert into sys_config values(2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, sysdate(), null, null, '初始化密码 123456' );
-insert into sys_config values(3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, sysdate(), null, null, '深色主题theme-dark,浅色主题theme-light' );
-insert into sys_config values(5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, sysdate(), null, null, '是否开启注册用户功能(true开启,false关闭)');
-insert into sys_config values(11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, sysdate(), null, null, 'true:开启, false:关闭');
+insert into sys_config
+values (1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, sysdate(), null, null,
+ '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+insert into sys_config
+values (2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, sysdate(), null, null,
+ '初始化密码 123456');
+insert into sys_config
+values (3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, sysdate(), null, null,
+ '深色主题theme-dark,浅色主题theme-light');
+insert into sys_config
+values (5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, sysdate(), null,
+ null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config
+values (11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, sysdate(), null, null,
+ 'true:开启, false:关闭');
-- ----------------------------
-- 14、系统访问记录
-- ----------------------------
drop table if exists sys_logininfor;
-create table sys_logininfor (
- info_id bigint(20) not null comment '访问ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- user_name varchar(50) default '' comment '用户账号',
- ipaddr varchar(128) default '' comment '登录IP地址',
- login_location varchar(255) default '' comment '登录地点',
- browser varchar(50) default '' comment '浏览器类型',
- os varchar(50) default '' comment '操作系统',
- status char(1) default '0' comment '登录状态(0成功 1失败)',
- msg varchar(255) default '' comment '提示消息',
- login_time datetime comment '访问时间',
- primary key (info_id),
- key idx_sys_logininfor_s (status),
- key idx_sys_logininfor_lt (login_time)
-) engine=innodb comment = '系统访问记录';
+create table sys_logininfor
+(
+ info_id bigint(20) not null comment '访问ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ user_name varchar(50) default '' comment '用户账号',
+ ipaddr varchar(128) default '' comment '登录IP地址',
+ login_location varchar(255) default '' comment '登录地点',
+ browser varchar(50) default '' comment '浏览器类型',
+ os varchar(50) default '' comment '操作系统',
+ status char(1) default '0' comment '登录状态(0成功 1失败)',
+ msg varchar(255) default '' comment '提示消息',
+ login_time datetime comment '访问时间',
+ primary key (info_id),
+ key idx_sys_logininfor_s (status),
+ key idx_sys_logininfor_lt (login_time)
+) engine = innodb comment = '系统访问记录';
-- ----------------------------
-- 17、通知公告表
-- ----------------------------
drop table if exists sys_notice;
-create table sys_notice (
- notice_id bigint(20) not null comment '公告ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- notice_title varchar(50) not null comment '公告标题',
- notice_type char(1) not null comment '公告类型(1通知 2公告)',
- notice_content longblob default null comment '公告内容',
- status char(1) default '0' comment '公告状态(0正常 1关闭)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(255) default null comment '备注',
- primary key (notice_id)
-) engine=innodb comment = '通知公告表';
+create table sys_notice
+(
+ notice_id bigint(20) not null comment '公告ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ notice_title varchar(50) not null comment '公告标题',
+ notice_type char(1) not null comment '公告类型(1通知 2公告)',
+ notice_content longblob default null comment '公告内容',
+ status char(1) default '0' comment '公告状态(0正常 1关闭)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(255) default null comment '备注',
+ primary key (notice_id)
+) engine = innodb comment = '通知公告表';
-- ----------------------------
-- 初始化-公告信息表数据
-- ----------------------------
-insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null, '管理员');
-insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null, '管理员');
+insert into sys_notice
+values ('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null,
+ '管理员');
+insert into sys_notice
+values ('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null,
+ '管理员');
-- ----------------------------
-- 18、代码生成业务表
-- ----------------------------
drop table if exists gen_table;
-create table gen_table (
- table_id bigint(20) not null comment '编号',
- data_name varchar(200) default '' comment '数据源名称',
- table_name varchar(200) default '' comment '表名称',
- table_comment varchar(500) default '' comment '表描述',
- sub_table_name varchar(64) default null comment '关联子表的表名',
- sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
- class_name varchar(100) default '' comment '实体类名称',
- tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
- package_name varchar(100) comment '生成包路径',
- module_name varchar(30) comment '生成模块名',
- business_name varchar(30) comment '生成业务名',
- function_name varchar(50) comment '生成功能名',
- function_author varchar(50) comment '生成功能作者',
- gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
- gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
- options varchar(1000) comment '其它生成选项',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (table_id)
-) engine=innodb comment = '代码生成业务表';
+create table gen_table
+(
+ table_id bigint(20) not null comment '编号',
+ data_name varchar(200) default '' comment '数据源名称',
+ table_name varchar(200) default '' comment '表名称',
+ table_comment varchar(500) default '' comment '表描述',
+ sub_table_name varchar(64) default null comment '关联子表的表名',
+ sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
+ class_name varchar(100) default '' comment '实体类名称',
+ tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
+ package_name varchar(100) comment '生成包路径',
+ module_name varchar(30) comment '生成模块名',
+ business_name varchar(30) comment '生成业务名',
+ function_name varchar(50) comment '生成功能名',
+ function_author varchar(50) comment '生成功能作者',
+ gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
+ gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
+ options varchar(1000) comment '其它生成选项',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (table_id)
+) engine = innodb comment = '代码生成业务表';
-- ----------------------------
-- 19、代码生成业务表字段
-- ----------------------------
drop table if exists gen_table_column;
-create table gen_table_column (
- column_id bigint(20) not null comment '编号',
- table_id bigint(20) comment '归属表编号',
- column_name varchar(200) comment '列名称',
- column_comment varchar(500) comment '列描述',
- column_type varchar(100) comment '列类型',
- java_type varchar(500) comment 'JAVA类型',
- java_field varchar(200) comment 'JAVA字段名',
- is_pk char(1) comment '是否主键(1是)',
- is_increment char(1) comment '是否自增(1是)',
- is_required char(1) comment '是否必填(1是)',
- is_insert char(1) comment '是否为插入字段(1是)',
- is_edit char(1) comment '是否编辑字段(1是)',
- is_list char(1) comment '是否列表字段(1是)',
- is_query char(1) comment '是否查询字段(1是)',
- query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
- html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
- dict_type varchar(200) default '' comment '字典类型',
- sort int comment '排序',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- primary key (column_id)
-) engine=innodb comment = '代码生成业务表字段';
+create table gen_table_column
+(
+ column_id bigint(20) not null comment '编号',
+ table_id bigint(20) comment '归属表编号',
+ column_name varchar(200) comment '列名称',
+ column_comment varchar(500) comment '列描述',
+ column_type varchar(100) comment '列类型',
+ java_type varchar(500) comment 'JAVA类型',
+ java_field varchar(200) comment 'JAVA字段名',
+ is_pk char(1) comment '是否主键(1是)',
+ is_increment char(1) comment '是否自增(1是)',
+ is_required char(1) comment '是否必填(1是)',
+ is_insert char(1) comment '是否为插入字段(1是)',
+ is_edit char(1) comment '是否编辑字段(1是)',
+ is_list char(1) comment '是否列表字段(1是)',
+ is_query char(1) comment '是否查询字段(1是)',
+ query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
+ html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ dict_type varchar(200) default '' comment '字典类型',
+ sort int comment '排序',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (column_id)
+) engine = innodb comment = '代码生成业务表字段';
-- ----------------------------
-- OSS对象存储表
-- ----------------------------
drop table if exists sys_oss;
-create table sys_oss (
- oss_id bigint(20) not null comment '对象存储主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- file_name varchar(255) not null default '' comment '文件名',
- original_name varchar(255) not null default '' comment '原名',
- file_suffix varchar(10) not null default '' comment '文件后缀名',
- url varchar(500) not null comment 'URL地址',
- create_dept bigint(20) default null comment '创建部门',
- create_time datetime default null comment '创建时间',
- create_by bigint(20) default null comment '上传人',
- update_time datetime default null comment '更新时间',
- update_by bigint(20) default null comment '更新人',
- service varchar(20) not null default 'minio' comment '服务商',
- primary key (oss_id)
-) engine=innodb comment ='OSS对象存储表';
+create table sys_oss
+(
+ oss_id bigint(20) not null comment '对象存储主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ file_name varchar(255) not null default '' comment '文件名',
+ original_name varchar(255) not null default '' comment '原名',
+ file_suffix varchar(10) not null default '' comment '文件后缀名',
+ url varchar(500) not null comment 'URL地址',
+ create_dept bigint(20) default null comment '创建部门',
+ create_time datetime default null comment '创建时间',
+ create_by bigint(20) default null comment '上传人',
+ update_time datetime default null comment '更新时间',
+ update_by bigint(20) default null comment '更新人',
+ service varchar(20) not null default 'minio' comment '服务商',
+ primary key (oss_id)
+) engine = innodb comment ='OSS对象存储表';
-- ----------------------------
-- OSS对象存储动态配置表
-- ----------------------------
drop table if exists sys_oss_config;
-create table sys_oss_config (
- oss_config_id bigint(20) not null comment '主建',
- tenant_id varchar(20) default '000000'comment '租户编号',
- config_key varchar(20) not null default '' comment '配置key',
- access_key varchar(255) default '' comment 'accessKey',
- secret_key varchar(255) default '' comment '秘钥',
- bucket_name varchar(255) default '' comment '桶名称',
- prefix varchar(255) default '' comment '前缀',
- endpoint varchar(255) default '' comment '访问站点',
- domain varchar(255) default '' comment '自定义域名',
- is_https char(1) default 'N' comment '是否https(Y=是,N=否)',
- region varchar(255) default '' comment '域',
- access_policy char(1) not null default '1' comment '桶权限类型(0=private 1=public 2=custom)',
- status char(1) default '1' comment '是否默认(0=是,1=否)',
- ext1 varchar(255) default '' comment '扩展字段',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime default null comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime default null comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (oss_config_id)
-) engine=innodb comment='对象存储配置表';
+create table sys_oss_config
+(
+ oss_config_id bigint(20) not null comment '主建',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ config_key varchar(20) not null default '' comment '配置key',
+ access_key varchar(255) default '' comment 'accessKey',
+ secret_key varchar(255) default '' comment '秘钥',
+ bucket_name varchar(255) default '' comment '桶名称',
+ prefix varchar(255) default '' comment '前缀',
+ endpoint varchar(255) default '' comment '访问站点',
+ domain varchar(255) default '' comment '自定义域名',
+ is_https char(1) default 'N' comment '是否https(Y=是,N=否)',
+ region varchar(255) default '' comment '域',
+ access_policy char(1) not null default '1' comment '桶权限类型(0=private 1=public 2=custom)',
+ status char(1) default '1' comment '是否默认(0=是,1=否)',
+ ext1 varchar(255) default '' comment '扩展字段',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime default null comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime default null comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (oss_config_id)
+) engine = innodb comment ='对象存储配置表';
-insert into sys_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '', 'N', '', '1', '0', '', 103, 1,
+ sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '', 'N',
+ '', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '',
+ 'N', '', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '',
+ 'cos.ap-beijing.myqcloud.com', '', 'N', 'ap-beijing', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 103,
+ 1, sysdate(), 1, sysdate(), NULL);
From 5110961eb98d820881a7c4a218e9e93fea07870e Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 01:23:07 +0800
Subject: [PATCH 026/115] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=99=BB=E5=BD=95,=E5=8A=A0=E4=B8=8A=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/AuthController.java | 87 ++++++++++
.../src/main/resources/application-dev.yml | 148 ++++++++++++++++++
.../dromara/common/core/enums/DeviceType.java | 7 +-
.../config/properties/ConfigProperties.java | 58 +++++++
.../social/utils/AuthRedisStateCache.java | 79 ++++++++++
5 files changed, 378 insertions(+), 1 deletion(-)
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index bba6113da..f46cbdc38 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,9 +2,18 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthRequest;
+import me.zhyd.oauth.utils.AuthStateUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -13,9 +22,16 @@ import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.social.config.SocialConfig;
+import org.dromara.common.social.config.properties.ConfigProperties;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.AuthRedisStateCache;
+import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -26,8 +42,10 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import java.io.IOException;
import java.net.URL;
import java.util.List;
+import java.util.Map;
/**
* 认证
@@ -41,10 +59,14 @@ import java.util.List;
@RequestMapping("/auth")
public class AuthController {
+ private final SocialProperties socialProperties;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
+ private final ISocialUserService socialUserService;
+
+
/**
* 登录方法
@@ -115,6 +137,71 @@ public class AuthController {
return R.ok(loginVo);
}
+
+ /**
+ * 认证授权
+ * @param source
+ */
+ @GetMapping("/binding/{source}")
+ @ResponseBody
+ public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
+ SysUserVo userLoding = new SysUserVo();
+ if (ObjectUtil.isNull(userLoding)) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ if (socialUserService.isExistByUserIdAndSource(userLoding.getUserId(),source))
+ {
+ return R.fail(source + "平台账号已经被账号绑定");
+ }
+ ConfigProperties obj = socialProperties.getType().get(source);
+ if (ObjectUtil.isNull(obj)){
+ return R.fail(source + "平台账号暂不支持");
+ }
+ AuthRequest authRequest = SocialUtils.getAuthRequest(source,
+ obj.getClientId(),
+ obj.getClientSecret(),
+ obj.getRedirectUri());
+ String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
+ return R.ok(authorizeUrl);
+ }
+
+ /**
+ * 第三方登录回调业务处理
+ * @param source
+ * @param callback
+ * @param request
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @GetMapping("/social-login/{source}")
+ public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
+ ConfigProperties obj = socialProperties.getType().get(source);
+ if (ObjectUtil.isNull(obj)){
+ return R.fail(source + "平台账号暂不支持");
+ }
+ AuthRequest authRequest = SocialUtils.getAuthRequest(source,
+ obj.getClientId(),
+ obj.getClientSecret(),
+ obj.getRedirectUri());
+ AuthResponse response = authRequest.login(callback);
+ return loginService.socialLogin(source, response, request);
+ }
+
+ /**
+ * 取消授权
+ * @param socialId
+ */
+ @DeleteMapping(value = "/unlock/{socialId}")
+ public R unlockSocial(@PathVariable Long socialId)
+ {
+ Boolean rows = socialUserService.deleteWithValidById(socialId);
+ return rows ? R.ok() : R.fail("取消授权失败");
+ }
+
+
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 92a3640e9..78cad6ed1 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -169,3 +169,151 @@ sms:
signName: 测试
# 腾讯专用
sdkAppId:
+
+justauth:
+ enabled: true
+ type:
+ QQ:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/qq/callback
+ union-id: false
+ WEIBO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/weibo/callback
+ gitee:
+ client-id: 38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81
+ client-secret: 2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff
+ redirect-uri: http://localhost:8888/social-login?source=gitee
+ DINGTALK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/dingtalk/callback
+ BAIDU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/baidu/callback
+ CSDN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/csdn/callback
+ CODING:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/coding/callback
+ coding-group-name: xx
+ OSCHINA:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/oschina/callback
+ ALIPAY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/alipay/callback
+ alipay-public-key: MIIB**************DAQAB
+ WECHAT_OPEN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_open/callback
+ WECHAT_MP:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_mp/callback
+ WECHAT_ENTERPRISE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_enterprise/callback
+ agent-id: 1000002
+ TAOBAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/taobao/callback
+ GOOGLE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/google/callback
+ FACEBOOK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/facebook/callback
+ DOUYIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/douyin/callback
+ LINKEDIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/linkedin/callback
+ MICROSOFT:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/microsoft/callback
+ MI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/mi/callback
+ TOUTIAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/toutiao/callback
+ TEAMBITION:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/teambition/callback
+ RENREN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/renren/callback
+ PINTEREST:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/pinterest/callback
+ STACK_OVERFLOW:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/stack_overflow/callback
+ stack-overflow-key: asd*********asd
+ HUAWEI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/huawei/callback
+ KUJIALE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/kujiale/callback
+ GITLAB:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/gitlab/callback
+ MEITUAN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/meituan/callback
+ ELEME:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/eleme/callback
+ TWITTER:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/twitter/callback
+ XMLY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/xmly/callback
+ # 设备唯一标识ID
+ device-id: xxxxxxxxxxxxxx
+ # 客户端操作系统类型,1-iOS系统,2-Android系统,3-Web
+ client-os-type: 3
+ # 客户端包名,如果 clientOsType 为1或2时必填。对Android客户端是包名,对IOS客户端是Bundle ID
+ #pack-id: xxxx
+ FEISHU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/feishu/callback
+ JD:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/jd/callback
+
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 09bf44b6d..dbadfc2de 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,7 +26,12 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx");
+ XCX("xcx"),
+
+ /**
+ * social第三方端
+ */
+ SOCIAL("social");
private final String device;
}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
new file mode 100644
index 000000000..813b03a6d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
@@ -0,0 +1,58 @@
+package org.dromara.common.social.config.properties;
+
+import lombok.Data;
+
+@Data
+public class ConfigProperties {
+
+ /**
+ * 应用 ID
+ */
+ private String clientId;
+
+ /**
+ * 应用密钥
+ */
+ private String clientSecret;
+
+ /**
+ * 回调地址
+ */
+ private String redirectUri;
+
+ /**
+ * 是否获取unionId
+ */
+ private boolean unionId;
+
+ /**
+ * Coding 企业名称
+ */
+ private String codingGroupName;
+
+ /**
+ * 支付宝公钥
+ */
+ private String alipayPublicKey;
+
+ /**
+ * 企业微信应用ID
+ */
+ private String agentId;
+
+ /**
+ * stackoverflow api key
+ */
+ private String stackOverflowKey;
+
+ /**
+ * 设备ID
+ */
+ private String deviceId;
+
+ /**
+ * 客户端系统类型
+ */
+ private String clientOsType;
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
new file mode 100644
index 000000000..f438a1c85
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
@@ -0,0 +1,79 @@
+package org.dromara.common.social.utils;
+
+import jakarta.annotation.PostConstruct;
+import me.zhyd.oauth.cache.AuthStateCache;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import java.time.Duration;
+
+public class AuthRedisStateCache implements AuthStateCache {
+
+ private final SocialProperties socialProperties;
+ private final RedisTemplate redisTemplate;
+
+ private ValueOperations valueOperations;
+
+ @PostConstruct
+ public void init() {
+ valueOperations = redisTemplate.opsForValue();
+ }
+
+
+ public AuthRedisStateCache() {
+ this.socialProperties = new SocialProperties();
+ redisTemplate = new RedisTemplate<>();
+ }
+
+ /**
+ * 存入缓存
+ *
+ * @param key 缓存key
+ * @param value 缓存内容
+ */
+ @Override
+ public void cache(String key, String value) {
+ // TODO: 自定义存入缓存
+ RedisUtils.setCacheObject(key, value, Duration.ofMillis(socialProperties.getTimeout()));
+ }
+
+ /**
+ * 存入缓存
+ *
+ * @param key 缓存key
+ * @param value 缓存内容
+ * @param timeout 指定缓存过期时间(毫秒)
+ */
+ @Override
+ public void cache(String key, String value, long timeout) {
+ // TODO: 自定义存入缓存
+ RedisUtils.setCacheObject(key, value, Duration.ofMillis(timeout));
+ }
+
+ /**
+ * 获取缓存内容
+ *
+ * @param key 缓存key
+ * @return 缓存内容
+ */
+ @Override
+ public String get(String key) {
+ // TODO: 自定义获取缓存内容
+ return RedisUtils.getCacheObject(key);
+ }
+
+ /**
+ * 是否存在key,如果对应key的value值已过期,也返回false
+ *
+ * @param key 缓存key
+ * @return true:存在key,并且value没过期;false:key不存在或者已过期
+ */
+ @Override
+ public boolean containsKey(String key) {
+ // TODO: 自定义判断key是否存在
+ return RedisUtils.hasKey(key);
+ }
+}
From 9ec982a23ee7c9af7f4be192e0be2256b2ecc900 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 15 Jun 2023 14:08:38 +0800
Subject: [PATCH 027/115] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=20=E5=B0=86?=
=?UTF-8?q?=E6=A1=86=E6=9E=B6=E5=86=85=E7=9A=84swagger=E5=91=BD=E5=90=8D?=
=?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=BAspringdoc=E5=91=BD=E5=90=8D=E9=81=BF?=
=?UTF-8?q?=E5=85=8D=E8=AF=AF=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/src/main/resources/application.yml | 17 +++++++----------
...{SwaggerConfig.java => SpringDocConfig.java} | 16 ++++++++--------
...Properties.java => SpringDocProperties.java} | 4 ++--
...boot.autoconfigure.AutoConfiguration.imports | 2 +-
4 files changed, 18 insertions(+), 21 deletions(-)
rename ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/{SwaggerConfig.java => SpringDocConfig.java} (92%)
rename ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/{SwaggerProperties.java => SpringDocProperties.java} (95%)
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 31d0de5ff..f599a8471 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -204,8 +204,13 @@ mybatis-encryptor:
publicKey:
privateKey:
-# Swagger配置
-swagger:
+springdoc:
+ api-docs:
+ # 是否开启接口文档
+ enabled: true
+ swagger-ui:
+ # 持久化认证数据
+ persistAuthorization: true
info:
# 标题
title: '标题:${ruoyi.name}多租户管理系统_接口文档'
@@ -225,14 +230,6 @@ swagger:
type: APIKEY
in: HEADER
name: ${sa-token.token-name}
-
-springdoc:
- api-docs:
- # 是否开启接口文档
- enabled: true
- swagger-ui:
- # 持久化认证数据
- persistAuthorization: true
#这里定义了两个分组,可定义多个,也可以不定义
group-configs:
- group: 1.演示模块
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SwaggerConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java
similarity index 92%
rename from ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SwaggerConfig.java
rename to ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java
index 459941c97..4e3238007 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SwaggerConfig.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java
@@ -1,13 +1,13 @@
package org.dromara.common.doc.config;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.doc.config.properties.SwaggerProperties;
-import org.dromara.common.doc.handler.OpenApiHandler;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.doc.config.properties.SpringDocProperties;
+import org.dromara.common.doc.handler.OpenApiHandler;
import org.springdoc.core.configuration.SpringDocConfiguration;
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
import org.springdoc.core.customizers.OpenApiCustomizer;
@@ -36,18 +36,18 @@ import java.util.Set;
*/
@RequiredArgsConstructor
@AutoConfiguration(before = SpringDocConfiguration.class)
-@EnableConfigurationProperties(SwaggerProperties.class)
+@EnableConfigurationProperties(SpringDocProperties.class)
@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true)
-public class SwaggerConfig {
+public class SpringDocConfig {
private final ServerProperties serverProperties;
@Bean
@ConditionalOnMissingBean(OpenAPI.class)
- public OpenAPI openApi(SwaggerProperties swaggerProperties) {
+ public OpenAPI openApi(SpringDocProperties swaggerProperties) {
OpenAPI openApi = new OpenAPI();
// 文档基本信息
- SwaggerProperties.InfoProperties infoProperties = swaggerProperties.getInfo();
+ SpringDocProperties.InfoProperties infoProperties = swaggerProperties.getInfo();
Info info = convertInfo(infoProperties);
openApi.info(info);
// 扩展文档信息
@@ -65,7 +65,7 @@ public class SwaggerConfig {
return openApi;
}
- private Info convertInfo(SwaggerProperties.InfoProperties infoProperties) {
+ private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) {
Info info = new Info();
info.setTitle(infoProperties.getTitle());
info.setDescription(infoProperties.getDescription());
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SwaggerProperties.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java
similarity index 95%
rename from ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SwaggerProperties.java
rename to ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java
index 9e08e7398..eae3b4c62 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SwaggerProperties.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java
@@ -18,8 +18,8 @@ import java.util.List;
* @author Lion Li
*/
@Data
-@ConfigurationProperties(prefix = "swagger")
-public class SwaggerProperties {
+@ConfigurationProperties(prefix = "springdoc")
+public class SpringDocProperties {
/**
* 文档基本信息
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index e64b2eb3f..fe11e76e7 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1 @@
-org.dromara.common.doc.config.SwaggerConfig
+org.dromara.common.doc.config.SpringDocConfig
From 9bc1e4ac1e140e4bc68d33d3774489c029cc26a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 15 Jun 2023 14:13:18 +0800
Subject: [PATCH 028/115] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=20=E5=B0=86?=
=?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=86=85=E7=BD=AE=E9=85=8D=E7=BD=AE=E6=94=BE?=
=?UTF-8?q?=E7=BD=AE=E5=88=B0common=E5=8C=85=E5=86=85=E7=8B=AC=E7=AB=8B?=
=?UTF-8?q?=E5=8A=A0=E8=BD=BD=20=E4=B8=8D=E5=85=81=E8=AE=B8=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E9=9A=8F=E6=84=8F=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application.yml | 41 ++-----------------
.../factory/YmlPropertySourceFactory.java | 31 ++++++++++++++
.../mybatis/config/MybatisPlusConfig.java | 3 ++
.../src/main/resources/common-mybatis.yml | 33 +++++++++++++++
.../common/satoken/config/SaTokenConfig.java | 3 ++
.../src/main/resources/common-satoken.yml | 11 +++++
6 files changed, 85 insertions(+), 37 deletions(-)
create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml
create mode 100644 ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index f599a8471..b68a3dcd9 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -96,20 +96,14 @@ spring:
sa-token:
# token名称 (同时也是cookie名称)
token-name: Authorization
- # token有效期 设为一天 (必定过期) 单位: 秒
- timeout: 86400
- # token临时有效期 (指定时间无操作就过期) 单位: 秒
+ # token固定超时 设为七天 (必定过期) 单位: 秒
+ timeout: 604800
+ # token活跃超时时间 30分钟(指定时间无操作则过期) 单位: 秒
activity-timeout: 1800
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
- # 是否尝试从header里读取token
- is-read-header: true
- # 是否尝试从cookie里读取token
- is-read-cookie: false
- # token前缀
- token-prefix: "Bearer"
# jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
@@ -156,39 +150,12 @@ mybatis-plus:
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: org.dromara.**.domain
- # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
- checkConfigLocation: false
- configuration:
- # 自动驼峰命名规则(camel case)映射
- mapUnderscoreToCamelCase: true
- # MyBatis 自动映射策略
- # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
- autoMappingBehavior: FULL
- # MyBatis 自动映射时未知列或未知属性处理策
- # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
- autoMappingUnknownColumnBehavior: NONE
- # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
- # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
- # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
- logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
- # 是否打印 Logo banner
- banner: true
dbConfig:
# 主键类型
# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
+ # 如需改为自增 需要将数据库表全部设置为自增
idType: ASSIGN_ID
- # 逻辑已删除值
- logicDeleteValue: 2
- # 逻辑未删除值
- logicNotDeleteValue: 0
- # 字段验证策略之 insert,在 insert 的时候的字段验证策略
- # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL
- insertStrategy: NOT_NULL
- # 字段验证策略之 update,在 update 的时候的字段验证策略
- updateStrategy: NOT_NULL
- # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
- where-strategy: NOT_NULL
# 数据加密
mybatis-encryptor:
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
new file mode 100644
index 000000000..af61b90ca
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
@@ -0,0 +1,31 @@
+package org.dromara.common.core.factory;
+
+import org.dromara.common.core.utils.StringUtils;
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.core.env.PropertiesPropertySource;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.DefaultPropertySourceFactory;
+import org.springframework.core.io.support.EncodedResource;
+
+import java.io.IOException;
+
+/**
+ * yml 配置源工厂
+ *
+ * @author Lion Li
+ */
+public class YmlPropertySourceFactory extends DefaultPropertySourceFactory {
+
+ @Override
+ public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {
+ String sourceName = resource.getResource().getFilename();
+ if (StringUtils.isNotBlank(sourceName) && StringUtils.endsWithAny(sourceName, ".yml", ".yaml")) {
+ YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
+ factory.setResources(resource.getResource());
+ factory.afterPropertiesSet();
+ return new PropertiesPropertySource(sourceName, factory.getObject());
+ }
+ return super.createPropertySource(name, resource);
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
index 1fe7834fe..c07a2bb3b 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
@@ -7,11 +7,13 @@ import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.dromara.common.core.factory.YmlPropertySourceFactory;
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
@@ -22,6 +24,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement(proxyTargetClass = true)
@AutoConfiguration
@MapperScan("${mybatis-plus.mapperPackage}")
+@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig {
@Bean
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml
new file mode 100644
index 000000000..f5dc63758
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/common-mybatis.yml
@@ -0,0 +1,33 @@
+# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖
+# MyBatisPlus配置
+# https://baomidou.com/config/
+mybatis-plus:
+ # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
+ checkConfigLocation: false
+ configuration:
+ # 自动驼峰命名规则(camel case)映射
+ mapUnderscoreToCamelCase: true
+ # MyBatis 自动映射策略
+ # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
+ autoMappingBehavior: FULL
+ # MyBatis 自动映射时未知列或未知属性处理策
+ # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
+ autoMappingUnknownColumnBehavior: NONE
+ # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
+ # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
+ # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
+ logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+ global-config:
+ # 是否打印 Logo banner
+ banner: true
+ dbConfig:
+ # 主键类型
+ # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
+ idType: ASSIGN_ID
+ # 逻辑已删除值(框架表均使用此值 禁止随意修改)
+ logicDeleteValue: 2
+ # 逻辑未删除值
+ logicNotDeleteValue: 0
+ insertStrategy: NOT_NULL
+ updateStrategy: NOT_NULL
+ whereStrategy: NOT_NULL
diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java
index 54ae2da2b..aef8a66ae 100644
--- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java
+++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/config/SaTokenConfig.java
@@ -4,10 +4,12 @@ import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpLogic;
+import org.dromara.common.core.factory.YmlPropertySourceFactory;
import org.dromara.common.satoken.core.dao.PlusSaTokenDao;
import org.dromara.common.satoken.core.service.SaPermissionImpl;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
@@ -16,6 +18,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
* @author Lion Li
*/
@AutoConfiguration
+@PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class)
public class SaTokenConfig implements WebMvcConfigurer {
@Bean
diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml b/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml
new file mode 100644
index 000000000..c631641e4
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml
@@ -0,0 +1,11 @@
+# 内置配置 不允许修改 如需修改请在 nacos 上写相同配置覆盖
+# Sa-Token配置
+sa-token:
+ # 允许从 请求参数 读取 token
+ is-read-body: true
+ # 允许从 header 读取 token
+ is-read-header: true
+ # 关闭 cookie 鉴权 从根源杜绝 csrf 漏洞风险
+ is-read-cookie: false
+ # token前缀
+ token-prefix: "Bearer"
From cf4bc969bec5fc2d899f47e128319312533449cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Thu, 15 Jun 2023 18:18:00 +0800
Subject: [PATCH 029/115] =?UTF-8?q?update=20=E6=9B=B4=E6=94=B9=20readme=20?=
=?UTF-8?q?=E5=85=B3=E4=BA=8E=E7=9F=AD=E4=BF=A1=E7=9A=84=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index eb82295ad..6696573c4 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,7 @@
| 分布式任务调度 | 采用 Xxl-Job 天生支持分布式 统一的管理中心 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 |
| 文件存储 | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储 支持权限管理 安全可靠 文件可加密存储 | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应 |
| 云存储 | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家 | 不支持 |
-| 短信 | 支持 阿里、腾讯 只需在yml配置好厂家密钥即可使用 接口化支持扩展其他厂家 | 不支持 |
+| 短信 | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用 | 不支持 |
| 邮件 | 采用 mail-api 通用协议支持大部分邮件厂商 | 不支持 |
| 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释 只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 |
| 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 |
From 005e7df1b8d7733b459c24104bc775c52e528454 Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 19:30:17 +0800
Subject: [PATCH 030/115] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AC=AC=E4=B8=89?=
=?UTF-8?q?=E6=96=B9=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/pom.xml | 14 ++-
.../web/controller/AuthController.java | 12 +-
.../dromara/web/service/SysLoginService.java | 72 ++++++------
ruoyi-common/ruoyi-common-bom/pom.xml | 6 +
ruoyi-common/ruoyi-common-social/pom.xml | 23 ++--
.../common/social/config/SocialConfig.java | 2 +-
....java => SocialLoginConfigProperties.java} | 2 +-
.../config/properties/SocialProperties.java | 2 +-
.../social/utils/AuthRedisStateCache.java | 16 +--
.../common/social/utils/SocialUtils.java | 20 ++--
.../system/SocialUserController.java | 105 ------------------
.../system/service/ISocialUserService.java | 24 ----
.../service/impl/SocialUserServiceImpl.java | 69 ------------
.../mapper/system/SocialUserMapper.xml | 58 ++--------
script/sql/ry_vue_5.X.sql | 69 ++++++------
15 files changed, 113 insertions(+), 381 deletions(-)
rename ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/{ConfigProperties.java => SocialLoginConfigProperties.java} (94%)
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index e57c444a7..39731b1aa 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -43,6 +43,12 @@
ruoyi-common-doc
+
+ org.dromara
+ ruoyi-common-social
+
+
+
org.dromara
ruoyi-system
@@ -75,16 +81,12 @@
spring-boot-starter-test
test
+
me.zhyd.oauth
JustAuth
-
- org.dromara
- ruoyi-common-social
- 5.1.0-SNAPSHOT
- compile
-
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index f46cbdc38..8cb96cd69 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -3,12 +3,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSON;
-import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
-import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
@@ -22,10 +19,8 @@ import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.social.config.SocialConfig;
-import org.dromara.common.social.config.properties.ConfigProperties;
+import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
import org.dromara.common.social.config.properties.SocialProperties;
-import org.dromara.common.social.utils.AuthRedisStateCache;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
@@ -45,7 +40,6 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.util.List;
-import java.util.Map;
/**
* 认证
@@ -153,7 +147,7 @@ public class AuthController {
{
return R.fail(source + "平台账号已经被账号绑定");
}
- ConfigProperties obj = socialProperties.getType().get(source);
+ SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}
@@ -175,7 +169,7 @@ public class AuthController {
@SuppressWarnings("unchecked")
@GetMapping("/social-login/{source}")
public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
- ConfigProperties obj = socialProperties.getType().get(source);
+ SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 3628b05d7..84c554d14 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -44,6 +44,7 @@ import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.system.service.ISysUserService;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -181,27 +182,49 @@ public class SysLoginService {
return R.fail("对不起,授权信息验证不通过,请退出重试!");
}
AuthUser authUserData = authUser.getData();
- // 查询社交用户信息,判断是否已经绑定,如果已经绑定则直接登录,否则验证是否登录,未登录则先登录再绑定
- SocialUserVo user = socialUserService.selectSocialUserByAuthId(source + authUserData.getUuid());
+ String authId = source + authUserData.getUuid();
+
+ SocialUserVo user = socialUserService.selectSocialUserByAuthId(authId);
if (ObjectUtil.isNotNull(user)) {
- checkTenant(user.getTenantId());
- SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
- LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
- recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(user.getUserId());
+ //执行登录和记录登录信息操作
+ return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
} else {
// 判断是否已登录
if (LoginHelper.getUserId() == null) {
return R.fail("授权失败,请先登录再绑定");
}
SocialUserBo socialUserBo = new SocialUserBo();
- socialUserService.insertByBo(setAuthUserData(authUserData, socialUserBo));
+ socialUserBo.setUserId(LoginHelper.getUserId());
+ socialUserBo.setAuthId(authUserData.getSource() + authUserData.getUuid());
+ socialUserBo.setSource(authUserData.getSource());
+ socialUserBo.setUserName(authUserData.getUsername());
+ socialUserBo.setNickName(authUserData.getNickname());
+ socialUserBo.setAvatar(authUserData.getAvatar());
+ socialUserBo.setOpenId(authUserData.getUuid());
+ BeanUtils.copyProperties(authUserData, socialUserBo);
+ BeanUtils.copyProperties(authUserData.getToken(), socialUserBo);
+
+ socialUserService.insertByBo(socialUserBo);
SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
- checkTenant(lodingData.getTenantId());
- LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.SOCIAL);
- recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(socialUserBo.getUserId());
+ //执行登录和记录登录信息操作
+ return loginAndRecord(lodingData.getTenantId(), socialUserBo.getUserName(), authUserData);
}
+ }
+
+ /**
+ * 执行登录和记录登录信息操作
+ *
+ * @param tenantId 租户ID
+ * @param userName 用户名
+ * @param authUser 授权用户信息
+ * @return 统一响应实体
+ */
+ private R loginAndRecord(String tenantId, String userName, AuthUser authUser) {
+ checkTenant(tenantId);
+ SysUserVo dbUser = loadUserByUsername(tenantId, userName);
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
+ recordLogininfor(dbUser.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(dbUser.getUserId());
return R.ok(StpUtil.getTokenValue());
}
@@ -440,29 +463,4 @@ public class SysLoginService {
}
}
-
- public SocialUserBo setAuthUserData(AuthUser authUserData, SocialUserBo socialUser) {
- socialUser.setUserId(LoginHelper.getUserId());
- socialUser.setAuthId(authUserData.getSource() + authUserData.getUuid());
- socialUser.setSource(authUserData.getSource());
- socialUser.setUserName(authUserData.getUsername());
- socialUser.setNickName(authUserData.getNickname());
- socialUser.setAvatar(authUserData.getAvatar());
- socialUser.setEmail(authUserData.getEmail());
- socialUser.setOpenId(authUserData.getUuid());
- socialUser.setAccessToken(authUserData.getToken().getAccessToken());
- socialUser.setExpireIn(authUserData.getToken().getExpireIn());
- socialUser.setRefreshToken(authUserData.getToken().getRefreshToken());
- socialUser.setAccessCode(authUserData.getToken().getAccessCode());
- socialUser.setUnionId(authUserData.getToken().getUnionId());
- socialUser.setScope(authUserData.getToken().getScope());
- socialUser.setTokenType(authUserData.getToken().getTokenType());
- socialUser.setIdToken(authUserData.getToken().getIdToken());
- socialUser.setMacAlgorithm(authUserData.getToken().getMacAlgorithm());
- socialUser.setMacKey(authUserData.getToken().getMacKey());
- socialUser.setCode(authUserData.getToken().getCode());
- socialUser.setOauthToken(authUserData.getToken().getOauthToken());
- socialUser.setOauthTokenSecret(authUserData.getToken().getOauthTokenSecret());
- return socialUser;
- }
}
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 8a9e25a95..cac678c22 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -117,6 +117,12 @@
${revision}
+
+ org.dromara
+ ruoyi-common-social
+ ${revision}
+
+
org.dromara
diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml
index b87479b4b..77135a6d3 100644
--- a/ruoyi-common/ruoyi-common-social/pom.xml
+++ b/ruoyi-common/ruoyi-common-social/pom.xml
@@ -1,35 +1,26 @@
-
org.dromara
ruoyi-common
${revision}
- ../pom.xml
4.0.0
+
ruoyi-common-social
+
- ruoyi-common-auth 认证模块
+ ruoyi-common-social 授权认证
+
me.zhyd.oauth
JustAuth
-
- org.projectlombok
- lombok
-
-
- org.springframework.boot
- spring-boot
-
-
- org.springframework.boot
- spring-boot-autoconfigure
-
+
org.dromara
ruoyi-common-redis
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
index c50c56038..7a9a16637 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
@@ -17,7 +17,7 @@ import org.springframework.context.annotation.Bean;
public class SocialConfig {
@Bean
- public AuthStateCache redis() {
+ public AuthStateCache authStateCache() {
return new AuthRedisStateCache();
}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
similarity index 94%
rename from ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
rename to ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
index 813b03a6d..2b63c1eea 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
@@ -3,7 +3,7 @@ package org.dromara.common.social.config.properties;
import lombok.Data;
@Data
-public class ConfigProperties {
+public class SocialLoginConfigProperties {
/**
* 应用 ID
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
index 4240ebabd..811d821ff 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
@@ -24,7 +24,7 @@ public class SocialProperties {
/**
* 授权类型
*/
- private Map type;
+ private Map type;
/**
* 授权过期时间
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
index f438a1c85..f7f239294 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
@@ -12,21 +12,7 @@ import java.time.Duration;
public class AuthRedisStateCache implements AuthStateCache {
- private final SocialProperties socialProperties;
- private final RedisTemplate redisTemplate;
-
- private ValueOperations valueOperations;
-
- @PostConstruct
- public void init() {
- valueOperations = redisTemplate.opsForValue();
- }
-
-
- public AuthRedisStateCache() {
- this.socialProperties = new SocialProperties();
- redisTemplate = new RedisTemplate<>();
- }
+ private SocialProperties socialProperties;
/**
* 存入缓存
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
index b3a1cd1f4..64e84e79d 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -19,17 +19,17 @@ public class SocialUtils {
AuthRequest authRequest = null;
switch (source.toLowerCase()) {
case "dingtalk" ->
- authRequest = new AuthDingTalkRequest(AuthConfig.builder().
- clientId(clientId).
- clientSecret(clientSecret)
- .redirectUri(redirectUri).
- build());
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder()
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .redirectUri(redirectUri)
+ .build());
case "baidu" ->
- authRequest = new AuthBaiduRequest(AuthConfig.builder().
- clientId(clientId).
- clientSecret(clientSecret)
- .redirectUri(redirectUri).
- build());
+ authRequest = new AuthBaiduRequest(AuthConfig.builder()
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .redirectUri(redirectUri)
+ .build());
case "github" ->
authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
.redirectUri(redirectUri).build());
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
deleted file mode 100644
index 91994062f..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.dromara.system.controller.system;
-
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.system.domain.vo.SocialUserVo;
-import org.dromara.system.domain.bo.SocialUserBo;
-import org.dromara.system.service.ISocialUserService;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-
-/**
- * 社会化关系
- *
- * @author thiszhc
- * @date 2023-06-12
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/socialUser")
-public class SocialUserController extends BaseController {
-
- private final ISocialUserService socialUserService;
-
- /**
- * 查询社会化关系列表
- */
- @SaCheckPermission("system:user:list")
- @GetMapping("/list")
- public TableDataInfo list(SocialUserBo bo, PageQuery pageQuery) {
- return socialUserService.queryPageList(bo, pageQuery);
- }
-
- /**
- * 导出社会化关系列表
- */
- @SaCheckPermission("system:user:export")
- @Log(title = "社会化关系", businessType = BusinessType.EXPORT)
- @PostMapping("/export")
- public void export(SocialUserBo bo, HttpServletResponse response) {
- List list = socialUserService.queryList(bo);
- ExcelUtil.exportExcel(list, "社会化关系", SocialUserVo.class, response);
- }
-
- /**
- * 获取社会化关系详细信息
- *
- * @param id 主键
- */
- @SaCheckPermission("system:user:query")
- @GetMapping("/{id}")
- public R getInfo(@NotNull(message = "主键不能为空")
- @PathVariable Long id) {
- return R.ok(socialUserService.queryById(id));
- }
-
- /**
- * 新增社会化关系
- */
- @SaCheckPermission("system:user:add")
- @Log(title = "社会化关系", businessType = BusinessType.INSERT)
- @RepeatSubmit()
- @PostMapping()
- public R add(@Validated(AddGroup.class) @RequestBody SocialUserBo bo) {
- return toAjax(socialUserService.insertByBo(bo));
- }
-
- /**
- * 修改社会化关系
- */
- @SaCheckPermission("system:user:edit")
- @Log(title = "社会化关系", businessType = BusinessType.UPDATE)
- @RepeatSubmit()
- @PutMapping()
- public R edit(@Validated(EditGroup.class) @RequestBody SocialUserBo bo) {
- return toAjax(socialUserService.updateByBo(bo));
- }
-
- /**
- * 删除社会化关系
- *
- * @param ids 主键串
- */
- @SaCheckPermission("system:user:remove")
- @Log(title = "社会化关系", businessType = BusinessType.DELETE)
- @DeleteMapping("/{ids}")
- public R remove(@NotEmpty(message = "主键不能为空")
- @PathVariable Long[] ids) {
- return toAjax(socialUserService.deleteWithValidByIds(List.of(ids), true));
- }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
index f16cf1646..d9e87f7d7 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
@@ -19,35 +19,11 @@ import java.util.List;
*/
public interface ISocialUserService {
- /**
- * 查询授权关系
- */
- SocialUserVo queryById(Long id);
-
- /**
- * 查询授权列表
- */
- TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery);
-
- /**
- * 查询授权列表
- */
- List queryList(SocialUserBo bo);
-
/**
* 新增授权关系
*/
Boolean insertByBo(SocialUserBo bo);
- /**
- * 修改授权关系
- */
- Boolean updateByBo(SocialUserBo bo);
-
- /**
- * 校验并批量删除社会化关系信息
- */
- Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
/**
* 删除社会化关系信息
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
index c130fb7e6..fc342445b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
@@ -33,56 +33,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
private final SocialUserMapper baseMapper;
- /**
- * 查询社会化关系
- */
- @Override
- public SocialUserVo queryById(Long id) {
- return baseMapper.selectVoById(id);
- }
-
- /**
- * 查询社会化关系列表
- */
- @Override
- public TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery) {
- LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
- return TableDataInfo.build(result);
- }
-
- /**
- * 查询社会化关系列表
- */
- @Override
- public List queryList(SocialUserBo bo) {
- LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- return baseMapper.selectVoList(lqw);
- }
-
- private LambdaQueryWrapper buildQueryWrapper(SocialUserBo bo) {
- Map params = bo.getParams();
- LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
- lqw.eq(StringUtils.isNotBlank(bo.getAuthId()), SocialUser::getAuthId, bo.getAuthId());
- lqw.eq(StringUtils.isNotBlank(bo.getSource()), SocialUser::getSource, bo.getSource());
- lqw.eq(StringUtils.isNotBlank(bo.getAccessToken()), SocialUser::getAccessToken, bo.getAccessToken());
- lqw.eq(bo.getExpireIn() != 0, SocialUser::getExpireIn, bo.getExpireIn());
- lqw.eq(StringUtils.isNotBlank(bo.getRefreshToken()), SocialUser::getRefreshToken, bo.getRefreshToken());
- lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), SocialUser::getOpenId, bo.getOpenId());
- lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
- lqw.eq(StringUtils.isNotBlank(bo.getAccessCode()), SocialUser::getAccessCode, bo.getAccessCode());
- lqw.eq(StringUtils.isNotBlank(bo.getUnionId()), SocialUser::getUnionId, bo.getUnionId());
- lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
- lqw.eq(StringUtils.isNotBlank(bo.getTokenType()), SocialUser::getTokenType, bo.getTokenType());
- lqw.eq(StringUtils.isNotBlank(bo.getIdToken()), SocialUser::getIdToken, bo.getIdToken());
- lqw.eq(StringUtils.isNotBlank(bo.getMacAlgorithm()), SocialUser::getMacAlgorithm, bo.getMacAlgorithm());
- lqw.eq(StringUtils.isNotBlank(bo.getMacKey()), SocialUser::getMacKey, bo.getMacKey());
- lqw.eq(StringUtils.isNotBlank(bo.getCode()), SocialUser::getCode, bo.getCode());
- lqw.eq(StringUtils.isNotBlank(bo.getOauthToken()), SocialUser::getOauthToken, bo.getOauthToken());
- lqw.eq(StringUtils.isNotBlank(bo.getOauthTokenSecret()), SocialUser::getOauthTokenSecret, bo.getOauthTokenSecret());
- return lqw;
- }
-
/**
* 新增社会化关系
*/
@@ -97,15 +47,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
return flag;
}
- /**
- * 修改社会化关系
- */
- @Override
- public Boolean updateByBo(SocialUserBo bo) {
- SocialUser update = MapstructUtils.convert(bo, SocialUser.class);
- validEntityBeforeSave(update);
- return baseMapper.updateById(update) > 0;
- }
/**
* 保存前的数据校验
@@ -114,16 +55,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
//TODO 做一些数据校验,如唯一约束
}
- /**
- * 批量删除社会化关系
- */
- @Override
- public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
- if (isValid) {
- //TODO 做一些业务上的校验,判断是否需要校验
- }
- return baseMapper.deleteBatchIds(ids) > 0;
- }
/**
* 删除社会化关系
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
index fb636b162..0c50ee6eb 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
@@ -8,61 +8,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
- select id,
- user_id,
- tenant_id,
- auth_id,
- source,
- open_id,
- access_token,
- expire_in,
- refresh_token,
- access_code,
- union_id,
- scope,
- token_type,
- id_token,
- mac_algorithm,
- mac_key,
- code,
- oauth_token,
- oauth_token_secret,
- create_dept,
- create_by,
- create_time,
- update_by,
- update_time
- from social_user
-
-
-
-
- select b.*
- from social_user a
- left join sys_user b on a.user_id = b.user_id
- where a.user_id = #{userId}
-
-
-
- select b.user_id as userId,
- b.tenant_id as tenantId,
- b.user_name as userName,
- b.password as password,
- a.auth_id as authId,
- a.source as source
+ select b.user_id,
+ b.tenant_id,
+ b.user_name,
+ b.password,
+ a.auth_id,
+ a.source
from social_user a
- left join sys_user b on a.user_id = b.user_id
+ left join sys_user b on a.user_id = b.user_id
where a.auth_id = #{authId}
-
-
- select count(*)
- from social_user
- where user_id = #{userId} and source = #{source} limit 1
-
-
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 8c10bb2c2..94b8765eb 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -1,43 +1,40 @@
-
-- ----------------------------
-- 第三方平台授权表
-- ----------------------------
-CREATE TABLE `social_user`
+DROP TABLE IF EXISTS social_user;
+CREATE TABLE social_user
(
- `id` bigint unsigned NOT NULL COMMENT '主键',
- `user_id` bigint NOT NULL COMMENT '用户ID',
- `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id',
- `auth_id` varchar(255) NOT NULL COMMENT '授权+授权openid',
- `source` varchar(255) NOT NULL COMMENT '用户来源',
- `open_id` varchar(255) DEFAULT NULL COMMENT '原生open id',
- `user_name` varchar(30) NOT NULL COMMENT '登录账号',
- `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
- `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
- `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
- `access_token` varchar(255) NOT NULL COMMENT '用户的授权令牌',
- `expire_in` int DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
- `refresh_token` varchar(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
- `access_code` varchar(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
- `union_id` varchar(255) DEFAULT NULL COMMENT '用户的 unionid',
- `scope` varchar(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
- `token_type` varchar(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
- `id_token` varchar(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
- `mac_algorithm` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
- `mac_key` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
- `code` varchar(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
- `oauth_token` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
- `oauth_token_secret` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
- `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
- `create_by` bigint NOT NULL COMMENT '创建人',
- `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
- `update_by` bigint NOT NULL COMMENT '更新人',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
- `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
- PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4
- COLLATE = utf8mb4_general_ci
- ROW_FORMAT = DYNAMIC COMMENT ='社会化关系表';
+ id BIGINT UNSIGNED NOT NULL COMMENT '主键',
+ user_id BIGINT NOT NULL COMMENT '用户ID',
+ tenant_id VARCHAR(20) DEFAULT NULL COMMENT '租户id',
+ auth_id VARCHAR(255) NOT NULL COMMENT '授权+授权openid',
+ source VARCHAR(255) NOT NULL COMMENT '用户来源',
+ open_id VARCHAR(255) DEFAULT NULL COMMENT '原生open id',
+ user_name VARCHAR(30) NOT NULL COMMENT '登录账号',
+ nick_name VARCHAR(30) DEFAULT '' COMMENT '用户昵称',
+ email VARCHAR(255) DEFAULT '' COMMENT '用户邮箱',
+ avatar VARCHAR(500) DEFAULT '' COMMENT '头像地址',
+ access_token VARCHAR(255) NOT NULL COMMENT '用户的授权令牌',
+ expire_in INT DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+ refresh_token VARCHAR(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
+ access_code VARCHAR(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+ union_id VARCHAR(255) DEFAULT NULL COMMENT '用户的 unionid',
+ scope VARCHAR(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+ token_type VARCHAR(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+ id_token VARCHAR(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+ mac_algorithm VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ mac_key VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ code VARCHAR(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+ oauth_token VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ oauth_token_secret VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ PRIMARY KEY (id)
+) ENGINE = InnoDB COMMENT ='社会化关系表';
-- ----------------------------
-- 租户表
From ec2cbac35d2eaa3fddf65ca8dfc6c7583b87ff06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 16 Jun 2023 00:24:12 +0800
Subject: [PATCH 031/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20Mapper=20?=
=?UTF-8?q?=E5=A4=9A=E5=8F=82=E6=95=B0=E6=9C=AA=E5=8A=A0=20@Param=E6=B3=A8?=
=?UTF-8?q?=E8=A7=A3=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../org/dromara/generator/mapper/GenTableColumnMapper.java | 3 ++-
.../main/java/org/dromara/system/mapper/SysUserMapper.java | 7 ++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
index 2d8b886bd..f38d39caf 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java
@@ -2,6 +2,7 @@ package org.dromara.generator.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.generator.domain.GenTableColumn;
@@ -22,6 +23,6 @@ public interface GenTableColumnMapper extends BaseMapperPlus selectDbTableColumnsByName(String tableName, String dataName);
+ List selectDbTableColumnsByName(@Param("tableName") String tableName, String dataName);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
index 81bd1ff3d..c3a886980 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -94,7 +94,7 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@InterceptorIgnore(tenantLine = "true")
- SysUserVo selectTenantUserByUserName(String userName, String tenantId);
+ SysUserVo selectTenantUserByUserName(@Param("userName") String userName, @Param("tenantId") String tenantId);
/**
* 通过手机号查询用户(不走租户插件)
@@ -104,7 +104,7 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@InterceptorIgnore(tenantLine = "true")
- SysUserVo selectTenantUserByPhonenumber(String phonenumber, String tenantId);
+ SysUserVo selectTenantUserByPhonenumber(@Param("phonenumber") String phonenumber, @Param("tenantId") String tenantId);
/**
* 通过邮箱查询用户(不走租户插件)
@@ -114,7 +114,8 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@InterceptorIgnore(tenantLine = "true")
- SysUserVo selectTenantUserByEmail(String email, String tenantId);
+ SysUserVo selectTenantUserByEmail(@Param("email") String email, @Param("tenantId") String tenantId);
+
/**
* 通过用户ID查询用户
From da41c65213070f0adbaf7e8af2c6182070c9794c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 16 Jun 2023 00:31:55 +0800
Subject: [PATCH 032/115] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E9=82=AE?=
=?UTF-8?q?=E7=AE=B1=E7=99=BB=E5=BD=95=20=E6=9F=A5=E8=AF=A2=E5=80=BC?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/org/dromara/web/service/SysLoginService.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 2d816d148..c035d127b 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -271,7 +271,7 @@ public class SysLoginService {
private SysUserVo loadUserByEmail(String tenantId, String email) {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
- .select(SysUser::getPhonenumber, SysUser::getStatus)
+ .select(SysUser::getEmail, SysUser::getStatus)
.eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
.eq(SysUser::getEmail, email));
if (ObjectUtil.isNull(user)) {
From bbe9dc7dc8826d0ccfdad7deb572d8e0200d8c0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 16 Jun 2023 01:48:19 +0800
Subject: [PATCH 033/115] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/core/config/AsyncConfig.java | 10 +----
.../common/core/config/ValidatorConfig.java | 25 +++++------
.../common/core/utils/MessageUtils.java | 7 ++-
.../common/core/utils/ServletUtils.java | 43 +++++++++++++++++--
4 files changed, 60 insertions(+), 25 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java
index de9a9bcaa..9a32afe55 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java
@@ -2,16 +2,14 @@ package org.dromara.common.core.config;
import cn.hutool.core.util.ArrayUtil;
import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import java.util.Arrays;
import java.util.concurrent.Executor;
-import java.util.concurrent.ScheduledExecutorService;
/**
* 异步配置
@@ -22,16 +20,12 @@ import java.util.concurrent.ScheduledExecutorService;
@AutoConfiguration
public class AsyncConfig implements AsyncConfigurer {
- @Autowired
- @Qualifier("scheduledExecutorService")
- private ScheduledExecutorService scheduledExecutorService;
-
/**
* 自定义 @Async 注解使用系统线程池
*/
@Override
public Executor getAsyncExecutor() {
- return scheduledExecutorService;
+ return SpringUtils.getBean("scheduledExecutorService");
}
/**
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java
index 00825c2fd..45c5bd13c 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java
@@ -22,18 +22,19 @@ public class ValidatorConfig {
*/
@Bean
public Validator validator(MessageSource messageSource) {
- LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
- // 国际化
- factoryBean.setValidationMessageSource(messageSource);
- // 设置使用 HibernateValidator 校验器
- factoryBean.setProviderClass(HibernateValidator.class);
- Properties properties = new Properties();
- // 设置 快速异常返回
- properties.setProperty("hibernate.validator.fail_fast", "true");
- factoryBean.setValidationProperties(properties);
- // 加载配置
- factoryBean.afterPropertiesSet();
- return factoryBean.getValidator();
+ try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) {
+ // 国际化
+ factoryBean.setValidationMessageSource(messageSource);
+ // 设置使用 HibernateValidator 校验器
+ factoryBean.setProviderClass(HibernateValidator.class);
+ Properties properties = new Properties();
+ // 设置 快速异常返回
+ properties.setProperty("hibernate.validator.fail_fast", "true");
+ factoryBean.setValidationProperties(properties);
+ // 加载配置
+ factoryBean.afterPropertiesSet();
+ return factoryBean.getValidator();
+ }
}
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java
index 6f3729b98..48dfc08d7 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java
@@ -3,6 +3,7 @@ package org.dromara.common.core.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.context.MessageSource;
+import org.springframework.context.NoSuchMessageException;
import org.springframework.context.i18n.LocaleContextHolder;
/**
@@ -23,6 +24,10 @@ public class MessageUtils {
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args) {
- return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale());
+ try {
+ return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale());
+ } catch (NoSuchMessageException e) {
+ return code;
+ }
}
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java
index 91e2990bd..a1316eb85 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java
@@ -10,6 +10,7 @@ import jakarta.servlet.http.HttpSession;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.http.MediaType;
+import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -19,6 +20,7 @@ import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
@@ -101,14 +103,22 @@ public class ServletUtils extends JakartaServletUtil {
* 获取request
*/
public static HttpServletRequest getRequest() {
- return getRequestAttributes().getRequest();
+ try {
+ return getRequestAttributes().getRequest();
+ } catch (Exception e) {
+ return null;
+ }
}
/**
* 获取response
*/
public static HttpServletResponse getResponse() {
- return getRequestAttributes().getResponse();
+ try {
+ return getRequestAttributes().getResponse();
+ } catch (Exception e) {
+ return null;
+ }
}
/**
@@ -119,8 +129,33 @@ public class ServletUtils extends JakartaServletUtil {
}
public static ServletRequestAttributes getRequestAttributes() {
- RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
- return (ServletRequestAttributes) attributes;
+ try {
+ RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+ return (ServletRequestAttributes) attributes;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String getHeader(HttpServletRequest request, String name) {
+ String value = request.getHeader(name);
+ if (StringUtils.isEmpty(value)) {
+ return StringUtils.EMPTY;
+ }
+ return urlDecode(value);
+ }
+
+ public static Map getHeaders(HttpServletRequest request) {
+ Map map = new LinkedCaseInsensitiveMap<>();
+ Enumeration enumeration = request.getHeaderNames();
+ if (enumeration != null) {
+ while (enumeration.hasMoreElements()) {
+ String key = enumeration.nextElement();
+ String value = request.getHeader(key);
+ map.put(key, value);
+ }
+ }
+ return map;
}
/**
From effd504d482c89379daa63a4025336f5bd348913 Mon Sep 17 00:00:00 2001
From: yhan219
Date: Fri, 16 Jun 2023 14:58:36 +0000
Subject: [PATCH 034/115] =?UTF-8?q?!359=20[=E9=9C=80=E6=B1=82=E8=AE=A4?=
=?UTF-8?q?=E9=A2=86]=20=E5=AF=B9=E6=8E=A5=20powerjob=20=E5=AE=9E=E7=8E=B0?=
=?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6?=
=?UTF-8?q?=20=E9=9B=86=E6=88=90=E6=96=B9=E5=BC=8F=E5=8F=82=E8=80=83?=
=?UTF-8?q?=E6=A1=86=E6=9E=B6=E5=86=85=20xxl-job=20*=20=E5=AF=B9=E6=8E=A5p?=
=?UTF-8?q?owerjob=E6=9B=BF=E6=8D=A2xxl-job=E5=AE=9E=E7=8E=B0=E5=88=86?=
=?UTF-8?q?=E5=B8=83=E5=BC=8F=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
pom.xml | 20 +-
.../src/main/resources/application-dev.yml | 34 +-
.../src/main/resources/application-prod.yml | 34 +-
ruoyi-common/ruoyi-common-job/pom.xml | 12 +-
.../job/core/glue/impl/SpringGlueFactory.java | 80 -
.../common/job/config/PowerJobConfig.java | 21 +
.../common/job/config/XxlJobConfig.java | 38 -
.../config/properties/XxlJobProperties.java | 40 -
...ot.autoconfigure.AutoConfiguration.imports | 1 -
ruoyi-extend/pom.xml | 2 +-
ruoyi-extend/ruoyi-powerjob-server/pom.xml | 63 +
.../RuoyiPowerJobServerApplication.java | 45 +
.../resources/application-daily.properties | 42 +
.../main/resources/application-pre.properties | 42 +
.../resources/application-product.properties | 42 +
.../src/main/resources/application.properties | 22 +
.../src/main/resources/banner.txt | 15 +
.../logback-config/powerjob_monitor.xml | 132 +
.../src/main/resources/logback-dev.xml | 38 +
.../src/main/resources/logback-product.xml | 78 +
ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile | 16 -
ruoyi-extend/ruoyi-xxl-job-admin/pom.xml | 111 -
.../xxl/job/admin/XxlJobAdminApplication.java | 16 -
.../job/admin/controller/IndexController.java | 97 -
.../admin/controller/JobApiController.java | 72 -
.../admin/controller/JobCodeController.java | 97 -
.../admin/controller/JobGroupController.java | 205 -
.../admin/controller/JobInfoController.java | 180 -
.../admin/controller/JobLogController.java | 238 -
.../job/admin/controller/UserController.java | 179 -
.../annotation/PermissionLimit.java | 30 -
.../interceptor/CookieInterceptor.java | 42 -
.../interceptor/PermissionInterceptor.java | 59 -
.../controller/interceptor/WebMvcConfig.java | 28 -
.../resolver/WebExceptionResolver.java | 66 -
.../xxl/job/admin/core/alarm/JobAlarm.java | 20 -
.../xxl/job/admin/core/alarm/JobAlarmer.java | 65 -
.../admin/core/alarm/impl/EmailJobAlarm.java | 118 -
.../admin/core/complete/XxlJobCompleter.java | 99 -
.../admin/core/conf/XxlJobAdminConfig.java | 159 -
.../job/admin/core/cron/CronExpression.java | 1679 ---
.../admin/core/exception/XxlJobException.java | 15 -
.../xxl/job/admin/core/model/XxlJobGroup.java | 78 -
.../xxl/job/admin/core/model/XxlJobInfo.java | 237 -
.../xxl/job/admin/core/model/XxlJobLog.java | 158 -
.../job/admin/core/model/XxlJobLogGlue.java | 76 -
.../job/admin/core/model/XxlJobLogReport.java | 54 -
.../job/admin/core/model/XxlJobRegistry.java | 55 -
.../xxl/job/admin/core/model/XxlJobUser.java | 73 -
.../job/admin/core/old/RemoteHttpJobBean.java | 32 -
.../core/old/XxlJobDynamicScheduler.java | 413 -
.../job/admin/core/old/XxlJobThreadPool.java | 58 -
.../core/route/ExecutorRouteStrategyEnum.java | 49 -
.../job/admin/core/route/ExecutorRouter.java | 24 -
.../route/strategy/ExecutorRouteBusyover.java | 48 -
.../strategy/ExecutorRouteConsistentHash.java | 86 -
.../route/strategy/ExecutorRouteFailover.java | 48 -
.../route/strategy/ExecutorRouteFirst.java | 19 -
.../core/route/strategy/ExecutorRouteLFU.java | 79 -
.../core/route/strategy/ExecutorRouteLRU.java | 76 -
.../route/strategy/ExecutorRouteLast.java | 19 -
.../route/strategy/ExecutorRouteRandom.java | 23 -
.../route/strategy/ExecutorRouteRound.java | 46 -
.../core/scheduler/MisfireStrategyEnum.java | 39 -
.../core/scheduler/ScheduleTypeEnum.java | 46 -
.../admin/core/scheduler/XxlJobScheduler.java | 102 -
.../admin/core/thread/JobCompleteHelper.java | 185 -
.../core/thread/JobFailMonitorHelper.java | 112 -
.../admin/core/thread/JobLogReportHelper.java | 154 -
.../admin/core/thread/JobRegistryHelper.java | 206 -
.../admin/core/thread/JobScheduleHelper.java | 370 -
.../core/thread/JobTriggerPoolHelper.java | 148 -
.../admin/core/trigger/TriggerTypeEnum.java | 29 -
.../job/admin/core/trigger/XxlJobTrigger.java | 224 -
.../xxl/job/admin/core/util/CookieUtil.java | 98 -
.../com/xxl/job/admin/core/util/FtlUtil.java | 31 -
.../com/xxl/job/admin/core/util/I18nUtil.java | 80 -
.../xxl/job/admin/core/util/JacksonUtil.java | 93 -
.../job/admin/core/util/LocalCacheUtil.java | 134 -
.../com/xxl/job/admin/dao/XxlJobGroupDao.java | 37 -
.../com/xxl/job/admin/dao/XxlJobInfoDao.java | 51 -
.../com/xxl/job/admin/dao/XxlJobLogDao.java | 65 -
.../xxl/job/admin/dao/XxlJobLogGlueDao.java | 25 -
.../xxl/job/admin/dao/XxlJobLogReportDao.java | 27 -
.../xxl/job/admin/dao/XxlJobRegistryDao.java | 38 -
.../com/xxl/job/admin/dao/XxlJobUserDao.java | 33 -
.../xxl/job/admin/service/LoginService.java | 108 -
.../xxl/job/admin/service/XxlJobService.java | 87 -
.../job/admin/service/impl/AdminBizImpl.java | 35 -
.../admin/service/impl/XxlJobServiceImpl.java | 435 -
.../src/main/resources/application-dev.yml | 47 -
.../src/main/resources/application-prod.yml | 47 -
.../src/main/resources/application.yml | 64 -
.../src/main/resources/banner.txt | 8 -
.../main/resources/i18n/message_en.properties | 276 -
.../resources/i18n/message_zh_CN.properties | 276 -
.../resources/i18n/message_zh_TC.properties | 276 -
.../src/main/resources/logback-plus.xml | 34 -
.../mybatis-mapper/XxlJobGroupMapper.xml | 91 -
.../mybatis-mapper/XxlJobInfoMapper.xml | 240 -
.../mybatis-mapper/XxlJobLogGlueMapper.xml | 71 -
.../mybatis-mapper/XxlJobLogMapper.xml | 273 -
.../mybatis-mapper/XxlJobLogReportMapper.xml | 62 -
.../mybatis-mapper/XxlJobRegistryMapper.xml | 62 -
.../mybatis-mapper/XxlJobUserMapper.xml | 87 -
.../Ionicons/css/ionicons.min.css | 11 -
.../Ionicons/fonts/ionicons.eot | Bin 120724 -> 0 bytes
.../Ionicons/fonts/ionicons.svg | 2230 ----
.../Ionicons/fonts/ionicons.ttf | Bin 188508 -> 0 bytes
.../Ionicons/fonts/ionicons.woff | Bin 67904 -> 0 bytes
.../bower_components/PACE/pace.min.js | 2 -
.../PACE/themes/blue/pace-theme-flash.css | 77 -
.../daterangepicker.css | 269 -
.../daterangepicker.js | 1653 ---
.../bootstrap/css/bootstrap.min.css | 6 -
.../bootstrap/css/bootstrap.min.css.map | 1 -
.../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes
.../fonts/glyphicons-halflings-regular.svg | 288 -
.../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes
.../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes
.../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes
.../bootstrap/js/bootstrap.min.js | 6 -
.../css/dataTables.bootstrap.min.css | 1 -
.../js/dataTables.bootstrap.min.js | 8 -
.../js/jquery.dataTables.min.js | 166 -
.../bower_components/fastclick/fastclick.js | 841 --
.../font-awesome/css/font-awesome.css.map | 7 -
.../font-awesome/css/font-awesome.min.css | 4 -
.../font-awesome/fonts/FontAwesome.otf | Bin 134808 -> 0 bytes
.../fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes
.../fonts/fontawesome-webfont.svg | 2671 -----
.../fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes
.../fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes
.../fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes
.../jquery.slimscroll.min.js | 16 -
.../bower_components/jquery/jquery.min.js | 2 -
.../bower_components/moment/moment.min.js | 1 -
.../static/adminlte/dist/css/AdminLTE.min.css | 8 -
.../dist/css/skins/_all-skins.min.css | 1 -
.../static/adminlte/dist/js/adminlte.min.js | 13 -
.../adminlte/plugins/iCheck/icheck.min.js | 10 -
.../adminlte/plugins/iCheck/square/blue.css | 62 -
.../adminlte/plugins/iCheck/square/blue.png | Bin 2185 -> 0 bytes
.../plugins/iCheck/square/blue@2x.png | Bin 4485 -> 0 bytes
.../src/main/resources/static/favicon.ico | Bin 4286 -> 0 bytes
.../src/main/resources/static/js/common.1.js | 156 -
.../src/main/resources/static/js/index.js | 207 -
.../resources/static/js/jobcode.index.1.js | 97 -
.../resources/static/js/jobgroup.index.1.js | 359 -
.../resources/static/js/jobinfo.index.1.js | 739 --
.../resources/static/js/joblog.detail.1.js | 89 -
.../resources/static/js/joblog.index.1.js | 396 -
.../src/main/resources/static/js/login.1.js | 66 -
.../main/resources/static/js/user.index.1.js | 328 -
.../codemirror/addon/hint/anyword-hint.js | 41 -
.../codemirror/addon/hint/show-hint.css | 36 -
.../codemirror/addon/hint/show-hint.js | 434 -
.../plugins/codemirror/lib/codemirror.css | 346 -
.../plugins/codemirror/lib/codemirror.js | 9698 -----------------
.../plugins/codemirror/mode/clike/clike.js | 879 --
.../codemirror/mode/javascript/javascript.js | 899 --
.../static/plugins/codemirror/mode/php/php.js | 234 -
.../codemirror/mode/powershell/powershell.js | 398 -
.../plugins/codemirror/mode/python/python.js | 409 -
.../plugins/codemirror/mode/shell/shell.js | 152 -
.../static/plugins/cronGen/cronGen.js | 1106 --
.../static/plugins/cronGen/cronGen_en.js | 1106 --
.../plugins/echarts/echarts.common.min.js | 22 -
.../static/plugins/jquery/jquery.cookie.js | 117 -
.../plugins/jquery/jquery.validate.min.js | 4 -
.../resources/static/plugins/layer/layer.js | 2 -
.../plugins/layer/theme/default/icon-ext.png | Bin 5911 -> 0 bytes
.../plugins/layer/theme/default/icon.png | Bin 11493 -> 0 bytes
.../plugins/layer/theme/default/layer.css | 1 -
.../plugins/layer/theme/default/loading-0.gif | Bin 5793 -> 0 bytes
.../plugins/layer/theme/default/loading-1.gif | Bin 701 -> 0 bytes
.../plugins/layer/theme/default/loading-2.gif | Bin 1787 -> 0 bytes
.../templates/common/common.exception.ftl | 31 -
.../templates/common/common.macro.ftl | 239 -
.../src/main/resources/templates/help.ftl | 47 -
.../src/main/resources/templates/index.ftl | 147 -
.../templates/jobcode/jobcode.index.ftl | 164 -
.../templates/jobgroup/jobgroup.index.ftl | 172 -
.../templates/jobinfo/jobinfo.index.ftl | 540 -
.../templates/joblog/joblog.detail.ftl | 70 -
.../templates/joblog/joblog.index.ftl | 180 -
.../src/main/resources/templates/login.ftl | 45 -
.../resources/templates/user/user.index.ftl | 188 -
.../mapper/generator/GenTableMapper.xml | 24 +-
ruoyi-modules/ruoyi-job/pom.xml | 2 +-
.../java/org/dromara/job/package-info.java | 6 +
.../processors/BroadcastProcessorDemo.java | 56 +
.../job/processors/LogTestProcessor.java | 41 +
.../job/processors/MapProcessorDemo.java | 93 +
.../processors/MapReduceProcessorDemo.java | 94 +
.../job/processors/SimpleProcessor.java | 35 +
.../processors/StandaloneProcessorDemo.java | 51 +
.../job/processors/TimeoutProcessor.java | 25 +
.../dromara/job/service/SampleService.java | 252 -
.../workflow/WorkflowStandaloneProcessor.java | 36 +
script/docker/docker-compose.yml | 20 +-
script/docker/nginx/conf/nginx.conf | 10 +-
script/sql/oracle/oracle_ry_vue_5.X.sql | 4 +-
script/sql/postgres/postgres_ry_vue_5.X.sql | 4 +-
script/sql/powerjob_demo.sql | 5 +
script/sql/ry_vue_5.X.sql | 4 +-
script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 2 +-
script/sql/tables_xxl_job.sql | 119 -
209 files changed, 1069 insertions(+), 39363 deletions(-)
delete mode 100644 ruoyi-common/ruoyi-common-job/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java
create mode 100644 ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/PowerJobConfig.java
delete mode 100644 ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/XxlJobConfig.java
delete mode 100644 ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/properties/XxlJobProperties.java
delete mode 100644 ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/pom.xml
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/server/RuoyiPowerJobServerApplication.java
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-daily.properties
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-pre.properties
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-product.properties
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application.properties
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/banner.txt
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-config/powerjob_monitor.xml
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-dev.xml
create mode 100644 ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-product.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/pom.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application.yml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/banner.txt
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_en.properties
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/logback-plus.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/css/ionicons.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.eot
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.svg
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.ttf
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/Ionicons/fonts/ionicons.woff
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/pace.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css.map
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.css.map
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/css/font-awesome.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/FontAwesome.otf
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.eot
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.svg
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.ttf
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/font-awesome/fonts/fontawesome-webfont.woff2
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/jquery/jquery.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/bower_components/moment/moment.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/dist/js/adminlte.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/icheck.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.png
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue@2x.png
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/favicon.ico
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/common.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/index.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobcode.index.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/joblog.index.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/login.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/anyword-hint.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/clike/clike.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/php/php.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/python/python.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/shell/shell.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen_en.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/echarts/echarts.common.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.cookie.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/jquery/jquery.validate.min.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/layer.js
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon-ext.png
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/icon.png
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/layer.css
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-0.gif
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-1.gif
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/loading-2.gif
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/common/common.exception.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/help.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/index.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobcode/jobcode.index.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobgroup/jobgroup.index.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/login.ftl
delete mode 100644 ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/templates/user/user.index.ftl
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/package-info.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java
delete mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/SampleService.java
create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java
create mode 100644 script/sql/powerjob_demo.sql
delete mode 100644 script/sql/tables_xxl_job.sql
diff --git a/README.md b/README.md
index 6696573c4..fbdf62870 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@
| 序列化 | 采用 Jackson Spring官方内置序列化 靠谱!!! | 采用 fastjson bugjson 远近闻名 |
| 分布式幂等 | 参考美团GTIS防重系统简化实现(细节可看文档) | 手动编写注解基于aop实现 |
| 分布式锁 | 采用 Lock4j 底层基于 Redisson | 无 |
-| 分布式任务调度 | 采用 Xxl-Job 天生支持分布式 统一的管理中心 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 |
+| 分布式任务调度 | 采用 PowerJob 天生支持分布式 统一的管理中心 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 |
| 文件存储 | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储 支持权限管理 安全可靠 文件可加密存储 | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应 |
| 云存储 | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家 | 不支持 |
| 短信 | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用 | 不支持 |
diff --git a/pom.xml b/pom.xml
index 18e8448e9..18177ab79 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,7 @@
2.2.4
3.6.1
2.14.2
- 2.4.0
+ 4.3.3
1.2.3
0.2.0
1.18.26
@@ -264,12 +264,6 @@
${lock4j.version}
-
-
- com.xuxueli
- xxl-job-core
- ${xxl-job.version}
-
com.alibaba
@@ -328,6 +322,18 @@
${revision}
+
+
+ tech.powerjob
+ powerjob-worker-spring-boot-starter
+ ${powerjob.version}
+
+
+ tech.powerjob
+ powerjob-official-processors
+ ${powerjob.version}
+
+
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 5adc8aed8..e2ca3d60d 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -8,27 +8,19 @@ spring.boot.admin.client:
username: ruoyi
password: 123456
---- # xxl-job 配置
-xxl.job:
- # 执行器开关
- enabled: true
- # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
- admin-addresses: http://localhost:9100/xxl-job-admin
- # 执行器通讯TOKEN:非空时启用
- access-token: xxl-job
- executor:
- # 执行器AppName:执行器心跳注册分组依据;为空则关闭自动注册
- appname: xxl-job-executor
- # 执行器端口号 执行器从9101开始往后写
- port: 9101
- # 执行器注册:默认IP:PORT
- address:
- # 执行器IP:默认自动获取IP
- ip:
- # 执行器运行日志文件存储磁盘路径
- logpath: ./logs/xxl-job
- # 执行器日志文件保存天数:大于3生效
- logretentiondays: 30
+--- # powerjob 配置
+powerjob:
+ worker:
+ enabled: true
+ # 需要现在powerjob登录页执行应用注册后才能使用
+ app-name: ruoyi-worker
+ enable-test-mode: false
+ max-appended-wf-context-length: 4096
+ max-result-length: 4096
+ port: 27777
+ protocol: http
+ server-address: 127.0.0.1:7700,127.0.0.1:7701
+ store-strategy: disk
--- # 数据源配置
spring:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 4b29d1cec..1928c5b93 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -11,27 +11,19 @@ spring.boot.admin.client:
username: ruoyi
password: 123456
---- # xxl-job 配置
-xxl.job:
- # 执行器开关
- enabled: true
- # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
- admin-addresses: http://localhost:9100/xxl-job-admin
- # 执行器通讯TOKEN:非空时启用
- access-token: xxl-job
- executor:
- # 执行器AppName:执行器心跳注册分组依据;为空则关闭自动注册
- appname: xxl-job-executor
- # 执行器端口号 执行器从9101开始往后写
- port: 9101
- # 执行器注册:默认IP:PORT
- address:
- # 执行器IP:默认自动获取IP
- ip:
- # 执行器运行日志文件存储磁盘路径
- logpath: ./logs/xxl-job
- # 执行器日志文件保存天数:大于3生效
- logretentiondays: 30
+--- # powerjob 配置
+powerjob:
+ worker:
+ enabled: true
+ # 需要现在powerjob登录页执行应用注册后才能使用
+ app-name: ruoyi-worker
+ enable-test-mode: false
+ max-appended-wf-context-length: 4096
+ max-result-length: 4096
+ port: 27777
+ protocol: http
+ server-address: 127.0.0.1:7700,127.0.0.1:7701
+ store-strategy: disk
--- # 数据源配置
spring:
diff --git a/ruoyi-common/ruoyi-common-job/pom.xml b/ruoyi-common/ruoyi-common-job/pom.xml
index 446b4da01..b311477d0 100644
--- a/ruoyi-common/ruoyi-common-job/pom.xml
+++ b/ruoyi-common/ruoyi-common-job/pom.xml
@@ -15,17 +15,21 @@
ruoyi-common-job 定时任务
-
+
org.springframework.boot
spring-boot-autoconfigure
-
+
- com.xuxueli
- xxl-job-core
+ tech.powerjob
+ powerjob-worker-spring-boot-starter
+
+
+ tech.powerjob
+ powerjob-official-processors
diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java b/ruoyi-common/ruoyi-common-job/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java
deleted file mode 100644
index 00cd82287..000000000
--- a/ruoyi-common/ruoyi-common-job/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.xxl.job.core.glue.impl;
-
-import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
-import com.xxl.job.core.glue.GlueFactory;
-import jakarta.annotation.Resource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.core.annotation.AnnotationUtils;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-/**
- * @author xuxueli 2018-11-01
- */
-public class SpringGlueFactory extends GlueFactory {
- private static Logger logger = LoggerFactory.getLogger(SpringGlueFactory.class);
-
-
- /**
- * inject action of spring
- * @param instance
- */
- @Override
- public void injectService(Object instance){
- if (instance==null) {
- return;
- }
-
- if (XxlJobSpringExecutor.getApplicationContext() == null) {
- return;
- }
-
- Field[] fields = instance.getClass().getDeclaredFields();
- for (Field field : fields) {
- if (Modifier.isStatic(field.getModifiers())) {
- continue;
- }
-
- Object fieldBean = null;
- // with bean-id, bean could be found by both @Resource and @Autowired, or bean could only be found by @Autowired
-
- if (AnnotationUtils.getAnnotation(field, Resource.class) != null) {
- try {
- Resource resource = AnnotationUtils.getAnnotation(field, Resource.class);
- if (resource.name()!=null && resource.name().length()>0){
- fieldBean = XxlJobSpringExecutor.getApplicationContext().getBean(resource.name());
- } else {
- fieldBean = XxlJobSpringExecutor.getApplicationContext().getBean(field.getName());
- }
- } catch (Exception e) {
- }
- if (fieldBean==null ) {
- fieldBean = XxlJobSpringExecutor.getApplicationContext().getBean(field.getType());
- }
- } else if (AnnotationUtils.getAnnotation(field, Autowired.class) != null) {
- Qualifier qualifier = AnnotationUtils.getAnnotation(field, Qualifier.class);
- if (qualifier!=null && qualifier.value()!=null && qualifier.value().length()>0) {
- fieldBean = XxlJobSpringExecutor.getApplicationContext().getBean(qualifier.value());
- } else {
- fieldBean = XxlJobSpringExecutor.getApplicationContext().getBean(field.getType());
- }
- }
-
- if (fieldBean!=null) {
- field.setAccessible(true);
- try {
- field.set(instance, fieldBean);
- } catch (IllegalArgumentException e) {
- logger.error(e.getMessage(), e);
- } catch (IllegalAccessException e) {
- logger.error(e.getMessage(), e);
- }
- }
- }
- }
-
-}
diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/PowerJobConfig.java b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/PowerJobConfig.java
new file mode 100644
index 000000000..67208c0e5
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/PowerJobConfig.java
@@ -0,0 +1,21 @@
+package org.dromara.common.job.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import tech.powerjob.worker.PowerJobWorker;
+
+/**
+ * 启动定时任务
+ * @author yhan219
+ * @since 2023/6/2
+ */
+@Configuration
+@ConditionalOnBean(PowerJobWorker.class)
+@ConditionalOnProperty(prefix = "powerjob.worker", name = "enabled", havingValue = "true")
+@EnableScheduling
+public class PowerJobConfig {
+
+
+}
diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/XxlJobConfig.java b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/XxlJobConfig.java
deleted file mode 100644
index f85c8058a..000000000
--- a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/XxlJobConfig.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.dromara.common.job.config;
-
-import org.dromara.common.job.config.properties.XxlJobProperties;
-import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-
-/**
- * xxl-job config
- *
- * @author Lion Li
- */
-@Slf4j
-@AutoConfiguration
-@EnableConfigurationProperties(XxlJobProperties.class)
-@ConditionalOnProperty(prefix = "xxl.job", name = "enabled", havingValue = "true")
-public class XxlJobConfig {
-
- @Bean
- public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties xxlJobProperties) {
- log.info(">>>>>>>>>>> xxl-job config init.");
- XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
- xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses());
- xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken());
- XxlJobProperties.Executor executor = xxlJobProperties.getExecutor();
- xxlJobSpringExecutor.setAppname(executor.getAppname());
- xxlJobSpringExecutor.setAddress(executor.getAddress());
- xxlJobSpringExecutor.setIp(executor.getIp());
- xxlJobSpringExecutor.setPort(executor.getPort());
- xxlJobSpringExecutor.setLogPath(executor.getLogPath());
- xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays());
- return xxlJobSpringExecutor;
- }
-
-}
diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/properties/XxlJobProperties.java b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/properties/XxlJobProperties.java
deleted file mode 100644
index 47cbc2c8c..000000000
--- a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/properties/XxlJobProperties.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.dromara.common.job.config.properties;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-/**
- * xxljob配置类
- *
- * @author Lion Li
- */
-@Data
-@ConfigurationProperties(prefix = "xxl.job")
-public class XxlJobProperties {
-
- private Boolean enabled;
-
- private String adminAddresses;
-
- private String accessToken;
-
- private Executor executor;
-
- @Data
- @NoArgsConstructor
- public static class Executor {
-
- private String appname;
-
- private String address;
-
- private String ip;
-
- private int port;
-
- private String logPath;
-
- private int logRetentionDays;
- }
-}
diff --git a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index 3e6fd6e59..000000000
--- a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1 +0,0 @@
-org.dromara.common.job.config.XxlJobConfig
diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml
index ee176e998..f5348cc13 100644
--- a/ruoyi-extend/pom.xml
+++ b/ruoyi-extend/pom.xml
@@ -13,7 +13,7 @@
ruoyi-monitor-admin
- ruoyi-xxl-job-admin
+ ruoyi-powerjob-server
diff --git a/ruoyi-extend/ruoyi-powerjob-server/pom.xml b/ruoyi-extend/ruoyi-powerjob-server/pom.xml
new file mode 100644
index 000000000..7bac8b197
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/pom.xml
@@ -0,0 +1,63 @@
+
+ 4.0.0
+
+ org.dromara
+ ruoyi-extend
+ ${revision}
+
+ org.dromara
+ ruoyi-powerjob-server
+ ${revision}
+ jar
+
+
+ 2.7.4
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+ tech.powerjob
+ powerjob-server-starter
+ ${powerjob.version}
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/server/RuoyiPowerJobServerApplication.java b/ruoyi-extend/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/server/RuoyiPowerJobServerApplication.java
new file mode 100644
index 000000000..ff8b06976
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/java/org/dromara/powerjob/server/RuoyiPowerJobServerApplication.java
@@ -0,0 +1,45 @@
+package org.dromara.powerjob.server;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import tech.powerjob.server.PowerJobServerApplication;
+import tech.powerjob.server.common.utils.PropertyUtils;
+
+/**
+ * Admin 监控启动程序
+ *
+ * @author yhan219
+ */
+@Slf4j
+@EnableScheduling
+@SpringBootApplication(scanBasePackages = "tech.powerjob.server")
+public class RuoyiPowerJobServerApplication {
+
+ private static final String TIPS = "\n\n" +
+ "******************* PowerJob Tips *******************\n" +
+ "如果应用无法启动,我们建议您仔细阅读以下文档来解决:\n" +
+ "if server can't startup, we recommend that you read the documentation to find a solution:\n" +
+ "https://www.yuque.com/powerjob/guidence/problem\n" +
+ "******************* PowerJob Tips *******************\n\n";
+
+ public static void main(String[] args) {
+
+ pre();
+
+ // Start SpringBoot application.
+ try {
+ SpringApplication.run(PowerJobServerApplication.class, args);
+ } catch (Throwable t) {
+ log.error(TIPS);
+ throw t;
+ }
+ }
+
+ private static void pre() {
+ log.info(TIPS);
+ PropertyUtils.init();
+ }
+
+}
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-daily.properties b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-daily.properties
new file mode 100644
index 000000000..5b07eec49
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-daily.properties
@@ -0,0 +1,42 @@
+oms.env=DAILY
+logging.config=classpath:logback-dev.xml
+
+####### Database properties(Configure according to the the environment) #######
+spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+spring.datasource.core.username=root
+spring.datasource.core.password=root
+spring.datasource.core.maximum-pool-size=20
+spring.datasource.core.minimum-idle=5
+
+####### MongoDB properties(Non-core configuration properties) #######
+####### delete mongodb config to disable mongodb #######
+#oms.mongodb.enable=true
+#spring.data.mongodb.uri=mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority
+
+####### Email properties(Non-core configuration properties) #######
+####### Delete the following code to disable the mail #######
+#spring.mail.host=smtp.163.com
+#spring.mail.username=zqq@163.com
+#spring.mail.password=GOFZPNARMVKCGONV
+#spring.mail.properties.mail.smtp.auth=true
+#spring.mail.properties.mail.smtp.starttls.enable=true
+#spring.mail.properties.mail.smtp.starttls.required=true
+
+####### DingTalk properties(Non-core configuration properties) #######
+####### Delete the following code to disable the DingTalk #######
+#oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
+#oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
+#oms.alarm.ding.agent-id=847044348
+
+####### Resource cleaning properties #######
+oms.instanceinfo.retention=1
+oms.container.retention.local=1
+oms.container.retention.remote=-1
+
+####### Cache properties #######
+oms.instance.metadata.cache.size=1024
+
+####### Threshold in precise fetching server(0~100). 100 means full detection of server, in which #######
+####### split-brain could be avoided while performance overhead would increase. #######
+oms.accurate.select.server.percentage = 50
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-pre.properties b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-pre.properties
new file mode 100644
index 000000000..f08f673b8
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-pre.properties
@@ -0,0 +1,42 @@
+oms.env=PRE
+logging.config=classpath:logback-product.xml
+
+####### Database properties(Configure according to the the environment) #######
+spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.core.jdbc-url=jdbc:mysql://remotehost:3306/powerjob-pre?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+spring.datasource.core.username=root
+spring.datasource.core.password=No1Bug2Please3!
+spring.datasource.core.maximum-pool-size=20
+spring.datasource.core.minimum-idle=5
+
+####### MongoDB properties(Non-core configuration properties) #######
+####### delete mongodb config to disable mongodb #######
+oms.mongodb.enable=true
+spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-pre
+
+####### Email properties(Non-core configuration properties) #######
+####### Delete the following code to disable the mail #######
+spring.mail.host=smtp.qq.com
+spring.mail.username=zqq
+spring.mail.password=qqz
+spring.mail.properties.mail.smtp.auth=true
+spring.mail.properties.mail.smtp.starttls.enable=true
+spring.mail.properties.mail.smtp.starttls.required=true
+
+####### DingTalk properties(Non-core configuration properties) #######
+####### Delete the following code to disable the DingTalk #######
+oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
+oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
+oms.alarm.ding.agent-id=847044348
+
+####### Resource cleaning properties #######
+oms.instanceinfo.retention=3
+oms.container.retention.local=3
+oms.container.retention.remote=-1
+
+####### Cache properties #######
+oms.instance.metadata.cache.size=1024
+
+####### Threshold in precise fetching server(0~100). 100 means full detection of server, in which #######
+####### split-brain could be avoided while performance overhead would increase. #######
+oms.accurate.select.server.percentage = 50
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-product.properties b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-product.properties
new file mode 100644
index 000000000..a3ed4fe19
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application-product.properties
@@ -0,0 +1,42 @@
+oms.env=PRODUCT
+logging.config=classpath:logback-product.xml
+
+####### Database properties(Configure according to the the environment) #######
+spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+spring.datasource.core.username=root
+spring.datasource.core.password=No1Bug2Please3!
+spring.datasource.core.maximum-pool-size=20
+spring.datasource.core.minimum-idle=5
+
+####### MongoDB properties(Non-core configuration properties) #######
+####### delete mongodb config to disable mongodb #######
+oms.mongodb.enable=true
+spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-product
+
+####### Email properties(Non-core configuration properties) #######
+####### Delete the following code to disable the mail #######
+spring.mail.host=smtp.qq.com
+spring.mail.username=zqq
+spring.mail.password=qqz
+spring.mail.properties.mail.smtp.auth=true
+spring.mail.properties.mail.smtp.starttls.enable=true
+spring.mail.properties.mail.smtp.starttls.required=true
+
+####### DingTalk properties(Non-core configuration properties) #######
+####### Delete the following code to disable the DingTalk #######
+oms.alarm.ding.app-key=
+oms.alarm.ding.app-secret=
+oms.alarm.ding.agent-id=
+
+####### Resource cleaning properties #######
+oms.instanceinfo.retention=7
+oms.container.retention.local=7
+oms.container.retention.remote=-1
+
+####### Cache properties #######
+oms.instance.metadata.cache.size=2048
+
+####### Threshold in precise fetching server(0~100). 100 means full detection of server, in which #######
+####### split-brain could be avoided while performance overhead would increase. #######
+oms.accurate.select.server.percentage = 50
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application.properties b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application.properties
new file mode 100644
index 000000000..6946a0e30
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/application.properties
@@ -0,0 +1,22 @@
+# Http server port
+server.port=7700
+
+spring.profiles.active=daily
+spring.main.banner-mode=log
+spring.jpa.open-in-view=false
+spring.data.mongodb.repositories.type=none
+logging.level.org.mongodb=warn
+
+# Configuration for uploading files.
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.file-size-threshold=0
+spring.servlet.multipart.max-file-size=209715200
+spring.servlet.multipart.max-request-size=209715200
+
+###### PowerJob transporter configuration ######
+oms.transporter.active.protocols=AKKA,HTTP
+oms.transporter.main.protocol=HTTP
+oms.akka.port=10086
+oms.http.port=10010
+# Prefix for all tables. Default empty string. Config if you have needs, i.e. pj_
+oms.table-prefix=pj_
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/banner.txt b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/banner.txt
new file mode 100644
index 000000000..82d536ace
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/banner.txt
@@ -0,0 +1,15 @@
+${AnsiColor.GREEN}
+ ███████ ██ ██
+░██░░░░██ ░██ ░██
+░██ ░██ ██████ ███ ██ █████ ██████ ░██ ██████ ░██
+░███████ ██░░░░██░░██ █ ░██ ██░░░██░░██░░█ ░██ ██░░░░██░██████
+░██░░░░ ░██ ░██ ░██ ███░██░███████ ░██ ░ ░██░██ ░██░██░░░██
+░██ ░██ ░██ ░████░████░██░░░░ ░██ ██ ░██░██ ░██░██ ░██
+░██ ░░██████ ███░ ░░░██░░██████░███ ░░█████ ░░██████ ░██████
+░░ ░░░░░░ ░░░ ░░░ ░░░░░░ ░░░ ░░░░░ ░░░░░░ ░░░░░
+${AnsiColor.BRIGHT_RED}
+* Maintainer: tengjiqi@gmail.com & Team PowerJob
+* OfficialWebsite: http://www.powerjob.tech/
+* SourceCode: https://github.com/PowerJob/PowerJob
+* PoweredBy: SpringBoot${spring-boot.formatted-version}
+${AnsiColor.DEFAULT}
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-config/powerjob_monitor.xml b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-config/powerjob_monitor.xml
new file mode 100644
index 000000000..d357a833e
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-config/powerjob_monitor.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+ ${MONITOR_LOG_PATH}/database.log
+
+ ${MONITOR_LOG_PATTERN}
+ UTF-8
+
+
+ ${MONITOR_LOG_PATH}/database.log.${ROTATE_PATTERN}
+ 3
+ 200MB
+ 1000MB
+
+
+
+ 512
+ 0
+ true
+
+
+
+
+
+
+
+
+
+ ${MONITOR_LOG_PATH}/tt_status_report.log
+
+ ${MONITOR_LOG_PATTERN}
+ UTF-8
+
+
+ ${MONITOR_LOG_PATH}/tt_status_report.log.${ROTATE_PATTERN}
+ 3
+ 200MB
+ 1000MB
+
+
+
+ 512
+ 0
+ true
+
+
+
+
+
+
+
+
+ ${MONITOR_LOG_PATH}/worker_heartbeat.log
+
+ ${MONITOR_LOG_PATTERN}
+ UTF-8
+
+
+ ${MONITOR_LOG_PATH}/worker_heartbeat.log.${ROTATE_PATTERN}
+ 3
+ 200MB
+ 1000MB
+
+
+
+ 512
+ 0
+ true
+
+
+
+
+
+
+
+
+
+ ${MONITOR_LOG_PATH}/worker_log_report.log
+
+ ${MONITOR_LOG_PATTERN}
+ UTF-8
+
+
+ ${MONITOR_LOG_PATH}/worker_log_report.log.${ROTATE_PATTERN}
+ 3
+ 200MB
+ 1000MB
+
+
+
+ 512
+ 0
+ true
+
+
+
+
+
+
+
+
+
+ ${MONITOR_LOG_PATH}/lock.log
+
+ ${MONITOR_LOG_PATTERN}
+ UTF-8
+
+
+ ${MONITOR_LOG_PATH}/lock.log.${ROTATE_PATTERN}
+ 3
+ 200MB
+ 1000MB
+
+
+
+ 512
+ 0
+ true
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-dev.xml b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-dev.xml
new file mode 100644
index 000000000..9951c3bc5
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-dev.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+ utf8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-product.xml b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-product.xml
new file mode 100644
index 000000000..80be04f6a
--- /dev/null
+++ b/ruoyi-extend/ruoyi-powerjob-server/src/main/resources/logback-product.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/powerjob-server-error.log
+
+ ${LOG_PATH}/powerjob-server-error.%d{yyyy-MM-dd}.log
+ 7
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n
+ UTF-8
+
+
+ ERROR
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${LOG_PATH}/powerjob-server-web.log
+
+ ${LOG_PATH}/powerjob-server-web.%d{yyyy-MM-dd}.log
+ 7
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
+ UTF-8
+
+ true
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/powerjob-server-application.log
+
+ ${LOG_PATH}/powerjob-server-application.%d{yyyy-MM-dd}.log
+ 7
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n
+ UTF-8
+
+ true
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile b/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile
deleted file mode 100644
index 049c5c58d..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile
+++ /dev/null
@@ -1,16 +0,0 @@
-FROM findepi/graalvm:java17-native
-
-MAINTAINER Lion Li
-
-RUN mkdir -p /ruoyi/xxljob/logs
-
-WORKDIR /ruoyi/xxljob
-
-ENV TZ=PRC
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-
-EXPOSE 9100
-
-ADD ./target/ruoyi-xxl-job-admin.jar ./app.jar
-
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml
deleted file mode 100644
index 10f12b5df..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-
- 4.0.0
-
- ruoyi-extend
- org.dromara
- ${revision}
-
- ruoyi-xxl-job-admin
- jar
-
-
- 2.7.12
- 2.7.10
- 2.2.2
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-parent
- ${spring-boot.version}
- pom
- import
-
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
- org.springframework.boot
- spring-boot-starter-freemarker
-
-
-
-
- org.springframework.boot
- spring-boot-starter-mail
-
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
-
- org.springframework.boot
- spring-boot-starter-aop
-
-
-
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- ${mybatis-spring-boot.version}
-
-
-
- com.mysql
- mysql-connector-j
-
-
-
- de.codecentric
- spring-boot-admin-starter-client
- ${spring-boot-admin.version}
-
-
-
-
- com.xuxueli
- xxl-job-core
-
-
-
-
-
- ${project.artifactId}
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot.version}
-
-
-
- repackage
-
-
-
-
-
-
-
-
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
deleted file mode 100644
index 95ec1c412..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.xxl.job.admin;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-/**
- * @author xuxueli 2018-10-28 00:38:13
- */
-@SpringBootApplication
-public class XxlJobAdminApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(XxlJobAdminApplication.class, args);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
deleted file mode 100644
index bbb25077d..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.controller.annotation.PermissionLimit;
-import com.xxl.job.admin.service.LoginService;
-import com.xxl.job.admin.service.XxlJobService;
-import com.xxl.job.core.biz.model.ReturnT;
-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.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.view.RedirectView;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-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;
- @Resource
- private LoginService loginService;
-
-
- @RequestMapping("/")
- public String index(Model model) {
-
- Map dashboardMap = xxlJobService.dashboardInfo();
- model.addAllAttributes(dashboardMap);
-
- return "index";
- }
-
- @RequestMapping("/chartInfo")
- @ResponseBody
- public ReturnT> chartInfo(Date startDate, Date endDate) {
- ReturnT> chartInfo = xxlJobService.chartInfo(startDate, endDate);
- return chartInfo;
- }
-
- @RequestMapping("/toLogin")
- @PermissionLimit(limit = false)
- public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) {
- if (loginService.ifLogin(request, response) != null) {
- modelAndView.setView(new RedirectView("/", true, false));
- return modelAndView;
- }
- return new ModelAndView("login");
- }
-
- @RequestMapping(value = "login", method = RequestMethod.POST)
- @ResponseBody
- @PermissionLimit(limit = false)
- public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember) {
- boolean ifRem = (ifRemember != null && ifRemember.trim().length() > 0 && "on".equals(ifRemember)) ? true : false;
- return loginService.login(request, response, userName, password, ifRem);
- }
-
- @RequestMapping(value = "logout", method = RequestMethod.POST)
- @ResponseBody
- @PermissionLimit(limit = false)
- public ReturnT logout(HttpServletRequest request, HttpServletResponse response) {
- return loginService.logout(request, response);
- }
-
- @RequestMapping("/help")
- public String help() {
-
- /*if (!PermissionInterceptor.ifLogin(request)) {
- return "redirect:/toLogin";
- }*/
-
- return "help";
- }
-
- @InitBinder
- public void initBinder(WebDataBinder binder) {
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- dateFormat.setLenient(false);
- binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
deleted file mode 100644
index f4a37a71d..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.controller.annotation.PermissionLimit;
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.core.biz.AdminBiz;
-import com.xxl.job.core.biz.model.HandleCallbackParam;
-import com.xxl.job.core.biz.model.RegistryParam;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.util.GsonTool;
-import com.xxl.job.core.util.XxlJobRemotingUtil;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/5/10.
- */
-@Controller
-@RequestMapping("/api")
-public class JobApiController {
-
- @Resource
- private AdminBiz adminBiz;
-
- /**
- * api
- *
- * @param uri
- * @param data
- * @return
- */
- @RequestMapping("/{uri}")
- @ResponseBody
- @PermissionLimit(limit = false)
- public ReturnT api(HttpServletRequest request, @PathVariable("uri") String uri, @RequestBody(required = false) String data) {
-
- // valid
- if (!"POST".equalsIgnoreCase(request.getMethod())) {
- return new ReturnT(ReturnT.FAIL_CODE, "invalid request, HttpMethod not support.");
- }
- if (uri == null || uri.trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping empty.");
- }
- if (XxlJobAdminConfig.getAdminConfig().getAccessToken() != null
- && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length() > 0
- && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) {
- return new ReturnT(ReturnT.FAIL_CODE, "The access token is wrong.");
- }
-
- // services mapping
- if ("callback".equals(uri)) {
- List callbackParamList = GsonTool.fromJson(data, List.class, HandleCallbackParam.class);
- return adminBiz.callback(callbackParamList);
- } else if ("registry".equals(uri)) {
- RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);
- return adminBiz.registry(registryParam);
- } else if ("registryRemove".equals(uri)) {
- RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);
- return adminBiz.registryRemove(registryParam);
- } else {
- return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping(" + uri + ") not found.");
- }
-
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
deleted file mode 100644
index 9185f86b4..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLogGlue;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.XxlJobInfoDao;
-import com.xxl.job.admin.dao.XxlJobLogGlueDao;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.glue.GlueTypeEnum;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.List;
-
-/**
- * job code controller
- *
- * @author xuxueli 2015-12-19 16:13:16
- */
-@Controller
-@RequestMapping("/jobcode")
-public class JobCodeController {
-
- @Resource
- private XxlJobInfoDao xxlJobInfoDao;
- @Resource
- private XxlJobLogGlueDao xxlJobLogGlueDao;
-
- @RequestMapping
- public String index(HttpServletRequest request, Model model, int jobId) {
- XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
- List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
-
- if (jobInfo == null) {
- throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
- }
- if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) {
- throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid"));
- }
-
- // valid permission
- JobInfoController.validPermission(request, jobInfo.getJobGroup());
-
- // Glue类型-字典
- model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());
-
- model.addAttribute("jobInfo", jobInfo);
- model.addAttribute("jobLogGlues", jobLogGlues);
- return "jobcode/jobcode.index";
- }
-
- @RequestMapping("/save")
- @ResponseBody
- public ReturnT save(Model model, int id, String glueSource, String glueRemark) {
- // valid
- if (glueRemark == null) {
- return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")));
- }
- if (glueRemark.length() < 4 || glueRemark.length() > 100) {
- return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit"));
- }
- XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id);
- if (exists_jobInfo == null) {
- return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
- }
-
- // update new code
- exists_jobInfo.setGlueSource(glueSource);
- exists_jobInfo.setGlueRemark(glueRemark);
- exists_jobInfo.setGlueUpdatetime(new Date());
-
- exists_jobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(exists_jobInfo);
-
- // log old code
- XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue();
- xxlJobLogGlue.setJobId(exists_jobInfo.getId());
- xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType());
- xxlJobLogGlue.setGlueSource(glueSource);
- xxlJobLogGlue.setGlueRemark(glueRemark);
-
- xxlJobLogGlue.setAddTime(new Date());
- xxlJobLogGlue.setUpdateTime(new Date());
- xxlJobLogGlueDao.save(xxlJobLogGlue);
-
- // remove code backup more than 30
- xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30);
-
- return ReturnT.SUCCESS;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
deleted file mode 100644
index 5cbf87287..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.controller.annotation.PermissionLimit;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobRegistry;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.XxlJobGroupDao;
-import com.xxl.job.admin.dao.XxlJobInfoDao;
-import com.xxl.job.admin.dao.XxlJobRegistryDao;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.enums.RegistryConfig;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-/**
- * job group controller
- *
- * @author xuxueli 2016-10-02 20:52:56
- */
-@Controller
-@RequestMapping("/jobgroup")
-public class JobGroupController {
-
- @Resource
- public XxlJobInfoDao xxlJobInfoDao;
- @Resource
- public XxlJobGroupDao xxlJobGroupDao;
- @Resource
- private XxlJobRegistryDao xxlJobRegistryDao;
-
- @RequestMapping
- @PermissionLimit(adminuser = true)
- public String index(Model model) {
- return "jobgroup/jobgroup.index";
- }
-
- @RequestMapping("/pageList")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public Map pageList(HttpServletRequest request,
- @RequestParam(required = false, defaultValue = "0") int start,
- @RequestParam(required = false, defaultValue = "10") int length,
- String appname, String title) {
-
- // page query
- List list = xxlJobGroupDao.pageList(start, length, appname, title);
- int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title);
-
- // package result
- Map maps = new HashMap();
- maps.put("recordsTotal", list_count); // 总记录数
- maps.put("recordsFiltered", list_count); // 过滤后的总记录数
- maps.put("data", list); // 分页列表
- return maps;
- }
-
- @RequestMapping("/save")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT save(XxlJobGroup xxlJobGroup) {
-
- // valid
- if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) {
- return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName"));
- }
- if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length"));
- }
- if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) {
- return new ReturnT(500, "AppName" + I18nUtil.getString("system_unvalid"));
- }
- if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) {
- return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")));
- }
- if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_title") + I18nUtil.getString("system_unvalid"));
- }
- if (xxlJobGroup.getAddressType() != 0) {
- if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit"));
- }
- if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList") + I18nUtil.getString("system_unvalid"));
- }
-
- String[] addresss = xxlJobGroup.getAddressList().split(",");
- for (String item : addresss) {
- if (item == null || item.trim().length() == 0) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid"));
- }
- }
- }
-
- // process
- xxlJobGroup.setUpdateTime(new Date());
-
- int ret = xxlJobGroupDao.save(xxlJobGroup);
- return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL;
- }
-
- @RequestMapping("/update")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT update(XxlJobGroup xxlJobGroup) {
- // valid
- if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) {
- return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName"));
- }
- if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length"));
- }
- if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) {
- return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")));
- }
- if (xxlJobGroup.getAddressType() == 0) {
- // 0=自动注册
- List registryList = findRegistryByAppName(xxlJobGroup.getAppname());
- String addressListStr = null;
- if (registryList != null && !registryList.isEmpty()) {
- Collections.sort(registryList);
- addressListStr = "";
- for (String item : registryList) {
- addressListStr += item + ",";
- }
- addressListStr = addressListStr.substring(0, addressListStr.length() - 1);
- }
- xxlJobGroup.setAddressList(addressListStr);
- } else {
- // 1=手动录入
- if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit"));
- }
- String[] addresss = xxlJobGroup.getAddressList().split(",");
- for (String item : addresss) {
- if (item == null || item.trim().length() == 0) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid"));
- }
- }
- }
-
- // process
- xxlJobGroup.setUpdateTime(new Date());
-
- int ret = xxlJobGroupDao.update(xxlJobGroup);
- return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL;
- }
-
- private List findRegistryByAppName(String appnameParam) {
- HashMap> appAddressMap = new HashMap>();
- List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
- if (list != null) {
- for (XxlJobRegistry item : list) {
- if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
- String appname = item.getRegistryKey();
- List registryList = appAddressMap.get(appname);
- if (registryList == null) {
- registryList = new ArrayList();
- }
-
- if (!registryList.contains(item.getRegistryValue())) {
- registryList.add(item.getRegistryValue());
- }
- appAddressMap.put(appname, registryList);
- }
- }
- }
- return appAddressMap.get(appnameParam);
- }
-
- @RequestMapping("/remove")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT remove(int id) {
-
- // valid
- int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null);
- if (count > 0) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0"));
- }
-
- List allList = xxlJobGroupDao.findAll();
- if (allList.size() == 1) {
- return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1"));
- }
-
- int ret = xxlJobGroupDao.remove(id);
- return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL;
- }
-
- @RequestMapping("/loadById")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT loadById(int id) {
- XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
- return jobGroup != null ? new ReturnT(jobGroup) : new ReturnT(ReturnT.FAIL_CODE, null);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
deleted file mode 100644
index 157c60ba7..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.core.exception.XxlJobException;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobUser;
-import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
-import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;
-import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;
-import com.xxl.job.admin.core.thread.JobScheduleHelper;
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.XxlJobGroupDao;
-import com.xxl.job.admin.service.LoginService;
-import com.xxl.job.admin.service.XxlJobService;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
-import com.xxl.job.core.glue.GlueTypeEnum;
-import com.xxl.job.core.util.DateUtil;
-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;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-/**
- * index controller
- *
- * @author xuxueli 2015-12-19 16:13:16
- */
-@Controller
-@RequestMapping("/jobinfo")
-public class JobInfoController {
- private static Logger logger = LoggerFactory.getLogger(JobInfoController.class);
-
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
- @Resource
- private XxlJobService xxlJobService;
-
- @RequestMapping
- public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
-
- // 枚举-字典
- model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表
- model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典
- model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典
- model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values()); // 调度类型
- model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values()); // 调度过期策略
-
- // 执行器列表
- List jobGroupList_all = xxlJobGroupDao.findAll();
-
- // filter group
- List jobGroupList = filterJobGroupByRole(request, jobGroupList_all);
- if (jobGroupList == null || jobGroupList.size() == 0) {
- throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
- }
-
- model.addAttribute("JobGroupList", jobGroupList);
- model.addAttribute("jobGroup", jobGroup);
-
- return "jobinfo/jobinfo.index";
- }
-
- public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all) {
- List jobGroupList = new ArrayList<>();
- if (jobGroupList_all != null && jobGroupList_all.size() > 0) {
- XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
- if (loginUser.getRole() == 1) {
- jobGroupList = jobGroupList_all;
- } else {
- List groupIdStrs = new ArrayList<>();
- if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) {
- groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(","));
- }
- for (XxlJobGroup groupItem : jobGroupList_all) {
- if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) {
- jobGroupList.add(groupItem);
- }
- }
- }
- }
- return jobGroupList;
- }
-
- public static void validPermission(HttpServletRequest request, int jobGroup) {
- XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
- if (!loginUser.validPermission(jobGroup)) {
- throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username=" + loginUser.getUsername() + "]");
- }
- }
-
- @RequestMapping("/pageList")
- @ResponseBody
- public Map pageList(@RequestParam(required = false, defaultValue = "0") int start,
- @RequestParam(required = false, defaultValue = "10") int length,
- int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
-
- return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
- }
-
- @RequestMapping("/add")
- @ResponseBody
- public ReturnT add(XxlJobInfo jobInfo) {
- return xxlJobService.add(jobInfo);
- }
-
- @RequestMapping("/update")
- @ResponseBody
- public ReturnT update(XxlJobInfo jobInfo) {
- return xxlJobService.update(jobInfo);
- }
-
- @RequestMapping("/remove")
- @ResponseBody
- public ReturnT remove(int id) {
- return xxlJobService.remove(id);
- }
-
- @RequestMapping("/stop")
- @ResponseBody
- public ReturnT pause(int id) {
- return xxlJobService.stop(id);
- }
-
- @RequestMapping("/start")
- @ResponseBody
- public ReturnT start(int id) {
- return xxlJobService.start(id);
- }
-
- @RequestMapping("/trigger")
- @ResponseBody
- //@PermissionLimit(limit = false)
- public ReturnT triggerJob(int id, String executorParam, String addressList) {
- // force cover job param
- if (executorParam == null) {
- executorParam = "";
- }
-
- JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList);
- return ReturnT.SUCCESS;
- }
-
- @RequestMapping("/nextTriggerTime")
- @ResponseBody
- public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) {
-
- XxlJobInfo paramXxlJobInfo = new XxlJobInfo();
- paramXxlJobInfo.setScheduleType(scheduleType);
- paramXxlJobInfo.setScheduleConf(scheduleConf);
-
- List result = new ArrayList<>();
- try {
- Date lastTime = new Date();
- for (int i = 0; i < 5; i++) {
- lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime);
- if (lastTime != null) {
- result.add(DateUtil.formatDateTime(lastTime));
- } else {
- break;
- }
- }
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")) + e.getMessage());
- }
- return new ReturnT>(result);
-
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
deleted file mode 100644
index e741c174b..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.core.exception.XxlJobException;
-import com.xxl.job.admin.core.complete.XxlJobCompleter;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.XxlJobGroupDao;
-import com.xxl.job.admin.dao.XxlJobInfoDao;
-import com.xxl.job.admin.dao.XxlJobLogDao;
-import com.xxl.job.core.biz.ExecutorBiz;
-import com.xxl.job.core.biz.model.KillParam;
-import com.xxl.job.core.biz.model.LogParam;
-import com.xxl.job.core.biz.model.LogResult;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.util.DateUtil;
-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;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * index controller
- *
- * @author xuxueli 2015-12-19 16:13:16
- */
-@Controller
-@RequestMapping("/joblog")
-public class JobLogController {
- private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
-
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
- @Resource
- public XxlJobInfoDao xxlJobInfoDao;
- @Resource
- public XxlJobLogDao xxlJobLogDao;
-
- @RequestMapping
- public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
-
- // 执行器列表
- List jobGroupList_all = xxlJobGroupDao.findAll();
-
- // filter group
- List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);
- if (jobGroupList == null || jobGroupList.size() == 0) {
- throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
- }
-
- model.addAttribute("JobGroupList", jobGroupList);
-
- // 任务
- if (jobId > 0) {
- XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
- if (jobInfo == null) {
- throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid"));
- }
-
- model.addAttribute("jobInfo", jobInfo);
-
- // valid permission
- JobInfoController.validPermission(request, jobInfo.getJobGroup());
- }
-
- return "joblog/joblog.index";
- }
-
- @RequestMapping("/getJobsByGroup")
- @ResponseBody
- public ReturnT> getJobsByGroup(int jobGroup) {
- List list = xxlJobInfoDao.getJobsByGroup(jobGroup);
- return new ReturnT>(list);
- }
-
- @RequestMapping("/pageList")
- @ResponseBody
- public Map pageList(HttpServletRequest request,
- @RequestParam(required = false, defaultValue = "0") int start,
- @RequestParam(required = false, defaultValue = "10") int length,
- int jobGroup, int jobId, int logStatus, String filterTime) {
-
- // valid permission
- JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup
-
- // parse param
- Date triggerTimeStart = null;
- Date triggerTimeEnd = null;
- if (filterTime != null && filterTime.trim().length() > 0) {
- String[] temp = filterTime.split(" - ");
- if (temp.length == 2) {
- triggerTimeStart = DateUtil.parseDateTime(temp[0]);
- triggerTimeEnd = DateUtil.parseDateTime(temp[1]);
- }
- }
-
- // page query
- List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
- int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
-
- // package result
- Map maps = new HashMap();
- maps.put("recordsTotal", list_count); // 总记录数
- maps.put("recordsFiltered", list_count); // 过滤后的总记录数
- maps.put("data", list); // 分页列表
- return maps;
- }
-
- @RequestMapping("/logDetailPage")
- public String logDetailPage(int id, Model model) {
-
- // base check
- ReturnT logStatue = ReturnT.SUCCESS;
- XxlJobLog jobLog = xxlJobLogDao.load(id);
- if (jobLog == null) {
- throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid"));
- }
-
- model.addAttribute("triggerCode", jobLog.getTriggerCode());
- model.addAttribute("handleCode", jobLog.getHandleCode());
- model.addAttribute("logId", jobLog.getId());
- return "joblog/joblog.detail";
- }
-
- @RequestMapping("/logDetailCat")
- @ResponseBody
- public ReturnT logDetailCat(long logId, int fromLineNum) {
- try {
- // valid
- XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve performance
- if (jobLog == null) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid"));
- }
-
- // log cat
- ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress());
- ReturnT logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum));
-
- // is end
- if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
- if (jobLog.getHandleCode() > 0) {
- logResult.getContent().setEnd(true);
- }
- }
-
- return logResult;
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
- }
- }
-
- @RequestMapping("/logKill")
- @ResponseBody
- public ReturnT logKill(int id) {
- // base check
- XxlJobLog log = xxlJobLogDao.load(id);
- XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
- if (jobInfo == null) {
- return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
- }
- if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
- return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit"));
- }
-
- // request of kill
- ReturnT runResult = null;
- try {
- ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
- runResult = executorBiz.kill(new KillParam(jobInfo.getId()));
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- runResult = new ReturnT(500, e.getMessage());
- }
-
- if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
- log.setHandleCode(ReturnT.FAIL_CODE);
- log.setHandleMsg(I18nUtil.getString("joblog_kill_log_byman") + ":" + (runResult.getMsg() != null ? runResult.getMsg() : ""));
- log.setHandleTime(new Date());
- XxlJobCompleter.updateHandleInfoAndFinish(log);
- return new ReturnT(runResult.getMsg());
- } else {
- return new ReturnT(500, runResult.getMsg());
- }
- }
-
- @RequestMapping("/clearLog")
- @ResponseBody
- public ReturnT clearLog(int jobGroup, int jobId, int type) {
-
- Date clearBeforeTime = null;
- int clearBeforeNum = 0;
- if (type == 1) {
- clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据
- } else if (type == 2) {
- clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据
- } else if (type == 3) {
- clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据
- } else if (type == 4) {
- clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据
- } else if (type == 5) {
- clearBeforeNum = 1000; // 清理一千条以前日志数据
- } else if (type == 6) {
- clearBeforeNum = 10000; // 清理一万条以前日志数据
- } else if (type == 7) {
- clearBeforeNum = 30000; // 清理三万条以前日志数据
- } else if (type == 8) {
- clearBeforeNum = 100000; // 清理十万条以前日志数据
- } else if (type == 9) {
- clearBeforeNum = 0; // 清理所有日志数据
- } else {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
- }
-
- List logIds = null;
- do {
- logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);
- if (logIds != null && logIds.size() > 0) {
- xxlJobLogDao.clearLog(logIds);
- }
- } while (logIds != null && logIds.size() > 0);
-
- return ReturnT.SUCCESS;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
deleted file mode 100644
index 878998d39..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.xxl.job.admin.controller;
-
-import com.xxl.job.admin.controller.annotation.PermissionLimit;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobUser;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.XxlJobGroupDao;
-import com.xxl.job.admin.dao.XxlJobUserDao;
-import com.xxl.job.admin.service.LoginService;
-import com.xxl.job.core.biz.model.ReturnT;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.util.DigestUtils;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author xuxueli 2019-05-04 16:39:50
- */
-@Controller
-@RequestMapping("/user")
-public class UserController {
-
- @Resource
- private XxlJobUserDao xxlJobUserDao;
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
-
- @RequestMapping
- @PermissionLimit(adminuser = true)
- public String index(Model model) {
-
- // 执行器列表
- List groupList = xxlJobGroupDao.findAll();
- model.addAttribute("groupList", groupList);
-
- return "user/user.index";
- }
-
- @RequestMapping("/pageList")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public Map pageList(@RequestParam(required = false, defaultValue = "0") int start,
- @RequestParam(required = false, defaultValue = "10") int length,
- String username, int role) {
-
- // page list
- List list = xxlJobUserDao.pageList(start, length, username, role);
- int list_count = xxlJobUserDao.pageListCount(start, length, username, role);
-
- // filter
- if (list != null && list.size() > 0) {
- for (XxlJobUser item : list) {
- item.setPassword(null);
- }
- }
-
- // package result
- Map maps = new HashMap();
- maps.put("recordsTotal", list_count); // 总记录数
- maps.put("recordsFiltered", list_count); // 过滤后的总记录数
- maps.put("data", list); // 分页列表
- return maps;
- }
-
- @RequestMapping("/add")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT add(XxlJobUser xxlJobUser) {
-
- // valid username
- if (!StringUtils.hasText(xxlJobUser.getUsername())) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_username"));
- }
- xxlJobUser.setUsername(xxlJobUser.getUsername().trim());
- if (!(xxlJobUser.getUsername().length() >= 4 && xxlJobUser.getUsername().length() <= 20)) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]");
- }
- // valid password
- if (!StringUtils.hasText(xxlJobUser.getPassword())) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_password"));
- }
- xxlJobUser.setPassword(xxlJobUser.getPassword().trim());
- if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]");
- }
- // md5 password
- xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes()));
-
- // check repeat
- XxlJobUser existUser = xxlJobUserDao.loadByUserName(xxlJobUser.getUsername());
- if (existUser != null) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat"));
- }
-
- // write
- xxlJobUserDao.save(xxlJobUser);
- return ReturnT.SUCCESS;
- }
-
- @RequestMapping("/update")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT update(HttpServletRequest request, XxlJobUser xxlJobUser) {
-
- // avoid opt login seft
- XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
- if (loginUser.getUsername().equals(xxlJobUser.getUsername())) {
- return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit"));
- }
-
- // valid password
- if (StringUtils.hasText(xxlJobUser.getPassword())) {
- xxlJobUser.setPassword(xxlJobUser.getPassword().trim());
- if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]");
- }
- // md5 password
- xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes()));
- } else {
- xxlJobUser.setPassword(null);
- }
-
- // write
- xxlJobUserDao.update(xxlJobUser);
- return ReturnT.SUCCESS;
- }
-
- @RequestMapping("/remove")
- @ResponseBody
- @PermissionLimit(adminuser = true)
- public ReturnT remove(HttpServletRequest request, int id) {
-
- // avoid opt login seft
- XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
- if (loginUser.getId() == id) {
- return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit"));
- }
-
- xxlJobUserDao.delete(id);
- return ReturnT.SUCCESS;
- }
-
- @RequestMapping("/updatePwd")
- @ResponseBody
- public ReturnT updatePwd(HttpServletRequest request, String password) {
-
- // valid password
- if (password == null || password.trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL.getCode(), "密码不可为空");
- }
- password = password.trim();
- if (!(password.length() >= 4 && password.length() <= 20)) {
- return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]");
- }
-
- // md5 password
- String md5Password = DigestUtils.md5DigestAsHex(password.getBytes());
-
- // update pwd
- XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
-
- // do write
- XxlJobUser existUser = xxlJobUserDao.loadByUserName(loginUser.getUsername());
- existUser.setPassword(md5Password);
- xxlJobUserDao.update(existUser);
-
- return ReturnT.SUCCESS;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java
deleted file mode 100644
index 054d6ef55..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.xxl.job.admin.controller.annotation;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 权限限制
- *
- * @author xuxueli 2015-12-12 18:29:02
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface PermissionLimit {
-
- /**
- * 登录拦截 (默认拦截)
- */
- boolean limit() default true;
-
- /**
- * 要求管理员权限
- *
- * @return
- */
- boolean adminuser() default false;
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java
deleted file mode 100644
index 228384996..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.xxl.job.admin.controller.interceptor;
-
-import com.xxl.job.admin.core.util.FtlUtil;
-import com.xxl.job.admin.core.util.I18nUtil;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.AsyncHandlerInterceptor;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-
-/**
- * push cookies to model as cookieMap
- *
- * @author xuxueli 2015-12-12 18:09:04
- */
-@Component
-public class CookieInterceptor implements AsyncHandlerInterceptor {
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
-
- // cookie
- if (modelAndView != null && request.getCookies() != null && request.getCookies().length > 0) {
- HashMap cookieMap = new HashMap();
- for (Cookie ck : request.getCookies()) {
- cookieMap.put(ck.getName(), ck);
- }
- modelAndView.addObject("cookieMap", cookieMap);
- }
-
- // static method
- if (modelAndView != null) {
- modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName()));
- }
-
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java
deleted file mode 100644
index 13e53b2f1..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.xxl.job.admin.controller.interceptor;
-
-import com.xxl.job.admin.controller.annotation.PermissionLimit;
-import com.xxl.job.admin.core.model.XxlJobUser;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.service.LoginService;
-import org.springframework.stereotype.Component;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.AsyncHandlerInterceptor;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * 权限拦截
- *
- * @author xuxueli 2015-12-12 18:09:04
- */
-@Component
-public class PermissionInterceptor implements AsyncHandlerInterceptor {
-
- @Resource
- private LoginService loginService;
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-
- if (!(handler instanceof HandlerMethod)) {
- return true; // proceed with the next interceptor
- }
-
- // if need login
- boolean needLogin = true;
- boolean needAdminuser = false;
- HandlerMethod method = (HandlerMethod) handler;
- PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);
- if (permission != null) {
- needLogin = permission.limit();
- needAdminuser = permission.adminuser();
- }
-
- if (needLogin) {
- XxlJobUser loginUser = loginService.ifLogin(request, response);
- if (loginUser == null) {
- response.setStatus(302);
- response.setHeader("location", request.getContextPath() + "/toLogin");
- return false;
- }
- if (needAdminuser && loginUser.getRole() != 1) {
- throw new RuntimeException(I18nUtil.getString("system_permission_limit"));
- }
- request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);
- }
-
- return true; // proceed with the next interceptor
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java
deleted file mode 100644
index 7bacf3080..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.xxl.job.admin.controller.interceptor;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import javax.annotation.Resource;
-
-/**
- * web mvc config
- *
- * @author xuxueli 2018-04-02 20:48:20
- */
-@Configuration
-public class WebMvcConfig implements WebMvcConfigurer {
-
- @Resource
- private PermissionInterceptor permissionInterceptor;
- @Resource
- private CookieInterceptor cookieInterceptor;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
- registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java
deleted file mode 100644
index d7cc0db5e..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.xxl.job.admin.controller.resolver;
-
-import com.xxl.job.admin.core.exception.XxlJobException;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.admin.core.util.JacksonUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.HandlerExceptionResolver;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * common exception resolver
- *
- * @author xuxueli 2016-1-6 19:22:18
- */
-@Component
-public class WebExceptionResolver implements HandlerExceptionResolver {
- private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);
-
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex) {
-
- if (!(ex instanceof XxlJobException)) {
- logger.error("WebExceptionResolver:{}", ex);
- }
-
- // if json
- boolean isJson = false;
- if (handler instanceof HandlerMethod) {
- HandlerMethod method = (HandlerMethod) handler;
- ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
- if (responseBody != null) {
- isJson = true;
- }
- }
-
- // error result
- ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n", " "));
-
- // response
- ModelAndView mv = new ModelAndView();
- if (isJson) {
- try {
- response.setContentType("application/json;charset=utf-8");
- response.getWriter().print(JacksonUtil.writeValueAsString(errorResult));
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- return mv;
- } else {
-
- mv.addObject("exceptionMsg", errorResult.getMsg());
- mv.setViewName("/common/common.exception");
- return mv;
- }
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java
deleted file mode 100644
index 4165ff3a0..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.xxl.job.admin.core.alarm;
-
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-
-/**
- * @author xuxueli 2020-01-19
- */
-public interface JobAlarm {
-
- /**
- * job alarm
- *
- * @param info
- * @param jobLog
- * @return
- */
- public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java
deleted file mode 100644
index 62dac9d27..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.xxl.job.admin.core.alarm;
-
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-@Component
-public class JobAlarmer implements ApplicationContextAware, InitializingBean {
- private static Logger logger = LoggerFactory.getLogger(JobAlarmer.class);
-
- private ApplicationContext applicationContext;
- private List jobAlarmList;
-
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = applicationContext;
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- Map serviceBeanMap = applicationContext.getBeansOfType(JobAlarm.class);
- if (serviceBeanMap != null && serviceBeanMap.size() > 0) {
- jobAlarmList = new ArrayList(serviceBeanMap.values());
- }
- }
-
- /**
- * job alarm
- *
- * @param info
- * @param jobLog
- * @return
- */
- public boolean alarm(XxlJobInfo info, XxlJobLog jobLog) {
-
- boolean result = false;
- if (jobAlarmList != null && jobAlarmList.size() > 0) {
- result = true; // success means all-success
- for (JobAlarm alarm : jobAlarmList) {
- boolean resultItem = false;
- try {
- resultItem = alarm.doAlarm(info, jobLog);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- if (!resultItem) {
- result = false;
- }
- }
- }
-
- return result;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
deleted file mode 100644
index 6ad1c0b1c..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.xxl.job.admin.core.alarm.impl;
-
-import com.xxl.job.admin.core.alarm.JobAlarm;
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.model.ReturnT;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.mail.javamail.MimeMessageHelper;
-import org.springframework.stereotype.Component;
-
-import javax.mail.internet.MimeMessage;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * job alarm by email
- *
- * @author xuxueli 2020-01-19
- */
-@Component
-public class EmailJobAlarm implements JobAlarm {
- private static Logger logger = LoggerFactory.getLogger(EmailJobAlarm.class);
-
- /**
- * fail alarm
- *
- * @param jobLog
- */
- @Override
- public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {
- boolean alarmResult = true;
-
- // send monitor email
- if (info != null && info.getAlarmEmail() != null && info.getAlarmEmail().trim().length() > 0) {
-
- // alarmContent
- String alarmContent = "Alarm Job LogId=" + jobLog.getId();
- if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
- alarmContent += " TriggerMsg= " + jobLog.getTriggerMsg();
- }
- if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
- alarmContent += " HandleCode=" + jobLog.getHandleMsg();
- }
-
- // email info
- XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));
- String personal = I18nUtil.getString("admin_name_full");
- String title = I18nUtil.getString("jobconf_monitor");
- String content = MessageFormat.format(loadEmailJobAlarmTemplate(),
- group != null ? group.getTitle() : "null",
- info.getId(),
- info.getJobDesc(),
- alarmContent);
-
- Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(",")));
- for (String email : emailSet) {
-
- // make mail
- try {
- MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();
-
- MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
- helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailFrom(), personal);
- helper.setTo(email);
- helper.setSubject(title);
- helper.setText(content, true);
-
- XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage);
- } catch (Exception e) {
- logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e);
-
- alarmResult = false;
- }
-
- }
- }
-
- return alarmResult;
- }
-
- /**
- * load email job alarm template
- *
- * @return
- */
- private static final String loadEmailJobAlarmTemplate() {
- String mailBodyTemplate = "" + I18nUtil.getString("jobconf_monitor_detail") + ":" +
- " \n" +
- " " +
- " \n" +
- " " + I18nUtil.getString("jobinfo_field_jobgroup") + " \n" +
- " " + I18nUtil.getString("jobinfo_field_id") + " \n" +
- " " + I18nUtil.getString("jobinfo_field_jobdesc") + " \n" +
- " " + I18nUtil.getString("jobconf_monitor_alarm_title") + " \n" +
- " " + I18nUtil.getString("jobconf_monitor_alarm_content") + " \n" +
- " \n" +
- " \n" +
- " \n" +
- " \n" +
- " {0} \n" +
- " {1} \n" +
- " {2} \n" +
- " " + I18nUtil.getString("jobconf_monitor_alarm_type") + " \n" +
- " {3} \n" +
- " \n" +
- " \n" +
- "
";
-
- return mailBodyTemplate;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java
deleted file mode 100644
index 83399336b..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.xxl.job.admin.core.complete;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.context.XxlJobContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.MessageFormat;
-
-/**
- * @author xuxueli 2020-10-30 20:43:10
- */
-public class XxlJobCompleter {
- private static Logger logger = LoggerFactory.getLogger(XxlJobCompleter.class);
-
- /**
- * common fresh handle entrance (limit only once)
- *
- * @param xxlJobLog
- * @return
- */
- public static int updateHandleInfoAndFinish(XxlJobLog xxlJobLog) {
-
- // finish
- finishJob(xxlJobLog);
-
- // text最大64kb 避免长度过长
- if (xxlJobLog.getHandleMsg().length() > 15000) {
- xxlJobLog.setHandleMsg(xxlJobLog.getHandleMsg().substring(0, 15000));
- }
-
- // fresh handle
- return XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(xxlJobLog);
- }
-
-
- /**
- * do somethind to finish job
- */
- private static void finishJob(XxlJobLog xxlJobLog) {
-
- // 1、handle success, to trigger child job
- String triggerChildMsg = null;
- if (XxlJobContext.HANDLE_CODE_SUCCESS == xxlJobLog.getHandleCode()) {
- XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(xxlJobLog.getJobId());
- if (xxlJobInfo != null && xxlJobInfo.getChildJobId() != null && xxlJobInfo.getChildJobId().trim().length() > 0) {
- triggerChildMsg = " >>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_child_run") + "<<<<<<<<<<< ";
-
- String[] childJobIds = xxlJobInfo.getChildJobId().split(",");
- for (int i = 0; i < childJobIds.length; i++) {
- int childJobId = (childJobIds[i] != null && childJobIds[i].trim().length() > 0 && isNumeric(childJobIds[i])) ? Integer.valueOf(childJobIds[i]) : -1;
- if (childJobId > 0) {
-
- JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null);
- ReturnT triggerChildResult = ReturnT.SUCCESS;
-
- // add msg
- triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
- (i + 1),
- childJobIds.length,
- childJobIds[i],
- (triggerChildResult.getCode() == ReturnT.SUCCESS_CODE ? I18nUtil.getString("system_success") : I18nUtil.getString("system_fail")),
- triggerChildResult.getMsg());
- } else {
- triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg2"),
- (i + 1),
- childJobIds.length,
- childJobIds[i]);
- }
- }
-
- }
- }
-
- if (triggerChildMsg != null) {
- xxlJobLog.setHandleMsg(xxlJobLog.getHandleMsg() + triggerChildMsg);
- }
-
- // 2、fix_delay trigger next
- // on the way
-
- }
-
- private static boolean isNumeric(String str) {
- try {
- int result = Integer.valueOf(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
deleted file mode 100644
index 6e40cb760..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package com.xxl.job.admin.core.conf;
-
-import com.xxl.job.admin.core.alarm.JobAlarmer;
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
-import com.xxl.job.admin.dao.*;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import javax.sql.DataSource;
-import java.util.Arrays;
-
-/**
- * xxl-job config
- *
- * @author xuxueli 2017-04-28
- */
-
-@Component
-public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
-
- private static XxlJobAdminConfig adminConfig = null;
-
- public static XxlJobAdminConfig getAdminConfig() {
- return adminConfig;
- }
-
-
- // ---------------------- XxlJobScheduler ----------------------
-
- private XxlJobScheduler xxlJobScheduler;
-
- @Override
- public void afterPropertiesSet() throws Exception {
- adminConfig = this;
-
- xxlJobScheduler = new XxlJobScheduler();
- xxlJobScheduler.init();
- }
-
- @Override
- public void destroy() throws Exception {
- xxlJobScheduler.destroy();
- }
-
-
- // ---------------------- XxlJobScheduler ----------------------
-
- // conf
- @Value("${xxl.job.i18n}")
- private String i18n;
-
- @Value("${xxl.job.accessToken}")
- private String accessToken;
-
- @Value("${spring.mail.from}")
- private String emailFrom;
-
- @Value("${xxl.job.triggerpool.fast.max}")
- private int triggerPoolFastMax;
-
- @Value("${xxl.job.triggerpool.slow.max}")
- private int triggerPoolSlowMax;
-
- @Value("${xxl.job.logretentiondays}")
- private int logretentiondays;
-
- // dao, service
-
- @Resource
- private XxlJobLogDao xxlJobLogDao;
- @Resource
- private XxlJobInfoDao xxlJobInfoDao;
- @Resource
- private XxlJobRegistryDao xxlJobRegistryDao;
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
- @Resource
- private XxlJobLogReportDao xxlJobLogReportDao;
- @Resource
- private JavaMailSender mailSender;
- @Resource
- private DataSource dataSource;
- @Resource
- private JobAlarmer jobAlarmer;
-
-
- public String getI18n() {
- if (!Arrays.asList("zh_CN", "zh_TC", "en").contains(i18n)) {
- return "zh_CN";
- }
- return i18n;
- }
-
- public String getAccessToken() {
- return accessToken;
- }
-
- public String getEmailFrom() {
- return emailFrom;
- }
-
- public int getTriggerPoolFastMax() {
- if (triggerPoolFastMax < 200) {
- return 200;
- }
- return triggerPoolFastMax;
- }
-
- public int getTriggerPoolSlowMax() {
- if (triggerPoolSlowMax < 100) {
- return 100;
- }
- return triggerPoolSlowMax;
- }
-
- public int getLogretentiondays() {
- if (logretentiondays < 7) {
- return -1; // Limit greater than or equal to 7, otherwise close
- }
- return logretentiondays;
- }
-
- public XxlJobLogDao getXxlJobLogDao() {
- return xxlJobLogDao;
- }
-
- public XxlJobInfoDao getXxlJobInfoDao() {
- return xxlJobInfoDao;
- }
-
- public XxlJobRegistryDao getXxlJobRegistryDao() {
- return xxlJobRegistryDao;
- }
-
- public XxlJobGroupDao getXxlJobGroupDao() {
- return xxlJobGroupDao;
- }
-
- public XxlJobLogReportDao getXxlJobLogReportDao() {
- return xxlJobLogReportDao;
- }
-
- public JavaMailSender getMailSender() {
- return mailSender;
- }
-
- public DataSource getDataSource() {
- return dataSource;
- }
-
- public JobAlarmer getJobAlarmer() {
- return jobAlarmer;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java
deleted file mode 100644
index 1530119a9..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java
+++ /dev/null
@@ -1,1679 +0,0 @@
-/*
- * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package com.xxl.job.admin.core.cron;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
-import java.util.TreeSet;
-
-/**
- * Provides a parser and evaluator for unix-like cron expressions. Cron
- * expressions provide the ability to specify complex time combinations such as
- * "At 8:00am every Monday through Friday" or "At 1:30am every
- * last Friday of the month".
- *
- * Cron expressions are comprised of 6 required fields and one optional field
- * separated by white space. The fields respectively are described as follows:
- *
- *
- *
- * Field Name
- *
- * Allowed Values
- *
- * Allowed Special Characters
- *
- *
- * Seconds
- *
- * 0-59
- *
- * , - * /
- *
- *
- * Minutes
- *
- * 0-59
- *
- * , - * /
- *
- *
- * Hours
- *
- * 0-23
- *
- * , - * /
- *
- *
- * Day-of-month
- *
- * 1-31
- *
- * , - * ? / L W
- *
- *
- * Month
- *
- * 0-11 or JAN-DEC
- *
- * , - * /
- *
- *
- * Day-of-Week
- *
- * 1-7 or SUN-SAT
- *
- * , - * ? / L #
- *
- *
- * Year (Optional)
- *
- * empty, 1970-2199
- *
- * , - * /
- *
- *
- *
- * The '*' character is used to specify all values. For example, "*"
- * in the minute field means "every minute".
- *
- * The '?' character is allowed for the day-of-month and day-of-week fields. It
- * is used to specify 'no specific value'. This is useful when you need to
- * specify something in one of the two fields, but not the other.
- *
- * The '-' character is used to specify ranges For example "10-12" in
- * the hour field means "the hours 10, 11 and 12".
- *
- * The ',' character is used to specify additional values. For example
- * "MON,WED,FRI" in the day-of-week field means "the days Monday,
- * Wednesday, and Friday".
- *
- * The '/' character is used to specify increments. For example "0/15"
- * in the seconds field means "the seconds 0, 15, 30, and 45". And
- * "5/15" in the seconds field means "the seconds 5, 20, 35, and
- * 50". Specifying '*' before the '/' is equivalent to specifying 0 is
- * the value to start with. Essentially, for each field in the expression, there
- * is a set of numbers that can be turned on or off. For seconds and minutes,
- * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to
- * 31, and for months 0 to 11 (JAN to DEC). The "/" character simply helps you turn
- * on every "nth" value in the given set. Thus "7/6" in the
- * month field only turns on month "7", it does NOT mean every 6th
- * month, please note that subtlety.
- *
- * The 'L' character is allowed for the day-of-month and day-of-week fields.
- * This character is short-hand for "last", but it has different
- * meaning in each of the two fields. For example, the value "L" in
- * the day-of-month field means "the last day of the month" - day 31
- * for January, day 28 for February on non-leap years. If used in the
- * day-of-week field by itself, it simply means "7" or
- * "SAT". But if used in the day-of-week field after another value, it
- * means "the last xxx day of the month" - for example "6L"
- * means "the last friday of the month". You can also specify an offset
- * from the last day of the month, such as "L-3" which would mean the third-to-last
- * day of the calendar month. When using the 'L' option, it is important not to
- * specify lists, or ranges of values, as you'll get confusing/unexpected results.
- *
- * The 'W' character is allowed for the day-of-month field. This character
- * is used to specify the weekday (Monday-Friday) nearest the given day. As an
- * example, if you were to specify "15W" as the value for the
- * day-of-month field, the meaning is: "the nearest weekday to the 15th of
- * the month". So if the 15th is a Saturday, the trigger will fire on
- * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the
- * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th.
- * However if you specify "1W" as the value for day-of-month, and the
- * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not
- * 'jump' over the boundary of a month's days. The 'W' character can only be
- * specified when the day-of-month is a single day, not a range or list of days.
- *
- * The 'L' and 'W' characters can also be combined for the day-of-month
- * expression to yield 'LW', which translates to "last weekday of the
- * month".
- *
- * The '#' character is allowed for the day-of-week field. This character is
- * used to specify "the nth" XXX day of the month. For example, the
- * value of "6#3" in the day-of-week field means the third Friday of
- * the month (day 6 = Friday and "#3" = the 3rd one in the month).
- * Other examples: "2#1" = the first Monday of the month and
- * "4#5" = the fifth Wednesday of the month. Note that if you specify
- * "#5" and there is not 5 of the given day-of-week in the month, then
- * no firing will occur that month. If the '#' character is used, there can
- * only be one expression in the day-of-week field ("3#1,6#3" is
- * not valid, since there are two expressions).
- *
- *
- *
- * The legal characters and the names of months and days of the week are not
- * case sensitive.
- *
- *
- * NOTES:
- *
- * Support for specifying both a day-of-week and a day-of-month value is
- * not complete (you'll need to use the '?' character in one of these fields).
- *
- * Overflowing ranges is supported - that is, having a larger number on
- * the left hand side than the right. You might do 22-2 to catch 10 o'clock
- * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is
- * very important to note that overuse of overflowing ranges creates ranges
- * that don't make sense and no effort has been made to determine which
- * interpretation CronExpression chooses. An example would be
- * "0 0 14-6 ? * FRI-MON".
- *
- *
- *
- * @author Sharada Jambula, James House
- * @author Contributions from Mads Henderson
- * @author Refactoring from CronTrigger to CronExpression by Aaron Craven
- *
- * Borrowed from quartz v2.3.1
- */
-public final class CronExpression implements Serializable, Cloneable {
-
- @Serial
- private static final long serialVersionUID = 12423409423L;
-
- protected static final int SECOND = 0;
- protected static final int MINUTE = 1;
- protected static final int HOUR = 2;
- protected static final int DAY_OF_MONTH = 3;
- protected static final int MONTH = 4;
- protected static final int DAY_OF_WEEK = 5;
- protected static final int YEAR = 6;
- protected static final int ALL_SPEC_INT = 99; // '*'
- protected static final int NO_SPEC_INT = 98; // '?'
- protected static final Integer ALL_SPEC = ALL_SPEC_INT;
- protected static final Integer NO_SPEC = NO_SPEC_INT;
-
- protected static final Map monthMap = new HashMap(20);
- protected static final Map dayMap = new HashMap(60);
-
- static {
- monthMap.put("JAN", 0);
- monthMap.put("FEB", 1);
- monthMap.put("MAR", 2);
- monthMap.put("APR", 3);
- monthMap.put("MAY", 4);
- monthMap.put("JUN", 5);
- monthMap.put("JUL", 6);
- monthMap.put("AUG", 7);
- monthMap.put("SEP", 8);
- monthMap.put("OCT", 9);
- monthMap.put("NOV", 10);
- monthMap.put("DEC", 11);
-
- dayMap.put("SUN", 1);
- dayMap.put("MON", 2);
- dayMap.put("TUE", 3);
- dayMap.put("WED", 4);
- dayMap.put("THU", 5);
- dayMap.put("FRI", 6);
- dayMap.put("SAT", 7);
- }
-
- private final String cronExpression;
- private TimeZone timeZone = null;
- protected transient TreeSet seconds;
- protected transient TreeSet minutes;
- protected transient TreeSet hours;
- protected transient TreeSet daysOfMonth;
- protected transient TreeSet months;
- protected transient TreeSet daysOfWeek;
- protected transient TreeSet years;
-
- protected transient boolean lastdayOfWeek = false;
- protected transient int nthdayOfWeek = 0;
- protected transient boolean lastdayOfMonth = false;
- protected transient boolean nearestWeekday = false;
- protected transient int lastdayOffset = 0;
- protected transient boolean expressionParsed = false;
-
- public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100;
-
- /**
- * Constructs a new CronExpression
based on the specified
- * parameter.
- *
- * @param cronExpression String representation of the cron expression the
- * new object should represent
- * @throws ParseException if the string expression cannot be parsed into a valid
- * CronExpression
- */
- public CronExpression(String cronExpression) throws ParseException {
- if (cronExpression == null) {
- throw new IllegalArgumentException("cronExpression cannot be null");
- }
-
- this.cronExpression = cronExpression.toUpperCase(Locale.US);
-
- buildExpression(this.cronExpression);
- }
-
- /**
- * Constructs a new {@code CronExpression} as a copy of an existing
- * instance.
- *
- * @param expression The existing cron expression to be copied
- */
- public CronExpression(CronExpression expression) {
- /*
- * We don't call the other constructor here since we need to swallow the
- * ParseException. We also elide some of the sanity checking as it is
- * not logically trippable.
- */
- this.cronExpression = expression.getCronExpression();
- try {
- buildExpression(cronExpression);
- } catch (ParseException ex) {
- throw new AssertionError();
- }
- if (expression.getTimeZone() != null) {
- setTimeZone((TimeZone) expression.getTimeZone().clone());
- }
- }
-
- /**
- * Indicates whether the given date satisfies the cron expression. Note that
- * milliseconds are ignored, so two Dates falling on different milliseconds
- * of the same second will always have the same result here.
- *
- * @param date the date to evaluate
- * @return a boolean indicating whether the given date satisfies the cron
- * expression
- */
- public boolean isSatisfiedBy(Date date) {
- Calendar testDateCal = Calendar.getInstance(getTimeZone());
- testDateCal.setTime(date);
- testDateCal.set(Calendar.MILLISECOND, 0);
- Date originalDate = testDateCal.getTime();
-
- testDateCal.add(Calendar.SECOND, -1);
-
- Date timeAfter = getTimeAfter(testDateCal.getTime());
-
- return ((timeAfter != null) && (timeAfter.equals(originalDate)));
- }
-
- /**
- * Returns the next date/time after the given date/time which
- * satisfies the cron expression.
- *
- * @param date the date/time at which to begin the search for the next valid
- * date/time
- * @return the next valid date/time
- */
- public Date getNextValidTimeAfter(Date date) {
- return getTimeAfter(date);
- }
-
- /**
- * Returns the next date/time after the given date/time which does
- * not satisfy the expression
- *
- * @param date the date/time at which to begin the search for the next
- * invalid date/time
- * @return the next valid date/time
- */
- public Date getNextInvalidTimeAfter(Date date) {
- long difference = 1000;
-
- //move back to the nearest second so differences will be accurate
- Calendar adjustCal = Calendar.getInstance(getTimeZone());
- adjustCal.setTime(date);
- adjustCal.set(Calendar.MILLISECOND, 0);
- Date lastDate = adjustCal.getTime();
-
- Date newDate;
-
- //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution.
-
- //keep getting the next included time until it's farther than one second
- // apart. At that point, lastDate is the last valid fire time. We return
- // the second immediately following it.
- while (difference == 1000) {
- newDate = getTimeAfter(lastDate);
- if (newDate == null)
- break;
-
- difference = newDate.getTime() - lastDate.getTime();
-
- if (difference == 1000) {
- lastDate = newDate;
- }
- }
-
- return new Date(lastDate.getTime() + 1000);
- }
-
- /**
- * Returns the time zone for which this CronExpression
- * will be resolved.
- */
- public TimeZone getTimeZone() {
- if (timeZone == null) {
- timeZone = TimeZone.getDefault();
- }
-
- return timeZone;
- }
-
- /**
- * Sets the time zone for which this CronExpression
- * will be resolved.
- */
- public void setTimeZone(TimeZone timeZone) {
- this.timeZone = timeZone;
- }
-
- /**
- * Returns the string representation of the CronExpression
- *
- * @return a string representation of the CronExpression
- */
- @Override
- public String toString() {
- return cronExpression;
- }
-
- /**
- * Indicates whether the specified cron expression can be parsed into a
- * valid cron expression
- *
- * @param cronExpression the expression to evaluate
- * @return a boolean indicating whether the given expression is a valid cron
- * expression
- */
- public static boolean isValidExpression(String cronExpression) {
-
- try {
- new CronExpression(cronExpression);
- } catch (ParseException pe) {
- return false;
- }
-
- return true;
- }
-
- public static void validateExpression(String cronExpression) throws ParseException {
-
- new CronExpression(cronExpression);
- }
-
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Expression Parsing Functions
- //
- ////////////////////////////////////////////////////////////////////////////
-
- protected void buildExpression(String expression) throws ParseException {
- expressionParsed = true;
-
- try {
-
- if (seconds == null) {
- seconds = new TreeSet();
- }
- if (minutes == null) {
- minutes = new TreeSet();
- }
- if (hours == null) {
- hours = new TreeSet();
- }
- if (daysOfMonth == null) {
- daysOfMonth = new TreeSet();
- }
- if (months == null) {
- months = new TreeSet();
- }
- if (daysOfWeek == null) {
- daysOfWeek = new TreeSet();
- }
- if (years == null) {
- years = new TreeSet();
- }
-
- int exprOn = SECOND;
-
- StringTokenizer exprsTok = new StringTokenizer(expression, " \t",
- false);
-
- while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {
- String expr = exprsTok.nextToken().trim();
-
- // throw an exception if L is used with other days of the month
- if (exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {
- throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1);
- }
- // throw an exception if L is used with other days of the week
- if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {
- throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1);
- }
- if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') + 1) != -1) {
- throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1);
- }
-
- StringTokenizer vTok = new StringTokenizer(expr, ",");
- while (vTok.hasMoreTokens()) {
- String v = vTok.nextToken();
- storeExpressionVals(0, v, exprOn);
- }
-
- exprOn++;
- }
-
- if (exprOn <= DAY_OF_WEEK) {
- throw new ParseException("Unexpected end of expression.",
- expression.length());
- }
-
- if (exprOn <= YEAR) {
- storeExpressionVals(0, "*", YEAR);
- }
-
- TreeSet dow = getSet(DAY_OF_WEEK);
- TreeSet dom = getSet(DAY_OF_MONTH);
-
- // Copying the logic from the UnsupportedOperationException below
- boolean dayOfMSpec = !dom.contains(NO_SPEC);
- boolean dayOfWSpec = !dow.contains(NO_SPEC);
-
- if (!dayOfMSpec || dayOfWSpec) {
- if (!dayOfWSpec || dayOfMSpec) {
- throw new ParseException(
- "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0);
- }
- }
- } catch (ParseException pe) {
- throw pe;
- } catch (Exception e) {
- throw new ParseException("Illegal cron expression format ("
- + e.toString() + ")", 0);
- }
- }
-
- protected int storeExpressionVals(int pos, String s, int type)
- throws ParseException {
-
- int incr = 0;
- int i = skipWhiteSpace(pos, s);
- if (i >= s.length()) {
- return i;
- }
- char c = s.charAt(i);
- if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW")) && (!s.matches("^L-[0-9]*[W]?"))) {
- String sub = s.substring(i, i + 3);
- int sval = -1;
- int eval = -1;
- if (type == MONTH) {
- sval = getMonthNumber(sub) + 1;
- if (sval <= 0) {
- throw new ParseException("Invalid Month value: '" + sub + "'", i);
- }
- if (s.length() > i + 3) {
- c = s.charAt(i + 3);
- if (c == '-') {
- i += 4;
- sub = s.substring(i, i + 3);
- eval = getMonthNumber(sub) + 1;
- if (eval <= 0) {
- throw new ParseException("Invalid Month value: '" + sub + "'", i);
- }
- }
- }
- } else if (type == DAY_OF_WEEK) {
- sval = getDayOfWeekNumber(sub);
- if (sval < 0) {
- throw new ParseException("Invalid Day-of-Week value: '"
- + sub + "'", i);
- }
- if (s.length() > i + 3) {
- c = s.charAt(i + 3);
- if (c == '-') {
- i += 4;
- sub = s.substring(i, i + 3);
- eval = getDayOfWeekNumber(sub);
- if (eval < 0) {
- throw new ParseException(
- "Invalid Day-of-Week value: '" + sub
- + "'", i);
- }
- } else if (c == '#') {
- try {
- i += 4;
- nthdayOfWeek = Integer.parseInt(s.substring(i));
- if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
- throw new Exception();
- }
- } catch (Exception e) {
- throw new ParseException(
- "A numeric value between 1 and 5 must follow the '#' option",
- i);
- }
- } else if (c == 'L') {
- lastdayOfWeek = true;
- i++;
- }
- }
-
- } else {
- throw new ParseException(
- "Illegal characters for this position: '" + sub + "'",
- i);
- }
- if (eval != -1) {
- incr = 1;
- }
- addToSet(sval, eval, incr, type);
- return (i + 3);
- }
-
- if (c == '?') {
- i++;
- if ((i + 1) < s.length()
- && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) {
- throw new ParseException("Illegal character after '?': "
- + s.charAt(i), i);
- }
- if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) {
- throw new ParseException(
- "'?' can only be specified for Day-of-Month or Day-of-Week.",
- i);
- }
- if (type == DAY_OF_WEEK && !lastdayOfMonth) {
- int val = daysOfMonth.last();
- if (val == NO_SPEC_INT) {
- throw new ParseException(
- "'?' can only be specified for Day-of-Month -OR- Day-of-Week.",
- i);
- }
- }
-
- addToSet(NO_SPEC_INT, -1, 0, type);
- return i;
- }
-
- if (c == '*' || c == '/') {
- if (c == '*' && (i + 1) >= s.length()) {
- addToSet(ALL_SPEC_INT, -1, incr, type);
- return i + 1;
- } else if (c == '/'
- && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s
- .charAt(i + 1) == '\t')) {
- throw new ParseException("'/' must be followed by an integer.", i);
- } else if (c == '*') {
- i++;
- }
- c = s.charAt(i);
- if (c == '/') { // is an increment specified?
- i++;
- if (i >= s.length()) {
- throw new ParseException("Unexpected end of string.", i);
- }
-
- incr = getNumericValue(s, i);
-
- i++;
- if (incr > 10) {
- i++;
- }
- checkIncrementRange(incr, type, i);
- } else {
- incr = 1;
- }
-
- addToSet(ALL_SPEC_INT, -1, incr, type);
- return i;
- } else if (c == 'L') {
- i++;
- if (type == DAY_OF_MONTH) {
- lastdayOfMonth = true;
- }
- if (type == DAY_OF_WEEK) {
- addToSet(7, 7, 0, type);
- }
- if (type == DAY_OF_MONTH && s.length() > i) {
- c = s.charAt(i);
- if (c == '-') {
- ValueSet vs = getValue(0, s, i + 1);
- lastdayOffset = vs.value;
- if (lastdayOffset > 30)
- throw new ParseException("Offset from last day must be <= 30", i + 1);
- i = vs.pos;
- }
- if (s.length() > i) {
- c = s.charAt(i);
- if (c == 'W') {
- nearestWeekday = true;
- i++;
- }
- }
- }
- return i;
- } else if (c >= '0' && c <= '9') {
- int val = Integer.parseInt(String.valueOf(c));
- i++;
- if (i >= s.length()) {
- addToSet(val, -1, -1, type);
- } else {
- c = s.charAt(i);
- if (c >= '0' && c <= '9') {
- ValueSet vs = getValue(val, s, i);
- val = vs.value;
- i = vs.pos;
- }
- i = checkNext(i, s, val, type);
- return i;
- }
- } else {
- throw new ParseException("Unexpected character: " + c, i);
- }
-
- return i;
- }
-
- private void checkIncrementRange(int incr, int type, int idxPos) throws ParseException {
- if (incr > 59 && (type == SECOND || type == MINUTE)) {
- throw new ParseException("Increment > 60 : " + incr, idxPos);
- } else if (incr > 23 && (type == HOUR)) {
- throw new ParseException("Increment > 24 : " + incr, idxPos);
- } else if (incr > 31 && (type == DAY_OF_MONTH)) {
- throw new ParseException("Increment > 31 : " + incr, idxPos);
- } else if (incr > 7 && (type == DAY_OF_WEEK)) {
- throw new ParseException("Increment > 7 : " + incr, idxPos);
- } else if (incr > 12 && (type == MONTH)) {
- throw new ParseException("Increment > 12 : " + incr, idxPos);
- }
- }
-
- protected int checkNext(int pos, String s, int val, int type)
- throws ParseException {
-
- int end = -1;
- int i = pos;
-
- if (i >= s.length()) {
- addToSet(val, end, -1, type);
- return i;
- }
-
- char c = s.charAt(pos);
-
- if (c == 'L') {
- if (type == DAY_OF_WEEK) {
- if (val < 1 || val > 7)
- throw new ParseException("Day-of-Week values must be between 1 and 7", -1);
- lastdayOfWeek = true;
- } else {
- throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i);
- }
- TreeSet set = getSet(type);
- set.add(val);
- i++;
- return i;
- }
-
- if (c == 'W') {
- if (type == DAY_OF_MONTH) {
- nearestWeekday = true;
- } else {
- throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i);
- }
- if (val > 31)
- throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i);
- TreeSet set = getSet(type);
- set.add(val);
- i++;
- return i;
- }
-
- if (c == '#') {
- if (type != DAY_OF_WEEK) {
- throw new ParseException("'#' option is not valid here. (pos=" + i + ")", i);
- }
- i++;
- try {
- nthdayOfWeek = Integer.parseInt(s.substring(i));
- if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
- throw new Exception();
- }
- } catch (Exception e) {
- throw new ParseException(
- "A numeric value between 1 and 5 must follow the '#' option",
- i);
- }
-
- TreeSet set = getSet(type);
- set.add(val);
- i++;
- return i;
- }
-
- if (c == '-') {
- i++;
- c = s.charAt(i);
- int v = Integer.parseInt(String.valueOf(c));
- end = v;
- i++;
- if (i >= s.length()) {
- addToSet(val, end, 1, type);
- return i;
- }
- c = s.charAt(i);
- if (c >= '0' && c <= '9') {
- ValueSet vs = getValue(v, s, i);
- end = vs.value;
- i = vs.pos;
- }
- if (i < s.length() && ((c = s.charAt(i)) == '/')) {
- i++;
- c = s.charAt(i);
- int v2 = Integer.parseInt(String.valueOf(c));
- i++;
- if (i >= s.length()) {
- addToSet(val, end, v2, type);
- return i;
- }
- c = s.charAt(i);
- if (c >= '0' && c <= '9') {
- ValueSet vs = getValue(v2, s, i);
- int v3 = vs.value;
- addToSet(val, end, v3, type);
- i = vs.pos;
- return i;
- } else {
- addToSet(val, end, v2, type);
- return i;
- }
- } else {
- addToSet(val, end, 1, type);
- return i;
- }
- }
-
- if (c == '/') {
- if ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\t') {
- throw new ParseException("'/' must be followed by an integer.", i);
- }
-
- i++;
- c = s.charAt(i);
- int v2 = Integer.parseInt(String.valueOf(c));
- i++;
- if (i >= s.length()) {
- checkIncrementRange(v2, type, i);
- addToSet(val, end, v2, type);
- return i;
- }
- c = s.charAt(i);
- if (c >= '0' && c <= '9') {
- ValueSet vs = getValue(v2, s, i);
- int v3 = vs.value;
- checkIncrementRange(v3, type, i);
- addToSet(val, end, v3, type);
- i = vs.pos;
- return i;
- } else {
- throw new ParseException("Unexpected character '" + c + "' after '/'", i);
- }
- }
-
- addToSet(val, end, 0, type);
- i++;
- return i;
- }
-
- public String getCronExpression() {
- return cronExpression;
- }
-
- public String getExpressionSummary() {
- StringBuilder buf = new StringBuilder();
-
- buf.append("seconds: ");
- buf.append(getExpressionSetSummary(seconds));
- buf.append("\n");
- buf.append("minutes: ");
- buf.append(getExpressionSetSummary(minutes));
- buf.append("\n");
- buf.append("hours: ");
- buf.append(getExpressionSetSummary(hours));
- buf.append("\n");
- buf.append("daysOfMonth: ");
- buf.append(getExpressionSetSummary(daysOfMonth));
- buf.append("\n");
- buf.append("months: ");
- buf.append(getExpressionSetSummary(months));
- buf.append("\n");
- buf.append("daysOfWeek: ");
- buf.append(getExpressionSetSummary(daysOfWeek));
- buf.append("\n");
- buf.append("lastdayOfWeek: ");
- buf.append(lastdayOfWeek);
- buf.append("\n");
- buf.append("nearestWeekday: ");
- buf.append(nearestWeekday);
- buf.append("\n");
- buf.append("NthDayOfWeek: ");
- buf.append(nthdayOfWeek);
- buf.append("\n");
- buf.append("lastdayOfMonth: ");
- buf.append(lastdayOfMonth);
- buf.append("\n");
- buf.append("years: ");
- buf.append(getExpressionSetSummary(years));
- buf.append("\n");
-
- return buf.toString();
- }
-
- protected String getExpressionSetSummary(java.util.Set set) {
-
- if (set.contains(NO_SPEC)) {
- return "?";
- }
- if (set.contains(ALL_SPEC)) {
- return "*";
- }
-
- StringBuilder buf = new StringBuilder();
-
- Iterator itr = set.iterator();
- boolean first = true;
- while (itr.hasNext()) {
- Integer iVal = itr.next();
- String val = iVal.toString();
- if (!first) {
- buf.append(",");
- }
- buf.append(val);
- first = false;
- }
-
- return buf.toString();
- }
-
- protected String getExpressionSetSummary(java.util.ArrayList list) {
-
- if (list.contains(NO_SPEC)) {
- return "?";
- }
- if (list.contains(ALL_SPEC)) {
- return "*";
- }
-
- StringBuilder buf = new StringBuilder();
-
- Iterator itr = list.iterator();
- boolean first = true;
- while (itr.hasNext()) {
- Integer iVal = itr.next();
- String val = iVal.toString();
- if (!first) {
- buf.append(",");
- }
- buf.append(val);
- first = false;
- }
-
- return buf.toString();
- }
-
- protected int skipWhiteSpace(int i, String s) {
- for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) {
- }
-
- return i;
- }
-
- protected int findNextWhiteSpace(int i, String s) {
- for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) {
- }
-
- return i;
- }
-
- protected void addToSet(int val, int end, int incr, int type)
- throws ParseException {
-
- TreeSet set = getSet(type);
-
- if (type == SECOND || type == MINUTE) {
- if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) {
- throw new ParseException(
- "Minute and Second values must be between 0 and 59",
- -1);
- }
- } else if (type == HOUR) {
- if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {
- throw new ParseException(
- "Hour values must be between 0 and 23", -1);
- }
- } else if (type == DAY_OF_MONTH) {
- if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT)
- && (val != NO_SPEC_INT)) {
- throw new ParseException(
- "Day of month values must be between 1 and 31", -1);
- }
- } else if (type == MONTH) {
- if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {
- throw new ParseException(
- "Month values must be between 1 and 12", -1);
- }
- } else if (type == DAY_OF_WEEK) {
- if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT)
- && (val != NO_SPEC_INT)) {
- throw new ParseException(
- "Day-of-Week values must be between 1 and 7", -1);
- }
- }
-
- if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
- if (val != -1) {
- set.add(val);
- } else {
- set.add(NO_SPEC);
- }
-
- return;
- }
-
- int startAt = val;
- int stopAt = end;
-
- if (val == ALL_SPEC_INT && incr <= 0) {
- incr = 1;
- set.add(ALL_SPEC); // put in a marker, but also fill values
- }
-
- if (type == SECOND || type == MINUTE) {
- if (stopAt == -1) {
- stopAt = 59;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 0;
- }
- } else if (type == HOUR) {
- if (stopAt == -1) {
- stopAt = 23;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 0;
- }
- } else if (type == DAY_OF_MONTH) {
- if (stopAt == -1) {
- stopAt = 31;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 1;
- }
- } else if (type == MONTH) {
- if (stopAt == -1) {
- stopAt = 12;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 1;
- }
- } else if (type == DAY_OF_WEEK) {
- if (stopAt == -1) {
- stopAt = 7;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 1;
- }
- } else if (type == YEAR) {
- if (stopAt == -1) {
- stopAt = MAX_YEAR;
- }
- if (startAt == -1 || startAt == ALL_SPEC_INT) {
- startAt = 1970;
- }
- }
-
- // if the end of the range is before the start, then we need to overflow into
- // the next day, month etc. This is done by adding the maximum amount for that
- // type, and using modulus max to determine the value being added.
- int max = -1;
- if (stopAt < startAt) {
- switch (type) {
- case SECOND:
- max = 60;
- break;
- case MINUTE:
- max = 60;
- break;
- case HOUR:
- max = 24;
- break;
- case MONTH:
- max = 12;
- break;
- case DAY_OF_WEEK:
- max = 7;
- break;
- case DAY_OF_MONTH:
- max = 31;
- break;
- case YEAR:
- throw new IllegalArgumentException("Start year must be less than stop year");
- default:
- throw new IllegalArgumentException("Unexpected type encountered");
- }
- stopAt += max;
- }
-
- for (int i = startAt; i <= stopAt; i += incr) {
- if (max == -1) {
- // ie: there's no max to overflow over
- set.add(i);
- } else {
- // take the modulus to get the real value
- int i2 = i % max;
-
- // 1-indexed ranges should not include 0, and should include their max
- if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH)) {
- i2 = max;
- }
-
- set.add(i2);
- }
- }
- }
-
- TreeSet getSet(int type) {
- switch (type) {
- case SECOND:
- return seconds;
- case MINUTE:
- return minutes;
- case HOUR:
- return hours;
- case DAY_OF_MONTH:
- return daysOfMonth;
- case MONTH:
- return months;
- case DAY_OF_WEEK:
- return daysOfWeek;
- case YEAR:
- return years;
- default:
- return null;
- }
- }
-
- protected ValueSet getValue(int v, String s, int i) {
- char c = s.charAt(i);
- StringBuilder s1 = new StringBuilder(String.valueOf(v));
- while (c >= '0' && c <= '9') {
- s1.append(c);
- i++;
- if (i >= s.length()) {
- break;
- }
- c = s.charAt(i);
- }
- ValueSet val = new ValueSet();
-
- val.pos = (i < s.length()) ? i : i + 1;
- val.value = Integer.parseInt(s1.toString());
- return val;
- }
-
- protected int getNumericValue(String s, int i) {
- int endOfVal = findNextWhiteSpace(i, s);
- String val = s.substring(i, endOfVal);
- return Integer.parseInt(val);
- }
-
- protected int getMonthNumber(String s) {
- Integer integer = monthMap.get(s);
-
- if (integer == null) {
- return -1;
- }
-
- return integer;
- }
-
- protected int getDayOfWeekNumber(String s) {
- Integer integer = dayMap.get(s);
-
- if (integer == null) {
- return -1;
- }
-
- return integer;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Computation Functions
- //
- ////////////////////////////////////////////////////////////////////////////
-
- public Date getTimeAfter(Date afterTime) {
-
- // Computation is based on Gregorian year only.
- Calendar cl = new java.util.GregorianCalendar(getTimeZone());
-
- // move ahead one second, since we're computing the time *after* the
- // given time
- afterTime = new Date(afterTime.getTime() + 1000);
- // CronTrigger does not deal with milliseconds
- cl.setTime(afterTime);
- cl.set(Calendar.MILLISECOND, 0);
-
- boolean gotOne = false;
- // loop until we've computed the next time, or we've past the endTime
- while (!gotOne) {
-
- //if (endTime != null && cl.getTime().after(endTime)) return null;
- if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop...
- return null;
- }
-
- SortedSet st = null;
- int t = 0;
-
- int sec = cl.get(Calendar.SECOND);
- int min = cl.get(Calendar.MINUTE);
-
- // get second.................................................
- st = seconds.tailSet(sec);
- if (st != null && st.size() != 0) {
- sec = st.first();
- } else {
- sec = seconds.first();
- min++;
- cl.set(Calendar.MINUTE, min);
- }
- cl.set(Calendar.SECOND, sec);
-
- min = cl.get(Calendar.MINUTE);
- int hr = cl.get(Calendar.HOUR_OF_DAY);
- t = -1;
-
- // get minute.................................................
- st = minutes.tailSet(min);
- if (st != null && st.size() != 0) {
- t = min;
- min = st.first();
- } else {
- min = minutes.first();
- hr++;
- }
- if (min != t) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, min);
- setCalendarHour(cl, hr);
- continue;
- }
- cl.set(Calendar.MINUTE, min);
-
- hr = cl.get(Calendar.HOUR_OF_DAY);
- int day = cl.get(Calendar.DAY_OF_MONTH);
- t = -1;
-
- // get hour...................................................
- st = hours.tailSet(hr);
- if (st != null && st.size() != 0) {
- t = hr;
- hr = st.first();
- } else {
- hr = hours.first();
- day++;
- }
- if (hr != t) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.DAY_OF_MONTH, day);
- setCalendarHour(cl, hr);
- continue;
- }
- cl.set(Calendar.HOUR_OF_DAY, hr);
-
- day = cl.get(Calendar.DAY_OF_MONTH);
- int mon = cl.get(Calendar.MONTH) + 1;
- // '+ 1' because calendar is 0-based for this field, and we are
- // 1-based
- t = -1;
- int tmon = mon;
-
- // get day...................................................
- boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC);
- boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC);
- if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule
- st = daysOfMonth.tailSet(day);
- if (lastdayOfMonth) {
- if (!nearestWeekday) {
- t = day;
- day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
- day -= lastdayOffset;
- if (t > day) {
- mon++;
- if (mon > 12) {
- mon = 1;
- tmon = 3333; // ensure test of mon != tmon further below fails
- cl.add(Calendar.YEAR, 1);
- }
- day = 1;
- }
- } else {
- t = day;
- day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
- day -= lastdayOffset;
-
- Calendar tcal = Calendar.getInstance(getTimeZone());
- tcal.set(Calendar.SECOND, 0);
- tcal.set(Calendar.MINUTE, 0);
- tcal.set(Calendar.HOUR_OF_DAY, 0);
- tcal.set(Calendar.DAY_OF_MONTH, day);
- tcal.set(Calendar.MONTH, mon - 1);
- tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
-
- int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
- int dow = tcal.get(Calendar.DAY_OF_WEEK);
-
- if (dow == Calendar.SATURDAY && day == 1) {
- day += 2;
- } else if (dow == Calendar.SATURDAY) {
- day -= 1;
- } else if (dow == Calendar.SUNDAY && day == ldom) {
- day -= 2;
- } else if (dow == Calendar.SUNDAY) {
- day += 1;
- }
-
- tcal.set(Calendar.SECOND, sec);
- tcal.set(Calendar.MINUTE, min);
- tcal.set(Calendar.HOUR_OF_DAY, hr);
- tcal.set(Calendar.DAY_OF_MONTH, day);
- tcal.set(Calendar.MONTH, mon - 1);
- Date nTime = tcal.getTime();
- if (nTime.before(afterTime)) {
- day = 1;
- mon++;
- }
- }
- } else if (nearestWeekday) {
- t = day;
- day = daysOfMonth.first();
-
- Calendar tcal = Calendar.getInstance(getTimeZone());
- tcal.set(Calendar.SECOND, 0);
- tcal.set(Calendar.MINUTE, 0);
- tcal.set(Calendar.HOUR_OF_DAY, 0);
- tcal.set(Calendar.DAY_OF_MONTH, day);
- tcal.set(Calendar.MONTH, mon - 1);
- tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
-
- int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
- int dow = tcal.get(Calendar.DAY_OF_WEEK);
-
- if (dow == Calendar.SATURDAY && day == 1) {
- day += 2;
- } else if (dow == Calendar.SATURDAY) {
- day -= 1;
- } else if (dow == Calendar.SUNDAY && day == ldom) {
- day -= 2;
- } else if (dow == Calendar.SUNDAY) {
- day += 1;
- }
-
-
- tcal.set(Calendar.SECOND, sec);
- tcal.set(Calendar.MINUTE, min);
- tcal.set(Calendar.HOUR_OF_DAY, hr);
- tcal.set(Calendar.DAY_OF_MONTH, day);
- tcal.set(Calendar.MONTH, mon - 1);
- Date nTime = tcal.getTime();
- if (nTime.before(afterTime)) {
- day = daysOfMonth.first();
- mon++;
- }
- } else if (st != null && st.size() != 0) {
- t = day;
- day = st.first();
- // make sure we don't over-run a short month, such as february
- int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
- if (day > lastDay) {
- day = daysOfMonth.first();
- mon++;
- }
- } else {
- day = daysOfMonth.first();
- mon++;
- }
-
- if (day != t || mon != tmon) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, day);
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' because calendar is 0-based for this field, and we
- // are 1-based
- continue;
- }
- } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule
- if (lastdayOfWeek) { // are we looking for the last XXX day of
- // the month?
- int dow = daysOfWeek.first(); // desired
- // d-o-w
- int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
- int daysToAdd = 0;
- if (cDow < dow) {
- daysToAdd = dow - cDow;
- }
- if (cDow > dow) {
- daysToAdd = dow + (7 - cDow);
- }
-
- int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
-
- if (day + daysToAdd > lDay) { // did we already miss the
- // last one?
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, 1);
- cl.set(Calendar.MONTH, mon);
- // no '- 1' here because we are promoting the month
- continue;
- }
-
- // find date of last occurrence of this day in this month...
- while ((day + daysToAdd + 7) <= lDay) {
- daysToAdd += 7;
- }
-
- day += daysToAdd;
-
- if (daysToAdd > 0) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, day);
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' here because we are not promoting the month
- continue;
- }
-
- } else if (nthdayOfWeek != 0) {
- // are we looking for the Nth XXX day in the month?
- int dow = daysOfWeek.first(); // desired
- // d-o-w
- int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
- int daysToAdd = 0;
- if (cDow < dow) {
- daysToAdd = dow - cDow;
- } else if (cDow > dow) {
- daysToAdd = dow + (7 - cDow);
- }
-
- boolean dayShifted = false;
- if (daysToAdd > 0) {
- dayShifted = true;
- }
-
- day += daysToAdd;
- int weekOfMonth = day / 7;
- if (day % 7 > 0) {
- weekOfMonth++;
- }
-
- daysToAdd = (nthdayOfWeek - weekOfMonth) * 7;
- day += daysToAdd;
- if (daysToAdd < 0
- || day > getLastDayOfMonth(mon, cl
- .get(Calendar.YEAR))) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, 1);
- cl.set(Calendar.MONTH, mon);
- // no '- 1' here because we are promoting the month
- continue;
- } else if (daysToAdd > 0 || dayShifted) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, day);
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' here because we are NOT promoting the month
- continue;
- }
- } else {
- int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
- int dow = daysOfWeek.first(); // desired
- // d-o-w
- st = daysOfWeek.tailSet(cDow);
- if (st != null && st.size() > 0) {
- dow = st.first();
- }
-
- int daysToAdd = 0;
- if (cDow < dow) {
- daysToAdd = dow - cDow;
- }
- if (cDow > dow) {
- daysToAdd = dow + (7 - cDow);
- }
-
- int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
-
- if (day + daysToAdd > lDay) { // will we pass the end of
- // the month?
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, 1);
- cl.set(Calendar.MONTH, mon);
- // no '- 1' here because we are promoting the month
- continue;
- } else if (daysToAdd > 0) { // are we swithing days?
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd);
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' because calendar is 0-based for this field,
- // and we are 1-based
- continue;
- }
- }
- } else { // dayOfWSpec && !dayOfMSpec
- throw new UnsupportedOperationException(
- "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.");
- }
- cl.set(Calendar.DAY_OF_MONTH, day);
-
- mon = cl.get(Calendar.MONTH) + 1;
- // '+ 1' because calendar is 0-based for this field, and we are
- // 1-based
- int year = cl.get(Calendar.YEAR);
- t = -1;
-
- // test for expressions that never generate a valid fire date,
- // but keep looping...
- if (year > MAX_YEAR) {
- return null;
- }
-
- // get month...................................................
- st = months.tailSet(mon);
- if (st != null && st.size() != 0) {
- t = mon;
- mon = st.first();
- } else {
- mon = months.first();
- year++;
- }
- if (mon != t) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, 1);
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' because calendar is 0-based for this field, and we are
- // 1-based
- cl.set(Calendar.YEAR, year);
- continue;
- }
- cl.set(Calendar.MONTH, mon - 1);
- // '- 1' because calendar is 0-based for this field, and we are
- // 1-based
-
- year = cl.get(Calendar.YEAR);
- t = -1;
-
- // get year...................................................
- st = years.tailSet(year);
- if (st != null && st.size() != 0) {
- t = year;
- year = st.first();
- } else {
- return null; // ran out of years...
- }
-
- if (year != t) {
- cl.set(Calendar.SECOND, 0);
- cl.set(Calendar.MINUTE, 0);
- cl.set(Calendar.HOUR_OF_DAY, 0);
- cl.set(Calendar.DAY_OF_MONTH, 1);
- cl.set(Calendar.MONTH, 0);
- // '- 1' because calendar is 0-based for this field, and we are
- // 1-based
- cl.set(Calendar.YEAR, year);
- continue;
- }
- cl.set(Calendar.YEAR, year);
-
- gotOne = true;
- } // while( !done )
-
- return cl.getTime();
- }
-
- /**
- * Advance the calendar to the particular hour paying particular attention
- * to daylight saving problems.
- *
- * @param cal the calendar to operate on
- * @param hour the hour to set
- */
- protected void setCalendarHour(Calendar cal, int hour) {
- cal.set(Calendar.HOUR_OF_DAY, hour);
- if (cal.get(Calendar.HOUR_OF_DAY) != hour && hour != 24) {
- cal.set(Calendar.HOUR_OF_DAY, hour + 1);
- }
- }
-
- /**
- * NOT YET IMPLEMENTED: Returns the time before the given time
- * that the CronExpression
matches.
- */
- public Date getTimeBefore(Date endTime) {
- // FUTURE_TODO: implement QUARTZ-423
- return null;
- }
-
- /**
- * NOT YET IMPLEMENTED: Returns the final time that the
- * CronExpression
will match.
- */
- public Date getFinalFireTime() {
- // FUTURE_TODO: implement QUARTZ-423
- return null;
- }
-
- protected boolean isLeapYear(int year) {
- return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
- }
-
- protected int getLastDayOfMonth(int monthNum, int year) {
-
- switch (monthNum) {
- case 1:
- return 31;
- case 2:
- return (isLeapYear(year)) ? 29 : 28;
- case 3:
- return 31;
- case 4:
- return 30;
- case 5:
- return 31;
- case 6:
- return 30;
- case 7:
- return 31;
- case 8:
- return 31;
- case 9:
- return 30;
- case 10:
- return 31;
- case 11:
- return 30;
- case 12:
- return 31;
- default:
- throw new IllegalArgumentException("Illegal month number: "
- + monthNum);
- }
- }
-
-
- private void readObject(java.io.ObjectInputStream stream)
- throws java.io.IOException, ClassNotFoundException {
-
- stream.defaultReadObject();
- try {
- buildExpression(cronExpression);
- } catch (Exception ignore) {
- } // never happens
- }
-
- @Override
- @Deprecated
- public Object clone() {
- return new CronExpression(this);
- }
-}
-
-class ValueSet {
- public int value;
-
- public int pos;
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java
deleted file mode 100644
index 4424277b0..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.xxl.job.admin.core.exception;
-
-/**
- * @author xuxueli 2019-05-04 23:19:29
- */
-public class XxlJobException extends RuntimeException {
-
- public XxlJobException() {
- }
-
- public XxlJobException(String message) {
- super(message);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
deleted file mode 100644
index 3a9952a49..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-/**
- * Created by xuxueli on 16/9/30.
- */
-public class XxlJobGroup {
-
- private int id;
- private String appname;
- private String title;
- private int addressType; // 执行器地址类型:0=自动注册、1=手动录入
- private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入)
- private Date updateTime;
-
- // registry list
- private List registryList; // 执行器地址列表(系统注册)
-
- public List getRegistryList() {
- if (addressList != null && addressList.trim().length() > 0) {
- registryList = new ArrayList(Arrays.asList(addressList.split(",")));
- }
- return registryList;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getAppname() {
- return appname;
- }
-
- public void setAppname(String appname) {
- this.appname = appname;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public int getAddressType() {
- return addressType;
- }
-
- public void setAddressType(int addressType) {
- this.addressType = addressType;
- }
-
- public String getAddressList() {
- return addressList;
- }
-
- public Date getUpdateTime() {
- return updateTime;
- }
-
- public void setUpdateTime(Date updateTime) {
- this.updateTime = updateTime;
- }
-
- public void setAddressList(String addressList) {
- this.addressList = addressList;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
deleted file mode 100644
index ee4b02cea..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
+++ /dev/null
@@ -1,237 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-/**
- * xxl-job info
- *
- * @author xuxueli 2016-1-12 18:25:49
- */
-public class XxlJobInfo {
-
- private int id; // 主键ID
-
- private int jobGroup; // 执行器主键ID
- private String jobDesc;
-
- private Date addTime;
- private Date updateTime;
-
- private String author; // 负责人
- private String alarmEmail; // 报警邮件
-
- private String scheduleType; // 调度类型
- private String scheduleConf; // 调度配置,值含义取决于调度类型
- private String misfireStrategy; // 调度过期策略
-
- private String executorRouteStrategy; // 执行器路由策略
- private String executorHandler; // 执行器,任务Handler名称
- private String executorParam; // 执行器,任务参数
- private String executorBlockStrategy; // 阻塞处理策略
- private int executorTimeout; // 任务执行超时时间,单位秒
- private int executorFailRetryCount; // 失败重试次数
-
- private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum
- private String glueSource; // GLUE源代码
- private String glueRemark; // GLUE备注
- private Date glueUpdatetime; // GLUE更新时间
-
- private String childJobId; // 子任务ID,多个逗号分隔
-
- private int triggerStatus; // 调度状态:0-停止,1-运行
- private long triggerLastTime; // 上次调度时间
- private long triggerNextTime; // 下次调度时间
-
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public int getJobGroup() {
- return jobGroup;
- }
-
- public void setJobGroup(int jobGroup) {
- this.jobGroup = jobGroup;
- }
-
- public String getJobDesc() {
- return jobDesc;
- }
-
- public void setJobDesc(String jobDesc) {
- this.jobDesc = jobDesc;
- }
-
- public Date getAddTime() {
- return addTime;
- }
-
- public void setAddTime(Date addTime) {
- this.addTime = addTime;
- }
-
- public Date getUpdateTime() {
- return updateTime;
- }
-
- public void setUpdateTime(Date updateTime) {
- this.updateTime = updateTime;
- }
-
- public String getAuthor() {
- return author;
- }
-
- public void setAuthor(String author) {
- this.author = author;
- }
-
- public String getAlarmEmail() {
- return alarmEmail;
- }
-
- public void setAlarmEmail(String alarmEmail) {
- this.alarmEmail = alarmEmail;
- }
-
- public String getScheduleType() {
- return scheduleType;
- }
-
- public void setScheduleType(String scheduleType) {
- this.scheduleType = scheduleType;
- }
-
- public String getScheduleConf() {
- return scheduleConf;
- }
-
- public void setScheduleConf(String scheduleConf) {
- this.scheduleConf = scheduleConf;
- }
-
- public String getMisfireStrategy() {
- return misfireStrategy;
- }
-
- public void setMisfireStrategy(String misfireStrategy) {
- this.misfireStrategy = misfireStrategy;
- }
-
- public String getExecutorRouteStrategy() {
- return executorRouteStrategy;
- }
-
- public void setExecutorRouteStrategy(String executorRouteStrategy) {
- this.executorRouteStrategy = executorRouteStrategy;
- }
-
- public String getExecutorHandler() {
- return executorHandler;
- }
-
- public void setExecutorHandler(String executorHandler) {
- this.executorHandler = executorHandler;
- }
-
- public String getExecutorParam() {
- return executorParam;
- }
-
- public void setExecutorParam(String executorParam) {
- this.executorParam = executorParam;
- }
-
- public String getExecutorBlockStrategy() {
- return executorBlockStrategy;
- }
-
- public void setExecutorBlockStrategy(String executorBlockStrategy) {
- this.executorBlockStrategy = executorBlockStrategy;
- }
-
- public int getExecutorTimeout() {
- return executorTimeout;
- }
-
- public void setExecutorTimeout(int executorTimeout) {
- this.executorTimeout = executorTimeout;
- }
-
- public int getExecutorFailRetryCount() {
- return executorFailRetryCount;
- }
-
- public void setExecutorFailRetryCount(int executorFailRetryCount) {
- this.executorFailRetryCount = executorFailRetryCount;
- }
-
- public String getGlueType() {
- return glueType;
- }
-
- public void setGlueType(String glueType) {
- this.glueType = glueType;
- }
-
- public String getGlueSource() {
- return glueSource;
- }
-
- public void setGlueSource(String glueSource) {
- this.glueSource = glueSource;
- }
-
- public String getGlueRemark() {
- return glueRemark;
- }
-
- public void setGlueRemark(String glueRemark) {
- this.glueRemark = glueRemark;
- }
-
- public Date getGlueUpdatetime() {
- return glueUpdatetime;
- }
-
- public void setGlueUpdatetime(Date glueUpdatetime) {
- this.glueUpdatetime = glueUpdatetime;
- }
-
- public String getChildJobId() {
- return childJobId;
- }
-
- public void setChildJobId(String childJobId) {
- this.childJobId = childJobId;
- }
-
- public int getTriggerStatus() {
- return triggerStatus;
- }
-
- public void setTriggerStatus(int triggerStatus) {
- this.triggerStatus = triggerStatus;
- }
-
- public long getTriggerLastTime() {
- return triggerLastTime;
- }
-
- public void setTriggerLastTime(long triggerLastTime) {
- this.triggerLastTime = triggerLastTime;
- }
-
- public long getTriggerNextTime() {
- return triggerNextTime;
- }
-
- public void setTriggerNextTime(long triggerNextTime) {
- this.triggerNextTime = triggerNextTime;
- }
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
deleted file mode 100644
index f3301af6c..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-/**
- * xxl-job log, used to track trigger process
- *
- * @author xuxueli 2015-12-19 23:19:09
- */
-public class XxlJobLog {
-
- private long id;
-
- // job info
- private int jobGroup;
- private int jobId;
-
- // execute info
- private String executorAddress;
- private String executorHandler;
- private String executorParam;
- private String executorShardingParam;
- private int executorFailRetryCount;
-
- // trigger info
- private Date triggerTime;
- private int triggerCode;
- private String triggerMsg;
-
- // handle info
- private Date handleTime;
- private int handleCode;
- private String handleMsg;
-
- // alarm info
- private int alarmStatus;
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public int getJobGroup() {
- return jobGroup;
- }
-
- public void setJobGroup(int jobGroup) {
- this.jobGroup = jobGroup;
- }
-
- public int getJobId() {
- return jobId;
- }
-
- public void setJobId(int jobId) {
- this.jobId = jobId;
- }
-
- public String getExecutorAddress() {
- return executorAddress;
- }
-
- public void setExecutorAddress(String executorAddress) {
- this.executorAddress = executorAddress;
- }
-
- public String getExecutorHandler() {
- return executorHandler;
- }
-
- public void setExecutorHandler(String executorHandler) {
- this.executorHandler = executorHandler;
- }
-
- public String getExecutorParam() {
- return executorParam;
- }
-
- public void setExecutorParam(String executorParam) {
- this.executorParam = executorParam;
- }
-
- public String getExecutorShardingParam() {
- return executorShardingParam;
- }
-
- public void setExecutorShardingParam(String executorShardingParam) {
- this.executorShardingParam = executorShardingParam;
- }
-
- public int getExecutorFailRetryCount() {
- return executorFailRetryCount;
- }
-
- public void setExecutorFailRetryCount(int executorFailRetryCount) {
- this.executorFailRetryCount = executorFailRetryCount;
- }
-
- public Date getTriggerTime() {
- return triggerTime;
- }
-
- public void setTriggerTime(Date triggerTime) {
- this.triggerTime = triggerTime;
- }
-
- public int getTriggerCode() {
- return triggerCode;
- }
-
- public void setTriggerCode(int triggerCode) {
- this.triggerCode = triggerCode;
- }
-
- public String getTriggerMsg() {
- return triggerMsg;
- }
-
- public void setTriggerMsg(String triggerMsg) {
- this.triggerMsg = triggerMsg;
- }
-
- public Date getHandleTime() {
- return handleTime;
- }
-
- public void setHandleTime(Date handleTime) {
- this.handleTime = handleTime;
- }
-
- public int getHandleCode() {
- return handleCode;
- }
-
- public void setHandleCode(int handleCode) {
- this.handleCode = handleCode;
- }
-
- public String getHandleMsg() {
- return handleMsg;
- }
-
- public void setHandleMsg(String handleMsg) {
- this.handleMsg = handleMsg;
- }
-
- public int getAlarmStatus() {
- return alarmStatus;
- }
-
- public void setAlarmStatus(int alarmStatus) {
- this.alarmStatus = alarmStatus;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
deleted file mode 100644
index 2da3c2da2..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-/**
- * xxl-job log for glue, used to track job code process
- *
- * @author xuxueli 2016-5-19 17:57:46
- */
-public class XxlJobLogGlue {
-
- private int id;
- private int jobId; // 任务主键ID
- private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum
- private String glueSource;
- private String glueRemark;
- private Date addTime;
- private Date updateTime;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public int getJobId() {
- return jobId;
- }
-
- public void setJobId(int jobId) {
- this.jobId = jobId;
- }
-
- public String getGlueType() {
- return glueType;
- }
-
- public void setGlueType(String glueType) {
- this.glueType = glueType;
- }
-
- public String getGlueSource() {
- return glueSource;
- }
-
- public void setGlueSource(String glueSource) {
- this.glueSource = glueSource;
- }
-
- public String getGlueRemark() {
- return glueRemark;
- }
-
- public void setGlueRemark(String glueRemark) {
- this.glueRemark = glueRemark;
- }
-
- public Date getAddTime() {
- return addTime;
- }
-
- public void setAddTime(Date addTime) {
- this.addTime = addTime;
- }
-
- public Date getUpdateTime() {
- return updateTime;
- }
-
- public void setUpdateTime(Date updateTime) {
- this.updateTime = updateTime;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
deleted file mode 100644
index e58ff1a9e..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-public class XxlJobLogReport {
-
- private int id;
-
- private Date triggerDay;
-
- private int runningCount;
- private int sucCount;
- private int failCount;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public Date getTriggerDay() {
- return triggerDay;
- }
-
- public void setTriggerDay(Date triggerDay) {
- this.triggerDay = triggerDay;
- }
-
- public int getRunningCount() {
- return runningCount;
- }
-
- public void setRunningCount(int runningCount) {
- this.runningCount = runningCount;
- }
-
- public int getSucCount() {
- return sucCount;
- }
-
- public void setSucCount(int sucCount) {
- this.sucCount = sucCount;
- }
-
- public int getFailCount() {
- return failCount;
- }
-
- public void setFailCount(int failCount) {
- this.failCount = failCount;
- }
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
deleted file mode 100644
index 924d6d336..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-/**
- * Created by xuxueli on 16/9/30.
- */
-public class XxlJobRegistry {
-
- private int id;
- private String registryGroup;
- private String registryKey;
- private String registryValue;
- private Date updateTime;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getRegistryGroup() {
- return registryGroup;
- }
-
- public void setRegistryGroup(String registryGroup) {
- this.registryGroup = registryGroup;
- }
-
- public String getRegistryKey() {
- return registryKey;
- }
-
- public void setRegistryKey(String registryKey) {
- this.registryKey = registryKey;
- }
-
- public String getRegistryValue() {
- return registryValue;
- }
-
- public void setRegistryValue(String registryValue) {
- this.registryValue = registryValue;
- }
-
- public Date getUpdateTime() {
- return updateTime;
- }
-
- public void setUpdateTime(Date updateTime) {
- this.updateTime = updateTime;
- }
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
deleted file mode 100644
index 6f696df2c..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.xxl.job.admin.core.model;
-
-import org.springframework.util.StringUtils;
-
-/**
- * @author xuxueli 2019-05-04 16:43:12
- */
-public class XxlJobUser {
-
- private int id;
- private String username; // 账号
- private String password; // 密码
- private int role; // 角色:0-普通用户、1-管理员
- private String permission; // 权限:执行器ID列表,多个逗号分割
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public int getRole() {
- return role;
- }
-
- public void setRole(int role) {
- this.role = role;
- }
-
- public String getPermission() {
- return permission;
- }
-
- public void setPermission(String permission) {
- this.permission = permission;
- }
-
- // plugin
- public boolean validPermission(int jobGroup) {
- if (this.role == 1) {
- return true;
- } else {
- if (StringUtils.hasText(this.permission)) {
- for (String permissionItem : this.permission.split(",")) {
- if (String.valueOf(jobGroup).equals(permissionItem)) {
- return true;
- }
- }
- }
- return false;
- }
-
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java
deleted file mode 100644
index 5d1f2a086..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.jobbean;
-//
-//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
-//import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-//import org.quartz.JobExecutionContext;
-//import org.quartz.JobExecutionException;
-//import org.quartz.JobKey;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.scheduling.quartz.QuartzJobBean;
-//
-///**
-// * http job bean
-// * “@DisallowConcurrentExecution” disable concurrent, thread size can not be only one, better given more
-// * @author xuxueli 2015-12-17 18:20:34
-// */
-////@DisallowConcurrentExecution
-//public class RemoteHttpJobBean extends QuartzJobBean {
-// private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
-//
-// @Override
-// protected void executeInternal(JobExecutionContext context)
-// throws JobExecutionException {
-//
-// // load jobId
-// JobKey jobKey = context.getTrigger().getJobKey();
-// Integer jobId = Integer.valueOf(jobKey.getName());
-//
-//
-// }
-//
-//}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java
deleted file mode 100644
index 5ae81bd21..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java
+++ /dev/null
@@ -1,413 +0,0 @@
-package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.schedule;
-//
-//import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
-//import com.xxl.job.admin.core.model.XxlJobInfo;
-//import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
-//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
-//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
-//import com.xxl.job.admin.core.util.I18nUtil;
-//import com.xxl.job.core.biz.AdminBiz;
-//import com.xxl.job.core.biz.ExecutorBiz;
-//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
-//import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
-//import com.xxl.rpc.remoting.invoker.call.CallType;
-//import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
-//import com.xxl.rpc.remoting.invoker.route.LoadBalance;
-//import com.xxl.rpc.remoting.net.NetEnum;
-//import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
-//import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
-//import com.xxl.rpc.serialize.Serializer;
-//import org.quartz.*;
-//import org.quartz.Trigger.TriggerState;
-//import org.quartz.impl.triggers.CronTriggerImpl;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.util.Assert;
-//
-//import javax.servlet.ServletException;
-//import javax.servlet.http.HttpServletRequest;
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.IOException;
-//import java.util.Date;
-//import java.util.concurrent.ConcurrentHashMap;
-//
-///**
-// * base quartz scheduler util
-// * @author xuxueli 2015-12-19 16:13:53
-// */
-//public final class XxlJobDynamicScheduler {
-// private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler_old.class);
-//
-// // ---------------------- param ----------------------
-//
-// // scheduler
-// private static Scheduler scheduler;
-// public void setScheduler(Scheduler scheduler) {
-// XxlJobDynamicScheduler_old.scheduler = scheduler;
-// }
-//
-//
-// // ---------------------- init + destroy ----------------------
-// public void start() throws Exception {
-// // valid
-// Assert.notNull(scheduler, "quartz scheduler is null");
-//
-// // init i18n
-// initI18n();
-//
-// // admin registry monitor run
-// JobRegistryMonitorHelper.getInstance().start();
-//
-// // admin monitor run
-// JobFailMonitorHelper.getInstance().start();
-//
-// // admin-server
-// initRpcProvider();
-//
-// logger.info(">>>>>>>>> init xxl-job admin success.");
-// }
-//
-//
-// public void destroy() throws Exception {
-// // admin trigger pool stop
-// JobTriggerPoolHelper.toStop();
-//
-// // admin registry stop
-// JobRegistryMonitorHelper.getInstance().toStop();
-//
-// // admin monitor stop
-// JobFailMonitorHelper.getInstance().toStop();
-//
-// // admin-server
-// stopRpcProvider();
-// }
-//
-//
-// // ---------------------- I18n ----------------------
-//
-// private void initI18n(){
-// for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
-// item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
-// }
-// }
-//
-//
-// // ---------------------- admin rpc provider (no server version) ----------------------
-// private static ServletServerHandler servletServerHandler;
-// private void initRpcProvider(){
-// // init
-// XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
-// xxlRpcProviderFactory.initConfig(
-// NetEnum.NETTY_HTTP,
-// Serializer.SerializeEnum.HESSIAN.getSerializer(),
-// null,
-// 0,
-// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
-// null,
-// null);
-//
-// // add services
-// xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
-//
-// // servlet handler
-// servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
-// }
-// private void stopRpcProvider() throws Exception {
-// XxlRpcInvokerFactory.getInstance().stop();
-// }
-// public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
-// servletServerHandler.handle(null, request, response);
-// }
-//
-//
-// // ---------------------- executor-client ----------------------
-// private static ConcurrentHashMap executorBizRepository = new ConcurrentHashMap();
-// public static ExecutorBiz getExecutorBiz(String address) throws Exception {
-// // valid
-// if (address==null || address.trim().length()==0) {
-// return null;
-// }
-//
-// // load-cache
-// address = address.trim();
-// ExecutorBiz executorBiz = executorBizRepository.get(address);
-// if (executorBiz != null) {
-// return executorBiz;
-// }
-//
-// // set-cache
-// executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
-// NetEnum.NETTY_HTTP,
-// Serializer.SerializeEnum.HESSIAN.getSerializer(),
-// CallType.SYNC,
-// LoadBalance.ROUND,
-// ExecutorBiz.class,
-// null,
-// 5000,
-// address,
-// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
-// null,
-// null).getObject();
-//
-// executorBizRepository.put(address, executorBiz);
-// return executorBiz;
-// }
-//
-//
-// // ---------------------- schedule util ----------------------
-//
-// /**
-// * fill job info
-// *
-// * @param jobInfo
-// */
-// public static void fillJobInfo(XxlJobInfo jobInfo) {
-//
-// String name = String.valueOf(jobInfo.getId());
-//
-// // trigger key
-// TriggerKey triggerKey = TriggerKey.triggerKey(name);
-// try {
-//
-// // trigger cron
-// Trigger trigger = scheduler.getTrigger(triggerKey);
-// if (trigger!=null && trigger instanceof CronTriggerImpl) {
-// String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
-// jobInfo.setJobCron(cronExpression);
-// }
-//
-// // trigger state
-// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
-// if (triggerState!=null) {
-// jobInfo.setJobStatus(triggerState.name());
-// }
-//
-// //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
-// //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
-// //String jobClass = jobDetail.getJobClass().getName();
-//
-// } catch (SchedulerException e) {
-// logger.error(e.getMessage(), e);
-// }
-// }
-//
-//
-// /**
-// * add trigger + job
-// *
-// * @param jobName
-// * @param cronExpression
-// * @return
-// * @throws SchedulerException
-// */
-// public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
-// // 1、job key
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-// JobKey jobKey = new JobKey(jobName);
-//
-// // 2、valid
-// if (scheduler.checkExists(triggerKey)) {
-// return true; // PASS
-// }
-//
-// // 3、corn trigger
-// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
-// CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
-//
-// // 4、job detail
-// Class extends Job> jobClass_ = RemoteHttpJobBean.class; // Class.forName(jobInfo.getJobClass());
-// JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
-//
-// /*if (jobInfo.getJobData()!=null) {
-// JobDataMap jobDataMap = jobDetail.getJobDataMap();
-// jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
-// // JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
-// }*/
-//
-// // 5、schedule job
-// Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
-//
-// logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
-// return true;
-// }
-//
-//
-// /**
-// * remove trigger + job
-// *
-// * @param jobName
-// * @return
-// * @throws SchedulerException
-// */
-// public static boolean removeJob(String jobName) throws SchedulerException {
-//
-// JobKey jobKey = new JobKey(jobName);
-// scheduler.deleteJob(jobKey);
-//
-// /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-// if (scheduler.checkExists(triggerKey)) {
-// scheduler.unscheduleJob(triggerKey); // trigger + job
-// }*/
-//
-// logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey);
-// return true;
-// }
-//
-//
-// /**
-// * updateJobCron
-// *
-// * @param jobName
-// * @param cronExpression
-// * @return
-// * @throws SchedulerException
-// */
-// public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
-//
-// // 1、job key
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-//
-// // 2、valid
-// if (!scheduler.checkExists(triggerKey)) {
-// return true; // PASS
-// }
-//
-// CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
-//
-// // 3、avoid repeat cron
-// String oldCron = oldTrigger.getCronExpression();
-// if (oldCron.equals(cronExpression)){
-// return true; // PASS
-// }
-//
-// // 4、new cron trigger
-// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
-// oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
-//
-// // 5、rescheduleJob
-// scheduler.rescheduleJob(triggerKey, oldTrigger);
-//
-// /*
-// JobKey jobKey = new JobKey(jobName);
-//
-// // old job detail
-// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
-//
-// // new trigger
-// HashSet triggerSet = new HashSet();
-// triggerSet.add(cronTrigger);
-// // cover trigger of job detail
-// scheduler.scheduleJob(jobDetail, triggerSet, true);*/
-//
-// logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
-// return true;
-// }
-//
-//
-// /**
-// * pause
-// *
-// * @param jobName
-// * @return
-// * @throws SchedulerException
-// */
-// /*public static boolean pauseJob(String jobName) throws SchedulerException {
-//
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-//
-// boolean result = false;
-// if (scheduler.checkExists(triggerKey)) {
-// scheduler.pauseTrigger(triggerKey);
-// result = true;
-// }
-//
-// logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey);
-// return result;
-// }*/
-//
-//
-// /**
-// * resume
-// *
-// * @param jobName
-// * @return
-// * @throws SchedulerException
-// */
-// /*public static boolean resumeJob(String jobName) throws SchedulerException {
-//
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-//
-// boolean result = false;
-// if (scheduler.checkExists(triggerKey)) {
-// scheduler.resumeTrigger(triggerKey);
-// result = true;
-// }
-//
-// logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey);
-// return result;
-// }*/
-//
-//
-// /**
-// * run
-// *
-// * @param jobName
-// * @return
-// * @throws SchedulerException
-// */
-// /*public static boolean triggerJob(String jobName) throws SchedulerException {
-// // TriggerKey : name + group
-// JobKey jobKey = new JobKey(jobName);
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
-//
-// boolean result = false;
-// if (scheduler.checkExists(triggerKey)) {
-// scheduler.triggerJob(jobKey);
-// result = true;
-// logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
-// } else {
-// logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
-// }
-// return result;
-// }*/
-//
-//
-// /**
-// * finaAllJobList
-// *
-// * @return
-// *//*
-// @Deprecated
-// public static List> finaAllJobList(){
-// List> jobList = new ArrayList>();
-//
-// try {
-// if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
-// return null;
-// }
-// String groupName = scheduler.getJobGroupNames().get(0);
-// Set jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
-// if (jobKeys!=null && jobKeys.size()>0) {
-// for (JobKey jobKey : jobKeys) {
-// TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
-// Trigger trigger = scheduler.getTrigger(triggerKey);
-// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
-// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
-// Map jobMap = new HashMap();
-// jobMap.put("TriggerKey", triggerKey);
-// jobMap.put("Trigger", trigger);
-// jobMap.put("JobDetail", jobDetail);
-// jobMap.put("TriggerState", triggerState);
-// jobList.add(jobMap);
-// }
-// }
-//
-// } catch (SchedulerException e) {
-// logger.error(e.getMessage(), e);
-// return null;
-// }
-// return jobList;
-// }*/
-//
-//}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java
deleted file mode 100644
index 74f3f9db0..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.quartz;
-//
-//import org.quartz.SchedulerConfigException;
-//import org.quartz.spi.ThreadPool;
-//
-///**
-// * single thread pool, for async trigger
-// *
-// * @author xuxueli 2019-03-06
-// */
-//public class XxlJobThreadPool implements ThreadPool {
-//
-// @Override
-// public boolean runInThread(Runnable runnable) {
-//
-// // async run
-// runnable.run();
-// return true;
-//
-// //return false;
-// }
-//
-// @Override
-// public int blockForAvailableThreads() {
-// return 1;
-// }
-//
-// @Override
-// public void initialize() throws SchedulerConfigException {
-//
-// }
-//
-// @Override
-// public void shutdown(boolean waitForJobsToComplete) {
-//
-// }
-//
-// @Override
-// public int getPoolSize() {
-// return 1;
-// }
-//
-// @Override
-// public void setInstanceId(String schedInstId) {
-//
-// }
-//
-// @Override
-// public void setInstanceName(String schedName) {
-//
-// }
-//
-// // support
-// public void setThreadCount(int count) {
-// //
-// }
-//
-//}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
deleted file mode 100644
index 1903b9333..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.xxl.job.admin.core.route;
-
-import com.xxl.job.admin.core.route.strategy.*;
-import com.xxl.job.admin.core.util.I18nUtil;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public enum ExecutorRouteStrategyEnum {
-
- FIRST(I18nUtil.getString("jobconf_route_first"), new ExecutorRouteFirst()),
- LAST(I18nUtil.getString("jobconf_route_last"), new ExecutorRouteLast()),
- ROUND(I18nUtil.getString("jobconf_route_round"), new ExecutorRouteRound()),
- RANDOM(I18nUtil.getString("jobconf_route_random"), new ExecutorRouteRandom()),
- CONSISTENT_HASH(I18nUtil.getString("jobconf_route_consistenthash"), new ExecutorRouteConsistentHash()),
- LEAST_FREQUENTLY_USED(I18nUtil.getString("jobconf_route_lfu"), new ExecutorRouteLFU()),
- LEAST_RECENTLY_USED(I18nUtil.getString("jobconf_route_lru"), new ExecutorRouteLRU()),
- FAILOVER(I18nUtil.getString("jobconf_route_failover"), new ExecutorRouteFailover()),
- BUSYOVER(I18nUtil.getString("jobconf_route_busyover"), new ExecutorRouteBusyover()),
- SHARDING_BROADCAST(I18nUtil.getString("jobconf_route_shard"), null);
-
- ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
- this.title = title;
- this.router = router;
- }
-
- private String title;
- private ExecutorRouter router;
-
- public String getTitle() {
- return title;
- }
-
- public ExecutorRouter getRouter() {
- return router;
- }
-
- public static ExecutorRouteStrategyEnum match(String name, ExecutorRouteStrategyEnum defaultItem) {
- if (name != null) {
- for (ExecutorRouteStrategyEnum item : ExecutorRouteStrategyEnum.values()) {
- if (item.name().equals(name)) {
- return item;
- }
- }
- }
- return defaultItem;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java
deleted file mode 100644
index 7ca0d46ea..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.xxl.job.admin.core.route;
-
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public abstract class ExecutorRouter {
- protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class);
-
- /**
- * route address
- *
- * @param addressList
- * @return ReturnT.content=address
- */
- public abstract ReturnT route(TriggerParam triggerParam, List addressList);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
deleted file mode 100644
index a36fb4cd5..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.ExecutorBiz;
-import com.xxl.job.core.biz.model.IdleBeatParam;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteBusyover extends ExecutorRouter {
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- StringBuffer idleBeatResultSB = new StringBuffer();
- for (String address : addressList) {
- // beat
- ReturnT idleBeatResult = null;
- try {
- ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
- idleBeatResult = executorBiz.idleBeat(new IdleBeatParam(triggerParam.getJobId()));
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- idleBeatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e);
- }
- idleBeatResultSB.append((idleBeatResultSB.length() > 0) ? " " : "")
- .append(I18nUtil.getString("jobconf_idleBeat") + ":")
- .append(" address:").append(address)
- .append(" code:").append(idleBeatResult.getCode())
- .append(" msg:").append(idleBeatResult.getMsg());
-
- // beat success
- if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) {
- idleBeatResult.setMsg(idleBeatResultSB.toString());
- idleBeatResult.setContent(address);
- return idleBeatResult;
- }
- }
-
- return new ReturnT(ReturnT.FAIL_CODE, idleBeatResultSB.toString());
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
deleted file mode 100644
index abd472476..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
- * a、virtual node:解决不均衡问题
- * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteConsistentHash extends ExecutorRouter {
-
- private static int VIRTUAL_NODE_NUM = 100;
-
- /**
- * get hash code on 2^32 ring (md5散列的方式计算hash值)
- *
- * @param key
- * @return
- */
- private static long hash(String key) {
-
- // md5 byte
- MessageDigest md5;
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("MD5 not supported", e);
- }
- md5.reset();
- byte[] keyBytes = null;
- try {
- keyBytes = key.getBytes("UTF-8");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Unknown string :" + key, e);
- }
-
- md5.update(keyBytes);
- byte[] digest = md5.digest();
-
- // hash code, Truncate to 32-bits
- long hashCode = ((long) (digest[3] & 0xFF) << 24)
- | ((long) (digest[2] & 0xFF) << 16)
- | ((long) (digest[1] & 0xFF) << 8)
- | (digest[0] & 0xFF);
-
- long truncateHashCode = hashCode & 0xffffffffL;
- return truncateHashCode;
- }
-
- public String hashJob(int jobId, List addressList) {
-
- // ------A1------A2-------A3------
- // -----------J1------------------
- TreeMap addressRing = new TreeMap();
- for (String address : addressList) {
- for (int i = 0; i < VIRTUAL_NODE_NUM; i++) {
- long addressHash = hash("SHARD-" + address + "-NODE-" + i);
- addressRing.put(addressHash, address);
- }
- }
-
- long jobHash = hash(String.valueOf(jobId));
- SortedMap lastRing = addressRing.tailMap(jobHash);
- if (!lastRing.isEmpty()) {
- return lastRing.get(lastRing.firstKey());
- }
- return addressRing.firstEntry().getValue();
- }
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- String address = hashJob(triggerParam.getJobId(), addressList);
- return new ReturnT(address);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
deleted file mode 100644
index a889fad8a..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.ExecutorBiz;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteFailover extends ExecutorRouter {
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
-
- StringBuffer beatResultSB = new StringBuffer();
- for (String address : addressList) {
- // beat
- ReturnT beatResult = null;
- try {
- ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
- beatResult = executorBiz.beat();
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- beatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e);
- }
- beatResultSB.append((beatResultSB.length() > 0) ? " " : "")
- .append(I18nUtil.getString("jobconf_beat") + ":")
- .append(" address:").append(address)
- .append(" code:").append(beatResult.getCode())
- .append(" msg:").append(beatResult.getMsg());
-
- // beat success
- if (beatResult.getCode() == ReturnT.SUCCESS_CODE) {
-
- beatResult.setMsg(beatResultSB.toString());
- beatResult.setContent(address);
- return beatResult;
- }
- }
- return new ReturnT(ReturnT.FAIL_CODE, beatResultSB.toString());
-
- }
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java
deleted file mode 100644
index a0fe0c7ce..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteFirst extends ExecutorRouter {
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- return new ReturnT(addressList.get(0));
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
deleted file mode 100644
index 5eadf986c..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * 单个JOB对应的每个执行器,使用频率最低的优先被选举
- * a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数
- * b、LRU(Least Recently Used):最近最久未使用,时间
- *
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteLFU extends ExecutorRouter {
-
- private static ConcurrentMap> jobLfuMap = new ConcurrentHashMap>();
- private static long CACHE_VALID_TIME = 0;
-
- public String route(int jobId, List addressList) {
-
- // cache clear
- if (System.currentTimeMillis() > CACHE_VALID_TIME) {
- jobLfuMap.clear();
- CACHE_VALID_TIME = System.currentTimeMillis() + 1000 * 60 * 60 * 24;
- }
-
- // lfu item init
- HashMap lfuItemMap = jobLfuMap.get(jobId); // Key排序可以用TreeMap+构造入参Compare;Value排序暂时只能通过ArrayList;
- if (lfuItemMap == null) {
- lfuItemMap = new HashMap();
- jobLfuMap.putIfAbsent(jobId, lfuItemMap); // 避免重复覆盖
- }
-
- // put new
- for (String address : addressList) {
- if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) > 1000000) {
- lfuItemMap.put(address, new Random().nextInt(addressList.size())); // 初始化时主动Random一次,缓解首次压力
- }
- }
- // remove old
- List delKeys = new ArrayList<>();
- for (String existKey : lfuItemMap.keySet()) {
- if (!addressList.contains(existKey)) {
- delKeys.add(existKey);
- }
- }
- if (delKeys.size() > 0) {
- for (String delKey : delKeys) {
- lfuItemMap.remove(delKey);
- }
- }
-
- // load least userd count address
- List> lfuItemList = new ArrayList>(lfuItemMap.entrySet());
- Collections.sort(lfuItemList, new Comparator>() {
- @Override
- public int compare(Map.Entry o1, Map.Entry o2) {
- return o1.getValue().compareTo(o2.getValue());
- }
- });
-
- Map.Entry addressItem = lfuItemList.get(0);
- String minAddress = addressItem.getKey();
- addressItem.setValue(addressItem.getValue() + 1);
-
- return addressItem.getKey();
- }
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- String address = route(triggerParam.getJobId(), addressList);
- return new ReturnT(address);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
deleted file mode 100644
index 02c9424e1..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * 单个JOB对应的每个执行器,最久为使用的优先被选举
- * a、LFU(Least Frequently Used):最不经常使用,频率/次数
- * b(*)、LRU(Least Recently Used):最近最久未使用,时间
- *
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteLRU extends ExecutorRouter {
-
- private static ConcurrentMap> jobLRUMap = new ConcurrentHashMap>();
- private static long CACHE_VALID_TIME = 0;
-
- public String route(int jobId, List addressList) {
-
- // cache clear
- if (System.currentTimeMillis() > CACHE_VALID_TIME) {
- jobLRUMap.clear();
- CACHE_VALID_TIME = System.currentTimeMillis() + 1000 * 60 * 60 * 24;
- }
-
- // init lru
- LinkedHashMap lruItem = jobLRUMap.get(jobId);
- if (lruItem == null) {
- /**
- * LinkedHashMap
- * a、accessOrder:true=访问顺序排序(get/put时排序);false=插入顺序排期;
- * b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法;
- */
- lruItem = new LinkedHashMap(16, 0.75f, true);
- jobLRUMap.putIfAbsent(jobId, lruItem);
- }
-
- // put new
- for (String address : addressList) {
- if (!lruItem.containsKey(address)) {
- lruItem.put(address, address);
- }
- }
- // remove old
- List delKeys = new ArrayList<>();
- for (String existKey : lruItem.keySet()) {
- if (!addressList.contains(existKey)) {
- delKeys.add(existKey);
- }
- }
- if (delKeys.size() > 0) {
- for (String delKey : delKeys) {
- lruItem.remove(delKey);
- }
- }
-
- // load
- String eldestKey = lruItem.entrySet().iterator().next().getKey();
- String eldestValue = lruItem.get(eldestKey);
- return eldestValue;
- }
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- String address = route(triggerParam.getJobId(), addressList);
- return new ReturnT(address);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java
deleted file mode 100644
index d96059ded..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteLast extends ExecutorRouter {
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- return new ReturnT(addressList.get(addressList.size() - 1));
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java
deleted file mode 100644
index 5ea4a3841..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-import java.util.Random;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteRandom extends ExecutorRouter {
-
- private static Random localRandom = new Random();
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- String address = addressList.get(localRandom.nextInt(addressList.size()));
- return new ReturnT(address);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
deleted file mode 100644
index dfea0ef3f..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xxl.job.admin.core.route.strategy;
-
-import com.xxl.job.admin.core.route.ExecutorRouter;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Created by xuxueli on 17/3/10.
- */
-public class ExecutorRouteRound extends ExecutorRouter {
-
- private static ConcurrentMap routeCountEachJob = new ConcurrentHashMap<>();
- private static long CACHE_VALID_TIME = 0;
-
- private static int count(int jobId) {
- // cache clear
- if (System.currentTimeMillis() > CACHE_VALID_TIME) {
- routeCountEachJob.clear();
- CACHE_VALID_TIME = System.currentTimeMillis() + 1000 * 60 * 60 * 24;
- }
-
- AtomicInteger count = routeCountEachJob.get(jobId);
- if (count == null || count.get() > 1000000) {
- // 初始化时主动Random一次,缓解首次压力
- count = new AtomicInteger(new Random().nextInt(100));
- } else {
- // count++
- count.addAndGet(1);
- }
- routeCountEachJob.put(jobId, count);
- return count.get();
- }
-
- @Override
- public ReturnT route(TriggerParam triggerParam, List addressList) {
- String address = addressList.get(count(triggerParam.getJobId()) % addressList.size());
- return new ReturnT(address);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java
deleted file mode 100644
index 6abc5d577..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.xxl.job.admin.core.scheduler;
-
-import com.xxl.job.admin.core.util.I18nUtil;
-
-/**
- * @author xuxueli 2020-10-29 21:11:23
- */
-public enum MisfireStrategyEnum {
-
- /**
- * do nothing
- */
- DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing")),
-
- /**
- * fire once now
- */
- FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now"));
-
- private String title;
-
- MisfireStrategyEnum(String title) {
- this.title = title;
- }
-
- public String getTitle() {
- return title;
- }
-
- public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem) {
- for (MisfireStrategyEnum item : MisfireStrategyEnum.values()) {
- if (item.name().equals(name)) {
- return item;
- }
- }
- return defaultItem;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java
deleted file mode 100644
index f01d1fb8a..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xxl.job.admin.core.scheduler;
-
-import com.xxl.job.admin.core.util.I18nUtil;
-
-/**
- * @author xuxueli 2020-10-29 21:11:23
- */
-public enum ScheduleTypeEnum {
-
- NONE(I18nUtil.getString("schedule_type_none")),
-
- /**
- * schedule by cron
- */
- CRON(I18nUtil.getString("schedule_type_cron")),
-
- /**
- * schedule by fixed rate (in seconds)
- */
- FIX_RATE(I18nUtil.getString("schedule_type_fix_rate")),
-
- /**
- * schedule by fix delay (in seconds), after the last time
- */
- /*FIX_DELAY(I18nUtil.getString("schedule_type_fix_delay"))*/;
-
- private String title;
-
- ScheduleTypeEnum(String title) {
- this.title = title;
- }
-
- public String getTitle() {
- return title;
- }
-
- public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem) {
- for (ScheduleTypeEnum item : ScheduleTypeEnum.values()) {
- if (item.name().equals(name)) {
- return item;
- }
- }
- return defaultItem;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
deleted file mode 100644
index 26dba69ee..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.xxl.job.admin.core.scheduler;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.thread.*;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.ExecutorBiz;
-import com.xxl.job.core.biz.client.ExecutorBizClient;
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * @author xuxueli 2018-10-28 00:18:17
- */
-
-public class XxlJobScheduler {
- private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
-
-
- public void init() throws Exception {
- // init i18n
- initI18n();
-
- // admin trigger pool start
- JobTriggerPoolHelper.toStart();
-
- // admin registry monitor run
- JobRegistryHelper.getInstance().start();
-
- // admin fail-monitor run
- JobFailMonitorHelper.getInstance().start();
-
- // admin lose-monitor run ( depend on JobTriggerPoolHelper )
- JobCompleteHelper.getInstance().start();
-
- // admin log report start
- JobLogReportHelper.getInstance().start();
-
- // start-schedule ( depend on JobTriggerPoolHelper )
- JobScheduleHelper.getInstance().start();
-
- logger.info(">>>>>>>>> init xxl-job admin success.");
- }
-
-
- public void destroy() throws Exception {
-
- // stop-schedule
- JobScheduleHelper.getInstance().toStop();
-
- // admin log report stop
- JobLogReportHelper.getInstance().toStop();
-
- // admin lose-monitor stop
- JobCompleteHelper.getInstance().toStop();
-
- // admin fail-monitor stop
- JobFailMonitorHelper.getInstance().toStop();
-
- // admin registry stop
- JobRegistryHelper.getInstance().toStop();
-
- // admin trigger pool stop
- JobTriggerPoolHelper.toStop();
-
- }
-
- // ---------------------- I18n ----------------------
-
- private void initI18n() {
- for (ExecutorBlockStrategyEnum item : ExecutorBlockStrategyEnum.values()) {
- item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
- }
- }
-
- // ---------------------- executor-client ----------------------
- private static ConcurrentMap executorBizRepository = new ConcurrentHashMap();
-
- public static ExecutorBiz getExecutorBiz(String address) throws Exception {
- // valid
- if (address == null || address.trim().length() == 0) {
- return null;
- }
-
- // load-cache
- address = address.trim();
- ExecutorBiz executorBiz = executorBizRepository.get(address);
- if (executorBiz != null) {
- return executorBiz;
- }
-
- // set-cache
- executorBiz = new ExecutorBizClient(address, XxlJobAdminConfig.getAdminConfig().getAccessToken());
-
- executorBizRepository.put(address, executorBiz);
- return executorBiz;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java
deleted file mode 100644
index 37b9bf873..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.complete.XxlJobCompleter;
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.model.HandleCallbackParam;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.util.DateUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.*;
-
-/**
- * job lose-monitor instance
- *
- * @author xuxueli 2015-9-1 18:05:56
- */
-public class JobCompleteHelper {
- private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class);
-
- private static JobCompleteHelper instance = new JobCompleteHelper();
-
- public static JobCompleteHelper getInstance() {
- return instance;
- }
-
- // ---------------------- monitor ----------------------
-
- private ThreadPoolExecutor callbackThreadPool = null;
- private Thread monitorThread;
- private volatile boolean toStop = false;
-
- public void start() {
-
- // for callback
- callbackThreadPool = new ThreadPoolExecutor(
- 2,
- 20,
- 30L,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue(3000),
- new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode());
- }
- },
- new RejectedExecutionHandler() {
- @Override
- public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
- r.run();
- logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now).");
- }
- });
-
-
- // for monitor
- monitorThread = new Thread(new Runnable() {
-
- @Override
- public void run() {
-
- // wait for JobTriggerPoolHelper-init
- try {
- TimeUnit.MILLISECONDS.sleep(50);
- } catch (InterruptedException e) {
- if (!toStop) {
- logger.error(e.getMessage(), e);
- }
- }
-
- // monitor
- while (!toStop) {
- try {
- // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
- Date losedTime = DateUtil.addMinutes(new Date(), -10);
- List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime);
-
- if (losedJobIds != null && losedJobIds.size() > 0) {
- for (Long logId : losedJobIds) {
-
- XxlJobLog jobLog = new XxlJobLog();
- jobLog.setId(logId);
-
- jobLog.setHandleTime(new Date());
- jobLog.setHandleCode(ReturnT.FAIL_CODE);
- jobLog.setHandleMsg(I18nUtil.getString("joblog_lost_fail"));
-
- XxlJobCompleter.updateHandleInfoAndFinish(jobLog);
- }
-
- }
- } catch (Exception e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
- }
- }
-
- try {
- TimeUnit.SECONDS.sleep(60);
- } catch (Exception e) {
- if (!toStop) {
- logger.error(e.getMessage(), e);
- }
- }
-
- }
-
- logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop");
-
- }
- });
- monitorThread.setDaemon(true);
- monitorThread.setName("xxl-job, admin JobLosedMonitorHelper");
- monitorThread.start();
- }
-
- public void toStop() {
- toStop = true;
-
- // stop registryOrRemoveThreadPool
- callbackThreadPool.shutdownNow();
-
- // stop monitorThread (interrupt and wait)
- monitorThread.interrupt();
- try {
- monitorThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
-
- // ---------------------- helper ----------------------
-
- public ReturnT callback(List callbackParamList) {
-
- callbackThreadPool.execute(new Runnable() {
- @Override
- public void run() {
- for (HandleCallbackParam handleCallbackParam : callbackParamList) {
- ReturnT callbackResult = callback(handleCallbackParam);
- logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}",
- (callbackResult.getCode() == ReturnT.SUCCESS_CODE ? "success" : "fail"), handleCallbackParam, callbackResult);
- }
- }
- });
-
- return ReturnT.SUCCESS;
- }
-
- private ReturnT callback(HandleCallbackParam handleCallbackParam) {
- // valid log item
- XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId());
- if (log == null) {
- return new ReturnT(ReturnT.FAIL_CODE, "log item not found.");
- }
- if (log.getHandleCode() > 0) {
- return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc
- }
-
- // handle msg
- StringBuffer handleMsg = new StringBuffer();
- if (log.getHandleMsg() != null) {
- handleMsg.append(log.getHandleMsg()).append(" ");
- }
- if (handleCallbackParam.getHandleMsg() != null) {
- handleMsg.append(handleCallbackParam.getHandleMsg());
- }
-
- // success, save log
- log.setHandleTime(new Date());
- log.setHandleCode(handleCallbackParam.getHandleCode());
- log.setHandleMsg(handleMsg.toString());
- XxlJobCompleter.updateHandleInfoAndFinish(log);
-
- return ReturnT.SUCCESS;
- }
-
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
deleted file mode 100644
index dfebc87b0..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-import com.xxl.job.admin.core.util.I18nUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * job monitor instance
- *
- * @author xuxueli 2015-9-1 18:05:56
- */
-public class JobFailMonitorHelper {
- private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);
-
- private static JobFailMonitorHelper instance = new JobFailMonitorHelper();
-
- public static JobFailMonitorHelper getInstance() {
- return instance;
- }
-
- // ---------------------- monitor ----------------------
-
- private Thread monitorThread;
- private volatile boolean toStop = false;
-
- public void start() {
- monitorThread = new Thread(new Runnable() {
-
- @Override
- public void run() {
-
- // monitor
- while (!toStop) {
- try {
-
- List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000);
- if (failLogIds != null && !failLogIds.isEmpty()) {
- for (long failLogId : failLogIds) {
-
- // lock log
- int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1);
- if (lockRet < 1) {
- continue;
- }
- XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId);
- XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());
-
- // 1、fail retry monitor
- if (log.getExecutorFailRetryCount() > 0) {
- JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount() - 1), log.getExecutorShardingParam(), log.getExecutorParam(), null);
- String retryMsg = " >>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_type_retry") + "<<<<<<<<<<< ";
- log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log);
- }
-
- // 2、fail alarm monitor
- int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败
- if (info != null) {
- boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log);
- newAlarmStatus = alarmResult ? 2 : 3;
- } else {
- newAlarmStatus = 1;
- }
-
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus);
- }
- }
-
- } catch (Exception e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
- }
- }
-
- try {
- TimeUnit.SECONDS.sleep(10);
- } catch (Exception e) {
- if (!toStop) {
- logger.error(e.getMessage(), e);
- }
- }
-
- }
-
- logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop");
-
- }
- });
- monitorThread.setDaemon(true);
- monitorThread.setName("xxl-job, admin JobFailMonitorHelper");
- monitorThread.start();
- }
-
- public void toStop() {
- toStop = true;
- // interrupt and wait
- monitorThread.interrupt();
- try {
- monitorThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
deleted file mode 100644
index 942f7527a..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobLogReport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * job log report helper
- *
- * @author xuxueli 2019-11-22
- */
-public class JobLogReportHelper {
- private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
-
- private static JobLogReportHelper instance = new JobLogReportHelper();
-
- public static JobLogReportHelper getInstance() {
- return instance;
- }
-
-
- private Thread logrThread;
- private volatile boolean toStop = false;
-
- public void start() {
- logrThread = new Thread(new Runnable() {
-
- @Override
- public void run() {
-
- // last clean log time
- long lastCleanLogTime = 0;
-
-
- while (!toStop) {
-
- // 1、log-report refresh: refresh log report in 3 days
- try {
-
- for (int i = 0; i < 3; i++) {
-
- // today
- Calendar itemDay = Calendar.getInstance();
- itemDay.add(Calendar.DAY_OF_MONTH, -i);
- itemDay.set(Calendar.HOUR_OF_DAY, 0);
- itemDay.set(Calendar.MINUTE, 0);
- itemDay.set(Calendar.SECOND, 0);
- itemDay.set(Calendar.MILLISECOND, 0);
-
- Date todayFrom = itemDay.getTime();
-
- itemDay.set(Calendar.HOUR_OF_DAY, 23);
- itemDay.set(Calendar.MINUTE, 59);
- itemDay.set(Calendar.SECOND, 59);
- itemDay.set(Calendar.MILLISECOND, 999);
-
- Date todayTo = itemDay.getTime();
-
- // refresh log-report every minute
- XxlJobLogReport xxlJobLogReport = new XxlJobLogReport();
- xxlJobLogReport.setTriggerDay(todayFrom);
- xxlJobLogReport.setRunningCount(0);
- xxlJobLogReport.setSucCount(0);
- xxlJobLogReport.setFailCount(0);
-
- Map triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLogReport(todayFrom, todayTo);
- if (triggerCountMap != null && triggerCountMap.size() > 0) {
- int triggerDayCount = triggerCountMap.containsKey("triggerDayCount") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))) : 0;
- int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))) : 0;
- int triggerDayCountSuc = triggerCountMap.containsKey("triggerDayCountSuc") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountSuc"))) : 0;
- int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc;
-
- xxlJobLogReport.setRunningCount(triggerDayCountRunning);
- xxlJobLogReport.setSucCount(triggerDayCountSuc);
- xxlJobLogReport.setFailCount(triggerDayCountFail);
- }
-
- // do refresh
- int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport);
- if (ret < 1) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport);
- }
- }
-
- } catch (Exception e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job log report thread error:{}", e);
- }
- }
-
- // 2、log-clean: switch open & once each day
- if (XxlJobAdminConfig.getAdminConfig().getLogretentiondays() > 0
- && System.currentTimeMillis() - lastCleanLogTime > 24 * 60 * 60 * 1000) {
-
- // expire-time
- Calendar expiredDay = Calendar.getInstance();
- expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminConfig.getAdminConfig().getLogretentiondays());
- expiredDay.set(Calendar.HOUR_OF_DAY, 0);
- expiredDay.set(Calendar.MINUTE, 0);
- expiredDay.set(Calendar.SECOND, 0);
- expiredDay.set(Calendar.MILLISECOND, 0);
- Date clearBeforeTime = expiredDay.getTime();
-
- // clean expired log
- List logIds = null;
- do {
- logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
- if (logIds != null && logIds.size() > 0) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds);
- }
- } while (logIds != null && logIds.size() > 0);
-
- // update clean time
- lastCleanLogTime = System.currentTimeMillis();
- }
-
- try {
- TimeUnit.MINUTES.sleep(1);
- } catch (Exception e) {
- if (!toStop) {
- logger.error(e.getMessage(), e);
- }
- }
-
- }
-
- logger.info(">>>>>>>>>>> xxl-job, job log report thread stop");
-
- }
- });
- logrThread.setDaemon(true);
- logrThread.setName("xxl-job, admin JobLogReportHelper");
- logrThread.start();
- }
-
- public void toStop() {
- toStop = true;
- // interrupt and wait
- logrThread.interrupt();
- try {
- logrThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java
deleted file mode 100644
index 681b68417..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobRegistry;
-import com.xxl.job.core.biz.model.RegistryParam;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.enums.RegistryConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-
-import java.util.*;
-import java.util.concurrent.*;
-
-/**
- * job registry instance
- *
- * @author xuxueli 2016-10-02 19:10:24
- */
-public class JobRegistryHelper {
- private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
-
- private static JobRegistryHelper instance = new JobRegistryHelper();
-
- public static JobRegistryHelper getInstance() {
- return instance;
- }
-
- private ThreadPoolExecutor registryOrRemoveThreadPool = null;
- private Thread registryMonitorThread;
- private volatile boolean toStop = false;
-
- public void start() {
-
- // for registry or remove
- registryOrRemoveThreadPool = new ThreadPoolExecutor(
- 2,
- 10,
- 30L,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue(2000),
- new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode());
- }
- },
- new RejectedExecutionHandler() {
- @Override
- public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
- r.run();
- logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now).");
- }
- });
-
- // for monitor
- registryMonitorThread = new Thread(new Runnable() {
- @Override
- public void run() {
- while (!toStop) {
- try {
- // auto registry group
- List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);
- if (groupList != null && !groupList.isEmpty()) {
-
- // remove dead address (admin/executor)
- List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
- if (ids != null && ids.size() > 0) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
- }
-
- // fresh online address (admin/executor)
- HashMap> appAddressMap = new HashMap>();
- List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
- if (list != null) {
- for (XxlJobRegistry item : list) {
- if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
- String appname = item.getRegistryKey();
- List registryList = appAddressMap.get(appname);
- if (registryList == null) {
- registryList = new ArrayList();
- }
-
- if (!registryList.contains(item.getRegistryValue())) {
- registryList.add(item.getRegistryValue());
- }
- appAddressMap.put(appname, registryList);
- }
- }
- }
-
- // fresh group address
- for (XxlJobGroup group : groupList) {
- List registryList = appAddressMap.get(group.getAppname());
- String addressListStr = null;
- if (registryList != null && !registryList.isEmpty()) {
- Collections.sort(registryList);
- StringBuilder addressListSB = new StringBuilder();
- for (String item : registryList) {
- addressListSB.append(item).append(",");
- }
- addressListStr = addressListSB.toString();
- addressListStr = addressListStr.substring(0, addressListStr.length() - 1);
- }
- group.setAddressList(addressListStr);
- group.setUpdateTime(new Date());
-
- XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
- }
- }
- } catch (Exception e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
- }
- }
- try {
- TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
- } catch (InterruptedException e) {
- if (!toStop) {
- logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e);
- }
- }
- }
- logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop");
- }
- });
- registryMonitorThread.setDaemon(true);
- registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread");
- registryMonitorThread.start();
- }
-
- public void toStop() {
- toStop = true;
-
- // stop registryOrRemoveThreadPool
- registryOrRemoveThreadPool.shutdownNow();
-
- // stop monitir (interrupt and wait)
- registryMonitorThread.interrupt();
- try {
- registryMonitorThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
-
- // ---------------------- helper ----------------------
-
- public ReturnT registry(RegistryParam registryParam) {
-
- // valid
- if (!StringUtils.hasText(registryParam.getRegistryGroup())
- || !StringUtils.hasText(registryParam.getRegistryKey())
- || !StringUtils.hasText(registryParam.getRegistryValue())) {
- return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument.");
- }
-
- // async execute
- registryOrRemoveThreadPool.execute(new Runnable() {
- @Override
- public void run() {
- int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
- if (ret < 1) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
-
- // fresh
- freshGroupRegistryInfo(registryParam);
- }
- }
- });
-
- return ReturnT.SUCCESS;
- }
-
- public ReturnT registryRemove(RegistryParam registryParam) {
-
- // valid
- if (!StringUtils.hasText(registryParam.getRegistryGroup())
- || !StringUtils.hasText(registryParam.getRegistryKey())
- || !StringUtils.hasText(registryParam.getRegistryValue())) {
- return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument.");
- }
-
- // async execute
- registryOrRemoveThreadPool.execute(new Runnable() {
- @Override
- public void run() {
- int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
- if (ret > 0) {
- // fresh
- freshGroupRegistryInfo(registryParam);
- }
- }
- });
-
- return ReturnT.SUCCESS;
- }
-
- private void freshGroupRegistryInfo(RegistryParam registryParam) {
- // Under consideration, prevent affecting core tables
- }
-
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
deleted file mode 100644
index 69ffdb3cc..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
+++ /dev/null
@@ -1,370 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.cron.CronExpression;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;
-import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author xuxueli 2019-05-21
- */
-public class JobScheduleHelper {
- private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);
-
- private static JobScheduleHelper instance = new JobScheduleHelper();
-
- public static JobScheduleHelper getInstance() {
- return instance;
- }
-
- public static final long PRE_READ_MS = 5000; // pre read
-
- private Thread scheduleThread;
- private Thread ringThread;
- private volatile boolean scheduleThreadToStop = false;
- private volatile boolean ringThreadToStop = false;
- private volatile static Map> ringData = new ConcurrentHashMap<>();
-
- public void start() {
-
- // schedule thread
- scheduleThread = new Thread(new Runnable() {
- @Override
- public void run() {
-
- try {
- TimeUnit.MILLISECONDS.sleep(5000 - System.currentTimeMillis() % 1000);
- } catch (InterruptedException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
-
- // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
- int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20;
-
- while (!scheduleThreadToStop) {
-
- // Scan Job
- long start = System.currentTimeMillis();
-
- Connection conn = null;
- Boolean connAutoCommit = null;
- PreparedStatement preparedStatement = null;
-
- boolean preReadSuc = true;
- try {
-
- conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();
- connAutoCommit = conn.getAutoCommit();
- conn.setAutoCommit(false);
-
- preparedStatement = conn.prepareStatement("select * from xxl_job_lock where lock_name = 'schedule_lock' for update");
- preparedStatement.execute();
-
- // tx start
-
- // 1、pre read
- long nowTime = System.currentTimeMillis();
- List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
- if (scheduleList != null && scheduleList.size() > 0) {
- // 2、push time-ring
- for (XxlJobInfo jobInfo : scheduleList) {
-
- // time-ring jump
- if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) {
- // 2.1、trigger-expire > 5s:pass && make next-trigger-time
- logger.warn(">>>>>>>>>>> xxl-job, schedule misfire, jobId = " + jobInfo.getId());
-
- // 1、misfire match
- MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING);
- if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) {
- // FIRE_ONCE_NOW 》 trigger
- JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);
- logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId());
- }
-
- // 2、fresh next
- refreshNextValidTime(jobInfo, new Date());
-
- } else if (nowTime > jobInfo.getTriggerNextTime()) {
- // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
-
- // 1、trigger
- JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null);
- logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId());
-
- // 2、fresh next
- refreshNextValidTime(jobInfo, new Date());
-
- // next-trigger-time in 5s, pre-read again
- if (jobInfo.getTriggerStatus() == 1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) {
-
- // 1、make ring second
- int ringSecond = (int) ((jobInfo.getTriggerNextTime() / 1000) % 60);
-
- // 2、push time ring
- pushTimeRing(ringSecond, jobInfo.getId());
-
- // 3、fresh next
- refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime()));
-
- }
-
- } else {
- // 2.3、trigger-pre-read:time-ring trigger && make next-trigger-time
-
- // 1、make ring second
- int ringSecond = (int) ((jobInfo.getTriggerNextTime() / 1000) % 60);
-
- // 2、push time ring
- pushTimeRing(ringSecond, jobInfo.getId());
-
- // 3、fresh next
- refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime()));
-
- }
-
- }
-
- // 3、update trigger info
- for (XxlJobInfo jobInfo : scheduleList) {
- XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleUpdate(jobInfo);
- }
-
- } else {
- preReadSuc = false;
- }
-
- // tx stop
-
-
- } catch (Exception e) {
- if (!scheduleThreadToStop) {
- logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e);
- }
- } finally {
-
- // commit
- if (conn != null) {
- try {
- conn.commit();
- } catch (SQLException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- try {
- conn.setAutoCommit(connAutoCommit);
- } catch (SQLException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- try {
- conn.close();
- } catch (SQLException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- }
-
- // close PreparedStatement
- if (null != preparedStatement) {
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- }
- }
- long cost = System.currentTimeMillis() - start;
-
-
- // Wait seconds, align second
- if (cost < 1000) { // scan-overtime, not wait
- try {
- // pre-read period: success > scan each second; fail > skip this period;
- TimeUnit.MILLISECONDS.sleep((preReadSuc ? 1000 : PRE_READ_MS) - System.currentTimeMillis() % 1000);
- } catch (InterruptedException e) {
- if (!scheduleThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
- }
-
- }
-
- logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread stop");
- }
- });
- scheduleThread.setDaemon(true);
- scheduleThread.setName("xxl-job, admin JobScheduleHelper#scheduleThread");
- scheduleThread.start();
-
-
- // ring thread
- ringThread = new Thread(new Runnable() {
- @Override
- public void run() {
-
- while (!ringThreadToStop) {
-
- // align second
- try {
- TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000);
- } catch (InterruptedException e) {
- if (!ringThreadToStop) {
- logger.error(e.getMessage(), e);
- }
- }
-
- try {
- // second data
- List ringItemData = new ArrayList<>();
- int nowSecond = Calendar.getInstance().get(Calendar.SECOND); // 避免处理耗时太长,跨过刻度,向前校验一个刻度;
- for (int i = 0; i < 2; i++) {
- List tmpData = ringData.remove((nowSecond + 60 - i) % 60);
- if (tmpData != null) {
- ringItemData.addAll(tmpData);
- }
- }
-
- // ring trigger
- logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData));
- if (ringItemData.size() > 0) {
- // do trigger
- for (int jobId : ringItemData) {
- // do trigger
- JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null);
- }
- // clear
- ringItemData.clear();
- }
- } catch (Exception e) {
- if (!ringThreadToStop) {
- logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e);
- }
- }
- }
- logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop");
- }
- });
- ringThread.setDaemon(true);
- ringThread.setName("xxl-job, admin JobScheduleHelper#ringThread");
- ringThread.start();
- }
-
- private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {
- Date nextValidTime = generateNextValidTime(jobInfo, fromTime);
- if (nextValidTime != null) {
- jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
- jobInfo.setTriggerNextTime(nextValidTime.getTime());
- } else {
- jobInfo.setTriggerStatus(0);
- jobInfo.setTriggerLastTime(0);
- jobInfo.setTriggerNextTime(0);
- logger.warn(">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}",
- jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf());
- }
- }
-
- private void pushTimeRing(int ringSecond, int jobId) {
- // push async ring
- List ringItemData = ringData.get(ringSecond);
- if (ringItemData == null) {
- ringItemData = new ArrayList();
- ringData.put(ringSecond, ringItemData);
- }
- ringItemData.add(jobId);
-
- logger.debug(">>>>>>>>>>> xxl-job, schedule push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData));
- }
-
- public void toStop() {
-
- // 1、stop schedule
- scheduleThreadToStop = true;
- try {
- TimeUnit.SECONDS.sleep(1); // wait
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- if (scheduleThread.getState() != Thread.State.TERMINATED) {
- // interrupt and wait
- scheduleThread.interrupt();
- try {
- scheduleThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
- // if has ring data
- boolean hasRingData = false;
- if (!ringData.isEmpty()) {
- for (int second : ringData.keySet()) {
- List tmpData = ringData.get(second);
- if (tmpData != null && tmpData.size() > 0) {
- hasRingData = true;
- break;
- }
- }
- }
- if (hasRingData) {
- try {
- TimeUnit.SECONDS.sleep(8);
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
- // stop ring (wait job-in-memory stop)
- ringThreadToStop = true;
- try {
- TimeUnit.SECONDS.sleep(1);
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- if (ringThread.getState() != Thread.State.TERMINATED) {
- // interrupt and wait
- ringThread.interrupt();
- try {
- ringThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
- logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop");
- }
-
-
- // ---------------------- tools ----------------------
- public static Date generateNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {
- ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);
- if (ScheduleTypeEnum.CRON == scheduleTypeEnum) {
- Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime);
- return nextValidTime;
- } else if (ScheduleTypeEnum.FIX_RATE == scheduleTypeEnum /*|| ScheduleTypeEnum.FIX_DELAY == scheduleTypeEnum*/) {
- return new Date(fromTime.getTime() + Integer.valueOf(jobInfo.getScheduleConf()) * 1000);
- }
- return null;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
deleted file mode 100644
index 775b916b1..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.xxl.job.admin.core.thread;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
-import com.xxl.job.admin.core.trigger.XxlJobTrigger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * job trigger thread pool helper
- *
- * @author xuxueli 2018-07-03 21:08:07
- */
-public class JobTriggerPoolHelper {
- private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
-
-
- // ---------------------- trigger pool ----------------------
-
- // fast/slow thread pool
- private ThreadPoolExecutor fastTriggerPool = null;
- private ThreadPoolExecutor slowTriggerPool = null;
-
- public void start() {
- fastTriggerPool = new ThreadPoolExecutor(
- 10,
- XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),
- 60L,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue(1000),
- new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
- }
- });
-
- slowTriggerPool = new ThreadPoolExecutor(
- 10,
- XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),
- 60L,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue(2000),
- new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
- }
- });
- }
-
-
- public void stop() {
- //triggerPool.shutdown();
- fastTriggerPool.shutdownNow();
- slowTriggerPool.shutdownNow();
- logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
- }
-
-
- // job timeout count
- private volatile long minTim = System.currentTimeMillis() / 60000; // ms > min
- private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>();
-
-
- /**
- * add trigger
- */
- public void addTrigger(final int jobId,
- final TriggerTypeEnum triggerType,
- final int failRetryCount,
- final String executorShardingParam,
- final String executorParam,
- final String addressList) {
-
- // choose thread pool
- ThreadPoolExecutor triggerPool_ = fastTriggerPool;
- AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId);
- if (jobTimeoutCount != null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min
- triggerPool_ = slowTriggerPool;
- }
-
- // trigger
- triggerPool_.execute(new Runnable() {
- @Override
- public void run() {
-
- long start = System.currentTimeMillis();
-
- try {
- // do trigger
- XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- } finally {
-
- // check timeout-count-map
- long minTim_now = System.currentTimeMillis() / 60000;
- if (minTim != minTim_now) {
- minTim = minTim_now;
- jobTimeoutCountMap.clear();
- }
-
- // incr timeout-count-map
- long cost = System.currentTimeMillis() - start;
- if (cost > 500) { // ob-timeout threshold 500ms
- AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1));
- if (timeoutCount != null) {
- timeoutCount.incrementAndGet();
- }
- }
-
- }
-
- }
- });
- }
-
-
- // ---------------------- helper ----------------------
-
- private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
-
- public static void toStart() {
- helper.start();
- }
-
- public static void toStop() {
- helper.stop();
- }
-
- /**
- * @param jobId
- * @param triggerType
- * @param failRetryCount >=0: use this param
- * <0: use param from job info config
- * @param executorShardingParam
- * @param executorParam null: use job param
- * not null: cover job param
- */
- public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) {
- helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java
deleted file mode 100644
index 0402a19ba..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.xxl.job.admin.core.trigger;
-
-import com.xxl.job.admin.core.util.I18nUtil;
-
-/**
- * trigger type enum
- *
- * @author xuxueli 2018-09-16 04:56:41
- */
-public enum TriggerTypeEnum {
-
- MANUAL(I18nUtil.getString("jobconf_trigger_type_manual")),
- CRON(I18nUtil.getString("jobconf_trigger_type_cron")),
- RETRY(I18nUtil.getString("jobconf_trigger_type_retry")),
- PARENT(I18nUtil.getString("jobconf_trigger_type_parent")),
- API(I18nUtil.getString("jobconf_trigger_type_api")),
- MISFIRE(I18nUtil.getString("jobconf_trigger_type_misfire"));
-
- private TriggerTypeEnum(String title) {
- this.title = title;
- }
-
- private String title;
-
- public String getTitle() {
- return title;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
deleted file mode 100644
index ce2914a56..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package com.xxl.job.admin.core.trigger;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLog;
-import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.core.biz.ExecutorBiz;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.biz.model.TriggerParam;
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
-import com.xxl.job.core.util.IpUtil;
-import com.xxl.job.core.util.ThrowableUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-
-/**
- * xxl-job trigger
- * Created by xuxueli on 17/7/13.
- */
-public class XxlJobTrigger {
- private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);
-
- /**
- * trigger job
- *
- * @param jobId
- * @param triggerType
- * @param failRetryCount >=0: use this param
- * <0: use param from job info config
- * @param executorShardingParam
- * @param executorParam null: use job param
- * not null: cover job param
- * @param addressList null: use executor addressList
- * not null: cover
- */
- public static void trigger(int jobId,
- TriggerTypeEnum triggerType,
- int failRetryCount,
- String executorShardingParam,
- String executorParam,
- String addressList) {
-
- // load data
- XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId);
- if (jobInfo == null) {
- logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
- return;
- }
- if (executorParam != null) {
- jobInfo.setExecutorParam(executorParam);
- }
- int finalFailRetryCount = failRetryCount >= 0 ? failRetryCount : jobInfo.getExecutorFailRetryCount();
- XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup());
-
- // cover addressList
- if (addressList != null && addressList.trim().length() > 0) {
- group.setAddressType(1);
- group.setAddressList(addressList.trim());
- }
-
- // sharding param
- int[] shardingParam = null;
- if (executorShardingParam != null) {
- String[] shardingArr = executorShardingParam.split("/");
- if (shardingArr.length == 2 && isNumeric(shardingArr[0]) && isNumeric(shardingArr[1])) {
- shardingParam = new int[2];
- shardingParam[0] = Integer.valueOf(shardingArr[0]);
- shardingParam[1] = Integer.valueOf(shardingArr[1]);
- }
- }
- if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)
- && group.getRegistryList() != null && !group.getRegistryList().isEmpty()
- && shardingParam == null) {
- for (int i = 0; i < group.getRegistryList().size(); i++) {
- processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size());
- }
- } else {
- if (shardingParam == null) {
- shardingParam = new int[]{0, 1};
- }
- processTrigger(group, jobInfo, finalFailRetryCount, triggerType, shardingParam[0], shardingParam[1]);
- }
-
- }
-
- private static boolean isNumeric(String str) {
- try {
- int result = Integer.valueOf(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
-
- /**
- * @param group job group, registry list may be empty
- * @param jobInfo
- * @param finalFailRetryCount
- * @param triggerType
- * @param index sharding index
- * @param total sharding index
- */
- private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total) {
-
- // param
- ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION); // block strategy
- ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null); // route strategy
- String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) ? String.valueOf(index).concat("/").concat(String.valueOf(total)) : null;
-
- // 1、save log-id
- XxlJobLog jobLog = new XxlJobLog();
- jobLog.setJobGroup(jobInfo.getJobGroup());
- jobLog.setJobId(jobInfo.getId());
- jobLog.setTriggerTime(new Date());
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);
- logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
-
- // 2、init trigger-param
- TriggerParam triggerParam = new TriggerParam();
- triggerParam.setJobId(jobInfo.getId());
- triggerParam.setExecutorHandler(jobInfo.getExecutorHandler());
- triggerParam.setExecutorParams(jobInfo.getExecutorParam());
- triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
- triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout());
- triggerParam.setLogId(jobLog.getId());
- triggerParam.setLogDateTime(jobLog.getTriggerTime().getTime());
- triggerParam.setGlueType(jobInfo.getGlueType());
- triggerParam.setGlueSource(jobInfo.getGlueSource());
- triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());
- triggerParam.setBroadcastIndex(index);
- triggerParam.setBroadcastTotal(total);
-
- // 3、init address
- String address = null;
- ReturnT routeAddressResult = null;
- if (group.getRegistryList() != null && !group.getRegistryList().isEmpty()) {
- if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) {
- if (index < group.getRegistryList().size()) {
- address = group.getRegistryList().get(index);
- } else {
- address = group.getRegistryList().get(0);
- }
- } else {
- routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList());
- if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) {
- address = routeAddressResult.getContent();
- }
- }
- } else {
- routeAddressResult = new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("jobconf_trigger_address_empty"));
- }
-
- // 4、trigger remote executor
- ReturnT triggerResult = null;
- if (address != null) {
- triggerResult = runExecutor(triggerParam, address);
- } else {
- triggerResult = new ReturnT(ReturnT.FAIL_CODE, null);
- }
-
- // 5、collection trigger info
- StringBuffer triggerMsgSb = new StringBuffer();
- triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append(":").append(triggerType.getTitle());
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":").append(IpUtil.getIp());
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":")
- .append((group.getAddressType() == 0) ? I18nUtil.getString("jobgroup_field_addressType_0") : I18nUtil.getString("jobgroup_field_addressType_1"));
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle());
- if (shardingParam != null) {
- triggerMsgSb.append("(" + shardingParam + ")");
- }
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobinfo_field_timeout")).append(":").append(jobInfo.getExecutorTimeout());
- triggerMsgSb.append(" ").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":").append(finalFailRetryCount);
-
- triggerMsgSb.append(" >>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_run") + "<<<<<<<<<<< ")
- .append((routeAddressResult != null && routeAddressResult.getMsg() != null) ? routeAddressResult.getMsg() + " " : "").append(triggerResult.getMsg() != null ? triggerResult.getMsg() : "");
-
- // 6、save log trigger-info
- jobLog.setExecutorAddress(address);
- jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
- jobLog.setExecutorParam(jobInfo.getExecutorParam());
- jobLog.setExecutorShardingParam(shardingParam);
- jobLog.setExecutorFailRetryCount(finalFailRetryCount);
- //jobLog.setTriggerTime();
- jobLog.setTriggerCode(triggerResult.getCode());
- jobLog.setTriggerMsg(triggerMsgSb.toString());
- XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(jobLog);
-
- logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId());
- }
-
- /**
- * run executor
- *
- * @param triggerParam
- * @param address
- * @return
- */
- public static ReturnT runExecutor(TriggerParam triggerParam, String address) {
- ReturnT runResult = null;
- try {
- ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
- runResult = executorBiz.run(triggerParam);
- } catch (Exception e) {
- logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);
- runResult = new ReturnT(ReturnT.FAIL_CODE, ThrowableUtil.toString(e));
- }
-
- StringBuffer runResultSB = new StringBuffer(I18nUtil.getString("jobconf_trigger_run") + ":");
- runResultSB.append(" address:").append(address);
- runResultSB.append(" code:").append(runResult.getCode());
- runResultSB.append(" msg:").append(runResult.getMsg());
-
- runResult.setMsg(runResultSB.toString());
- return runResult;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java
deleted file mode 100644
index bb9abd777..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.xxl.job.admin.core.util;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Cookie.Util
- *
- * @author xuxueli 2015-12-12 18:01:06
- */
-public class CookieUtil {
-
- // 默认缓存时间,单位/秒, 2H
- private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE;
- // 保存路径,根路径
- private static final String COOKIE_PATH = "/";
-
- /**
- * 保存
- *
- * @param response
- * @param key
- * @param value
- * @param ifRemember
- */
- public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) {
- int age = ifRemember ? COOKIE_MAX_AGE : -1;
- set(response, key, value, null, COOKIE_PATH, age, true);
- }
-
- /**
- * 保存
- *
- * @param response
- * @param key
- * @param value
- * @param maxAge
- */
- private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) {
- Cookie cookie = new Cookie(key, value);
- if (domain != null) {
- cookie.setDomain(domain);
- }
- cookie.setPath(path);
- cookie.setMaxAge(maxAge);
- cookie.setHttpOnly(isHttpOnly);
- response.addCookie(cookie);
- }
-
- /**
- * 查询value
- *
- * @param request
- * @param key
- * @return
- */
- public static String getValue(HttpServletRequest request, String key) {
- Cookie cookie = get(request, key);
- if (cookie != null) {
- return cookie.getValue();
- }
- return null;
- }
-
- /**
- * 查询Cookie
- *
- * @param request
- * @param key
- */
- private static Cookie get(HttpServletRequest request, String key) {
- Cookie[] arr_cookie = request.getCookies();
- if (arr_cookie != null && arr_cookie.length > 0) {
- for (Cookie cookie : arr_cookie) {
- if (cookie.getName().equals(key)) {
- return cookie;
- }
- }
- }
- return null;
- }
-
- /**
- * 删除Cookie
- *
- * @param request
- * @param response
- * @param key
- */
- public static void remove(HttpServletRequest request, HttpServletResponse response, String key) {
- Cookie cookie = get(request, key);
- if (cookie != null) {
- set(response, key, "", null, COOKIE_PATH, 0, true);
- }
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java
deleted file mode 100644
index e90af434f..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.xxl.job.admin.core.util;
-
-import freemarker.ext.beans.BeansWrapper;
-import freemarker.ext.beans.BeansWrapperBuilder;
-import freemarker.template.Configuration;
-import freemarker.template.TemplateHashModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * ftl util
- *
- * @author xuxueli 2018-01-17 20:37:48
- */
-public class FtlUtil {
- private static Logger logger = LoggerFactory.getLogger(FtlUtil.class);
-
- private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build(); //BeansWrapper.getDefaultInstance();
-
- public static TemplateHashModel generateStaticModel(String packageName) {
- try {
- TemplateHashModel staticModels = wrapper.getStaticModels();
- TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);
- return fileStatics;
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- return null;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java
deleted file mode 100644
index 4c8cc5c08..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.xxl.job.admin.core.util;
-
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.EncodedResource;
-import org.springframework.core.io.support.PropertiesLoaderUtils;
-
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * i18n util
- *
- * @author xuxueli 2018-01-17 20:39:06
- */
-public class I18nUtil {
- private static Logger logger = LoggerFactory.getLogger(I18nUtil.class);
-
- private static Properties prop = null;
-
- public static Properties loadI18nProp() {
- if (prop != null) {
- return prop;
- }
- try {
- // build i18n prop
- String i18n = XxlJobAdminConfig.getAdminConfig().getI18n();
- String i18nFile = MessageFormat.format("i18n/message_{0}.properties", i18n);
-
- // load prop
- Resource resource = new ClassPathResource(i18nFile);
- EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
- prop = PropertiesLoaderUtils.loadProperties(encodedResource);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- return prop;
- }
-
- /**
- * get val of i18n key
- *
- * @param key
- * @return
- */
- public static String getString(String key) {
- return loadI18nProp().getProperty(key);
- }
-
- /**
- * get mult val of i18n mult key, as json
- *
- * @param keys
- * @return
- */
- public static String getMultString(String... keys) {
- Map map = new HashMap();
-
- Properties prop = loadI18nProp();
- if (keys != null && keys.length > 0) {
- for (String key : keys) {
- map.put(key, prop.getProperty(key));
- }
- } else {
- for (String key : prop.stringPropertyNames()) {
- map.put(key, prop.getProperty(key));
- }
- }
-
- String json = JacksonUtil.writeValueAsString(map);
- return json;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java
deleted file mode 100644
index 0312b7479..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.xxl.job.admin.core.util;
-
-import com.fasterxml.jackson.core.JsonGenerationException;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * Jackson util
- *
- * 1、obj need private and set/get;
- * 2、do not support inner class;
- *
- * @author xuxueli 2015-9-25 18:02:56
- */
-public class JacksonUtil {
- private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
-
- private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
- public static ObjectMapper getInstance() {
- return OBJECT_MAPPER;
- }
-
- /**
- * bean、array、List、Map --> json
- *
- * @param obj
- * @return json string
- * @throws Exception
- */
- public static String writeValueAsString(Object obj) {
- try {
- return getInstance().writeValueAsString(obj);
- } catch (JsonGenerationException e) {
- logger.error(e.getMessage(), e);
- } catch (JsonMappingException e) {
- logger.error(e.getMessage(), e);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- return null;
- }
-
- /**
- * string --> bean、Map、List(array)
- *
- * @param jsonStr
- * @param clazz
- * @return obj
- * @throws Exception
- */
- public static T readValue(String jsonStr, Class clazz) {
- try {
- return getInstance().readValue(jsonStr, clazz);
- } catch (JsonParseException e) {
- logger.error(e.getMessage(), e);
- } catch (JsonMappingException e) {
- logger.error(e.getMessage(), e);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- return null;
- }
-
- /**
- * string --> List...
- *
- * @param jsonStr
- * @param parametrized
- * @param parameterClasses
- * @param
- * @return
- */
- public static T readValue(String jsonStr, Class> parametrized, Class>... parameterClasses) {
- try {
- JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses);
- return getInstance().readValue(jsonStr, javaType);
- } catch (JsonParseException e) {
- logger.error(e.getMessage(), e);
- } catch (JsonMappingException e) {
- logger.error(e.getMessage(), e);
- } catch (IOException e) {
- logger.error(e.getMessage(), e);
- }
- return null;
- }
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java
deleted file mode 100644
index 6232afac7..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package com.xxl.job.admin.core.util;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * local cache tool
- *
- * @author xuxueli 2018-01-22 21:37:34
- */
-public class LocalCacheUtil {
-
- private static ConcurrentMap cacheRepository = new ConcurrentHashMap(); // 类型建议用抽象父类,兼容性更好;
-
- private static class LocalCacheData {
- private String key;
- private Object val;
- private long timeoutTime;
-
- public LocalCacheData() {
- }
-
- public LocalCacheData(String key, Object val, long timeoutTime) {
- this.key = key;
- this.val = val;
- this.timeoutTime = timeoutTime;
- }
-
- public String getKey() {
- return key;
- }
-
- public void setKey(String key) {
- this.key = key;
- }
-
- public Object getVal() {
- return val;
- }
-
- public void setVal(Object val) {
- this.val = val;
- }
-
- public long getTimeoutTime() {
- return timeoutTime;
- }
-
- public void setTimeoutTime(long timeoutTime) {
- this.timeoutTime = timeoutTime;
- }
- }
-
-
- /**
- * set cache
- *
- * @param key
- * @param val
- * @param cacheTime
- * @return
- */
- public static boolean set(String key, Object val, long cacheTime) {
-
- // clean timeout cache, before set new cache (avoid cache too much)
- cleanTimeoutCache();
-
- // set new cache
- if (key == null || key.trim().length() == 0) {
- return false;
- }
- if (val == null) {
- remove(key);
- }
- if (cacheTime <= 0) {
- remove(key);
- }
- long timeoutTime = System.currentTimeMillis() + cacheTime;
- LocalCacheData localCacheData = new LocalCacheData(key, val, timeoutTime);
- cacheRepository.put(localCacheData.getKey(), localCacheData);
- return true;
- }
-
- /**
- * remove cache
- *
- * @param key
- * @return
- */
- public static boolean remove(String key) {
- if (key == null || key.trim().length() == 0) {
- return false;
- }
- cacheRepository.remove(key);
- return true;
- }
-
- /**
- * get cache
- *
- * @param key
- * @return
- */
- public static Object get(String key) {
- if (key == null || key.trim().length() == 0) {
- return null;
- }
- LocalCacheData localCacheData = cacheRepository.get(key);
- if (localCacheData != null && System.currentTimeMillis() < localCacheData.getTimeoutTime()) {
- return localCacheData.getVal();
- } else {
- remove(key);
- return null;
- }
- }
-
- /**
- * clean timeout cache
- *
- * @return
- */
- public static boolean cleanTimeoutCache() {
- if (!cacheRepository.keySet().isEmpty()) {
- for (String key : cacheRepository.keySet()) {
- LocalCacheData localCacheData = cacheRepository.get(key);
- if (localCacheData != null && System.currentTimeMillis() >= localCacheData.getTimeoutTime()) {
- cacheRepository.remove(key);
- }
- }
- }
- return true;
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
deleted file mode 100644
index b608d9fbc..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * Created by xuxueli on 16/9/30.
- */
-@Mapper
-public interface XxlJobGroupDao {
-
- public List findAll();
-
- public List findByAddressType(@Param("addressType") int addressType);
-
- public int save(XxlJobGroup xxlJobGroup);
-
- public int update(XxlJobGroup xxlJobGroup);
-
- public int remove(@Param("id") int id);
-
- public XxlJobGroup load(@Param("id") int id);
-
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("appname") String appname,
- @Param("title") String title);
-
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("appname") String appname,
- @Param("title") String title);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
deleted file mode 100644
index e01dd1121..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-
-/**
- * job info
- *
- * @author xuxueli 2016-1-12 18:03:45
- */
-@Mapper
-public interface XxlJobInfoDao {
-
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("triggerStatus") int triggerStatus,
- @Param("jobDesc") String jobDesc,
- @Param("executorHandler") String executorHandler,
- @Param("author") String author);
-
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("triggerStatus") int triggerStatus,
- @Param("jobDesc") String jobDesc,
- @Param("executorHandler") String executorHandler,
- @Param("author") String author);
-
- public int save(XxlJobInfo info);
-
- public XxlJobInfo loadById(@Param("id") int id);
-
- public int update(XxlJobInfo xxlJobInfo);
-
- public int delete(@Param("id") long id);
-
- public List getJobsByGroup(@Param("jobGroup") int jobGroup);
-
- public int findAllCount();
-
- public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize);
-
- public int scheduleUpdate(XxlJobInfo xxlJobInfo);
-
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
deleted file mode 100644
index 7beaf7556..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobLog;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * job log
- *
- * @author xuxueli 2016-1-12 18:03:06
- */
-@Mapper
-public interface XxlJobLogDao {
-
- // exist jobId not use jobGroup, not exist use jobGroup
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
- @Param("triggerTimeStart") Date triggerTimeStart,
- @Param("triggerTimeEnd") Date triggerTimeEnd,
- @Param("logStatus") int logStatus);
-
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
- @Param("triggerTimeStart") Date triggerTimeStart,
- @Param("triggerTimeEnd") Date triggerTimeEnd,
- @Param("logStatus") int logStatus);
-
- public XxlJobLog load(@Param("id") long id);
-
- public long save(XxlJobLog xxlJobLog);
-
- public int updateTriggerInfo(XxlJobLog xxlJobLog);
-
- public int updateHandleInfo(XxlJobLog xxlJobLog);
-
- public int delete(@Param("jobId") int jobId);
-
- public Map findLogReport(@Param("from") Date from,
- @Param("to") Date to);
-
- public List findClearLogIds(@Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
- @Param("clearBeforeTime") Date clearBeforeTime,
- @Param("clearBeforeNum") int clearBeforeNum,
- @Param("pagesize") int pagesize);
-
- public int clearLog(@Param("logIds") List logIds);
-
- public List findFailJobLogIds(@Param("pagesize") int pagesize);
-
- public int updateAlarmStatus(@Param("logId") long logId,
- @Param("oldAlarmStatus") int oldAlarmStatus,
- @Param("newAlarmStatus") int newAlarmStatus);
-
- public List findLostJobIds(@Param("losedTime") Date losedTime);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
deleted file mode 100644
index 8b2b414ce..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobLogGlue;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * job log for glue
- *
- * @author xuxueli 2016-5-19 18:04:56
- */
-@Mapper
-public interface XxlJobLogGlueDao {
-
- public int save(XxlJobLogGlue xxlJobLogGlue);
-
- public List findByJobId(@Param("jobId") int jobId);
-
- public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit);
-
- public int deleteByJobId(@Param("jobId") int jobId);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
deleted file mode 100644
index d4e0381a1..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobLogReport;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * job log
- *
- * @author xuxueli 2019-11-22
- */
-@Mapper
-public interface XxlJobLogReportDao {
-
- public int save(XxlJobLogReport xxlJobLogReport);
-
- public int update(XxlJobLogReport xxlJobLogReport);
-
- public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom,
- @Param("triggerDayTo") Date triggerDayTo);
-
- public XxlJobLogReport queryLogReportTotal();
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
deleted file mode 100644
index a68e12c36..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobRegistry;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * Created by xuxueli on 16/9/30.
- */
-@Mapper
-public interface XxlJobRegistryDao {
-
- public List findDead(@Param("timeout") int timeout,
- @Param("nowTime") Date nowTime);
-
- public int removeDead(@Param("ids") List ids);
-
- public List findAll(@Param("timeout") int timeout,
- @Param("nowTime") Date nowTime);
-
- public int registryUpdate(@Param("registryGroup") String registryGroup,
- @Param("registryKey") String registryKey,
- @Param("registryValue") String registryValue,
- @Param("updateTime") Date updateTime);
-
- public int registrySave(@Param("registryGroup") String registryGroup,
- @Param("registryKey") String registryKey,
- @Param("registryValue") String registryValue,
- @Param("updateTime") Date updateTime);
-
- public int registryDelete(@Param("registryGroup") String registryGroup,
- @Param("registryKey") String registryKey,
- @Param("registryValue") String registryValue);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
deleted file mode 100644
index 064ce19f3..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.xxl.job.admin.dao;
-
-import com.xxl.job.admin.core.model.XxlJobUser;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * @author xuxueli 2019-05-04 16:44:59
- */
-@Mapper
-public interface XxlJobUserDao {
-
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("username") String username,
- @Param("role") int role);
-
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("username") String username,
- @Param("role") int role);
-
- public XxlJobUser loadByUserName(@Param("username") String username);
-
- public int save(XxlJobUser xxlJobUser);
-
- public int update(XxlJobUser xxlJobUser);
-
- public int delete(@Param("id") int id);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java
deleted file mode 100644
index 0937b8e95..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.xxl.job.admin.service;
-
-import com.xxl.job.admin.core.model.XxlJobUser;
-import com.xxl.job.admin.core.util.CookieUtil;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.core.util.JacksonUtil;
-import com.xxl.job.admin.dao.XxlJobUserDao;
-import com.xxl.job.core.biz.model.ReturnT;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.util.DigestUtils;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.math.BigInteger;
-
-/**
- * @author xuxueli 2019-05-04 22:13:264
- */
-@Configuration
-public class LoginService {
-
- public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";
-
- @Resource
- private XxlJobUserDao xxlJobUserDao;
-
-
- private String makeToken(XxlJobUser xxlJobUser) {
- String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);
- String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
- return tokenHex;
- }
-
- private XxlJobUser parseToken(String tokenHex) {
- XxlJobUser xxlJobUser = null;
- if (tokenHex != null) {
- String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5)
- xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);
- }
- return xxlJobUser;
- }
-
-
- public ReturnT login(HttpServletRequest request, HttpServletResponse response, String username, String password, boolean ifRemember) {
-
- // param
- if (username == null || username.trim().length() == 0 || password == null || password.trim().length() == 0) {
- return new ReturnT(500, I18nUtil.getString("login_param_empty"));
- }
-
- // valid passowrd
- XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username);
- if (xxlJobUser == null) {
- return new ReturnT(500, I18nUtil.getString("login_param_unvalid"));
- }
- String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes());
- if (!passwordMd5.equals(xxlJobUser.getPassword())) {
- return new ReturnT(500, I18nUtil.getString("login_param_unvalid"));
- }
-
- String loginToken = makeToken(xxlJobUser);
-
- // do login
- CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);
- return ReturnT.SUCCESS;
- }
-
- /**
- * logout
- *
- * @param request
- * @param response
- */
- public ReturnT logout(HttpServletRequest request, HttpServletResponse response) {
- CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);
- return ReturnT.SUCCESS;
- }
-
- /**
- * logout
- *
- * @param request
- * @return
- */
- public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response) {
- String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
- if (cookieToken != null) {
- XxlJobUser cookieUser = null;
- try {
- cookieUser = parseToken(cookieToken);
- } catch (Exception e) {
- logout(request, response);
- }
- if (cookieUser != null) {
- XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername());
- if (dbUser != null) {
- if (cookieUser.getPassword().equals(dbUser.getPassword())) {
- return dbUser;
- }
- }
- }
- }
- return null;
- }
-
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
deleted file mode 100644
index 43c2eff64..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.xxl.job.admin.service;
-
-
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.core.biz.model.ReturnT;
-
-import java.util.Date;
-import java.util.Map;
-
-/**
- * core job action for xxl-job
- *
- * @author xuxueli 2016-5-28 15:30:33
- */
-public interface XxlJobService {
-
- /**
- * page list
- *
- * @param start
- * @param length
- * @param jobGroup
- * @param jobDesc
- * @param executorHandler
- * @param author
- * @return
- */
- public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author);
-
- /**
- * add job
- *
- * @param jobInfo
- * @return
- */
- public ReturnT add(XxlJobInfo jobInfo);
-
- /**
- * update job
- *
- * @param jobInfo
- * @return
- */
- public ReturnT update(XxlJobInfo jobInfo);
-
- /**
- * remove job
- * *
- *
- * @param id
- * @return
- */
- public ReturnT remove(int id);
-
- /**
- * start job
- *
- * @param id
- * @return
- */
- public ReturnT start(int id);
-
- /**
- * stop job
- *
- * @param id
- * @return
- */
- public ReturnT stop(int id);
-
- /**
- * dashboard info
- *
- * @return
- */
- public Map dashboardInfo();
-
- /**
- * chart info
- *
- * @param startDate
- * @param endDate
- * @return
- */
- public ReturnT> chartInfo(Date startDate, Date endDate);
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
deleted file mode 100644
index 3c01e94dc..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.xxl.job.admin.service.impl;
-
-import com.xxl.job.admin.core.thread.JobCompleteHelper;
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
-import com.xxl.job.core.biz.AdminBiz;
-import com.xxl.job.core.biz.model.HandleCallbackParam;
-import com.xxl.job.core.biz.model.RegistryParam;
-import com.xxl.job.core.biz.model.ReturnT;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * @author xuxueli 2017-07-27 21:54:20
- */
-@Service
-public class AdminBizImpl implements AdminBiz {
-
-
- @Override
- public ReturnT callback(List callbackParamList) {
- return JobCompleteHelper.getInstance().callback(callbackParamList);
- }
-
- @Override
- public ReturnT registry(RegistryParam registryParam) {
- return JobRegistryHelper.getInstance().registry(registryParam);
- }
-
- @Override
- public ReturnT registryRemove(RegistryParam registryParam) {
- return JobRegistryHelper.getInstance().registryRemove(registryParam);
- }
-
-}
diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
deleted file mode 100644
index 454610c23..000000000
--- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
+++ /dev/null
@@ -1,435 +0,0 @@
-package com.xxl.job.admin.service.impl;
-
-import com.xxl.job.admin.core.cron.CronExpression;
-import com.xxl.job.admin.core.model.XxlJobGroup;
-import com.xxl.job.admin.core.model.XxlJobInfo;
-import com.xxl.job.admin.core.model.XxlJobLogReport;
-import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
-import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;
-import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;
-import com.xxl.job.admin.core.thread.JobScheduleHelper;
-import com.xxl.job.admin.core.util.I18nUtil;
-import com.xxl.job.admin.dao.*;
-import com.xxl.job.admin.service.XxlJobService;
-import com.xxl.job.core.biz.model.ReturnT;
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
-import com.xxl.job.core.glue.GlueTypeEnum;
-import com.xxl.job.core.util.DateUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.text.MessageFormat;
-import java.util.*;
-
-/**
- * core job action for xxl-job
- *
- * @author xuxueli 2016-5-28 15:30:33
- */
-@Service
-public class XxlJobServiceImpl implements XxlJobService {
- private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class);
-
- @Resource
- private XxlJobGroupDao xxlJobGroupDao;
- @Resource
- private XxlJobInfoDao xxlJobInfoDao;
- @Resource
- public XxlJobLogDao xxlJobLogDao;
- @Resource
- private XxlJobLogGlueDao xxlJobLogGlueDao;
- @Resource
- private XxlJobLogReportDao xxlJobLogReportDao;
-
- @Override
- public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
-
- // page list
- List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
- int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
-
- // package result
- Map maps = new HashMap();
- maps.put("recordsTotal", list_count); // 总记录数
- maps.put("recordsFiltered", list_count); // 过滤后的总记录数
- maps.put("data", list); // 分页列表
- return maps;
- }
-
- @Override
- public ReturnT add(XxlJobInfo jobInfo) {
-
- // valid base
- XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
- if (group == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose") + I18nUtil.getString("jobinfo_field_jobgroup")));
- }
- if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc")));
- }
- if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author")));
- }
-
- // valid trigger
- ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);
- if (scheduleTypeEnum == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- if (scheduleTypeEnum == ScheduleTypeEnum.CRON) {
- if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) {
- return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid"));
- }
- } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) {
- if (jobInfo.getScheduleConf() == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")));
- }
- try {
- int fixSecond = Integer.valueOf(jobInfo.getScheduleConf());
- if (fixSecond < 1) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- } catch (Exception e) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- }
-
- // valid job
- if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype") + I18nUtil.getString("system_unvalid")));
- }
- if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler() == null || jobInfo.getExecutorHandler().trim().length() == 0)) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + "JobHandler"));
- }
- // 》fix "\r" in shell
- if (GlueTypeEnum.GLUE_SHELL == GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource() != null) {
- jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r", ""));
- }
-
- // valid advanced
- if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid")));
- }
- if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid")));
- }
- if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid")));
- }
-
- // 》ChildJobId valid
- if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) {
- String[] childJobIds = jobInfo.getChildJobId().split(",");
- for (String childJobIdItem : childJobIds) {
- if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) {
- XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));
- if (childJobInfo == null) {
- return new ReturnT(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem));
- }
- } else {
- return new ReturnT(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem));
- }
- }
-
- // join , avoid "xxx,,"
- String temp = "";
- for (String item : childJobIds) {
- temp += item + ",";
- }
- temp = temp.substring(0, temp.length() - 1);
-
- jobInfo.setChildJobId(temp);
- }
-
- // add in db
- jobInfo.setAddTime(new Date());
- jobInfo.setUpdateTime(new Date());
- jobInfo.setGlueUpdatetime(new Date());
- xxlJobInfoDao.save(jobInfo);
- if (jobInfo.getId() < 1) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add") + I18nUtil.getString("system_fail")));
- }
-
- return new ReturnT(String.valueOf(jobInfo.getId()));
- }
-
- private boolean isNumeric(String str) {
- try {
- int result = Integer.valueOf(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
-
- @Override
- public ReturnT update(XxlJobInfo jobInfo) {
-
- // valid base
- if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc")));
- }
- if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author")));
- }
-
- // valid trigger
- ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);
- if (scheduleTypeEnum == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- if (scheduleTypeEnum == ScheduleTypeEnum.CRON) {
- if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) {
- return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid"));
- }
- } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) {
- if (jobInfo.getScheduleConf() == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- try {
- int fixSecond = Integer.valueOf(jobInfo.getScheduleConf());
- if (fixSecond < 1) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- } catch (Exception e) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- }
-
- // valid advanced
- if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid")));
- }
- if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid")));
- }
- if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid")));
- }
-
- // 》ChildJobId valid
- if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) {
- String[] childJobIds = jobInfo.getChildJobId().split(",");
- for (String childJobIdItem : childJobIds) {
- if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) {
- XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));
- if (childJobInfo == null) {
- return new ReturnT(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem));
- }
- } else {
- return new ReturnT(ReturnT.FAIL_CODE,
- MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem));
- }
- }
-
- // join , avoid "xxx,,"
- String temp = "";
- for (String item : childJobIds) {
- temp += item + ",";
- }
- temp = temp.substring(0, temp.length() - 1);
-
- jobInfo.setChildJobId(temp);
- }
-
- // group valid
- XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup());
- if (jobGroup == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup") + I18nUtil.getString("system_unvalid")));
- }
-
- // stage job info
- XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
- if (exists_jobInfo == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_not_found")));
- }
-
- // next trigger time (5s后生效,避开预读周期)
- long nextTriggerTime = exists_jobInfo.getTriggerNextTime();
- boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf());
- if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) {
- try {
- Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
- if (nextValidTime == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- nextTriggerTime = nextValidTime.getTime();
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- }
-
- exists_jobInfo.setJobGroup(jobInfo.getJobGroup());
- exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
- exists_jobInfo.setAuthor(jobInfo.getAuthor());
- exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail());
- exists_jobInfo.setScheduleType(jobInfo.getScheduleType());
- exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf());
- exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy());
- exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy());
- exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
- exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
- exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
- exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());
- exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
- exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
- exists_jobInfo.setTriggerNextTime(nextTriggerTime);
-
- exists_jobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(exists_jobInfo);
-
-
- return ReturnT.SUCCESS;
- }
-
- @Override
- public ReturnT remove(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
- if (xxlJobInfo == null) {
- return ReturnT.SUCCESS;
- }
-
- xxlJobInfoDao.delete(id);
- xxlJobLogDao.delete(id);
- xxlJobLogGlueDao.deleteByJobId(id);
- return ReturnT.SUCCESS;
- }
-
- @Override
- public ReturnT start(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
-
- // valid
- ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE);
- if (ScheduleTypeEnum.NONE == scheduleTypeEnum) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start")));
- }
-
- // next trigger time (5s后生效,避开预读周期)
- long nextTriggerTime = 0;
- try {
- Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
- if (nextValidTime == null) {
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
- nextTriggerTime = nextValidTime.getTime();
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")));
- }
-
- xxlJobInfo.setTriggerStatus(1);
- xxlJobInfo.setTriggerLastTime(0);
- xxlJobInfo.setTriggerNextTime(nextTriggerTime);
-
- xxlJobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(xxlJobInfo);
- return ReturnT.SUCCESS;
- }
-
- @Override
- public ReturnT stop(int id) {
- XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
-
- xxlJobInfo.setTriggerStatus(0);
- xxlJobInfo.setTriggerLastTime(0);
- xxlJobInfo.setTriggerNextTime(0);
-
- xxlJobInfo.setUpdateTime(new Date());
- xxlJobInfoDao.update(xxlJobInfo);
- return ReturnT.SUCCESS;
- }
-
- @Override
- public Map dashboardInfo() {
-
- int jobInfoCount = xxlJobInfoDao.findAllCount();
- int jobLogCount = 0;
- int jobLogSuccessCount = 0;
- XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal();
- if (xxlJobLogReport != null) {
- jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount();
- jobLogSuccessCount = xxlJobLogReport.getSucCount();
- }
-
- // executor count
- Set executorAddressSet = new HashSet();
- List groupList = xxlJobGroupDao.findAll();
-
- if (groupList != null && !groupList.isEmpty()) {
- for (XxlJobGroup group : groupList) {
- if (group.getRegistryList() != null && !group.getRegistryList().isEmpty()) {
- executorAddressSet.addAll(group.getRegistryList());
- }
- }
- }
-
- int executorCount = executorAddressSet.size();
-
- Map dashboardMap = new HashMap();
- dashboardMap.put("jobInfoCount", jobInfoCount);
- dashboardMap.put("jobLogCount", jobLogCount);
- dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount);
- dashboardMap.put("executorCount", executorCount);
- return dashboardMap;
- }
-
- @Override
- public ReturnT> chartInfo(Date startDate, Date endDate) {
-
- // process
- List triggerDayList = new ArrayList();
- List triggerDayCountRunningList = new ArrayList();
- List triggerDayCountSucList = new ArrayList();
- List triggerDayCountFailList = new ArrayList();
- int triggerCountRunningTotal = 0;
- int triggerCountSucTotal = 0;
- int triggerCountFailTotal = 0;
-
- List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate);
-
- if (logReportList != null && logReportList.size() > 0) {
- for (XxlJobLogReport item : logReportList) {
- String day = DateUtil.formatDate(item.getTriggerDay());
- int triggerDayCountRunning = item.getRunningCount();
- int triggerDayCountSuc = item.getSucCount();
- int triggerDayCountFail = item.getFailCount();
-
- triggerDayList.add(day);
- triggerDayCountRunningList.add(triggerDayCountRunning);
- triggerDayCountSucList.add(triggerDayCountSuc);
- triggerDayCountFailList.add(triggerDayCountFail);
-
- triggerCountRunningTotal += triggerDayCountRunning;
- triggerCountSucTotal += triggerDayCountSuc;
- triggerCountFailTotal += triggerDayCountFail;
- }
- } else {
- for (int i = -6; i <= 0; i++) {
- triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i)));
- triggerDayCountRunningList.add(0);
- triggerDayCountSucList.add(0);
- triggerDayCountFailList.add(0);
- }
- }
-
- Map result = new HashMap();
- result.put("triggerDayList", triggerDayList);
- result.put("triggerDayCountRunningList", triggerDayCountRunningList);
- result.put("triggerDayCountSucList", triggerDayCountSucList);
- result.put("triggerDayCountFailList", triggerDayCountFailList);
-
- result.put("triggerCountRunningTotal", triggerCountRunningTotal);
- result.put("triggerCountSucTotal", triggerCountSucTotal);
- result.put("triggerCountFailTotal", triggerCountFailTotal);
-
- return new ReturnT