From fc89d62f1ae4fcb6a6c303c2f9b69327728f74c3 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, 12 Jul 2024 12:57:45 +0800 Subject: [PATCH 001/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20TestDemo?= =?UTF-8?q?=20=E5=88=A0=E9=99=A4=E5=89=8D=E6=A0=A1=E9=AA=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/demo/mapper/TestDemoMapper.java | 9 +++++---- .../dromara/demo/service/impl/TestDemoServiceImpl.java | 9 +++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index bd94b1ce6..97183a65b 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -4,14 +4,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.poi.ss.formula.functions.T; +import org.apache.ibatis.annotations.Param; 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.demo.domain.TestDemo; import org.dromara.demo.domain.vo.TestDemoVo; -import org.apache.ibatis.annotations.Param; +import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -48,12 +48,13 @@ public interface TestDemoMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - int updateById(@Param(Constants.ENTITY) TestDemo entity); + List selectBatchIds(@Param(Constants.COLL) Collection idList); @Override @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - int deleteByIds(@Param(Constants.COLL) Collection idList); + int updateById(@Param(Constants.ENTITY) TestDemo entity); + } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java index 86b39c2ae..3cfde3a2d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -12,7 +14,6 @@ import org.dromara.demo.domain.vo.TestDemoVo; import org.dromara.demo.mapper.TestDemoMapper; import org.dromara.demo.service.ITestDemoService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collection; @@ -99,7 +100,11 @@ private void validEntityBeforeSave(TestDemo entity) { @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 + // 做一些业务上的校验,判断是否需要校验 + List list = baseMapper.selectBatchIds(ids); + if (list.size() != ids.size()) { + throw new ServiceException("您没有删除权限!"); + } } return baseMapper.deleteByIds(ids) > 0; } From 5444ccc8575ec402ba51daa256e372b5e9716520 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, 12 Jul 2024 13:15:23 +0800 Subject: [PATCH 002/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=BF=9E=E6=8E=A5=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/annotation/DataPermission.java | 7 +++++++ .../mybatis/handler/PlusDataPermissionHandler.java | 13 ++++++++----- .../org/dromara/demo/mapper/TestDemoMapper.java | 4 ++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java index 6fd3c3e07..f5f22d599 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -20,4 +20,11 @@ */ DataColumn[] value(); + /** + * 权限拼接标识符(用于指定连接语句的sql符号) + * 如不填 默认 select 用 OR 其他语句用 AND + * 内容 OR 或者 AND + */ + String joinStr() default ""; + } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 74279bde0..239285cea 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -99,7 +99,7 @@ public Expression getSqlSegment(Expression where, String mappedStatementId, bool return where; } // 构造数据过滤条件的 SQL 片段 - String dataFilterSql = buildDataFilter(dataPermission.value(), isSelect); + String dataFilterSql = buildDataFilter(dataPermission, isSelect); if (StringUtils.isBlank(dataFilterSql)) { return where; } @@ -120,14 +120,17 @@ public Expression getSqlSegment(Expression where, String mappedStatementId, bool /** * 构建数据过滤条件的 SQL 语句 * - * @param dataColumns 数据权限注解中的列信息 - * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 + * @param dataPermission 数据权限注解 + * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 * @return 构建的数据过滤条件的 SQL 语句 * @throws ServiceException 如果角色的数据范围异常或者 key 与 value 的长度不匹配,则抛出 ServiceException 异常 */ - private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) { + private String buildDataFilter(DataPermission dataPermission, boolean isSelect) { // 更新或删除需满足所有条件 String joinStr = isSelect ? " OR " : " AND "; + if (StringUtils.isNotBlank(dataPermission.joinStr())) { + joinStr = " " + dataPermission.joinStr() + " "; + } LoginUser user = DataPermissionHelper.getVariable("user"); StandardEvaluationContext context = new StandardEvaluationContext(); context.setBeanResolver(beanResolver); @@ -145,7 +148,7 @@ private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) { return ""; } boolean isSuccess = false; - for (DataColumn dataColumn : dataColumns) { + for (DataColumn dataColumn : dataPermission.value()) { if (dataColumn.key().length != dataColumn.value().length) { throw new ServiceException("角色数据范围异常 => key与value长度不匹配"); } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index 97183a65b..6aeeb5062 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -44,10 +44,10 @@ public interface TestDemoMapper extends BaseMapperPlus { List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); @Override - @DataPermission({ + @DataPermission(value = { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") - }) + }, joinStr = "AND") List selectBatchIds(@Param(Constants.COLL) Collection idList); @Override From ab147df2f1e378e43c8c71a5119fc12153ffad18 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, 12 Jul 2024 13:51:34 +0800 Subject: [PATCH 003/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=A0=87=E8=AF=86=E7=AC=A6=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=89=80=E6=9C=89=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/mybatis/annotation/DataColumn.java | 7 +++++++ .../common/mybatis/handler/PlusDataPermissionHandler.java | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java index f8c5cd009..2879b9d1c 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -30,4 +30,11 @@ */ String[] value() default "dept_id"; + /** + * 权限标识符 用于通过菜单权限标识符来获取数据权限 + * 拥有此标识符的角色 将不会拼接此角色的数据过滤sql + * + * @return 权限标识符 + */ + String permission() default ""; } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 239285cea..61c86ff36 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -158,6 +158,12 @@ private String buildDataFilter(DataPermission dataPermission, boolean isSelect) )) { continue; } + // 包含权限标识符 这直接跳过 + if (StringUtils.isNotBlank(dataColumn.permission()) && + CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) + ) { + continue; + } // 设置注解变量 key 为表达式变量 value 为变量值 for (int i = 0; i < dataColumn.key().length; i++) { context.setVariable(dataColumn.key()[i], dataColumn.value()[i]); From f76738e02b70f7aef7b7fdc462456c14b8c33087 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, 15 Jul 2024 15:18:29 +0800 Subject: [PATCH 004/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20bug=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 49 ---------------------------------- .gitee/ISSUE_TEMPLATE/bug.yml | 5 ++-- 2 files changed, 3 insertions(+), 51 deletions(-) delete mode 100644 .gitee/ISSUE_TEMPLATE.zh-CN.md diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md deleted file mode 100644 index cf82237f3..000000000 --- a/.gitee/ISSUE_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,49 +0,0 @@ -### 使用版本(未按照模板填写直接删除) - -- jdk版本(带上尾号): 例如 1.8.0_202 -- 框架版本(项目启动时输出的版本号): 例如 4.4.0 -- 其他依赖版本(你觉得有必要的): - -### 问题前提 - -> 功能不好用 不会用 是否已经看过项目文档 -> 项目运行报错 是否已经拿着报错信息去百度 常见报错百度百度足以 -> 是否搜索过其他issue 一些已经解决的问题 会在issue内留下解决方法 -> 无法线上解决或者与框架无关的问题的欢迎加VIP群跟作者一对一谈 - -### 异常模块 - -> 此报错都涉及到那些系统模块 - -例如 ruoyi-system ruoyi-auth 等等 - -### 问题描述 - -> 越详细越容易直击问题所在 - -已知: XXX功能不好用 或 XXX数据不正常 等等 - -### 希望结果 - -> 想知道你觉得怎么样是正常或者合理的 - -希望功能可以有XXX结果 或者 XXX现象 - -### 重现步骤 - -> 作者并不知道这个问题是如何出现的 - -- 1 -- 2 -- 3 - -### 相关代码与报错信息(请勿发混乱格式) - -> 代码可按照如下形式提供或者截图均可 越详细越好 -> 大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题 - -```java -public class XXX { - -} -``` \ No newline at end of file diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml index 8a5d06500..045001336 100644 --- a/.gitee/ISSUE_TEMPLATE/bug.yml +++ b/.gitee/ISSUE_TEMPLATE/bug.yml @@ -9,8 +9,9 @@ body: label: 版本 description: 你当前正在使用我们软件的哪个版本(pom文件内的版本号)? value: | - jdk版本(带上尾号): 例如 17.0.8 - 框架版本(项目启动时输出的版本号): 例如 5.1.1 + 注意: 未填写版本号不予处理直接关闭或删除 + jdk版本(带上尾号): + 框架版本(项目启动时输出的版本号): 其他依赖版本(你觉得有必要的): validations: required: true From 77a7a8f30ed85f15766ea3d13aaa95e53986f972 Mon Sep 17 00:00:00 2001 From: dhb52 Date: Mon, 15 Jul 2024 18:16:43 +0800 Subject: [PATCH 005/104] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7SnailJob?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B01.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- script/sql/oracle/snail_job_oracle.sql | 25 +++++-- script/sql/postgres/snail_job_postgre.sql | 23 +++++-- script/sql/snail_job.sql | 17 +++-- script/sql/sqlserver/snail_job_sqlserver.sql | 70 +++++++++++++++++--- 5 files changed, 106 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 7094419ca..74b0b9d6d 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 2.2.7 4.3.1 2.14.4 - 1.0.1 + 1.1.0 1.3.6 0.2.0 1.18.32 diff --git a/script/sql/oracle/snail_job_oracle.sql b/script/sql/oracle/snail_job_oracle.sql index 19aa07e10..ce59b47d5 100644 --- a/script/sql/oracle/snail_job_oracle.sql +++ b/script/sql/oracle/snail_job_oracle.sql @@ -2,7 +2,7 @@ SnailJob Database Transfer Tool Source Server Type : MySQL Target Server Type : Oracle - Date: 2024-05-14 23:36:38 + Date: 2024-07-06 12:49:36 */ @@ -136,7 +136,7 @@ CREATE INDEX idx_sj_notify_recipient_01 ON sj_notify_recipient (namespace_id); COMMENT ON COLUMN sj_notify_recipient.id IS '主键'; COMMENT ON COLUMN sj_notify_recipient.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_notify_recipient.recipient_name IS '接收人名称'; -COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书'; +COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook'; COMMENT ON COLUMN sj_notify_recipient.notify_attribute IS '配置属性'; COMMENT ON COLUMN sj_notify_recipient.description IS '描述'; COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间'; @@ -389,8 +389,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点'; -- sj_distributed_lock CREATE TABLE sj_distributed_lock ( - id number GENERATED ALWAYS AS IDENTITY, - name varchar2(64) NULL, + name varchar2(64) NOT NULL, lock_until timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, locked_at timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, locked_by varchar2(255) NULL, @@ -399,9 +398,8 @@ CREATE TABLE sj_distributed_lock ); ALTER TABLE sj_distributed_lock - ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (id); + ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (name); -COMMENT ON COLUMN sj_distributed_lock.id IS '主键'; COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; COMMENT ON COLUMN sj_distributed_lock.locked_at IS '锁定时间'; @@ -598,7 +596,11 @@ CREATE TABLE sj_job_task parent_id number DEFAULT 0 NOT NULL, task_status smallint DEFAULT 0 NOT NULL, retry_count number DEFAULT 0 NOT NULL, + mr_stage smallint DEFAULT NULL NULL, + leaf smallint DEFAULT '1' NOT NULL, + task_name varchar2(255) DEFAULT '' NULL, client_info varchar2(128) DEFAULT NULL NULL, + wf_context clob DEFAULT NULL NULL, result_message clob NULL, args_str clob DEFAULT NULL NULL, args_type smallint DEFAULT 1 NOT NULL, @@ -622,7 +624,11 @@ COMMENT ON COLUMN sj_job_task.task_batch_id IS '调度任务id'; COMMENT ON COLUMN sj_job_task.parent_id IS '父执行器id'; COMMENT ON COLUMN sj_job_task.task_status IS '执行的状态 0、失败 1、成功'; COMMENT ON COLUMN sj_job_task.retry_count IS '重试次数'; +COMMENT ON COLUMN sj_job_task.mr_stage IS '动态分片所处阶段 1:map 2:reduce 3:mergeReduce'; +COMMENT ON COLUMN sj_job_task.leaf IS '叶子节点'; +COMMENT ON COLUMN sj_job_task.task_name IS '任务名称'; COMMENT ON COLUMN sj_job_task.client_info IS '客户端地址 clientId#ip:port'; +COMMENT ON COLUMN sj_job_task.wf_context IS '工作流全局上下文'; COMMENT ON COLUMN sj_job_task.result_message IS '执行结果'; COMMENT ON COLUMN sj_job_task.args_str IS '执行方法参数'; COMMENT ON COLUMN sj_job_task.args_type IS '参数类型 '; @@ -773,6 +779,7 @@ CREATE TABLE sj_workflow executor_timeout number DEFAULT 0 NOT NULL, description varchar2(256) DEFAULT '' NULL, flow_info clob DEFAULT NULL NULL, + wf_context clob DEFAULT NULL NULL, bucket_index number DEFAULT 0 NOT NULL, version number NOT NULL, ext_attrs varchar2(256) DEFAULT '' NULL, @@ -799,6 +806,7 @@ COMMENT ON COLUMN sj_workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆 COMMENT ON COLUMN sj_workflow.executor_timeout IS '任务执行超时时间,单位秒'; COMMENT ON COLUMN sj_workflow.description IS '描述'; COMMENT ON COLUMN sj_workflow.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow.wf_context IS '上下文'; COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket'; COMMENT ON COLUMN sj_workflow.version IS '版本号'; COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段'; @@ -864,8 +872,10 @@ CREATE TABLE sj_workflow_task_batch task_batch_status smallint DEFAULT 0 NOT NULL, operation_reason smallint DEFAULT 0 NOT NULL, flow_info clob DEFAULT NULL NULL, + wf_context clob DEFAULT NULL NULL, execution_at number DEFAULT 0 NOT NULL, ext_attrs varchar2(256) DEFAULT '' NULL, + version number DEFAULT 1 NOT NULL, deleted smallint DEFAULT 0 NOT NULL, create_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL, update_dt date DEFAULT CURRENT_TIMESTAMP NOT NULL @@ -885,10 +895,11 @@ COMMENT ON COLUMN sj_workflow_task_batch.workflow_id IS '工作流任务id'; COMMENT ON COLUMN sj_workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功'; COMMENT ON COLUMN sj_workflow_task_batch.operation_reason IS '操作原因'; COMMENT ON COLUMN sj_workflow_task_batch.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow_task_batch.wf_context IS '全局上下文'; COMMENT ON COLUMN sj_workflow_task_batch.execution_at IS '任务执行时间'; COMMENT ON COLUMN sj_workflow_task_batch.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_workflow_task_batch.version IS '版本号'; COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除'; COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间'; COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间'; COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次'; - diff --git a/script/sql/postgres/snail_job_postgre.sql b/script/sql/postgres/snail_job_postgre.sql index 30a871e76..c8abc6816 100644 --- a/script/sql/postgres/snail_job_postgre.sql +++ b/script/sql/postgres/snail_job_postgre.sql @@ -2,7 +2,7 @@ SnailJob Database Transfer Tool Source Server Type : MySQL Target Server Type : PostgreSQL - Date: 2024-05-13 22:49:34 + Date: 2024-07-06 11:45:40 */ @@ -124,7 +124,7 @@ CREATE INDEX idx_sj_notify_recipient_01 ON sj_notify_recipient (namespace_id); COMMENT ON COLUMN sj_notify_recipient.id IS '主键'; COMMENT ON COLUMN sj_notify_recipient.namespace_id IS '命名空间id'; COMMENT ON COLUMN sj_notify_recipient.recipient_name IS '接收人名称'; -COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书'; +COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook'; COMMENT ON COLUMN sj_notify_recipient.notify_attribute IS '配置属性'; COMMENT ON COLUMN sj_notify_recipient.description IS '描述'; COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间'; @@ -359,8 +359,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点'; -- sj_distributed_lock CREATE TABLE sj_distributed_lock ( - id bigserial PRIMARY KEY, - name varchar(64) NOT NULL, + name varchar(64) PRIMARY KEY, lock_until timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), locked_at timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), locked_by varchar(255) NOT NULL, @@ -368,7 +367,6 @@ CREATE TABLE sj_distributed_lock update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ); -COMMENT ON COLUMN sj_distributed_lock.id IS '主键'; COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; COMMENT ON COLUMN sj_distributed_lock.locked_at IS '锁定时间'; @@ -550,7 +548,11 @@ CREATE TABLE sj_job_task parent_id bigint NOT NULL DEFAULT 0, task_status smallint NOT NULL DEFAULT 0, retry_count int NOT NULL DEFAULT 0, + mr_stage smallint NULL DEFAULT NULL, + leaf smallint NOT NULL DEFAULT '1', + task_name varchar(255) NOT NULL DEFAULT '', client_info varchar(128) NULL DEFAULT NULL, + wf_context text NULL DEFAULT NULL, result_message text NOT NULL, args_str text NULL DEFAULT NULL, args_type smallint NOT NULL DEFAULT 1, @@ -571,7 +573,11 @@ COMMENT ON COLUMN sj_job_task.task_batch_id IS '调度任务id'; COMMENT ON COLUMN sj_job_task.parent_id IS '父执行器id'; COMMENT ON COLUMN sj_job_task.task_status IS '执行的状态 0、失败 1、成功'; COMMENT ON COLUMN sj_job_task.retry_count IS '重试次数'; +COMMENT ON COLUMN sj_job_task.mr_stage IS '动态分片所处阶段 1:map 2:reduce 3:mergeReduce'; +COMMENT ON COLUMN sj_job_task.leaf IS '叶子节点'; +COMMENT ON COLUMN sj_job_task.task_name IS '任务名称'; COMMENT ON COLUMN sj_job_task.client_info IS '客户端地址 clientId#ip:port'; +COMMENT ON COLUMN sj_job_task.wf_context IS '工作流全局上下文'; COMMENT ON COLUMN sj_job_task.result_message IS '执行结果'; COMMENT ON COLUMN sj_job_task.args_str IS '执行方法参数'; COMMENT ON COLUMN sj_job_task.args_type IS '参数类型 '; @@ -713,6 +719,7 @@ CREATE TABLE sj_workflow executor_timeout int NOT NULL DEFAULT 0, description varchar(256) NOT NULL DEFAULT '', flow_info text NULL DEFAULT NULL, + wf_context text NULL DEFAULT NULL, bucket_index int NOT NULL DEFAULT 0, version int NOT NULL, ext_attrs varchar(256) NULL DEFAULT '', @@ -736,6 +743,7 @@ COMMENT ON COLUMN sj_workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆 COMMENT ON COLUMN sj_workflow.executor_timeout IS '任务执行超时时间,单位秒'; COMMENT ON COLUMN sj_workflow.description IS '描述'; COMMENT ON COLUMN sj_workflow.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow.wf_context IS '上下文'; COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket'; COMMENT ON COLUMN sj_workflow.version IS '版本号'; COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段'; @@ -798,8 +806,10 @@ CREATE TABLE sj_workflow_task_batch task_batch_status smallint NOT NULL DEFAULT 0, operation_reason smallint NOT NULL DEFAULT 0, flow_info text NULL DEFAULT NULL, + wf_context text NULL DEFAULT NULL, execution_at bigint NOT NULL DEFAULT 0, ext_attrs varchar(256) NULL DEFAULT '', + version int NOT NULL DEFAULT 1, deleted smallint NOT NULL DEFAULT 0, create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP @@ -816,10 +826,11 @@ COMMENT ON COLUMN sj_workflow_task_batch.workflow_id IS '工作流任务id'; COMMENT ON COLUMN sj_workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功'; COMMENT ON COLUMN sj_workflow_task_batch.operation_reason IS '操作原因'; COMMENT ON COLUMN sj_workflow_task_batch.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow_task_batch.wf_context IS '全局上下文'; COMMENT ON COLUMN sj_workflow_task_batch.execution_at IS '任务执行时间'; COMMENT ON COLUMN sj_workflow_task_batch.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_workflow_task_batch.version IS '版本号'; COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除'; COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间'; COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间'; COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次'; - diff --git a/script/sql/snail_job.sql b/script/sql/snail_job.sql index ce93e11d7..c3aa7601b 100644 --- a/script/sql/snail_job.sql +++ b/script/sql/snail_job.sql @@ -68,7 +68,7 @@ CREATE TABLE `sj_notify_recipient` `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', `recipient_name` varchar(64) NOT NULL COMMENT '接收人名称', - `notify_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书', + `notify_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook', `notify_attribute` varchar(512) NOT NULL COMMENT '配置属性', `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -222,15 +222,13 @@ CREATE TABLE `sj_server_node` CREATE TABLE `sj_distributed_lock` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(64) NOT NULL COMMENT '锁名称', `lock_until` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '锁定时长', `locked_at` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '锁定时间', `locked_by` varchar(255) NOT NULL COMMENT '锁定者', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_name` (`name`) + PRIMARY KEY (`name`) ) ENGINE = InnoDB AUTO_INCREMENT = 0 DEFAULT CHARSET = utf8mb4 COMMENT ='锁定表'; @@ -345,12 +343,16 @@ CREATE TABLE `sj_job_task` `job_id` bigint(20) NOT NULL COMMENT '任务信息id', `task_batch_id` bigint(20) NOT NULL COMMENT '调度任务id', `parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '父执行器id', - `task_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '执行的状态 0、失败 1、成功', + `task_status` tinyint NOT NULL DEFAULT 0 COMMENT '执行的状态 0、失败 1、成功', `retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '重试次数', + `mr_stage` tinyint DEFAULT NULL COMMENT '动态分片所处阶段 1:map 2:reduce 3:mergeReduce', + `leaf` tinyint NOT NULL DEFAULT '1' COMMENT '叶子节点', + `task_name` varchar(255) NOT NULL DEFAULT '' COMMENT '任务名称', `client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port', + `wf_context` text DEFAULT NULL COMMENT '工作流全局上下文', `result_message` text NOT NULL COMMENT '执行结果', `args_str` text DEFAULT NULL COMMENT '执行方法参数', - `args_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '参数类型 ', + `args_type` tinyint NOT NULL DEFAULT 1 COMMENT '参数类型 ', `ext_attrs` varchar(256) NULL DEFAULT '' COMMENT '扩展字段', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', @@ -447,6 +449,7 @@ CREATE TABLE `sj_workflow` `executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒', `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', `flow_info` text DEFAULT NULL COMMENT '流程信息', + `wf_context` text DEFAULT NULL COMMENT '上下文', `bucket_index` int(11) NOT NULL DEFAULT 0 COMMENT 'bucket', `version` int(11) NOT NULL COMMENT '版本号', `ext_attrs` varchar(256) NULL DEFAULT '' COMMENT '扩展字段', @@ -495,8 +498,10 @@ CREATE TABLE `sj_workflow_task_batch` `task_batch_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '任务批次状态 0、失败 1、成功', `operation_reason` tinyint(4) NOT NULL DEFAULT 0 COMMENT '操作原因', `flow_info` text DEFAULT NULL COMMENT '流程信息', + `wf_context` text DEFAULT NULL COMMENT '全局上下文', `execution_at` bigint(13) NOT NULL DEFAULT 0 COMMENT '任务执行时间', `ext_attrs` varchar(256) NULL DEFAULT '' COMMENT '扩展字段', + `version` int(11) NOT NULL DEFAULT 1 COMMENT '版本号', `deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', diff --git a/script/sql/sqlserver/snail_job_sqlserver.sql b/script/sql/sqlserver/snail_job_sqlserver.sql index d6fa1ae7c..249842b98 100644 --- a/script/sql/sqlserver/snail_job_sqlserver.sql +++ b/script/sql/sqlserver/snail_job_sqlserver.sql @@ -2,7 +2,7 @@ SnailJob Database Transfer Tool Source Server Type : MySQL Target Server Type : Microsoft SQL Server - Date: 2024-05-13 23:03:34 + Date: 2024-07-06 12:55:47 */ @@ -370,7 +370,7 @@ EXEC sp_addextendedproperty GO EXEC sp_addextendedproperty - 'MS_Description', N'通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书', + 'MS_Description', N'通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook', 'SCHEMA', N'dbo', 'TABLE', N'sj_notify_recipient', 'COLUMN', N'notify_type' @@ -1142,8 +1142,7 @@ GO -- sj_distributed_lock CREATE TABLE sj_distributed_lock ( - id bigint NOT NULL PRIMARY KEY IDENTITY, - name nvarchar(64) NOT NULL, + name nvarchar(64) NOT NULL PRIMARY KEY, lock_until datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP, locked_at datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP, locked_by nvarchar(255) NOT NULL, @@ -1152,13 +1151,6 @@ CREATE TABLE sj_distributed_lock ) GO -EXEC sp_addextendedproperty - 'MS_Description', N'主键', - 'SCHEMA', N'dbo', - 'TABLE', N'sj_distributed_lock', - 'COLUMN', N'id' -GO - EXEC sp_addextendedproperty 'MS_Description', N'锁名称', 'SCHEMA', N'dbo', @@ -1745,7 +1737,11 @@ CREATE TABLE sj_job_task parent_id bigint NOT NULL DEFAULT 0, task_status tinyint NOT NULL DEFAULT 0, retry_count int NOT NULL DEFAULT 0, + mr_stage tinyint NULL DEFAULT NULL, + leaf tinyint NOT NULL DEFAULT '1', + task_name nvarchar(255) NOT NULL DEFAULT '', client_info nvarchar(128) NULL DEFAULT NULL, + wf_context nvarchar(max) NULL DEFAULT NULL, result_message nvarchar(max) NOT NULL, args_str nvarchar(max) NULL DEFAULT NULL, args_type tinyint NOT NULL DEFAULT 1, @@ -1818,6 +1814,27 @@ EXEC sp_addextendedproperty 'COLUMN', N'retry_count' GO +EXEC sp_addextendedproperty + 'MS_Description', N'动态分片所处阶段 1:map 2:reduce 3:mergeReduce', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_job_task', + 'COLUMN', N'mr_stage' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'叶子节点', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_job_task', + 'COLUMN', N'leaf' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'任务名称', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_job_task', + 'COLUMN', N'task_name' +GO + EXEC sp_addextendedproperty 'MS_Description', N'客户端地址 clientId#ip:port', 'SCHEMA', N'dbo', @@ -1825,6 +1842,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'client_info' GO +EXEC sp_addextendedproperty + 'MS_Description', N'工作流全局上下文', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_job_task', + 'COLUMN', N'wf_context' +GO + EXEC sp_addextendedproperty 'MS_Description', N'执行结果', 'SCHEMA', N'dbo', @@ -2281,6 +2305,7 @@ CREATE TABLE sj_workflow executor_timeout int NOT NULL DEFAULT 0, description nvarchar(256) NOT NULL DEFAULT '', flow_info nvarchar(max) NULL DEFAULT NULL, + wf_context nvarchar(max) NULL DEFAULT NULL, bucket_index int NOT NULL DEFAULT 0, version int NOT NULL, ext_attrs nvarchar(256) NULL DEFAULT '', @@ -2379,6 +2404,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'flow_info' GO +EXEC sp_addextendedproperty + 'MS_Description', N'上下文', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_workflow', + 'COLUMN', N'wf_context' +GO + EXEC sp_addextendedproperty 'MS_Description', N'bucket', 'SCHEMA', N'dbo', @@ -2590,8 +2622,10 @@ CREATE TABLE sj_workflow_task_batch task_batch_status tinyint NOT NULL DEFAULT 0, operation_reason tinyint NOT NULL DEFAULT 0, flow_info nvarchar(max) NULL DEFAULT NULL, + wf_context nvarchar(max) NULL DEFAULT NULL, execution_at bigint NOT NULL DEFAULT 0, ext_attrs nvarchar(256) NULL DEFAULT '', + version int NOT NULL DEFAULT 1, deleted tinyint NOT NULL DEFAULT 0, create_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP, update_dt datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP @@ -2654,6 +2688,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'flow_info' GO +EXEC sp_addextendedproperty + 'MS_Description', N'全局上下文', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_workflow_task_batch', + 'COLUMN', N'wf_context' +GO + EXEC sp_addextendedproperty 'MS_Description', N'任务执行时间', 'SCHEMA', N'dbo', @@ -2668,6 +2709,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'ext_attrs' GO +EXEC sp_addextendedproperty + 'MS_Description', N'版本号', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_workflow_task_batch', + 'COLUMN', N'version' +GO + EXEC sp_addextendedproperty 'MS_Description', N'逻辑删除 1、删除', 'SCHEMA', N'dbo', From 58b6c4668ff46f71ccc5f8accf3afe8f4e47c479 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, 16 Jul 2024 09:42:38 +0800 Subject: [PATCH 006/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20oracle=20?= =?UTF-8?q?snailjob=20=E5=85=BC=E5=AE=B9=E4=BD=8E=E7=89=88=E6=9C=ACoracle?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E5=90=8D=E7=A7=B0=E9=95=BF=E5=BA=A6=E9=99=90?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/snail_job_oracle.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script/sql/oracle/snail_job_oracle.sql b/script/sql/oracle/snail_job_oracle.sql index ce59b47d5..d2e17c1f0 100644 --- a/script/sql/oracle/snail_job_oracle.sql +++ b/script/sql/oracle/snail_job_oracle.sql @@ -296,8 +296,8 @@ CREATE TABLE sj_retry_task_log_message ALTER TABLE sj_retry_task_log_message ADD CONSTRAINT pk_sj_retry_task_log_message PRIMARY KEY (id); -CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id); -CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt); +CREATE INDEX idx_sj_rt_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id); +CREATE INDEX idx_sj_rt_log_message_02 ON sj_retry_task_log_message (create_dt); COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键'; COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id'; @@ -447,7 +447,7 @@ CREATE TABLE sj_system_user_permission ALTER TABLE sj_system_user_permission ADD CONSTRAINT pk_sj_system_user_permission PRIMARY KEY (id); -CREATE UNIQUE INDEX uk_sj_system_user_permission_01 ON sj_system_user_permission (namespace_id, group_name, system_user_id); +CREATE UNIQUE INDEX uk_sj_su_permission_01 ON sj_system_user_permission (namespace_id, group_name, system_user_id); COMMENT ON COLUMN sj_system_user_permission.id IS '主键'; COMMENT ON COLUMN sj_system_user_permission.group_name IS '组名称'; From 54f58257f95beaca7d230a73cd5ec5df02225522 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, 16 Jul 2024 11:04:48 +0800 Subject: [PATCH 007/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E6=8E=89=E5=85=B6=E4=BB=96=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=20jdbc=20=E4=BE=9D=E8=B5=96=20=E7=94=B1=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/pom.xml | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 610e9d706..9e9780464 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -22,21 +22,28 @@ com.mysql mysql-connector-j - - - com.oracle.database.jdbc - ojdbc8 - - - - org.postgresql - postgresql - - - - com.microsoft.sqlserver - mssql-jdbc - + + + + + + + + + + + + + + + + + + + + + + org.dromara From 34690e3e65ab34c9950549aefe4c5efa8c8dfc43 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, 19 Jul 2024 10:08:28 +0800 Subject: [PATCH 008/104] update springboot 3.2.6 => 3.2.8 update springdoc 2.5.0 => 2.6.0 update hutool 5.8.27 => 5.8.29 update redisson 3.31.0 => 3.33.0 update flowable 7.0.0 => 7.0.1 --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 74b0b9d6d..58ee2476a 100644 --- a/pom.xml +++ b/pom.xml @@ -14,12 +14,12 @@ 5.2.1 - 3.2.6 + 3.2.8 UTF-8 UTF-8 17 3.5.16 - 2.5.0 + 2.6.0 0.15.0 5.2.3 3.3.4 @@ -27,10 +27,10 @@ 1.38.0 3.5.7 3.9.1 - 5.8.27 + 5.8.29 4.10.0 3.2.3 - 3.31.0 + 3.33.0 2.2.7 4.3.1 2.14.4 @@ -51,7 +51,7 @@ 1.2.83 - 7.0.0 + 7.0.1 3.2.2 From a2a2fa23117035c45c1792584f6a45ade4574dc4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 19 Jul 2024 15:29:38 +0800 Subject: [PATCH 009/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 +++++++++++ ruoyi-modules/ruoyi-generator/pom.xml | 26 +++++++++ .../service/GenTableServiceImpl.java | 55 ++++++++++++++++--- 3 files changed, 105 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 58ee2476a..258837500 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,8 @@ 3.2.1 1.2.83 + + 8.7.2-jdk17-20240717 7.0.1 @@ -339,6 +341,36 @@ ${fastjson.version} + + org.anyline + anyline-environment-spring-data-jdbc + ${anyline.version} + + + + org.anyline + anyline-data-jdbc-mysql + ${anyline.version} + + + + org.anyline + anyline-data-jdbc-oracle + ${anyline.version} + + + + org.anyline + anyline-data-jdbc-postgresql + ${anyline.version} + + + + org.anyline + anyline-data-jdbc-mssql + ${anyline.version} + + org.dromara ruoyi-system diff --git a/ruoyi-modules/ruoyi-generator/pom.xml b/ruoyi-modules/ruoyi-generator/pom.xml index de34f692a..a92ff2341 100644 --- a/ruoyi-modules/ruoyi-generator/pom.xml +++ b/ruoyi-modules/ruoyi-generator/pom.xml @@ -47,6 +47,32 @@ org.apache.velocity velocity-engine-core + + + org.anyline + anyline-environment-spring-data-jdbc + + + + org.anyline + anyline-data-jdbc-mysql + + + + org.anyline + anyline-data-jdbc-oracle + + + + org.anyline + anyline-data-jdbc-postgresql + + + + org.anyline + anyline-data-jdbc-mssql + + 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 02a9fa77d..7e508f954 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 @@ -9,10 +9,12 @@ 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.metadata.IPage; 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.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; @@ -41,11 +43,7 @@ import java.io.IOException; import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -99,7 +97,7 @@ private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { Map params = genTable.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper - .eq(StringUtils.isNotEmpty(genTable.getDataName()),"data_name", genTable.getDataName()) + .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, @@ -107,11 +105,52 @@ private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { return wrapper; } + /** + * 查询数据库列表 + * + * @param genTable 包含查询条件的GenTable对象 + * @param pageQuery 包含分页信息的PageQuery对象 + * @return 包含分页结果的TableDataInfo对象 + */ @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); + // 获取查询条件 + String tableName = genTable.getTableName(); + String tableComment = genTable.getTableComment(); + // 获取分页参数 + Integer pageNum = pageQuery.getPageNum(); + Integer pageSize = pageQuery.getPageSize(); + + // 过滤并转换表格数据 + List tables = ServiceProxy.metadata().tables().values().stream() + .filter(x -> { + boolean nameMatches = true; + boolean commentMatches = true; + // 进行表名称的模糊查询 + if (StringUtils.isNotBlank(tableName)) { + nameMatches = StringUtils.containsIgnoreCase(x.getName(), tableName); + } + // 进行表描述的模糊查询 + if (StringUtils.isNotBlank(tableComment)) { + commentMatches = StringUtils.containsIgnoreCase(x.getComment(), tableComment); + } + // 同时匹配名称和描述 + return nameMatches && commentMatches; + }) + .map(x -> { + GenTable gen = new GenTable(); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + gen.setCreateTime(x.getCreateTime()); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).toList(); + + // 创建分页对象,并设置总记录数 + IPage page = new Page<>(pageNum, pageSize, tables.size()); + // 使用CollUtil进行分页,并设置分页记录 + page.setRecords(CollUtil.page(pageNum - 1, pageSize, tables)); return TableDataInfo.build(page); } From b6b0f9c47d43e41792db7ef0c3405fd15ac901bb Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 19 Jul 2024 15:54:37 +0800 Subject: [PATCH 010/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E8=A1=A8=E5=90=8D=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-generator/pom.xml | 24 +- .../generator/domain/GenTableColumn.java | 1 - .../generator/mapper/GenTableMapper.java | 16 -- .../service/GenTableServiceImpl.java | 15 +- .../mapper/generator/GenTableMapper.xml | 212 ------------------ 5 files changed, 26 insertions(+), 242 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/pom.xml b/ruoyi-modules/ruoyi-generator/pom.xml index a92ff2341..17099d4a0 100644 --- a/ruoyi-modules/ruoyi-generator/pom.xml +++ b/ruoyi-modules/ruoyi-generator/pom.xml @@ -58,20 +58,20 @@ anyline-data-jdbc-mysql - - org.anyline - anyline-data-jdbc-oracle - + + + + - - org.anyline - anyline-data-jdbc-postgresql - + + + + - - org.anyline - anyline-data-jdbc-mssql - + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java index ebdb9930c..e1560b421 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java @@ -17,7 +17,6 @@ * * @author Lion Li */ - @Data @EqualsAndHashCode(callSuper = true) @TableName("gen_table_column") 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 c2ff7b69e..63f4c1512 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 @@ -17,22 +17,6 @@ @InterceptorIgnore(dataPermission = "true", tenantLine = "true") public interface GenTableMapper extends BaseMapperPlus { - /** - * 查询据库列表 - * - * @param genTable 查询条件 - * @return 数据库表集合 - */ - Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - - /** - * 查询据库列表 - * - * @param tableNames 表名称组 - * @return 数据库表集合 - */ - List selectDbTableListByNames(String[] tableNames); - /** * 查询所有表信息 * 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 7e508f954..431092cda 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 @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.anyline.metadata.Table; import org.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; @@ -164,7 +165,19 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer @DS("#dataName") @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { - return baseMapper.selectDbTableListByNames(tableNames); + Set tableNameSet = new HashSet<>(List.of(tableNames)); + List tableList = ServiceProxy.metadata().tables().values().stream() + .filter(x -> tableNameSet.contains(x.getName())).toList(); + + return tableList.stream().map(x -> { + GenTable gen = new GenTable(); + gen.setDataName(dataName); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + gen.setCreateTime(x.getCreateTime()); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).toList(); } /** 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 901bbf0d1..8b1268457 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 @@ -14,218 +14,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - - - - - select column_name, - (case when (is_nullable = 'no' column_key != 'PRI') then '1' else '0' end) as is_required, - (case when column_key = 'PRI' then '1' else '0' end) as is_pk, - ordinal_position as sort, - column_comment, - (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, - column_type - from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName}) - order by ordinal_position - - - select lower(temp.column_name) as column_name, - (case when (temp.nullable = 'N' and temp.constraint_type != 'P') then '1' else '0' end) as is_required, - (case when temp.constraint_type = 'P' then '1' else '0' end) as is_pk, - temp.column_id as sort, - temp.comments as column_comment, - (case when temp.constraint_type = 'P' then '1' else '0' end) as is_increment, - lower(temp.data_type) as column_type - from ( - select col.column_id, col.column_name,col.nullable, col.data_type, colc.comments, uc.constraint_type, row_number() - over (partition by col.column_name order by uc.constraint_type desc) as row_flg - from user_tab_columns col - left join user_col_comments colc on colc.table_name = col.table_name and colc.column_name = col.column_name - left join user_cons_columns ucc on ucc.table_name = col.table_name and ucc.column_name = col.column_name - left join user_constraints uc on uc.constraint_name = ucc.constraint_name - where col.table_name = upper(#{tableName}) - ) temp - WHERE temp.row_flg = 1 - ORDER BY temp.column_id - - - SELECT column_name, is_required, is_pk, sort, column_comment, is_increment, column_type - FROM ( - SELECT c.relname AS table_name, - a.attname AS column_name, - d.description AS column_comment, - CASE WHEN a.attnotnull AND con.conname IS NULL THEN 1 ELSE 0 - END AS is_required, - CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0 - END AS is_pk, - a.attnum AS sort, - CASE WHEN "position"(pg_get_expr(ad.adbin, ad.adrelid), - ((c.relname::text || '_'::text) || a.attname::text) || '_seq'::text) > 0 THEN 1 ELSE 0 - END AS is_increment, - btrim( - CASE WHEN t.typelem ]]> 0::oid AND t.typlen = '-1'::integer THEN 'ARRAY'::text ELSE - CASE WHEN t.typtype = 'd'::"char" THEN format_type(t.typbasetype, NULL::integer) - ELSE format_type(a.atttypid, NULL::integer) END - END, '"'::text - ) AS column_type - FROM pg_attribute a - JOIN (pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid) ON a.attrelid = c.oid - LEFT JOIN pg_description d ON d.objoid = c.oid AND a.attnum = d.objsubid - LEFT JOIN pg_constraint con ON con.conrelid = c.oid AND (a.attnum = ANY (con.conkey)) - LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum - LEFT JOIN pg_type t ON a.atttypid = t.oid - WHERE (c.relkind = ANY (ARRAY ['r'::"char", 'p'::"char"])) - AND a.attnum > 0 - AND n.nspname = 'public'::name - ORDER BY c.relname, a.attnum - ) temp - WHERE table_name = (#{tableName}) - AND column_type ]]> '-' - - - SELECT - cast(A.NAME as nvarchar) as column_name, - cast(B.NAME as nvarchar) + (case when B.NAME = 'numeric' then '(' + cast(A.prec as nvarchar) + ',' + cast(A.scale as nvarchar) + ')' else '' end) as column_type, - cast(G.[VALUE] as nvarchar) as column_comment, - (SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE Z WHERE TABLE_NAME = D.NAME and A.NAME = Z.column_name ) as is_pk, - colorder as sort - FROM SYSCOLUMNS A - LEFT JOIN SYSTYPES B ON A.XTYPE = B.XUSERTYPE - INNER JOIN SYSOBJECTS D ON A.ID = D.ID AND D.XTYPE='U' AND D.NAME != 'DTPROPERTIES' - LEFT JOIN SYS.EXTENDED_PROPERTIES G ON A.ID = G.MAJOR_ID AND A.COLID = G.MINOR_ID - LEFT JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID AND F.MINOR_ID = 0 - WHERE D.NAME = #{tableName} - ORDER BY A.COLORDER - - - From 82fdb37c6b54fe591b04fea23b46a997921015fc Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 19 Jul 2024 16:50:40 +0800 Subject: [PATCH 013/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E8=A1=A8=E5=90=8D=E4=B8=BA=E7=A9=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/service/GenTableServiceImpl.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 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 3fcd33f4d..6ee23bd64 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 @@ -3,6 +3,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DSTransactional; @@ -124,8 +125,12 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer Integer pageNum = pageQuery.getPageNum(); Integer pageSize = pageQuery.getPageSize(); + LinkedHashMap tablesMap = ServiceProxy.metadata().tables(); + if (CollUtil.isEmpty(tablesMap)) { + return TableDataInfo.build(); + } // 过滤并转换表格数据 - List tables = ServiceProxy.metadata().tables().values().stream() + List tables = tablesMap.values().stream() .filter(x -> { boolean nameMatches = true; boolean commentMatches = true; @@ -167,9 +172,18 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - List
tableList = ServiceProxy.metadata().tables().values().stream() + LinkedHashMap tablesMap = ServiceProxy.metadata().tables(); + + if (CollUtil.isEmpty(tablesMap)) { + return new ArrayList<>(); + } + + List
tableList = tablesMap.values().stream() .filter(x -> tableNameSet.contains(x.getName())).toList(); + if (ArrayUtil.isEmpty(tableList)) { + return new ArrayList<>(); + } return tableList.stream().map(x -> { GenTable gen = new GenTable(); gen.setDataName(dataName); From 8859d915b0e9a9fdaf3df37e7567403e6e2fcab0 Mon Sep 17 00:00:00 2001 From: yanzy <1319542051@qq.com> Date: Fri, 19 Jul 2024 17:39:19 +0800 Subject: [PATCH 014/104] =?UTF-8?q?update=20workflowUtils=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=9C=AA=E6=9F=A5=E8=AF=A2=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E5=92=8C=E6=89=8B=E6=9C=BA=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysUserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 3cb415937..c38d0d055 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -640,7 +640,7 @@ public List selectListByIds(List userIds) { return List.of(); } List list = baseMapper.selectVoList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName) + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) .eq(SysUser::getStatus, UserConstants.USER_NORMAL) .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); return BeanUtil.copyToList(list, UserDTO.class); From bfb92fe66712a41d1ac52cee681302f8c35d4f56 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, 19 Jul 2024 17:54:44 +0800 Subject: [PATCH 015/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-snailjob-server.run.xml | 4 +-- pom.xml | 30 ------------------- ruoyi-modules/ruoyi-generator/pom.xml | 6 ++++ .../service/GenTableServiceImpl.java | 4 +-- 4 files changed, 10 insertions(+), 34 deletions(-) diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml index 914809dbf..9198acc55 100644 --- a/.run/ruoyi-snailjob-server.run.xml +++ b/.run/ruoyi-snailjob-server.run.xml @@ -1,5 +1,5 @@ - + - + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5635931ec..059fade3c 100644 --- a/pom.xml +++ b/pom.xml @@ -341,36 +341,6 @@ ${fastjson.version} - - org.anyline - anyline-environment-spring-data-jdbc - ${anyline.version} - - - - org.anyline - anyline-data-jdbc-mysql - ${anyline.version} - - - - org.anyline - anyline-data-jdbc-oracle - ${anyline.version} - - - - org.anyline - anyline-data-jdbc-postgresql - ${anyline.version} - - - - org.anyline - anyline-data-jdbc-mssql - ${anyline.version} - - org.dromara ruoyi-system diff --git a/ruoyi-modules/ruoyi-generator/pom.xml b/ruoyi-modules/ruoyi-generator/pom.xml index 17099d4a0..b7fd94f59 100644 --- a/ruoyi-modules/ruoyi-generator/pom.xml +++ b/ruoyi-modules/ruoyi-generator/pom.xml @@ -51,26 +51,32 @@ org.anyline anyline-environment-spring-data-jdbc + ${anyline.version} org.anyline anyline-data-jdbc-mysql + ${anyline.version} + + + + 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 6ee23bd64..d7985f628 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 @@ -288,8 +288,8 @@ private List selectDbTableColumnsByName(String tableName, String tableColumn.setColumnComment(column.getComment()); tableColumn.setColumnType(column.getTypeName().toLowerCase()); tableColumn.setSort(column.getPosition()); -// tableColumn.setIsRequired(); -// tableColumn.setIsIncrement(); + tableColumn.setIsRequired("0"); + tableColumn.setIsIncrement("0"); tableColumns.add(tableColumn); }); return tableColumns; From 249f1f48a63559964b7b8774bf46a304c16e70e5 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, 19 Jul 2024 17:55:13 +0800 Subject: [PATCH 016/104] =?UTF-8?q?reset=20=E5=9B=9E=E6=BB=9A=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-snailjob-server.run.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml index 9198acc55..914809dbf 100644 --- a/.run/ruoyi-snailjob-server.run.xml +++ b/.run/ruoyi-snailjob-server.run.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From aac83bbb91a43c91008ee6636fc37ca418ec4a71 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 22 Jul 2024 17:06:46 +0800 Subject: [PATCH 017/104] =?UTF-8?q?update=20=E8=8E=B7=E5=8F=96=E8=A1=A8?= =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE=20=E5=AD=97=E6=AE=B5=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=BF=85=E5=A1=AB=20=E5=92=8C=20=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E8=87=AA=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/generator/service/GenTableServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 d7985f628..b8aff3126 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 @@ -288,8 +288,8 @@ private List selectDbTableColumnsByName(String tableName, String tableColumn.setColumnComment(column.getComment()); tableColumn.setColumnType(column.getTypeName().toLowerCase()); tableColumn.setSort(column.getPosition()); - tableColumn.setIsRequired("0"); - tableColumn.setIsIncrement("0"); + tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); + tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); tableColumns.add(tableColumn); }); return tableColumns; From 05580deaa9f1d1f2c2aef2ffa850771a95a59870 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, 23 Jul 2024 09:58:09 +0800 Subject: [PATCH 018/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=AF=BC=E5=85=A5=20bpmn=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessDefinitionServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 6a17289a0..2680db8ef 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -350,8 +350,7 @@ public void deployByFile(MultipartFile file, String categoryCode) { initWfDefConfig(); } else { String originalFilename = file.getOriginalFilename(); - String bpmnResourceSuffix = ResourceNameUtil.BPMN_RESOURCE_SUFFIXES[0]; - if (originalFilename.contains(bpmnResourceSuffix)) { + if (StringUtils.containsAny(originalFilename, ResourceNameUtil.BPMN_RESOURCE_SUFFIXES)) { // 文件名 = 流程名称-流程key String[] splitFilename = originalFilename.substring(0, originalFilename.lastIndexOf(".")).split("-"); if (splitFilename.length < 2) { From 84f553a911a1812a494cbac73ac0fc22d067fdb1 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, 23 Jul 2024 10:06:15 +0800 Subject: [PATCH 019/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E6=8A=A5=E9=94=99=E4=B8=8E?= =?UTF-8?q?=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/service/GenTableServiceImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 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 b8aff3126..744d0ac0f 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 @@ -125,7 +125,7 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer Integer pageNum = pageQuery.getPageNum(); Integer pageSize = pageQuery.getPageSize(); - LinkedHashMap tablesMap = ServiceProxy.metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return TableDataInfo.build(); } @@ -172,13 +172,13 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap tablesMap = ServiceProxy.metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return new ArrayList<>(); } - List
tableList = tablesMap.values().stream() + List> tableList = tablesMap.values().stream() .filter(x -> tableNameSet.contains(x.getName())).toList(); if (ArrayUtil.isEmpty(tableList)) { @@ -279,7 +279,11 @@ public void importGenTable(List tableList, String dataName) { */ @DS("#dataName") private List selectDbTableColumnsByName(String tableName, String dataName) { - LinkedHashMap columns = ServiceProxy.service().metadata().table(tableName).getColumns(); + Table table = ServiceProxy.metadata().table(tableName); + if (Objects.isNull(table)) { + return new ArrayList<>(); + } + LinkedHashMap columns = table.getColumns(); List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { GenTableColumn tableColumn = new GenTableColumn(); From d894cae07349faf36cabaa50e7c1a68f026c4d50 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, 23 Jul 2024 10:35:22 +0800 Subject: [PATCH 020/104] =?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=B1=8F=E8=94=BD=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/generator/service/GenTableServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) 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 744d0ac0f..b2c0cbade 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 @@ -64,6 +64,8 @@ public class GenTableServiceImpl implements IGenTableService { private final GenTableColumnMapper genTableColumnMapper; private final IdentifierGenerator identifierGenerator; + private static final String[] TABLE_IGNORE = new String[]{"sj_", "act_", "flw_", "gen_"}; + /** * 查询业务字段列表 * @@ -131,6 +133,7 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer } // 过滤并转换表格数据 List tables = tablesMap.values().stream() + .filter(x -> !StringUtils.containsAnyIgnoreCase(x.getName(), TABLE_IGNORE)) .filter(x -> { boolean nameMatches = true; boolean commentMatches = true; @@ -179,6 +182,7 @@ public List selectDbTableListByNames(String[] tableNames, String dataN } List> tableList = tablesMap.values().stream() + .filter(x -> !StringUtils.containsAnyIgnoreCase(x.getName(), TABLE_IGNORE)) .filter(x -> tableNameSet.contains(x.getName())).toList(); if (ArrayUtil.isEmpty(tableList)) { From 0c4e9dc813420be1aecfcb1ea2276dd88f5cd70a 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, 23 Jul 2024 10:37:15 +0800 Subject: [PATCH 021/104] update anyline 8.7.2-20240722 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 059fade3c..9a39bb8ce 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240717 + 8.7.2-20240722 7.0.1 From 0b78f9361dd8eab8b9069432d8dbb622ffa46452 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, 23 Jul 2024 11:44:39 +0800 Subject: [PATCH 022/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=AF=BC=E5=85=A5=E7=9A=84=E8=A1=A8=20=E6=9C=AA?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/service/GenTableServiceImpl.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 b2c0cbade..48ae8b279 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 @@ -131,9 +131,22 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer if (CollUtil.isEmpty(tablesMap)) { return TableDataInfo.build(); } + List tableNames = baseMapper.selectTableNameList(genTable.getDataName()); + String[] tableArrays; + if (CollUtil.isNotEmpty(tableNames)) { + tableArrays = tableNames.toArray(new String[0]); + } else { + tableArrays = new String[0]; + } // 过滤并转换表格数据 List tables = tablesMap.values().stream() .filter(x -> !StringUtils.containsAnyIgnoreCase(x.getName(), TABLE_IGNORE)) + .filter(x -> { + if (CollUtil.isEmpty(tableNames)) { + return true; + } + return !StringUtils.containsAnyIgnoreCase(x.getName(), tableArrays); + }) .filter(x -> { boolean nameMatches = true; boolean commentMatches = true; From dcfab4e011939c1d39342a2d63b97c0dbb3eba76 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, 23 Jul 2024 13:21:15 +0800 Subject: [PATCH 023/104] =?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=20=E7=9B=B8=E5=85=B3sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/generator/GenTableMapper.xml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) 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 8b1268457..78aa85209 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 @@ -14,27 +14,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + where t.table_id = #{tableId} order by c.sort From 9e17d07a17e00c60ff2837230bf94ca7f548f35c 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, 23 Jul 2024 16:34:53 +0800 Subject: [PATCH 024/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=99=90?= =?UTF-8?q?=E6=B5=81=E6=B3=A8=E8=A7=A3=20=E5=8F=88=E5=86=99key=E5=8F=88?= =?UTF-8?q?=E4=B8=8D=E6=98=AF=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/ratelimiter/aspectj/RateLimiterAspect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java index 02735b073..1f4904a3e 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java @@ -80,11 +80,11 @@ public void doBefore(JoinPoint point, RateLimiter rateLimiter) { private String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { String key = rateLimiter.key(); - if (StringUtils.isNotBlank(key)) { + // 判断 key 不为空 和 不是表达式 + if (StringUtils.isNotBlank(key) && StringUtils.containsAny(key, "#")) { MethodSignature signature = (MethodSignature) point.getSignature(); Method targetMethod = signature.getMethod(); Object[] args = point.getArgs(); - //noinspection DataFlowIssue MethodBasedEvaluationContext context = new MethodBasedEvaluationContext(null, targetMethod, args, pnd); context.setBeanResolver(new BeanFactoryResolver(SpringUtils.getBeanFactory())); From ae3c02d4b29c7c424638ac235e9809552f59f378 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, 23 Jul 2024 17:05:20 +0800 Subject: [PATCH 025/104] =?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=88=86=E9=A1=B5=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20=E9=81=BF=E5=85=8D=E6=95=B0=E6=8D=AE=E8=AF=AF=E4=BC=A0?= =?UTF-8?q?=E7=AD=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/generator/service/GenTableServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 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 48ae8b279..f7d475b97 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 @@ -170,10 +170,10 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer return gen; }).toList(); - // 创建分页对象,并设置总记录数 - IPage page = new Page<>(pageNum, pageSize, tables.size()); - // 使用CollUtil进行分页,并设置分页记录 - page.setRecords(CollUtil.page(pageNum - 1, pageSize, tables)); + IPage page = pageQuery.build(); + page.setTotal(tables.size()); + // 手动分页 set数据 + page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables)); return TableDataInfo.build(page); } From 0a3d5fd5d47e90333de9ff316641e50d43e87b68 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, 23 Jul 2024 17:05:46 +0800 Subject: [PATCH 026/104] =?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=88=86=E9=A1=B5=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20=E9=81=BF=E5=85=8D=E6=95=B0=E6=8D=AE=E8=AF=AF=E4=BC=A0?= =?UTF-8?q?=E7=AD=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/generator/service/GenTableServiceImpl.java | 3 --- 1 file changed, 3 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 f7d475b97..cf9d2d0e8 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 @@ -123,9 +123,6 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer // 获取查询条件 String tableName = genTable.getTableName(); String tableComment = genTable.getTableComment(); - // 获取分页参数 - Integer pageNum = pageQuery.getPageNum(); - Integer pageSize = pageQuery.getPageSize(); LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { From 105c007f0355f0dfafa017b0c58f1858fdd5b17a 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, 24 Jul 2024 18:56:40 +0800 Subject: [PATCH 027/104] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20springboot?= =?UTF-8?q?=20actuator=20=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=20=E6=9D=9C=E7=BB=9D=E5=86=85=E5=A4=96=E7=BD=91?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=B3=84=E6=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 3 +++ .../src/main/resources/application-prod.yml | 3 +++ .../security/config/SecurityConfig.java | 20 +++++++++++++++++++ .../monitor/admin/config/SecurityConfig.java | 4 +--- .../src/main/resources/application.yml | 3 +++ .../src/main/resources/application-dev.yml | 3 +++ .../src/main/resources/application-prod.yml | 3 +++ 7 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index ea5cafac0..5e20daee7 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -5,6 +5,9 @@ spring.boot.admin.client: url: http://localhost:9090/admin instance: service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} username: ruoyi password: 123456 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 2a4bc11e9..2823bba11 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -8,6 +8,9 @@ spring.boot.admin.client: url: http://localhost:9090/admin instance: service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} username: ruoyi password: 123456 diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index b9283e038..5fd49d133 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -1,11 +1,15 @@ package org.dromara.common.security.config; import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.filter.SaServletFilter; +import cn.dev33.satoken.httpauth.basic.SaHttpBasicUtil; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; @@ -14,6 +18,7 @@ import org.dromara.common.security.handler.AllUrlHandler; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -71,4 +76,19 @@ public void addInterceptors(InterceptorRegistry registry) { .excludePathPatterns(securityProperties.getExcludes()); } + /** + * 对 actuator 健康检查接口 做账号密码鉴权 + */ + @Bean + public SaServletFilter getSaServletFilter() { + String username = SpringUtils.getProperty("spring.boot.admin.client.username"); + String password = SpringUtils.getProperty("spring.boot.admin.client.password"); + return new SaServletFilter() + .addInclude("/actuator", "/actuator/**") + .setAuth(obj -> { + SaHttpBasicUtil.check(username + ":" + password); + }) + .setError(e -> SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED)); + } + } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java index 3f5dec82c..3458cc965 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/SecurityConfig.java @@ -39,9 +39,7 @@ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Excepti .authorizeHttpRequests((authorize) -> authorize.requestMatchers( new AntPathRequestMatcher(adminContextPath + "/assets/**"), - new AntPathRequestMatcher(adminContextPath + "/login"), - new AntPathRequestMatcher("/actuator"), - new AntPathRequestMatcher("/actuator/**") + new AntPathRequestMatcher(adminContextPath + "/login") ).permitAll() .anyRequest().authenticated()) .formLogin((formLogin) -> diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml index 1b729ef1b..beee58775 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml @@ -41,5 +41,8 @@ spring.boot.admin.client: url: http://localhost:9090/admin instance: service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} username: ruoyi password: 123456 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml index 3c65077a1..cbe40be1e 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml @@ -43,5 +43,8 @@ spring.boot.admin.client: url: http://localhost:9090/admin instance: service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} username: ruoyi password: 123456 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml index 37ab8874b..3ba983c2b 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml @@ -43,5 +43,8 @@ spring.boot.admin.client: url: http://localhost:9090/admin instance: service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} username: ruoyi password: 123456 From 52b0fa9a5482a2278b0c683dab7d130a9e7d8b87 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 25 Jul 2024 10:00:10 +0800 Subject: [PATCH 028/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96Monitor?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=9C=8D=E5=8A=A1=E9=80=9A=E7=9F=A5=E5=88=86?= =?UTF-8?q?=E7=B1=BB=EF=BC=88=E5=8F=AF=E6=89=A9=E5=B1=95=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=E5=8F=91=E9=80=81=EF=BC=8C=E7=9F=AD=E4=BF=A1=E5=8F=91=E9=80=81?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/notifier/CustomNotifier.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java index 477a5988d..0094f72fa 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; +import static de.codecentric.boot.admin.server.domain.values.StatusInfo.*; + /** * 自定义事件通知处理 * @@ -28,13 +30,55 @@ protected Mono doNotify(InstanceEvent event, Instance instance) { return Mono.fromRunnable(() -> { // 实例状态改变事件 if (event instanceof InstanceStatusChangedEvent) { + // 获取实例注册名称 String registName = instance.getRegistration().getName(); + // 获取实例ID String instanceId = event.getInstance().getValue(); + // 获取实例状态 String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); - log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status); - } + // 获取服务URL + String serviceUrl = instance.getRegistration().getServiceUrl(); + String statusName = null; + + // 根据实例状态执行相应的操作 + switch (status) { + // 服务上线(实例成功启动并可以正常处理请求) + case STATUS_UP: + statusName = "服务上线"; + break; + + // 服务离线(实例被手动或自动地从服务中移除) + case STATUS_OFFLINE: + statusName = "服务离线"; + break; + + // 服务受限(表示实例在某些方面受限,可能无法完全提供所有服务) + case STATUS_RESTRICTED: + statusName = "服务受限"; + break; + // 停止服务状态(表示实例已被标记为停止提供服务,可能是计划内维护或测试) + case STATUS_OUT_OF_SERVICE: + statusName = "停止服务状态"; + break; + + // 服务下线(实例因崩溃、错误或其他原因停止运行) + case STATUS_DOWN: + statusName = "服务下线"; + break; + + // 服务未知异常(监控系统无法确定实例的当前状态) + case STATUS_UNKNOWN: + statusName = "服务未知异常"; + break; + + // 默认情况(没有匹配的状态) + default: + break; + } + log.info("Instance Status Change: 状态名称【{}】, 注册名称【{}】, 实例ID【{}】, 状态【{}】, 服务URL【{}】", + statusName, registName, instanceId, status, serviceUrl); + } }); } - } From e74f0ca6f8af892b707f1504cfd1913461191885 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 25 Jul 2024 10:37:27 +0800 Subject: [PATCH 029/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96Monitor?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=9C=8D=E5=8A=A1=E4=BF=A1=E6=81=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 5 ++ .../monitor/admin/event/NotifierEvent.java | 44 +++++++++++++++ .../admin/notifier/CustomNotifier.java | 56 ++++++------------- .../monitor/admin/notifier/InfoNotifier.java | 34 +++++++++++ 4 files changed, 101 insertions(+), 38 deletions(-) create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 91194c61b..0ed2d293c 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -39,6 +39,11 @@ lombok + + org.dromara + ruoyi-common-core + + diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java new file mode 100644 index 000000000..7df53e460 --- /dev/null +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java @@ -0,0 +1,44 @@ +package org.dromara.monitor.admin.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通知事件 + * + * @author AprilWind + */ +@Data +public class NotifierEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 实例注册名称 + */ + private String registName; + + /** + * 实例状态名称 + */ + private String statusName; + + /** + * 实例ID + */ + private String instanceId; + + /** + * 实例状态 + */ + private String status; + + /** + * 服务URL + */ + private String serviceUrl; + +} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java index 0094f72fa..e2b529449 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java @@ -6,6 +6,8 @@ import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.monitor.admin.event.NotifierEvent; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @@ -38,46 +40,24 @@ protected Mono doNotify(InstanceEvent event, Instance instance) { String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); // 获取服务URL String serviceUrl = instance.getRegistration().getServiceUrl(); - String statusName = null; - - // 根据实例状态执行相应的操作 - switch (status) { - // 服务上线(实例成功启动并可以正常处理请求) - case STATUS_UP: - statusName = "服务上线"; - break; - - // 服务离线(实例被手动或自动地从服务中移除) - case STATUS_OFFLINE: - statusName = "服务离线"; - break; - - // 服务受限(表示实例在某些方面受限,可能无法完全提供所有服务) - case STATUS_RESTRICTED: - statusName = "服务受限"; - break; - - // 停止服务状态(表示实例已被标记为停止提供服务,可能是计划内维护或测试) - case STATUS_OUT_OF_SERVICE: - statusName = "停止服务状态"; - break; - - // 服务下线(实例因崩溃、错误或其他原因停止运行) - case STATUS_DOWN: - statusName = "服务下线"; - break; - - // 服务未知异常(监控系统无法确定实例的当前状态) - case STATUS_UNKNOWN: - statusName = "服务未知异常"; - break; - - // 默认情况(没有匹配的状态) - default: - break; - } + String statusName = switch (status) { + case STATUS_UP -> "服务上线"; // 实例成功启动并可以正常处理请求 + case STATUS_OFFLINE -> "服务离线"; //实例被手动或自动地从服务中移除 + case STATUS_RESTRICTED -> "服务受限"; //表示实例在某些方面受限,可能无法完全提供所有服务 + case STATUS_OUT_OF_SERVICE -> "停止服务状态"; //表示实例已被标记为停止提供服务,可能是计划内维护或测试 + case STATUS_DOWN -> "服务下线"; //实例因崩溃、错误或其他原因停止运行 + case STATUS_UNKNOWN -> "服务未知异常"; //监控系统无法确定实例的当前状态 + default -> "未知状态"; //没有匹配的状态 + }; log.info("Instance Status Change: 状态名称【{}】, 注册名称【{}】, 实例ID【{}】, 状态【{}】, 服务URL【{}】", statusName, registName, instanceId, status, serviceUrl); + NotifierEvent notifier = new NotifierEvent(); + notifier.setRegistName(registName); + notifier.setStatusName(statusName); + notifier.setInstanceId(instanceId); + notifier.setStatus(status); + notifier.setServiceUrl(serviceUrl); + SpringUtils.context().publishEvent(notifier); } }); } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java new file mode 100644 index 000000000..455883e38 --- /dev/null +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java @@ -0,0 +1,34 @@ +package org.dromara.monitor.admin.notifier; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.monitor.admin.event.NotifierEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * 信息通知 + * + * @author AprilWind + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class InfoNotifier { + + /** + * 异步处理通知事件的方法 + *

+ * 该方法会处理 `NotifierEvent` 事件,执行通知相关的操作,如发送邮件或短信 + * + * @param notifier 事件对象,包含了需要通知的详细信息,包括注册名称、状态名称、实例 ID、状态和服务 URL + */ + @Async + @EventListener + public void infoNotification(NotifierEvent notifier) { + // 在这里添加处理通知事件的逻辑 + // 例如,依据 notifier 对象的信息发送邮件或短信通知 + } + +} From e25083aea4008aab6f9be801b18d98e32dc6ad1b Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 25 Jul 2024 10:55:46 +0800 Subject: [PATCH 030/104] =?UTF-8?q?del=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 5 --- .../monitor/admin/event/NotifierEvent.java | 44 ------------------- .../admin/notifier/CustomNotifier.java | 9 ---- .../monitor/admin/notifier/InfoNotifier.java | 34 -------------- 4 files changed, 92 deletions(-) delete mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java delete mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 0ed2d293c..91194c61b 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -39,11 +39,6 @@ lombok - - org.dromara - ruoyi-common-core - - diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java deleted file mode 100644 index 7df53e460..000000000 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/event/NotifierEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.dromara.monitor.admin.event; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 通知事件 - * - * @author AprilWind - */ -@Data -public class NotifierEvent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 实例注册名称 - */ - private String registName; - - /** - * 实例状态名称 - */ - private String statusName; - - /** - * 实例ID - */ - private String instanceId; - - /** - * 实例状态 - */ - private String status; - - /** - * 服务URL - */ - private String serviceUrl; - -} diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java index e2b529449..838eefc47 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/CustomNotifier.java @@ -6,8 +6,6 @@ import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.monitor.admin.event.NotifierEvent; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @@ -51,13 +49,6 @@ protected Mono doNotify(InstanceEvent event, Instance instance) { }; log.info("Instance Status Change: 状态名称【{}】, 注册名称【{}】, 实例ID【{}】, 状态【{}】, 服务URL【{}】", statusName, registName, instanceId, status, serviceUrl); - NotifierEvent notifier = new NotifierEvent(); - notifier.setRegistName(registName); - notifier.setStatusName(statusName); - notifier.setInstanceId(instanceId); - notifier.setStatus(status); - notifier.setServiceUrl(serviceUrl); - SpringUtils.context().publishEvent(notifier); } }); } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java deleted file mode 100644 index 455883e38..000000000 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/notifier/InfoNotifier.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.monitor.admin.notifier; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.monitor.admin.event.NotifierEvent; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -/** - * 信息通知 - * - * @author AprilWind - */ -@RequiredArgsConstructor -@Slf4j -@Service -public class InfoNotifier { - - /** - * 异步处理通知事件的方法 - *

- * 该方法会处理 `NotifierEvent` 事件,执行通知相关的操作,如发送邮件或短信 - * - * @param notifier 事件对象,包含了需要通知的详细信息,包括注册名称、状态名称、实例 ID、状态和服务 URL - */ - @Async - @EventListener - public void infoNotification(NotifierEvent notifier) { - // 在这里添加处理通知事件的逻辑 - // 例如,依据 notifier 对象的信息发送邮件或短信通知 - } - -} From f46d8818663ace96cb6bc69c0e048cb550018c48 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, 25 Jul 2024 13:12:49 +0800 Subject: [PATCH 031/104] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20snailjob=20?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5=20actuator=20=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=AF=86=E7=A0=81=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/filter/ActuatorAuthFilter.java | 64 +++++++++++++++++++ .../server/starter/filter/SecurityConfig.java | 29 +++++++++ 2 files changed, 93 insertions(+) create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java new file mode 100644 index 000000000..e3a6892fa --- /dev/null +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java @@ -0,0 +1,64 @@ +package com.aizuda.snailjob.server.starter.filter; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class ActuatorAuthFilter implements Filter { + + private final String username; + private final String password; + + public ActuatorAuthFilter(String username, String password) { + this.username = username; + this.password = password; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + // 获取 Authorization 头 + String authHeader = request.getHeader("Authorization"); + + if (authHeader == null || !authHeader.startsWith("Basic ")) { + // 如果没有提供 Authorization 或者格式不对,则返回 401 + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + + // 解码 Base64 编码的用户名和密码 + String base64Credentials = authHeader.substring("Basic ".length()); + byte[] credDecoded = Base64.getDecoder().decode(base64Credentials); + String credentials = new String(credDecoded, StandardCharsets.UTF_8); + String[] split = credentials.split(":"); + if (split.length != 2) { + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + // 验证用户名和密码 + if (!username.equals(split[0]) && password.equals(split[1])) { + response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + return; + } + // 如果认证成功,继续处理请求 + filterChain.doFilter(request, response); + } + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } + +} diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java new file mode 100644 index 000000000..3cae8f58e --- /dev/null +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java @@ -0,0 +1,29 @@ +package com.aizuda.snailjob.server.starter.filter; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 权限安全配置 + * + * @author Lion Li + */ +@Configuration +public class SecurityConfig { + + @Value("${spring.boot.admin.client.username}") + private String username; + @Value("${spring.boot.admin.client.password}") + private String password; + + @Bean + public FilterRegistrationBean actuatorFilterRegistrationBean() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new ActuatorAuthFilter(username, password)); + registrationBean.addUrlPatterns("/actuator", "/actuator/**"); + return registrationBean; + } + +} From e9bd0858e27fc0da0a77caf2d435d8fecacb9ca6 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, 25 Jul 2024 13:21:32 +0800 Subject: [PATCH 032/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 27de286f0..9342f6e70 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -121,9 +121,6 @@ security: # swagger 文档配置 - /*/api-docs - /*/api-docs/** - # actuator 监控配置 - - /actuator - - /actuator/** # 多租户配置 tenant: From ee3525cfb26be97b126e07c1322c41fcc8b5014c 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, 26 Jul 2024 16:05:35 +0800 Subject: [PATCH 033/104] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20ruoyi-common?= =?UTF-8?q?-sse=20=E6=A8=A1=E5=9D=97=20=E6=94=AF=E6=8C=81SSE=E6=8E=A8?= =?UTF-8?q?=E9=80=81=20=E6=AF=94ws=E6=9B=B4=E8=BD=BB=E9=87=8F=E6=9B=B4?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E7=9A=84=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-common/pom.xml | 1 + ruoyi-common/ruoyi-common-bom/pom.xml | 7 + ruoyi-common/ruoyi-common-sse/pom.xml | 36 +++++ .../sse/config/SseAutoConfiguration.java | 28 ++++ .../common/sse/config/SseProperties.java | 21 +++ .../common/sse/controller/SseController.java | 52 +++++++ .../common/sse/core/SseEmitterManager.java | 134 ++++++++++++++++++ .../dromara/common/sse/dto/SseMessageDto.java | 29 ++++ .../common/sse/listener/SseTopicListener.java | 48 +++++++ .../common/sse/utils/SseMessageUtils.java | 58 ++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + ruoyi-modules/ruoyi-system/pom.xml | 5 + 12 files changed, 420 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-sse/pom.xml create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 45493d3e9..2930fd0b0 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -33,6 +33,7 @@ ruoyi-common-encrypt ruoyi-common-tenant ruoyi-common-websocket + ruoyi-common-sse ruoyi-common diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 5388d8c46..19ca420e3 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -172,6 +172,13 @@ ${revision} + + + org.dromara + ruoyi-common-sse + ${revision} + + diff --git a/ruoyi-common/ruoyi-common-sse/pom.xml b/ruoyi-common/ruoyi-common-sse/pom.xml new file mode 100644 index 000000000..ae44c988e --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/pom.xml @@ -0,0 +1,36 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-sse + + + ruoyi-common-sse 模块 + + + + + org.dromara + ruoyi-common-core + + + org.dromara + ruoyi-common-redis + + + org.dromara + ruoyi-common-satoken + + + org.dromara + ruoyi-common-json + + + diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java new file mode 100644 index 000000000..de5afa9a7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -0,0 +1,28 @@ +package org.dromara.common.sse.config; + +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.listener.SseTopicListener; +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; + +/** + * @author Lion Li + */ +@AutoConfiguration +@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") +@EnableConfigurationProperties(SseProperties.class) +public class SseAutoConfiguration { + + @Bean + public SseEmitterManager sseEmitterManager() { + return new SseEmitterManager(); + } + + @Bean + public SseTopicListener sseTopicListener() { + return new SseTopicListener(); + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java new file mode 100644 index 000000000..ce4e1732d --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java @@ -0,0 +1,21 @@ +package org.dromara.common.sse.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * SSE 配置项 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties("sse") +public class SseProperties { + + private Boolean enabled; + + /** + * 路径 + */ + private String path; +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java new file mode 100644 index 000000000..57c7c1e82 --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -0,0 +1,52 @@ +package org.dromara.common.sse.controller; + +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class SseController { + + private final SseEmitterManager sseEmitterManager; + + @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter connect() { + String tokenValue = StpUtil.getTokenValue(); + Long userId = LoginHelper.getUserId(); + return sseEmitterManager.connect(userId, tokenValue); + } + + @GetMapping(value = "${sse.path}/close") + public R close() { + String tokenValue = StpUtil.getTokenValue(); + Long userId = LoginHelper.getUserId(); + sseEmitterManager.disconnect(userId, tokenValue); + return R.ok(); + } + + @GetMapping(value = "${sse.path}/send") + public R send(Long userId, String msg) { + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(List.of(userId)); + dto.setMessage(msg); + sseEmitterManager.publishMessage(dto); + return R.ok(); + } + + @GetMapping(value = "${sse.path}/sendAll") + public R send(String msg) { + sseEmitterManager.publishAll(msg); + return R.ok(); + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java new file mode 100644 index 000000000..4b56b69a0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -0,0 +1,134 @@ +package org.dromara.common.sse.core; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +@Slf4j +public class SseEmitterManager { + /** + * 订阅的频道 + */ + private final static String SSE_TOPIC = "global:sse"; + + private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); + + public SseEmitter connect(Long userId, String token) { + Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); + SseEmitter emitter = new SseEmitter(0L); + + emitters.put(token, emitter); + + emitter.onCompletion(() -> emitters.remove(token)); + emitter.onTimeout(() -> emitters.remove(token)); + + try { + emitter.send(SseEmitter.event().comment("connected")); + } catch (IOException e) { + emitters.remove(token); + } + return emitter; + } + + public void disconnect(Long userId, String token) { + Map emitters = USER_TOKEN_EMITTERS.get(userId); + if (emitters != null) { + try { + emitters.get(token).send(SseEmitter.event().comment("disconnected")); + } catch (IOException ignore) { + } + emitters.remove(token); + } + } + + /** + * 订阅SSE消息主题,并提供一个消费者函数来处理接收到的消息 + * + * @param consumer 处理SSE消息的消费者函数 + */ + public void subscribeMessage(Consumer consumer) { + RedisUtils.subscribe(SSE_TOPIC, SseMessageDto.class, consumer); + } + + /** + * 向指定的用户会话发送消息 + * + * @param userId 要发送消息的用户id + * @param message 要发送的消息内容 + */ + public void sendMessage(Long userId, String message) { + Map emitters = USER_TOKEN_EMITTERS.get(userId); + if (emitters != null) { + for (Map.Entry entry : emitters.entrySet()) { + try { + entry.getValue().send(SseEmitter.event() + .name("message") + .reconnectTime(10000L) + .data(message)); + } catch (Exception e) { + emitters.remove(entry.getKey()); + } + } + } + } + + /** + * 本机全用户会话发送消息 + * + * @param message 要发送的消息内容 + */ + public void sendMessage(String message) { + for (Long userId : USER_TOKEN_EMITTERS.keySet()) { + sendMessage(userId, message); + } + } + + /** + * 发布SSE订阅消息 + * + * @param sseMessageDto 要发布的SSE消息对象 + */ + public void publishMessage(SseMessageDto sseMessageDto) { + List unsentUserIds = new ArrayList<>(); + // 当前服务内用户,直接发送消息 + for (Long userId : sseMessageDto.getUserIds()) { + if (USER_TOKEN_EMITTERS.containsKey(userId)) { + sendMessage(userId, sseMessageDto.getMessage()); + continue; + } + unsentUserIds.add(userId); + } + // 不在当前服务内用户,发布订阅消息 + if (CollUtil.isNotEmpty(unsentUserIds)) { + SseMessageDto broadcastMessage = new SseMessageDto(); + broadcastMessage.setMessage(sseMessageDto.getMessage()); + broadcastMessage.setUserIds(unsentUserIds); + RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { + log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}", + SSE_TOPIC, unsentUserIds, sseMessageDto.getMessage()); + }); + } + } + + /** + * 向所有的用户发布订阅的消息(群发) + * + * @param message 要发布的消息内容 + */ + public void publishAll(String message) { + SseMessageDto broadcastMessage = new SseMessageDto(); + broadcastMessage.setMessage(message); + RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> { + log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message); + }); + } +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java new file mode 100644 index 000000000..a2e1210c6 --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java @@ -0,0 +1,29 @@ +package org.dromara.common.sse.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 消息的dto + * + * @author zendwang + */ +@Data +public class SseMessageDto implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 需要推送到的session key 列表 + */ + private List userIds; + + /** + * 需要发送的消息 + */ + private String message; +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java new file mode 100644 index 000000000..7a4dff13e --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java @@ -0,0 +1,48 @@ +package org.dromara.common.sse.listener; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.sse.core.SseEmitterManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; + +/** + * SSE 主题订阅监听器 + * + * @author Lion Li + */ +@Slf4j +public class SseTopicListener implements ApplicationRunner, Ordered { + + @Autowired + private SseEmitterManager sseEmitterManager; + + /** + * 在Spring Boot应用程序启动时初始化SSE主题订阅监听器 + * + * @param args 应用程序参数 + * @throws Exception 初始化过程中可能抛出的异常 + */ + @Override + public void run(ApplicationArguments args) throws Exception { + sseEmitterManager.subscribeMessage((message) -> { + log.info("SSE主题订阅收到消息session keys={} message={}", message.getUserIds(), message.getMessage()); + // 如果key不为空就按照key发消息 如果为空就群发 + if (CollUtil.isNotEmpty(message.getUserIds())) { + message.getUserIds().forEach(key -> { + sseEmitterManager.sendMessage(key, message.getMessage()); + }); + } else { + sseEmitterManager.sendMessage(message.getMessage()); + } + }); + log.info("初始化SSE主题订阅监听器成功"); + } + + @Override + public int getOrder() { + return -1; + } +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java new file mode 100644 index 000000000..4334e98bc --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java @@ -0,0 +1,58 @@ +package org.dromara.common.sse.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.sse.core.SseEmitterManager; +import org.dromara.common.sse.dto.SseMessageDto; + +/** + * 工具类 + * + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class SseMessageUtils { + + private final static SseEmitterManager MANAGER = SpringUtils.getBean(SseEmitterManager.class); + + /** + * 向指定的WebSocket会话发送消息 + * + * @param userId 要发送消息的用户id + * @param message 要发送的消息内容 + */ + public static void sendMessage(Long userId, String message) { + MANAGER.sendMessage(userId, message); + } + + /** + * 本机全用户会话发送消息 + * + * @param message 要发送的消息内容 + */ + public static void sendMessage(String message) { + MANAGER.sendMessage(message); + } + + /** + * 发布SSE订阅消息 + * + * @param sseMessageDto 要发布的SSE消息对象 + */ + public static void publishMessage(SseMessageDto sseMessageDto) { + MANAGER.publishMessage(sseMessageDto); + } + + /** + * 向所有的用户发布订阅的消息(群发) + * + * @param message 要发布的消息内容 + */ + public static void publishAll(String message) { + MANAGER.publishAll(message); + } + +} diff --git a/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..b80971390 --- /dev/null +++ b/ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.sse.config.SseAutoConfiguration diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index acf33ceb3..0fc6d5513 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -95,6 +95,11 @@ ruoyi-common-websocket + + org.dromara + ruoyi-common-sse + + From d5ab2a7557180441319f24e0323e792dd862de84 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, 26 Jul 2024 16:24:26 +0800 Subject: [PATCH 034/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E9=BB=98=E8=AE=A4=E6=8E=A8=E9=80=81=E4=BD=BF=E7=94=A8?= =?UTF-8?q?SSE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/controller/AuthController.java | 12 ++++++------ ruoyi-admin/src/main/resources/application.yml | 7 ++++++- .../controller/system/SysNoticeController.java | 4 ++-- 3 files changed, 14 insertions(+), 9 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 1db68f106..0b976db9a 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 @@ -24,9 +24,9 @@ import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysTenantVo; @@ -102,11 +102,11 @@ public R login(@RequestBody String body) { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - WebSocketMessageDto dto = new WebSocketMessageDto(); + SseMessageDto dto = new SseMessageDto(); dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); - dto.setSessionKeys(List.of(userId)); - WebSocketUtils.publishMessage(dto); - }, 3, TimeUnit.SECONDS); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 20, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 9342f6e70..f9a9cc3a9 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -256,10 +256,15 @@ management: logfile: external-file: ./logs/sys-console.log +--- # 默认/推荐使用sse推送 +sse: + enabled: true + path: /resource/sse + --- # websocket websocket: # 如果关闭 需要和前端开关一起关闭 - enabled: true + enabled: false # 路径 path: /resource/websocket # 设置访问源地址 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java index a0aa26eba..5d65137b1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -8,8 +8,8 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.web.core.BaseController; -import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.bo.SysNoticeBo; import org.dromara.system.domain.vo.SysNoticeVo; import org.dromara.system.service.ISysNoticeService; @@ -62,7 +62,7 @@ public R add(@Validated @RequestBody SysNoticeBo notice) { return R.fail(); } String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); - WebSocketUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); return R.ok(); } From 51edb74474faf186367b867cc1b6ad3e76ff03bd 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, 26 Jul 2024 17:14:23 +0800 Subject: [PATCH 035/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=8F=91=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=A0=E9=99=90=E9=87=8D=E8=AF=95=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/web/controller/AuthController.java | 2 +- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 3 ++- 2 files changed, 3 insertions(+), 2 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 0b976db9a..b561693d6 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 @@ -106,7 +106,7 @@ public R login(@RequestBody String body) { dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); dto.setUserIds(List.of(userId)); SseMessageUtils.publishMessage(dto); - }, 20, TimeUnit.SECONDS); + }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 4b56b69a0..276df102d 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -30,6 +30,7 @@ public SseEmitter connect(Long userId, String token) { emitter.onCompletion(() -> emitters.remove(token)); emitter.onTimeout(() -> emitters.remove(token)); + emitter.onError((e) -> emitters.remove(token)); try { emitter.send(SseEmitter.event().comment("connected")); @@ -72,7 +73,7 @@ public void sendMessage(Long userId, String message) { try { entry.getValue().send(SseEmitter.event() .name("message") - .reconnectTime(10000L) + .reconnectTime(-1L) .data(message)); } catch (Exception e) { emitters.remove(entry.getKey()); From 51498958fa7deb731486facf7e7bc0d5edf13fca 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, 26 Jul 2024 17:17:18 +0800 Subject: [PATCH 036/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A0=87=E8=AF=86=E7=AC=A6=E5=A4=84=E7=90=86=E6=9C=AA?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=88=90=E5=8A=9F=E7=8A=B6=E6=80=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/handler/PlusDataPermissionHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 61c86ff36..5ac74c321 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -162,6 +162,7 @@ private String buildDataFilter(DataPermission dataPermission, boolean isSelect) if (StringUtils.isNotBlank(dataColumn.permission()) && CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) ) { + isSuccess = true; continue; } // 设置注解变量 key 为表达式变量 value 为变量值 From 782821aeb2812bbe60f1dc800a594717fce3f5a2 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, 26 Jul 2024 18:11:36 +0800 Subject: [PATCH 037/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=AE=BE?= =?UTF-8?q?=E7=BD=AEnginx=20sse=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/nginx/conf/nginx.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf index a6fc07363..3c79d97f6 100644 --- a/script/docker/nginx/conf/nginx.conf +++ b/script/docker/nginx/conf/nginx.conf @@ -78,10 +78,13 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # websocket参数 + proxy_read_timeout 86400s; + # sse 与 websocket参数 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; + proxy_buffering off; + proxy_cache off; proxy_pass http://server/; } From 1619edb8a113bc0a6351eb4e9485faf71735a319 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: Sat, 27 Jul 2024 14:00:35 +0800 Subject: [PATCH 038/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/sse/config/SseAutoConfiguration.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java index de5afa9a7..0cf8054ed 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.config; +import org.dromara.common.sse.controller.SseController; import org.dromara.common.sse.core.SseEmitterManager; import org.dromara.common.sse.listener.SseTopicListener; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -8,6 +9,8 @@ import org.springframework.context.annotation.Bean; /** + * SSE 自动装配 + * * @author Lion Li */ @AutoConfiguration @@ -25,4 +28,9 @@ public SseTopicListener sseTopicListener() { return new SseTopicListener(); } + @Bean + public SseController sseController(SseEmitterManager sseEmitterManager) { + return new SseController(sseEmitterManager); + } + } From b6d939a9ffe48c1abd131cd85e5e6ae13838cbd3 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: Sat, 27 Jul 2024 14:00:50 +0800 Subject: [PATCH 039/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 cf9d2d0e8..ba9568c7f 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 @@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.anyline.metadata.Column; import org.anyline.metadata.Table; +import org.anyline.proxy.CacheProxy; import org.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; From 19fd562c24d84cdcd1f9b30eae070d0a511955fd 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: Sat, 27 Jul 2024 14:20:20 +0800 Subject: [PATCH 040/104] update snailjob 1.1.0 => 1.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9a39bb8ce..b8796d725 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 2.2.7 4.3.1 2.14.4 - 1.1.0 + 1.1.1 1.3.6 0.2.0 1.18.32 From 9825f349ac69fa3a6c27060174bc7a5a26c6fb05 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: Sat, 27 Jul 2024 14:22:57 +0800 Subject: [PATCH 041/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/generator/service/GenTableServiceImpl.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 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 ba9568c7f..4d16f713b 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 @@ -186,7 +186,7 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.service(dataName).metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return new ArrayList<>(); @@ -294,11 +294,9 @@ public void importGenTable(List tableList, String dataName) { */ @DS("#dataName") private List selectDbTableColumnsByName(String tableName, String dataName) { - Table table = ServiceProxy.metadata().table(tableName); - if (Objects.isNull(table)) { - return new ArrayList<>(); - } - LinkedHashMap columns = table.getColumns(); + // 清理anyline缓存 + CacheProxy.clear(); + LinkedHashMap columns = ServiceProxy.metadata().columns(tableName); List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { GenTableColumn tableColumn = new GenTableColumn(); From 86acb14f0553060171a5bfaede43fde5375d8906 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: Sat, 27 Jul 2024 15:09:33 +0800 Subject: [PATCH 042/104] update anyline 8.7.2-20240726 --- pom.xml | 2 +- .../config/MyBatisDataSourceMonitor.java | 81 +++++++++++++++++++ .../service/GenTableServiceImpl.java | 2 +- 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java diff --git a/pom.xml b/pom.xml index b8796d725..8c1e35a6a 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240722 + 8.7.2-20240726 7.0.1 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java new file mode 100644 index 000000000..906733b08 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -0,0 +1,81 @@ +package org.dromara.generator.config; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.anyline.data.datasource.DataSourceMonitor; +import org.anyline.util.ConfigTable; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public class MyBatisDataSourceMonitor implements DataSourceMonitor { + + public MyBatisDataSourceMonitor() { + // 调整执行模式为自定义 + ConfigTable.KEEP_ADAPTER = 2; + } + + private final Map features = new HashMap<>(); + + /** + * 数据源特征 用来定准 adapter 包含数据库或JDBC协议关键字
+ * 一般会通过 产品名_url 合成 如果返回null 上层方法会通过driver_产品名_url合成 + * + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String feature(Object datasource) { + String feature = null; + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + if (ds instanceof DynamicRoutingDataSource) { + String key = DynamicDataSourceContextHolder.peek(); + feature = features.get(key); + if (null == feature) { + Connection con = null; + try { + con = DataSourceUtils.getConnection(ds); + DatabaseMetaData meta = con.getMetaData(); + String url = meta.getURL(); + feature = meta.getDatabaseProductName().toLowerCase().replace(" ", "") + "_" + url; + features.put(key, feature); + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + if (null != con && !DataSourceUtils.isConnectionTransactional(con, ds)) { + DataSourceUtils.releaseConnection(con, ds); + } + } + } + } + } + return feature; + } + + /** + * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter
+ * DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true + * + * @param datasource 数据源 + * @return boolean + */ + @Override + public boolean keepAdapter(Object datasource) { + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + return !(ds instanceof DynamicRoutingDataSource); + } + return true; + } + +} 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 4d16f713b..23eb88986 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 @@ -186,7 +186,7 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer @Override public List selectDbTableListByNames(String[] tableNames, String dataName) { Set tableNameSet = new HashSet<>(List.of(tableNames)); - LinkedHashMap> tablesMap = ServiceProxy.service(dataName).metadata().tables(); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); if (CollUtil.isEmpty(tablesMap)) { return new ArrayList<>(); From bd872f624a043b00af1124607929e04230dbd212 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: Sat, 27 Jul 2024 23:57:13 +0800 Subject: [PATCH 043/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/org/anyline/proxy/CacheProxy.java | 349 ++++++++++++++++++ .../config/MyBatisDataSourceMonitor.java | 7 + .../service/GenTableServiceImpl.java | 11 +- .../generator/service/IGenTableService.java | 9 + 5 files changed, 371 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java diff --git a/pom.xml b/pom.xml index 8c1e35a6a..0764a758a 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240726 + 8.7.2-20240727 7.0.1 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java new file mode 100644 index 000000000..b264fc951 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java @@ -0,0 +1,349 @@ +/* + * Copyright 2006-2023 www.anyline.org + * + * 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 org.anyline.proxy; + +import org.anyline.cache.CacheProvider; +import org.anyline.data.param.ConfigStore; +import org.anyline.data.runtime.DataRuntime; +import org.anyline.entity.OriginRow; +import org.anyline.metadata.*; +import org.anyline.metadata.graph.EdgeTable; +import org.anyline.metadata.graph.VertexTable; +import org.anyline.util.ConfigTable; +import org.anyline.util.encrypt.MD5Util; + +import java.util.LinkedHashMap; +import java.util.List; + +public class CacheProxy { + + private static final ThreadLocal thread_caches = new ThreadLocal<>(); + private static final ThreadLocal thread_names = new ThreadLocal<>(); + private static OriginRow application_caches = new OriginRow(); + private static OriginRow application_names = new OriginRow(); + public static CacheProvider provider; + public CacheProxy() {} + public static void init(CacheProvider provider) { + CacheProxy.provider = provider; + } + private static OriginRow caches(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_caches.get(); + if(null == result){ + result = new OriginRow(); + thread_caches.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_caches.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_caches = new OriginRow(); + } + result = application_caches; + } + return result; + } + private static OriginRow names(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_names.get(); + if(null == result){ + result = new OriginRow(); + thread_names.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_names.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_names = new OriginRow(); + } + result = application_names; + } + return result; + } +/* + + private static Map cache_columns = new HashMap<>(); + private static Map> cache_names = new HashMap<>(); + private static Map cache_table_maps = new HashMap<>(); + private static Map cache_view_maps = new HashMap<>(); +*/ + + + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern).append("_").append(types); + if(null != configs){ + key.append(MD5Util.crypto(configs.json()));; + } + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Table table){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + String name = table.getName(); + String catalog = table.getCatalogName(); + String schema = table.getSchemaName(); + if(null != catalog){ + key.append(catalog); + } + key.append("_"); + if(null != schema){ + key.append(schema); + } + key.append("_").append(name); + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern); + return key.toString().toUpperCase(); + } + public static String name(String key) { + return names().getString(key.toUpperCase()); + } + public static void name(String key, String origin) { + names().put(key.toUpperCase(), origin); + } + public static List tables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List masterTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List edgeTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static List vertexTables(String cache){ + List tables = (List)caches().get(cache); + return tables; + } + public static void tables(String cache, List tables){ + caches().put(cache, tables); + } + + public static List views(String cache){ + List view = (List)caches().get(cache); + return view; + } + public static void views(String cache, List view){ + caches().put(cache, view); + } + + public static void cache(String cache, Object value){ + caches().put(cache, value); + } + +/* + public static void name(DriverAdapter adapter, List tables) { + if(null != tables) { + for (Table table : tables) { + name(adapter, table.getCatalog(), table.getSchema(), table.getName(), table.getName()); + } + } + }*/ +/* + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema) { + String key = null; + String catalog_name = null; + String schema_name = null; + if(null != catalog && adapter.supportCatalog()) { + catalog_name = catalog.getName(); + } + if(null != schema && adapter.supportSchema()) { + schema_name = schema.getName(); + } + if(null != catalog_name) { + key = catalog_name; + } + if(null != schema_name) { + if(null != key) { + key += "_" + schema_name; + }else{ + key = schema_name; + } + } + if(null != key) { + key = key.toUpperCase(); + }else{ + key = "ALL"; + } + return key; + } + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema, Table table) { + String table_name = null; + if(null != table) { + table_name = table.getName(); + } + String key = key(adapter, catalog, schema); + if(null != table_name) { + if(null != key) { + key += ":" + table_name; + }else{ + key = table_name; + } + } + if(null != key) { + key = key.toUpperCase(); + } + return key; + }*//* + public static void name(DriverAdapter adapter, Catalog catalog, Schema schema, String name, String origin) { + String group_key = key(adapter, catalog, schema); + Map maps = cache_names.get(group_key); + if(null == maps) { + maps = new HashMap<>(); + cache_names.put(group_key, maps); + } + String name_key = (group_key + ":" + name).toUpperCase(); + maps.put(name_key, origin); + } + public static Map names(DriverAdapter adapter, Catalog catalog, Schema schema) { + return cache_names.get(key(adapter, catalog, schema)); + } + public static String name(DriverAdapter adapter, boolean greedy, Catalog catalog, Schema schema, String name) { + if(null == name) { + return null; + } + String group_key = key(adapter, catalog, schema); + Map maps = cache_names.get(group_key); + if(null != maps) { + String name_key = (group_key + ":" + name).toUpperCase(); + String origin = maps.get(name_key); + if(null != origin) { + return origin; + } + } + if(greedy) { + for (Map names : cache_names.values()) { + for(String item:names.keySet()) { + if(item.endsWith((":"+name).toUpperCase())) { + return names.get(item); + } + } + } + } + return null; + }*/ + /*public static String datasource(String datasource) { + if(null == datasource || "common".equalsIgnoreCase(datasource)) { + //datasource = DataSourceHolder.curDataSource(); + } + if(null == datasource) { + datasource = "default"; + } + return datasource.toUpperCase(); + } +*//* + public static String tableName(String datasource, String name) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static String viewName(String datasource, String name) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static void setTableMaps(String datasource, DataRow maps) { + cache_table_maps.put(datasource(datasource), maps); + } + public static void setViewMaps(String datasource, DataRow maps) { + cache_view_maps.put(datasource(datasource), maps); + }*/ + + + /* public static DataRow getTableMaps(String datasource) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_table_maps.put(datasource(datasource), row); + } + return row; + }*/ + + /* public static DataRow getViewMaps(String datasource) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_view_maps.put(datasource(datasource), row); + } + return row; + }*/ + + + public static LinkedHashMap columns(String key) { + return (LinkedHashMap) caches().get(key); + } + public static LinkedHashMap tags(String key) { + return (LinkedHashMap) caches().get(key); + } + + + /* public static void columns(DriverAdapter adapter, String datasource, Table table, LinkedHashMap columns) { + if(null == table) { + return; + } + String cache = ConfigTable.getString("METADATA_CACHE_KEY"); + String key = datasource(datasource) + "_COLUMNS_" + key(adapter, table.getCatalog(), table.getSchema(), table); + key = key.toUpperCase(); + if(null != provider && BasicUtil.isNotEmpty(cache) && !ConfigTable.IS_CACHE_DISABLED) { + provider.put(cache, key, columns); + }else{ + DataRow static_cache = new DataRow(); + static_cache.put("keys", columns); + cache_columns.put(key, static_cache); + } + } */ + + public static void clear() {/* + if(null != provider && !ConfigTable.IS_CACHE_DISABLED) { + String cache = ConfigTable.METADATA_CACHE_KEY; + if(BasicUtil.isNotEmpty(cache)) { + provider.clear(cache); + } + }else{ + cache_columns.clear(); + }*/ + + caches().clear(); + names().clear(); + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index 906733b08..bb0760621 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -15,6 +15,11 @@ import java.util.HashMap; import java.util.Map; +/** + * anyline 适配 动态数据源改造 + * + * @author Lion Li + */ @Slf4j @Component public class MyBatisDataSourceMonitor implements DataSourceMonitor { @@ -22,6 +27,8 @@ public class MyBatisDataSourceMonitor implements DataSourceMonitor { public MyBatisDataSourceMonitor() { // 调整执行模式为自定义 ConfigTable.KEEP_ADAPTER = 2; + // 禁用缓存 + ConfigTable.METADATA_CACHE_SCOPE = 0; } private final Map features = new HashMap<>(); 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 23eb88986..b4abc90c0 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 @@ -17,13 +17,13 @@ import lombok.extern.slf4j.Slf4j; import org.anyline.metadata.Column; import org.anyline.metadata.Table; -import org.anyline.proxy.CacheProxy; import org.anyline.proxy.ServiceProxy; 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.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.file.FileUtils; @@ -269,7 +269,7 @@ public void importGenTable(List tableList, String dataName) { int row = baseMapper.insert(table); if (row > 0) { // 保存列信息 - List genTableColumns = selectDbTableColumnsByName(tableName, dataName); + List genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); List saveColumns = new ArrayList<>(); for (GenTableColumn column : genTableColumns) { GenUtils.initColumnField(column, table); @@ -293,9 +293,8 @@ public void importGenTable(List tableList, String dataName) { * @return 列信息 */ @DS("#dataName") - private List selectDbTableColumnsByName(String tableName, String dataName) { - // 清理anyline缓存 - CacheProxy.clear(); + @Override + public List selectDbTableColumnsByName(String tableName, String dataName) { LinkedHashMap columns = ServiceProxy.metadata().columns(tableName); List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { @@ -407,7 +406,7 @@ public void synchDb(Long tableId) { List tableColumns = table.getColumns(); Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); - List dbTableColumns = selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + List dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); if (CollUtil.isEmpty(dbTableColumns)) { throw new ServiceException("同步数据失败,原表结构不存在"); } 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 2a2fb8228..b2c20c57d 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 @@ -85,6 +85,15 @@ public interface IGenTableService { */ void importGenTable(List tableList, String dataName); + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + List selectDbTableColumnsByName(String tableName, String dataName); + /** * 预览代码 * From 7297053dd63273fbb0eb68686c7e90f72945345b 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 Jul 2024 12:27:51 +0800 Subject: [PATCH 044/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=87=BA=E5=90=8E=E9=87=8D=E6=96=B0=E7=99=BB=E5=BD=95=20sse?= =?UTF-8?q?=E6=8E=A8=E9=80=81=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 --- .../java/org/dromara/common/sse/controller/SseController.java | 2 ++ .../java/org/dromara/common/sse/core/SseEmitterManager.java | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index 57c7c1e82..a28c1fdcc 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.controller; +import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.stp.StpUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -26,6 +27,7 @@ public SseEmitter connect() { return sseEmitterManager.connect(userId, tokenValue); } + @SaIgnore @GetMapping(value = "${sse.path}/close") public R close() { String tokenValue = StpUtil.getTokenValue(); diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 276df102d..0f096fac5 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -73,7 +73,6 @@ public void sendMessage(Long userId, String message) { try { entry.getValue().send(SseEmitter.event() .name("message") - .reconnectTime(-1L) .data(message)); } catch (Exception e) { emitters.remove(entry.getKey()); From 239d59c864af365d2b61dc99b2cfa21bf813896b 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 Jul 2024 12:44:45 +0800 Subject: [PATCH 045/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=20=E5=A2=9E=E5=8A=A0token?= =?UTF-8?q?=E6=9C=89=E6=95=88=E6=9C=9F=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 0f096fac5..91dd71dbb 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,5 +1,6 @@ package org.dromara.common.sse.core; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; @@ -71,6 +72,11 @@ public void sendMessage(Long userId, String message) { if (emitters != null) { for (Map.Entry entry : emitters.entrySet()) { try { + // token 无效或已过期 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(entry.getKey()) < -1) { + emitters.remove(entry.getKey()); + continue; + } entry.getValue().send(SseEmitter.event() .name("message") .data(message)); From 857a0b10065bab56152dcc60ce0c92106cb2550f 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 Jul 2024 14:33:54 +0800 Subject: [PATCH 046/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96oss=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysOssServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 d167e8dcc..186653182 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 @@ -77,8 +77,9 @@ public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { @Override public List listByIds(Collection ossIds) { List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); for (Long id : ossIds) { - SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + SysOssVo vo = ossService.getById(id); if (ObjectUtil.isNotNull(vo)) { try { list.add(this.matchingUrl(vo)); @@ -100,8 +101,9 @@ public List listByIds(Collection ossIds) { @Override public String selectUrlByIds(String ossIds) { List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { - SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + SysOssVo vo = ossService.getById(id); if (ObjectUtil.isNotNull(vo)) { try { list.add(this.matchingUrl(vo).getUrl()); From 08fece39d8fa6c9bf562f8d1d8cf951bf1cad3cc 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 Jul 2024 15:04:54 +0800 Subject: [PATCH 047/104] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E8=84=B1=E6=95=8F=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sensitive/core/SensitiveStrategy.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 9d1978a14..6de52c0e0 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -37,7 +37,52 @@ public enum SensitiveStrategy { /** * 银行卡 */ - BANK_CARD(DesensitizedUtil::bankCard); + BANK_CARD(DesensitizedUtil::bankCard), + + /** + * 中文名 + */ + CHINESE_NAME(DesensitizedUtil::chineseName), + + /** + * 固定电话 + */ + FIXED_PHONE(DesensitizedUtil::fixedPhone), + + /** + * 用户ID + */ + user_ID(s -> String.valueOf(DesensitizedUtil.userId())), + + /** + * ipv4 + */ + IPV4(DesensitizedUtil::ipv4), + + /** + * ipv6 + */ + IPV6(DesensitizedUtil::ipv6), + + /** + * 中国大陆车牌,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense), + + /** + * 只显示第一个字符 + */ + FIRST_MASK(DesensitizedUtil::firstMask), + + /** + * 清空为null + */ + CLEAR(s -> DesensitizedUtil.clear()), + + /** + * 清空为"" + */ + CLEAR_TO_NULL(s -> DesensitizedUtil.clearToNull()); //可自行添加其他脱敏策略 From 508d7a37e31c6c306c882f3ef11528df27885e8c 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 Jul 2024 15:18:23 +0800 Subject: [PATCH 048/104] =?UTF-8?q?update=20=E8=84=B1=E6=95=8F=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=BC=98=E5=8C=96=E5=A2=9E=E5=8A=A0=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/sensitive/core/SensitiveStrategy.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 6de52c0e0..995dcbd96 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -52,7 +52,12 @@ public enum SensitiveStrategy { /** * 用户ID */ - user_ID(s -> String.valueOf(DesensitizedUtil.userId())), + USER_ID(s -> String.valueOf(DesensitizedUtil.userId())), + + /** + * 密码 + */ + PASSWORD(DesensitizedUtil::password), /** * ipv4 From 2a340d4d835bc30a6b57f0a49fadb005299181b0 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 Jul 2024 17:47:01 +0800 Subject: [PATCH 049/104] update anyline 8.7.2-20240728 --- pom.xml | 2 +- .../java/org/anyline/proxy/CacheProxy.java | 349 ------------------ 2 files changed, 1 insertion(+), 350 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java diff --git a/pom.xml b/pom.xml index 0764a758a..1dc79cf0d 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240727 + 8.7.2-20240728 7.0.1 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java deleted file mode 100644 index b264fc951..000000000 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright 2006-2023 www.anyline.org - * - * 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 org.anyline.proxy; - -import org.anyline.cache.CacheProvider; -import org.anyline.data.param.ConfigStore; -import org.anyline.data.runtime.DataRuntime; -import org.anyline.entity.OriginRow; -import org.anyline.metadata.*; -import org.anyline.metadata.graph.EdgeTable; -import org.anyline.metadata.graph.VertexTable; -import org.anyline.util.ConfigTable; -import org.anyline.util.encrypt.MD5Util; - -import java.util.LinkedHashMap; -import java.util.List; - -public class CacheProxy { - - private static final ThreadLocal thread_caches = new ThreadLocal<>(); - private static final ThreadLocal thread_names = new ThreadLocal<>(); - private static OriginRow application_caches = new OriginRow(); - private static OriginRow application_names = new OriginRow(); - public static CacheProvider provider; - public CacheProxy() {} - public static void init(CacheProvider provider) { - CacheProxy.provider = provider; - } - private static OriginRow caches(){ - OriginRow result = new OriginRow(); - if(ConfigTable.METADATA_CACHE_SCOPE == 1){ - result = thread_caches.get(); - if(null == result){ - result = new OriginRow(); - thread_caches.set(result); - } - }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ - if(application_caches.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ - application_caches = new OriginRow(); - } - result = application_caches; - } - return result; - } - private static OriginRow names(){ - OriginRow result = new OriginRow(); - if(ConfigTable.METADATA_CACHE_SCOPE == 1){ - result = thread_names.get(); - if(null == result){ - result = new OriginRow(); - thread_names.set(result); - } - }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ - if(application_names.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ - application_names = new OriginRow(); - } - result = application_names; - } - return result; - } -/* - - private static Map cache_columns = new HashMap<>(); - private static Map> cache_names = new HashMap<>(); - private static Map cache_table_maps = new HashMap<>(); - private static Map cache_view_maps = new HashMap<>(); -*/ - - - public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - if(null != catalog){ - key.append(catalog.getName()); - } - key.append("_"); - if(null != schema){ - key.append(schema.getName()); - } - key.append("_").append(pattern).append("_").append(types); - if(null != configs){ - key.append(MD5Util.crypto(configs.json()));; - } - return key.toString().toUpperCase(); - } - public static String key(DataRuntime runtime, String flag, boolean greedy, Table table){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - String name = table.getName(); - String catalog = table.getCatalogName(); - String schema = table.getSchemaName(); - if(null != catalog){ - key.append(catalog); - } - key.append("_"); - if(null != schema){ - key.append(schema); - } - key.append("_").append(name); - return key.toString().toUpperCase(); - } - public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern){ - StringBuilder key = new StringBuilder(); - key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); - if(null != catalog){ - key.append(catalog.getName()); - } - key.append("_"); - if(null != schema){ - key.append(schema.getName()); - } - key.append("_").append(pattern); - return key.toString().toUpperCase(); - } - public static String name(String key) { - return names().getString(key.toUpperCase()); - } - public static void name(String key, String origin) { - names().put(key.toUpperCase(), origin); - } - public static List tables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List masterTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List edgeTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static List vertexTables(String cache){ - List tables = (List)caches().get(cache); - return tables; - } - public static void tables(String cache, List tables){ - caches().put(cache, tables); - } - - public static List views(String cache){ - List view = (List)caches().get(cache); - return view; - } - public static void views(String cache, List view){ - caches().put(cache, view); - } - - public static void cache(String cache, Object value){ - caches().put(cache, value); - } - -/* - public static void name(DriverAdapter adapter, List tables) { - if(null != tables) { - for (Table table : tables) { - name(adapter, table.getCatalog(), table.getSchema(), table.getName(), table.getName()); - } - } - }*/ -/* - private static String key(DriverAdapter adapter, Catalog catalog, Schema schema) { - String key = null; - String catalog_name = null; - String schema_name = null; - if(null != catalog && adapter.supportCatalog()) { - catalog_name = catalog.getName(); - } - if(null != schema && adapter.supportSchema()) { - schema_name = schema.getName(); - } - if(null != catalog_name) { - key = catalog_name; - } - if(null != schema_name) { - if(null != key) { - key += "_" + schema_name; - }else{ - key = schema_name; - } - } - if(null != key) { - key = key.toUpperCase(); - }else{ - key = "ALL"; - } - return key; - } - private static String key(DriverAdapter adapter, Catalog catalog, Schema schema, Table table) { - String table_name = null; - if(null != table) { - table_name = table.getName(); - } - String key = key(adapter, catalog, schema); - if(null != table_name) { - if(null != key) { - key += ":" + table_name; - }else{ - key = table_name; - } - } - if(null != key) { - key = key.toUpperCase(); - } - return key; - }*//* - public static void name(DriverAdapter adapter, Catalog catalog, Schema schema, String name, String origin) { - String group_key = key(adapter, catalog, schema); - Map maps = cache_names.get(group_key); - if(null == maps) { - maps = new HashMap<>(); - cache_names.put(group_key, maps); - } - String name_key = (group_key + ":" + name).toUpperCase(); - maps.put(name_key, origin); - } - public static Map names(DriverAdapter adapter, Catalog catalog, Schema schema) { - return cache_names.get(key(adapter, catalog, schema)); - } - public static String name(DriverAdapter adapter, boolean greedy, Catalog catalog, Schema schema, String name) { - if(null == name) { - return null; - } - String group_key = key(adapter, catalog, schema); - Map maps = cache_names.get(group_key); - if(null != maps) { - String name_key = (group_key + ":" + name).toUpperCase(); - String origin = maps.get(name_key); - if(null != origin) { - return origin; - } - } - if(greedy) { - for (Map names : cache_names.values()) { - for(String item:names.keySet()) { - if(item.endsWith((":"+name).toUpperCase())) { - return names.get(item); - } - } - } - } - return null; - }*/ - /*public static String datasource(String datasource) { - if(null == datasource || "common".equalsIgnoreCase(datasource)) { - //datasource = DataSourceHolder.curDataSource(); - } - if(null == datasource) { - datasource = "default"; - } - return datasource.toUpperCase(); - } -*//* - public static String tableName(String datasource, String name) { - DataRow row = cache_table_maps.get(datasource(datasource)); - if(null != row) { - return row.getString(name); - } - return name; - } - public static String viewName(String datasource, String name) { - DataRow row = cache_view_maps.get(datasource(datasource)); - if(null != row) { - return row.getString(name); - } - return name; - } - public static void setTableMaps(String datasource, DataRow maps) { - cache_table_maps.put(datasource(datasource), maps); - } - public static void setViewMaps(String datasource, DataRow maps) { - cache_view_maps.put(datasource(datasource), maps); - }*/ - - - /* public static DataRow getTableMaps(String datasource) { - DataRow row = cache_table_maps.get(datasource(datasource)); - if(null == row) { - row = new DataRow(); - cache_table_maps.put(datasource(datasource), row); - } - return row; - }*/ - - /* public static DataRow getViewMaps(String datasource) { - DataRow row = cache_view_maps.get(datasource(datasource)); - if(null == row) { - row = new DataRow(); - cache_view_maps.put(datasource(datasource), row); - } - return row; - }*/ - - - public static LinkedHashMap columns(String key) { - return (LinkedHashMap) caches().get(key); - } - public static LinkedHashMap tags(String key) { - return (LinkedHashMap) caches().get(key); - } - - - /* public static void columns(DriverAdapter adapter, String datasource, Table table, LinkedHashMap columns) { - if(null == table) { - return; - } - String cache = ConfigTable.getString("METADATA_CACHE_KEY"); - String key = datasource(datasource) + "_COLUMNS_" + key(adapter, table.getCatalog(), table.getSchema(), table); - key = key.toUpperCase(); - if(null != provider && BasicUtil.isNotEmpty(cache) && !ConfigTable.IS_CACHE_DISABLED) { - provider.put(cache, key, columns); - }else{ - DataRow static_cache = new DataRow(); - static_cache.put("keys", columns); - cache_columns.put(key, static_cache); - } - } */ - - public static void clear() {/* - if(null != provider && !ConfigTable.IS_CACHE_DISABLED) { - String cache = ConfigTable.METADATA_CACHE_KEY; - if(BasicUtil.isNotEmpty(cache)) { - provider.clear(cache); - } - }else{ - cache_columns.clear(); - }*/ - - caches().clear(); - names().clear(); - } - -} From fcf8516f0d9c50237ab3ebb47a6ae17f639ce3ad 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 Jul 2024 09:48:05 +0800 Subject: [PATCH 050/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=80=82?= =?UTF-8?q?=E9=85=8D=20anyline=20=E6=96=B0=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MyBatisDataSourceMonitor.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index bb0760621..8c0f352fa 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -4,6 +4,7 @@ import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import lombok.extern.slf4j.Slf4j; import org.anyline.data.datasource.DataSourceMonitor; +import org.anyline.data.runtime.DataRuntime; import org.anyline.util.ConfigTable; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceUtils; @@ -41,7 +42,7 @@ public MyBatisDataSourceMonitor() { * @return String 返回null由上层自动提取 */ @Override - public String feature(Object datasource) { + public String feature(DataRuntime runtime, Object datasource) { String feature = null; if (datasource instanceof JdbcTemplate jdbc) { DataSource ds = jdbc.getDataSource(); @@ -69,6 +70,22 @@ public String feature(Object datasource) { return feature; } + /** + * 数据源唯一标识 如果不实现则默认feature + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String key(DataRuntime runtime, Object datasource) { + if(datasource instanceof JdbcTemplate jdbc){ + DataSource ds = jdbc.getDataSource(); + if(ds instanceof DynamicRoutingDataSource){ + return DynamicDataSourceContextHolder.peek(); + } + } + return runtime.getKey(); + } + /** * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter
* DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true @@ -77,7 +94,7 @@ public String feature(Object datasource) { * @return boolean */ @Override - public boolean keepAdapter(Object datasource) { + public boolean keepAdapter(DataRuntime runtime, Object datasource) { if (datasource instanceof JdbcTemplate jdbc) { DataSource ds = jdbc.getDataSource(); return !(ds instanceof DynamicRoutingDataSource); From 5aa346327f26008f103740cf2a3754079feaae34 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 Jul 2024 13:02:33 +0800 Subject: [PATCH 051/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=20=E9=94=99=E8=AF=AF=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A1=A8=E5=90=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b4abc90c0..e1e340ff1 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 @@ -143,7 +143,7 @@ public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuer if (CollUtil.isEmpty(tableNames)) { return true; } - return !StringUtils.containsAnyIgnoreCase(x.getName(), tableArrays); + return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays); }) .filter(x -> { boolean nameMatches = true; From 6b14bce25e87ca7e9ccee096e73f7c8816205913 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 Jul 2024 17:09:16 +0800 Subject: [PATCH 052/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BD=BF=E7=94=A8=E7=8B=AC=E7=AB=8Bweb=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 91194c61b..77c9eb71a 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -12,10 +12,21 @@ ruoyi-monitor-admin - + org.springframework.boot spring-boot-starter-web + + + spring-boot-starter-tomcat + org.springframework.boot + + + + + + org.springframework.boot + spring-boot-starter-undertow From 2869d590e6ffeb6ab7ff66611e4b74fdddfa0ba7 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 Aug 2024 14:55:43 +0800 Subject: [PATCH 053/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E8=BF=9E=E6=8E=A5=E5=90=84=E7=A7=8D=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 91dd71dbb..aa7960c24 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -46,7 +46,7 @@ public void disconnect(Long userId, String token) { if (emitters != null) { try { emitters.get(token).send(SseEmitter.event().comment("disconnected")); - } catch (IOException ignore) { + } catch (Exception ignore) { } emitters.remove(token); } From 588a47897abd7da0cf2860fb4da9e9ddddc55880 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 Aug 2024 15:15:54 +0800 Subject: [PATCH 054/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=A8=A1=E5=9E=8B=E7=BC=BA=E5=B0=91=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/ActProcessDefinitionServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index 2680db8ef..e3c2ed67a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -288,6 +288,7 @@ public boolean convertToModel(String processDefinitionId) { Model modelData = repositoryService.newModel(); modelData.setKey(pd.getKey()); modelData.setName(pd.getName()); + modelData.setCategory(pd.getCategory()); modelData.setTenantId(pd.getTenantId()); repositoryService.saveModel(modelData); repositoryService.addModelEditorSource(modelData.getId(), IoUtil.readBytes(inputStream)); From b886f3a04b5b3b109cb0b1a8989f8c71e5f73d89 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 Aug 2024 23:20:29 +0800 Subject: [PATCH 055/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=94=99=E8=AF=AF=E9=94=81=E5=AE=9A=E4=B8=8D=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E7=A7=9F=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/web/service/SysLoginService.java | 20 +++++------ .../web/service/impl/EmailAuthStrategy.java | 36 +++++++++---------- .../service/impl/PasswordAuthStrategy.java | 33 +++++++++-------- .../web/service/impl/SmsAuthStrategy.java | 36 +++++++++---------- .../web/service/impl/SocialAuthStrategy.java | 32 ++++++++--------- .../common/core/constant/CacheConstants.java | 5 +++ .../common/core/constant/GlobalConstants.java | 5 --- .../monitor/SysLogininforController.java | 8 ++--- 8 files changed, 80 insertions(+), 95 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 af6e7f557..52803663c 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 @@ -4,13 +4,14 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; import com.baomidou.lock.annotation.Lock4j; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.CacheConstants; 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.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; @@ -155,16 +156,11 @@ public LoginUser buildLoginUser(SysUserVo user) { loginUser.setUserType(user.getUserType()); loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); - TenantHelper.dynamic(user.getTenantId(), () -> { - SysDeptVo dept = null; - if (ObjectUtil.isNotNull(user.getDeptId())) { - dept = deptService.selectDeptById(user.getDeptId()); - } - loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName()); - loginUser.setDeptCategory(ObjectUtil.isNull(dept) ? "" : dept.getDeptCategory()); - List roles = roleService.selectRolesByUserId(user.getUserId()); - loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); - }); + Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); + loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); + loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + List roles = roleService.selectRolesByUserId(user.getUserId()); + loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); return loginUser; } @@ -186,7 +182,7 @@ public void recordLoginInfo(Long userId, String ip) { * 登录校验 */ public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { - String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; + String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; String loginFail = Constants.LOGIN_FAIL; // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index 38fdc448b..b5a24976e 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -21,7 +21,6 @@ import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; @@ -51,13 +50,12 @@ public LoginVo login(String body, SysClientVo client) { String tenantId = loginBody.getTenantId(); String email = loginBody.getEmail(); String emailCode = loginBody.getEmailCode(); - - // 通过邮箱查找用户 - SysUserVo user = loadUserByEmail(tenantId, email); - - loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByEmail(email); + loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -89,18 +87,16 @@ private boolean validateEmailCode(String tenantId, String email, String emailCod return code.equals(emailCode); } - private SysUserVo loadUserByEmail(String tenantId, String email) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", email); - throw new UserException("user.not.exists", email); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", email); - throw new UserException("user.blocked", email); - } - return user; - }); + private SysUserVo loadUserByEmail(String email) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", email); + throw new UserException("user.not.exists", email); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", email); + throw new UserException("user.blocked", email); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index 5d3ebd755..f28024f35 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -62,11 +62,12 @@ public LoginVo login(String body, SysClientVo client) { if (captchaEnabled) { validateCaptcha(tenantId, username, code, uuid); } - - SysUserVo user = loadUserByUsername(tenantId, username); - loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); - // 此处可根据登录用户的数据不同 自行创建 loginUser - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByUsername(username); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -107,18 +108,16 @@ private void validateCaptcha(String tenantId, String username, String code, Stri } } - private SysUserVo loadUserByUsername(String tenantId, String username) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", username); - throw new UserException("user.not.exists", username); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", username); - throw new UserException("user.blocked", username); - } - return user; - }); + private SysUserVo loadUserByUsername(String username) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index f883632f9..89f846244 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -21,7 +21,6 @@ import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; @@ -51,13 +50,12 @@ public LoginVo login(String body, SysClientVo client) { String tenantId = loginBody.getTenantId(); String phonenumber = loginBody.getPhonenumber(); String smsCode = loginBody.getSmsCode(); - - // 通过手机号查找用户 - SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber); - - loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByPhonenumber(phonenumber); + loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -89,18 +87,16 @@ private boolean validateSmsCode(String tenantId, String phonenumber, String smsC return code.equals(smsCode); } - private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", phonenumber); - throw new UserException("user.not.exists", phonenumber); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", phonenumber); - throw new UserException("user.blocked", phonenumber); - } - return user; - }); + private SysUserVo loadUserByPhonenumber(String phonenumber) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, phonenumber)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", phonenumber); + throw new UserException("user.not.exists", phonenumber); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", phonenumber); + throw new UserException("user.blocked", phonenumber); + } + return user; } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index 01db20027..84630260f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -92,11 +92,11 @@ public LoginVo login(String body, SysClientVo client) { } else { social = list.get(0); } - // 查找用户 - SysUserVo user = loadUser(social.getTenantId(), social.getUserId()); - - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); + LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { + SysUserVo user = loadUser(social.getUserId()); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); SaLoginModel model = new SaLoginModel(); @@ -116,18 +116,16 @@ public LoginVo login(String body, SysClientVo client) { return loginVo; } - private SysUserVo loadUser(String tenantId, Long userId) { - return TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = userMapper.selectVoById(userId); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", ""); - throw new UserException("user.not.exists", ""); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", ""); - throw new UserException("user.blocked", ""); - } - return user; - }); + private SysUserVo loadUser(Long userId) { + SysUserVo user = userMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", ""); + throw new UserException("user.not.exists", ""); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", ""); + throw new UserException("user.blocked", ""); + } + return user; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java index 67bc8e4c2..ceb837044 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java @@ -22,4 +22,9 @@ public interface CacheConstants { */ String SYS_DICT_KEY = "sys_dict:"; + /** + * 登录账户密码错误次数 redis key + */ + String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index ae9bc2e62..5352b118f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -27,11 +27,6 @@ public interface GlobalConstants { */ String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:"; - /** - * 登录账户密码错误次数 redis key - */ - String PWD_ERR_CNT_KEY = GLOBAL_REDIS_KEY + "pwd_err_cnt:"; - /** * 三方认证 redis key */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 18e32d8c6..98ac2d58f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -1,7 +1,9 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.common.core.constant.GlobalConstants; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; @@ -13,8 +15,6 @@ import org.dromara.system.domain.bo.SysLogininforBo; import org.dromara.system.domain.vo.SysLogininforVo; import org.dromara.system.service.ISysLogininforService; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -79,7 +79,7 @@ public R clean() { @Log(title = "账户解锁", businessType = BusinessType.OTHER) @GetMapping("/unlock/{userName}") public R unlock(@PathVariable("userName") String userName) { - String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName; + String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; if (RedisUtils.hasKey(loginName)) { RedisUtils.deleteObject(loginName); } From 615ad918ca83328bbec94841747bb70a7ba07a46 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, 2 Aug 2024 00:55:11 +0800 Subject: [PATCH 056/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E7=BD=91=E7=BB=9C=E4=B8=AD=E6=96=ADio?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/core/SseEmitterManager.java | 6 ------ .../web/handler/GlobalExceptionHandler.java | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index aa7960c24..039e17f4e 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,6 +1,5 @@ package org.dromara.common.sse.core; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; @@ -72,11 +71,6 @@ public void sendMessage(Long userId, String message) { if (emitters != null) { for (Map.Entry entry : emitters.entrySet()) { try { - // token 无效或已过期 - if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(entry.getKey()) < -1) { - emitters.remove(entry.getKey()); - continue; - } entry.getValue().send(SseEmitter.event() .name("message") .data(message)); diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index bd47c189d..061d3aa45 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -16,10 +16,13 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; +import java.io.IOException; + /** * 全局异常处理器 * @@ -89,6 +92,20 @@ public R handleNoHandlerFoundException(NoHandlerFoundException e, HttpServ return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); } + /** + * 拦截未知的运行时异常 + */ + @ResponseStatus(org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(IOException.class) + public void handleRuntimeException(IOException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + if (requestURI.contains("sse")) { + // sse 经常性连接中断 例如关闭浏览器 直接屏蔽 + return; + } + log.error("请求地址'{}',连接中断", requestURI, e); + } + /** * 拦截未知的运行时异常 */ From 85403e975f86a2697d8dab152ecbb3461a01ec2d 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, 2 Aug 2024 00:55:42 +0800 Subject: [PATCH 057/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E7=99=BB?= =?UTF-8?q?=E5=87=BA=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E7=A7=9F=E6=88=B7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/listener/UserActionListener.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index a4724043b..07595e092 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -3,6 +3,8 @@ import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import lombok.RequiredArgsConstructor; @@ -81,7 +83,10 @@ public void doLogin(String loginType, Object loginId, String tokenValue, SaLogin */ @Override public void doLogout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); } @@ -90,7 +95,10 @@ public void doLogout(String loginType, Object loginId, String tokenValue) { */ @Override public void doKickout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); } @@ -99,7 +107,10 @@ public void doKickout(String loginType, Object loginId, String tokenValue) { */ @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); } From b615a3b088b0e0b14937b010941b5bdf2791edb0 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, 2 Aug 2024 10:03:17 +0800 Subject: [PATCH 058/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20id=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=A0=BC=E5=BC=8F=E8=BD=AC=E6=8D=A2=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 32e6aec08..c44a02ade 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -260,7 +260,7 @@ public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuer String userId = String.valueOf(LoginHelper.getUserId()); queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); - String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); + String ids = StreamUtils.join(roleIds, x -> x); queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids))); if (StringUtils.isNotBlank(taskBo.getName())) { queryWrapper.like("t.name_", taskBo.getName()); From 2b0efd1f93f20063c7df0d8d0c5824cc81f42e67 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, 2 Aug 2024 10:07:47 +0800 Subject: [PATCH 059/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=A0=E9=99=A4=E6=A0=87=E5=BF=97=E4=BD=8D=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E4=BC=98=E5=8C=96=E6=9F=A5=E8=AF=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/constant/UserConstants.java | 10 ++++++++++ .../system/service/impl/SysDeptServiceImpl.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java index 6f3b0b96b..76f6dd4ad 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java @@ -67,6 +67,16 @@ public interface UserConstants { */ String DICT_NORMAL = "0"; + /** + * 通用存在标志 + */ + String DEL_FLAG_NORMAL = "0"; + + /** + * 通用删除标志 + */ + String DEL_FLAG_REMOVED = "2"; + /** * 是否为系统默认(是) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 505403642..160238df3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -78,7 +78,7 @@ public List> selectDeptTreeList(SysDeptBo bo) { private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(SysDept::getDelFlag, "0"); + lqw.eq(SysDept::getDelFlag, UserConstants.DEL_FLAG_NORMAL); lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); From 7393a61305c7e45a72a95b09e37e1895a76fa6b0 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, 2 Aug 2024 10:36:34 +0800 Subject: [PATCH 060/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20id=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=A0=BC=E5=BC=8F=E8=BD=AC=E6=8D=A2=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index c44a02ade..b6ae67ebf 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -260,8 +260,8 @@ public TableDataInfo getPageByTaskWait(TaskBo taskBo, PageQuery pageQuer String userId = String.valueOf(LoginHelper.getUserId()); queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); - String ids = StreamUtils.join(roleIds, x -> x); - queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids))); + String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); + queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN (" + ids + ") ) ))", userId))); if (StringUtils.isNotBlank(taskBo.getName())) { queryWrapper.like("t.name_", taskBo.getName()); } From f32d0266eee6cf2fe4bd8b5063f9c4a098c70c05 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, 2 Aug 2024 11:37:21 +0800 Subject: [PATCH 061/104] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ad9c2cee7..71895dc3f 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
| 数据库连接池 | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下 | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般 | | 数据库主键 | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁 | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一 | | WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物 | 无 | +| SSE推送 | 采用 Spring SSE 实现 扩展了Token鉴权与分布式会话同步 | 无 | | 序列化 | 采用 Jackson Spring官方内置序列化 靠谱!!! | 采用 fastjson bugjson 远近闻名 | | 分布式幂等 | 参考美团GTIS防重系统简化实现(细节可看文档) | 手动编写注解基于aop实现 | | 分布式锁 | 采用 Lock4j 底层基于 Redisson | 无 | @@ -72,6 +73,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
| 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释
只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 | | 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 | | Excel框架 | 采用 Alibaba EasyExcel 基于插件化
框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 | +| 工作流支持 | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能 | 无 | | 工具类框架 | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码 | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等 | | 监控框架 | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制
实时监控服务状态 框架还为其扩展了在线日志查看监控 | 无 | | 链路追踪 | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗
用了它即可实时查看请求经过的每一处每一个节点 | 无 | From ecfaa9ad5c83be221e9baabfe2e5c8647899b7d5 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, 2 Aug 2024 17:09:46 +0800 Subject: [PATCH 062/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=9D=83=E9=99=90=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index c38d0d055..6fbeab56d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -26,10 +26,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.SysUserPost; -import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.domain.vo.SysRoleVo; @@ -473,17 +470,14 @@ private void insertUserPost(SysUserBo user, boolean clear) { */ private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { if (ArrayUtil.isNotEmpty(roleIds)) { - // 判断是否具有此角色的操作权限 - List roles = roleMapper.selectRoleList(new LambdaQueryWrapper<>()); - if (CollUtil.isEmpty(roles)) { - throw new ServiceException("没有权限访问角色的数据"); - } - List roleList = StreamUtils.toList(roles, SysRoleVo::getRoleId); + List roleList = new ArrayList<>(List.of(roleIds)); if (!LoginHelper.isSuperAdmin(userId)) { roleList.remove(UserConstants.SUPER_ADMIN_ID); } - List canDoRoleList = StreamUtils.filter(List.of(roleIds), roleList::contains); - if (CollUtil.isEmpty(canDoRoleList)) { + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList( + new QueryWrapper().in("r.role_id", roleList)); + if (CollUtil.isEmpty(roles)) { throw new ServiceException("没有权限访问角色的数据"); } if (clear) { @@ -491,7 +485,7 @@ private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); } // 新增用户与角色管理 - List list = StreamUtils.toList(canDoRoleList, roleId -> { + List list = StreamUtils.toList(roleList, roleId -> { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); From f119d082cf061c892a7d4fe987ea34a43ad297d9 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: Sun, 4 Aug 2024 10:40:12 +0800 Subject: [PATCH 063/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=B8=80?= =?UTF-8?q?=E7=BA=A7=E7=BC=93=E5=AD=98key=E6=9C=AA=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/redis/manager/CaffeineCacheDecorator.java | 8 +++++--- .../common/redis/manager/PlusSpringCacheManager.java | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java index ee1d405f2..793e21f5c 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java @@ -15,15 +15,17 @@ public class CaffeineCacheDecorator implements Cache { private static final com.github.benmanes.caffeine.cache.Cache CAFFEINE = SpringUtils.getBean("caffeine"); + private final String name; private final Cache cache; - public CaffeineCacheDecorator(Cache cache) { + public CaffeineCacheDecorator(String name, Cache cache) { + this.name = name; this.cache = cache; } @Override public String getName() { - return cache.getName(); + return name; } @Override @@ -32,7 +34,7 @@ public Object getNativeCache() { } public String getUniqueKey(Object key) { - return cache.getName() + ":" + key; + return name + ":" + key; } @Override diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index a48cb1422..740e2a13b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -156,7 +156,7 @@ public Cache getCache(String name) { private Cache createMap(String name, CacheConfig config) { RMap map = RedisUtils.getClient().getMap(name); - Cache cache = new CaffeineCacheDecorator(new RedissonCache(map, allowNullValues)); + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } @@ -170,7 +170,7 @@ private Cache createMap(String name, CacheConfig config) { private Cache createMapCache(String name, CacheConfig config) { RMapCache map = RedisUtils.getClient().getMapCache(name); - Cache cache = new CaffeineCacheDecorator(new RedissonCache(map, config, allowNullValues)); + Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, config, allowNullValues)); if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } From f51e6d81b1495d997a579764f15d6edd8e9a5b61 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: Sun, 4 Aug 2024 10:45:25 +0800 Subject: [PATCH 064/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20TenantSpr?= =?UTF-8?q?ingCacheManager=20=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/tenant/manager/TenantSpringCacheManager.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java index d230afc1a..346e36f1c 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java @@ -1,5 +1,7 @@ package org.dromara.common.tenant.manager; +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.manager.PlusSpringCacheManager; @@ -11,6 +13,7 @@ * * @author Lion Li */ +@Slf4j public class TenantSpringCacheManager extends PlusSpringCacheManager { public TenantSpringCacheManager() { @@ -18,10 +21,16 @@ public TenantSpringCacheManager() { @Override public Cache getCache(String name) { + if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) { + return super.getCache(name); + } if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) { return super.getCache(name); } String tenantId = TenantHelper.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + log.error("无法获取有效的租户id -> Null"); + } if (StringUtils.startsWith(name, tenantId)) { // 如果存在则直接返回 return super.getCache(name); From a9d7a42c65e2dff0b68e14e4a7d44ea3e61fa8fa 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: Sun, 4 Aug 2024 22:58:17 +0800 Subject: [PATCH 065/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0mp=E5=A1=AB=E5=85=85=E5=99=A8=E5=85=9C=E5=BA=95?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/handler/InjectionMetaObjectHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index 99e6b3888..7d44d2648 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -48,6 +48,10 @@ public void insertFill(MetaObject metaObject) { ? baseEntity.getCreateDept() : loginUser.getDeptId()); } } + } else { + Date date = new Date(); + this.strictInsertFill(metaObject, "createTime", Date.class, date); + this.strictInsertFill(metaObject, "updateTime", Date.class, date); } } catch (Exception e) { throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); @@ -72,6 +76,8 @@ public void updateFill(MetaObject metaObject) { if (ObjectUtil.isNotNull(userId)) { baseEntity.setUpdateBy(userId); } + } else { + this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } } catch (Exception e) { throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); From 20cc8a6d6cf16e97e236a9839406d858861cce3c 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, 6 Aug 2024 13:53:40 +0800 Subject: [PATCH 066/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20excel=20?= =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E5=85=B6=E4=BB=96=E5=AD=97=E6=AE=B5=20?= =?UTF-8?q?=E5=90=88=E5=B9=B6=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 --- .../org/dromara/common/excel/core/CellMergeStrategy.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 7c0a48b9a..7c7721c60 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -107,7 +107,7 @@ private List handle(List list, boolean hasTitle) { } if (!cellValue.equals(val)) { - if ((i - repeatCell.getCurrent() > 1) && isMerge(list, i, field)) { + if ((i - repeatCell.getCurrent() > 1)) { cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); } map.put(field, new RepeatCell(val, i)); @@ -115,6 +115,11 @@ private List handle(List list, boolean hasTitle) { if (i > repeatCell.getCurrent() && isMerge(list, i, field)) { cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); } + } else if (!isMerge(list, i, field)) { + if ((i - repeatCell.getCurrent() > 1)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); } } } From e19140462deb5bc077d32c4242782455ccdf35d7 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, 6 Aug 2024 15:38:16 +0800 Subject: [PATCH 067/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=20sse=20=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 --- .../java/org/dromara/common/sse/controller/SseController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index a28c1fdcc..6c136b582 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -7,6 +7,7 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.sse.core.SseEmitterManager; import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +16,7 @@ import java.util.List; @RestController +@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") @RequiredArgsConstructor public class SseController { From 4306ea4181f7092bc095c9b5e131bbc4c42fb5f8 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, 6 Aug 2024 16:07:22 +0800 Subject: [PATCH 068/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=80=9A=E8=BF=87=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 4 ++++ .../workflow/controller/ActModelController.java | 5 +++-- .../workflow/controller/ActTaskController.java | 6 +++--- .../service/impl/ActModelServiceImpl.java | 4 +++- .../impl/ActProcessDefinitionServiceImpl.java | 7 +++++-- .../impl/ActProcessInstanceServiceImpl.java | 16 +++++++++++----- .../service/impl/ActTaskServiceImpl.java | 16 +++++++++++----- .../service/impl/WfCategoryServiceImpl.java | 5 +++-- .../service/impl/WorkflowServiceImpl.java | 4 +++- 9 files changed, 46 insertions(+), 21 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index f9a9cc3a9..3e789d682 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -272,6 +272,10 @@ websocket: --- #flowable配置 flowable: + # 开关 用于启动/停用工作流 + enabled: false + process.enabled: ${flowable.enabled} + eventregistry.enabled: ${flowable.enabled} async-executor-activate: false #关闭定时任务JOB # 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。 database-schema-update: true diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java index 3332f86a5..842d3d667 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java @@ -18,6 +18,7 @@ import org.dromara.workflow.service.IActModelService; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Model; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -36,8 +37,8 @@ @RequestMapping("/workflow/model") public class ActModelController extends BaseController { - private final RepositoryService repositoryService; - + @Autowired(required = false) + private RepositoryService repositoryService; private final IActModelService actModelService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java index 75f9d9b2a..25724b6d9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActTaskController.java @@ -21,6 +21,7 @@ import org.dromara.workflow.service.IWfTaskBackNodeService; import org.dromara.workflow.utils.QueryUtils; import org.flowable.engine.TaskService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -38,10 +39,9 @@ @RequestMapping("/workflow/task") public class ActTaskController extends BaseController { + @Autowired(required = false) + private TaskService taskService; private final IActTaskService actTaskService; - - private final TaskService taskService; - private final IWfTaskBackNodeService wfTaskBackNodeService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java index d4f696b6c..217538e44 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java @@ -39,6 +39,7 @@ import org.flowable.engine.repository.ModelQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.validation.ValidationError; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,7 +66,8 @@ @Service public class ActModelServiceImpl implements IActModelService { - private final RepositoryService repositoryService; + @Autowired(required = false) + private RepositoryService repositoryService; private final IWfNodeConfigService wfNodeConfigService; private final IWfDefinitionConfigService wfDefinitionConfigService; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index e3c2ed67a..77fb257b5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -37,6 +37,7 @@ import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; import org.flowable.engine.repository.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -61,8 +62,10 @@ @Service public class ActProcessDefinitionServiceImpl implements IActProcessDefinitionService { - private final RepositoryService repositoryService; - private final ProcessMigrationService processMigrationService; + @Autowired(required = false) + private RepositoryService repositoryService; + @Autowired(required = false) + private ProcessMigrationService processMigrationService; private final IWfCategoryService wfCategoryService; private final IWfDefinitionConfigService wfDefinitionConfigService; private final WfDefinitionConfigMapper wfDefinitionConfigMapper; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index e22e80053..8b9b113fd 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -48,6 +48,7 @@ import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -68,12 +69,17 @@ @Service public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { - private final RepositoryService repositoryService; - private final RuntimeService runtimeService; - private final HistoryService historyService; - private final TaskService taskService; + @Autowired(required = false) + private RepositoryService repositoryService; + @Autowired(required = false) + private RuntimeService runtimeService; + @Autowired(required = false) + private HistoryService historyService; + @Autowired(required = false) + private TaskService taskService; + @Autowired(required = false) + private ManagementService managementService; private final IActHiProcinstService actHiProcinstService; - private final ManagementService managementService; private final IWfTaskBackNodeService wfTaskBackNodeService; private final IWfNodeConfigService wfNodeConfigService; private final FlowProcessEventHandler flowProcessEventHandler; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index b6ae67ebf..5235d1265 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -52,6 +52,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.flowable.variable.api.persistence.entity.VariableInstance; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -71,11 +72,16 @@ @Service public class ActTaskServiceImpl implements IActTaskService { - private final RuntimeService runtimeService; - private final TaskService taskService; - private final HistoryService historyService; - private final IdentityService identityService; - private final ManagementService managementService; + @Autowired(required = false) + private RuntimeService runtimeService; + @Autowired(required = false) + private TaskService taskService; + @Autowired(required = false) + private HistoryService historyService; + @Autowired(required = false) + private IdentityService identityService; + @Autowired(required = false) + private ManagementService managementService; private final ActTaskMapper actTaskMapper; private final IWfTaskBackNodeService wfTaskBackNodeService; private final ActHiTaskinstMapper actHiTaskinstMapper; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java index b498262c2..e5628232b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java @@ -15,6 +15,7 @@ import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,8 +33,8 @@ public class WfCategoryServiceImpl implements IWfCategoryService { private final WfCategoryMapper baseMapper; - - private final RepositoryService repositoryService; + @Autowired(required = false) + private RepositoryService repositoryService; /** * 查询流程分类 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 11f6ef106..f75a18880 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -8,6 +8,7 @@ import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.engine.RuntimeService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -22,8 +23,9 @@ @Service public class WorkflowServiceImpl implements WorkflowService { + @Autowired(required = false) + private RuntimeService runtimeService; private final IActProcessInstanceService iActProcessInstanceService; - private final RuntimeService runtimeService; private final IActHiProcinstService iActHiProcinstService; /** * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 From 88a4a5195642886eaeb97f590ce2be69759d89b0 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, 6 Aug 2024 16:10:11 +0800 Subject: [PATCH 069/104] =?UTF-8?q?update=20=E9=BB=98=E8=AE=A4=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 3e789d682..5d94bef93 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -273,7 +273,7 @@ websocket: --- #flowable配置 flowable: # 开关 用于启动/停用工作流 - enabled: false + enabled: true process.enabled: ${flowable.enabled} eventregistry.enabled: ${flowable.enabled} async-executor-activate: false #关闭定时任务JOB From f124fbd6aa4d305948a676339cefcd4720e41b97 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, 7 Aug 2024 09:57:20 +0800 Subject: [PATCH 070/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=BA=94=E7=94=A8sse=E9=94=80=E6=AF=81=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 --- .../org/dromara/common/sse/controller/SseController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index 6c136b582..91413f191 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -7,6 +7,7 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.sse.core.SseEmitterManager; import org.dromara.common.sse.dto.SseMessageDto; +import org.springframework.beans.factory.DisposableBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -18,7 +19,7 @@ @RestController @ConditionalOnProperty(value = "sse.enabled", havingValue = "true") @RequiredArgsConstructor -public class SseController { +public class SseController implements DisposableBean { private final SseEmitterManager sseEmitterManager; @@ -53,4 +54,9 @@ public R send(String msg) { return R.ok(); } + @Override + public void destroy() throws Exception { + // 销毁时不需要做什么 此方法避免无用操作报错 + } + } From 6d28072167dbdc00f945a939d0240cea732b83a1 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, 7 Aug 2024 09:58:11 +0800 Subject: [PATCH 071/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E5=8D=87=E7=BA=A7=20undertow=20=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=99=9A=E6=8B=9F=E7=BA=BF=E7=A8=8B=E6=BA=A2?= =?UTF-8?q?=E5=87=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + ruoyi-common/ruoyi-common-web/pom.xml | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/pom.xml b/pom.xml index 1dc79cf0d..d84f17296 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 1.16.6 2.7.0 + 2.3.15.Final 2.25.15 diff --git a/ruoyi-common/ruoyi-common-web/pom.xml b/ruoyi-common/ruoyi-common-web/pom.xml index b250fa9d0..295b3ed43 100644 --- a/ruoyi-common/ruoyi-common-web/pom.xml +++ b/ruoyi-common/ruoyi-common-web/pom.xml @@ -43,6 +43,22 @@ spring-boot-starter-undertow + + io.undertow + undertow-core + ${undertow.version} + + + io.undertow + undertow-servlet + ${undertow.version} + + + io.undertow + undertow-websockets-jsr + ${undertow.version} + + org.springframework.boot spring-boot-starter-actuator From 3fc37d6362d230a6563dcf57f791391983931236 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, 7 Aug 2024 11:19:16 +0800 Subject: [PATCH 072/104] update easyexcel 3.3.4 => 4.0.2 --- pom.xml | 19 +------------------ ruoyi-common/ruoyi-common-excel/pom.xml | 5 +++++ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index d84f17296..56822348c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,7 @@ 3.5.16 2.6.0 0.15.0 - 5.2.3 - 3.3.4 + 4.0.2 2.3 1.38.0 3.5.7 @@ -158,26 +157,10 @@ ${lombok.version} - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-ooxml - ${poi.version} - com.alibaba easyexcel ${easyexcel.version} - - - org.apache.poi - poi-ooxml-schemas - - diff --git a/ruoyi-common/ruoyi-common-excel/pom.xml b/ruoyi-common/ruoyi-common-excel/pom.xml index dd4a5eebe..14b9410bb 100644 --- a/ruoyi-common/ruoyi-common-excel/pom.xml +++ b/ruoyi-common/ruoyi-common-excel/pom.xml @@ -25,6 +25,11 @@ com.alibaba easyexcel + + commons-compress + org.apache.commons + 1.26.2 +
From 31569646b0f2d274660e6c6bba02defb43405474 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, 7 Aug 2024 11:20:34 +0800 Subject: [PATCH 073/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=BC=8F=E6=B4=9E=20=E9=99=90=E5=88=B6=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 ++++++++++++++++++++++ ruoyi-common/ruoyi-common-web/pom.xml | 3 --- ruoyi-modules/ruoyi-workflow/pom.xml | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 56822348c..8b96348ae 100644 --- a/pom.xml +++ b/pom.xml @@ -319,6 +319,28 @@ ${ip2region.version} + + io.undertow + undertow-core + ${undertow.version} + + + io.undertow + undertow-servlet + ${undertow.version} + + + io.undertow + undertow-websockets-jsr + ${undertow.version} + + + + commons-compress + org.apache.commons + 1.26.2 + + com.alibaba fastjson diff --git a/ruoyi-common/ruoyi-common-web/pom.xml b/ruoyi-common/ruoyi-common-web/pom.xml index 295b3ed43..5e366bc3b 100644 --- a/ruoyi-common/ruoyi-common-web/pom.xml +++ b/ruoyi-common/ruoyi-common-web/pom.xml @@ -46,17 +46,14 @@ io.undertow undertow-core - ${undertow.version} io.undertow undertow-servlet - ${undertow.version} io.undertow undertow-websockets-jsr - ${undertow.version} diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index 9ed40970a..e55839ef7 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -57,7 +57,7 @@ org.apache.xmlgraphics batik-all - 1.10 + 1.17 xalan From 7f60ba9888dde4488f3beb16ab44c11e947793c2 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, 7 Aug 2024 11:22:14 +0800 Subject: [PATCH 074/104] update redisson 3.33.0 => 3.34.1 update mapstruct-plus 1.3.6 => 1.4.3 update sms4j 3.2.1 => 3.3.1 update lombok 1.18.32 => 1.18.34 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 8b96348ae..a5d1fc410 100644 --- a/pom.xml +++ b/pom.xml @@ -29,14 +29,14 @@ 5.8.29 4.10.0 3.2.3 - 3.33.0 + 3.34.1 2.2.7 4.3.1 2.14.4 1.1.1 - 1.3.6 + 1.4.3 0.2.0 - 1.18.32 + 1.18.34 1.76 1.16.6 @@ -47,7 +47,7 @@ 2.25.15 0.29.13 - 3.2.1 + 3.3.1 1.2.83 From f03c00b2c17835949cbb67adfd79c90d988d9117 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, 7 Aug 2024 22:27:05 +0800 Subject: [PATCH 075/104] =?UTF-8?q?reset=20=E5=9B=9E=E6=BB=9A=20sms4j=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7(=E6=9C=89=E9=97=AE?= =?UTF-8?q?=E9=A2=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5d1fc410..d96f19d0c 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 2.25.15 0.29.13 - 3.3.1 + 3.2.1 1.2.83 From 44d776a76fa31e95303d1c823803c5c07933dff1 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 Aug 2024 10:38:43 +0800 Subject: [PATCH 076/104] update sms4j 3.2.1 => 3.3.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d96f19d0c..6708cc8b1 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 2.25.15 0.29.13 - 3.2.1 + 3.3.2 1.2.83 From 23b70ca0becb37471ead0928727f10a5d0d00740 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 Aug 2024 11:54:47 +0800 Subject: [PATCH 077/104] update anyline 8.7.2-20240808 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6708cc8b1..bbb394ea7 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.2.83 - 8.7.2-20240728 + 8.7.2-20240808 7.0.1 From bc2b4876b61decd2f912977d073e24b195a07881 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 9 Aug 2024 14:08:19 +0800 Subject: [PATCH 078/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E9=9B=86=E5=90=88=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/generator/service/GenTableServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 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 e1e340ff1..99935f7fa 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 @@ -3,7 +3,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DSTransactional; @@ -196,7 +195,7 @@ public List selectDbTableListByNames(String[] tableNames, String dataN .filter(x -> !StringUtils.containsAnyIgnoreCase(x.getName(), TABLE_IGNORE)) .filter(x -> tableNameSet.contains(x.getName())).toList(); - if (ArrayUtil.isEmpty(tableList)) { + if (CollUtil.isEmpty(tableList)) { return new ArrayList<>(); } return tableList.stream().map(x -> { From b8d9af65e2e60fcfb448d277b0ed3daef9688b2d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 9 Aug 2024 17:24:44 +0800 Subject: [PATCH 079/104] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0sse=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/controller/SseController.java | 25 ++++++++++++++++++ .../common/sse/core/SseEmitterManager.java | 26 +++++++++++++++++++ .../common/sse/utils/SseMessageUtils.java | 2 +- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index 91413f191..e5331e419 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -16,6 +16,11 @@ import java.util.List; +/** + * SSE 控制器 + * + * @author Lion Li + */ @RestController @ConditionalOnProperty(value = "sse.enabled", havingValue = "true") @RequiredArgsConstructor @@ -23,6 +28,9 @@ public class SseController implements DisposableBean { private final SseEmitterManager sseEmitterManager; + /** + * 建立 SSE 连接 + */ @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter connect() { String tokenValue = StpUtil.getTokenValue(); @@ -30,6 +38,9 @@ public SseEmitter connect() { return sseEmitterManager.connect(userId, tokenValue); } + /** + * 关闭 SSE 连接 + */ @SaIgnore @GetMapping(value = "${sse.path}/close") public R close() { @@ -39,6 +50,12 @@ public R close() { return R.ok(); } + /** + * 向特定用户发送消息 + * + * @param userId 目标用户的 ID + * @param msg 要发送的消息内容 + */ @GetMapping(value = "${sse.path}/send") public R send(Long userId, String msg) { SseMessageDto dto = new SseMessageDto(); @@ -48,12 +65,20 @@ public R send(Long userId, String msg) { return R.ok(); } + /** + * 向所有用户发送消息 + * + * @param msg 要发送的消息内容 + */ @GetMapping(value = "${sse.path}/sendAll") public R send(String msg) { sseEmitterManager.publishAll(msg); return R.ok(); } + /** + * 清理资源。此方法目前不执行任何操作,但避免因未实现而导致错误 + */ @Override public void destroy() throws Exception { // 销毁时不需要做什么 此方法避免无用操作报错 diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 039e17f4e..1d37a27de 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -13,8 +13,14 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; +/** + * 管理 Server-Sent Events (SSE) 连接 + * + * @author Lion Li + */ @Slf4j public class SseEmitterManager { + /** * 订阅的频道 */ @@ -22,24 +28,44 @@ public class SseEmitterManager { private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); + /** + * 建立与指定用户的 SSE 连接 + * + * @param userId 用户的唯一标识符,用于区分不同用户的连接 + * @param token 用户的唯一令牌,用于识别具体的连接 + * @return 返回一个 SseEmitter 实例,客户端可以通过该实例接收 SSE 事件 + */ public SseEmitter connect(Long userId, String token) { + // 从 USER_TOKEN_EMITTERS 中获取或创建当前用户的 SseEmitter 映射表(ConcurrentHashMap) + // 每个用户可以有多个 SSE 连接,通过 token 进行区分 Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); + + // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 SseEmitter emitter = new SseEmitter(0L); emitters.put(token, emitter); + // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token emitter.onCompletion(() -> emitters.remove(token)); emitter.onTimeout(() -> emitters.remove(token)); emitter.onError((e) -> emitters.remove(token)); try { + // 向客户端发送一条连接成功的事件 emitter.send(SseEmitter.event().comment("connected")); } catch (IOException e) { + // 如果发送消息失败,则从映射表中移除 emitter emitters.remove(token); } return emitter; } + /** + * 断开指定用户的 SSE 连接 + * + * @param userId 用户的唯一标识符,用于区分不同用户的连接 + * @param token 用户的唯一令牌,用于识别具体的连接 + */ public void disconnect(Long userId, String token) { Map emitters = USER_TOKEN_EMITTERS.get(userId); if (emitters != null) { diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java index 4334e98bc..c6abdc8fd 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java @@ -8,7 +8,7 @@ import org.dromara.common.sse.dto.SseMessageDto; /** - * 工具类 + * SSE工具类 * * @author Lion Li */ From ca06a2311da20502ad54f4593f1f18a177c07c76 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, 13 Aug 2024 13:32:34 +0800 Subject: [PATCH 080/104] =?UTF-8?q?update=20hutool=205.8.29=20=3D>=205.8.3?= =?UTF-8?q?1=20=E8=A7=A3=E5=86=B3hutool=E4=B8=8D=E5=85=BC=E5=AE=B9jakarta?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/mail/config/MailConfig.java | 2 +- .../common/mail/utils/GlobalMailAccount.java | 46 -- .../common/mail/utils/InternalMailUtil.java | 108 --- .../org/dromara/common/mail/utils/Mail.java | 483 ------------- .../common/mail/utils/MailAccount.java | 659 ------------------ .../common/mail/utils/MailException.java | 40 -- .../dromara/common/mail/utils/MailUtils.java | 12 +- .../mail/utils/UserPassAuthenticator.java | 33 - 9 files changed, 9 insertions(+), 1376 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/GlobalMailAccount.java delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/InternalMailUtil.java delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/Mail.java delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailAccount.java delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailException.java delete mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/UserPassAuthenticator.java diff --git a/pom.xml b/pom.xml index bbb394ea7..7772834d6 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 1.38.0 3.5.7 3.9.1 - 5.8.29 + 5.8.31 4.10.0 3.2.3 3.34.1 diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java index 1b51c272c..0ea3007b9 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java @@ -1,7 +1,7 @@ package org.dromara.common.mail.config; +import cn.hutool.extra.mail.MailAccount; import org.dromara.common.mail.config.properties.MailProperties; -import org.dromara.common.mail.utils.MailAccount; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/GlobalMailAccount.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/GlobalMailAccount.java deleted file mode 100644 index fdae86975..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/GlobalMailAccount.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.io.IORuntimeException; - -/** - * 全局邮件帐户,依赖于邮件配置文件{@link MailAccount#MAIL_SETTING_PATHS} - * - * @author looly - */ -public enum GlobalMailAccount { - INSTANCE; - - private final MailAccount mailAccount; - - /** - * 构造 - */ - GlobalMailAccount() { - mailAccount = createDefaultAccount(); - } - - /** - * 获得邮件帐户 - * - * @return 邮件帐户 - */ - public MailAccount getAccount() { - return this.mailAccount; - } - - /** - * 创建默认帐户 - * - * @return MailAccount - */ - private MailAccount createDefaultAccount() { - for (String mailSettingPath : MailAccount.MAIL_SETTING_PATHS) { - try { - return new MailAccount(mailSettingPath); - } catch (IORuntimeException ignore) { - //ignore - } - } - return null; - } -} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/InternalMailUtil.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/InternalMailUtil.java deleted file mode 100644 index b755e7370..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/InternalMailUtil.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.util.ArrayUtil; -import jakarta.mail.internet.AddressException; -import jakarta.mail.internet.InternetAddress; -import jakarta.mail.internet.MimeUtility; - -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * 邮件内部工具类 - * - * @author looly - * @since 3.2.3 - */ -public class InternalMailUtil { - - /** - * 将多个字符串邮件地址转为{@link InternetAddress}列表
- * 单个字符串地址可以是多个地址合并的字符串 - * - * @param addrStrs 地址数组 - * @param charset 编码(主要用于中文用户名的编码) - * @return 地址数组 - * @since 4.0.3 - */ - public static InternetAddress[] parseAddressFromStrs(String[] addrStrs, Charset charset) { - final List resultList = new ArrayList<>(addrStrs.length); - InternetAddress[] addrs; - for (String addrStr : addrStrs) { - addrs = parseAddress(addrStr, charset); - if (ArrayUtil.isNotEmpty(addrs)) { - Collections.addAll(resultList, addrs); - } - } - return resultList.toArray(new InternetAddress[0]); - } - - /** - * 解析第一个地址 - * - * @param address 地址字符串 - * @param charset 编码,{@code null}表示使用系统属性定义的编码或系统编码 - * @return 地址列表 - */ - public static InternetAddress parseFirstAddress(String address, Charset charset) { - final InternetAddress[] internetAddresses = parseAddress(address, charset); - if (ArrayUtil.isEmpty(internetAddresses)) { - try { - return new InternetAddress(address); - } catch (AddressException e) { - throw new MailException(e); - } - } - return internetAddresses[0]; - } - - /** - * 将一个地址字符串解析为多个地址
- * 地址间使用" "、","、";"分隔 - * - * @param address 地址字符串 - * @param charset 编码,{@code null}表示使用系统属性定义的编码或系统编码 - * @return 地址列表 - */ - public static InternetAddress[] parseAddress(String address, Charset charset) { - InternetAddress[] addresses; - try { - addresses = InternetAddress.parse(address); - } catch (AddressException e) { - throw new MailException(e); - } - //编码用户名 - if (ArrayUtil.isNotEmpty(addresses)) { - final String charsetStr = null == charset ? null : charset.name(); - for (InternetAddress internetAddress : addresses) { - try { - internetAddress.setPersonal(internetAddress.getPersonal(), charsetStr); - } catch (UnsupportedEncodingException e) { - throw new MailException(e); - } - } - } - - return addresses; - } - - /** - * 编码中文字符
- * 编码失败返回原字符串 - * - * @param text 被编码的文本 - * @param charset 编码 - * @return 编码后的结果 - */ - public static String encodeText(String text, Charset charset) { - try { - return MimeUtility.encodeText(text, charset.name(), null); - } catch (UnsupportedEncodingException e) { - // ignore - } - return text; - } -} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/Mail.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/Mail.java deleted file mode 100644 index 6ca4b69ec..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/Mail.java +++ /dev/null @@ -1,483 +0,0 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.builder.Builder; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import jakarta.activation.DataHandler; -import jakarta.activation.DataSource; -import jakarta.activation.FileDataSource; -import jakarta.activation.FileTypeMap; -import jakarta.mail.*; -import jakarta.mail.internet.MimeBodyPart; -import jakarta.mail.internet.MimeMessage; -import jakarta.mail.internet.MimeMultipart; -import jakarta.mail.internet.MimeUtility; -import jakarta.mail.util.ByteArrayDataSource; - -import java.io.*; -import java.nio.charset.Charset; -import java.util.Date; - -/** - * 邮件发送客户端 - * - * @author looly - * @since 3.2.0 - */ -public class Mail implements Builder { - @Serial - private static final long serialVersionUID = 1L; - - /** - * 邮箱帐户信息以及一些客户端配置信息 - */ - private final MailAccount mailAccount; - /** - * 收件人列表 - */ - private String[] tos; - /** - * 抄送人列表(carbon copy) - */ - private String[] ccs; - /** - * 密送人列表(blind carbon copy) - */ - private String[] bccs; - /** - * 回复地址(reply-to) - */ - private String[] reply; - /** - * 标题 - */ - private String title; - /** - * 内容 - */ - private String content; - /** - * 是否为HTML - */ - private boolean isHtml; - /** - * 正文、附件和图片的混合部分 - */ - private final Multipart multipart = new MimeMultipart(); - /** - * 是否使用全局会话,默认为false - */ - private boolean useGlobalSession = false; - - /** - * debug输出位置,可以自定义debug日志 - */ - private PrintStream debugOutput; - - /** - * 创建邮件客户端 - * - * @param mailAccount 邮件帐号 - * @return Mail - */ - public static Mail create(MailAccount mailAccount) { - return new Mail(mailAccount); - } - - /** - * 创建邮件客户端,使用全局邮件帐户 - * - * @return Mail - */ - public static Mail create() { - return new Mail(); - } - - // --------------------------------------------------------------- Constructor start - - /** - * 构造,使用全局邮件帐户 - */ - public Mail() { - this(GlobalMailAccount.INSTANCE.getAccount()); - } - - /** - * 构造 - * - * @param mailAccount 邮件帐户,如果为null使用默认配置文件的全局邮件配置 - */ - public Mail(MailAccount mailAccount) { - mailAccount = (null != mailAccount) ? mailAccount : GlobalMailAccount.INSTANCE.getAccount(); - this.mailAccount = mailAccount.defaultIfEmpty(); - } - // --------------------------------------------------------------- Constructor end - - // --------------------------------------------------------------- Getters and Setters start - - /** - * 设置收件人 - * - * @param tos 收件人列表 - * @return this - * @see #setTos(String...) - */ - public Mail to(String... tos) { - return setTos(tos); - } - - /** - * 设置多个收件人 - * - * @param tos 收件人列表 - * @return this - */ - public Mail setTos(String... tos) { - this.tos = tos; - return this; - } - - /** - * 设置多个抄送人(carbon copy) - * - * @param ccs 抄送人列表 - * @return this - * @since 4.0.3 - */ - public Mail setCcs(String... ccs) { - this.ccs = ccs; - return this; - } - - /** - * 设置多个密送人(blind carbon copy) - * - * @param bccs 密送人列表 - * @return this - * @since 4.0.3 - */ - public Mail setBccs(String... bccs) { - this.bccs = bccs; - return this; - } - - /** - * 设置多个回复地址(reply-to) - * - * @param reply 回复地址(reply-to)列表 - * @return this - * @since 4.6.0 - */ - public Mail setReply(String... reply) { - this.reply = reply; - return this; - } - - /** - * 设置标题 - * - * @param title 标题 - * @return this - */ - public Mail setTitle(String title) { - this.title = title; - return this; - } - - /** - * 设置正文
- * 正文可以是普通文本也可以是HTML(默认普通文本),可以通过调用{@link #setHtml(boolean)} 设置是否为HTML - * - * @param content 正文 - * @return this - */ - public Mail setContent(String content) { - this.content = content; - return this; - } - - /** - * 设置是否是HTML - * - * @param isHtml 是否为HTML - * @return this - */ - public Mail setHtml(boolean isHtml) { - this.isHtml = isHtml; - return this; - } - - /** - * 设置正文 - * - * @param content 正文内容 - * @param isHtml 是否为HTML - * @return this - */ - public Mail setContent(String content, boolean isHtml) { - setContent(content); - return setHtml(isHtml); - } - - /** - * 设置文件类型附件,文件可以是图片文件,此时自动设置cid(正文中引用图片),默认cid为文件名 - * - * @param files 附件文件列表 - * @return this - */ - public Mail setFiles(File... files) { - if (ArrayUtil.isEmpty(files)) { - return this; - } - - final DataSource[] attachments = new DataSource[files.length]; - for (int i = 0; i < files.length; i++) { - attachments[i] = new FileDataSource(files[i]); - } - return setAttachments(attachments); - } - - /** - * 增加附件或图片,附件使用{@link DataSource} 形式表示,可以使用{@link FileDataSource}包装文件表示文件附件 - * - * @param attachments 附件列表 - * @return this - * @since 4.0.9 - */ - public Mail setAttachments(DataSource... attachments) { - if (ArrayUtil.isNotEmpty(attachments)) { - final Charset charset = this.mailAccount.getCharset(); - MimeBodyPart bodyPart; - String nameEncoded; - try { - for (DataSource attachment : attachments) { - bodyPart = new MimeBodyPart(); - bodyPart.setDataHandler(new DataHandler(attachment)); - nameEncoded = attachment.getName(); - if (this.mailAccount.isEncodefilename()) { - nameEncoded = InternalMailUtil.encodeText(nameEncoded, charset); - } - // 普通附件文件名 - bodyPart.setFileName(nameEncoded); - if (StrUtil.startWith(attachment.getContentType(), "image/")) { - // 图片附件,用于正文中引用图片 - bodyPart.setContentID(nameEncoded); - } - this.multipart.addBodyPart(bodyPart); - } - } catch (MessagingException e) { - throw new MailException(e); - } - } - return this; - } - - /** - * 增加图片,图片的键对应到邮件模板中的占位字符串,图片类型默认为"image/jpeg" - * - * @param cid 图片与占位符,占位符格式为cid:${cid} - * @param imageStream 图片文件 - * @return this - * @since 4.6.3 - */ - public Mail addImage(String cid, InputStream imageStream) { - return addImage(cid, imageStream, null); - } - - /** - * 增加图片,图片的键对应到邮件模板中的占位字符串 - * - * @param cid 图片与占位符,占位符格式为cid:${cid} - * @param imageStream 图片流,不关闭 - * @param contentType 图片类型,null赋值默认的"image/jpeg" - * @return this - * @since 4.6.3 - */ - public Mail addImage(String cid, InputStream imageStream, String contentType) { - ByteArrayDataSource imgSource; - try { - imgSource = new ByteArrayDataSource(imageStream, ObjectUtil.defaultIfNull(contentType, "image/jpeg")); - } catch (IOException e) { - throw new IORuntimeException(e); - } - imgSource.setName(cid); - return setAttachments(imgSource); - } - - /** - * 增加图片,图片的键对应到邮件模板中的占位字符串 - * - * @param cid 图片与占位符,占位符格式为cid:${cid} - * @param imageFile 图片文件 - * @return this - * @since 4.6.3 - */ - public Mail addImage(String cid, File imageFile) { - InputStream in = null; - try { - in = FileUtil.getInputStream(imageFile); - return addImage(cid, in, FileTypeMap.getDefaultFileTypeMap().getContentType(imageFile)); - } finally { - IoUtil.close(in); - } - } - - /** - * 设置字符集编码 - * - * @param charset 字符集编码 - * @return this - * @see MailAccount#setCharset(Charset) - */ - public Mail setCharset(Charset charset) { - this.mailAccount.setCharset(charset); - return this; - } - - /** - * 设置是否使用全局会话,默认为true - * - * @param isUseGlobalSession 是否使用全局会话,默认为true - * @return this - * @since 4.0.2 - */ - public Mail setUseGlobalSession(boolean isUseGlobalSession) { - this.useGlobalSession = isUseGlobalSession; - return this; - } - - /** - * 设置debug输出位置,可以自定义debug日志 - * - * @param debugOutput debug输出位置 - * @return this - * @since 5.5.6 - */ - public Mail setDebugOutput(PrintStream debugOutput) { - this.debugOutput = debugOutput; - return this; - } - // --------------------------------------------------------------- Getters and Setters end - - @Override - public MimeMessage build() { - try { - return buildMsg(); - } catch (MessagingException e) { - throw new MailException(e); - } - } - - /** - * 发送 - * - * @return message-id - * @throws MailException 邮件发送异常 - */ - public String send() throws MailException { - try { - return doSend(); - } catch (MessagingException e) { - if (e instanceof SendFailedException) { - // 当地址无效时,显示更加详细的无效地址信息 - final Address[] invalidAddresses = ((SendFailedException) e).getInvalidAddresses(); - final String msg = StrUtil.format("Invalid Addresses: {}", ArrayUtil.toString(invalidAddresses)); - throw new MailException(msg, e); - } - throw new MailException(e); - } - } - - // --------------------------------------------------------------- Private method start - - /** - * 执行发送 - * - * @return message-id - * @throws MessagingException 发送异常 - */ - private String doSend() throws MessagingException { - final MimeMessage mimeMessage = buildMsg(); - Transport.send(mimeMessage); - return mimeMessage.getMessageID(); - } - - /** - * 构建消息 - * - * @return {@link MimeMessage}消息 - * @throws MessagingException 消息异常 - */ - private MimeMessage buildMsg() throws MessagingException { - final Charset charset = this.mailAccount.getCharset(); - final MimeMessage msg = new MimeMessage(getSession()); - // 发件人 - final String from = this.mailAccount.getFrom(); - if (StrUtil.isEmpty(from)) { - // 用户未提供发送方,则从Session中自动获取 - msg.setFrom(); - } else { - msg.setFrom(InternalMailUtil.parseFirstAddress(from, charset)); - } - // 标题 - msg.setSubject(this.title, (null == charset) ? null : charset.name()); - // 发送时间 - msg.setSentDate(new Date()); - // 内容和附件 - msg.setContent(buildContent(charset)); - // 收件人 - msg.setRecipients(MimeMessage.RecipientType.TO, InternalMailUtil.parseAddressFromStrs(this.tos, charset)); - // 抄送人 - if (ArrayUtil.isNotEmpty(this.ccs)) { - msg.setRecipients(MimeMessage.RecipientType.CC, InternalMailUtil.parseAddressFromStrs(this.ccs, charset)); - } - // 密送人 - if (ArrayUtil.isNotEmpty(this.bccs)) { - msg.setRecipients(MimeMessage.RecipientType.BCC, InternalMailUtil.parseAddressFromStrs(this.bccs, charset)); - } - // 回复地址(reply-to) - if (ArrayUtil.isNotEmpty(this.reply)) { - msg.setReplyTo(InternalMailUtil.parseAddressFromStrs(this.reply, charset)); - } - - return msg; - } - - /** - * 构建邮件信息主体 - * - * @param charset 编码,{@code null}则使用{@link MimeUtility#getDefaultJavaCharset()} - * @return 邮件信息主体 - * @throws MessagingException 消息异常 - */ - private Multipart buildContent(Charset charset) throws MessagingException { - final String charsetStr = null != charset ? charset.name() : MimeUtility.getDefaultJavaCharset(); - // 正文 - final MimeBodyPart body = new MimeBodyPart(); - body.setContent(content, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charsetStr)); - this.multipart.addBodyPart(body); - - return this.multipart; - } - - /** - * 获取默认邮件会话
- * 如果为全局单例的会话,则全局只允许一个邮件帐号,否则每次发送邮件会新建一个新的会话 - * - * @return 邮件会话 {@link Session} - */ - private Session getSession() { - final Session session = MailUtils.getSession(this.mailAccount, this.useGlobalSession); - - if (null != this.debugOutput) { - session.setDebugOut(debugOutput); - } - - return session; - } - // --------------------------------------------------------------- Private method end -} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailAccount.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailAccount.java deleted file mode 100644 index 2a732a1a9..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailAccount.java +++ /dev/null @@ -1,659 +0,0 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.setting.Setting; - -import java.io.Serial; -import java.io.Serializable; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -/** - * 邮件账户对象 - * - * @author Luxiaolei - */ -public class MailAccount implements Serializable { - @Serial - private static final long serialVersionUID = -6937313421815719204L; - - private static final String MAIL_PROTOCOL = "mail.transport.protocol"; - private static final String SMTP_HOST = "mail.smtp.host"; - private static final String SMTP_PORT = "mail.smtp.port"; - private static final String SMTP_AUTH = "mail.smtp.auth"; - private static final String SMTP_TIMEOUT = "mail.smtp.timeout"; - private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; - private static final String SMTP_WRITE_TIMEOUT = "mail.smtp.writetimeout"; - - // SSL - private static final String STARTTLS_ENABLE = "mail.smtp.starttls.enable"; - private static final String SSL_ENABLE = "mail.smtp.ssl.enable"; - private static final String SSL_PROTOCOLS = "mail.smtp.ssl.protocols"; - private static final String SOCKET_FACTORY = "mail.smtp.socketFactory.class"; - private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback"; - private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port"; - - // System Properties - private static final String SPLIT_LONG_PARAMS = "mail.mime.splitlongparameters"; - //private static final String ENCODE_FILE_NAME = "mail.mime.encodefilename"; - //private static final String CHARSET = "mail.mime.charset"; - - // 其他 - private static final String MAIL_DEBUG = "mail.debug"; - - public static final String[] MAIL_SETTING_PATHS = new String[]{"config/mail.setting", "config/mailAccount.setting", "mail.setting"}; - - /** - * SMTP服务器域名 - */ - private String host; - /** - * SMTP服务端口 - */ - private Integer port; - /** - * 是否需要用户名密码验证 - */ - private Boolean auth; - /** - * 用户名 - */ - private String user; - /** - * 密码 - */ - private String pass; - /** - * 发送方,遵循RFC-822标准 - */ - private String from; - - /** - * 是否打开调试模式,调试模式会显示与邮件服务器通信过程,默认不开启 - */ - private boolean debug; - /** - * 编码用于编码邮件正文和发送人、收件人等中文 - */ - private Charset charset = CharsetUtil.CHARSET_UTF_8; - /** - * 对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名) - */ - private boolean splitlongparameters = false; - /** - * 对于文件名是否使用{@link #charset}编码,默认为 {@code true} - */ - private boolean encodefilename = true; - - /** - * 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - */ - private boolean starttlsEnable = false; - /** - * 使用 SSL安全连接 - */ - private Boolean sslEnable; - - /** - * SSL协议,多个协议用空格分隔 - */ - private String sslProtocols; - - /** - * 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 - */ - private String socketFactoryClass = "javax.net.ssl.SSLSocketFactory"; - /** - * 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true - */ - private boolean socketFactoryFallback; - /** - * 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口 - */ - private int socketFactoryPort = 465; - - /** - * SMTP超时时长,单位毫秒,缺省值不超时 - */ - private long timeout; - /** - * Socket连接超时值,单位毫秒,缺省值不超时 - */ - private long connectionTimeout; - /** - * Socket写出超时值,单位毫秒,缺省值不超时 - */ - private long writeTimeout; - - /** - * 自定义的其他属性,此自定义属性会覆盖默认属性 - */ - private final Map customProperty = new HashMap<>(); - - // -------------------------------------------------------------- Constructor start - - /** - * 构造,所有参数需自行定义或保持默认值 - */ - public MailAccount() { - } - - /** - * 构造 - * - * @param settingPath 配置文件路径 - */ - public MailAccount(String settingPath) { - this(new Setting(settingPath)); - } - - /** - * 构造 - * - * @param setting 配置文件 - */ - public MailAccount(Setting setting) { - setting.toBean(this); - } - - // -------------------------------------------------------------- Constructor end - - /** - * 获得SMTP服务器域名 - * - * @return SMTP服务器域名 - */ - public String getHost() { - return host; - } - - /** - * 设置SMTP服务器域名 - * - * @param host SMTP服务器域名 - * @return this - */ - public MailAccount setHost(String host) { - this.host = host; - return this; - } - - /** - * 获得SMTP服务端口 - * - * @return SMTP服务端口 - */ - public Integer getPort() { - return port; - } - - /** - * 设置SMTP服务端口 - * - * @param port SMTP服务端口 - * @return this - */ - public MailAccount setPort(Integer port) { - this.port = port; - return this; - } - - /** - * 是否需要用户名密码验证 - * - * @return 是否需要用户名密码验证 - */ - public Boolean isAuth() { - return auth; - } - - /** - * 设置是否需要用户名密码验证 - * - * @param isAuth 是否需要用户名密码验证 - * @return this - */ - public MailAccount setAuth(boolean isAuth) { - this.auth = isAuth; - return this; - } - - /** - * 获取用户名 - * - * @return 用户名 - */ - public String getUser() { - return user; - } - - /** - * 设置用户名 - * - * @param user 用户名 - * @return this - */ - public MailAccount setUser(String user) { - this.user = user; - return this; - } - - /** - * 获取密码 - * - * @return 密码 - */ - public String getPass() { - return pass; - } - - /** - * 设置密码 - * - * @param pass 密码 - * @return this - */ - public MailAccount setPass(String pass) { - this.pass = pass; - return this; - } - - /** - * 获取发送方,遵循RFC-822标准 - * - * @return 发送方,遵循RFC-822标准 - */ - public String getFrom() { - return from; - } - - /** - * 设置发送方,遵循RFC-822标准
- * 发件人可以是以下形式: - * - *

-     * 1. user@xxx.xx
-     * 2.  name <user@xxx.xx>
-     * 
- * - * @param from 发送方,遵循RFC-822标准 - * @return this - */ - public MailAccount setFrom(String from) { - this.from = from; - return this; - } - - /** - * 是否打开调试模式,调试模式会显示与邮件服务器通信过程,默认不开启 - * - * @return 是否打开调试模式,调试模式会显示与邮件服务器通信过程,默认不开启 - * @since 4.0.2 - */ - public boolean isDebug() { - return debug; - } - - /** - * 设置是否打开调试模式,调试模式会显示与邮件服务器通信过程,默认不开启 - * - * @param debug 是否打开调试模式,调试模式会显示与邮件服务器通信过程,默认不开启 - * @return this - * @since 4.0.2 - */ - public MailAccount setDebug(boolean debug) { - this.debug = debug; - return this; - } - - /** - * 获取字符集编码 - * - * @return 编码,可能为{@code null} - */ - public Charset getCharset() { - return charset; - } - - /** - * 设置字符集编码,此选项不会修改全局配置,若修改全局配置,请设置此项为{@code null}并设置: - *
-     * 	System.setProperty("mail.mime.charset", charset);
-     * 
- * - * @param charset 字符集编码,{@code null} 则表示使用全局设置的默认编码,全局编码为mail.mime.charset系统属性 - * @return this - */ - public MailAccount setCharset(Charset charset) { - this.charset = charset; - return this; - } - - /** - * 对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名) - * - * @return 对于超长参数是否切分为多份 - */ - public boolean isSplitlongparameters() { - return splitlongparameters; - } - - /** - * 设置对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名)
- * 注意此项为全局设置,此项会调用 - *
-     * System.setProperty("mail.mime.splitlongparameters", true)
-     * 
- * - * @param splitlongparameters 对于超长参数是否切分为多份 - */ - public void setSplitlongparameters(boolean splitlongparameters) { - this.splitlongparameters = splitlongparameters; - } - - /** - * 对于文件名是否使用{@link #charset}编码,默认为 {@code true} - * - * @return 对于文件名是否使用{@link #charset}编码,默认为 {@code true} - * @since 5.7.16 - */ - public boolean isEncodefilename() { - - return encodefilename; - } - - /** - * 设置对于文件名是否使用{@link #charset}编码,此选项不会修改全局配置
- * 如果此选项设置为{@code false},则是否编码取决于两个系统属性: - *
    - *
  • mail.mime.encodefilename 是否编码附件文件名
  • - *
  • mail.mime.charset 编码文件名的编码
  • - *
- * - * @param encodefilename 对于文件名是否使用{@link #charset}编码 - * @since 5.7.16 - */ - public void setEncodefilename(boolean encodefilename) { - this.encodefilename = encodefilename; - } - - /** - * 是否使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - * - * @return 是否使用 STARTTLS安全连接 - */ - public boolean isStarttlsEnable() { - return this.starttlsEnable; - } - - /** - * 设置是否使用STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - * - * @param startttlsEnable 是否使用STARTTLS安全连接 - * @return this - */ - public MailAccount setStarttlsEnable(boolean startttlsEnable) { - this.starttlsEnable = startttlsEnable; - return this; - } - - /** - * 是否使用 SSL安全连接 - * - * @return 是否使用 SSL安全连接 - */ - public Boolean isSslEnable() { - return this.sslEnable; - } - - /** - * 设置是否使用SSL安全连接 - * - * @param sslEnable 是否使用SSL安全连接 - * @return this - */ - public MailAccount setSslEnable(Boolean sslEnable) { - this.sslEnable = sslEnable; - return this; - } - - /** - * 获取SSL协议,多个协议用空格分隔 - * - * @return SSL协议,多个协议用空格分隔 - * @since 5.5.7 - */ - public String getSslProtocols() { - return sslProtocols; - } - - /** - * 设置SSL协议,多个协议用空格分隔 - * - * @param sslProtocols SSL协议,多个协议用空格分隔 - * @since 5.5.7 - */ - public void setSslProtocols(String sslProtocols) { - this.sslProtocols = sslProtocols; - } - - /** - * 获取指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 - * - * @return 指定实现javax.net.SocketFactory接口的类的名称, 这个类将被用于创建SMTP的套接字 - */ - public String getSocketFactoryClass() { - return socketFactoryClass; - } - - /** - * 设置指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 - * - * @param socketFactoryClass 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 - * @return this - */ - public MailAccount setSocketFactoryClass(String socketFactoryClass) { - this.socketFactoryClass = socketFactoryClass; - return this; - } - - /** - * 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true - * - * @return 如果设置为true, 未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true - */ - public boolean isSocketFactoryFallback() { - return socketFactoryFallback; - } - - /** - * 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true - * - * @param socketFactoryFallback 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true - * @return this - */ - public MailAccount setSocketFactoryFallback(boolean socketFactoryFallback) { - this.socketFactoryFallback = socketFactoryFallback; - return this; - } - - /** - * 获取指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口 - * - * @return 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口 - */ - public int getSocketFactoryPort() { - return socketFactoryPort; - } - - /** - * 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口 - * - * @param socketFactoryPort 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口 - * @return this - */ - public MailAccount setSocketFactoryPort(int socketFactoryPort) { - this.socketFactoryPort = socketFactoryPort; - return this; - } - - /** - * 设置SMTP超时时长,单位毫秒,缺省值不超时 - * - * @param timeout SMTP超时时长,单位毫秒,缺省值不超时 - * @return this - * @since 4.1.17 - */ - public MailAccount setTimeout(long timeout) { - this.timeout = timeout; - return this; - } - - /** - * 设置Socket连接超时值,单位毫秒,缺省值不超时 - * - * @param connectionTimeout Socket连接超时值,单位毫秒,缺省值不超时 - * @return this - * @since 4.1.17 - */ - public MailAccount setConnectionTimeout(long connectionTimeout) { - this.connectionTimeout = connectionTimeout; - return this; - } - - /** - * 设置Socket写出超时值,单位毫秒,缺省值不超时 - * - * @param writeTimeout Socket写出超时值,单位毫秒,缺省值不超时 - * @return this - * @since 5.8.3 - */ - public MailAccount setWriteTimeout(long writeTimeout) { - this.writeTimeout = writeTimeout; - return this; - } - - /** - * 获取自定义属性列表 - * - * @return 自定义参数列表 - * @since 5.6.4 - */ - public Map getCustomProperty() { - return customProperty; - } - - /** - * 设置自定义属性,如mail.smtp.ssl.socketFactory - * - * @param key 属性名,空白被忽略 - * @param value 属性值, null被忽略 - * @return this - * @since 5.6.4 - */ - public MailAccount setCustomProperty(String key, Object value) { - if (StrUtil.isNotBlank(key) && ObjectUtil.isNotNull(value)) { - this.customProperty.put(key, value); - } - return this; - } - - /** - * 获得SMTP相关信息 - * - * @return {@link Properties} - */ - public Properties getSmtpProps() { - //全局系统参数 - System.setProperty(SPLIT_LONG_PARAMS, String.valueOf(this.splitlongparameters)); - - final Properties p = new Properties(); - p.put(MAIL_PROTOCOL, "smtp"); - p.put(SMTP_HOST, this.host); - p.put(SMTP_PORT, String.valueOf(this.port)); - p.put(SMTP_AUTH, String.valueOf(this.auth)); - if (this.timeout > 0) { - p.put(SMTP_TIMEOUT, String.valueOf(this.timeout)); - } - if (this.connectionTimeout > 0) { - p.put(SMTP_CONNECTION_TIMEOUT, String.valueOf(this.connectionTimeout)); - } - // issue#2355 - if (this.writeTimeout > 0) { - p.put(SMTP_WRITE_TIMEOUT, String.valueOf(this.writeTimeout)); - } - - p.put(MAIL_DEBUG, String.valueOf(this.debug)); - - if (this.starttlsEnable) { - //STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - p.put(STARTTLS_ENABLE, "true"); - - if (null == this.sslEnable) { - //为了兼容旧版本,当用户没有此项配置时,按照starttlsEnable开启状态时对待 - this.sslEnable = true; - } - } - - // SSL - if (null != this.sslEnable && this.sslEnable) { - p.put(SSL_ENABLE, "true"); - p.put(SOCKET_FACTORY, socketFactoryClass); - p.put(SOCKET_FACTORY_FALLBACK, String.valueOf(this.socketFactoryFallback)); - p.put(SOCKET_FACTORY_PORT, String.valueOf(this.socketFactoryPort)); - // issue#IZN95@Gitee,在Linux下需自定义SSL协议版本 - if (StrUtil.isNotBlank(this.sslProtocols)) { - p.put(SSL_PROTOCOLS, this.sslProtocols); - } - } - - // 补充自定义属性,允许自定属性覆盖已经设置的值 - p.putAll(this.customProperty); - - return p; - } - - /** - * 如果某些值为null,使用默认值 - * - * @return this - */ - public MailAccount defaultIfEmpty() { - // 去掉发件人的姓名部分 - final String fromAddress = InternalMailUtil.parseFirstAddress(this.from, this.charset).getAddress(); - - if (StrUtil.isBlank(this.host)) { - // 如果SMTP地址为空,默认使用smtp.<发件人邮箱后缀> - this.host = StrUtil.format("smtp.{}", StrUtil.subSuf(fromAddress, fromAddress.indexOf('@') + 1)); - } - if (StrUtil.isBlank(user)) { - // 如果用户名为空,默认为发件人(issue#I4FYVY@Gitee) - //this.user = StrUtil.subPre(fromAddress, fromAddress.indexOf('@')); - this.user = fromAddress; - } - if (null == this.auth) { - // 如果密码非空白,则使用认证模式 - this.auth = (false == StrUtil.isBlank(this.pass)); - } - if (null == this.port) { - // 端口在SSL状态下默认与socketFactoryPort一致,非SSL状态下默认为25 - this.port = (null != this.sslEnable && this.sslEnable) ? this.socketFactoryPort : 25; - } - if (null == this.charset) { - // 默认UTF-8编码 - this.charset = CharsetUtil.CHARSET_UTF_8; - } - - return this; - } - - @Override - public String toString() { - return "MailAccount [host=" + host + ", port=" + port + ", auth=" + auth + ", user=" + user + ", pass=" + (StrUtil.isEmpty(this.pass) ? "" : "******") + ", from=" + from + ", startttlsEnable=" - + starttlsEnable + ", socketFactoryClass=" + socketFactoryClass + ", socketFactoryFallback=" + socketFactoryFallback + ", socketFactoryPort=" + socketFactoryPort + "]"; - } -} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailException.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailException.java deleted file mode 100644 index cc199d455..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailException.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.dromara.common.mail.utils; - -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.hutool.core.util.StrUtil; - -import java.io.Serial; - -/** - * 邮件异常 - * - * @author xiaoleilu - */ -public class MailException extends RuntimeException { - @Serial - private static final long serialVersionUID = 8247610319171014183L; - - public MailException(Throwable e) { - super(ExceptionUtil.getMessage(e), e); - } - - public MailException(String message) { - super(message); - } - - public MailException(String messageTemplate, Object... params) { - super(StrUtil.format(messageTemplate, params)); - } - - public MailException(String message, Throwable throwable) { - super(message, throwable); - } - - public MailException(String message, Throwable throwable, boolean enableSuppression, boolean writableStackTrace) { - super(message, throwable, enableSuppression, writableStackTrace); - } - - public MailException(Throwable throwable, String messageTemplate, Object... params) { - super(StrUtil.format(messageTemplate, params), throwable); - } -} diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java index 040cc572a..a28701fbc 100644 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/MailUtils.java @@ -5,6 +5,9 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.mail.JakartaMail; +import cn.hutool.extra.mail.JakartaUserPassAuthenticator; +import cn.hutool.extra.mail.MailAccount; import jakarta.mail.Authenticator; import jakarta.mail.Session; import lombok.AccessLevel; @@ -17,7 +20,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; - +import java.util.Map.Entry; /** * 邮件工具类 @@ -385,7 +388,7 @@ public static String send(MailAccount mailAccount, Collection tos, Colle public static Session getSession(MailAccount mailAccount, boolean isSingleton) { Authenticator authenticator = null; if (mailAccount.isAuth()) { - authenticator = new UserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); + authenticator = new JakartaUserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); } return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) // @@ -412,7 +415,7 @@ public static Session getSession(MailAccount mailAccount, boolean isSingleton) { */ private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, boolean isHtml, File... files) { - final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession); + final JakartaMail mail = JakartaMail.create(mailAccount).setUseGlobalSession(useGlobalSession); // 可选抄送人 if (CollUtil.isNotEmpty(ccs)) { @@ -431,7 +434,7 @@ private static String send(MailAccount mailAccount, boolean useGlobalSession, Co // 图片 if (MapUtil.isNotEmpty(imageMap)) { - for (Map.Entry entry : imageMap.entrySet()) { + for (Entry entry : imageMap.entrySet()) { mail.addImage(entry.getKey(), entry.getValue()); // 关闭流 IoUtil.close(entry.getValue()); @@ -463,5 +466,4 @@ private static List splitAddress(String addresses) { return result; } // ------------------------------------------------------------------------------------------------------------------------ Private method end - } diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/UserPassAuthenticator.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/UserPassAuthenticator.java deleted file mode 100644 index fbbe5e371..000000000 --- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/utils/UserPassAuthenticator.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.common.mail.utils; - -import jakarta.mail.Authenticator; -import jakarta.mail.PasswordAuthentication; - -/** - * 用户名密码验证器 - * - * @author looly - * @since 3.1.2 - */ -public class UserPassAuthenticator extends Authenticator { - - private final String user; - private final String pass; - - /** - * 构造 - * - * @param user 用户名 - * @param pass 密码 - */ - public UserPassAuthenticator(String user, String pass) { - this.user = user; - this.pass = pass; - } - - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(this.user, this.pass); - } - -} From 77f44574c00b536ef21286f3898265829e446a52 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 Aug 2024 11:53:15 +0800 Subject: [PATCH 081/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9spring=E6=BA=90=E7=A0=81=E4=B8=8A=E4=B8=8B=E6=96=87?= =?UTF-8?q?=E6=8C=81=E6=9C=89=E8=80=85=20=E6=94=AF=E6=8C=81=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=88=87=E6=8D=A2=E4=BC=A0=E9=80=92=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E6=95=B0=E6=8D=AE=20=E6=94=AF=E6=8C=81=E4=B8=80?= =?UTF-8?q?=E5=88=87=E5=BC=82=E6=AD=A5=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=AD=89=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/listener/UserActionListener.java | 1 - .../dromara/web/service/SysLoginService.java | 1 - .../web/service/SysRegisterService.java | 2 - ruoyi-common/ruoyi-common-core/pom.xml | 7 + .../context/request/RequestContextHolder.java | 161 ++++++++++++++++++ .../dromara/common/log/aspect/LogAspect.java | 14 -- .../common/log/event/LogininforEvent.java | 7 - .../impl/SysLogininforServiceImpl.java | 2 +- .../service/impl/SysOperLogServiceImpl.java | 23 ++- 9 files changed, 189 insertions(+), 29 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index 07595e092..a958de62d 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -71,7 +71,6 @@ public void doLogin(String loginType, Object loginId, String tokenValue, SaLogin logininforEvent.setUsername(username); logininforEvent.setStatus(Constants.LOGIN_SUCCESS); logininforEvent.setMessage(MessageUtils.message("user.login.success")); - logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); // 更新登录信息 loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); 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 52803663c..3ee67630b 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 @@ -139,7 +139,6 @@ public void recordLogininfor(String tenantId, String username, String status, St logininforEvent.setUsername(username); logininforEvent.setStatus(status); logininforEvent.setMessage(message); - logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java index ddab279bc..c7545fa65 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -11,7 +11,6 @@ import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.event.LogininforEvent; @@ -108,7 +107,6 @@ private void recordLogininfor(String tenantId, String username, String status, S logininforEvent.setUsername(username); logininforEvent.setStatus(status); logininforEvent.setMessage(message); - logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); } diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index 5925c9b3c..f6f8c2556 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -99,6 +99,13 @@ transmittable-thread-local + + jakarta.faces + jakarta.faces-api + 4.1.0 + true + + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java new file mode 100644 index 000000000..7f9622dbc --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java @@ -0,0 +1,161 @@ +/* + * Copyright 2002-2023 the original author or authors. + * + * 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 + * + * https://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 org.springframework.web.context.request; + +import com.alibaba.ttl.TransmittableThreadLocal; +import jakarta.faces.context.FacesContext; +import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; + +/** + * Holder class to expose the web request in the form of a thread-bound + * {@link RequestAttributes} object. The request will be inherited + * by any child threads spawned by the current thread if the + * {@code inheritable} flag is set to {@code true}. + * + *

Use {@link RequestContextListener} or + * {@link org.springframework.web.filter.RequestContextFilter} to expose + * the current web request. Note that + * already exposes the current request by default. + * + * 修改 spring 上下文存储方式 将 ThreadLocal 替换为 TransmittableThreadLocal + * 支持线程上下文切换变量传递 异步获取 spring 上下文 + * + * @author Juergen Hoeller + * @author Rod Johnson + * @since 2.0 + * @see RequestContextListener + * @see org.springframework.web.filter.RequestContextFilter + */ +public abstract class RequestContextHolder { + + private static final boolean jsfPresent = + ClassUtils.isPresent("jakarta.faces.context.FacesContext", RequestContextHolder.class.getClassLoader()); + + // ThreadLocal 替换为 TransmittableThreadLocal + private static final ThreadLocal requestAttributesHolder = + new TransmittableThreadLocal<>(); + + private static final ThreadLocal inheritableRequestAttributesHolder = + new TransmittableThreadLocal<>(); + + + /** + * Reset the RequestAttributes for the current thread. + */ + public static void resetRequestAttributes() { + requestAttributesHolder.remove(); + inheritableRequestAttributesHolder.remove(); + } + + /** + * Bind the given RequestAttributes to the current thread, + * not exposing it as inheritable for child threads. + * @param attributes the RequestAttributes to expose + * @see #setRequestAttributes(RequestAttributes, boolean) + */ + public static void setRequestAttributes(@Nullable RequestAttributes attributes) { + setRequestAttributes(attributes, false); + } + + /** + * Bind the given RequestAttributes to the current thread. + * @param attributes the RequestAttributes to expose, + * or {@code null} to reset the thread-bound context + * @param inheritable whether to expose the RequestAttributes as inheritable + * for child threads (using an {@link InheritableThreadLocal}) + */ + public static void setRequestAttributes(@Nullable RequestAttributes attributes, boolean inheritable) { + if (attributes == null) { + resetRequestAttributes(); + } + else { + if (inheritable) { + inheritableRequestAttributesHolder.set(attributes); + requestAttributesHolder.remove(); + } + else { + requestAttributesHolder.set(attributes); + inheritableRequestAttributesHolder.remove(); + } + } + } + + /** + * Return the RequestAttributes currently bound to the thread. + * @return the RequestAttributes currently bound to the thread, + * or {@code null} if none bound + */ + @Nullable + public static RequestAttributes getRequestAttributes() { + RequestAttributes attributes = requestAttributesHolder.get(); + if (attributes == null) { + attributes = inheritableRequestAttributesHolder.get(); + } + return attributes; + } + + /** + * Return the RequestAttributes currently bound to the thread. + *

Exposes the previously bound RequestAttributes instance, if any. + * Falls back to the current JSF FacesContext, if any. + * @return the RequestAttributes currently bound to the thread + * @throws IllegalStateException if no RequestAttributes object + * is bound to the current thread + * @see #setRequestAttributes + * @see ServletRequestAttributes + * @see FacesRequestAttributes + * @see jakarta.faces.context.FacesContext#getCurrentInstance() + */ + public static RequestAttributes currentRequestAttributes() throws IllegalStateException { + RequestAttributes attributes = getRequestAttributes(); + if (attributes == null) { + if (jsfPresent) { + attributes = FacesRequestAttributesFactory.getFacesRequestAttributes(); + } + if (attributes == null) { + throw new IllegalStateException("No thread-bound request found: " + + "Are you referring to request attributes outside of an actual web request, " + + "or processing a request outside of the originally receiving thread? " + + "If you are actually operating within a web request and still receive this message, " + + "your code is probably running outside of DispatcherServlet: " + + "In this case, use RequestContextListener or RequestContextFilter to expose the current request."); + } + } + return attributes; + } + + + /** + * Inner class to avoid hard-coded JSF dependency. + */ + private static class FacesRequestAttributesFactory { + + @Nullable + public static RequestAttributes getFacesRequestAttributes() { + try { + FacesContext facesContext = FacesContext.getCurrentInstance(); + return (facesContext != null ? new FacesRequestAttributes(facesContext) : null); + } + catch (NoClassDefFoundError err) { + // typically for com/sun/faces/util/Util if only the JSF API jar is present + return null; + } + } + } + +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index cdbd00f09..8e257a23c 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -13,7 +13,6 @@ import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; -import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; @@ -21,7 +20,6 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessStatus; import org.dromara.common.log.event.OperLogEvent; -import org.dromara.common.satoken.utils.LoginHelper; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.http.HttpMethod; import org.springframework.validation.BindingResult; @@ -88,16 +86,6 @@ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exc // *========数据库日志=========*// OperLogEvent operLog = new OperLogEvent(); - operLog.setTenantId(LoginHelper.getTenantId()); - operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); - // 请求的地址 - String ip = ServletUtils.getClientIP(); - operLog.setOperIp(ip); - operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); - LoginUser loginUser = LoginHelper.getLoginUser(); - operLog.setOperName(loginUser.getUsername()); - operLog.setDeptName(loginUser.getDeptName()); - if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); @@ -106,8 +94,6 @@ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exc String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); operLog.setMethod(className + "." + methodName + "()"); - // 设置请求方式 - operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); // 处理设置注解上的参数 getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); // 设置消耗时间 diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java index 938eaadde..212bf18b5 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -2,8 +2,6 @@ import lombok.Data; -import jakarta.servlet.http.HttpServletRequest; - import java.io.Serial; import java.io.Serializable; @@ -39,11 +37,6 @@ public class LogininforEvent implements Serializable { */ private String message; - /** - * 请求体 - */ - private HttpServletRequest request; - /** * 其他参数 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index b95baf44b..dfd490ae9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -55,7 +55,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService { @Async @EventListener public void recordLogininfor(LogininforEvent logininforEvent) { - HttpServletRequest request = logininforEvent.getRequest(); + HttpServletRequest request = ServletUtils.getRequest(); final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); final String ip = ServletUtils.getClientIP(request); // 客户端信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index b78b9dcc8..45f263839 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -3,18 +3,23 @@ import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.enums.BusinessStatus; import org.dromara.common.log.event.OperLogEvent; +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.system.domain.SysOperLog; import org.dromara.system.domain.bo.SysOperLogBo; import org.dromara.system.domain.vo.SysOperLogVo; import org.dromara.system.mapper.SysOperLogMapper; import org.dromara.system.service.ISysOperLogService; -import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -44,6 +49,18 @@ public class SysOperLogServiceImpl implements ISysOperLogService { @EventListener public void recordOper(OperLogEvent operLogEvent) { SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); + operLog.setTenantId(LoginHelper.getTenantId()); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = ServletUtils.getClientIP(); + operLog.setOperIp(ip); + HttpServletRequest request = ServletUtils.getRequest(); + operLog.setOperUrl(StringUtils.substring(request.getRequestURI(), 0, 255)); + LoginUser loginUser = LoginHelper.getLoginUser(); + operLog.setOperName(loginUser.getUsername()); + operLog.setDeptName(loginUser.getDeptName()); + // 设置请求方式 + operLog.setRequestMethod(request.getMethod()); // 远程查询操作地点 operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); insertOperlog(operLog); From 0ad52b18b8902d98856db2a3cb293505303202dd 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 Aug 2024 14:09:20 +0800 Subject: [PATCH 082/104] =?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=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=82=E9=85=8Doss=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/util/VelocityUtils.java | 3 +++ .../ruoyi-generator/src/main/resources/vm/java/vo.java.vm | 7 +++++++ .../ruoyi-generator/src/main/resources/vm/ts/types.ts.vm | 6 ++++++ .../ruoyi-generator/src/main/resources/vm/vue/index.vue.vm | 4 ++-- 4 files changed, 18 insertions(+), 2 deletions(-) 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 f5db391b8..6e111e3a8 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 @@ -215,6 +215,9 @@ public static HashSet getImportList(GenTable genTable) { importList.add("com.fasterxml.jackson.annotation.JsonFormat"); } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { importList.add("java.math.BigDecimal"); + } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { + importList.add("org.dromara.common.translation.annotation.Translation"); + importList.add("org.dromara.common.translation.constant.TransConstant"); } } return importList; diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm index f99a2ed9a..c896afbe8 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -53,6 +53,13 @@ public class ${ClassName}Vo implements Serializable { #end private $column.javaType $column.javaField; +#if($column.htmlType == "imageUpload") + /** + * ${column.columnComment}Url + */ + @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "${column.javaField}") + private String ${column.javaField}Url"; +#end #end #end diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm index c3f6ed1f8..35a468e80 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/types.ts.vm @@ -9,6 +9,12 @@ export interface ${BusinessName}VO { #elseif($column.javaType == 'Boolean') boolean; #else string; #end +#if($column.htmlType == "imageUpload") + /** + * ${column.columnComment}Url + */ + ${column.javaField}Url: string; +#end #end #end #if ($table.tree) diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 886f4ab71..a92d19adc 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -101,9 +101,9 @@ #elseif($column.list && $column.htmlType == "imageUpload") - + #elseif($column.list && $column.dictType && "" != $column.dictType) From 5bdffdb36828822b6090a559b5b47b45d559f0d8 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 Aug 2024 14:10:14 +0800 Subject: [PATCH 083/104] =?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=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=82=E9=85=8Doss=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/vm/vue/index-tree.vue.vm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index d13ef2f27..caf3472e1 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -99,9 +99,9 @@ #elseif($column.list && $column.htmlType == "imageUpload") - + #elseif($column.list && $column.dictType && "" != $column.dictType) From e6847605cc90aa0ff35938509c260b62ab7e8c42 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 Aug 2024 17:43:57 +0800 Subject: [PATCH 084/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/mybatis/enums/DataScopeType.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 455cecb2e..9bb5a0dc7 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -32,29 +32,21 @@ public enum DataScopeType { /** * 自定数据权限 - * 使用 SpEL 表达式:`#{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} )` - * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), /** * 部门数据权限 - * 使用 SpEL 表达式:`#{#deptName} = #{#user.deptId}` - * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), /** * 部门及以下数据权限 - * 使用 SpEL 表达式:`#{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )}` - * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), /** * 仅本人数据权限 - * 使用 SpEL 表达式:`#{#userName} = #{#user.userId}` - * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "); From eda882433aacd5e778a8f1713cd9dd890d59b2b7 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 Aug 2024 17:45:06 +0800 Subject: [PATCH 085/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=8A=A5=E8=AD=A6=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/mybatis/enums/DataScopeType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 9bb5a0dc7..981bd421b 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -13,9 +13,9 @@ * 内置数据: * - {@code user}: 当前登录用户信息,参考 {@link LoginUser} * 内置服务: - * - {@code sdss}: 系统数据权限服务,参考 {@link ISysDataScopeService} + * - {@code sdss}: 系统数据权限服务,参考 ISysDataScopeService * 如需扩展数据,可以通过 {@link DataPermissionHelper} 进行操作 - * 如需扩展服务,可以通过 {@link ISysDataScopeService} 自行编写 + * 如需扩展服务,可以通过 ISysDataScopeService 自行编写 *

* * @author Lion Li From 0e1fcbfe9c8e148dbe63ffea1bfe9836abc6d7fd 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 Aug 2024 18:52:01 +0800 Subject: [PATCH 086/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=84=B1=E6=95=8F=E5=A2=9E=E5=8A=A0=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=A0=87=E8=AF=86=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/system/domain/vo/SysUserVo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index d1f405919..86249d20e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -61,13 +61,13 @@ public class SysUserVo implements Serializable { /** * 用户邮箱 */ - @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit") private String email; /** * 手机号码 */ - @Sensitive(strategy = SensitiveStrategy.PHONE) + @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit") private String phonenumber; /** From 19c83f02aa1c8ff82f38c45cef2248a908b2e5b4 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 Aug 2024 19:14:51 +0800 Subject: [PATCH 087/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=BC=96=E8=BE=91=E7=8A=B6=E6=80=81=E6=9C=AA=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysRoleServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 31f949836..9b8b0ecbe 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -293,6 +293,10 @@ public int insertRole(SysRoleBo bo) { @Transactional(rollbackFor = Exception.class) public int updateRole(SysRoleBo bo) { SysRole role = MapstructUtils.convert(bo, SysRole.class); + + if (UserConstants.ROLE_DISABLE.equals(role.getStatus()) && this.countUserRoleByRoleId(role.getRoleId()) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } // 修改角色信息 baseMapper.updateById(role); // 删除角色与菜单关联 From bb4587fe05d30932d202474ab4b4151bc815dc23 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 Aug 2024 19:29:04 +0800 Subject: [PATCH 088/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E4=B8=8B=E5=AD=98=E5=9C=A8=E5=B2=97=E4=BD=8D=E4=B8=8D?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/system/SysDeptController.java | 5 +++++ .../org/dromara/system/service/ISysPostService.java | 8 ++++++++ .../system/service/impl/SysPostServiceImpl.java | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 4f5f23f32..968bbe906 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -12,6 +12,7 @@ import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysPostService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,6 +30,7 @@ public class SysDeptController extends BaseController { private final ISysDeptService deptService; + private final ISysPostService postService; /** * 获取部门列表 @@ -117,6 +119,9 @@ public R remove(@PathVariable Long deptId) { if (deptService.checkDeptExistUser(deptId)) { return R.warn("部门存在用户,不允许删除"); } + if (postService.countPostByDeptId(deptId) > 0) { + return R.warn("部门存在岗位,不允许删除"); + } deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java index c43f0395c..3751b23be 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -80,6 +80,14 @@ public interface ISysPostService { */ long countUserPostById(Long postId); + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + long countPostByDeptId(Long deptId); + /** * 删除岗位信息 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index b8a7e607a..2c38129ac 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -177,6 +177,17 @@ public long countUserPostById(Long postId) { return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); } + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + @Override + public long countPostByDeptId(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPost::getDeptId, deptId)); + } + /** * 删除岗位信息 * From 96d57bd263db21e0e1d34bd1611d66ce51004adf 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 Aug 2024 19:34:02 +0800 Subject: [PATCH 089/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=A5=97=E9=A4=90=E9=87=8D=E5=90=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysTenantPackageController.java | 6 ++++++ .../system/service/ISysTenantPackageService.java | 11 ++++++++--- .../service/impl/SysTenantPackageServiceImpl.java | 12 ++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java index 7d99916d0..acaf5f83c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -92,6 +92,9 @@ public R getInfo(@NotNull(message = "主键不能为空") @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("新增套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } return toAjax(tenantPackageService.insertByBo(bo)); } @@ -104,6 +107,9 @@ public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("修改套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } return toAjax(tenantPackageService.updateByBo(bo)); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java index cdb887ca6..d060b68cd 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -1,9 +1,9 @@ package org.dromara.system.service; -import org.dromara.system.domain.vo.SysTenantPackageVo; -import org.dromara.system.domain.bo.SysTenantPackageBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; import java.util.Collection; import java.util.List; @@ -45,6 +45,11 @@ public interface ISysTenantPackageService { */ Boolean updateByBo(SysTenantPackageBo bo); + /** + * 校验套餐名称是否唯一 + */ + boolean checkPackageNameUnique(SysTenantPackageBo bo); + /** * 修改套餐状态 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java index 5fd04af8e..d2a72f611 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.system.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -116,6 +117,17 @@ public Boolean updateByBo(SysTenantPackageBo bo) { return baseMapper.updateById(update) > 0; } + /** + * 校验套餐名称是否唯一 + */ + @Override + public boolean checkPackageNameUnique(SysTenantPackageBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenantPackage::getPackageName, bo.getPackageName()) + .ne(ObjectUtil.isNotNull(bo.getPackageId()), SysTenantPackage::getPackageId, bo.getPackageId())); + return !exist; + } + /** * 修改套餐状态 * From 4de45ce1709ff2a5c033621edd8e0e397558cd1c 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 Aug 2024 19:52:03 +0800 Subject: [PATCH 090/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E9=83=A8=E5=88=86=E7=94=A8=E6=88=B7=E4=B8=8D=E6=83=B3?= =?UTF-8?q?=E7=BB=99=E7=94=A8=E6=88=B7=E5=88=86=E9=85=8D=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E4=B8=8E=E9=83=A8=E9=97=A8=E7=9A=84=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/service/SysLoginService.java | 13 +++++++++---- .../service/impl/SysDataScopeServiceImpl.java | 11 +++++++++-- 2 files changed, 18 insertions(+), 6 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 3ee67630b..9345c92fd 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 @@ -19,7 +19,10 @@ import org.dromara.common.core.enums.TenantStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.*; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.redis.utils.RedisUtils; @@ -155,9 +158,11 @@ public LoginUser buildLoginUser(SysUserVo user) { loginUser.setUserType(user.getUserType()); loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); - Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); - loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); - loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + if (ObjectUtil.isNotNull(user.getDeptId())) { + Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); + loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); + loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + } List roles = roleService.selectRolesByUserId(user.getUserId()); loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); return loginUser; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java index a31c42635..018f9a07a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -2,6 +2,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StreamUtils; @@ -38,6 +39,9 @@ public class SysDataScopeServiceImpl implements ISysDataScopeService { */ @Override public String getRoleCustom(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return "-1"; + } List list = roleDeptMapper.selectList( new LambdaQueryWrapper() .select(SysRoleDept::getDeptId) @@ -45,7 +49,7 @@ public String getRoleCustom(Long roleId) { if (CollUtil.isNotEmpty(list)) { return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); } - return null; + return "-1"; } /** @@ -56,6 +60,9 @@ public String getRoleCustom(Long roleId) { */ @Override public String getDeptAndChild(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return "-1"; + } List deptList = deptMapper.selectList(new LambdaQueryWrapper() .select(SysDept::getDeptId) .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); @@ -64,7 +71,7 @@ public String getDeptAndChild(Long deptId) { if (CollUtil.isNotEmpty(ids)) { return StreamUtils.join(ids, Convert::toStr); } - return null; + return "-1"; } } From facbb7f28fb613b84ce1529c0bf63f1b77e576e5 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 Aug 2024 20:28:52 +0800 Subject: [PATCH 091/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=B8=AD=E5=BF=83=E7=BC=96=E8=BE=91=20=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/system/SysProfileController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 559e1d59b..893b381e3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -11,6 +11,7 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysUserBo; @@ -72,7 +73,8 @@ public R updateProfile(@Validated @RequestBody SysUserProfileBo profile) { if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); } - if (userService.updateUserProfile(user) > 0) { + int rows = DataPermissionHelper.ignore(() -> userService.updateUserProfile(user)); + if (rows > 0) { return R.ok(); } return R.fail("修改个人信息异常,请联系管理员"); From 9318f182b0a226d1a55d5989e37f037d1b87c910 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: Sat, 17 Aug 2024 10:10:51 +0800 Subject: [PATCH 092/104] =?UTF-8?q?reset=20=E5=9B=9E=E6=BB=9A=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9spring=E6=BA=90=E7=A0=81=E4=B8=8A=E4=B8=8B=E6=96=87?= =?UTF-8?q?=E6=8C=81=E6=9C=89=E8=80=85(=E5=AD=98=E5=9C=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9C=AA=E6=B8=85=E7=90=86=E5=86=85=E5=AD=98=E6=B3=84?= =?UTF-8?q?=E6=BC=8F=E9=97=AE=E9=A2=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/listener/UserActionListener.java | 1 + .../dromara/web/service/SysLoginService.java | 6 +- .../web/service/SysRegisterService.java | 2 + ruoyi-common/ruoyi-common-core/pom.xml | 7 - .../context/request/RequestContextHolder.java | 161 ------------------ .../dromara/common/log/aspect/LogAspect.java | 14 ++ .../common/log/event/LogininforEvent.java | 7 + .../impl/SysLogininforServiceImpl.java | 2 +- .../service/impl/SysOperLogServiceImpl.java | 23 +-- 9 files changed, 30 insertions(+), 193 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index a958de62d..07595e092 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -71,6 +71,7 @@ public void doLogin(String loginType, Object loginId, String tokenValue, SaLogin logininforEvent.setUsername(username); logininforEvent.setStatus(Constants.LOGIN_SUCCESS); logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); // 更新登录信息 loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); 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 9345c92fd..c7ad9179c 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 @@ -19,10 +19,7 @@ import org.dromara.common.core.enums.TenantStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.*; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.redis.utils.RedisUtils; @@ -142,6 +139,7 @@ public void recordLogininfor(String tenantId, String username, String status, St logininforEvent.setUsername(username); logininforEvent.setStatus(status); logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java index c7545fa65..ddab279bc 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -11,6 +11,7 @@ import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.event.LogininforEvent; @@ -107,6 +108,7 @@ private void recordLogininfor(String tenantId, String username, String status, S logininforEvent.setUsername(username); logininforEvent.setStatus(status); logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); } diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index f6f8c2556..5925c9b3c 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -99,13 +99,6 @@ transmittable-thread-local - - jakarta.faces - jakarta.faces-api - 4.1.0 - true - - diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java deleted file mode 100644 index 7f9622dbc..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/springframework/web/context/request/RequestContextHolder.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2002-2023 the original author or authors. - * - * 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 - * - * https://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 org.springframework.web.context.request; - -import com.alibaba.ttl.TransmittableThreadLocal; -import jakarta.faces.context.FacesContext; -import org.springframework.lang.Nullable; -import org.springframework.util.ClassUtils; - -/** - * Holder class to expose the web request in the form of a thread-bound - * {@link RequestAttributes} object. The request will be inherited - * by any child threads spawned by the current thread if the - * {@code inheritable} flag is set to {@code true}. - * - *

Use {@link RequestContextListener} or - * {@link org.springframework.web.filter.RequestContextFilter} to expose - * the current web request. Note that - * already exposes the current request by default. - * - * 修改 spring 上下文存储方式 将 ThreadLocal 替换为 TransmittableThreadLocal - * 支持线程上下文切换变量传递 异步获取 spring 上下文 - * - * @author Juergen Hoeller - * @author Rod Johnson - * @since 2.0 - * @see RequestContextListener - * @see org.springframework.web.filter.RequestContextFilter - */ -public abstract class RequestContextHolder { - - private static final boolean jsfPresent = - ClassUtils.isPresent("jakarta.faces.context.FacesContext", RequestContextHolder.class.getClassLoader()); - - // ThreadLocal 替换为 TransmittableThreadLocal - private static final ThreadLocal requestAttributesHolder = - new TransmittableThreadLocal<>(); - - private static final ThreadLocal inheritableRequestAttributesHolder = - new TransmittableThreadLocal<>(); - - - /** - * Reset the RequestAttributes for the current thread. - */ - public static void resetRequestAttributes() { - requestAttributesHolder.remove(); - inheritableRequestAttributesHolder.remove(); - } - - /** - * Bind the given RequestAttributes to the current thread, - * not exposing it as inheritable for child threads. - * @param attributes the RequestAttributes to expose - * @see #setRequestAttributes(RequestAttributes, boolean) - */ - public static void setRequestAttributes(@Nullable RequestAttributes attributes) { - setRequestAttributes(attributes, false); - } - - /** - * Bind the given RequestAttributes to the current thread. - * @param attributes the RequestAttributes to expose, - * or {@code null} to reset the thread-bound context - * @param inheritable whether to expose the RequestAttributes as inheritable - * for child threads (using an {@link InheritableThreadLocal}) - */ - public static void setRequestAttributes(@Nullable RequestAttributes attributes, boolean inheritable) { - if (attributes == null) { - resetRequestAttributes(); - } - else { - if (inheritable) { - inheritableRequestAttributesHolder.set(attributes); - requestAttributesHolder.remove(); - } - else { - requestAttributesHolder.set(attributes); - inheritableRequestAttributesHolder.remove(); - } - } - } - - /** - * Return the RequestAttributes currently bound to the thread. - * @return the RequestAttributes currently bound to the thread, - * or {@code null} if none bound - */ - @Nullable - public static RequestAttributes getRequestAttributes() { - RequestAttributes attributes = requestAttributesHolder.get(); - if (attributes == null) { - attributes = inheritableRequestAttributesHolder.get(); - } - return attributes; - } - - /** - * Return the RequestAttributes currently bound to the thread. - *

Exposes the previously bound RequestAttributes instance, if any. - * Falls back to the current JSF FacesContext, if any. - * @return the RequestAttributes currently bound to the thread - * @throws IllegalStateException if no RequestAttributes object - * is bound to the current thread - * @see #setRequestAttributes - * @see ServletRequestAttributes - * @see FacesRequestAttributes - * @see jakarta.faces.context.FacesContext#getCurrentInstance() - */ - public static RequestAttributes currentRequestAttributes() throws IllegalStateException { - RequestAttributes attributes = getRequestAttributes(); - if (attributes == null) { - if (jsfPresent) { - attributes = FacesRequestAttributesFactory.getFacesRequestAttributes(); - } - if (attributes == null) { - throw new IllegalStateException("No thread-bound request found: " + - "Are you referring to request attributes outside of an actual web request, " + - "or processing a request outside of the originally receiving thread? " + - "If you are actually operating within a web request and still receive this message, " + - "your code is probably running outside of DispatcherServlet: " + - "In this case, use RequestContextListener or RequestContextFilter to expose the current request."); - } - } - return attributes; - } - - - /** - * Inner class to avoid hard-coded JSF dependency. - */ - private static class FacesRequestAttributesFactory { - - @Nullable - public static RequestAttributes getFacesRequestAttributes() { - try { - FacesContext facesContext = FacesContext.getCurrentInstance(); - return (facesContext != null ? new FacesRequestAttributes(facesContext) : null); - } - catch (NoClassDefFoundError err) { - // typically for com/sun/faces/util/Util if only the JSF API jar is present - return null; - } - } - } - -} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 8e257a23c..cdbd00f09 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -13,6 +13,7 @@ import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; @@ -20,6 +21,7 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessStatus; import org.dromara.common.log.event.OperLogEvent; +import org.dromara.common.satoken.utils.LoginHelper; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.http.HttpMethod; import org.springframework.validation.BindingResult; @@ -86,6 +88,16 @@ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exc // *========数据库日志=========*// OperLogEvent operLog = new OperLogEvent(); + operLog.setTenantId(LoginHelper.getTenantId()); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = ServletUtils.getClientIP(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + LoginUser loginUser = LoginHelper.getLoginUser(); + operLog.setOperName(loginUser.getUsername()); + operLog.setDeptName(loginUser.getDeptName()); + if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); @@ -94,6 +106,8 @@ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exc String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); // 处理设置注解上的参数 getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); // 设置消耗时间 diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java index 212bf18b5..938eaadde 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -2,6 +2,8 @@ import lombok.Data; +import jakarta.servlet.http.HttpServletRequest; + import java.io.Serial; import java.io.Serializable; @@ -37,6 +39,11 @@ public class LogininforEvent implements Serializable { */ private String message; + /** + * 请求体 + */ + private HttpServletRequest request; + /** * 其他参数 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index dfd490ae9..b95baf44b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -55,7 +55,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService { @Async @EventListener public void recordLogininfor(LogininforEvent logininforEvent) { - HttpServletRequest request = ServletUtils.getRequest(); + HttpServletRequest request = logininforEvent.getRequest(); final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); final String ip = ServletUtils.getClientIP(request); // 客户端信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index 45f263839..b78b9dcc8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -3,23 +3,18 @@ import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ip.AddressUtils; -import org.dromara.common.log.enums.BusinessStatus; import org.dromara.common.log.event.OperLogEvent; -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.system.domain.SysOperLog; import org.dromara.system.domain.bo.SysOperLogBo; import org.dromara.system.domain.vo.SysOperLogVo; import org.dromara.system.mapper.SysOperLogMapper; import org.dromara.system.service.ISysOperLogService; +import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -49,18 +44,6 @@ public class SysOperLogServiceImpl implements ISysOperLogService { @EventListener public void recordOper(OperLogEvent operLogEvent) { SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); - operLog.setTenantId(LoginHelper.getTenantId()); - operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); - // 请求的地址 - String ip = ServletUtils.getClientIP(); - operLog.setOperIp(ip); - HttpServletRequest request = ServletUtils.getRequest(); - operLog.setOperUrl(StringUtils.substring(request.getRequestURI(), 0, 255)); - LoginUser loginUser = LoginHelper.getLoginUser(); - operLog.setOperName(loginUser.getUsername()); - operLog.setDeptName(loginUser.getDeptName()); - // 设置请求方式 - operLog.setRequestMethod(request.getMethod()); // 远程查询操作地点 operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); insertOperlog(operLog); From b33b645ef01512024d0aa84b7e3a74b48e6c04bf 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: Sat, 17 Aug 2024 10:29:33 +0800 Subject: [PATCH 093/104] =?UTF-8?q?remove=20=E7=A7=BB=E9=99=A4=20alibaba?= =?UTF-8?q?=20ttl=20=E4=B8=8E=E7=BA=BF=E7=A8=8B=E6=B1=A0=E6=90=AD=E9=85=8D?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98(=E5=8F=AF=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E4=BD=86=E6=97=A0=E6=B3=95=E6=B8=85=E9=99=A4=E4=B8=8E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 - ruoyi-common/ruoyi-common-core/pom.xml | 5 ----- .../java/org/dromara/common/tenant/helper/TenantHelper.java | 3 +-- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 7772834d6..42b5e08de 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ 3.34.1 2.2.7 4.3.1 - 2.14.4 1.1.1 1.4.3 0.2.0 diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index 5925c9b3c..ad37e90db 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -94,11 +94,6 @@ ip2region - - com.alibaba - transmittable-thread-local - - diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 9d087e113..6d12b6f49 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -2,7 +2,6 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.convert.Convert; -import com.alibaba.ttl.TransmittableThreadLocal; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.AccessLevel; @@ -27,7 +26,7 @@ public class TenantHelper { private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; - private static final ThreadLocal TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>(); + private static final ThreadLocal TEMP_DYNAMIC_TENANT = new ThreadLocal<>(); /** * 租户功能是否启用 From fb97649151348ca7f44c3f9e563d1a09d4b799d8 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: Sat, 17 Aug 2024 10:30:03 +0800 Subject: [PATCH 094/104] =?UTF-8?q?remove=20=E7=A7=BB=E9=99=A4=20alibaba?= =?UTF-8?q?=20ttl=20=E4=B8=8E=E7=BA=BF=E7=A8=8B=E6=B1=A0=E6=90=AD=E9=85=8D?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98(=E5=8F=AF=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E4=BD=86=E6=97=A0=E6=B3=95=E6=B8=85=E9=99=A4=E4=B8=8E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index 42b5e08de..321ea8e00 100644 --- a/pom.xml +++ b/pom.xml @@ -292,12 +292,6 @@ ${snailjob.version} - - com.alibaba - transmittable-thread-local - ${alibaba-ttl.version} - - org.bouncycastle From 3f2499feacbde73ecd14bd3bfa416c2e4ec11b9a 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, 19 Aug 2024 09:14:50 +0800 Subject: [PATCH 095/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E7=9B=B8=E5=85=B3controller=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=98=AF=E5=90=A6=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/controller/system/SysTenantController.java | 2 ++ .../system/controller/system/SysTenantPackageController.java | 2 ++ 2 files changed, 4 insertions(+) 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 60be68a95..bad240c72 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 @@ -24,6 +24,7 @@ import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.service.ISysTenantService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -38,6 +39,7 @@ @RequiredArgsConstructor @RestController @RequestMapping("/system/tenant") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") public class SysTenantController extends BaseController { private final ISysTenantService tenantService; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java index acaf5f83c..4bfe597cf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -20,6 +20,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,6 +35,7 @@ @RequiredArgsConstructor @RestController @RequestMapping("/system/tenant/package") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") public class SysTenantPackageController extends BaseController { private final ISysTenantPackageService tenantPackageService; From 23aafe1cfe0cb53ad488f90ede0b3805cbabe70c 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, 21 Aug 2024 13:54:01 +0800 Subject: [PATCH 096/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=A7=9F=E6=88=B7=E4=B8=8E=E5=BF=BD=E7=95=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E6=94=AF=E6=8C=81=E5=B5=8C=E5=A5=97?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/helper/DataPermissionHelper.java | 41 ++++++++++++++++++- .../common/tenant/helper/TenantHelper.java | 41 ++++++++++++++++++- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 2afe9ee47..ccb0fca34 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -2,14 +2,17 @@ import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.model.SaStorage; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.HashMap; import java.util.Map; +import java.util.Stack; import java.util.function.Supplier; /** @@ -24,6 +27,8 @@ public class DataPermissionHelper { private static final String DATA_PERMISSION_KEY = "data:permission"; + private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); + /** * 从上下文中获取指定键的变量值,并将其转换为指定的类型 * @@ -66,18 +71,50 @@ public static Map getContext() { throw new NullPointerException("data permission context type exception"); } + private static IgnoreStrategy getIgnoreStrategy() { + Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { + if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { + return ignoreStrategy; + } + } + return null; + } + /** * 开启忽略数据权限(开启后需手动调用 {@link #disableIgnore()} 关闭) */ public static void enableIgnore() { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNull(ignoreStrategy)) { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + } else { + ignoreStrategy.setDataPermission(true); + } + Stack reentrantStack = REENTRANT_IGNORE.get(); + reentrantStack.push(reentrantStack.size() + 1); } /** * 关闭忽略数据权限 */ public static void disableIgnore() { - InterceptorIgnoreHelper.clearIgnoreStrategy(); + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNotNull(ignoreStrategy)) { + boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) + && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) + && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) + && !Boolean.TRUE.equals(ignoreStrategy.getTenantLine()) + && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); + Stack reentrantStack = REENTRANT_IGNORE.get(); + boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; + if (noOtherIgnoreStrategy && empty) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } else if (empty) { + ignoreStrategy.setDataPermission(false); + } + + } } /** diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 6d12b6f49..b18561267 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -1,7 +1,9 @@ package org.dromara.common.tenant.helper; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.AccessLevel; @@ -10,9 +12,11 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; +import java.util.Stack; import java.util.function.Supplier; /** @@ -28,6 +32,8 @@ public class TenantHelper { private static final ThreadLocal TEMP_DYNAMIC_TENANT = new ThreadLocal<>(); + private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); + /** * 租户功能是否启用 */ @@ -35,18 +41,49 @@ public static boolean isEnable() { return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false); } + private static IgnoreStrategy getIgnoreStrategy() { + Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { + if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { + return ignoreStrategy; + } + } + return null; + } + /** * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭) */ public static void enableIgnore() { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNull(ignoreStrategy)) { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); + } else { + ignoreStrategy.setTenantLine(true); + } + Stack reentrantStack = REENTRANT_IGNORE.get(); + reentrantStack.push(reentrantStack.size() + 1); } /** * 关闭忽略租户 */ public static void disableIgnore() { - InterceptorIgnoreHelper.clearIgnoreStrategy(); + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNotNull(ignoreStrategy)) { + boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) + && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) + && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) + && !Boolean.TRUE.equals(ignoreStrategy.getDataPermission()) + && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); + Stack reentrantStack = REENTRANT_IGNORE.get(); + boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; + if (noOtherIgnoreStrategy && empty) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } else if (empty) { + ignoreStrategy.setTenantLine(false); + } + } } /** From 4743eb1d3b2d9ee46845f36e50cd8102308c834f 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, 21 Aug 2024 13:54:40 +0800 Subject: [PATCH 097/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=A7=9F=E6=88=B7=E4=B8=8E=E5=BF=BD=E7=95=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E6=94=AF=E6=8C=81=E5=B5=8C=E5=A5=97?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/mybatis/helper/DataPermissionHelper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index ccb0fca34..932f17388 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -119,7 +119,6 @@ public static void disableIgnore() { /** * 在忽略数据权限中执行 - *

禁止在忽略数据权限中执行忽略数据权限

* * @param handle 处理执行方法 */ @@ -134,7 +133,6 @@ public static void ignore(Runnable handle) { /** * 在忽略数据权限中执行 - *

禁止在忽略数据权限中执行忽略数据权限

* * @param handle 处理执行方法 */ From 0af532f4f1bfd359773eaad75eee4ef487302a0a 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, 22 Aug 2024 11:19:13 +0800 Subject: [PATCH 098/104] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E6=97=A5=E5=BF=97=E9=83=A8=E7=BD=B2=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=88=A4=E6=96=AD=20=E9=80=9A=E8=BF=87=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=BA=A7=E5=88=AB=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlusWebInvokeTimeInterceptor.java | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java index 12c808647..614a559d7 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java @@ -6,7 +6,6 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.StopWatch; -import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.web.filter.RepeatedlyRequestWrapper; @@ -19,7 +18,6 @@ /** * web的调用时间统计拦截器 - * dev环境有效 * * @author Lion Li * @since 3.3.0 @@ -27,37 +25,34 @@ @Slf4j public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { - private final String prodProfile = "prod"; - private final static ThreadLocal KEY_CACHE = new ThreadLocal<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (!prodProfile.equals(SpringUtils.getActiveProfile())) { - String url = request.getMethod() + " " + request.getRequestURI(); + String url = request.getMethod() + " " + request.getRequestURI(); - // 打印请求参数 - if (isJsonRequest(request)) { - String jsonParam = ""; - if (request instanceof RepeatedlyRequestWrapper) { - BufferedReader reader = request.getReader(); - jsonParam = IoUtil.read(reader); - } - log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + // 打印请求参数 + if (isJsonRequest(request)) { + String jsonParam = ""; + if (request instanceof RepeatedlyRequestWrapper) { + BufferedReader reader = request.getReader(); + jsonParam = IoUtil.read(reader); + } + log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + } else { + Map parameterMap = request.getParameterMap(); + if (MapUtil.isNotEmpty(parameterMap)) { + String parameters = JsonUtils.toJsonString(parameterMap); + log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); } else { - Map parameterMap = request.getParameterMap(); - if (MapUtil.isNotEmpty(parameterMap)) { - String parameters = JsonUtils.toJsonString(parameterMap); - log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); - } else { - log.info("[PLUS]开始请求 => URL[{}],无参数", url); - } + log.info("[PLUS]开始请求 => URL[{}],无参数", url); } - - StopWatch stopWatch = new StopWatch(); - KEY_CACHE.set(stopWatch); - stopWatch.start(); } + + StopWatch stopWatch = new StopWatch(); + KEY_CACHE.set(stopWatch); + stopWatch.start(); + return true; } @@ -68,12 +63,10 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response, @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - if (!prodProfile.equals(SpringUtils.getActiveProfile())) { - StopWatch stopWatch = KEY_CACHE.get(); - stopWatch.stop(); - log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); - KEY_CACHE.remove(); - } + StopWatch stopWatch = KEY_CACHE.get(); + stopWatch.stop(); + log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); + KEY_CACHE.remove(); } /** From a964ccbd1092b159903089b682cfa0694021ef66 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, 22 Aug 2024 11:19:43 +0800 Subject: [PATCH 099/104] update snailjob 1.1.1 => 1.1.2 update mapstruct-plus 1.4.3 => 1.4.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 321ea8e00..700eff319 100644 --- a/pom.xml +++ b/pom.xml @@ -32,8 +32,8 @@ 3.34.1 2.2.7 4.3.1 - 1.1.1 - 1.4.3 + 1.1.2 + 1.4.4 0.2.0 1.18.34 1.76 From 457e59e61c9d7dbf4ef299c34aadd2c00fc0f1c9 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, 22 Aug 2024 17:53:55 +0800 Subject: [PATCH 100/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=A4=9A?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AF=B9=E5=90=8C=E4=B8=80=E4=B8=AAsession?= =?UTF-8?q?=E5=8F=91=E9=80=81ws=E6=B6=88=E6=81=AF=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/websocket/utils/WebSocketUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index afe76e06d..8c4170aa1 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -113,7 +113,7 @@ public static void sendMessage(WebSocketSession session, String message) { * @param session WebSocket会话 * @param message 要发送的WebSocket消息对象 */ - private static void sendMessage(WebSocketSession session, WebSocketMessage message) { + private synchronized static void sendMessage(WebSocketSession session, WebSocketMessage message) { if (session == null || !session.isOpen()) { log.warn("[send] session会话已经关闭"); } else { From 308c22f9229dafb55e0afb441584abbac69324e7 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, 23 Aug 2024 10:30:29 +0800 Subject: [PATCH 101/104] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E7=99=BB=E5=BD=95=E6=9E=84=E5=BB=BA=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/social/utils/SocialUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 04f621489..9191fca77 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 @@ -58,9 +58,9 @@ public static AuthRequest getAuthRequest(String source, SocialProperties socialP case "linkedin" -> new AuthLinkedinRequest(builder.build(), STATE_CACHE); case "microsoft" -> new AuthMicrosoftRequest(builder.build(), STATE_CACHE); case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE); - case "stack_overflow" -> new AuthStackOverflowRequest(builder.stackOverflowKey("").build(), STATE_CACHE); + case "stack_overflow" -> new AuthStackOverflowRequest(builder.build(), STATE_CACHE); case "huawei" -> new AuthHuaweiRequest(builder.build(), STATE_CACHE); - case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.agentId("").build(), STATE_CACHE); + case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.build(), STATE_CACHE); case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE); case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); From eb038e91dde4ee7444a0ea4ec8c8bcd183b15c1e 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, 23 Aug 2024 10:52:53 +0800 Subject: [PATCH 102/104] update springboot 3.2.8 => 3.2.9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 700eff319..c9d055be3 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ 5.2.1 - 3.2.8 + 3.2.9 UTF-8 UTF-8 17 From 79aee1d3127c8be0184bc6493b08fb2ba2f1a8ae Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 24 Aug 2024 11:16:39 +0800 Subject: [PATCH 103/104] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E9=83=A8=E9=97=A8id=EF=BC=8C=E8=A7=92=E8=89=B2id?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/UserService.java | 16 ++++++++++++++ .../service/impl/SysUserServiceImpl.java | 22 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 0f2878da4..43aef28cb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -66,4 +66,20 @@ public interface UserService { * @return 用户ids */ List selectUserIdsByRoleIds(List roleIds); + + /** + * 通过角色ID查询用户 + * + * @param roleIds 角色ids + * @return 用户 + */ + List selectUsersByRoleIds(List roleIds); + + /** + * 通过部门ID查询用户 + * + * @param deptIds 部门ids + * @return 用户 + */ + List selectUsersByDeptIds(List deptIds); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 6fbeab56d..254060688 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -647,4 +647,26 @@ public List selectUserIdsByRoleIds(List roleIds) { return StreamUtils.toList(userRoles, SysUserRole::getUserId); } + @Override + public List selectUsersByRoleIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return List.of(); + } + List userRoles = userRoleMapper.selectList( + new LambdaQueryWrapper().in(SysUserRole::getRoleId, roleIds)); + List userIds = StreamUtils.toList(userRoles, SysUserRole::getUserId); + return selectListByIds(userIds); + } + + @Override + public List selectUsersByDeptIds(List deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return List.of(); + } + List list = baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) + .eq(SysUser::getStatus, UserConstants.USER_NORMAL) + .in(CollUtil.isNotEmpty(deptIds), SysUser::getDeptId, deptIds)); + return BeanUtil.copyToList(list, UserDTO.class); + } } From 463048e0173fd7532933841ae11ab945f2ca868c 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, 26 Aug 2024 11:39:13 +0800 Subject: [PATCH 104/104] =?UTF-8?q?=F0=9F=98=B4=E5=8F=91=E5=B8=83=205.2.2?= =?UTF-8?q?=20=E6=AD=A3=E5=BC=8F=E7=89=88=20=E5=AE=89=E5=85=A8=E6=80=A7?= =?UTF-8?q?=E6=8F=90=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-monitor-admin.run.xml | 2 +- .run/ruoyi-server.run.xml | 6 +++--- .run/ruoyi-snailjob-server.run.xml | 2 +- README.md | 2 +- pom.xml | 2 +- ruoyi-common/ruoyi-common-bom/pom.xml | 2 +- script/docker/docker-compose.yml | 8 ++++---- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index 5b32519c5..478b4f30d 100644 --- a/.run/ruoyi-monitor-admin.run.xml +++ b/.run/ruoyi-monitor-admin.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-server.run.xml b/.run/ruoyi-server.run.xml index 9fefae69a..541800ddc 100644 --- a/.run/ruoyi-server.run.xml +++ b/.run/ruoyi-server.run.xml @@ -1,12 +1,12 @@ - + - - + \ No newline at end of file diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml index 914809dbf..5221eef4f 100644 --- a/.run/ruoyi-snailjob-server.run.xml +++ b/.run/ruoyi-snailjob-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/README.md b/README.md index 71895dc3f..eeb3f7b4b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.2.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.2.2-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2-blue.svg)]() [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() diff --git a/pom.xml b/pom.xml index c9d055be3..750673b87 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ RuoYi-Vue-Plus多租户管理系统 - 5.2.1 + 5.2.2 3.2.9 UTF-8 UTF-8 diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 19ca420e3..455408d8c 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.2.1 + 5.2.2 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index b4f96aa44..91d97aeed 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -100,7 +100,7 @@ services: network_mode: "host" ruoyi-server1: - image: ruoyi/ruoyi-server:5.2.1 + image: ruoyi/ruoyi-server:5.2.2 container_name: ruoyi-server1 environment: # 时区上海 @@ -115,7 +115,7 @@ services: network_mode: "host" ruoyi-server2: - image: ruoyi/ruoyi-server:5.2.1 + image: ruoyi/ruoyi-server:5.2.2 container_name: ruoyi-server2 environment: # 时区上海 @@ -130,7 +130,7 @@ services: network_mode: "host" ruoyi-monitor-admin: - image: ruoyi/ruoyi-monitor-admin:5.2.1 + image: ruoyi/ruoyi-monitor-admin:5.2.2 container_name: ruoyi-monitor-admin environment: # 时区上海 @@ -142,7 +142,7 @@ services: network_mode: "host" ruoyi-snailjob-server: - image: ruoyi/ruoyi-snailjob-server:5.2.1 + image: ruoyi/ruoyi-snailjob-server:5.2.2 container_name: ruoyi-snailjob-server environment: # 时区上海