From 8da55fb72a87be1c001d384093658e1e442438ca Mon Sep 17 00:00:00 2001 From: RuoYi Date: Wed, 28 Jul 2021 09:51:19 +0800 Subject: [PATCH 001/106] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=BE=A4?= =?UTF-8?q?=E5=8F=B7=EF=BC=9A101456076?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/index.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index 1fc8586ca..37c439b17 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -120,9 +120,9 @@

QQ群:满937441 满887144332 满180251782 满104180207 - 满186866453 - - 201396349满186866453 满201396349 + + 101456076

From 13da3c71d86efe5b7aae317dc851f1fa7792fee3 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, 28 Jul 2021 11:56:12 +0800 Subject: [PATCH 002/106] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20jdk8=20?= =?UTF-8?q?=E4=B8=8E=20jdk11=20=E5=B7=AE=E5=BC=82=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/system/controller/SysOssController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java index 45f838af2..8a84c42e3 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java @@ -93,7 +93,7 @@ public class SysOssController extends BaseController { response.reset(); response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(sysOss.getOriginalName(), StandardCharsets.UTF_8)); + FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(sysOss.getOriginalName(), StandardCharsets.UTF_8.toString())); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); long data = HttpUtil.download(sysOss.getUrl(), response.getOutputStream(), false); response.setContentLength(Convert.toInt(data)); From e6becb93379d53c377579d68293c14c36b1f95f8 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Wed, 28 Jul 2021 13:13:28 +0800 Subject: [PATCH 003/106] =?UTF-8?q?BLOB=E4=B8=8B=E8=BD=BD=E6=97=B6?= =?UTF-8?q?=E6=B8=85=E9=99=A4URL=E5=AF=B9=E8=B1=A1=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/utils/zipdownload.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruoyi-ui/src/utils/zipdownload.js b/ruoyi-ui/src/utils/zipdownload.js index ac2745bca..8a1b81983 100644 --- a/ruoyi-ui/src/utils/zipdownload.js +++ b/ruoyi-ui/src/utils/zipdownload.js @@ -32,9 +32,11 @@ export function resolveBlob(res, mimeType) { var result = patt.exec(contentDisposition) var fileName = result[1] fileName = fileName.replace(/\"/g, '') + aLink.style.display = 'none' aLink.href = URL.createObjectURL(blob) aLink.setAttribute('download', fileName) // 设置下载文件名称 document.body.appendChild(aLink) aLink.click() + URL.revokeObjectURL(aLink.href);//清除引用 document.body.removeChild(aLink); } From 5dbf39beeec75b2539c4636cf50e96d44b56fd3e 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, 28 Jul 2021 14:22:58 +0800 Subject: [PATCH 004/106] =?UTF-8?q?update=20service=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20ServicePlusImpl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/generator/service/GenTableColumnServiceImpl.java | 4 ++-- .../java/com/ruoyi/generator/service/GenTableServiceImpl.java | 4 ++-- .../com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java | 4 ++-- .../java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysConfigServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysDictDataServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java | 4 ++-- .../ruoyi/system/service/impl/SysLogininforServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysMenuServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysNoticeServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysOperLogServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysPostServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 4 ++-- .../com/ruoyi/system/service/impl/SysUserServiceImpl.java | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index 40f0738c9..fff3ae27b 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.generator.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import java.util.List; * @author ruoyi */ @Service -public class GenTableColumnServiceImpl extends ServiceImpl implements IGenTableColumnService { +public class GenTableColumnServiceImpl extends ServicePlusImpl implements IGenTableColumnService { /** * 查询业务字段列表 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index bece86a9f..86bd128d5 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -6,9 +6,9 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.JsonUtils; @@ -50,7 +50,7 @@ import java.util.zip.ZipOutputStream; */ @Slf4j @Service -public class GenTableServiceImpl extends ServiceImpl implements IGenTableService { +public class GenTableServiceImpl extends ServicePlusImpl implements IGenTableService { @Autowired private GenTableColumnMapper genTableColumnMapper; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java index 6494492a0..f9f58b675 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.quartz.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.quartz.domain.SysJobLog; @@ -21,7 +21,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysJobLogServiceImpl extends ServiceImpl implements ISysJobLogService { +public class SysJobLogServiceImpl extends ServicePlusImpl implements ISysJobLogService { @Override public TableDataInfo selectPageJobLogList(SysJobLog jobLog) { diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java index 3a7f05360..b8ec2568a 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -2,8 +2,8 @@ package com.ruoyi.quartz.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.utils.PageUtils; @@ -29,7 +29,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysJobServiceImpl extends ServiceImpl implements ISysJobService { +public class SysJobServiceImpl extends ServicePlusImpl implements ISysJobService { @Autowired private Scheduler scheduler; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index eee05950a..84b10db1d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -4,10 +4,10 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.DataSourceType; @@ -31,7 +31,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysConfigServiceImpl extends ServiceImpl implements ISysConfigService { +public class SysConfigServiceImpl extends ServicePlusImpl implements ISysConfigService { @Autowired private RedisCache redisCache; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 54582a185..03fd99bab 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,13 +4,13 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.exception.CustomException; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; @@ -30,7 +30,7 @@ import java.util.stream.Collectors; * @author ruoyi */ @Service -public class SysDeptServiceImpl extends ServiceImpl implements ISysDeptService { +public class SysDeptServiceImpl extends ServicePlusImpl implements ISysDeptService { @Autowired private SysRoleMapper roleMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java index 469c9908e..9ccafc02c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -2,8 +2,8 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.PageUtils; @@ -19,7 +19,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysDictDataServiceImpl extends ServiceImpl implements ISysDictDataService { +public class SysDictDataServiceImpl extends ServicePlusImpl implements ISysDictDataService { @Override public TableDataInfo selectPageDictDataList(SysDictData dictData) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index c4f9d955d..7e2644fa5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -5,10 +5,10 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DictUtils; @@ -31,7 +31,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysDictTypeServiceImpl extends ServiceImpl implements ISysDictTypeService { +public class SysDictTypeServiceImpl extends ServicePlusImpl implements ISysDictTypeService { @Autowired private SysDictDataMapper dictDataMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index c12952550..45ed43961 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysLogininfor; @@ -22,7 +22,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysLogininforServiceImpl extends ServiceImpl implements ISysLogininforService { +public class SysLogininforServiceImpl extends ServicePlusImpl implements ISysLogininforService { @Override public TableDataInfo selectPageLogininforList(SysLogininfor logininfor) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 2222e7389..13d283b5f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -3,13 +3,13 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.vo.MetaVo; @@ -31,7 +31,7 @@ import java.util.stream.Collectors; * @author ruoyi */ @Service -public class SysMenuServiceImpl extends ServiceImpl implements ISysMenuService { +public class SysMenuServiceImpl extends ServicePlusImpl implements ISysMenuService { public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java index e0634701c..5c7f62397 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java @@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysNotice; @@ -19,7 +19,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysNoticeServiceImpl extends ServiceImpl implements ISysNoticeService { +public class SysNoticeServiceImpl extends ServicePlusImpl implements ISysNoticeService { @Override public TableDataInfo selectPageNoticeList(SysNotice notice) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java index 238c015a0..4fd531306 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysOperLog; @@ -23,7 +23,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysOperLogServiceImpl extends ServiceImpl implements ISysOperLogService { +public class SysOperLogServiceImpl extends ServicePlusImpl implements ISysOperLogService { @Override public TableDataInfo selectPageOperLogList(SysOperLog operLog) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index d2aeab070..666043176 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -3,8 +3,8 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -25,7 +25,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysPostServiceImpl extends ServiceImpl implements ISysPostService { +public class SysPostServiceImpl extends ServicePlusImpl implements ISysPostService { @Autowired private SysUserPostMapper userPostMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index ddba9af8b..70a33eeb1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -2,10 +2,10 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -30,7 +30,7 @@ import java.util.*; * @author ruoyi */ @Service -public class SysRoleServiceImpl extends ServiceImpl implements ISysRoleService { +public class SysRoleServiceImpl extends ServicePlusImpl implements ISysRoleService { @Autowired private SysRoleMenuMapper roleMenuMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 69adbe194..ffaecd679 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -3,11 +3,11 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -34,7 +34,7 @@ import java.util.List; */ @Slf4j @Service -public class SysUserServiceImpl extends ServiceImpl implements ISysUserService { +public class SysUserServiceImpl extends ServicePlusImpl implements ISysUserService { @Autowired private SysRoleMapper roleMapper; From 6b5dd4d2be69759a8a2452195d0fb0b0ef52e72a Mon Sep 17 00:00:00 2001 From: RuoYi Date: Wed, 28 Jul 2021 16:04:59 +0800 Subject: [PATCH 005/106] =?UTF-8?q?=E4=BC=98=E5=8C=96XSS=E8=B7=A8=E7=AB=99?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 2 +- .../common/core/domain/entity/SysUser.java | 2 +- .../com/ruoyi/common/filter/XssFilter.java | 33 +++------------ .../com/ruoyi/common/utils/StringUtils.java | 40 +++++++++++++++++++ .../ruoyi/framework/config/FilterConfig.java | 6 +-- 5 files changed, 49 insertions(+), 34 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 918d354f2..088a28efb 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -115,6 +115,6 @@ xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) - excludes: /system/notice/* + excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 7504f0231..08cf15142 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -201,7 +201,7 @@ public class SysUser extends BaseEntity this.avatar = avatar; } - @JsonIgnore + @JsonIgnore @JsonProperty public String getPassword() { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java index 14954125c..703ce9aca 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java @@ -3,8 +3,6 @@ package com.ruoyi.common.filter; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -27,16 +25,10 @@ public class XssFilter implements Filter */ public List excludes = new ArrayList<>(); - /** - * xss过滤开关 - */ - public boolean enabled = false; - @Override public void init(FilterConfig filterConfig) throws ServletException { String tempExcludes = filterConfig.getInitParameter("excludes"); - String tempEnabled = filterConfig.getInitParameter("enabled"); if (StringUtils.isNotEmpty(tempExcludes)) { String[] url = tempExcludes.split(","); @@ -45,10 +37,6 @@ public class XssFilter implements Filter excludes.add(url[i]); } } - if (StringUtils.isNotEmpty(tempEnabled)) - { - enabled = Boolean.valueOf(tempEnabled); - } } @Override @@ -68,25 +56,14 @@ public class XssFilter implements Filter private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { - if (!enabled) + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || method.matches("GET") || method.matches("DELETE")) { return true; } - if (excludes == null || excludes.isEmpty()) - { - return false; - } - String url = request.getServletPath(); - for (String pattern : excludes) - { - Pattern p = Pattern.compile("^" + pattern); - Matcher m = p.matcher(url); - if (m.find()) - { - return true; - } - } - return false; + return StringUtils.matches(url, excludes); } @Override diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 72ddb566c..ca12798d1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.util.AntPathMatcher; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.text.StrFormatter; @@ -463,6 +464,45 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return sb.toString(); } + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + @SuppressWarnings("unchecked") public static T cast(Object obj) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java index 8b1783424..ab12e4164 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import javax.servlet.DispatcherType; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,11 +18,9 @@ import com.ruoyi.common.utils.StringUtils; * @author ruoyi */ @Configuration +@ConditionalOnProperty(value = "xss.enabled", havingValue = "true") public class FilterConfig { - @Value("${xss.enabled}") - private String enabled; - @Value("${xss.excludes}") private String excludes; @@ -40,7 +39,6 @@ public class FilterConfig registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); Map initParameters = new HashMap(); initParameters.put("excludes", excludes); - initParameters.put("enabled", enabled); registration.setInitParameters(initParameters); return registration; } From 0bfc4b433ba36385839c88aacd892b22bedd377e 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, 28 Jul 2021 18:23:27 +0800 Subject: [PATCH 006/106] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20InsertAll?= =?UTF-8?q?=20=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/core/mybatisplus/methods/InsertAll.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java index 66cf34c9b..bc17faae3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java @@ -2,7 +2,6 @@ package com.ruoyi.common.core.mybatisplus.methods; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; @@ -25,7 +24,7 @@ public class InsertAll extends AbstractMethod { final String fieldSql = prepareFieldSql(tableInfo); final String valueSql = prepareValuesSqlForMysqlBatch(tableInfo); KeyGenerator keyGenerator = new NoKeyGenerator(); - SqlMethod sqlMethod = SqlMethod.INSERT_ONE; + String sqlMethod = "insertAll"; String keyProperty = null; String keyColumn = null; // 表包含主键处理逻辑,如果不包含主键当普通字段处理 @@ -37,7 +36,7 @@ public class InsertAll extends AbstractMethod { keyColumn = tableInfo.getKeyColumn(); } else { if (null != tableInfo.getKeySequence()) { - keyGenerator = TableInfoHelper.genKeyGenerator(getMethod(sqlMethod), tableInfo, builderAssistant); + keyGenerator = TableInfoHelper.genKeyGenerator(sqlMethod, tableInfo, builderAssistant); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } @@ -45,7 +44,7 @@ public class InsertAll extends AbstractMethod { } final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass); - return this.addInsertMappedStatement(mapperClass, modelClass, "insertAll", sqlSource, keyGenerator, keyProperty, keyColumn); + return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod, sqlSource, keyGenerator, keyProperty, keyColumn); } private String prepareFieldSql(TableInfo tableInfo) { From 826bef86b2ba5b3e8c21afad74287b74d736c3cf 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, 29 Jul 2021 03:22:56 +0000 Subject: [PATCH 007/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E6=9E=B6=E6=9E=84=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2779fda93..621e0164e 100644 --- a/README.md +++ b/README.md @@ -45,27 +45,9 @@ RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期 > >[参考文档 Wiki](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) -## 提问四部曲 -### 一、查阅wiki -优先在`wiki->重点事项`,查找是否有相关问题及解决方案,尤其是框架更新后产生的问题,多会在wiki中提及 +## 软件架构图 -> [参考文档 Wiki](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) - -### 二、借助issues -尝试issues中搜索问题关键字(记得选择已完成),看看是否有其他人提出相同问题 -- `如果有`那么依据评论中的解决方案自行尝试解决 -- `如果没有`那么提交一个新的issues描述清楚你的问题,需要包含以下内容(优质的issues,能够帮助作者更高效的帮你解决问题): - - 出现问题的模块或功能或类,总之你要说清楚在哪出的问题 - - 描述产生问题的相关操作流程,以便复现快速解决 - - 报错的日志截图,一定是截图,不要复制一堆报错的文本 -> [issues](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/issues) - -### 三、百度 -大家都懂,不多描述,将关键的报错信息CC->CV到百度中看看大佬们怎么解决的 -> [百度](http://www.baidu.com) - -### 四、加群 -以上三点已经能解决大家绝大部分问题了,如果还有问题没能通过这几种方式解决,那么加群,大家一起在群里探讨一下 +![Plus部署架构图](https://images.gitee.com/uploads/images/2021/0729/112230_4295e5ce_1766278.png "Plus部署架构图.png") ## 贡献代码 From 7e613f8da611c984b6638015d9e0a697f1cfde48 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, 29 Jul 2021 13:11:35 +0800 Subject: [PATCH 008/106] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20jackson=20?= =?UTF-8?q?=E8=B6=85=E5=87=BA=20JS=20=E6=9C=80=E5=A4=A7=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2(?= =?UTF-8?q?=E9=9B=AA=E8=8A=B1id=E5=BA=8F=E5=88=97=E5=8C=96)=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/framework/config/JacksonConfig.java | 8 +++++ .../jackson/BigNumberSerializer.java | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java index 8334b2a91..4346610f8 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java @@ -2,15 +2,19 @@ package com.ruoyi.framework.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.framework.jackson.BigNumberSerializer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.math.BigDecimal; +import java.math.BigInteger; import java.time.LocalDateTime; import java.util.TimeZone; @@ -34,6 +38,10 @@ public class JacksonConfig { ObjectMapper objectMapper = (ObjectMapper) bean; // 全局配置序列化返回 JSON 处理 SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); objectMapper.registerModule(simpleModule); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java new file mode 100644 index 000000000..792da8b3a --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java @@ -0,0 +1,29 @@ +package com.ruoyi.framework.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.ser.std.NumberSerializer; + +import java.io.IOException; + +@JacksonStdImpl +public class BigNumberSerializer extends NumberSerializer { + + private static final long JS_NUM_MAX = 9007199254740992L; + private static final long JS_NUM_MIN = -9007199254740992L; + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + if (value.longValue() >= JS_NUM_MIN && value.longValue() <= JS_NUM_MAX) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } +} From 0158fb437d09cf826dd28aed2a414650e271380e 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, 29 Jul 2021 13:27:26 +0800 Subject: [PATCH 009/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20springboo?= =?UTF-8?q?t=20=E7=89=88=E6=9C=AC=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 621e0164e..f479c3395 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![使用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-2.6.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) -[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.4-blue.svg)]() +[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() From d29a7adc9a0cb5dde13abe16985bb66f6e375c00 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, 29 Jul 2021 14:28:08 +0800 Subject: [PATCH 010/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20BigNumber?= =?UTF-8?q?Serializer=20=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackson/BigNumberSerializer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java index 792da8b3a..94c63afa2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java @@ -7,11 +7,23 @@ import com.fasterxml.jackson.databind.ser.std.NumberSerializer; import java.io.IOException; +/** + * 超出 JS 最大最小值 处理 + * + * @author Lion Li + */ @JacksonStdImpl public class BigNumberSerializer extends NumberSerializer { - private static final long JS_NUM_MAX = 9007199254740992L; - private static final long JS_NUM_MIN = -9007199254740992L; + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + /** + * 提供实例 + */ public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); public BigNumberSerializer(Class rawType) { @@ -20,7 +32,8 @@ public class BigNumberSerializer extends NumberSerializer { @Override public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { - if (value.longValue() >= JS_NUM_MIN && value.longValue() <= JS_NUM_MAX) { + // 超出范围 序列化位字符串 + if (value.longValue() > MAX_SAFE_INTEGER && value.longValue() < MIN_SAFE_INTEGER) { super.serialize(value, gen, provider); } else { gen.writeString(value.toString()); From 90d2a7af03161af44e83c3d9b4f3fe835b656677 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, 29 Jul 2021 15:09:23 +0800 Subject: [PATCH 011/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20BigNumber?= =?UTF-8?q?Serializer=20=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/framework/jackson/BigNumberSerializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java index 94c63afa2..1781b94be 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java @@ -33,7 +33,7 @@ public class BigNumberSerializer extends NumberSerializer { @Override public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 超出范围 序列化位字符串 - if (value.longValue() > MAX_SAFE_INTEGER && value.longValue() < MIN_SAFE_INTEGER) { + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { super.serialize(value, gen, provider); } else { gen.writeString(value.toString()); From f6bc28000e08839e30112f012e13f66f25d5e7c2 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Thu, 29 Jul 2021 17:32:55 +0800 Subject: [PATCH 012/106] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E9=94=99=E8=AF=AFtok?= =?UTF-8?q?en=E5=AF=BC=E8=87=B4=E7=9A=84=E8=A7=A3=E6=9E=90=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/web/service/TokenService.java | 18 ++++++++++++------ ruoyi-ui/src/utils/request.js | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index 943eae213..5b4c41466 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -60,12 +60,18 @@ public class TokenService String token = getToken(request); if (StringUtils.isNotEmpty(token)) { - Claims claims = parseToken(token); - // 解析对应的权限以及用户信息 - String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); - String userKey = getTokenKey(uuid); - LoginUser user = redisCache.getCacheObject(userKey); - return user; + try + { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } } return null; } diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 6a7cbfa32..b9b5ad80d 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -64,7 +64,7 @@ service.interceptors.response.use(res => { location.href = '/index'; }) }).catch(() => {}); - return Promise.reject('error') + return Promise.reject() } else if (code === 500) { Message({ message: msg, From 2de5cc52d13b116074bd22db67c029a433239233 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 30 Jul 2021 11:28:04 +0800 Subject: [PATCH 013/106] =?UTF-8?q?=E5=90=AF=E7=94=A8=E7=88=B6=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E7=8A=B6=E6=80=81=E6=8E=92=E9=99=A4=E9=A1=B6=E7=BA=A7?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index fe885a0c0..2b081f9df 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -209,7 +209,8 @@ public class SysDeptServiceImpl implements ISysDeptService updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); } int result = deptMapper.updateDept(dept); - if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) { // 如果该部门是启用状态,则启用该部门的所有上级部门 updateParentDeptStatusNormal(dept); From 8ed7916b617ed7a602817d976d4779a6c9af1d99 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 30 Jul 2021 11:28:46 +0800 Subject: [PATCH 014/106] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=B1=8F=E8=94=BDhttp(s)=E8=BF=9C=E7=A8=8B=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/StringUtils.java | 23 ++++++++++++ .../quartz/controller/SysJobController.java | 36 +++++++++++-------- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index ca12798d1..8df561779 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -324,6 +324,29 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return list; } + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + /** * 驼峰转下划线命名 */ diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java index e779b641b..4d37ee9cf 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java @@ -79,18 +79,22 @@ public class SysJobController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:job:add')") @Log(title = "定时任务", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysJob sysJob) throws SchedulerException, TaskException + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException { - if (!CronUtils.isValid(sysJob.getCronExpression())) + if (!CronUtils.isValid(job.getCronExpression())) { - return AjaxResult.error("新增任务'" + sysJob.getJobName() + "'失败,Cron表达式不正确"); + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); } - else if (StringUtils.containsIgnoreCase(sysJob.getInvokeTarget(), Constants.LOOKUP_RMI)) + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { - return AjaxResult.error("新增任务'" + sysJob.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); } - sysJob.setCreateBy(SecurityUtils.getUsername()); - return toAjax(jobService.insertJob(sysJob)); + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)//'调用"); + } + job.setCreateBy(SecurityUtils.getUsername()); + return toAjax(jobService.insertJob(job)); } /** @@ -99,18 +103,22 @@ public class SysJobController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:job:edit')") @Log(title = "定时任务", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysJob sysJob) throws SchedulerException, TaskException + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException { - if (!CronUtils.isValid(sysJob.getCronExpression())) + if (!CronUtils.isValid(job.getCronExpression())) { - return AjaxResult.error("修改任务'" + sysJob.getJobName() + "'失败,Cron表达式不正确"); + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); } - else if (StringUtils.containsIgnoreCase(sysJob.getInvokeTarget(), Constants.LOOKUP_RMI)) + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { - return AjaxResult.error("修改任务'" + sysJob.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); } - sysJob.setUpdateBy(SecurityUtils.getUsername()); - return toAjax(jobService.updateJob(sysJob)); + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)//'调用"); + } + job.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(jobService.updateJob(job)); } /** From 39783f2b193e1b7c36ac37c9f8be3ddb76627303 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, 30 Jul 2021 14:14:21 +0800 Subject: [PATCH 015/106] =?UTF-8?q?update=20=E9=99=8D=E7=BA=A7=20minio=20?= =?UTF-8?q?=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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0454126e2..7c31108c6 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 7.8.0 3.13.0 5.6.47 - 8.3.0 + 8.2.0 localhost From c65acd6a28e15d95459e1f835856b384eabde2a8 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, 30 Jul 2021 19:10:54 +0800 Subject: [PATCH 016/106] =?UTF-8?q?update=20=E9=87=8D=E5=86=99=20=E9=98=B2?= =?UTF-8?q?=E9=87=8D=E6=8F=90=E4=BA=A4=E6=8B=A6=E6=88=AA=E5=99=A8=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=85=A8=E5=B1=80=E4=B8=8E=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=20=E6=8B=A6=E6=88=AA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E9=85=8D=E7=BD=AE=E9=85=8D=E7=BD=AE=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 5 + .../ruoyi/common/annotation/RepeatSubmit.java | 52 +++--- .../interceptor/RepeatSubmitInterceptor.java | 66 ++++--- .../impl/SameUrlDataInterceptor.java | 162 ++++++++---------- 4 files changed, 136 insertions(+), 149 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4a52958a3..95ccf203f 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -107,6 +107,11 @@ token: # 令牌有效期(默认30分钟) expireTime: 30 +# 重复提交 +repeat-submit: + # 全局间隔时间(毫秒) + intervalTime: 1000 + # MyBatisPlus配置 # https://baomidou.com/config/ mybatis-plus: diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java index 628eef1ef..c2bbee476 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -1,23 +1,29 @@ -package com.ruoyi.common.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 自定义注解防止表单重复提交 - * - * @author ruoyi - * - */ -@Inherited -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RepeatSubmit -{ - -} +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * 自定义注解防止表单重复提交 + * + * @author Lion Li + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit { + + /** + * 默认使用全局配置 + */ + int intervalTime() default 0; + + TimeUnit timeUnit() default TimeUnit.MILLISECONDS; + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java index bd0e99ed5..9af0a830b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java @@ -6,7 +6,7 @@ import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.ServletUtils; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -15,42 +15,36 @@ import java.lang.reflect.Method; /** * 防止重复提交拦截器 * - * @author ruoyi + * 移除继承 HandlerInterceptorAdapter 过期类 + * 改为实现 HandlerInterceptor 接口(官方推荐写法) + * + * @author Lion Li */ @Component -public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter -{ - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception - { - if (handler instanceof HandlerMethod) - { - HandlerMethod handlerMethod = (HandlerMethod) handler; - Method method = handlerMethod.getMethod(); - RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); - if (annotation != null) - { - if (this.isRepeatSubmit(request)) - { - AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); - ServletUtils.renderString(response, JsonUtils.toJsonString(ajaxResult)); - return false; - } - } - return true; - } - else - { - return super.preHandle(request, response, handler); - } - } +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor { - /** - * 验证是否重复提交由子类实现具体的防重复提交的规则 - * - * @param request - * @return - * @throws Exception - */ - public abstract boolean isRepeatSubmit(HttpServletRequest request); + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) { + if (this.isRepeatSubmit(annotation, request)) { + AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); + ServletUtils.renderString(response, JsonUtils.toJsonString(ajaxResult)); + return false; + } + } + return true; + } else { + return HandlerInterceptor.super.preHandle(request, response, handler); + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + */ + public abstract boolean isRepeatSubmit(RepeatSubmit annotation, HttpServletRequest request); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java index bc0923144..8fc4e7956 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -1,15 +1,19 @@ package com.ruoyi.framework.interceptor.impl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Validator; +import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.filter.RepeatedlyRequestWrapper; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.framework.config.properties.RepeatSubmitProperties; +import com.ruoyi.framework.config.properties.TokenProperties; import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @@ -20,45 +24,34 @@ import java.util.concurrent.TimeUnit; /** * 判断请求url和数据是否和上一次相同, - * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * 如果和上次相同,则是重复提交表单。 * - * @author ruoyi + * @author Lion Li */ @Slf4j +@RequiredArgsConstructor(onConstructor_ = @Autowired) @Component -public class SameUrlDataInterceptor extends RepeatSubmitInterceptor -{ - public final String REPEAT_PARAMS = "repeatParams"; +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { + public final String REPEAT_PARAMS = "repeatParams"; - public final String REPEAT_TIME = "repeatTime"; + public final String REPEAT_TIME = "repeatTime"; - // 令牌自定义标识 - @Value("${token.header}") - private String header; + private final TokenProperties tokenProperties; + private final RepeatSubmitProperties repeatSubmitProperties; + private final RedisCache redisCache; - @Autowired - private RedisCache redisCache; - /** - * 间隔时间,单位:秒 默认10秒 - * - * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据 - */ - private int intervalTime = 10; - - public void setIntervalTime(int intervalTime) - { - this.intervalTime = intervalTime; - } - - @SuppressWarnings("unchecked") - @Override - public boolean isRepeatSubmit(HttpServletRequest request) - { - String nowParams = ""; - if (request instanceof RepeatedlyRequestWrapper) - { - RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(RepeatSubmit repeatSubmit, HttpServletRequest request) { + // 如果注解不为0 则使用注解数值 + long intervalTime = repeatSubmitProperties.getIntervalTime(); + if (repeatSubmit.intervalTime() > 0) { + intervalTime = repeatSubmit.timeUnit().toMillis(repeatSubmit.intervalTime()); + } + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; try { nowParams = IoUtil.readUtf8(repeatedlyRequest.getInputStream()); } catch (IOException e) { @@ -66,68 +59,57 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor } } - // body参数为空,获取Parameter的数据 - if (Validator.isEmpty(nowParams)) - { - nowParams = JsonUtils.toJsonString(request.getParameterMap()); - } - Map nowDataMap = new HashMap(); - nowDataMap.put(REPEAT_PARAMS, nowParams); - nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + // body参数为空,获取Parameter的数据 + if (Validator.isEmpty(nowParams)) { + nowParams = JsonUtils.toJsonString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); - // 请求地址(作为存放cache的key值) - String url = request.getRequestURI(); + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); - // 唯一值(没有消息头则使用请求地址) - String submitKey = request.getHeader(header); - if (Validator.isEmpty(submitKey)) - { - submitKey = url; - } + // 唯一值(没有消息头则使用请求地址) + String submitKey = request.getHeader(tokenProperties.getHeader()); + if (Validator.isEmpty(submitKey)) { + submitKey = url; + } - // 唯一标识(指定key + 消息头) - String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey; + // 唯一标识(指定key + 消息头) + String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey; - Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); - if (sessionObj != null) - { - Map sessionMap = (Map) sessionObj; - if (sessionMap.containsKey(url)) - { - Map preDataMap = (Map) sessionMap.get(url); - if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap)) - { - return true; - } - } - } - Map cacheMap = new HashMap(); - cacheMap.put(url, nowDataMap); - redisCache.setCacheObject(cacheRepeatKey, cacheMap, intervalTime, TimeUnit.SECONDS); - return false; - } + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, intervalTime)) { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, Convert.toInt(intervalTime), TimeUnit.MILLISECONDS); + return false; + } - /** - * 判断参数是否相同 - */ - private boolean compareParams(Map nowMap, Map preMap) - { - String nowParams = (String) nowMap.get(REPEAT_PARAMS); - String preParams = (String) preMap.get(REPEAT_PARAMS); - return nowParams.equals(preParams); - } + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } - /** - * 判断两次间隔时间 - */ - private boolean compareTime(Map nowMap, Map preMap) - { - long time1 = (Long) nowMap.get(REPEAT_TIME); - long time2 = (Long) preMap.get(REPEAT_TIME); - if ((time1 - time2) < (this.intervalTime * 1000)) - { - return true; - } - return false; - } + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, long intervalTime) { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + return (time1 - time2) < intervalTime; + } } From ba99070ca495237858d37d7c00abc02440d665dd 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, 30 Jul 2021 19:11:10 +0800 Subject: [PATCH 017/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20=E9=98=B2?= =?UTF-8?q?=E9=87=8D=E6=8F=90=E4=BA=A4=E6=8B=A6=E6=88=AA=E5=99=A8=20demo?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/demo/controller/TestDemoController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index ade20f8d3..afec84d86 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -24,6 +24,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Arrays; import java.util.List; +import java.util.concurrent.TimeUnit; /** * 测试单表Controller @@ -90,7 +91,7 @@ public class TestDemoController extends BaseController { @ApiOperation("新增测试单表") @PreAuthorize("@ss.hasPermi('demo:demo:add')") @Log(title = "测试单表", businessType = BusinessType.INSERT) - @RepeatSubmit + @RepeatSubmit(intervalTime = 2, timeUnit = TimeUnit.SECONDS) @PostMapping() public AjaxResult add(@Validated(AddGroup.class) @RequestBody TestDemoBo bo) { return toAjax(iTestDemoService.insertByBo(bo) ? 1 : 0); From 5397e345cacf460c28372f9ecf66b2d56f3801d7 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 30 Jul 2021 21:23:35 +0800 Subject: [PATCH 018/106] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysRegisterController.java | 38 ++++ .../main/resources/i18n/messages.properties | 1 + .../com/ruoyi/common/constant/Constants.java | 9 +- .../ruoyi/common/constant/UserConstants.java | 14 +- .../core/domain/model/RegisterBody.java | 11 + .../framework/config/SecurityConfig.java | 7 +- .../manager/factory/AsyncFactory.java | 2 +- .../web/service/SysRegisterService.java | 115 ++++++++++ .../ruoyi/system/service/ISysUserService.java | 10 +- .../service/impl/SysUserServiceImpl.java | 11 + ruoyi-ui/src/api/login.js | 12 + ruoyi-ui/src/router/index.js | 5 + ruoyi-ui/src/views/login.vue | 12 +- ruoyi-ui/src/views/register.vue | 208 ++++++++++++++++++ ruoyi-ui/src/views/system/user/index.vue | 3 +- sql/{ry_20210713.sql => ry_20210731.sql} | 9 +- 16 files changed, 451 insertions(+), 16 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java create mode 100644 ruoyi-ui/src/views/register.vue rename sql/{ry_20210713.sql => ry_20210731.sql} (98%) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java new file mode 100644 index 000000000..e88a2ad6e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -0,0 +1,38 @@ +package com.ruoyi.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.framework.web.service.SysRegisterService; +import com.ruoyi.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 4baeb241a..5a41f8c7b 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -19,6 +19,7 @@ user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 +user.register.success=注册成功 user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 1e9a9959e..7fdf1639b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -1,5 +1,7 @@ package com.ruoyi.common.constant; +import io.jsonwebtoken.Claims; + /** * 通用常量信息 * @@ -47,6 +49,11 @@ public class Constants */ public static final String LOGOUT = "Logout"; + /** + * 注册 + */ + public static final String REGISTER = "Register"; + /** * 登录失败 */ @@ -95,7 +102,7 @@ public class Constants /** * 用户名称 */ - public static final String JWT_USERNAME = "sub"; + public static final String JWT_USERNAME = Claims.SUBJECT; /** * 用户头像 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index 36797ad8a..c6c7797bf 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -53,7 +53,7 @@ public class UserConstants /** Layout组件标识 */ public final static String LAYOUT = "Layout"; - + /** ParentView组件标识 */ public final static String PARENT_VIEW = "ParentView"; @@ -63,4 +63,16 @@ public class UserConstants /** 校验返回结果码 */ public final static String UNIQUE = "0"; public final static String NOT_UNIQUE = "1"; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java new file mode 100644 index 000000000..5baa88781 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.ruoyi.common.core.domain.model; + +/** + * 用户注册对象 + * + * @author ruoyi + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 30718c3c5..bd3622901 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -49,7 +49,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Autowired private JwtAuthenticationTokenFilter authenticationTokenFilter; - + /** * 跨域过滤器 */ @@ -96,8 +96,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 过滤请求 .authorizeRequests() - // 对于登录login 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/captchaImage").anonymous() + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + .antMatchers("/login", "/register", "/captchaImage").anonymous() .antMatchers( HttpMethod.GET, "/", @@ -126,7 +126,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); } - /** * 强散列哈希加密实现 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java index 57af9bb60..0bac2e90f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -65,7 +65,7 @@ public class AsyncFactory logininfor.setOs(os); logininfor.setMsg(message); // 日志状态 - if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { logininfor.setStatus(Constants.SUCCESS); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java new file mode 100644 index 000000000..c7fbdc942 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java @@ -0,0 +1,115 @@ +package com.ruoyi.framework.web.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + + boolean captchaOnOff = configService.selectCaptchaOnOff(); + // 验证码开关 + if (captchaOnOff) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index d284e9692..ae7bc137e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -105,6 +105,14 @@ public interface ISysUserService */ public int insertUser(SysUser user); + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + /** * 修改用户信息 * @@ -112,7 +120,7 @@ public interface ISysUserService * @return 结果 */ public int updateUser(SysUser user); - + /** * 用户授权角色 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index baa93529f..6c29ba3aa 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -246,6 +246,17 @@ public class SysUserServiceImpl implements ISysUserService return rows; } + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user) + { + return userMapper.insertUser(user) > 0; + } + /** * 修改保存用户信息 * diff --git a/ruoyi-ui/src/api/login.js b/ruoyi-ui/src/api/login.js index 9971357ed..2fa9f1c0a 100644 --- a/ruoyi-ui/src/api/login.js +++ b/ruoyi-ui/src/api/login.js @@ -15,6 +15,18 @@ export function login(username, password, code, uuid) { }) } +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + // 获取用户详细信息 export function getInfo() { return request({ diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js index 5b3b4fe36..b593898e5 100644 --- a/ruoyi-ui/src/router/index.js +++ b/ruoyi-ui/src/router/index.js @@ -43,6 +43,11 @@ export const constantRoutes = [ component: (resolve) => require(['@/views/login'], resolve), hidden: true }, + { + path: '/register', + component: (resolve) => require(['@/views/register'], resolve), + hidden: true + }, { path: '/404', component: (resolve) => require(['@/views/error/404'], resolve), diff --git a/ruoyi-ui/src/views/login.vue b/ruoyi-ui/src/views/login.vue index 132007a0e..255eafca0 100644 --- a/ruoyi-ui/src/views/login.vue +++ b/ruoyi-ui/src/views/login.vue @@ -44,6 +44,9 @@ 登 录 登 录 中... +

+ 立即注册 +
@@ -73,15 +76,18 @@ export default { }, loginRules: { username: [ - { required: true, trigger: "blur", message: "用户名不能为空" } + { required: true, trigger: "blur", message: "请输入您的账号" } ], password: [ - { required: true, trigger: "blur", message: "密码不能为空" } + { required: true, trigger: "blur", message: "请输入您的密码" } ], - code: [{ required: true, trigger: "change", message: "验证码不能为空" }] + code: [{ required: true, trigger: "change", message: "请输入验证码" }] }, loading: false, + // 验证码开关 captchaOnOff: true, + // 注册开关 + register: false, redirect: undefined }; }, diff --git a/ruoyi-ui/src/views/register.vue b/ruoyi-ui/src/views/register.vue new file mode 100644 index 000000000..7ee0a7973 --- /dev/null +++ b/ruoyi-ui/src/views/register.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 0fe253607..460740924 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -436,7 +436,8 @@ export default { // 表单校验 rules: { userName: [ - { required: true, message: "用户名称不能为空", trigger: "blur" } + { required: true, message: "用户名称不能为空", trigger: "blur" }, + { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' } ], nickName: [ { required: true, message: "用户昵称不能为空", trigger: "blur" } diff --git a/sql/ry_20210713.sql b/sql/ry_20210731.sql similarity index 98% rename from sql/ry_20210713.sql rename to sql/ry_20210731.sql index f8be688eb..8fb32fa4e 100644 --- a/sql/ry_20210713.sql +++ b/sql/ry_20210731.sql @@ -534,10 +534,11 @@ create table sys_config ( primary key (config_id) ) engine=innodb auto_increment=100 comment = '参数配置表'; -insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); -insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); -insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); -insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启登录验证码功能(true开启,false关闭)'); +insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); +insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); +insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); -- ---------------------------- From a1cc346acadeedf11f7b3d866d75500155619fde Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 30 Jul 2021 21:50:47 +0800 Subject: [PATCH 019/106] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/factory/AsyncFactory.java | 1 + .../ruoyi/generator/util/VelocityUtils.java | 3 ++- .../main/resources/vm/java/controller.java.vm | 4 ++-- .../src/main/resources/vm/java/mapper.java.vm | 18 +++++++-------- .../main/resources/vm/java/service.java.vm | 12 +++++----- .../resources/vm/java/serviceImpl.java.vm | 22 +++++++++---------- .../src/main/resources/vm/xml/mapper.xml.vm | 8 +++---- 7 files changed, 35 insertions(+), 33 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java index 0bac2e90f..f9c4fcca5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.LogUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.utils.spring.SpringUtils; diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index a6743132d..6481057cd 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -280,7 +280,8 @@ public class VelocityUtils */ public static String getParentMenuId(JSONObject paramsObj) { - if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)) + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { return paramsObj.getString(GenConstants.PARENT_MENU_ID); } diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 1f9461fbe..56ff5e66a 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -76,7 +76,7 @@ public class ${ClassName}Controller extends BaseController @GetMapping(value = "/{${pkColumn.javaField}}") public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { - return AjaxResult.success(${className}Service.select${ClassName}ById(${pkColumn.javaField})); + return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); } /** @@ -109,6 +109,6 @@ public class ${ClassName}Controller extends BaseController @DeleteMapping("/{${pkColumn.javaField}s}") public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { - return toAjax(${className}Service.delete${ClassName}ByIds(${pkColumn.javaField}s)); + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); } } diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm index 282d9ea8a..42d015db7 100644 --- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -17,10 +17,10 @@ public interface ${ClassName}Mapper /** * 查询${functionName} * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ - public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); /** * 查询${functionName}列表 @@ -49,27 +49,27 @@ public interface ${ClassName}Mapper /** * 删除${functionName} * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); /** * 批量删除${functionName} * - * @param ${pkColumn.javaField}s 需要删除的数据ID + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 * @return 结果 */ - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); #if($table.sub) /** * 批量删除${subTable.functionName} * - * @param customerIds 需要删除的数据ID + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 * @return 结果 */ - public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + public int delete${subClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); /** * 批量新增${subTable.functionName} @@ -81,7 +81,7 @@ public interface ${ClassName}Mapper /** - * 通过${functionName}ID删除${subTable.functionName}信息 + * 通过${functionName}主键删除${subTable.functionName}信息 * * @param ${pkColumn.javaField} ${functionName}ID * @return 结果 diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index af422f342..e3663e12d 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -14,10 +14,10 @@ public interface I${ClassName}Service /** * 查询${functionName} * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ - public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); /** * 查询${functionName}列表 @@ -46,16 +46,16 @@ public interface I${ClassName}Service /** * 批量删除${functionName} * - * @param ${pkColumn.javaField}s 需要删除的${functionName}ID + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 * @return 结果 */ - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); /** * 删除${functionName}信息 * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); } diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index b1b3c40e3..da6b0e7d3 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -34,13 +34,13 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service /** * 查询${functionName} * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ @Override - public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { - return ${className}Mapper.select${ClassName}ById(${pkColumn.javaField}); + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); } /** @@ -106,36 +106,36 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service } /** - * 批量删除${functionName} + * 删除${functionName}对象 * - * @param ${pkColumn.javaField}s 需要删除的${functionName}ID + * @param ${pkColumn.javaField}s 需要删除的数据主键 * @return 结果 */ #if($table.sub) @Transactional #end @Override - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s) + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) { #if($table.sub) ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); #end - return ${className}Mapper.delete${ClassName}ByIds(${pkColumn.javaField}s); + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); } /** * 删除${functionName}信息 * - * @param ${pkColumn.javaField} ${functionName}ID + * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ @Override - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { #if($table.sub) ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); #end - return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField}); + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); } #if($table.sub) @@ -147,7 +147,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service public void insert${subClassName}(${ClassName} ${className}) { List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); - Long ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); if (StringUtils.isNotNull(${subclassName}List)) { List<${subClassName}> list = new ArrayList<${subClassName}>(); diff --git a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm index 6d0954e02..0c681d9cd 100644 --- a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm +++ b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -58,7 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - #if($table.crud || $table.tree) where ${pkColumn.columnName} = #{${pkColumn.javaField}} @@ -102,11 +102,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where ${pkColumn.columnName} = #{${pkColumn.javaField}} - + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} - + delete from ${tableName} where ${pkColumn.columnName} in #{${pkColumn.javaField}} @@ -121,7 +121,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} From de33e6ecc896bdccb89ed825fae9643c52cf1c37 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 30 Jul 2021 22:18:20 +0800 Subject: [PATCH 020/106] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-generator/src/main/resources/vm/java/service.java.vm | 2 +- .../src/main/resources/vm/java/serviceImpl.java.vm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index e3663e12d..250f68c8c 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -46,7 +46,7 @@ public interface I${ClassName}Service /** * 批量删除${functionName} * - * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 * @return 结果 */ public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index da6b0e7d3..2fc79492e 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -106,9 +106,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service } /** - * 删除${functionName}对象 + * 批量删除${functionName} * - * @param ${pkColumn.javaField}s 需要删除的数据主键 + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 * @return 结果 */ #if($table.sub) From 68ae4df2dca2d93079e497ddf24335730e3f1b30 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Sat, 31 Jul 2021 17:52:06 +0800 Subject: [PATCH 021/106] =?UTF-8?q?=E5=8D=87=E7=BA=A7commons.io=E5=88=B0?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=ACv2.11.0?= 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 9717988fd..7017e5146 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 1.2.76 5.8.0 5.8.0 - 2.10.0 + 2.11.0 1.4 3.2.2 4.1.2 From 1cb79223ff44062c461712ecb11f5d3b0c8514fb 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, 1 Aug 2021 11:03:56 +0800 Subject: [PATCH 022/106] update feign-okhttp 11.0 => 11.2 update okhttp 3.19.4 => 4.9.1 update minio 8.2.0 => 8.3.0 --- pom.xml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7c31108c6..181958ec2 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,8 @@ 3.4.3 5.7.6 3.0.3 - 11.0 + 11.2 + 4.9.1 2.4.3 3.16.1 2.2.1 @@ -37,7 +38,7 @@ 7.8.0 3.13.0 5.6.47 - 8.2.0 + 8.3.0 localhost @@ -129,6 +130,12 @@ ${feign-okhttp.version} + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + de.codecentric spring-boot-admin-starter-server From 946242e8f1a871a6ee6bf3cbd1906bfc7f651970 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, 1 Aug 2021 11:04:37 +0800 Subject: [PATCH 023/106] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=8F=90=E4=BA=A4=20=E9=85=8D=E7=BD=AE=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../properties/RepeatSubmitProperties.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RepeatSubmitProperties.java diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RepeatSubmitProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RepeatSubmitProperties.java new file mode 100644 index 000000000..b948f8340 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RepeatSubmitProperties.java @@ -0,0 +1,22 @@ +package com.ruoyi.framework.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 重复提交 配置属性 + * + * @author Lion Li + */ +@Data +@Component +@ConfigurationProperties(prefix = "repeat-submit") +public class RepeatSubmitProperties { + + /** + * 间隔时间(毫秒) + */ + private int intervalTime; + +} From 210b5af1c7f15f45c5d1abca607bd8d942a2b66a 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, 2 Aug 2021 09:39:35 +0800 Subject: [PATCH 024/106] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B3=A8=E5=85=A5=E5=99=A8=20=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=9B=B4=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateAndUpdateMetaObjectHandler.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java index 2479293e1..561ed4137 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java @@ -1,7 +1,9 @@ package com.ruoyi.framework.mybatisplus; +import cn.hutool.core.lang.Validator; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.SecurityUtils; import org.apache.ibatis.reflection.MetaObject; @@ -21,13 +23,13 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { try { //根据属性名字设置要填充的值 if (metaObject.hasGetter("createTime")) { - if (metaObject.getValue("createTime") == null) { + if (Validator.isEmpty(metaObject.getValue("createTime"))) { this.setFieldValByName("createTime", new Date(), metaObject); } } if (metaObject.hasGetter("createBy")) { - if (metaObject.getValue("createBy") == null) { - this.setFieldValByName("createBy", SecurityUtils.getUsername(), metaObject); + if (Validator.isEmpty(metaObject.getValue("createBy"))) { + this.setFieldValByName("createBy", getLoginUsername(), metaObject); } } } catch (Exception e) { @@ -39,12 +41,12 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { public void updateFill(MetaObject metaObject) { try { if (metaObject.hasGetter("updateBy")) { - if (metaObject.getValue("updateBy") == null) { - this.setFieldValByName("updateBy", SecurityUtils.getUsername(), metaObject); + if (Validator.isEmpty(metaObject.getValue("updateBy"))) { + this.setFieldValByName("updateBy", getLoginUsername(), metaObject); } } if (metaObject.hasGetter("updateTime")) { - if (metaObject.getValue("updateTime") == null) { + if (Validator.isEmpty(metaObject.getValue("updateTime"))) { this.setFieldValByName("updateTime", new Date(), metaObject); } } @@ -53,4 +55,15 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { } } + /** + * 获取登录用户名 + */ + private String getLoginUsername() { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (Validator.isEmpty(loginUser)) { + throw new CustomException("用户未登录 => 无法获取用户信息"); + } + return loginUser.getUsername(); + } + } From f8ab5663ef7220f8adc0fd8fcbd7d0cf84c6d77d 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, 2 Aug 2021 12:15:14 +0800 Subject: [PATCH 025/106] =?UTF-8?q?update=20=E6=97=A5=E5=B8=B8=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=A0=A1=E9=AA=8C=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=88=B0=20StringUtils=20=E4=BE=BF=E4=BA=8E?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/CaptchaController.java | 6 +- .../controller/common/CommonController.java | 10 +- .../controller/monitor/CacheController.java | 100 +-- .../monitor/SysUserOnlineController.java | 10 +- .../controller/system/SysDeptController.java | 6 +- .../controller/system/SysIndexController.java | 4 +- .../controller/system/SysMenuController.java | 6 +- .../system/SysProfileController.java | 6 +- .../system/SysRegisterController.java | 76 +-- .../core/controller/BaseController.java | 4 +- .../core/mybatisplus/methods/InsertAll.java | 8 +- .../ruoyi/common/exception/BaseException.java | 6 +- .../ruoyi/common/filter/RepeatableFilter.java | 96 +-- .../com/ruoyi/common/filter/XssFilter.java | 8 +- .../filter/XssHttpServletRequestWrapper.java | 7 +- .../com/ruoyi/common/utils/DictUtils.java | 372 ++++++----- .../com/ruoyi/common/utils/JsonUtils.java | 11 +- .../com/ruoyi/common/utils/PageUtils.java | 7 +- .../com/ruoyi/common/utils/ServletUtils.java | 5 +- .../com/ruoyi/common/utils/StringUtils.java | 590 ++---------------- .../common/utils/file/FileUploadUtils.java | 7 +- .../ruoyi/common/utils/file/FileUtils.java | 6 +- .../ruoyi/common/utils/file/ImageUtils.java | 204 +++--- .../ruoyi/common/utils/ip/AddressUtils.java | 4 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 55 +- .../common/utils/reflect/ReflectUtils.java | 12 +- .../com/ruoyi/common/utils/sql/SqlUtil.java | 6 +- .../service/impl/TestDemoServiceImpl.java | 8 +- .../service/impl/TestTreeServiceImpl.java | 6 +- .../framework/aspectj/DataScopeAspect.java | 16 +- .../ruoyi/framework/aspectj/LogAspect.java | 8 +- .../captcha/UnsignedMathGenerator.java | 8 +- .../ruoyi/framework/config/FilterConfig.java | 8 +- .../ruoyi/framework/config/RedisConfig.java | 4 +- .../manager/factory/AsyncFactory.java | 102 --- .../handle/AuthenticationEntryPointImpl.java | 4 +- .../framework/web/service/AsyncService.java | 3 +- .../web/service/PermissionService.java | 14 +- .../web/service/SysRegisterService.java | 232 +++---- .../framework/web/service/TokenService.java | 3 +- .../com/ruoyi/generator/domain/GenTable.java | 14 +- .../generator/domain/GenTableColumn.java | 28 +- .../service/GenTableServiceImpl.java | 24 +- .../com/ruoyi/generator/util/GenUtils.java | 38 +- .../ruoyi/generator/util/VelocityUtils.java | 60 +- .../resources/vm/java/serviceImpl.java.vm | 4 +- .../AbstractCloudStorageService.java | 4 +- .../impl/AliyunCloudStorageServiceImpl.java | 6 +- .../impl/MinioCloudStorageServiceImpl.java | 4 +- .../impl/QcloudCloudStorageServiceImpl.java | 6 +- .../service/impl/SysOssServiceImpl.java | 16 +- .../quartz/controller/SysJobController.java | 8 +- .../java/com/ruoyi/quartz/domain/SysJob.java | 4 +- .../service/impl/SysJobLogServiceImpl.java | 18 +- .../service/impl/SysJobServiceImpl.java | 18 +- .../java/com/ruoyi/quartz/task/RyTask.java | 58 +- .../ruoyi/quartz/util/AbstractQuartzJob.java | 218 +++---- .../com/ruoyi/quartz/util/JobInvokeUtil.java | 368 +++++------ .../com/ruoyi/system/domain/vo/MetaVo.java | 4 +- .../service/impl/SysConfigServiceImpl.java | 20 +- .../service/impl/SysDeptServiceImpl.java | 5 +- .../service/impl/SysDictDataServiceImpl.java | 14 +- .../service/impl/SysDictTypeServiceImpl.java | 14 +- .../impl/SysLogininforServiceImpl.java | 14 +- .../service/impl/SysMenuServiceImpl.java | 29 +- .../service/impl/SysNoticeServiceImpl.java | 14 +- .../service/impl/SysOperLogServiceImpl.java | 10 +- .../service/impl/SysPostServiceImpl.java | 14 +- .../impl/SysUserOnlineServiceImpl.java | 8 +- ruoyi-ui/src/utils/ossdownload.js | 2 + 70 files changed, 1267 insertions(+), 1825 deletions(-) delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index 46545165f..fb2fb2003 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -8,7 +8,7 @@ import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.captcha.generator.RandomGenerator; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; @@ -107,9 +107,9 @@ public class CaptchaController { private String getCodeResult(String capStr) { int numberLength = captchaProperties.getNumberLength(); - int a = Convert.toInt(StrUtil.sub(capStr, 0, numberLength).trim()); + int a = Convert.toInt(StringUtils.sub(capStr, 0, numberLength).trim()); char operator = capStr.charAt(numberLength); - int b = Convert.toInt(StrUtil.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim()); + int b = Convert.toInt(StringUtils.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim()); switch (operator) { case '*': return a * b + ""; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index 04aa77b33..a54333eaf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.common; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.file.FileUtils; @@ -37,7 +37,7 @@ public class CommonController { if (!FileUtils.checkAllowDownload(fileName)) { - throw new Exception(StrUtil.format("文件名称({})非法,不允许下载。 ", fileName)); + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); } String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); String filePath = RuoYiConfig.getDownloadPath() + fileName; @@ -67,14 +67,14 @@ public class CommonController { if (!FileUtils.checkAllowDownload(resource)) { - throw new Exception(StrUtil.format("资源文件({})非法,不允许下载。 ", resource)); + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); } // 本地资源路径 String localPath = RuoYiConfig.getProfile(); // 数据库资源地址 - String downloadPath = localPath + StrUtil.subAfter(resource, Constants.RESOURCE_PREFIX,false); + String downloadPath = localPath + StringUtils.subAfter(resource, Constants.RESOURCE_PREFIX,false); // 下载名称 - String downloadName = StrUtil.subAfter(downloadPath, "/",true); + String downloadName = StringUtils.subAfter(downloadPath, "/",true); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); File file = new File(downloadPath); FileUtils.setAttachmentResponseHeader(response, downloadName); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index b3efd5ace..48e95dd3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,50 +1,50 @@ -package com.ruoyi.web.controller.monitor; - -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.core.domain.AjaxResult; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.*; - -/** - * 缓存监控 - * - * @author ruoyi - */ -@RestController -@RequestMapping("/monitor/cache") -public class CacheController -{ - @Autowired - private RedisTemplate redisTemplate; - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @GetMapping() - public AjaxResult getInfo() throws Exception - { - Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); - Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); - Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); - - Map result = new HashMap<>(3); - result.put("info", info); - result.put("dbSize", dbSize); - - List> pieList = new ArrayList<>(); - commandStats.stringPropertyNames().forEach(key -> { - Map data = new HashMap<>(2); - String property = commandStats.getProperty(key); - data.put("name", StrUtil.removePrefix(key, "cmdstat_")); - data.put("value", StrUtil.subBetween(property, "calls=", ",usec")); - pieList.add(data); - }); - result.put("commandStats", pieList); - return AjaxResult.success(result); - } -} +package com.ruoyi.web.controller.monitor; + +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removePrefix(key, "cmdstat_")); + data.put("value", StringUtils.subBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index fe630a99c..edcf766b4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,7 +1,7 @@ package com.ruoyi.web.controller.monitor; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; @@ -24,7 +24,7 @@ import java.util.List; /** * 在线用户监控 - * + * * @author ruoyi */ @RestController @@ -48,21 +48,21 @@ public class SysUserOnlineController extends BaseController LoginUser user = redisCache.getCacheObject(key); if (Validator.isNotEmpty(ipaddr) && Validator.isNotEmpty(userName)) { - if (StrUtil.equals(ipaddr, user.getIpaddr()) && StrUtil.equals(userName, user.getUsername())) + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); } } else if (Validator.isNotEmpty(ipaddr)) { - if (StrUtil.equals(ipaddr, user.getIpaddr())) + if (StringUtils.equals(ipaddr, user.getIpaddr())) { userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); } } else if (Validator.isNotEmpty(userName) && Validator.isNotNull(user.getUser())) { - if (StrUtil.equals(userName, user.getUsername())) + if (StringUtils.equals(userName, user.getUsername())) { userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index ab39319a1..420ac04ba 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -56,7 +56,7 @@ public class SysDeptController extends BaseController { SysDept d = (SysDept) it.next(); if (d.getDeptId().intValue() == deptId - || ArrayUtils.contains(StrUtil.splitToArray(d.getAncestors(), ","), deptId + "")) + || ArrayUtils.contains(StringUtils.splitToArray(d.getAncestors(), ","), deptId + "")) { it.remove(); } @@ -129,7 +129,7 @@ public class SysDeptController extends BaseController { return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); } - else if (StrUtil.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) { return AjaxResult.error("该部门包含未停用的子部门!"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java index a29620c4f..bfb532e36 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.config.RuoYiConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -24,6 +24,6 @@ public class SysIndexController @RequestMapping("/") public String index() { - return StrUtil.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index 246abf406..f4185413a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -1,6 +1,5 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -10,6 +9,7 @@ import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysMenuService; import org.springframework.beans.factory.annotation.Autowired; @@ -97,7 +97,7 @@ public class SysMenuController extends BaseController { return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !Validator.isUrl(menu.getPath())) + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } @@ -117,7 +117,7 @@ public class SysMenuController extends BaseController { return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !Validator.isUrl(menu.getPath())) + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 39f5bc6d7..9e1e71536 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.UserConstants; @@ -59,12 +59,12 @@ public class SysProfileController extends BaseController @PutMapping public AjaxResult updateProfile(@RequestBody SysUser user) { - if (StrUtil.isNotEmpty(user.getPhonenumber()) + if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } - if (StrUtil.isNotEmpty(user.getEmail()) + if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index e88a2ad6e..4c2cc7c66 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,38 +1,38 @@ -package com.ruoyi.web.controller.system; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.model.RegisterBody; -import com.ruoyi.framework.web.service.SysRegisterService; -import com.ruoyi.system.service.ISysConfigService; - -/** - * 注册验证 - * - * @author ruoyi - */ -@RestController -public class SysRegisterController extends BaseController -{ - @Autowired - private SysRegisterService registerService; - - @Autowired - private ISysConfigService configService; - - @PostMapping("/register") - public AjaxResult register(@RequestBody RegisterBody user) - { - if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) - { - return error("当前系统没有开启注册功能!"); - } - String msg = registerService.register(user); - return StringUtils.isEmpty(msg) ? success() : error(msg); - } -} +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.SysRegisterService; +import com.ruoyi.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 注册验证 + * + * @author ruoyi + */ +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java index 632c0fb4d..fcccbc355 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -1,7 +1,7 @@ package com.ruoyi.common.core.controller; -import cn.hutool.core.util.StrUtil; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,6 +73,6 @@ public class BaseController */ public String redirect(String url) { - return StrUtil.format("redirect:{}", url); + return StringUtils.format("redirect:{}", url); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java index bc17faae3..2aba06e0e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java @@ -1,10 +1,10 @@ package com.ruoyi.common.core.mybatisplus.methods; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.ruoyi.common.utils.StringUtils; import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; import org.apache.ibatis.executor.keygen.KeyGenerator; import org.apache.ibatis.executor.keygen.NoKeyGenerator; @@ -28,7 +28,7 @@ public class InsertAll extends AbstractMethod { String keyProperty = null; String keyColumn = null; // 表包含主键处理逻辑,如果不包含主键当普通字段处理 - if (StrUtil.isNotBlank(tableInfo.getKeyProperty())) { + if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) { if (tableInfo.getIdType() == IdType.AUTO) { /** 自增主键 */ keyGenerator = new Jdbc3KeyGenerator(); @@ -49,7 +49,7 @@ public class InsertAll extends AbstractMethod { private String prepareFieldSql(TableInfo tableInfo) { StringBuilder fieldSql = new StringBuilder(); - if (StrUtil.isNotBlank(tableInfo.getKeyColumn())) { + if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { fieldSql.append(tableInfo.getKeyColumn()).append(","); } tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(",")); @@ -62,7 +62,7 @@ public class InsertAll extends AbstractMethod { private String prepareValuesSqlForMysqlBatch(TableInfo tableInfo) { final StringBuilder valueSql = new StringBuilder(); valueSql.append(""); - if (StrUtil.isNotBlank(tableInfo.getKeyColumn())) { + if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},"); } tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},")); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java index 026cc0abb..261530c5f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java @@ -1,11 +1,11 @@ package com.ruoyi.common.exception; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; /** * 基础异常 - * + * * @author ruoyi */ public class BaseException extends RuntimeException @@ -64,7 +64,7 @@ public class BaseException extends RuntimeException public String getMessage() { String message = null; - if (!Validator.isEmpty(code)) + if (!StringUtils.isEmpty(code)) { message = MessageUtils.message(code, args); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java index c7193e20c..a0db86b7c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -1,48 +1,48 @@ -package com.ruoyi.common.filter; - -import cn.hutool.core.util.StrUtil; -import org.springframework.http.MediaType; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * Repeatable 过滤器 - * - * @author ruoyi - */ -public class RepeatableFilter implements Filter -{ - @Override - public void init(FilterConfig filterConfig) throws ServletException - { - - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { - ServletRequest requestWrapper = null; - if (request instanceof HttpServletRequest - && StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) - { - requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); - } - if (null == requestWrapper) - { - chain.doFilter(request, response); - } - else - { - chain.doFilter(requestWrapper, response); - } - } - - @Override - public void destroy() - { - - } -} +package com.ruoyi.common.filter; + +import com.ruoyi.common.utils.StringUtils; +import org.springframework.http.MediaType; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * Repeatable 过滤器 + * + * @author ruoyi + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java index 869aef5ae..7c141671a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java @@ -1,6 +1,6 @@ package com.ruoyi.common.filter; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -8,8 +8,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * 防止XSS攻击的过滤器 @@ -27,7 +25,7 @@ public class XssFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException { String tempExcludes = filterConfig.getInitParameter("excludes"); - if (StrUtil.isNotEmpty(tempExcludes)) + if (StringUtils.isNotEmpty(tempExcludes)) { String[] url = tempExcludes.split(","); for (int i = 0; url != null && i < url.length; i++) @@ -61,7 +59,7 @@ public class XssFilter implements Filter { return true; } - return StrUtil.matches(url, excludes); + return StringUtils.matches(url, excludes); } @Override diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java index 4d36a92ec..973697b2a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -1,9 +1,8 @@ package com.ruoyi.common.filter; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; +import com.ruoyi.common.utils.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -59,7 +58,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper // 为空,直接返回 String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8); - if (Validator.isEmpty(json)) + if (StringUtils.isEmpty(json)) { return super.getInputStream(); } @@ -103,6 +102,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper public boolean isJsonRequest() { String header = super.getHeader(HttpHeaders.CONTENT_TYPE); - return StrUtil.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + return StringUtils.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java index 5d1fef18f..69bab4900 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -1,187 +1,185 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.entity.SysDictData; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.utils.spring.SpringUtils; - -import java.util.Collection; -import java.util.List; - -/** - * 字典工具类 - * - * @author ruoyi - */ -public class DictUtils -{ - /** - * 分隔符 - */ - public static final String SEPARATOR = ","; - - /** - * 设置字典缓存 - * - * @param key 参数键 - * @param dictDatas 字典数据列表 - */ - public static void setDictCache(String key, List dictDatas) - { - SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); - } - - /** - * 获取字典缓存 - * - * @param key 参数键 - * @return dictDatas 字典数据列表 - */ - public static List getDictCache(String key) - { - Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); - if (Validator.isNotNull(cacheObj)) - { - List dictDatas = (List)cacheObj; - return dictDatas; - } - return null; - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue) - { - return getDictLabel(dictType, dictValue, SEPARATOR); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel) - { - return getDictValue(dictType, dictLabel, SEPARATOR); - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue, String separator) - { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StrUtil.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) - { - for (SysDictData dict : datas) - { - for (String value : dictValue.split(separator)) - { - if (value.equals(dict.getDictValue())) - { - propertyString.append(dict.getDictLabel() + separator); - break; - } - } - } - } - else - { - for (SysDictData dict : datas) - { - if (dictValue.equals(dict.getDictValue())) - { - return dict.getDictLabel(); - } - } - } - return StrUtil.strip(propertyString.toString(), null, separator); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @param separator 分隔符 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel, String separator) - { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StrUtil.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) - { - for (SysDictData dict : datas) - { - for (String label : dictLabel.split(separator)) - { - if (label.equals(dict.getDictLabel())) - { - propertyString.append(dict.getDictValue() + separator); - break; - } - } - } - } - else - { - for (SysDictData dict : datas) - { - if (dictLabel.equals(dict.getDictLabel())) - { - return dict.getDictValue(); - } - } - } - return StrUtil.strip(propertyString.toString(), null, separator); - } - - /** - * 删除指定字典缓存 - * - * @param key 字典键 - */ - public static void removeDictCache(String key) - { - SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); - } - - /** - * 清空字典缓存 - */ - public static void clearDictCache() - { - Collection keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); - SpringUtils.getBean(RedisCache.class).deleteObject(keys); - } - - /** - * 设置cache key - * - * @param configKey 参数键 - * @return 缓存键key - */ - public static String getCacheKey(String configKey) - { - return Constants.SYS_DICT_KEY + configKey; - } -} +package com.ruoyi.common.utils; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.spring.SpringUtils; + +import java.util.Collection; +import java.util.List; + +/** + * 字典工具类 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(cacheObj)) + { + List dictDatas = (List)cacheObj; + return dictDatas; + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel() + separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + return StringUtils.strip(propertyString.toString(), null, separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue() + separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.strip(propertyString.toString(), null, separator); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return Constants.SYS_DICT_KEY + configKey; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java index ae6cc11be..246df9b54 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -2,7 +2,6 @@ package com.ruoyi.common.utils; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -33,7 +32,7 @@ public class JsonUtils { } public static String toJsonString(Object object) { - if (Validator.isEmpty(object)) { + if (StringUtils.isNull(object)) { return null; } try { @@ -44,7 +43,7 @@ public class JsonUtils { } public static T parseObject(String text, Class clazz) { - if (StrUtil.isEmpty(text)) { + if (StringUtils.isEmpty(text)) { return null; } try { @@ -66,7 +65,7 @@ public class JsonUtils { } public static T parseObject(String text, TypeReference typeReference) { - if (StrUtil.isBlank(text)) { + if (StringUtils.isBlank(text)) { return null; } try { @@ -77,7 +76,7 @@ public class JsonUtils { } public static Map parseMap(String text) { - if (StrUtil.isBlank(text)) { + if (StringUtils.isBlank(text)) { return null; } try { @@ -88,7 +87,7 @@ public class JsonUtils { } public static List parseArray(String text, Class clazz) { - if (StrUtil.isEmpty(text)) { + if (StringUtils.isEmpty(text)) { return new ArrayList<>(); } try { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index bb3d3e2de..e6dc3d5d7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -1,6 +1,5 @@ package com.ruoyi.common.utils; -import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -59,7 +58,7 @@ public class PageUtils { String orderByColumn = ServletUtils.getParameter(ORDER_BY_COLUMN); String isAsc = ServletUtils.getParameter(IS_ASC); PagePlus page = new PagePlus<>(pageNum, pageSize); - if (StrUtil.isNotBlank(orderByColumn)) { + if (StringUtils.isNotBlank(orderByColumn)) { String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); if ("asc".equals(isAsc)) { page.addOrder(OrderItem.asc(orderBy)); @@ -91,9 +90,9 @@ public class PageUtils { isAsc = "desc"; } Page page = new Page<>(pageNum, pageSize); - if (StrUtil.isNotBlank(orderByColumn)) { + if (StringUtils.isNotBlank(orderByColumn)) { String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); - orderBy = StrUtil.toUnderlineCase(orderBy); + orderBy = StringUtils.toUnderlineCase(orderBy); if ("asc".equals(isAsc)) { page.addOrder(OrderItem.asc(orderBy)); } else if ("desc".equals(isAsc)) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index 159429163..beaa26c6e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -1,7 +1,6 @@ package com.ruoyi.common.utils; import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpStatus; import org.springframework.http.MediaType; @@ -112,12 +111,12 @@ public class ServletUtils extends ServletUtil { } String uri = request.getRequestURI(); - if (StrUtil.equalsAnyIgnoreCase(uri, ".json", ".xml")) { + if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) { return true; } String ajax = request.getParameter("__ajax"); - if (StrUtil.equalsAnyIgnoreCase(ajax, "json", "xml")) { + if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) { return true; } return false; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 4ca2bfcfd..ed53d8683 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -1,534 +1,82 @@ package com.ruoyi.common.utils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; + import java.util.List; -import java.util.Map; -import java.util.Set; -import org.springframework.util.AntPathMatcher; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.text.StrFormatter; /** * 字符串工具类 - * - * @author ruoyi + * + * @author Lion Li */ -public class StringUtils extends org.apache.commons.lang3.StringUtils -{ - /** 空字符串 */ - private static final String NULLSTR = ""; +public class StringUtils extends StrUtil { - /** 下划线 */ - private static final char SEPARATOR = '_'; + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return Validator.isNull(object); + } - /** - * 获取参数不为空值 - * - * @param value defaultValue 要判断的value - * @return value 返回值 - */ - public static T nvl(T value, T defaultValue) - { - return value != null ? value : defaultValue; - } + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return Validator.isNotNull(object); + } - /** - * * 判断一个Collection是否为空, 包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Collection coll) - { - return isNull(coll) || coll.isEmpty(); - } + /** + * 替换所有 + */ + public static String replaceEach(String text, String[] searchList, String[] replacementList) { + return org.apache.commons.lang3.StringUtils.replaceEach(text, searchList, replacementList); + } - /** - * * 判断一个Collection是否非空,包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Collection coll) - { - return !isEmpty(coll); - } + /** + * 验证该字符串是否是数字 + * + * @param value 字符串内容 + * @return 是否是数字 + */ + public static boolean isNumeric(CharSequence value) { + return Validator.isNumber(value); + } - /** - * * 判断一个对象数组是否为空 - * - * @param objects 要判断的对象数组 - ** @return true:为空 false:非空 - */ - public static boolean isEmpty(Object[] objects) - { - return isNull(objects) || (objects.length == 0); - } + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return Validator.isUrl(link); + } - /** - * * 判断一个对象数组是否非空 - * - * @param objects 要判断的对象数组 - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Object[] objects) - { - return !isEmpty(objects); - } - - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Map map) - { - return isNull(map) || map.isEmpty(); - } - - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Map map) - { - return !isEmpty(map); - } - - /** - * * 判断一个字符串是否为空串 - * - * @param str String - * @return true:为空 false:非空 - */ - public static boolean isEmpty(String str) - { - return isNull(str) || NULLSTR.equals(str.trim()); - } - - /** - * * 判断一个字符串是否为非空串 - * - * @param str String - * @return true:非空串 false:空串 - */ - public static boolean isNotEmpty(String str) - { - return !isEmpty(str); - } - - /** - * * 判断一个对象是否为空 - * - * @param object Object - * @return true:为空 false:非空 - */ - public static boolean isNull(Object object) - { - return object == null; - } - - /** - * * 判断一个对象是否非空 - * - * @param object Object - * @return true:非空 false:空 - */ - public static boolean isNotNull(Object object) - { - return !isNull(object); - } - - /** - * * 判断一个对象是否是数组类型(Java基本型别的数组) - * - * @param object 对象 - * @return true:是数组 false:不是数组 - */ - public static boolean isArray(Object object) - { - return isNotNull(object) && object.getClass().isArray(); - } - - /** - * 去空格 - */ - public static String trim(String str) - { - return (str == null ? "" : str.trim()); - } - - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @return 结果 - */ - public static String substring(final String str, int start) - { - if (str == null) - { - return NULLSTR; - } - - if (start < 0) - { - start = str.length() + start; - } - - if (start < 0) - { - start = 0; - } - if (start > str.length()) - { - return NULLSTR; - } - - return str.substring(start); - } - - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @param end 结束 - * @return 结果 - */ - public static String substring(final String str, int start, int end) - { - if (str == null) - { - return NULLSTR; - } - - if (end < 0) - { - end = str.length() + end; - } - if (start < 0) - { - start = str.length() + start; - } - - if (end > str.length()) - { - end = str.length(); - } - - if (start > end) - { - return NULLSTR; - } - - if (start < 0) - { - start = 0; - } - if (end < 0) - { - end = 0; - } - - return str.substring(start, end); - } - - /** - * 格式化文本, {} 表示占位符
- * 此方法只是简单将占位符 {} 按照顺序替换为参数
- * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
- * 例:
- * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
- * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * - * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 - * @return 格式化后的文本 - */ - public static String format(String template, Object... params) - { - if (isEmpty(params) || isEmpty(template)) - { - return template; - } - return StrFormatter.format(template, params); - } - - /** - * 是否为http(s)://开头 - * - * @param link 链接 - * @return 结果 - */ - public static boolean ishttp(String link) - { - return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); - } - - /** - * 字符串转set - * - * @param str 字符串 - * @param sep 分隔符 - * @return set集合 - */ - public static final Set str2Set(String str, String sep) - { - return new HashSet(str2List(str, sep, true, false)); - } - - /** - * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 - * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 - * @return list集合 - */ - public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) - { - List list = new ArrayList(); - if (StringUtils.isEmpty(str)) - { - return list; - } - - // 过滤空白字符串 - if (filterBlank && StringUtils.isBlank(str)) - { - return list; - } - String[] split = str.split(sep); - for (String string : split) - { - if (filterBlank && StringUtils.isBlank(string)) - { - continue; - } - if (trim) - { - string = string.trim(); - } - list.add(string); - } - - return list; - } - - /** - * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 - * - * @param cs 指定字符串 - * @param searchCharSequences 需要检查的字符串数组 - * @return 是否包含任意一个字符串 - */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) - { - if (isEmpty(cs) || isEmpty(searchCharSequences)) - { - return false; - } - for (CharSequence testStr : searchCharSequences) - { - if (containsIgnoreCase(cs, testStr)) - { - return true; - } - } - return false; - } - - /** - * 驼峰转下划线命名 - */ - public static String toUnderScoreCase(String str) - { - if (str == null) - { - return null; - } - StringBuilder sb = new StringBuilder(); - // 前置字符是否大写 - boolean preCharIsUpperCase = true; - // 当前字符是否大写 - boolean curreCharIsUpperCase = true; - // 下一字符是否大写 - boolean nexteCharIsUpperCase = true; - for (int i = 0; i < str.length(); i++) - { - char c = str.charAt(i); - if (i > 0) - { - preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); - } - else - { - preCharIsUpperCase = false; - } - - curreCharIsUpperCase = Character.isUpperCase(c); - - if (i < (str.length() - 1)) - { - nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); - } - - if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) - { - sb.append(SEPARATOR); - } - else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) - { - sb.append(SEPARATOR); - } - sb.append(Character.toLowerCase(c)); - } - - return sb.toString(); - } - - /** - * 是否包含字符串 - * - * @param str 验证字符串 - * @param strs 字符串组 - * @return 包含返回true - */ - public static boolean inStringIgnoreCase(String str, String... strs) - { - if (str != null && strs != null) - { - for (String s : strs) - { - if (str.equalsIgnoreCase(trim(s))) - { - return true; - } - } - } - return false; - } - - /** - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * - * @param name 转换前的下划线大写方式命名的字符串 - * @return 转换后的驼峰式命名的字符串 - */ - public static String convertToCamelCase(String name) - { - StringBuilder result = new StringBuilder(); - // 快速检查 - if (name == null || name.isEmpty()) - { - // 没必要转换 - return ""; - } - else if (!name.contains("_")) - { - // 不含下划线,仅将首字母大写 - return name.substring(0, 1).toUpperCase() + name.substring(1); - } - // 用下划线将原始字符串分割 - String[] camels = name.split("_"); - for (String camel : camels) - { - // 跳过原始字符串中开头、结尾的下换线或双重下划线 - if (camel.isEmpty()) - { - continue; - } - // 首字母大写 - result.append(camel.substring(0, 1).toUpperCase()); - result.append(camel.substring(1).toLowerCase()); - } - return result.toString(); - } - - /** - * 驼峰式命名法 例如:user_name->userName - */ - public static String toCamelCase(String s) - { - if (s == null) - { - return null; - } - s = s.toLowerCase(); - StringBuilder sb = new StringBuilder(s.length()); - boolean upperCase = false; - for (int i = 0; i < s.length(); i++) - { - char c = s.charAt(i); - - if (c == SEPARATOR) - { - upperCase = true; - } - else if (upperCase) - { - sb.append(Character.toUpperCase(c)); - upperCase = false; - } - else - { - sb.append(c); - } - } - return sb.toString(); - } - - /** - * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 - * @param strs 需要检查的字符串数组 - * @return 是否匹配 - */ - public static boolean matches(String str, List strs) - { - if (isEmpty(str) || isEmpty(strs)) - { - return false; - } - for (String pattern : strs) - { - if (isMatch(pattern, str)) - { - return true; - } - } - return false; - } - - /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; - * ** 表示任意层路径; - * - * @param pattern 匹配规则 - * @param url 需要匹配的url - * @return - */ - public static boolean isMatch(String pattern, String url) - { - AntPathMatcher matcher = new AntPathMatcher(); - return matcher.match(pattern, url); - } - - @SuppressWarnings("unchecked") - public static T cast(Object obj) - { - return (T) obj; - } -} \ No newline at end of file + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || CollUtil.isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (ReUtil.isMatch(pattern, str)) { + return true; + } + } + return false; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java index 22d53c7fa..32457dc96 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -1,15 +1,14 @@ package com.ruoyi.common.utils.file; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.Validator; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; import com.ruoyi.common.exception.file.FileSizeLimitExceededException; import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; import org.apache.commons.io.FilenameUtils; import org.springframework.web.multipart.MultipartFile; @@ -148,7 +147,7 @@ public class FileUploadUtils private static final String getPathFileName(String uploadDir, String fileName) throws IOException { int dirLastIndex = RuoYiConfig.getProfile().length() + 1; - String currentDir = StrUtil.subSuf(uploadDir, dirLastIndex); + String currentDir = StringUtils.subSuf(uploadDir, dirLastIndex); String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; return pathFileName; } @@ -230,7 +229,7 @@ public class FileUploadUtils public static final String getExtension(MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - if (Validator.isEmpty(extension)) + if (StringUtils.isEmpty(extension)) { extension = MimeTypeUtils.getExtension(file.getContentType()); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index bc953de06..d30ac512a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -2,11 +2,11 @@ package com.ruoyi.common.utils.file; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -39,7 +39,7 @@ public class FileUtils extends FileUtil public static boolean checkAllowDownload(String resource) { // 禁止目录上跳级别 - if (StrUtil.contains(resource, "..")) + if (StringUtils.contains(resource, "..")) { return false; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java index 94dcf456f..632a21e18 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -1,102 +1,102 @@ -package com.ruoyi.common.utils.file; - -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import org.apache.poi.util.IOUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.Arrays; - -/** - * 图片处理工具类 - * - * @author ruoyi - */ -public class ImageUtils -{ - private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); - - public static byte[] getImage(String imagePath) - { - InputStream is = getFile(imagePath); - try - { - return IOUtils.toByteArray(is); - } - catch (Exception e) - { - log.error("图片加载异常 {}", e); - return null; - } - finally - { - IOUtils.closeQuietly(is); - } - } - - public static InputStream getFile(String imagePath) - { - try - { - byte[] result = readFile(imagePath); - result = Arrays.copyOf(result, result.length); - return new ByteArrayInputStream(result); - } - catch (Exception e) - { - log.error("获取图片异常 {}", e); - } - return null; - } - - /** - * 读取文件为字节数据 - * - * @param key 地址 - * @return 字节数据 - */ - public static byte[] readFile(String url) - { - InputStream in = null; - ByteArrayOutputStream baos = null; - try - { - if (url.startsWith("http")) - { - // 网络地址 - URL urlObj = new URL(url); - URLConnection urlConnection = urlObj.openConnection(); - urlConnection.setConnectTimeout(30 * 1000); - urlConnection.setReadTimeout(60 * 1000); - urlConnection.setDoInput(true); - in = urlConnection.getInputStream(); - } - else - { - // 本机地址 - String localPath = RuoYiConfig.getProfile(); - String downloadPath = localPath + StrUtil.subAfter(url, Constants.RESOURCE_PREFIX,false); - in = new FileInputStream(downloadPath); - } - return IOUtils.toByteArray(in); - } - catch (Exception e) - { - log.error("获取文件路径异常 {}", e); - return null; - } - finally - { - IOUtils.closeQuietly(in); - IOUtils.closeQuietly(baos); - } - } -} +package com.ruoyi.common.utils.file; + +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param key 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + ByteArrayOutputStream baos = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.subAfter(url, Constants.RESOURCE_PREFIX,false); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(baos); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index d6c262a25..03c608af8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -1,12 +1,12 @@ package com.ruoyi.common.utils.ip; import cn.hutool.core.net.NetUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; import cn.hutool.http.HttpUtil; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import java.util.Map; @@ -38,7 +38,7 @@ public class AddressUtils { .body("ip=" + ip + "&json=true", Constants.GBK) .execute() .body(); - if (StrUtil.isEmpty(rspStr)) { + if (StringUtils.isEmpty(rspStr)) { log.error("获取地理位置异常 {}", ip); return UNKNOWN; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 96843d18c..15b7d543f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -1,8 +1,6 @@ package com.ruoyi.common.utils.poi; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.annotation.Excel.Type; @@ -12,6 +10,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileTypeUtils; import com.ruoyi.common.utils.file.ImageUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; @@ -125,7 +124,7 @@ public class ExcelUtil */ public List importExcel(InputStream is) throws Exception { - return importExcel(StrUtil.EMPTY, is); + return importExcel(StringUtils.EMPTY, is); } /** @@ -141,7 +140,7 @@ public class ExcelUtil this.wb = WorkbookFactory.create(is); List list = new ArrayList(); Sheet sheet = null; - if (Validator.isNotEmpty(sheetName)) + if (StringUtils.isNotEmpty(sheetName)) { // 如果指定sheet名,则取指定sheet中的内容. sheet = wb.getSheet(sheetName); @@ -168,7 +167,7 @@ public class ExcelUtil for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); - if (Validator.isNotNull(cell)) + if (StringUtils.isNotNull(cell)) { String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); @@ -219,14 +218,14 @@ public class ExcelUtil if (String.class == fieldType) { String s = Convert.toStr(val); - if (StrUtil.endWith(s, ".0")) + if (StringUtils.endWith(s, ".0")) { - val = StrUtil.subBefore(s, ".0",false); + val = StringUtils.subBefore(s, ".0",false); } else { String dateFormat = field.getAnnotation(Excel.class).dateFormat(); - if (Validator.isNotEmpty(dateFormat)) + if (StringUtils.isNotEmpty(dateFormat)) { val = DateUtils.parseDateToStr(dateFormat, (Date) val); } @@ -236,7 +235,7 @@ public class ExcelUtil } } } - else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && Validator.isNumber(Convert.toStr(val))) + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toInt(val); } @@ -271,19 +270,19 @@ public class ExcelUtil { val = Convert.toBool(val, false); } - if (Validator.isNotNull(fieldType)) + if (StringUtils.isNotNull(fieldType)) { Excel attr = field.getAnnotation(Excel.class); String propertyName = field.getName(); - if (Validator.isNotEmpty(attr.targetAttr())) + if (StringUtils.isNotEmpty(attr.targetAttr())) { propertyName = field.getName() + "." + attr.targetAttr(); } - else if (Validator.isNotEmpty(attr.readConverterExp())) + else if (StringUtils.isNotEmpty(attr.readConverterExp())) { val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); } - else if (Validator.isNotEmpty(attr.dictType())) + else if (StringUtils.isNotEmpty(attr.dictType())) { val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); } @@ -509,13 +508,13 @@ public class ExcelUtil { if (ColumnType.STRING == attr.cellType()) { - cell.setCellValue(Validator.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); } else if (ColumnType.NUMERIC == attr.cellType()) { - if (Validator.isNotNull(value)) + if (StringUtils.isNotNull(value)) { - cell.setCellValue(StrUtil.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); } } else if (ColumnType.IMAGE == attr.cellType()) @@ -523,7 +522,7 @@ public class ExcelUtil ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); String imagePath = Convert.toStr(value); - if (Validator.isNotEmpty(imagePath)) + if (StringUtils.isNotEmpty(imagePath)) { byte[] data = ImageUtils.getImage(imagePath); getDrawingPatriarch(cell.getSheet()).createPicture(anchor, @@ -576,7 +575,7 @@ public class ExcelUtil sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } // 如果设置了提示信息则鼠标放上去提示. - if (Validator.isNotEmpty(attr.prompt())) + if (StringUtils.isNotEmpty(attr.prompt())) { // 这里默认设了2-101列提示. setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); @@ -613,15 +612,15 @@ public class ExcelUtil String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); String dictType = attr.dictType(); - if (Validator.isNotEmpty(dateFormat) && Validator.isNotNull(value)) + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); } - else if (Validator.isNotEmpty(readConverterExp) && Validator.isNotNull(value)) + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); } - else if (Validator.isNotEmpty(dictType) && Validator.isNotNull(value)) + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); } @@ -716,7 +715,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StrUtil.containsAny(propertyValue, separator)) + if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { @@ -735,7 +734,7 @@ public class ExcelUtil } } } - return StrUtil.strip(propertyString.toString(), null,separator); + return StringUtils.strip(propertyString.toString(), null,separator); } /** @@ -753,7 +752,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StrUtil.containsAny(propertyValue, separator)) + if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { @@ -772,7 +771,7 @@ public class ExcelUtil } } } - return StrUtil.strip(propertyString.toString(), null,separator); + return StringUtils.strip(propertyString.toString(), null,separator); } /** @@ -885,7 +884,7 @@ public class ExcelUtil private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { Object o = field.get(vo); - if (Validator.isNotEmpty(excel.targetAttr())) + if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); if (target.contains(".")) @@ -914,7 +913,7 @@ public class ExcelUtil */ private Object getValue(Object o, String name) throws Exception { - if (Validator.isNotNull(o) && Validator.isNotEmpty(name)) + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { Class clazz = o.getClass(); Field field = clazz.getDeclaredField(name); @@ -1027,7 +1026,7 @@ public class ExcelUtil try { Cell cell = row.getCell(column); - if (Validator.isNotNull(cell)) + if (StringUtils.isNotNull(cell)) { if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index c5d17d8b0..78a74b748 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -1,7 +1,7 @@ package com.ruoyi.common.utils.reflect; import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import java.lang.reflect.Method; import java.util.List; @@ -25,8 +25,8 @@ public class ReflectUtils extends ReflectUtil { @SuppressWarnings("unchecked") public static E invokeGetter(Object obj, String propertyName) { Object object = obj; - for (String name : StrUtil.split(propertyName, ".")) { - String getterMethodName = GETTER_PREFIX + StrUtil.upperFirst(name); + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.upperFirst(name); object = invoke(object, getterMethodName); } return (E) object; @@ -38,13 +38,13 @@ public class ReflectUtils extends ReflectUtil { */ public static void invokeSetter(Object obj, String propertyName, E value) { Object object = obj; - List names = StrUtil.split(propertyName, "."); + List names = StringUtils.split(propertyName, "."); for (int i = 0; i < names.size(); i++) { if (i < names.size() - 1) { - String getterMethodName = GETTER_PREFIX + StrUtil.upperFirst(names.get(i)); + String getterMethodName = GETTER_PREFIX + StringUtils.upperFirst(names.get(i)); object = invoke(object, getterMethodName); } else { - String setterMethodName = SETTER_PREFIX + StrUtil.upperFirst(names.get(i)); + String setterMethodName = SETTER_PREFIX + StringUtils.upperFirst(names.get(i)); Method method = getMethodByName(object.getClass(), setterMethodName); invoke(object, method, value); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index a37268a9c..e2f6e8b4e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -1,11 +1,11 @@ package com.ruoyi.common.utils.sql; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.utils.StringUtils; /** * sql操作工具类 - * + * * @author ruoyi */ public class SqlUtil @@ -20,7 +20,7 @@ public class SqlUtil */ public static String escapeOrderBySql(String value) { - if (Validator.isNotEmpty(value) && !isValidOrderBySql(value)) + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { throw new BaseException("参数不符合规范,不能进行查询"); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index 81893dff9..fe103ef88 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -62,11 +62,11 @@ public class TestDemoServiceImpl extends ServicePlusImpl params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StrUtil.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); - lqw.eq(StrUtil.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StrUtil.isNotBlank(dataScope.toString()), + lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index a953412d1..1985c1ece 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.annotation.DataScope; @@ -42,10 +42,10 @@ public class TestTreeServiceImpl extends ServicePlusImpl params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StrUtil.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StrUtil.isNotBlank(dataScope.toString()), + lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 830dbe594..90f94d3a5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -1,7 +1,7 @@ package com.ruoyi.framework.aspectj; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.entity.SysRole; @@ -101,8 +101,8 @@ public class DataScopeAspect { StringBuilder sqlString = new StringBuilder(); // 将 "." 提取出,不写别名为单表查询,写别名为多表查询 - deptAlias = StrUtil.isNotBlank(deptAlias) ? deptAlias + "." : ""; - userAlias = StrUtil.isNotBlank(userAlias) ? userAlias + "." : ""; + deptAlias = StringUtils.isNotBlank(deptAlias) ? deptAlias + "." : ""; + userAlias = StringUtils.isNotBlank(userAlias) ? userAlias + "." : ""; for (SysRole role : user.getRoles()) { String dataScope = role.getDataScope(); @@ -110,19 +110,19 @@ public class DataScopeAspect { sqlString = new StringBuilder(); break; } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { - sqlString.append(StrUtil.format( + sqlString.append(StringUtils.format( " OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); } else if (DATA_SCOPE_DEPT.equals(dataScope)) { - sqlString.append(StrUtil.format(" OR {}dept_id = {} ", + sqlString.append(StringUtils.format(" OR {}dept_id = {} ", deptAlias, user.getDeptId())); } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { - sqlString.append(StrUtil.format( + sqlString.append(StringUtils.format( " OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId())); } else if (DATA_SCOPE_SELF.equals(dataScope)) { if (isUser) { - sqlString.append(StrUtil.format(" OR {}user_id = {} ", + sqlString.append(StringUtils.format(" OR {}user_id = {} ", userAlias, user.getUserId())); } else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 @@ -131,7 +131,7 @@ public class DataScopeAspect { } } - if (StrUtil.isNotBlank(sqlString.toString())) { + if (StringUtils.isNotBlank(sqlString.toString())) { putDataScope(joinPoint, sqlString.substring(4)); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index d5c0fe8d5..83a3b8ff7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -1,7 +1,7 @@ package com.ruoyi.framework.aspectj; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessStatus; @@ -104,7 +104,7 @@ public class LogAspect if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); - operLog.setErrorMsg(StrUtil.sub(e.getMessage(), 0, 2000)); + operLog.setErrorMsg(StringUtils.sub(e.getMessage(), 0, 2000)); } // 设置方法名称 String className = joinPoint.getTarget().getClass().getName(); @@ -161,12 +161,12 @@ public class LogAspect if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { String params = argsArrayToString(joinPoint.getArgs()); - operLog.setOperParam(StrUtil.sub(params, 0, 2000)); + operLog.setOperParam(StringUtils.sub(params, 0, 2000)); } else { Map paramsMap = (Map) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); - operLog.setOperParam(StrUtil.sub(paramsMap.toString(), 0, 2000)); + operLog.setOperParam(StringUtils.sub(paramsMap.toString(), 0, 2000)); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java index b4f8bfc12..1103bc6d3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java @@ -4,7 +4,7 @@ import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.math.Calculator; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; /** * 无符号计算生成器 @@ -45,8 +45,8 @@ public class UnsignedMathGenerator implements CodeGenerator { int max = RandomUtil.randomInt(min, limit); String number1 = Integer.toString(max); String number2 = Integer.toString(min); - number1 = StrUtil.padAfter(number1, this.numberLength, CharUtil.SPACE); - number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE); + number1 = StringUtils.padAfter(number1, this.numberLength, CharUtil.SPACE); + number2 = StringUtils.padAfter(number2, this.numberLength, CharUtil.SPACE); return number1 + RandomUtil.randomChar(operators) + number2 + '='; } @@ -80,6 +80,6 @@ public class UnsignedMathGenerator implements CodeGenerator { * @return 最大值 */ private int getLimit() { - return Integer.parseInt("1" + StrUtil.repeat('0', this.numberLength)); + return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java index da7d061d9..57c927653 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -1,11 +1,11 @@ package com.ruoyi.framework.config; -import cn.hutool.core.util.StrUtil; import com.ruoyi.common.filter.RepeatableFilter; import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.XssProperties; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,11 +32,11 @@ public class FilterConfig { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new XssFilter()); - registration.addUrlPatterns(StrUtil.splitToArray(xssProperties.getUrlPatterns(), ",")); + registration.addUrlPatterns(StringUtils.splitToArray(xssProperties.getUrlPatterns(), ",")); registration.setName("xssFilter"); registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); Map initParameters = new HashMap(); - initParameters.put("excludes", excludes); + initParameters.put("excludes", xssProperties.getExcludes()); registration.setInitParameters(initParameters); return registration; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index bc286574b..307b9a6d4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.config; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.RedissonProperties; import org.redisson.Redisson; import org.redisson.api.RedissonClient; @@ -59,7 +59,7 @@ public class RedisConfig extends CachingConfigurerSupport { .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) .setDatabase(redisProperties.getDatabase()) - .setPassword(StrUtil.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) + .setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) .setTimeout(singleServerConfig.getTimeout()) .setRetryAttempts(singleServerConfig.getRetryAttempts()) .setRetryInterval(singleServerConfig.getRetryInterval()) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java deleted file mode 100644 index 23d02308a..000000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.ruoyi.framework.manager.factory; - -import java.util.TimerTask; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.LogUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.AddressUtils; -import com.ruoyi.common.utils.ip.IpUtils; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.system.domain.SysLogininfor; -import com.ruoyi.system.domain.SysOperLog; -import com.ruoyi.system.service.ISysLogininforService; -import com.ruoyi.system.service.ISysOperLogService; -import eu.bitwalker.useragentutils.UserAgent; - -/** - * 异步工厂(产生任务用) - * - * @author ruoyi - */ -public class AsyncFactory -{ - private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); - - /** - * 记录登录信息 - * - * @param username 用户名 - * @param status 状态 - * @param message 消息 - * @param args 列表 - * @return 任务task - */ - public static TimerTask recordLogininfor(final String username, final String status, final String message, - final Object... args) - { - final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); - final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); - return new TimerTask() - { - @Override - public void run() - { - String address = AddressUtils.getRealAddressByIP(ip); - StringBuilder s = new StringBuilder(); - s.append(LogUtils.getBlock(ip)); - s.append(address); - s.append(LogUtils.getBlock(username)); - s.append(LogUtils.getBlock(status)); - s.append(LogUtils.getBlock(message)); - // 打印信息到日志 - sys_user_logger.info(s.toString(), args); - // 获取客户端操作系统 - String os = userAgent.getOperatingSystem().getName(); - // 获取客户端浏览器 - String browser = userAgent.getBrowser().getName(); - // 封装对象 - SysLogininfor logininfor = new SysLogininfor(); - logininfor.setUserName(username); - logininfor.setIpaddr(ip); - logininfor.setLoginLocation(address); - logininfor.setBrowser(browser); - logininfor.setOs(os); - logininfor.setMsg(message); - // 日志状态 - if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) - { - logininfor.setStatus(Constants.SUCCESS); - } - else if (Constants.LOGIN_FAIL.equals(status)) - { - logininfor.setStatus(Constants.FAIL); - } - // 插入数据 - SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); - } - }; - } - - /** - * 操作日志记录 - * - * @param operLog 操作日志信息 - * @return 任务task - */ - public static TimerTask recordOper(final SysOperLog operLog) - { - return new TimerTask() - { - @Override - public void run() - { - // 远程查询操作地点 - operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); - SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); - } - }; - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java index 1cd8d6043..5757081dd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.security.handle; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.JsonUtils; @@ -29,7 +29,7 @@ public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, S throws IOException { int code = HttpStatus.HTTP_UNAUTHORIZED; - String msg = StrUtil.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(code, msg))); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java index e64fbc154..3199cdd3d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AsyncService.java @@ -1,5 +1,6 @@ package com.ruoyi.framework.web.service; +import com.ruoyi.common.utils.StringUtils; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import com.ruoyi.common.constant.Constants; @@ -67,7 +68,7 @@ public class AsyncService { logininfor.setOs(os); logininfor.setMsg(message); // 日志状态 - if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) { + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { logininfor.setStatus(Constants.SUCCESS); } else if (Constants.LOGIN_FAIL.equals(status)) { logininfor.setStatus(Constants.FAIL); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java index 064efa55b..0cda991f7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -1,7 +1,7 @@ package com.ruoyi.framework.web.service; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.ServletUtils; @@ -12,7 +12,7 @@ import java.util.Set; /** * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 - * + * * @author ruoyi */ @Service("ss") @@ -33,7 +33,7 @@ public class PermissionService /** * 验证用户是否具备某权限 - * + * * @param permission 权限字符串 * @return 用户是否具备某权限 */ @@ -92,7 +92,7 @@ public class PermissionService /** * 判断用户是否拥有某个角色 - * + * * @param role 角色字符串 * @return 用户是否具备某角色 */ @@ -110,7 +110,7 @@ public class PermissionService for (SysRole sysRole : loginUser.getUser().getRoles()) { String roleKey = sysRole.getRoleKey(); - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StrUtil.trim(role))) + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { return true; } @@ -158,13 +158,13 @@ public class PermissionService /** * 判断是否包含权限 - * + * * @param permissions 权限列表 * @param permission 权限字符串 * @return 用户是否具备某权限 */ private boolean hasPermissions(Set permissions, String permission) { - return permissions.contains(ALL_PERMISSION) || permissions.contains(StrUtil.trim(permission)); + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java index c7fbdc942..48d40af8a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java @@ -1,115 +1,117 @@ -package com.ruoyi.framework.web.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.RegisterBody; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.exception.user.CaptchaException; -import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; -import com.ruoyi.system.service.ISysConfigService; -import com.ruoyi.system.service.ISysUserService; - -/** - * 注册校验方法 - * - * @author ruoyi - */ -@Component -public class SysRegisterService -{ - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; - - @Autowired - private RedisCache redisCache; - - /** - * 注册 - */ - public String register(RegisterBody registerBody) - { - String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); - - boolean captchaOnOff = configService.selectCaptchaOnOff(); - // 验证码开关 - if (captchaOnOff) - { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); - } - - if (StringUtils.isEmpty(username)) - { - msg = "用户名不能为空"; - } - else if (StringUtils.isEmpty(password)) - { - msg = "用户密码不能为空"; - } - else if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) - { - msg = "账户长度必须在2到20个字符之间"; - } - else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { - msg = "密码长度必须在5到20个字符之间"; - } - else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) - { - msg = "保存用户'" + username + "'失败,注册账号已存在"; - } - else - { - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); - boolean regFlag = userService.registerUser(sysUser); - if (!regFlag) - { - msg = "注册失败,请联系系统管理人员"; - } - else - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, - MessageUtils.message("user.register.success"))); - } - } - return msg; - } - - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - * @return 结果 - */ - public void validateCaptcha(String username, String code, String uuid) - { - String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; - String captcha = redisCache.getCacheObject(verifyKey); - redisCache.deleteObject(verifyKey); - if (captcha == null) - { - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) - { - throw new CaptchaException(); - } - } -} +package com.ruoyi.framework.web.service; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + @Autowired + private AsyncService asyncService; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + + boolean captchaOnOff = configService.selectCaptchaOnOff(); + // 验证码开关 + if (captchaOnOff) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + asyncService.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"), ServletUtils.getRequest()); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index 172ac759c..a6ff95fd2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -57,7 +57,8 @@ public class TokenService { String userKey = getTokenKey(uuid); LoginUser user = redisCache.getCacheObject(userKey); return user; - catch (Exception e) { + } catch (Exception e) { + } } return null; diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 5d5c6a483..5d3217cd0 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -1,6 +1,6 @@ package com.ruoyi.generator.domain; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.constant.GenConstants; @@ -204,7 +204,7 @@ public class GenTable implements Serializable { } public static boolean isSub(String tplCategory) { - return tplCategory != null && StrUtil.equals(GenConstants.TPL_SUB, tplCategory); + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); } public boolean isTree() { @@ -212,7 +212,7 @@ public class GenTable implements Serializable { } public static boolean isTree(String tplCategory) { - return tplCategory != null && StrUtil.equals(GenConstants.TPL_TREE, tplCategory); + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); } public boolean isCrud() { @@ -220,7 +220,7 @@ public class GenTable implements Serializable { } public static boolean isCrud(String tplCategory) { - return tplCategory != null && StrUtil.equals(GenConstants.TPL_CRUD, tplCategory); + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); } public boolean isSuperColumn(String javaField) { @@ -229,9 +229,9 @@ public class GenTable implements Serializable { public static boolean isSuperColumn(String tplCategory, String javaField) { if (isTree(tplCategory)) { - return StrUtil.equalsAnyIgnoreCase(javaField, + return StringUtils.equalsAnyIgnoreCase(javaField, ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); } - return StrUtil.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); } -} \ No newline at end of file +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 9e03f5d26..d5f8ba880 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -1,6 +1,6 @@ package com.ruoyi.generator.domain; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; @@ -150,7 +150,7 @@ public class GenTableColumn implements Serializable { private Map params = new HashMap<>(); public String getCapJavaField() { - return StrUtil.upperFirst(javaField); + return StringUtils.upperFirst(javaField); } public boolean isPk() { @@ -158,7 +158,7 @@ public class GenTableColumn implements Serializable { } public boolean isPk(String isPk) { - return isPk != null && StrUtil.equals("1", isPk); + return isPk != null && StringUtils.equals("1", isPk); } public boolean isIncrement() { @@ -166,7 +166,7 @@ public class GenTableColumn implements Serializable { } public boolean isIncrement(String isIncrement) { - return isIncrement != null && StrUtil.equals("1", isIncrement); + return isIncrement != null && StringUtils.equals("1", isIncrement); } public boolean isRequired() { @@ -174,7 +174,7 @@ public class GenTableColumn implements Serializable { } public boolean isRequired(String isRequired) { - return isRequired != null && StrUtil.equals("1", isRequired); + return isRequired != null && StringUtils.equals("1", isRequired); } public boolean isInsert() { @@ -182,7 +182,7 @@ public class GenTableColumn implements Serializable { } public boolean isInsert(String isInsert) { - return isInsert != null && StrUtil.equals("1", isInsert); + return isInsert != null && StringUtils.equals("1", isInsert); } public boolean isEdit() { @@ -190,7 +190,7 @@ public class GenTableColumn implements Serializable { } public boolean isEdit(String isEdit) { - return isEdit != null && StrUtil.equals("1", isEdit); + return isEdit != null && StringUtils.equals("1", isEdit); } public boolean isList() { @@ -198,7 +198,7 @@ public class GenTableColumn implements Serializable { } public boolean isList(String isList) { - return isList != null && StrUtil.equals("1", isList); + return isList != null && StringUtils.equals("1", isList); } public boolean isQuery() { @@ -206,7 +206,7 @@ public class GenTableColumn implements Serializable { } public boolean isQuery(String isQuery) { - return isQuery != null && StrUtil.equals("1", isQuery); + return isQuery != null && StringUtils.equals("1", isQuery); } public boolean isSuperColumn() { @@ -214,7 +214,7 @@ public class GenTableColumn implements Serializable { } public static boolean isSuperColumn(String javaField) { - return StrUtil.equalsAnyIgnoreCase(javaField, + return StringUtils.equalsAnyIgnoreCase(javaField, // BaseEntity "createBy", "createTime", "updateBy", "updateTime", "remark", // TreeEntity @@ -227,15 +227,15 @@ public class GenTableColumn implements Serializable { public static boolean isUsableColumn(String javaField) { // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 - return StrUtil.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); } public String readConverterExp() { - String remarks = StrUtil.subBetween(this.columnComment, "(", ")"); + String remarks = StringUtils.subBetween(this.columnComment, "(", ")"); StringBuffer sb = new StringBuffer(); - if (StrUtil.isNotEmpty(remarks)) { + if (StringUtils.isNotEmpty(remarks)) { for (String value : remarks.split(" ")) { - if (StrUtil.isNotEmpty(value)) { + if (StringUtils.isNotEmpty(value)) { Object startStr = value.subSequence(0, 1); String endStr = value.substring(1); sb.append("").append(startStr).append("=").append(endStr).append(","); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 86bd128d5..9c39a9930 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.generator.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.constant.Constants; @@ -137,15 +137,15 @@ public class GenTableServiceImpl extends ServicePlusImpl() - .set(StrUtil.isBlank(cenTableColumn.getColumnComment()), GenTableColumn::getColumnComment, null) - .set(StrUtil.isBlank(cenTableColumn.getIsPk()), GenTableColumn::getIsPk, null) - .set(StrUtil.isBlank(cenTableColumn.getIsIncrement()), GenTableColumn::getIsIncrement, null) - .set(StrUtil.isBlank(cenTableColumn.getIsInsert()), GenTableColumn::getIsInsert, null) - .set(StrUtil.isBlank(cenTableColumn.getIsEdit()), GenTableColumn::getIsEdit, null) - .set(StrUtil.isBlank(cenTableColumn.getIsList()), GenTableColumn::getIsList, null) - .set(StrUtil.isBlank(cenTableColumn.getIsQuery()), GenTableColumn::getIsQuery, null) - .set(StrUtil.isBlank(cenTableColumn.getIsRequired()), GenTableColumn::getIsRequired, null) - .set(StrUtil.isBlank(cenTableColumn.getDictType()), GenTableColumn::getDictType, "") + .set(StringUtils.isBlank(cenTableColumn.getColumnComment()), GenTableColumn::getColumnComment, null) + .set(StringUtils.isBlank(cenTableColumn.getIsPk()), GenTableColumn::getIsPk, null) + .set(StringUtils.isBlank(cenTableColumn.getIsIncrement()), GenTableColumn::getIsIncrement, null) + .set(StringUtils.isBlank(cenTableColumn.getIsInsert()), GenTableColumn::getIsInsert, null) + .set(StringUtils.isBlank(cenTableColumn.getIsEdit()), GenTableColumn::getIsEdit, null) + .set(StringUtils.isBlank(cenTableColumn.getIsList()), GenTableColumn::getIsList, null) + .set(StringUtils.isBlank(cenTableColumn.getIsQuery()), GenTableColumn::getIsQuery, null) + .set(StringUtils.isBlank(cenTableColumn.getIsRequired()), GenTableColumn::getIsRequired, null) + .set(StringUtils.isBlank(cenTableColumn.getDictType()), GenTableColumn::getDictType, "") .eq(GenTableColumn::getColumnId,cenTableColumn.getColumnId())); } } @@ -260,7 +260,7 @@ public class GenTableServiceImpl extends ServicePlusImpl templates = VelocityUtils.getTemplateList(table.getTplCategory()); for (String template : templates) { - if (!StrUtil.containsAny("sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm", template)) { + if (!StringUtils.containsAny("sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm", template)) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); @@ -451,7 +451,7 @@ public class GenTableServiceImpl extends ServicePlusImpl 0) { column.setJavaType(GenConstants.TYPE_BIGDECIMAL); @@ -98,33 +98,33 @@ public class GenUtils } // 查询字段类型 - if (StrUtil.endWithIgnoreCase(columnName, "name")) + if (StringUtils.endWithIgnoreCase(columnName, "name")) { column.setQueryType(GenConstants.QUERY_LIKE); } // 状态字段设置单选框 - if (StrUtil.endWithIgnoreCase(columnName, "status")) + if (StringUtils.endWithIgnoreCase(columnName, "status")) { column.setHtmlType(GenConstants.HTML_RADIO); } // 类型&性别字段设置下拉框 - else if (StrUtil.endWithIgnoreCase(columnName, "type") - || StrUtil.endWithIgnoreCase(columnName, "sex")) + else if (StringUtils.endWithIgnoreCase(columnName, "type") + || StringUtils.endWithIgnoreCase(columnName, "sex")) { column.setHtmlType(GenConstants.HTML_SELECT); } // 图片字段设置图片上传控件 - else if (StrUtil.endWithIgnoreCase(columnName, "image")) + else if (StringUtils.endWithIgnoreCase(columnName, "image")) { column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); } // 文件字段设置文件上传控件 - else if (StrUtil.endWithIgnoreCase(columnName, "file")) + else if (StringUtils.endWithIgnoreCase(columnName, "file")) { column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); } // 内容字段设置富文本控件 - else if (StrUtil.endWithIgnoreCase(columnName, "content")) + else if (StringUtils.endWithIgnoreCase(columnName, "content")) { column.setHtmlType(GenConstants.HTML_EDITOR); } @@ -152,7 +152,7 @@ public class GenUtils { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); - String moduleName = StrUtil.sub(packageName, lastIndex + 1, nameLength); + String moduleName = StringUtils.sub(packageName, lastIndex + 1, nameLength); return moduleName; } @@ -166,7 +166,7 @@ public class GenUtils { int lastIndex = tableName.lastIndexOf("_"); int nameLength = tableName.length(); - String businessName = StrUtil.sub(tableName, lastIndex + 1, nameLength); + String businessName = StringUtils.sub(tableName, lastIndex + 1, nameLength); return businessName; } @@ -180,12 +180,12 @@ public class GenUtils { boolean autoRemovePre = GenConfig.getAutoRemovePre(); String tablePrefix = GenConfig.getTablePrefix(); - if (autoRemovePre && StrUtil.isNotEmpty(tablePrefix)) + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { - String[] searchList = StrUtil.splitToArray(tablePrefix, ","); + String[] searchList = StringUtils.splitToArray(tablePrefix, ","); tableName = replaceFirst(tableName, searchList); } - return StrUtil.upperFirst(StrUtil.toCamelCase(tableName)); + return StringUtils.upperFirst(StringUtils.toCamelCase(tableName)); } /** @@ -228,9 +228,9 @@ public class GenUtils */ public static String getDbType(String columnType) { - if (StrUtil.indexOf(columnType, '(') > 0) + if (StringUtils.indexOf(columnType, '(') > 0) { - return StrUtil.subBefore(columnType, "(",false); + return StringUtils.subBefore(columnType, "(",false); } else { @@ -246,9 +246,9 @@ public class GenUtils */ public static Integer getColumnLength(String columnType) { - if (StrUtil.indexOf(columnType, '(') > 0) + if (StringUtils.indexOf(columnType, '(') > 0) { - String length = StrUtil.subBetween(columnType, "(", ")"); + String length = StringUtils.subBetween(columnType, "(", ")"); return Integer.valueOf(length); } else diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index b2125e097..59438e616 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -2,7 +2,7 @@ package com.ruoyi.generator.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; @@ -47,11 +47,11 @@ public class VelocityUtils VelocityContext velocityContext = new VelocityContext(); velocityContext.put("tplCategory", genTable.getTplCategory()); velocityContext.put("tableName", genTable.getTableName()); - velocityContext.put("functionName", StrUtil.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); velocityContext.put("ClassName", genTable.getClassName()); - velocityContext.put("className", StrUtil.lowerFirst(genTable.getClassName())); + velocityContext.put("className", StringUtils.lowerFirst(genTable.getClassName())); velocityContext.put("moduleName", genTable.getModuleName()); - velocityContext.put("BusinessName", StrUtil.upperFirst(genTable.getBusinessName())); + velocityContext.put("BusinessName", StringUtils.upperFirst(genTable.getBusinessName())); velocityContext.put("businessName", genTable.getBusinessName()); velocityContext.put("basePackage", getPackagePrefix(packageName)); velocityContext.put("packageName", packageName); @@ -110,15 +110,15 @@ public class VelocityUtils String subTableName = genTable.getSubTableName(); String subTableFkName = genTable.getSubTableFkName(); String subClassName = genTable.getSubTable().getClassName(); - String subTableFkClassName = StrUtil.toCamelCase(subTableFkName); + String subTableFkClassName = StringUtils.toCamelCase(subTableFkName); context.put("subTable", subTable); context.put("subTableName", subTableName); context.put("subTableFkName", subTableFkName); context.put("subTableFkClassName", subTableFkClassName); - context.put("subTableFkclassName", StrUtil.lowerFirst(subTableFkClassName)); + context.put("subTableFkclassName", StringUtils.lowerFirst(subTableFkClassName)); context.put("subClassName", subClassName); - context.put("subclassName", StrUtil.lowerFirst(subClassName)); + context.put("subclassName", StringUtils.lowerFirst(subClassName)); context.put("subImportList", getImportList(genTable.getSubTable())); } @@ -172,45 +172,45 @@ public class VelocityUtils // 业务名称 String businessName = genTable.getBusinessName(); - String javaPath = PROJECT_PATH + "/" + StrUtil.replace(packageName, ".", "/"); + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); String mybatisPath = MYBATIS_PATH + "/" + moduleName; String vuePath = "vue"; if (template.contains("domain.java.vm")) { - fileName = StrUtil.format("{}/domain/{}.java", javaPath, className); + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); } if (template.contains("vo.java.vm")) { - fileName = StrUtil.format("{}/domain/vo/{}Vo.java", javaPath, className); + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); } if (template.contains("bo.java.vm")) { - fileName = StrUtil.format("{}/domain/bo/{}Bo.java", javaPath, className); + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); } - if (template.contains("sub-domain.java.vm") && StrUtil.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { - fileName = StrUtil.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); } else if (template.contains("mapper.java.vm")) { - fileName = StrUtil.format("{}/mapper/{}Mapper.java", javaPath, className); + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); } else if (template.contains("service.java.vm")) { - fileName = StrUtil.format("{}/service/I{}Service.java", javaPath, className); + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); } else if (template.contains("serviceImpl.java.vm")) { - fileName = StrUtil.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); } else if (template.contains("controller.java.vm")) { - fileName = StrUtil.format("{}/controller/{}Controller.java", javaPath, className); + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); } else if (template.contains("mapper.xml.vm")) { - fileName = StrUtil.format("{}/{}Mapper.xml", mybatisPath, className); + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); } else if (template.contains("sql.vm")) { @@ -218,15 +218,15 @@ public class VelocityUtils } else if (template.contains("api.js.vm")) { - fileName = StrUtil.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); } else if (template.contains("index.vue.vm")) { - fileName = StrUtil.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); } else if (template.contains("index-tree.vue.vm")) { - fileName = StrUtil.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); } return fileName; } @@ -240,7 +240,7 @@ public class VelocityUtils public static String getPackagePrefix(String packageName) { int lastIndex = packageName.lastIndexOf("."); - String basePackage = StrUtil.sub(packageName, 0, lastIndex); + String basePackage = StringUtils.sub(packageName, 0, lastIndex); return basePackage; } @@ -283,7 +283,7 @@ public class VelocityUtils */ public static String getPermissionPrefix(String moduleName, String businessName) { - return StrUtil.format("{}:{}", moduleName, businessName); + return StringUtils.format("{}:{}", moduleName, businessName); } /** @@ -295,7 +295,7 @@ public class VelocityUtils public static String getParentMenuId(Map paramsObj) { if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) - && StrUtil.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + && StringUtils.isNotEmpty(Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)))) { return Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); } @@ -312,9 +312,9 @@ public class VelocityUtils { if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { - return StrUtil.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); } - return StrUtil.EMPTY; + return StringUtils.EMPTY; } /** @@ -327,9 +327,9 @@ public class VelocityUtils { if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { - return StrUtil.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); } - return StrUtil.EMPTY; + return StringUtils.EMPTY; } /** @@ -342,9 +342,9 @@ public class VelocityUtils { if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { - return StrUtil.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); } - return StrUtil.EMPTY; + return StringUtils.EMPTY; } /** diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index ec3cac60d..32a9ac018 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -1,7 +1,7 @@ package ${packageName}.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; #if($table.crud || $table.sub) import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.core.page.PagePlus; @@ -61,7 +61,7 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, #set($mpMethod=$column.queryType.toLowerCase()) #if($queryType != 'BETWEEN') #if($javaType == 'String') -#set($condition='StrUtil.isNotBlank(bo.get'+$AttrName+'())') +#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') #else #set($condition='bo.get'+$AttrName+'() != null') #end diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java index c757ab402..9bd0013d9 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java @@ -3,7 +3,7 @@ package com.ruoyi.oss.service.abstractd; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.service.ICloudStorageService; import org.springframework.beans.factory.InitializingBean; @@ -30,7 +30,7 @@ public abstract class AbstractCloudStorageService implements ICloudStorageServic String uuid = IdUtil.fastSimpleUUID(); // 文件路径 String path = DateUtil.format(new Date(), "yyyyMMdd") + "/" + uuid; - if (StrUtil.isNotBlank(prefix)) { + if (StringUtils.isNotBlank(prefix)) { path = prefix + "/" + path; } return path + suffix; diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java index a4b43ec4c..2abde1cac 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.oss.service.impl; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.OSSClient; import com.aliyun.oss.common.auth.DefaultCredentialProvider; @@ -116,9 +116,9 @@ public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService i public String getEndpointLink() { String endpoint = properties.getEndpoint(); StringBuilder sb = new StringBuilder(endpoint); - if (StrUtil.containsAnyIgnoreCase(endpoint, "http://")) { + if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { sb.insert(7, properties.getBucketName() + "."); - } else if (StrUtil.containsAnyIgnoreCase(endpoint, "https://")) { + } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { sb.insert(8, properties.getBucketName() + "."); } else { throw new OssException("Endpoint配置错误"); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java index 70ed6848a..375307bcd 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.oss.service.impl; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.enumd.PolicyType; @@ -80,7 +80,7 @@ public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService im minioClient.putObject(PutObjectArgs.builder() .bucket(properties.getBucketName()) .object(path) - .contentType(StrUtil.blankToDefault(contentType, MediaType.APPLICATION_OCTET_STREAM_VALUE)) + .contentType(StringUtils.blankToDefault(contentType, MediaType.APPLICATION_OCTET_STREAM_VALUE)) .stream(inputStream, inputStream.available(), -1) .build()); } catch (Exception e) { diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java index 35f008a1a..523dff6f2 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.oss.service.impl; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; @@ -124,9 +124,9 @@ public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService i public String getEndpointLink() { String endpoint = properties.getEndpoint(); StringBuilder sb = new StringBuilder(endpoint); - if (StrUtil.containsAnyIgnoreCase(endpoint, "http://")) { + if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { sb.insert(7, properties.getBucketName() + "."); - } else if (StrUtil.containsAnyIgnoreCase(endpoint, "https://")) { + } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { sb.insert(8, properties.getBucketName() + "."); } else { throw new OssException("Endpoint配置错误"); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index 5c34a5c02..590ba70fe 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; @@ -41,21 +41,21 @@ public class SysOssServiceImpl extends ServicePlusImpl buildQueryWrapper(SysOssBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StrUtil.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); - lqw.like(StrUtil.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); - lqw.eq(StrUtil.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); - lqw.eq(StrUtil.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.eq(StrUtil.isNotBlank(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); - lqw.eq(StrUtil.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + lqw.eq(StringUtils.isNotBlank(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); return lqw; } @Override public SysOss upload(MultipartFile file) { String originalfileName = file.getOriginalFilename(); - String suffix = StrUtil.sub(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + String suffix = StringUtils.sub(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); ICloudStorageService storage = OssFactory.instance(); UploadResult uploadResult; try { diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java index aedc7c41f..b45acbcca 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java @@ -1,6 +1,6 @@ package com.ruoyi.quartz.controller; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; @@ -77,11 +77,11 @@ public class SysJobController extends BaseController { return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); } - else if (StrUtil.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); } - else if (StrUtil.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)//'调用"); } @@ -105,7 +105,7 @@ public class SysJobController extends BaseController { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); } - else if (StrUtil.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)//'调用"); } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java index b1c8941ab..26b8628a1 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java @@ -1,6 +1,6 @@ package com.ruoyi.quartz.domain; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; @@ -125,7 +125,7 @@ public class SysJob implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") public Date getNextValidTime() { - if (StrUtil.isNotEmpty(cronExpression)) { + if (StringUtils.isNotEmpty(cronExpression)) { return CronUtils.getNextExecution(cronExpression); } return null; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java index f9f58b675..578f6a992 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.quartz.service.impl; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; @@ -27,10 +27,10 @@ public class SysJobLogServiceImpl extends ServicePlusImpl selectPageJobLogList(SysJobLog jobLog) { Map params = jobLog.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(jobLog.getJobName()), SysJobLog::getJobName, jobLog.getJobName()) - .eq(StrUtil.isNotBlank(jobLog.getJobGroup()), SysJobLog::getJobGroup, jobLog.getJobGroup()) - .eq(StrUtil.isNotBlank(jobLog.getStatus()), SysJobLog::getStatus, jobLog.getStatus()) - .like(StrUtil.isNotBlank(jobLog.getInvokeTarget()), SysJobLog::getInvokeTarget, jobLog.getInvokeTarget()) + .like(StringUtils.isNotBlank(jobLog.getJobName()), SysJobLog::getJobName, jobLog.getJobName()) + .eq(StringUtils.isNotBlank(jobLog.getJobGroup()), SysJobLog::getJobGroup, jobLog.getJobGroup()) + .eq(StringUtils.isNotBlank(jobLog.getStatus()), SysJobLog::getStatus, jobLog.getStatus()) + .like(StringUtils.isNotBlank(jobLog.getInvokeTarget()), SysJobLog::getInvokeTarget, jobLog.getInvokeTarget()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -50,10 +50,10 @@ public class SysJobLogServiceImpl extends ServicePlusImpl selectJobLogList(SysJobLog jobLog) { Map params = jobLog.getParams(); return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(jobLog.getJobName()), SysJobLog::getJobName, jobLog.getJobName()) - .eq(StrUtil.isNotBlank(jobLog.getJobGroup()), SysJobLog::getJobGroup, jobLog.getJobGroup()) - .eq(StrUtil.isNotBlank(jobLog.getStatus()), SysJobLog::getStatus, jobLog.getStatus()) - .like(StrUtil.isNotBlank(jobLog.getInvokeTarget()), SysJobLog::getInvokeTarget, jobLog.getInvokeTarget()) + .like(StringUtils.isNotBlank(jobLog.getJobName()), SysJobLog::getJobName, jobLog.getJobName()) + .eq(StringUtils.isNotBlank(jobLog.getJobGroup()), SysJobLog::getJobGroup, jobLog.getJobGroup()) + .eq(StringUtils.isNotBlank(jobLog.getStatus()), SysJobLog::getStatus, jobLog.getStatus()) + .like(StringUtils.isNotBlank(jobLog.getInvokeTarget()), SysJobLog::getInvokeTarget, jobLog.getInvokeTarget()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java index b8ec2568a..835f97509 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -1,6 +1,6 @@ package com.ruoyi.quartz.service.impl; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; @@ -48,10 +48,10 @@ public class SysJobServiceImpl extends ServicePlusImpl selectPageJobList(SysJob job) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(job.getJobName()), SysJob::getJobName, job.getJobName()) - .eq(StrUtil.isNotBlank(job.getJobGroup()), SysJob::getJobGroup, job.getJobGroup()) - .eq(StrUtil.isNotBlank(job.getStatus()), SysJob::getStatus, job.getStatus()) - .like(StrUtil.isNotBlank(job.getInvokeTarget()), SysJob::getInvokeTarget, job.getInvokeTarget()); + .like(StringUtils.isNotBlank(job.getJobName()), SysJob::getJobName, job.getJobName()) + .eq(StringUtils.isNotBlank(job.getJobGroup()), SysJob::getJobGroup, job.getJobGroup()) + .eq(StringUtils.isNotBlank(job.getStatus()), SysJob::getStatus, job.getStatus()) + .like(StringUtils.isNotBlank(job.getInvokeTarget()), SysJob::getInvokeTarget, job.getInvokeTarget()); return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); } @@ -64,10 +64,10 @@ public class SysJobServiceImpl extends ServicePlusImpl selectJobList(SysJob job) { return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(job.getJobName()), SysJob::getJobName, job.getJobName()) - .eq(StrUtil.isNotBlank(job.getJobGroup()), SysJob::getJobGroup, job.getJobGroup()) - .eq(StrUtil.isNotBlank(job.getStatus()), SysJob::getStatus, job.getStatus()) - .like(StrUtil.isNotBlank(job.getInvokeTarget()), SysJob::getInvokeTarget, job.getInvokeTarget())); + .like(StringUtils.isNotBlank(job.getJobName()), SysJob::getJobName, job.getJobName()) + .eq(StringUtils.isNotBlank(job.getJobGroup()), SysJob::getJobGroup, job.getJobGroup()) + .eq(StringUtils.isNotBlank(job.getStatus()), SysJob::getStatus, job.getStatus()) + .like(StringUtils.isNotBlank(job.getInvokeTarget()), SysJob::getInvokeTarget, job.getInvokeTarget())); } /** diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java index 7f88a5831..e5bfcb798 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java @@ -1,29 +1,29 @@ -package com.ruoyi.quartz.task; - -import cn.hutool.core.lang.Console; -import cn.hutool.core.util.StrUtil; -import org.springframework.stereotype.Component; - -/** - * 定时任务调度测试 - * - * @author ruoyi - */ -@Component("ryTask") -public class RyTask -{ - public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) - { - Console.log(StrUtil.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); - } - - public void ryParams(String params) - { - Console.log("执行有参方法:" + params); - } - - public void ryNoParams() - { - Console.log("执行无参方法"); - } -} +package com.ruoyi.quartz.task; + +import cn.hutool.core.lang.Console; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.stereotype.Component; + +/** + * 定时任务调度测试 + * + * @author ruoyi + */ +@Component("ryTask") +public class RyTask +{ + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + Console.log(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) + { + Console.log("执行有参方法:" + params); + } + + public void ryNoParams() + { + Console.log("执行无参方法"); + } +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java index ed4584eca..c780b06f4 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java @@ -1,109 +1,109 @@ -package com.ruoyi.quartz.util; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.constant.ScheduleConstants; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.quartz.domain.SysJob; -import com.ruoyi.quartz.domain.SysJobLog; -import com.ruoyi.quartz.service.ISysJobLogService; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; - -/** - * 抽象quartz调用 - * - * @author ruoyi - */ -public abstract class AbstractQuartzJob implements Job -{ - private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); - - /** - * 线程本地变量 - */ - private static ThreadLocal threadLocal = new ThreadLocal<>(); - - @Override - public void execute(JobExecutionContext context) throws JobExecutionException - { - SysJob sysJob = new SysJob(); - BeanUtil.copyProperties(context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES),sysJob); - try - { - before(context, sysJob); - if (Validator.isNotNull(sysJob)) - { - doExecute(context, sysJob); - } - after(context, sysJob, null); - } - catch (Exception e) - { - log.error("任务执行异常 - :", e); - after(context, sysJob, e); - } - } - - /** - * 执行前 - * - * @param context 工作执行上下文对象 - * @param sysJob 系统计划任务 - */ - protected void before(JobExecutionContext context, SysJob sysJob) - { - threadLocal.set(new Date()); - } - - /** - * 执行后 - * - * @param context 工作执行上下文对象 - * @param sysJob 系统计划任务 - */ - protected void after(JobExecutionContext context, SysJob sysJob, Exception e) - { - Date startTime = threadLocal.get(); - threadLocal.remove(); - - final SysJobLog sysJobLog = new SysJobLog(); - sysJobLog.setJobName(sysJob.getJobName()); - sysJobLog.setJobGroup(sysJob.getJobGroup()); - sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); - sysJobLog.setStartTime(startTime); - sysJobLog.setStopTime(new Date()); - long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); - sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); - if (e != null) - { - sysJobLog.setStatus(Constants.FAIL); - String errorMsg = StrUtil.sub(ExceptionUtil.stacktraceToString(e), 0, 2000); - sysJobLog.setExceptionInfo(errorMsg); - } - else - { - sysJobLog.setStatus(Constants.SUCCESS); - } - - // 写入数据库当中 - SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); - } - - /** - * 执行方法,由子类重载 - * - * @param context 工作执行上下文对象 - * @param sysJob 系统计划任务 - * @throws Exception 执行过程中的异常 - */ - protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; -} +package com.ruoyi.quartz.util; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Validator; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.quartz.domain.SysJob; +import com.ruoyi.quartz.domain.SysJobLog; +import com.ruoyi.quartz.service.ISysJobLogService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + * 抽象quartz调用 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + SysJob sysJob = new SysJob(); + BeanUtil.copyProperties(context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES),sysJob); + try + { + before(context, sysJob); + if (Validator.isNotNull(sysJob)) + { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) + { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) + { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.sub(ExceptionUtil.stacktraceToString(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java index f017e1b6c..44eb8fdb4 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java @@ -1,184 +1,184 @@ -package com.ruoyi.quartz.util; - -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.quartz.domain.SysJob; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.LinkedList; -import java.util.List; - -/** - * 任务执行工具 - * - * @author ruoyi - */ -public class JobInvokeUtil -{ - /** - * 执行方法 - * - * @param sysJob 系统任务 - */ - public static void invokeMethod(SysJob sysJob) throws Exception - { - String invokeTarget = sysJob.getInvokeTarget(); - String beanName = getBeanName(invokeTarget); - String methodName = getMethodName(invokeTarget); - List methodParams = getMethodParams(invokeTarget); - - if (!isValidClassName(beanName)) - { - Object bean = SpringUtils.getBean(beanName); - invokeMethod(bean, methodName, methodParams); - } - else - { - Object bean = Class.forName(beanName).newInstance(); - invokeMethod(bean, methodName, methodParams); - } - } - - /** - * 调用任务方法 - * - * @param bean 目标对象 - * @param methodName 方法名称 - * @param methodParams 方法参数 - */ - private static void invokeMethod(Object bean, String methodName, List methodParams) - throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException - { - if (Validator.isNotNull(methodParams) && methodParams.size() > 0) - { - Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); - method.invoke(bean, getMethodParamsValue(methodParams)); - } - else - { - Method method = bean.getClass().getDeclaredMethod(methodName); - method.invoke(bean); - } - } - - /** - * 校验是否为为class包名 - * - * @param str 名称 - * @return true是 false否 - */ - public static boolean isValidClassName(String invokeTarget) - { - return StrUtil.count(invokeTarget, ".") > 1; - } - - /** - * 获取bean名称 - * - * @param invokeTarget 目标字符串 - * @return bean名称 - */ - public static String getBeanName(String invokeTarget) - { - String beanName = StrUtil.subBefore(invokeTarget, "(",false); - return StrUtil.subBefore(beanName, ".",true); - } - - /** - * 获取bean方法 - * - * @param invokeTarget 目标字符串 - * @return method方法 - */ - public static String getMethodName(String invokeTarget) - { - String methodName = StrUtil.subBefore(invokeTarget, "(",false); - return StrUtil.subAfter(methodName, ".",true); - } - - /** - * 获取method方法参数相关列表 - * - * @param invokeTarget 目标字符串 - * @return method方法相关参数列表 - */ - public static List getMethodParams(String invokeTarget) - { - String methodStr = StrUtil.subBetween(invokeTarget, "(", ")"); - if (StrUtil.isEmpty(methodStr)) - { - return null; - } - String[] methodParams = methodStr.split(","); - List classs = new LinkedList<>(); - for (int i = 0; i < methodParams.length; i++) - { - String str = StrUtil.trimToEmpty(methodParams[i]); - // String字符串类型,包含' - if (StrUtil.contains(str, "'")) - { - classs.add(new Object[] { StrUtil.replace(str, "'", ""), String.class }); - } - // boolean布尔类型,等于true或者false - else if (StrUtil.equals(str, "true") || StrUtil.equalsIgnoreCase(str, "false")) - { - classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); - } - // long长整形,包含L - else if (StrUtil.containsIgnoreCase(str, "L")) - { - classs.add(new Object[] { Long.valueOf(StrUtil.replaceIgnoreCase(str, "L", "")), Long.class }); - } - // double浮点类型,包含D - else if (StrUtil.containsIgnoreCase(str, "D")) - { - classs.add(new Object[] { Double.valueOf(StrUtil.replaceIgnoreCase(str, "D", "")), Double.class }); - } - // 其他类型归类为整形 - else - { - classs.add(new Object[] { Integer.valueOf(str), Integer.class }); - } - } - return classs; - } - - /** - * 获取参数类型 - * - * @param methodParams 参数相关列表 - * @return 参数类型列表 - */ - public static Class[] getMethodParamsType(List methodParams) - { - Class[] classs = new Class[methodParams.size()]; - int index = 0; - for (Object[] os : methodParams) - { - classs[index] = (Class) os[1]; - index++; - } - return classs; - } - - /** - * 获取参数值 - * - * @param methodParams 参数相关列表 - * @return 参数值列表 - */ - public static Object[] getMethodParamsValue(List methodParams) - { - Object[] classs = new Object[methodParams.size()]; - int index = 0; - for (Object[] os : methodParams) - { - classs[index] = (Object) os[0]; - index++; - } - return classs; - } -} +package com.ruoyi.quartz.util; + +import cn.hutool.core.lang.Validator; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.quartz.domain.SysJob; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; + +/** + * 任务执行工具 + * + * @author ruoyi + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (Validator.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getDeclaredMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param str 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.count(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.subBefore(invokeTarget, "(",false); + return StringUtils.subBefore(beanName, ".",true); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.subBefore(invokeTarget, "(",false); + return StringUtils.subAfter(methodName, ".",true); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.subBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(","); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,包含' + if (StringUtils.contains(str, "'")) + { + classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class }); + } + // boolean布尔类型,等于true或者false + else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false")) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,包含L + else if (StringUtils.containsIgnoreCase(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class }); + } + // double浮点类型,包含D + else if (StringUtils.containsIgnoreCase(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java index dbe7a6e11..495db54e1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java @@ -1,6 +1,6 @@ package com.ruoyi.system.domain.vo; -import cn.hutool.core.lang.Validator; +import com.ruoyi.common.utils.StringUtils; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -56,7 +56,7 @@ public class MetaVo { this.title = title; this.icon = icon; this.noCache = noCache; - if (Validator.isUrl(link)) { + if (StringUtils.ishttp(link)) { this.link = link; } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 84b10db1d..250ccf1a7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.constant.Constants; @@ -48,9 +48,9 @@ public class SysConfigServiceImpl extends ServicePlusImpl selectPageConfigList(SysConfig config) { Map params = config.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) - .eq(StrUtil.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) - .like(StrUtil.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) + .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) + .eq(StringUtils.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) + .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -90,7 +90,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl selectConfigList(SysConfig config) { Map params = config.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) - .eq(StrUtil.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) - .like(StrUtil.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) + .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) + .eq(StringUtils.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) + .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -169,7 +169,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl selectPageDictDataList(SysDictData dictData) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(StrUtil.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StrUtil.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StrUtil.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) + .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) + .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) + .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) .orderByAsc(SysDictData::getDictSort); return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); } @@ -40,9 +40,9 @@ public class SysDictDataServiceImpl extends ServicePlusImpl selectDictDataList(SysDictData dictData) { return list(new LambdaQueryWrapper() - .eq(StrUtil.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StrUtil.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StrUtil.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) + .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) + .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) + .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) .orderByAsc(SysDictData::getDictSort)); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index 7e2644fa5..cfd8e1fc0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.constant.UserConstants; @@ -48,9 +48,9 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectPageDictTypeList(SysDictType dictType) { Map params = dictType.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) - .eq(StrUtil.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) - .like(StrUtil.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) + .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) + .eq(StringUtils.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) + .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -70,9 +70,9 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectDictTypeList(SysDictType dictType) { Map params = dictType.getParams(); return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) - .eq(StrUtil.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) - .like(StrUtil.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) + .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) + .eq(StringUtils.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) + .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index 45ed43961..035ee5e23 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -1,11 +1,11 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.mapper.SysLogininforMapper; import com.ruoyi.system.service.ISysLogininforService; @@ -28,9 +28,9 @@ public class SysLogininforServiceImpl extends ServicePlusImpl selectPageLogininforList(SysLogininfor logininfor) { Map params = logininfor.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) - .eq(StrUtil.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) - .like(StrUtil.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(login_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -61,9 +61,9 @@ public class SysLogininforServiceImpl extends ServicePlusImpl selectLogininforList(SysLogininfor logininfor) { Map params = logininfor.getParams(); return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(logininfor.getIpaddr()),SysLogininfor::getIpaddr,logininfor.getIpaddr()) - .eq(StrUtil.isNotBlank(logininfor.getStatus()),SysLogininfor::getStatus,logininfor.getStatus()) - .like(StrUtil.isNotBlank(logininfor.getUserName()),SysLogininfor::getUserName,logininfor.getUserName()) + .like(StringUtils.isNotBlank(logininfor.getIpaddr()),SysLogininfor::getIpaddr,logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()),SysLogininfor::getStatus,logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()),SysLogininfor::getUserName,logininfor.getUserName()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(login_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 13d283b5f..3d3139696 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; @@ -18,7 +18,6 @@ import com.ruoyi.system.mapper.SysMenuMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysRoleMenuMapper; import com.ruoyi.system.service.ISysMenuService; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -63,9 +62,9 @@ public class SysMenuServiceImpl extends ServicePlusImpl() - .like(StrUtil.isNotBlank(menu.getMenuName()),SysMenu::getMenuName,menu.getMenuName()) - .eq(StrUtil.isNotBlank(menu.getVisible()),SysMenu::getVisible,menu.getVisible()) - .eq(StrUtil.isNotBlank(menu.getStatus()),SysMenu::getStatus,menu.getStatus()) + .like(StringUtils.isNotBlank(menu.getMenuName()),SysMenu::getMenuName,menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()),SysMenu::getVisible,menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()),SysMenu::getStatus,menu.getStatus()) .orderByAsc(SysMenu::getParentId) .orderByAsc(SysMenu::getOrderNum)); } else { @@ -137,7 +136,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl cMenus = menu.getChildren(); if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { router.setAlwaysShow(true); @@ -149,8 +148,8 @@ public class SysMenuServiceImpl extends ServicePlusImpl selectPageNoticeList(SysNotice notice) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) - .eq(StrUtil.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) - .like(StrUtil.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); + .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) + .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) + .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); return PageUtils.buildDataInfo(page(PageUtils.buildPage(),lqw)); } @@ -50,9 +50,9 @@ public class SysNoticeServiceImpl extends ServicePlusImpl selectNoticeList(SysNotice notice) { return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(notice.getNoticeTitle()),SysNotice::getNoticeTitle,notice.getNoticeTitle()) - .eq(StrUtil.isNotBlank(notice.getNoticeType()),SysNotice::getNoticeType,notice.getNoticeType()) - .like(StrUtil.isNotBlank(notice.getCreateBy()),SysNotice::getCreateBy,notice.getCreateBy())); + .like(StringUtils.isNotBlank(notice.getNoticeTitle()),SysNotice::getNoticeTitle,notice.getNoticeTitle()) + .eq(StringUtils.isNotBlank(notice.getNoticeType()),SysNotice::getNoticeType,notice.getNoticeType()) + .like(StringUtils.isNotBlank(notice.getCreateBy()),SysNotice::getCreateBy,notice.getCreateBy())); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java index 4fd531306..694f607be 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; @@ -29,7 +29,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl selectPageOperLogList(SysOperLog operLog) { Map params = operLog.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) .func(f -> { @@ -39,7 +39,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl 0, SysOperLog::getStatus, operLog.getStatus()) - .like(StrUtil.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(oper_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) @@ -70,7 +70,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl selectOperLogList(SysOperLog operLog) { Map params = operLog.getParams(); return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(operLog.getTitle()),SysOperLog::getTitle,operLog.getTitle()) + .like(StringUtils.isNotBlank(operLog.getTitle()),SysOperLog::getTitle,operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType,operLog.getBusinessType()) .func(f -> { @@ -80,7 +80,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl 0, SysOperLog::getStatus,operLog.getStatus()) - .like(StrUtil.isNotBlank(operLog.getOperName()),SysOperLog::getOperName,operLog.getOperName()) + .like(StringUtils.isNotBlank(operLog.getOperName()),SysOperLog::getOperName,operLog.getOperName()) .apply(Validator.isNotEmpty(params.get("beginTime")), "date_format(oper_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 666043176..495c2e9db 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -1,13 +1,13 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.mapper.SysPostMapper; @@ -33,9 +33,9 @@ public class SysPostServiceImpl extends ServicePlusImpl selectPagePostList(SysPost post) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StrUtil.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StrUtil.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); + .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) + .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) + .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); return PageUtils.buildDataInfo(page(PageUtils.buildPage(),lqw)); } @@ -48,9 +48,9 @@ public class SysPostServiceImpl extends ServicePlusImpl selectPostList(SysPost post) { return list(new LambdaQueryWrapper() - .like(StrUtil.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StrUtil.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StrUtil.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName())); + .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) + .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) + .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName())); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java index 1dec94938..fd1384dee 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.service.ISysUserOnlineService; @@ -23,7 +23,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService { */ @Override public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { - if (StrUtil.equals(ipaddr, user.getIpaddr())) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { return loginUserToUserOnline(user); } return null; @@ -38,7 +38,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService { */ @Override public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { - if (StrUtil.equals(userName, user.getUsername())) { + if (StringUtils.equals(userName, user.getUsername())) { return loginUserToUserOnline(user); } return null; @@ -54,7 +54,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService { */ @Override public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { - if (StrUtil.equals(ipaddr, user.getIpaddr()) && StrUtil.equals(userName, user.getUsername())) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { return loginUserToUserOnline(user); } return null; diff --git a/ruoyi-ui/src/utils/ossdownload.js b/ruoyi-ui/src/utils/ossdownload.js index 0b9cf10a3..6da52bb74 100644 --- a/ruoyi-ui/src/utils/ossdownload.js +++ b/ruoyi-ui/src/utils/ossdownload.js @@ -31,9 +31,11 @@ export function resolveBlob(res, mimeType) { var result = patt.exec(contentDisposition) var fileName = result[1] fileName = fileName.replace(/\"/g, '') + aLink.style.display = 'none' aLink.href = URL.createObjectURL(blob) aLink.setAttribute('download', decodeURI(fileName)) // 设置下载文件名称 document.body.appendChild(aLink) aLink.click() + URL.revokeObjectURL(aLink.href);//清除引用 document.body.removeChild(aLink); } From c958217d196106c47bfcb61c235eecf39fc26ec9 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, 2 Aug 2021 13:08:19 +0800 Subject: [PATCH 026/106] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B3=A8=E5=85=A5=E5=99=A8=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=9C=AA=E7=99=BB=E5=BD=95=E5=BC=82=E5=B8=B8=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E8=AD=A6=E5=91=8A=20=E8=BF=94=E5=9B=9ENull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisplus/CreateAndUpdateMetaObjectHandler.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java index 561ed4137..83c0d2250 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import java.util.Date; @@ -16,6 +17,7 @@ import java.util.Date; * @author Lion Li * @date 2021/4/25 */ +@Slf4j public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { @Override @@ -59,9 +61,12 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { * 获取登录用户名 */ private String getLoginUsername() { - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (Validator.isEmpty(loginUser)) { - throw new CustomException("用户未登录 => 无法获取用户信息"); + LoginUser loginUser; + try { + loginUser = SecurityUtils.getLoginUser(); + } catch (Exception e) { + log.warn("自动注入警告 => 用户未登录"); + return null; } return loginUser.getUsername(); } From 28073ef2fede129b8a524dbd829d4b023682a25a 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, 2 Aug 2021 13:08:36 +0800 Subject: [PATCH 027/106] =?UTF-8?q?update=20=E9=80=82=E9=85=8D=E6=96=B0?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=20=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 1 + ruoyi-ui/src/views/register.vue | 416 +++++++++--------- 2 files changed, 209 insertions(+), 208 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index f0304adf1..361074a80 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -240,6 +240,7 @@ public class SysUserServiceImpl extends ServicePlusImpl 0; } diff --git a/ruoyi-ui/src/views/register.vue b/ruoyi-ui/src/views/register.vue index 7ee0a7973..914fb7493 100644 --- a/ruoyi-ui/src/views/register.vue +++ b/ruoyi-ui/src/views/register.vue @@ -1,208 +1,208 @@ - - - - - + + + + + From 5740561cd382d20ecfe418cad63266d05f81bf08 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, 2 Aug 2021 15:08:04 +0800 Subject: [PATCH 028/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E9=93=BE=E6=8E=A5=20=E6=9B=B4=E6=98=8E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f479c3395..9d35703dd 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,13 @@ RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期 使用框架前请仔细阅读文档重点注意事项
>[初始化项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117) +>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117) > >[部署项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382) +>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382) > >[参考文档 Wiki](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) +>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) ## 软件架构图 From c813046594b82230cd2cb61622d68a4981096e08 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, 2 Aug 2021 19:28:41 +0800 Subject: [PATCH 029/106] =?UTF-8?q?update=20=E6=97=A5=E5=B8=B8=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=20=E7=BB=9F=E4=B8=80=E9=87=8D=E6=9E=84=E5=88=B0=20Str?= =?UTF-8?q?ingUtils=20=E4=BE=BF=E4=BA=8E=E7=BB=B4=E6=8A=A4=E6=89=A9?= =?UTF-8?q?=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/CaptchaController.java | 4 +- .../controller/common/CommonController.java | 4 +- .../controller/monitor/CacheController.java | 4 +- .../monitor/SysUserOnlineController.java | 9 +- .../controller/system/SysDeptController.java | 6 +- .../system/SysDictDataController.java | 4 +- .../controller/system/SysRoleController.java | 4 +- .../controller/system/SysUserController.java | 12 +- .../ruoyi/common/filter/RepeatableFilter.java | 2 +- .../filter/XssHttpServletRequestWrapper.java | 2 +- .../com/ruoyi/common/utils/JsonUtils.java | 1 - .../com/ruoyi/common/utils/PageUtils.java | 2 +- .../com/ruoyi/common/utils/StringUtils.java | 310 ++++++++++++++++-- .../common/utils/file/FileUploadUtils.java | 2 +- .../ruoyi/common/utils/file/ImageUtils.java | 2 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 12 +- .../common/utils/reflect/ReflectUtils.java | 13 +- .../framework/aspectj/DataScopeAspect.java | 11 +- .../framework/aspectj/DataSourceAspect.java | 4 +- .../ruoyi/framework/aspectj/LogAspect.java | 11 +- .../captcha/UnsignedMathGenerator.java | 4 +- .../ruoyi/framework/config/FilterConfig.java | 2 +- .../impl/SameUrlDataInterceptor.java | 6 +- .../CreateAndUpdateMetaObjectHandler.java | 10 +- .../filter/JwtAuthenticationTokenFilter.java | 6 +- .../handle/LogoutSuccessHandlerImpl.java | 4 +- .../web/exception/GlobalExceptionHandler.java | 6 +- .../web/service/PermissionService.java | 18 +- .../framework/web/service/TokenService.java | 10 +- .../web/service/UserDetailsServiceImpl.java | 4 +- .../generator/domain/GenTableColumn.java | 4 +- .../service/GenTableServiceImpl.java | 23 +- .../com/ruoyi/generator/util/GenUtils.java | 28 +- .../ruoyi/generator/util/VelocityUtils.java | 25 +- .../service/impl/SysOssServiceImpl.java | 2 +- .../service/impl/SysJobLogServiceImpl.java | 9 +- .../ruoyi/quartz/util/AbstractQuartzJob.java | 7 +- .../com/ruoyi/quartz/util/JobInvokeUtil.java | 15 +- .../service/impl/SysConfigServiceImpl.java | 17 +- .../service/impl/SysDeptServiceImpl.java | 11 +- .../service/impl/SysDictTypeServiceImpl.java | 13 +- .../impl/SysLogininforServiceImpl.java | 9 +- .../service/impl/SysMenuServiceImpl.java | 15 +- .../service/impl/SysOperLogServiceImpl.java | 9 +- .../service/impl/SysPostServiceImpl.java | 9 +- .../service/impl/SysRoleServiceImpl.java | 14 +- .../impl/SysUserOnlineServiceImpl.java | 7 +- .../service/impl/SysUserServiceImpl.java | 26 +- 48 files changed, 493 insertions(+), 239 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index fb2fb2003..210cceecc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -107,9 +107,9 @@ public class CaptchaController { private String getCodeResult(String capStr) { int numberLength = captchaProperties.getNumberLength(); - int a = Convert.toInt(StringUtils.sub(capStr, 0, numberLength).trim()); + int a = Convert.toInt(StringUtils.substring(capStr, 0, numberLength).trim()); char operator = capStr.charAt(numberLength); - int b = Convert.toInt(StringUtils.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim()); + int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim()); switch (operator) { case '*': return a * b + ""; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index a54333eaf..3e57de87c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -72,9 +72,9 @@ public class CommonController // 本地资源路径 String localPath = RuoYiConfig.getProfile(); // 数据库资源地址 - String downloadPath = localPath + StringUtils.subAfter(resource, Constants.RESOURCE_PREFIX,false); + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); // 下载名称 - String downloadName = StringUtils.subAfter(downloadPath, "/",true); + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); File file = new File(downloadPath); FileUtils.setAttachmentResponseHeader(response, downloadName); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index 48e95dd3f..66749ef4f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -40,8 +40,8 @@ public class CacheController commandStats.stringPropertyNames().forEach(key -> { Map data = new HashMap<>(2); String property = commandStats.getProperty(key); - data.put("name", StringUtils.removePrefix(key, "cmdstat_")); - data.put("value", StringUtils.subBetween(property, "calls=", ",usec")); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); pieList.add(data); }); result.put("commandStats", pieList); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index edcf766b4..f1442cc71 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,7 +1,5 @@ package com.ruoyi.web.controller.monitor; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; @@ -11,6 +9,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.service.ISysUserOnlineService; import org.springframework.beans.factory.annotation.Autowired; @@ -46,21 +45,21 @@ public class SysUserOnlineController extends BaseController for (String key : keys) { LoginUser user = redisCache.getCacheObject(key); - if (Validator.isNotEmpty(ipaddr) && Validator.isNotEmpty(userName)) + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); } } - else if (Validator.isNotEmpty(ipaddr)) + else if (StringUtils.isNotEmpty(ipaddr)) { if (StringUtils.equals(ipaddr, user.getIpaddr())) { userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); } } - else if (Validator.isNotEmpty(userName) && Validator.isNotNull(user.getUser())) + else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { if (StringUtils.equals(userName, user.getUsername())) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 420ac04ba..f80a532dc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.utils.StringUtils; +import cn.hutool.core.util.ArrayUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -8,8 +8,8 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysDeptService; -import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -56,7 +56,7 @@ public class SysDeptController extends BaseController { SysDept d = (SysDept) it.next(); if (d.getDeptId().intValue() == deptId - || ArrayUtils.contains(StringUtils.splitToArray(d.getAncestors(), ","), deptId + "")) + || ArrayUtil.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) { it.remove(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index a272a6e97..cfafdb3de 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -1,6 +1,5 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -8,6 +7,7 @@ import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictTypeService; @@ -68,7 +68,7 @@ public class SysDictDataController extends BaseController public AjaxResult dictType(@PathVariable String dictType) { List data = dictTypeService.selectDictDataByType(dictType); - if (Validator.isNull(data)) + if (StringUtils.isNull(data)) { data = new ArrayList(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 5701aa1a4..cc6c37deb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,6 +1,5 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -12,6 +11,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.TokenService; @@ -117,7 +117,7 @@ public class SysRoleController extends BaseController { // 更新缓存用户权限 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - if (Validator.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) { loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index a67615f39..ee104cac9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,6 +1,5 @@ package com.ruoyi.web.controller.system; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -12,6 +11,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysPostService; @@ -100,7 +100,7 @@ public class SysUserController extends BaseController List roles = roleService.selectRoleAll(); ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); ajax.put("posts", postService.selectPostAll()); - if (Validator.isNotNull(userId)) + if (StringUtils.isNotNull(userId)) { ajax.put("user", userService.selectUserById(userId)); ajax.put("postIds", postService.selectPostListByUserId(userId)); @@ -121,12 +121,12 @@ public class SysUserController extends BaseController { return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); } - else if (Validator.isNotEmpty(user.getPhonenumber()) + else if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } - else if (Validator.isNotEmpty(user.getEmail()) + else if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); @@ -145,12 +145,12 @@ public class SysUserController extends BaseController public AjaxResult edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); - if (Validator.isNotEmpty(user.getPhonenumber()) + if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } - else if (Validator.isNotEmpty(user.getEmail()) + else if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java index a0db86b7c..ffe614ceb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -26,7 +26,7 @@ public class RepeatableFilter implements Filter { ServletRequest requestWrapper = null; if (request instanceof HttpServletRequest - && StringUtils.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java index 973697b2a..700a88dcc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -102,6 +102,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper public boolean isJsonRequest() { String header = super.getHeader(HttpHeaders.CONTENT_TYPE); - return StringUtils.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java index 246df9b54..676de013a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -1,6 +1,5 @@ package com.ruoyi.common.utils; -import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index e6dc3d5d7..27125ab8f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -92,7 +92,7 @@ public class PageUtils { Page page = new Page<>(pageNum, pageSize); if (StringUtils.isNotBlank(orderByColumn)) { String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); - orderBy = StringUtils.toUnderlineCase(orderBy); + orderBy = StringUtils.toUnderScoreCase(orderBy); if ("asc".equals(isAsc)) { page.addOrder(OrderItem.asc(orderBy)); } else if ("desc".equals(isAsc)) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index ed53d8683..c6371cc32 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -2,17 +2,140 @@ package com.ruoyi.common.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Validator; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; -import java.util.List; +import java.util.*; /** * 字符串工具类 * - * @author Lion Li + * @author ruoyi */ -public class StringUtils extends StrUtil { +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return ObjectUtil.defaultIfNull(value, defaultValue); + } + + /** + * 获取参数不为空值 + * + * @param str defaultValue 要判断的value + * @return value 返回值 + */ + public static String blankToDefault(String str, String defaultValue) { + return StrUtil.blankToDefault(str, defaultValue); + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return CollUtil.isEmpty(coll); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return ArrayUtil.isEmpty(objects); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个对象是否为空 + * + * @param object 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object object) { + return ObjectUtil.isEmpty(object); + } + + /** + * * 判断一个对象是否非空 + * + * @param object 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object object) { + return !isEmpty(object); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return MapUtil.isEmpty(map); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return StrUtil.isEmpty(str); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } /** * * 判断一个对象是否为空 @@ -21,7 +144,7 @@ public class StringUtils extends StrUtil { * @return true:为空 false:非空 */ public static boolean isNull(Object object) { - return Validator.isNull(object); + return ObjectUtil.isNull(object); } /** @@ -31,24 +154,64 @@ public class StringUtils extends StrUtil { * @return true:非空 false:空 */ public static boolean isNotNull(Object object) { - return Validator.isNotNull(object); + return !isNull(object); } /** - * 替换所有 - */ - public static String replaceEach(String text, String[] searchList, String[] replacementList) { - return org.apache.commons.lang3.StringUtils.replaceEach(text, searchList, replacementList); - } - - /** - * 验证该字符串是否是数字 + * * 判断一个对象是否是数组类型(Java基本型别的数组) * - * @param value 字符串内容 - * @return 是否是数字 + * @param object 对象 + * @return true:是数组 false:不是数组 */ - public static boolean isNumeric(CharSequence value) { - return Validator.isNumber(value); + public static boolean isArray(Object object) { + return ArrayUtil.isArray(object); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return StrUtil.trim(str); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + return substring(str, start, str.length()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + return StrUtil.sub(str, start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + return StrUtil.format(template, params); } /** @@ -61,6 +224,96 @@ public class StringUtils extends StrUtil { return Validator.isUrl(link); } + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet<>(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList<>(); + if (isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && isBlank(string)) { + continue; + } + if (trim) { + string = trim(string); + } + list.add(string); + } + + return list; + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + return StrUtil.toUnderlineCase(str); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + return StrUtil.equalsAnyIgnoreCase(str, strs); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + return StrUtil.upperFirst(StrUtil.toCamelCase(name)); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + return StrUtil.toCamelCase(s); + } + /** * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 * @@ -69,14 +322,33 @@ public class StringUtils extends StrUtil { * @return 是否匹配 */ public static boolean matches(String str, List strs) { - if (isEmpty(str) || CollUtil.isEmpty(strs)) { + if (isEmpty(str) || isEmpty(strs)) { return false; } for (String pattern : strs) { - if (ReUtil.isMatch(pattern, str)) { + if (isMatch(pattern, str)) { return true; } } return false; } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + return ReUtil.isMatch(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java index 32457dc96..c8ce6ec90 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -147,7 +147,7 @@ public class FileUploadUtils private static final String getPathFileName(String uploadDir, String fileName) throws IOException { int dirLastIndex = RuoYiConfig.getProfile().length() + 1; - String currentDir = StringUtils.subSuf(uploadDir, dirLastIndex); + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; return pathFileName; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java index 632a21e18..0d26ef155 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -83,7 +83,7 @@ public class ImageUtils { // 本机地址 String localPath = RuoYiConfig.getProfile(); - String downloadPath = localPath + StringUtils.subAfter(url, Constants.RESOURCE_PREFIX,false); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); in = new FileInputStream(downloadPath); } return IOUtils.toByteArray(in); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 15b7d543f..e60abf2f1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -218,9 +218,9 @@ public class ExcelUtil if (String.class == fieldType) { String s = Convert.toStr(val); - if (StringUtils.endWith(s, ".0")) + if (StringUtils.endsWith(s, ".0")) { - val = StringUtils.subBefore(s, ".0",false); + val = StringUtils.substringBefore(s, ".0"); } else { @@ -715,7 +715,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) + if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { @@ -734,7 +734,7 @@ public class ExcelUtil } } } - return StringUtils.strip(propertyString.toString(), null,separator); + return StringUtils.stripEnd(propertyString.toString(), separator); } /** @@ -752,7 +752,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) + if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { @@ -771,7 +771,7 @@ public class ExcelUtil } } } - return StringUtils.strip(propertyString.toString(), null,separator); + return StringUtils.stripEnd(propertyString.toString(), separator); } /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index 78a74b748..749f1abd3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -4,7 +4,6 @@ import cn.hutool.core.util.ReflectUtil; import com.ruoyi.common.utils.StringUtils; import java.lang.reflect.Method; -import java.util.List; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. @@ -26,7 +25,7 @@ public class ReflectUtils extends ReflectUtil { public static E invokeGetter(Object obj, String propertyName) { Object object = obj; for (String name : StringUtils.split(propertyName, ".")) { - String getterMethodName = GETTER_PREFIX + StringUtils.upperFirst(name); + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); object = invoke(object, getterMethodName); } return (E) object; @@ -38,13 +37,13 @@ public class ReflectUtils extends ReflectUtil { */ public static void invokeSetter(Object obj, String propertyName, E value) { Object object = obj; - List names = StringUtils.split(propertyName, "."); - for (int i = 0; i < names.size(); i++) { - if (i < names.size() - 1) { - String getterMethodName = GETTER_PREFIX + StringUtils.upperFirst(names.get(i)); + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); object = invoke(object, getterMethodName); } else { - String setterMethodName = SETTER_PREFIX + StringUtils.upperFirst(names.get(i)); + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); Method method = getMethodByName(object.getClass(), setterMethodName); invoke(object, method, value); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 90f94d3a5..773952a6e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -1,13 +1,12 @@ package com.ruoyi.framework.aspectj; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.web.service.TokenService; @@ -80,10 +79,10 @@ public class DataScopeAspect { } // 获取当前的用户 LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); - if (Validator.isNotNull(loginUser)) { + if (StringUtils.isNotNull(loginUser)) { SysUser currentUser = loginUser.getUser(); // 如果是超级管理员,则不过滤数据 - if (Validator.isNotNull(currentUser) && !currentUser.isAdmin()) { + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), controllerDataScope.isUser()); } @@ -155,14 +154,14 @@ public class DataScopeAspect { */ private void clearDataScope(final JoinPoint joinPoint) { Object params = joinPoint.getArgs()[0]; - if (Validator.isNotNull(params)) { + if (StringUtils.isNotNull(params)) { putDataScope(joinPoint, ""); } } private static void putDataScope(JoinPoint joinPoint, String sql) { Object params = joinPoint.getArgs()[0]; - if (Validator.isNotNull(params)) { + if (StringUtils.isNotNull(params)) { if (params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, sql); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java index f82b2ae47..47e774265 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -1,8 +1,8 @@ package com.ruoyi.framework.aspectj; -import cn.hutool.core.lang.Validator; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -33,7 +33,7 @@ public class DataSourceAspect { public Object around(ProceedingJoinPoint point) throws Throwable { DataSource dataSource = getDataSource(point); - if (Validator.isNotNull(dataSource)) { + if (StringUtils.isNotNull(dataSource)) { DynamicDataSourceContextHolder.poll(); String source = dataSource.value().getSource(); DynamicDataSourceContextHolder.push(source); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 83a3b8ff7..c9025117a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -1,13 +1,12 @@ package com.ruoyi.framework.aspectj; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.HttpMethod; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.web.service.AsyncService; import com.ruoyi.framework.web.service.TokenService; @@ -104,7 +103,7 @@ public class LogAspect if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); - operLog.setErrorMsg(StringUtils.sub(e.getMessage(), 0, 2000)); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); } // 设置方法名称 String className = joinPoint.getTarget().getClass().getName(); @@ -161,12 +160,12 @@ public class LogAspect if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { String params = argsArrayToString(joinPoint.getArgs()); - operLog.setOperParam(StringUtils.sub(params, 0, 2000)); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); } else { Map paramsMap = (Map) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); - operLog.setOperParam(StringUtils.sub(paramsMap.toString(), 0, 2000)); + operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000)); } } @@ -195,7 +194,7 @@ public class LogAspect if (paramsArray != null && paramsArray.length > 0) { for (Object o : paramsArray) { - if (Validator.isNotNull(o) && !isFilterObject(o)) { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) { params.append(JsonUtils.toJsonString(o)).append(" "); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java index 1103bc6d3..f35afdf68 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java @@ -45,8 +45,8 @@ public class UnsignedMathGenerator implements CodeGenerator { int max = RandomUtil.randomInt(min, limit); String number1 = Integer.toString(max); String number2 = Integer.toString(min); - number1 = StringUtils.padAfter(number1, this.numberLength, CharUtil.SPACE); - number2 = StringUtils.padAfter(number2, this.numberLength, CharUtil.SPACE); + number1 = StringUtils.rightPad(number1, this.numberLength, CharUtil.SPACE); + number2 = StringUtils.rightPad(number2, this.numberLength, CharUtil.SPACE); return number1 + RandomUtil.randomChar(operators) + number2 + '='; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java index 57c927653..459020d87 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -32,7 +32,7 @@ public class FilterConfig { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new XssFilter()); - registration.addUrlPatterns(StringUtils.splitToArray(xssProperties.getUrlPatterns(), ",")); + registration.addUrlPatterns(StringUtils.split(xssProperties.getUrlPatterns(), ",")); registration.setName("xssFilter"); registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); Map initParameters = new HashMap(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java index 8fc4e7956..d9b3464e4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -2,12 +2,12 @@ package com.ruoyi.framework.interceptor.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.filter.RepeatedlyRequestWrapper; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.RepeatSubmitProperties; import com.ruoyi.framework.config.properties.TokenProperties; import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; @@ -60,7 +60,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { } // body参数为空,获取Parameter的数据 - if (Validator.isEmpty(nowParams)) { + if (StringUtils.isEmpty(nowParams)) { nowParams = JsonUtils.toJsonString(request.getParameterMap()); } Map nowDataMap = new HashMap(); @@ -72,7 +72,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { // 唯一值(没有消息头则使用请求地址) String submitKey = request.getHeader(tokenProperties.getHeader()); - if (Validator.isEmpty(submitKey)) { + if (StringUtils.isEmpty(submitKey)) { submitKey = url; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java index 83c0d2250..20439da6c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java @@ -1,11 +1,11 @@ package com.ruoyi.framework.mybatisplus; -import cn.hutool.core.lang.Validator; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -25,12 +25,12 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { try { //根据属性名字设置要填充的值 if (metaObject.hasGetter("createTime")) { - if (Validator.isEmpty(metaObject.getValue("createTime"))) { + if (StringUtils.isEmpty(metaObject.getValue("createTime"))) { this.setFieldValByName("createTime", new Date(), metaObject); } } if (metaObject.hasGetter("createBy")) { - if (Validator.isEmpty(metaObject.getValue("createBy"))) { + if (StringUtils.isEmpty(metaObject.getValue("createBy"))) { this.setFieldValByName("createBy", getLoginUsername(), metaObject); } } @@ -43,12 +43,12 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { public void updateFill(MetaObject metaObject) { try { if (metaObject.hasGetter("updateBy")) { - if (Validator.isEmpty(metaObject.getValue("updateBy"))) { + if (StringUtils.isEmpty(metaObject.getValue("updateBy"))) { this.setFieldValByName("updateBy", getLoginUsername(), metaObject); } } if (metaObject.hasGetter("updateTime")) { - if (Validator.isEmpty(metaObject.getValue("updateTime"))) { + if (StringUtils.isEmpty(metaObject.getValue("updateTime"))) { this.setFieldValByName("updateTime", new Date(), metaObject); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java index fb2cdaaf4..188e24fdb 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -1,8 +1,8 @@ package com.ruoyi.framework.security.filter; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.service.TokenService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -19,7 +19,7 @@ import java.io.IOException; /** * token过滤器 验证token有效性 - * + * * @author ruoyi */ @Component @@ -33,7 +33,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter throws ServletException, IOException { LoginUser loginUser = tokenService.getLoginUser(request); - if (Validator.isNotNull(loginUser) && Validator.isNull(SecurityUtils.getAuthentication())) + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { tokenService.verifyToken(loginUser); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java index 2a12126a6..371a66121 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -1,12 +1,12 @@ package com.ruoyi.framework.security.handle; -import cn.hutool.core.lang.Validator; import cn.hutool.http.HttpStatus; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.service.AsyncService; import com.ruoyi.framework.web.service.TokenService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +40,7 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { LoginUser loginUser = tokenService.getLoginUser(request); - if (Validator.isNotNull(loginUser)) { + if (StringUtils.isNotNull(loginUser)) { String userName = loginUser.getUsername(); // 删除用户缓存记录 tokenService.delLoginUser(loginUser.getToken()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 9614a8d52..55af0395d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,11 +1,11 @@ package com.ruoyi.framework.web.exception; -import cn.hutool.core.lang.Validator; import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.BaseException; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; @@ -21,7 +21,7 @@ import javax.validation.ConstraintViolationException; /** * 全局异常处理器 - * + * * @author ruoyi */ @RestControllerAdvice @@ -44,7 +44,7 @@ public class GlobalExceptionHandler @ExceptionHandler(CustomException.class) public AjaxResult businessException(CustomException e) { - if (Validator.isNull(e.getCode())) + if (StringUtils.isNull(e.getCode())) { return AjaxResult.error(e.getMessage()); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java index 0cda991f7..af7fd5726 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -1,12 +1,12 @@ package com.ruoyi.framework.web.service; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.ServletUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.Set; @@ -39,12 +39,12 @@ public class PermissionService */ public boolean hasPermi(String permission) { - if (Validator.isEmpty(permission)) + if (StringUtils.isEmpty(permission)) { return false; } LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - if (Validator.isNull(loginUser) || Validator.isEmpty(loginUser.getPermissions())) + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { return false; } @@ -70,12 +70,12 @@ public class PermissionService */ public boolean hasAnyPermi(String permissions) { - if (Validator.isEmpty(permissions)) + if (StringUtils.isEmpty(permissions)) { return false; } LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - if (Validator.isNull(loginUser) || Validator.isEmpty(loginUser.getPermissions())) + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { return false; } @@ -98,12 +98,12 @@ public class PermissionService */ public boolean hasRole(String role) { - if (Validator.isEmpty(role)) + if (StringUtils.isEmpty(role)) { return false; } LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - if (Validator.isNull(loginUser) || Validator.isEmpty(loginUser.getUser().getRoles())) + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { return false; } @@ -137,12 +137,12 @@ public class PermissionService */ public boolean hasAnyRoles(String roles) { - if (Validator.isEmpty(roles)) + if (StringUtils.isEmpty(roles)) { return false; } LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - if (Validator.isNull(loginUser) || Validator.isEmpty(loginUser.getUser().getRoles())) + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { return false; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index a6ff95fd2..3414e372f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -1,6 +1,5 @@ package com.ruoyi.framework.web.service; -import cn.hutool.core.lang.Validator; import cn.hutool.core.util.IdUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; @@ -8,6 +7,7 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.framework.config.properties.TokenProperties; import io.jsonwebtoken.Claims; @@ -49,7 +49,7 @@ public class TokenService { public LoginUser getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = getToken(request); - if (Validator.isNotEmpty(token)) { + if (StringUtils.isNotEmpty(token)) { try { Claims claims = parseToken(token); // 解析对应的权限以及用户信息 @@ -68,7 +68,7 @@ public class TokenService { * 设置用户身份信息 */ public void setLoginUser(LoginUser loginUser) { - if (Validator.isNotNull(loginUser) && Validator.isNotEmpty(loginUser.getToken())) { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } @@ -77,7 +77,7 @@ public class TokenService { * 删除用户身份信息 */ public void delLoginUser(String token) { - if (Validator.isNotEmpty(token)) { + if (StringUtils.isNotEmpty(token)) { String userKey = getTokenKey(token); redisCache.deleteObject(userKey); } @@ -186,7 +186,7 @@ public class TokenService { */ private String getToken(HttpServletRequest request) { String token = request.getHeader(tokenProperties.getHeader()); - if (Validator.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { token = token.replace(Constants.TOKEN_PREFIX, ""); } return token; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java index 46b96bad1..22a586891 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -1,10 +1,10 @@ package com.ruoyi.framework.web.service; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +34,7 @@ public class UserDetailsServiceImpl implements UserDetailsService public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { SysUser user = userService.selectUserByUserName(username); - if (Validator.isNull(user)) + if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index d5f8ba880..92ba7a982 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -150,7 +150,7 @@ public class GenTableColumn implements Serializable { private Map params = new HashMap<>(); public String getCapJavaField() { - return StringUtils.upperFirst(javaField); + return StringUtils.uncapitalize(javaField); } public boolean isPk() { @@ -231,7 +231,7 @@ public class GenTableColumn implements Serializable { } public String readConverterExp() { - String remarks = StringUtils.subBetween(this.columnComment, "(", ")"); + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); StringBuffer sb = new StringBuffer(); if (StringUtils.isNotEmpty(remarks)) { for (String value : remarks.split(" ")) { diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 9c39a9930..fddd0bd30 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -2,7 +2,6 @@ package com.ruoyi.generator.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -260,7 +259,7 @@ public class GenTableServiceImpl extends ServicePlusImpl templates = VelocityUtils.getTemplateList(table.getTplCategory()); for (String template : templates) { - if (!StringUtils.containsAny("sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm", template)) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); @@ -284,7 +283,7 @@ public class GenTableServiceImpl extends ServicePlusImpl tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - if (Validator.isEmpty(dbTableColumns)) { + if (StringUtils.isEmpty(dbTableColumns)) { throw new CustomException("同步数据失败,原表结构不存在"); } List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); @@ -364,16 +363,16 @@ public class GenTableServiceImpl extends ServicePlusImpl paramsObj = genTable.getParams(); - if (Validator.isEmpty(paramsObj.get(GenConstants.TREE_CODE))) { + if (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_CODE))) { throw new CustomException("树编码字段不能为空"); - } else if (Validator.isEmpty(paramsObj.get(GenConstants.TREE_PARENT_CODE))) { + } else if (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_PARENT_CODE))) { throw new CustomException("树父编码字段不能为空"); - } else if (Validator.isEmpty(paramsObj.get(GenConstants.TREE_NAME))) { + } else if (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_NAME))) { throw new CustomException("树名称字段不能为空"); } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { - if (Validator.isEmpty(genTable.getSubTableName())) { + if (StringUtils.isEmpty(genTable.getSubTableName())) { throw new CustomException("关联子表的表名不能为空"); - } else if (Validator.isEmpty(genTable.getSubTableFkName())) { + } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { throw new CustomException("子表关联的外键名不能为空"); } } @@ -392,7 +391,7 @@ public class GenTableServiceImpl extends ServicePlusImpl paramsObj = JsonUtils.parseMap(genTable.getOptions()); - if (Validator.isNotNull(paramsObj)) { + if (StringUtils.isNotNull(paramsObj)) { String treeCode = Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)); String treeParentCode = Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE)); String treeName = Convert.toStr(paramsObj.get(GenConstants.TREE_NAME)); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index 5e778d61d..01afce003 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -61,7 +61,7 @@ public class GenUtils column.setHtmlType(GenConstants.HTML_INPUT); // 如果是浮点型 统一用BigDecimal - String[] str = StringUtils.splitToArray(StringUtils.subBetween(column.getColumnType(), "(", ")"), ","); + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { column.setJavaType(GenConstants.TYPE_BIGDECIMAL); @@ -98,33 +98,33 @@ public class GenUtils } // 查询字段类型 - if (StringUtils.endWithIgnoreCase(columnName, "name")) + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { column.setQueryType(GenConstants.QUERY_LIKE); } // 状态字段设置单选框 - if (StringUtils.endWithIgnoreCase(columnName, "status")) + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { column.setHtmlType(GenConstants.HTML_RADIO); } // 类型&性别字段设置下拉框 - else if (StringUtils.endWithIgnoreCase(columnName, "type") - || StringUtils.endWithIgnoreCase(columnName, "sex")) + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { column.setHtmlType(GenConstants.HTML_SELECT); } // 图片字段设置图片上传控件 - else if (StringUtils.endWithIgnoreCase(columnName, "image")) + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); } // 文件字段设置文件上传控件 - else if (StringUtils.endWithIgnoreCase(columnName, "file")) + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); } // 内容字段设置富文本控件 - else if (StringUtils.endWithIgnoreCase(columnName, "content")) + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { column.setHtmlType(GenConstants.HTML_EDITOR); } @@ -152,7 +152,7 @@ public class GenUtils { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); - String moduleName = StringUtils.sub(packageName, lastIndex + 1, nameLength); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); return moduleName; } @@ -166,7 +166,7 @@ public class GenUtils { int lastIndex = tableName.lastIndexOf("_"); int nameLength = tableName.length(); - String businessName = StringUtils.sub(tableName, lastIndex + 1, nameLength); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); return businessName; } @@ -182,10 +182,10 @@ public class GenUtils String tablePrefix = GenConfig.getTablePrefix(); if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { - String[] searchList = StringUtils.splitToArray(tablePrefix, ","); + String[] searchList = StringUtils.split(tablePrefix, ","); tableName = replaceFirst(tableName, searchList); } - return StringUtils.upperFirst(StringUtils.toCamelCase(tableName)); + return StringUtils.convertToCamelCase(tableName); } /** @@ -230,7 +230,7 @@ public class GenUtils { if (StringUtils.indexOf(columnType, '(') > 0) { - return StringUtils.subBefore(columnType, "(",false); + return StringUtils.substringBefore(columnType, "("); } else { @@ -248,7 +248,7 @@ public class GenUtils { if (StringUtils.indexOf(columnType, '(') > 0) { - String length = StringUtils.subBetween(columnType, "(", ")"); + String length = StringUtils.substringBetween(columnType, "(", ")"); return Integer.valueOf(length); } else diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 59438e616..098a91892 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -1,11 +1,10 @@ package com.ruoyi.generator.util; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; import org.apache.velocity.VelocityContext; @@ -49,9 +48,9 @@ public class VelocityUtils velocityContext.put("tableName", genTable.getTableName()); velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); velocityContext.put("ClassName", genTable.getClassName()); - velocityContext.put("className", StringUtils.lowerFirst(genTable.getClassName())); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); velocityContext.put("moduleName", genTable.getModuleName()); - velocityContext.put("BusinessName", StringUtils.upperFirst(genTable.getBusinessName())); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); velocityContext.put("businessName", genTable.getBusinessName()); velocityContext.put("basePackage", getPackagePrefix(packageName)); velocityContext.put("packageName", packageName); @@ -110,15 +109,15 @@ public class VelocityUtils String subTableName = genTable.getSubTableName(); String subTableFkName = genTable.getSubTableFkName(); String subClassName = genTable.getSubTable().getClassName(); - String subTableFkClassName = StringUtils.toCamelCase(subTableFkName); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); context.put("subTable", subTable); context.put("subTableName", subTableName); context.put("subTableFkName", subTableFkName); context.put("subTableFkClassName", subTableFkClassName); - context.put("subTableFkclassName", StringUtils.lowerFirst(subTableFkClassName)); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); context.put("subClassName", subClassName); - context.put("subclassName", StringUtils.lowerFirst(subClassName)); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); context.put("subImportList", getImportList(genTable.getSubTable())); } @@ -240,7 +239,7 @@ public class VelocityUtils public static String getPackagePrefix(String packageName) { int lastIndex = packageName.lastIndexOf("."); - String basePackage = StringUtils.sub(packageName, 0, lastIndex); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); return basePackage; } @@ -255,7 +254,7 @@ public class VelocityUtils List columns = genTable.getColumns(); GenTable subGenTable = genTable.getSubTable(); HashSet importList = new HashSet(); - if (Validator.isNotNull(subGenTable)) + if (StringUtils.isNotNull(subGenTable)) { importList.add("java.util.List"); } @@ -294,7 +293,7 @@ public class VelocityUtils */ public static String getParentMenuId(Map paramsObj) { - if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) && StringUtils.isNotEmpty(Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)))) { return Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); @@ -310,7 +309,7 @@ public class VelocityUtils */ public static String getTreecode(Map paramsObj) { - if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); } @@ -325,7 +324,7 @@ public class VelocityUtils */ public static String getTreeParentCode(Map paramsObj) { - if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); } @@ -340,7 +339,7 @@ public class VelocityUtils */ public static String getTreeName(Map paramsObj) { - if (Validator.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index 590ba70fe..0d7544323 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -55,7 +55,7 @@ public class SysOssServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); @@ -54,10 +53,10 @@ public class SysJobLogServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime"))); } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java index c780b06f4..95437a81f 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java @@ -2,10 +2,9 @@ package com.ruoyi.quartz.util; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.exceptions.ExceptionUtil; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.ScheduleConstants; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.domain.SysJobLog; @@ -40,7 +39,7 @@ public abstract class AbstractQuartzJob implements Job try { before(context, sysJob); - if (Validator.isNotNull(sysJob)) + if (StringUtils.isNotNull(sysJob)) { doExecute(context, sysJob); } @@ -86,7 +85,7 @@ public abstract class AbstractQuartzJob implements Job if (e != null) { sysJobLog.setStatus(Constants.FAIL); - String errorMsg = StringUtils.sub(ExceptionUtil.stacktraceToString(e), 0, 2000); + String errorMsg = StringUtils.substring(ExceptionUtil.stacktraceToString(e), 0, 2000); sysJobLog.setExceptionInfo(errorMsg); } else diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java index 44eb8fdb4..ba55d2d10 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java @@ -1,6 +1,5 @@ package com.ruoyi.quartz.util; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.quartz.domain.SysJob; @@ -52,7 +51,7 @@ public class JobInvokeUtil throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - if (Validator.isNotNull(methodParams) && methodParams.size() > 0) + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) { Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); method.invoke(bean, getMethodParamsValue(methodParams)); @@ -72,7 +71,7 @@ public class JobInvokeUtil */ public static boolean isValidClassName(String invokeTarget) { - return StringUtils.count(invokeTarget, ".") > 1; + return StringUtils.countMatches(invokeTarget, ".") > 1; } /** @@ -83,8 +82,8 @@ public class JobInvokeUtil */ public static String getBeanName(String invokeTarget) { - String beanName = StringUtils.subBefore(invokeTarget, "(",false); - return StringUtils.subBefore(beanName, ".",true); + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBefore(beanName, "."); } /** @@ -95,8 +94,8 @@ public class JobInvokeUtil */ public static String getMethodName(String invokeTarget) { - String methodName = StringUtils.subBefore(invokeTarget, "(",false); - return StringUtils.subAfter(methodName, ".",true); + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBefore(methodName, "."); } /** @@ -107,7 +106,7 @@ public class JobInvokeUtil */ public static List getMethodParams(String invokeTarget) { - String methodStr = StringUtils.subBetween(invokeTarget, "(", ")"); + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); if (StringUtils.isEmpty(methodStr)) { return null; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 250ccf1a7..ddf45e85e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.DataSource; @@ -51,10 +50,10 @@ public class SysConfigServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); @@ -81,12 +80,12 @@ public class SysConfigServiceImpl extends ServicePlusImpl() .eq(SysConfig::getConfigKey, configKey)); - if (Validator.isNotNull(retConfig)) { + if (StringUtils.isNotNull(retConfig)) { redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); return retConfig.getConfigValue(); } @@ -120,10 +119,10 @@ public class SysConfigServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return baseMapper.selectList(lqw); @@ -214,9 +213,9 @@ public class SysConfigServiceImpl extends ServicePlusImpl().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (Validator.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 366730299..93d01296b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,8 +1,6 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.annotation.DataScope; @@ -13,6 +11,7 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysUserMapper; @@ -160,12 +159,12 @@ public class SysDeptServiceImpl extends ServicePlusImpl() .eq(SysDept::getDeptName, dept.getDeptName()) .eq(SysDept::getParentId, dept.getParentId()) .last("limit 1")); - if (Validator.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) { + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -198,7 +197,7 @@ public class SysDeptServiceImpl extends ServicePlusImpl getChildList(List list, SysDept t) { List tlist = new ArrayList(); for (SysDept n : list) { - if (Validator.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { tlist.add(n); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index cfd8e1fc0..5178aa3bf 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Validator; import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -51,10 +50,10 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); @@ -73,10 +72,10 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime"))); } @@ -225,11 +224,11 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl() .eq(SysDictType::getDictType, dict.getDictType()) .last("limit 1")); - if (Validator.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) { + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index 035ee5e23..8b5661928 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; @@ -31,10 +30,10 @@ public class SysLogininforServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(login_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage("info_id","desc"), lqw)); @@ -64,10 +63,10 @@ public class SysLogininforServiceImpl extends ServicePlusImpl= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(login_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")) .orderByDesc(SysLogininfor::getInfoId)); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 3d3139696..a46d62c21 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -1,7 +1,5 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.lang.Validator; -import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; @@ -11,6 +9,7 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.vo.MetaVo; import com.ruoyi.system.domain.vo.RouterVo; @@ -85,7 +84,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl perms = baseMapper.selectMenuPermsByUserId(userId); Set permsSet = new HashSet<>(); for (String perm : perms) { - if (Validator.isNotEmpty(perm)) { + if (StringUtils.isNotEmpty(perm)) { permsSet.addAll(Arrays.asList(perm.trim().split(","))); } } @@ -148,7 +147,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl() .eq(SysMenu::getMenuName,menu.getMenuName()) .eq(SysMenu::getParentId,menu.getParentId()) .last("limit 1")); - if (Validator.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) { + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -302,7 +301,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl 0, SysOperLog::getStatus, operLog.getStatus()) .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) - .apply(Validator.isNotEmpty(params.get("beginTime")), + .apply(StringUtils.isNotEmpty(params.get("beginTime")), "date_format(oper_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(oper_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage("oper_id","desc"), lqw)); @@ -81,10 +80,10 @@ public class SysOperLogServiceImpl extends ServicePlusImpl 0, SysOperLog::getStatus,operLog.getStatus()) .like(StringUtils.isNotBlank(operLog.getOperName()),SysOperLog::getOperName,operLog.getOperName()) - .apply(Validator.isNotEmpty(params.get("beginTime")), + .apply(StringUtils.isNotEmpty(params.get("beginTime")), "date_format(oper_time,'%y%m%d') >= date_format({0},'%y%m%d')", params.get("beginTime")) - .apply(Validator.isNotEmpty(params.get("endTime")), + .apply(StringUtils.isNotEmpty(params.get("endTime")), "date_format(oper_time,'%y%m%d') <= date_format({0},'%y%m%d')", params.get("endTime")) .orderByDesc(SysOperLog::getOperId)); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 495c2e9db..82d09e85c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; @@ -93,10 +92,10 @@ public class SysPostServiceImpl extends ServicePlusImpl() .eq(SysPost::getPostName, post.getPostName()).last("limit 1")); - if (Validator.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -110,10 +109,10 @@ public class SysPostServiceImpl extends ServicePlusImpl() .eq(SysPost::getPostCode, post.getPostCode()).last("limit 1")); - if (Validator.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index 70a33eeb1..a9ecb3696 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; @@ -9,6 +8,7 @@ import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysRoleDept; import com.ruoyi.system.domain.SysRoleMenu; @@ -91,7 +91,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl perms = baseMapper.selectRolePermissionByUserId(userId); Set permsSet = new HashSet<>(); for (SysRole perm : perms) { - if (Validator.isNotNull(perm)) { + if (StringUtils.isNotNull(perm)) { permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); } } @@ -138,10 +138,10 @@ public class SysRoleServiceImpl extends ServicePlusImpl() .eq(SysRole::getRoleName, role.getRoleName()).last("limit 1")); - if (Validator.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -155,10 +155,10 @@ public class SysRoleServiceImpl extends ServicePlusImpl() .eq(SysRole::getRoleKey, role.getRoleKey()).last("limit 1")); - if (Validator.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -171,7 +171,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl() .select(SysUser::getUserId, SysUser::getPhonenumber) .eq(SysUser::getPhonenumber, user.getPhonenumber()).last("limit 1")); - if (Validator.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -194,11 +194,11 @@ public class SysUserServiceImpl extends ServicePlusImpl() .select(SysUser::getUserId, SysUser::getEmail) .eq(SysUser::getEmail, user.getEmail()).last("limit 1")); - if (Validator.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -211,7 +211,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long roleId : roles) { @@ -373,7 +373,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long postId : posts) { @@ -395,7 +395,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long roleId : roleIds) { @@ -456,7 +456,7 @@ public class SysUserServiceImpl extends ServicePlusImpl userList, Boolean isUpdateSupport, String operName) { - if (Validator.isNull(userList) || userList.size() == 0) { + if (StringUtils.isNull(userList) || userList.size() == 0) { throw new CustomException("导入用户数据不能为空!"); } int successNum = 0; @@ -468,7 +468,7 @@ public class SysUserServiceImpl extends ServicePlusImpl Date: Mon, 2 Aug 2021 16:10:31 +0000 Subject: [PATCH 030/106] =?UTF-8?q?Fix=20=E4=BF=AE=E5=A4=8DDictUtils?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ruoyi/common/utils/DictUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java index 69bab4900..64ac8efdc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -110,7 +110,7 @@ public class DictUtils } } } - return StringUtils.strip(propertyString.toString(), null, separator); + return StringUtils.stripEnd(propertyString.toString(), separator); } /** @@ -150,7 +150,7 @@ public class DictUtils } } } - return StringUtils.strip(propertyString.toString(), null, separator); + return StringUtils.stripEnd(propertyString.toString(), separator); } /** From 70b77d9801f31727fc38e8cd1fd5111ddbb86967 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, 3 Aug 2021 19:27:48 +0800 Subject: [PATCH 031/106] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20easyexcel=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +++++++ ruoyi-common/pom.xml | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 181958ec2..ee443eca1 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 1.2.6 3.0.3 4.1.2 + 2.2.10 1.7 0.9.1 3.4.3 @@ -80,6 +81,12 @@ ${poi.version} + + com.alibaba + easyexcel + ${easyexcel.version} + + org.apache.velocity diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 016c4576d..5221faf10 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -59,6 +59,11 @@ poi-ooxml + + com.alibaba + easyexcel + + org.yaml From 170908ef8d90da6a35caea69d320e20bf557a054 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, 3 Aug 2021 19:28:15 +0800 Subject: [PATCH 032/106] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20easyexcel=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/annotation/ExcelDictFormat.java | 30 ++++ .../common/convert/ExcelDictConvert.java | 69 ++++++++ .../ruoyi/common/utils/poi/ExcelUtils.java | 150 ++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java new file mode 100644 index 000000000..a51116b5c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * @author Lion Li + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelDictFormat { + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + String separator() default ","; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java new file mode 100644 index 000000000..6049b1ed3 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java @@ -0,0 +1,69 @@ +package com.ruoyi.common.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtils; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; + +/** + * 字典格式化转换处理 + * + * @author Lion Li + */ +@Slf4j +public class ExcelDictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String label = cellData.getStringValue(); + String value; + if (StringUtils.isBlank(type)) { + value = ExcelUtils.reverseByExp(label, anno.readConverterExp(), anno.separator()); + } else { + value = ExcelUtils.reverseDictByExp(label, type, anno.separator()); + } + return Convert.convert(contentProperty.getField().getType(), value); + } + + @Override + public CellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (StringUtils.isNull(object)) { + return new CellData<>(""); + } + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String value = Convert.toStr(object); + String label; + if (StringUtils.isBlank(type)) { + label = ExcelUtils.convertByExp(value, anno.readConverterExp(), anno.separator()); + } else { + label = ExcelUtils.convertDictByExp(value, type, anno.separator()); + } + return new CellData<>(label); + } + + private ExcelDictFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java new file mode 100644 index 000000000..bc5282f27 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java @@ -0,0 +1,150 @@ +package com.ruoyi.common.utils.poi; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUtils; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelUtils { + + /** + * 对excel表单默认第一个索引名转换成list(EasyExcel) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static List importExcel(InputStream is, Class clazz) { + return EasyExcel.read(is).head(clazz).sheet().doReadSync(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单(EasyExcel) + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { + try { + String filename = encodingFilename(sheetName); + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(filename, StandardCharsets.UTF_8.toString())); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + ServletOutputStream os = response.getOutputStream(); + EasyExcel.write(os, clazz) + .autoCloseStream(false) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .sheet(sheetName).doWrite(list); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 编码文件名 + */ + public static String encodingFilename(String filename) { + return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; + } + +} From 89cca8af078ad110dbe20a81b2850de98b6f78d0 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, 3 Aug 2021 19:29:15 +0800 Subject: [PATCH 033/106] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=BD=BF=E7=94=A8=20zip=20=E5=B7=A5=E5=85=B7=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/utils/ossdownload.js | 41 ----------------------- ruoyi-ui/src/utils/zipdownload.js | 54 +++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 43 deletions(-) delete mode 100644 ruoyi-ui/src/utils/ossdownload.js diff --git a/ruoyi-ui/src/utils/ossdownload.js b/ruoyi-ui/src/utils/ossdownload.js deleted file mode 100644 index 6da52bb74..000000000 --- a/ruoyi-ui/src/utils/ossdownload.js +++ /dev/null @@ -1,41 +0,0 @@ -import axios from 'axios' -import { getToken } from '@/utils/auth' - -const mimeMap = { - oss: 'application/octet-stream' -} - -const baseUrl = process.env.VUE_APP_BASE_API -export function downLoadOss(ossId) { - var url = baseUrl + '/system/oss/download/' + ossId - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then(res => { - resolveBlob(res, mimeMap.oss) - }) -} -/** - * 解析blob响应内容并下载 - * @param {*} res blob响应内容 - * @param {String} mimeType MIME类型 - */ -export function resolveBlob(res, mimeType) { - const aLink = document.createElement('a') - var blob = new Blob([res.data], { type: mimeType }) - // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; - var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') - var contentDisposition = decodeURI(res.headers['content-disposition']) - var result = patt.exec(contentDisposition) - var fileName = result[1] - fileName = fileName.replace(/\"/g, '') - aLink.style.display = 'none' - aLink.href = URL.createObjectURL(blob) - aLink.setAttribute('download', decodeURI(fileName)) // 设置下载文件名称 - document.body.appendChild(aLink) - aLink.click() - URL.revokeObjectURL(aLink.href);//清除引用 - document.body.removeChild(aLink); -} diff --git a/ruoyi-ui/src/utils/zipdownload.js b/ruoyi-ui/src/utils/zipdownload.js index 52afcc661..aa926030f 100644 --- a/ruoyi-ui/src/utils/zipdownload.js +++ b/ruoyi-ui/src/utils/zipdownload.js @@ -3,7 +3,9 @@ import { getToken } from '@/utils/auth' const mimeMap = { xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - zip: 'application/zip' + zip: 'application/zip', + excel: 'application/vnd.ms-excel', + oss: 'application/octet-stream' } const baseUrl = process.env.VUE_APP_BASE_API @@ -18,6 +20,54 @@ export function downLoadZip(str, filename) { resolveBlob(res, mimeMap.zip) }) } + +export function downLoadOss(ossId) { + var url = baseUrl + '/system/oss/download/' + ossId + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then(res => { + resolveBlob(res, mimeMap.oss) + }) +} + +export function downLoadExcel(url, params) { + // get请求映射params参数 + if (params) { + let urlparams = url + '?'; + for (const propName of Object.keys(params)) { + const value = params[propName]; + var part = encodeURIComponent(propName) + "="; + if (value !== null && typeof(value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + let params = propName + '[' + key + ']'; + var subPart = encodeURIComponent(params) + "="; + urlparams += subPart + encodeURIComponent(value[key]) + "&"; + } + } else { + urlparams += part + encodeURIComponent(value) + "&"; + } + } + } + urlparams = urlparams.slice(0, -1); + params = {}; + url = urlparams; + } + url = baseUrl + url + axios({ + method: 'get', + url: url, + params: params, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then(res => { + resolveBlob(res, mimeMap.excel) + }) +} + /** * 解析blob响应内容并下载 * @param {*} res blob响应内容 @@ -34,7 +84,7 @@ export function resolveBlob(res, mimeType) { fileName = fileName.replace(/\"/g, '') aLink.style.display = 'none' aLink.href = URL.createObjectURL(blob) - aLink.setAttribute('download', fileName) // 设置下载文件名称 + aLink.setAttribute('download', decodeURI(fileName)) // 设置下载文件名称 document.body.appendChild(aLink) aLink.click() URL.revokeObjectURL(aLink.href);//清除引用 From da4e0806569af3e676c88cbbe637debf4d1a57c3 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, 3 Aug 2021 19:29:59 +0800 Subject: [PATCH 034/106] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=20=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E5=AF=BC=E5=87=BA=20=E9=80=82?= =?UTF-8?q?=E9=85=8Deasyexcel=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/SysOperlogController.java | 12 +++-- .../com/ruoyi/system/domain/SysOperLog.java | 47 +++++++++++-------- ruoyi-ui/src/views/monitor/operlog/index.vue | 14 +----- ruoyi-ui/src/views/system/oss/index.vue | 4 +- 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 97f99206c..c7d1fcdbf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -5,18 +5,19 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.utils.poi.ExcelUtils; import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.service.ISysOperLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** * 操作日志记录 - * + * * @author ruoyi */ @RestController @@ -36,11 +37,12 @@ public class SysOperlogController extends BaseController @Log(title = "操作日志", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") @GetMapping("/export") - public AjaxResult export(SysOperLog operLog) + public void export(SysOperLog operLog, HttpServletResponse response) { List list = operLogService.selectOperLogList(operLog); - ExcelUtil util = new ExcelUtil(SysOperLog.class); - return util.exportExcel(list, "操作日志"); + ExcelUtils.exportExcel(list, "操作日志", SysOperLog.class, response); +// ExcelUtil util = new ExcelUtil(SysOperLog.class); +// return util.exportEasyExcel(list, "操作日志"); } @Log(title = "操作日志", businessType = BusinessType.DELETE) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java index 03e5d26fa..8b14c360e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java @@ -1,12 +1,13 @@ package com.ruoyi.system.domain; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -26,26 +27,31 @@ import java.util.Map; @NoArgsConstructor @Accessors(chain = true) @TableName("sys_oper_log") +@ExcelIgnoreUnannotated +//@ColumnWidth(16) +//@HeadRowHeight(14) +//@HeadFontStyle(fontHeightInPoints = 11) public class SysOperLog implements Serializable { private static final long serialVersionUID = 1L; /** * 日志主键 */ - @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + @ExcelProperty(value = "操作序号") @TableId(value = "oper_id", type = IdType.AUTO) private Long operId; /** * 操作模块 */ - @Excel(name = "操作模块") + @ExcelProperty(value = "操作模块") private String title; /** * 业务类型(0其它 1新增 2修改 3删除) */ - @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_oper_type") private Integer businessType; /** @@ -57,80 +63,81 @@ public class SysOperLog implements Serializable { /** * 请求方法 */ - @Excel(name = "请求方法") + @ExcelProperty(value = "请求方法") private String method; /** * 请求方式 */ - @Excel(name = "请求方式") + @ExcelProperty(value = "请求方式") private String requestMethod; /** * 操作类别(0其它 1后台用户 2手机端用户) */ - @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") private Integer operatorType; /** * 操作人员 */ - @Excel(name = "操作人员") + @ExcelProperty(value = "操作人员") private String operName; /** * 部门名称 */ - @Excel(name = "部门名称") + @ExcelProperty(value = "部门名称") private String deptName; /** * 请求url */ - @Excel(name = "请求地址") + @ExcelProperty(value = "请求地址") private String operUrl; /** * 操作地址 */ - @Excel(name = "操作地址") + @ExcelProperty(value = "操作地址") private String operIp; /** * 操作地点 */ - @Excel(name = "操作地点") + @ExcelProperty(value = "操作地点") private String operLocation; /** * 请求参数 */ - @Excel(name = "请求参数") + @ExcelProperty(value = "请求参数") private String operParam; /** * 返回参数 */ - @Excel(name = "返回参数") + @ExcelProperty(value = "返回参数") private String jsonResult; /** * 操作状态(0正常 1异常) */ - @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") private Integer status; /** * 错误消息 */ - @Excel(name = "错误消息") + @ExcelProperty(value = "错误消息") private String errorMsg; /** * 操作时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "操作时间") private Date operTime; /** diff --git a/ruoyi-ui/src/views/monitor/operlog/index.vue b/ruoyi-ui/src/views/monitor/operlog/index.vue index ff6c7989a..08f3d432d 100644 --- a/ruoyi-ui/src/views/monitor/operlog/index.vue +++ b/ruoyi-ui/src/views/monitor/operlog/index.vue @@ -189,6 +189,7 @@ \ No newline at end of file + From ffed5a09cb6904ce55b33c49a5d38461f863756b 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, 4 Aug 2021 19:02:59 +0800 Subject: [PATCH 047/106] =?UTF-8?q?remove=20=E7=A7=BB=E9=99=A4=E5=8E=9F?= =?UTF-8?q?=E7=94=9Fexcel=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/annotation/Excel.java | 165 ------------------ .../com/ruoyi/common/annotation/Excels.java | 18 -- .../ruoyi/common/utils/poi/ExcelUtils.java | 150 ---------------- 3 files changed, 333 deletions(-) delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java deleted file mode 100644 index 50482c572..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.ruoyi.common.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.math.BigDecimal; - -/** - * 自定义导出Excel数据注解 - * - * @author ruoyi - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface Excel -{ - /** - * 导出时在excel中排序 - */ - public int sort() default Integer.MAX_VALUE; - - /** - * 导出到Excel中的名字. - */ - public String name() default ""; - - /** - * 日期格式, 如: yyyy-MM-dd - */ - public String dateFormat() default ""; - - /** - * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) - */ - public String dictType() default ""; - - /** - * 读取内容转表达式 (如: 0=男,1=女,2=未知) - */ - public String readConverterExp() default ""; - - /** - * 分隔符,读取字符串组内容 - */ - public String separator() default ","; - - /** - * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) - */ - public int scale() default -1; - - /** - * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN - */ - public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; - - /** - * 导出类型(0数字 1字符串) - */ - public ColumnType cellType() default ColumnType.STRING; - - /** - * 导出时在excel中每个列的高度 单位为字符 - */ - public double height() default 14; - - /** - * 导出时在excel中每个列的宽 单位为字符 - */ - public double width() default 16; - - /** - * 文字后缀,如% 90 变成90% - */ - public String suffix() default ""; - - /** - * 当值为空时,字段的默认值 - */ - public String defaultValue() default ""; - - /** - * 提示信息 - */ - public String prompt() default ""; - - /** - * 设置只能选择不能输入的列内容. - */ - public String[] combo() default {}; - - /** - * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. - */ - public boolean isExport() default true; - - /** - * 另一个类中的属性名称,支持多级获取,以小数点隔开 - */ - public String targetAttr() default ""; - - /** - * 是否自动统计数据,在最后追加一行统计数据总和 - */ - public boolean isStatistics() default false; - - /** - * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右) - */ - Align align() default Align.AUTO; - - public enum Align - { - AUTO(0), LEFT(1), CENTER(2), RIGHT(3); - private final int value; - - Align(int value) - { - this.value = value; - } - - public int value() - { - return this.value; - } - } - - /** - * 字段类型(0:导出导入;1:仅导出;2:仅导入) - */ - Type type() default Type.ALL; - - public enum Type - { - ALL(0), EXPORT(1), IMPORT(2); - private final int value; - - Type(int value) - { - this.value = value; - } - - public int value() - { - return this.value; - } - } - - public enum ColumnType - { - NUMERIC(0), STRING(1), IMAGE(2); - private final int value; - - ColumnType(int value) - { - this.value = value; - } - - public int value() - { - return this.value; - } - } -} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java deleted file mode 100644 index 940763f06..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ruoyi.common.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Excel注解集 - * - * @author ruoyi - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Excels -{ - Excel[] value(); -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java deleted file mode 100644 index 4d52d0b6c..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtils.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.ruoyi.common.utils.poi; - -import cn.hutool.core.util.IdUtil; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import com.ruoyi.common.utils.DictUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.file.FileUtils; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.List; - -/** - * Excel相关处理 - * - * @author ruoyi - */ -public class ExcelUtils { - - /** - * 对excel表单默认第一个索引名转换成list(EasyExcel) - * - * @param is 输入流 - * @return 转换后集合 - */ - public static List importExcel(InputStream is, Class clazz) { - return EasyExcel.read(is).autoCloseStream(false).sheet().doReadSync(); - } - - /** - * 对list数据源将其里面的数据导入到excel表单(EasyExcel) - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @return 结果 - */ - public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { - try { - String filename = encodingFilename(sheetName); - response.reset(); - response.addHeader("Access-Control-Allow-Origin", "*"); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(filename, StandardCharsets.UTF_8.toString())); - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); - ServletOutputStream os = response.getOutputStream(); - EasyExcel.write(os, clazz) - .autoCloseStream(false) - // 自动适配 - .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - .sheet(sheetName).doWrite(list); - } catch (IOException e) { - throw new RuntimeException("导出Excel异常"); - } - } - - /** - * 解析导出值 0=男,1=女,2=未知 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String convertByExp(String propertyValue, String converterExp, String separator) { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) { - for (String value : propertyValue.split(separator)) { - if (itemArray[0].equals(value)) { - propertyString.append(itemArray[1] + separator); - break; - } - } - } else { - if (itemArray[0].equals(propertyValue)) { - return itemArray[1]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 反向解析值 男=0,女=1,未知=2 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String reverseByExp(String propertyValue, String converterExp, String separator) { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) { - for (String value : propertyValue.split(separator)) { - if (itemArray[1].equals(value)) { - propertyString.append(itemArray[0] + separator); - break; - } - } - } else { - if (itemArray[1].equals(propertyValue)) { - return itemArray[0]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 解析字典值 - * - * @param dictValue 字典值 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String convertDictByExp(String dictValue, String dictType, String separator) { - return DictUtils.getDictLabel(dictType, dictValue, separator); - } - - /** - * 反向解析值字典值 - * - * @param dictLabel 字典标签 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典值 - */ - public static String reverseDictByExp(String dictLabel, String dictType, String separator) { - return DictUtils.getDictValue(dictType, dictLabel, separator); - } - - /** - * 编码文件名 - */ - public static String encodingFilename(String filename) { - return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; - } - -} From 08db4a5f53e17f3224e4f0caa66f1b76e3971aaf 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, 4 Aug 2021 19:03:25 +0800 Subject: [PATCH 048/106] =?UTF-8?q?update=20=E6=9B=B4=E6=94=B9=E6=89=80?= =?UTF-8?q?=E6=9C=89=E4=B8=9A=E5=8A=A1excel=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/SysLogininforController.java | 4 +- .../monitor/SysOperlogController.java | 4 +- .../system/SysConfigController.java | 4 +- .../system/SysDictDataController.java | 4 +- .../system/SysDictTypeController.java | 4 +- .../controller/system/SysPostController.java | 4 +- .../controller/system/SysRoleController.java | 4 +- .../controller/system/SysUserController.java | 8 +- .../common/convert/ExcelDictConvert.java | 10 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 1181 ++--------------- .../demo/controller/TestDemoController.java | 6 +- .../demo/controller/TestTreeController.java | 6 +- .../com/ruoyi/demo/domain/vo/TestDemoVo.java | 23 +- .../com/ruoyi/demo/domain/vo/TestTreeVo.java | 15 +- .../quartz/controller/SysJobController.java | 4 +- .../controller/SysJobLogController.java | 4 +- ruoyi-ui/src/api/demo/demo.js | 8 - ruoyi-ui/src/api/demo/tree.js | 9 - ruoyi-ui/src/views/demo/demo/index.vue | 16 +- ruoyi-ui/src/views/demo/tree/index.vue | 2 +- 20 files changed, 189 insertions(+), 1131 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 63ba25915..fb0b0029f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -5,7 +5,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.service.ISysLogininforService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +40,7 @@ public class SysLogininforController extends BaseController public void export(SysLogininfor logininfor, HttpServletResponse response) { List list = logininforService.selectLogininforList(logininfor); - ExcelUtils.exportExcel(list, "登录日志", SysLogininfor.class, response); + ExcelUtil.exportExcel(list, "登录日志", SysLogininfor.class, response); } @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 40d32ce44..02a926d81 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -5,7 +5,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.service.ISysOperLogService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +40,7 @@ public class SysOperlogController extends BaseController public void export(SysOperLog operLog, HttpServletResponse response) { List list = operLogService.selectOperLogList(operLog); - ExcelUtils.exportExcel(list, "操作日志", SysOperLog.class, response); + ExcelUtil.exportExcel(list, "操作日志", SysOperLog.class, response); } @Log(title = "操作日志", businessType = BusinessType.DELETE) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index 03d6108bd..ea5e7e51a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.service.ISysConfigService; import org.springframework.beans.factory.annotation.Autowired; @@ -47,7 +47,7 @@ public class SysConfigController extends BaseController public void export(SysConfig config, HttpServletResponse response) { List list = configService.selectConfigList(config); - ExcelUtils.exportExcel(list, "参数数据", SysConfig.class, response); + ExcelUtil.exportExcel(list, "参数数据", SysConfig.class, response); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index f887c619e..d312391d3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictTypeService; import org.springframework.beans.factory.annotation.Autowired; @@ -48,7 +48,7 @@ public class SysDictDataController extends BaseController public void export(SysDictData dictData, HttpServletResponse response) { List list = dictDataService.selectDictDataList(dictData); - ExcelUtils.exportExcel(list, "字典数据", SysDictData.class, response); + ExcelUtil.exportExcel(list, "字典数据", SysDictData.class, response); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index c70faa54e..cea38ee40 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysDictTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -43,7 +43,7 @@ public class SysDictTypeController extends BaseController public void export(SysDictType dictType, HttpServletResponse response) { List list = dictTypeService.selectDictTypeList(dictType); - ExcelUtils.exportExcel(list, "字典类型", SysDictType.class, response); + ExcelUtil.exportExcel(list, "字典类型", SysDictType.class, response); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 435fce5b7..65886737d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -7,7 +7,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.service.ISysPostService; import org.springframework.beans.factory.annotation.Autowired; @@ -46,7 +46,7 @@ public class SysPostController extends BaseController public void export(SysPost post, HttpServletResponse response) { List list = postService.selectPostList(post); - ExcelUtils.exportExcel(list, "岗位数据", SysPost.class, response); + ExcelUtil.exportExcel(list, "岗位数据", SysPost.class, response); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 337f9dee4..88fa25626 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -12,7 +12,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.domain.SysUserRole; @@ -60,7 +60,7 @@ public class SysRoleController extends BaseController public void export(SysRole role, HttpServletResponse response) { List list = roleService.selectRoleList(role); - ExcelUtils.exportExcel(list, "角色数据", SysRole.class, response); + ExcelUtil.exportExcel(list, "角色数据", SysRole.class, response); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index b3d4cac02..e9db98b98 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -15,7 +15,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.domain.vo.SysUserExportVo; import com.ruoyi.system.domain.vo.SysUserImportVo; @@ -81,7 +81,7 @@ public class SysUserController extends BaseController vo.setLeader(dept.getLeader()); } } - ExcelUtils.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); + ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); } @Log(title = "用户管理", businessType = BusinessType.IMPORT) @@ -89,7 +89,7 @@ public class SysUserController extends BaseController @PostMapping("/importData") public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { - List userListVo = ExcelUtils.importExcel(file.getInputStream(), SysUserImportVo.class); + List userListVo = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class); List userList = BeanUtil.copyToList(userListVo, SysUser.class); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); String operName = loginUser.getUsername(); @@ -100,7 +100,7 @@ public class SysUserController extends BaseController @GetMapping("/importTemplate") public void importTemplate(HttpServletResponse response) { - ExcelUtils.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); } /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java index 6049b1ed3..58560d0b1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java @@ -9,7 +9,7 @@ import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; @@ -39,9 +39,9 @@ public class ExcelDictConvert implements Converter { String label = cellData.getStringValue(); String value; if (StringUtils.isBlank(type)) { - value = ExcelUtils.reverseByExp(label, anno.readConverterExp(), anno.separator()); + value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); } else { - value = ExcelUtils.reverseDictByExp(label, type, anno.separator()); + value = ExcelUtil.reverseDictByExp(label, type, anno.separator()); } return Convert.convert(contentProperty.getField().getType(), value); } @@ -56,9 +56,9 @@ public class ExcelDictConvert implements Converter { String value = Convert.toStr(object); String label; if (StringUtils.isBlank(type)) { - label = ExcelUtils.convertByExp(value, anno.readConverterExp(), anno.separator()); + label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); } else { - label = ExcelUtils.convertDictByExp(value, type, anno.separator()); + label = ExcelUtil.convertDictByExp(value, type, anno.separator()); } return new CellData<>(label); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index e60abf2f1..f242d8cb1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -1,1071 +1,150 @@ package com.ruoyi.common.utils.poi; -import cn.hutool.core.convert.Convert; -import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.annotation.Excel.ColumnType; -import com.ruoyi.common.annotation.Excel.Type; -import com.ruoyi.common.annotation.Excels; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.exception.CustomException; -import com.ruoyi.common.utils.DateUtils; +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.file.FileTypeUtils; -import com.ruoyi.common.utils.file.ImageUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddressList; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFDataValidation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.ruoyi.common.utils.file.FileUtils; -import java.io.*; -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.util.*; -import java.util.stream.Collectors; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; /** * Excel相关处理 * * @author ruoyi */ -public class ExcelUtil -{ - private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); +public class ExcelUtil { - /** - * Excel sheet最大行数,默认65536 - */ - public static final int sheetSize = 65536; + /** + * 对excel表单默认第一个索引名转换成list(EasyExcel) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static List importExcel(InputStream is, Class clazz) { + return EasyExcel.read(is).autoCloseStream(false).sheet().doReadSync(); + } - /** - * 工作表名称 - */ - private String sheetName; + /** + * 对list数据源将其里面的数据导入到excel表单(EasyExcel) + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { + try { + String filename = encodingFilename(sheetName); + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(filename, StandardCharsets.UTF_8.toString())); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + ServletOutputStream os = response.getOutputStream(); + EasyExcel.write(os, clazz) + .autoCloseStream(false) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .sheet(sheetName).doWrite(list); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } - /** - * 导出类型(EXPORT:导出数据;IMPORT:导入模板) - */ - private Type type; + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } - /** - * 工作薄对象 - */ - private Workbook wb; + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } - /** - * 工作表对象 - */ - private Sheet sheet; + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } - /** - * 样式列表 - */ - private Map styles; + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } - /** - * 导入导出数据列表 - */ - private List list; + /** + * 编码文件名 + */ + public static String encodingFilename(String filename) { + return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; + } - /** - * 注解列表 - */ - private List fields; - - /** - * 最大高度 - */ - private short maxHeight; - - /** - * 统计列表 - */ - private Map statistics = new HashMap(); - - /** - * 数字格式 - */ - private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); - - /** - * 实体对象 - */ - public Class clazz; - - public ExcelUtil(Class clazz) - { - this.clazz = clazz; - } - - public void init(List list, String sheetName, Type type) - { - if (list == null) - { - list = new ArrayList(); - } - this.list = list; - this.sheetName = sheetName; - this.type = type; - createExcelField(); - createWorkbook(); - } - - /** - * 对excel表单默认第一个索引名转换成list - * - * @param is 输入流 - * @return 转换后集合 - */ - public List importExcel(InputStream is) throws Exception - { - return importExcel(StringUtils.EMPTY, is); - } - - /** - * 对excel表单指定表格索引名转换成list - * - * @param sheetName 表格索引名 - * @param is 输入流 - * @return 转换后集合 - */ - public List importExcel(String sheetName, InputStream is) throws Exception - { - this.type = Type.IMPORT; - this.wb = WorkbookFactory.create(is); - List list = new ArrayList(); - Sheet sheet = null; - if (StringUtils.isNotEmpty(sheetName)) - { - // 如果指定sheet名,则取指定sheet中的内容. - sheet = wb.getSheet(sheetName); - } - else - { - // 如果传入的sheet名不存在则默认指向第1个sheet. - sheet = wb.getSheetAt(0); - } - - if (sheet == null) - { - throw new IOException("文件sheet不存在"); - } - - int rows = sheet.getPhysicalNumberOfRows(); - - if (rows > 0) - { - // 定义一个map用于存放excel列的序号和field. - Map cellMap = new HashMap(); - // 获取表头 - Row heard = sheet.getRow(0); - for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) - { - Cell cell = heard.getCell(i); - if (StringUtils.isNotNull(cell)) - { - String value = this.getCellValue(heard, i).toString(); - cellMap.put(value, i); - } - else - { - cellMap.put(null, i); - } - } - // 有数据时才处理 得到类的所有field. - Field[] allFields = clazz.getDeclaredFields(); - // 定义一个map用于存放列的序号和field. - Map fieldsMap = new HashMap(); - for (int col = 0; col < allFields.length; col++) - { - Field field = allFields[col]; - Excel attr = field.getAnnotation(Excel.class); - if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) - { - // 设置类的私有字段属性可访问. - field.setAccessible(true); - Integer column = cellMap.get(attr.name()); - if (column != null) - { - fieldsMap.put(column, field); - } - } - } - for (int i = 1; i < rows; i++) - { - // 从第2行开始取数据,默认第一行是表头. - Row row = sheet.getRow(i); - if(row == null) - { - continue; - } - T entity = null; - for (Map.Entry entry : fieldsMap.entrySet()) - { - Object val = this.getCellValue(row, entry.getKey()); - - // 如果不存在实例则新建. - entity = (entity == null ? clazz.newInstance() : entity); - // 从map中得到对应列的field. - Field field = fieldsMap.get(entry.getKey()); - // 取得类型,并根据对象类型设置值. - Class fieldType = field.getType(); - if (String.class == fieldType) - { - String s = Convert.toStr(val); - if (StringUtils.endsWith(s, ".0")) - { - val = StringUtils.substringBefore(s, ".0"); - } - else - { - String dateFormat = field.getAnnotation(Excel.class).dateFormat(); - if (StringUtils.isNotEmpty(dateFormat)) - { - val = DateUtils.parseDateToStr(dateFormat, (Date) val); - } - else - { - val = Convert.toStr(val); - } - } - } - else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) - { - val = Convert.toInt(val); - } - else if (Long.TYPE == fieldType || Long.class == fieldType) - { - val = Convert.toLong(val); - } - else if (Double.TYPE == fieldType || Double.class == fieldType) - { - val = Convert.toDouble(val); - } - else if (Float.TYPE == fieldType || Float.class == fieldType) - { - val = Convert.toFloat(val); - } - else if (BigDecimal.class == fieldType) - { - val = Convert.toBigDecimal(val); - } - else if (Date.class == fieldType) - { - if (val instanceof String) - { - val = DateUtils.parseDate(val); - } - else if (val instanceof Double) - { - val = DateUtil.getJavaDate((Double) val); - } - } - else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) - { - val = Convert.toBool(val, false); - } - if (StringUtils.isNotNull(fieldType)) - { - Excel attr = field.getAnnotation(Excel.class); - String propertyName = field.getName(); - if (StringUtils.isNotEmpty(attr.targetAttr())) - { - propertyName = field.getName() + "." + attr.targetAttr(); - } - else if (StringUtils.isNotEmpty(attr.readConverterExp())) - { - val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); - } - else if (StringUtils.isNotEmpty(attr.dictType())) - { - val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); - } - ReflectUtils.invokeSetter(entity, propertyName, val); - } - } - list.add(entity); - } - } - return list; - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @return 结果 - */ - public AjaxResult exportExcel(List list, String sheetName) - { - this.init(list, sheetName, Type.EXPORT); - return exportExcel(); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * - * @param sheetName 工作表的名称 - * @return 结果 - */ - public AjaxResult importTemplateExcel(String sheetName) - { - this.init(null, sheetName, Type.IMPORT); - return exportExcel(); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * - * @return 结果 - */ - public AjaxResult exportExcel() - { - OutputStream out = null; - try - { - // 取出一共有多少个sheet. - double sheetNo = Math.ceil(list.size() / sheetSize); - for (int index = 0; index <= sheetNo; index++) - { - createSheet(sheetNo, index); - - // 产生一行 - Row row = sheet.createRow(0); - int column = 0; - // 写入各个字段的列头名称 - for (Object[] os : fields) - { - Excel excel = (Excel) os[1]; - this.createCell(excel, row, column++); - } - if (Type.EXPORT.equals(type)) - { - fillExcelData(index, row); - addStatisticsRow(); - } - } - String filename = encodingFilename(sheetName); - out = new FileOutputStream(getAbsoluteFile(filename)); - wb.write(out); - return AjaxResult.success(filename); - } - catch (Exception e) - { - log.error("导出Excel异常{}", e.getMessage()); - throw new CustomException("导出Excel失败,请联系网站管理员!"); - } - finally - { - if (wb != null) - { - try - { - wb.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - if (out != null) - { - try - { - out.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - } - } - - /** - * 填充excel数据 - * - * @param index 序号 - * @param row 单元格行 - */ - public void fillExcelData(int index, Row row) - { - int startNo = index * sheetSize; - int endNo = Math.min(startNo + sheetSize, list.size()); - for (int i = startNo; i < endNo; i++) - { - row = sheet.createRow(i + 1 - startNo); - // 得到导出对象. - T vo = (T) list.get(i); - int column = 0; - for (Object[] os : fields) - { - Field field = (Field) os[0]; - Excel excel = (Excel) os[1]; - // 设置实体类私有属性可访问 - field.setAccessible(true); - this.addCell(excel, row, vo, field, column++); - } - } - } - - /** - * 创建表格样式 - * - * @param wb 工作薄对象 - * @return 样式列表 - */ - private Map createStyles(Workbook wb) - { - // 写入各条记录,每条记录对应excel表中的一行 - Map styles = new HashMap(); - CellStyle style = wb.createCellStyle(); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); - style.setBorderRight(BorderStyle.THIN); - style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderLeft(BorderStyle.THIN); - style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderTop(BorderStyle.THIN); - style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderBottom(BorderStyle.THIN); - style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - Font dataFont = wb.createFont(); - dataFont.setFontName("Arial"); - dataFont.setFontHeightInPoints((short) 10); - style.setFont(dataFont); - styles.put("data", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); - style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setFillPattern(FillPatternType.SOLID_FOREGROUND); - Font headerFont = wb.createFont(); - headerFont.setFontName("Arial"); - headerFont.setFontHeightInPoints((short) 10); - headerFont.setBold(true); - headerFont.setColor(IndexedColors.WHITE.getIndex()); - style.setFont(headerFont); - styles.put("header", style); - - style = wb.createCellStyle(); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); - Font totalFont = wb.createFont(); - totalFont.setFontName("Arial"); - totalFont.setFontHeightInPoints((short) 10); - style.setFont(totalFont); - styles.put("total", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(HorizontalAlignment.LEFT); - styles.put("data1", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(HorizontalAlignment.CENTER); - styles.put("data2", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(HorizontalAlignment.RIGHT); - styles.put("data3", style); - - return styles; - } - - /** - * 创建单元格 - */ - public Cell createCell(Excel attr, Row row, int column) - { - // 创建列 - Cell cell = row.createCell(column); - // 写入列信息 - cell.setCellValue(attr.name()); - setDataValidation(attr, row, column); - cell.setCellStyle(styles.get("header")); - return cell; - } - - /** - * 设置单元格信息 - * - * @param value 单元格值 - * @param attr 注解相关 - * @param cell 单元格信息 - */ - public void setCellVo(Object value, Excel attr, Cell cell) - { - if (ColumnType.STRING == attr.cellType()) - { - cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); - } - else if (ColumnType.NUMERIC == attr.cellType()) - { - if (StringUtils.isNotNull(value)) - { - cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); - } - } - else if (ColumnType.IMAGE == attr.cellType()) - { - ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), - cell.getRow().getRowNum() + 1); - String imagePath = Convert.toStr(value); - if (StringUtils.isNotEmpty(imagePath)) - { - byte[] data = ImageUtils.getImage(imagePath); - getDrawingPatriarch(cell.getSheet()).createPicture(anchor, - cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); - } - } - } - - /** - * 获取画布 - */ - public static Drawing getDrawingPatriarch(Sheet sheet) - { - if (sheet.getDrawingPatriarch() == null) - { - sheet.createDrawingPatriarch(); - } - return sheet.getDrawingPatriarch(); - } - - /** - * 获取图片类型,设置图片插入类型 - */ - public int getImageType(byte[] value) - { - String type = FileTypeUtils.getFileExtendName(value); - if ("JPG".equalsIgnoreCase(type)) - { - return Workbook.PICTURE_TYPE_JPEG; - } - else if ("PNG".equalsIgnoreCase(type)) - { - return Workbook.PICTURE_TYPE_PNG; - } - return Workbook.PICTURE_TYPE_JPEG; - } - - /** - * 创建表格样式 - */ - public void setDataValidation(Excel attr, Row row, int column) - { - if (attr.name().indexOf("注:") >= 0) - { - sheet.setColumnWidth(column, 6000); - } - else - { - // 设置列宽 - sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); - } - // 如果设置了提示信息则鼠标放上去提示. - if (StringUtils.isNotEmpty(attr.prompt())) - { - // 这里默认设了2-101列提示. - setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); - } - // 如果设置了combo属性则本列只能选择不能输入 - if (attr.combo().length > 0) - { - // 这里默认设了2-101列只能选择不能输入. - setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); - } - } - - /** - * 添加单元格 - */ - public Cell addCell(Excel attr, Row row, T vo, Field field, int column) - { - Cell cell = null; - try - { - // 设置行高 - row.setHeight(maxHeight); - // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. - if (attr.isExport()) - { - // 创建cell - cell = row.createCell(column); - int align = attr.align().value(); - cell.setCellStyle(styles.get("data" + (align >= 1 && align <= 3 ? align : ""))); - - // 用于读取对象中的属性 - Object value = getTargetValue(vo, field, attr); - String dateFormat = attr.dateFormat(); - String readConverterExp = attr.readConverterExp(); - String separator = attr.separator(); - String dictType = attr.dictType(); - if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) - { - cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); - } - else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) - { - cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); - } - else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) - { - cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); - } - else if (value instanceof BigDecimal && -1 != attr.scale()) - { - cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); - } - else - { - // 设置列类型 - setCellVo(value, attr, cell); - } - addStatisticsData(column, Convert.toStr(value), attr); - } - } - catch (Exception e) - { - log.error("导出Excel失败{}", e); - } - return cell; - } - - /** - * 设置 POI XSSFSheet 单元格提示 - * - * @param sheet 表单 - * @param promptTitle 提示标题 - * @param promptContent 提示内容 - * @param firstRow 开始行 - * @param endRow 结束行 - * @param firstCol 开始列 - * @param endCol 结束列 - */ - public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, - int firstCol, int endCol) - { - DataValidationHelper helper = sheet.getDataValidationHelper(); - DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); - CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); - DataValidation dataValidation = helper.createValidation(constraint, regions); - dataValidation.createPromptBox(promptTitle, promptContent); - dataValidation.setShowPromptBox(true); - sheet.addValidationData(dataValidation); - } - - /** - * 设置某些列的值只能输入预制的数据,显示下拉框. - * - * @param sheet 要设置的sheet. - * @param textlist 下拉框显示的内容 - * @param firstRow 开始行 - * @param endRow 结束行 - * @param firstCol 开始列 - * @param endCol 结束列 - * @return 设置好的sheet. - */ - public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) - { - DataValidationHelper helper = sheet.getDataValidationHelper(); - // 加载下拉列表内容 - DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); - // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 - CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); - // 数据有效性对象 - DataValidation dataValidation = helper.createValidation(constraint, regions); - // 处理Excel兼容性问题 - if (dataValidation instanceof XSSFDataValidation) - { - dataValidation.setSuppressDropDownArrow(true); - dataValidation.setShowErrorBox(true); - } - else - { - dataValidation.setSuppressDropDownArrow(false); - } - - sheet.addValidationData(dataValidation); - } - - /** - * 解析导出值 0=男,1=女,2=未知 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String convertByExp(String propertyValue, String converterExp, String separator) - { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) - { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) - { - for (String value : propertyValue.split(separator)) - { - if (itemArray[0].equals(value)) - { - propertyString.append(itemArray[1] + separator); - break; - } - } - } - else - { - if (itemArray[0].equals(propertyValue)) - { - return itemArray[1]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 反向解析值 男=0,女=1,未知=2 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String reverseByExp(String propertyValue, String converterExp, String separator) - { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) - { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) - { - for (String value : propertyValue.split(separator)) - { - if (itemArray[1].equals(value)) - { - propertyString.append(itemArray[0] + separator); - break; - } - } - } - else - { - if (itemArray[1].equals(propertyValue)) - { - return itemArray[0]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 解析字典值 - * - * @param dictValue 字典值 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String convertDictByExp(String dictValue, String dictType, String separator) - { - return DictUtils.getDictLabel(dictType, dictValue, separator); - } - - /** - * 反向解析值字典值 - * - * @param dictLabel 字典标签 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典值 - */ - public static String reverseDictByExp(String dictLabel, String dictType, String separator) - { - return DictUtils.getDictValue(dictType, dictLabel, separator); - } - - /** - * 合计统计信息 - */ - private void addStatisticsData(Integer index, String text, Excel entity) - { - if (entity != null && entity.isStatistics()) - { - Double temp = 0D; - if (!statistics.containsKey(index)) - { - statistics.put(index, temp); - } - try - { - temp = Double.valueOf(text); - } - catch (NumberFormatException e) - { - } - statistics.put(index, statistics.get(index) + temp); - } - } - - /** - * 创建统计行 - */ - public void addStatisticsRow() - { - if (statistics.size() > 0) - { - Cell cell = null; - Row row = sheet.createRow(sheet.getLastRowNum() + 1); - Set keys = statistics.keySet(); - cell = row.createCell(0); - cell.setCellStyle(styles.get("total")); - cell.setCellValue("合计"); - - for (Integer key : keys) - { - cell = row.createCell(key); - cell.setCellStyle(styles.get("total")); - cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); - } - statistics.clear(); - } - } - - /** - * 编码文件名 - */ - public String encodingFilename(String filename) - { - filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; - return filename; - } - - /** - * 获取下载路径 - * - * @param filename 文件名称 - */ - public String getAbsoluteFile(String filename) - { - String downloadPath = RuoYiConfig.getDownloadPath() + filename; - File desc = new File(downloadPath); - if (!desc.getParentFile().exists()) - { - desc.getParentFile().mkdirs(); - } - return downloadPath; - } - - /** - * 获取bean中的属性值 - * - * @param vo 实体对象 - * @param field 字段 - * @param excel 注解 - * @return 最终的属性值 - * @throws Exception - */ - private Object getTargetValue(T vo, Field field, Excel excel) throws Exception - { - Object o = field.get(vo); - if (StringUtils.isNotEmpty(excel.targetAttr())) - { - String target = excel.targetAttr(); - if (target.contains(".")) - { - String[] targets = target.split("[.]"); - for (String name : targets) - { - o = getValue(o, name); - } - } - else - { - o = getValue(o, target); - } - } - return o; - } - - /** - * 以类的属性的get方法方法形式获取值 - * - * @param o - * @param name - * @return value - * @throws Exception - */ - private Object getValue(Object o, String name) throws Exception - { - if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) - { - Class clazz = o.getClass(); - Field field = clazz.getDeclaredField(name); - field.setAccessible(true); - o = field.get(o); - } - return o; - } - - /** - * 得到所有定义字段 - */ - private void createExcelField() - { - this.fields = new ArrayList(); - List tempFields = new ArrayList<>(); - tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); - tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); - for (Field field : tempFields) - { - // 单注解 - if (field.isAnnotationPresent(Excel.class)) - { - putToField(field, field.getAnnotation(Excel.class)); - } - - // 多注解 - if (field.isAnnotationPresent(Excels.class)) - { - Excels attrs = field.getAnnotation(Excels.class); - Excel[] excels = attrs.value(); - for (Excel excel : excels) - { - putToField(field, excel); - } - } - } - this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); - this.maxHeight = getRowHeight(); - } - - /** - * 根据注解获取最大行高 - */ - public short getRowHeight() - { - double maxHeight = 0; - for (Object[] os : this.fields) - { - Excel excel = (Excel) os[1]; - maxHeight = maxHeight > excel.height() ? maxHeight : excel.height(); - } - return (short) (maxHeight * 20); - } - - /** - * 放到字段集合中 - */ - private void putToField(Field field, Excel attr) - { - if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) - { - this.fields.add(new Object[] { field, attr }); - } - } - - /** - * 创建一个工作簿 - */ - public void createWorkbook() - { - this.wb = new SXSSFWorkbook(500); - } - - /** - * 创建工作表 - * - * @param sheetNo sheet数量 - * @param index 序号 - */ - public void createSheet(double sheetNo, int index) - { - this.sheet = wb.createSheet(); - this.styles = createStyles(wb); - // 设置工作表的名称. - if (sheetNo == 0) - { - wb.setSheetName(index, sheetName); - } - else - { - wb.setSheetName(index, sheetName + index); - } - } - - /** - * 获取单元格值 - * - * @param row 获取的行 - * @param column 获取单元格列号 - * @return 单元格值 - */ - public Object getCellValue(Row row, int column) - { - if (row == null) - { - return row; - } - Object val = ""; - try - { - Cell cell = row.getCell(column); - if (StringUtils.isNotNull(cell)) - { - if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) - { - val = cell.getNumericCellValue(); - if (DateUtil.isCellDateFormatted(cell)) - { - val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 - } - else - { - if ((Double) val % 1 != 0) - { - val = new BigDecimal(val.toString()); - } - else - { - val = new DecimalFormat("0").format(val); - } - } - } - else if (cell.getCellType() == CellType.STRING) - { - val = cell.getStringCellValue(); - } - else if (cell.getCellType() == CellType.BOOLEAN) - { - val = cell.getBooleanCellValue(); - } - else if (cell.getCellType() == CellType.ERROR) - { - val = cell.getErrorCellValue(); - } - - } - } - catch (Exception e) - { - return val; - } - return val; - } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index afec84d86..a393c9199 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -20,6 +20,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Arrays; @@ -68,10 +69,9 @@ public class TestDemoController extends BaseController { @PreAuthorize("@ss.hasPermi('demo:demo:export')") @Log(title = "测试单表", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult export(@Validated TestDemoBo bo) { + public void export(@Validated TestDemoBo bo, HttpServletResponse response) { List list = iTestDemoService.queryList(bo); - ExcelUtil util = new ExcelUtil(TestDemoVo.class); - return util.exportExcel(list, "测试单表"); + ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); } /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index 8cab868ce..63b1743ff 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -19,6 +19,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Arrays; @@ -57,10 +58,9 @@ public class TestTreeController extends BaseController { @PreAuthorize("@ss.hasPermi('demo:tree:export')") @Log(title = "测试树表", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult export(@Validated TestTreeBo bo) { + public void export(@Validated TestTreeBo bo, HttpServletResponse response) { List list = iTestTreeService.queryList(bo); - ExcelUtil util = new ExcelUtil(TestTreeVo.class); - return util.exportExcel(list, "测试树表"); + ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response); } /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java index 9ab4ba952..3c8e45234 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java @@ -1,9 +1,11 @@ package com.ruoyi.demo.domain.vo; -import com.ruoyi.common.annotation.Excel; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + import java.util.Date; @@ -16,6 +18,7 @@ import java.util.Date; */ @Data @ApiModel("测试单表视图对象") +@ExcelIgnoreUnannotated public class TestDemoVo { private static final long serialVersionUID = 1L; @@ -29,63 +32,63 @@ public class TestDemoVo { /** * 部门id */ - @Excel(name = "部门id") + @ExcelProperty(value = "部门id") @ApiModelProperty("部门id") private Long deptId; /** * 用户id */ - @Excel(name = "用户id") + @ExcelProperty(value = "用户id") @ApiModelProperty("用户id") private Long userId; /** * 排序号 */ - @Excel(name = "排序号") + @ExcelProperty(value = "排序号") @ApiModelProperty("排序号") private Long orderNum; /** * key键 */ - @Excel(name = "key键") + @ExcelProperty(value = "key键") @ApiModelProperty("key键") private String testKey; /** * 值 */ - @Excel(name = "值") + @ExcelProperty(value = "值") @ApiModelProperty("值") private String value; /** * 创建时间 */ - @Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd") + @ExcelProperty(value = "创建时间") @ApiModelProperty("创建时间") private Date createTime; /** * 创建人 */ - @Excel(name = "创建人") + @ExcelProperty(value = "创建人") @ApiModelProperty("创建人") private String createBy; /** * 更新时间 */ - @Excel(name = "更新时间" , width = 30, dateFormat = "yyyy-MM-dd") + @ExcelProperty(value = "更新时间") @ApiModelProperty("更新时间") private Date updateTime; /** * 更新人 */ - @Excel(name = "更新人") + @ExcelProperty(value = "更新人") @ApiModelProperty("更新人") private String updateBy; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java index a299c4a46..dab816243 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java @@ -1,9 +1,11 @@ package com.ruoyi.demo.domain.vo; -import com.ruoyi.common.annotation.Excel; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + import java.util.Date; @@ -16,6 +18,7 @@ import java.util.Date; */ @Data @ApiModel("测试树表视图对象") +@ExcelIgnoreUnannotated public class TestTreeVo { private static final long serialVersionUID = 1L; @@ -29,35 +32,35 @@ public class TestTreeVo { /** * 父id */ - @Excel(name = "父id") + @ExcelProperty(value = "父id") @ApiModelProperty("父id") private Long parentId; /** * 部门id */ - @Excel(name = "部门id") + @ExcelProperty(value = "部门id") @ApiModelProperty("部门id") private Long deptId; /** * 用户id */ - @Excel(name = "用户id") + @ExcelProperty(value = "用户id") @ApiModelProperty("用户id") private Long userId; /** * 树节点名 */ - @Excel(name = "树节点名") + @ExcelProperty(value = "树节点名") @ApiModelProperty("树节点名") private String treeName; /** * 创建时间 */ - @Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd") + @ExcelProperty(value = "创建时间") @ApiModelProperty("创建时间") private Date createTime; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java index 353678fbd..cbb526f6e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java @@ -9,7 +9,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.quartz.util.CronUtils; @@ -52,7 +52,7 @@ public class SysJobController extends BaseController public void export(SysJob sysJob, HttpServletResponse response) { List list = jobService.selectJobList(sysJob); - ExcelUtils.exportExcel(list, "定时任务", SysJob.class, response); + ExcelUtil.exportExcel(list, "定时任务", SysJob.class, response); } /** diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java index b3c966d8b..6fcba3994 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java @@ -5,7 +5,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.quartz.domain.SysJobLog; import com.ruoyi.quartz.service.ISysJobLogService; import org.springframework.beans.factory.annotation.Autowired; @@ -46,7 +46,7 @@ public class SysJobLogController extends BaseController public void export(SysJobLog sysJobLog, HttpServletResponse response) { List list = jobLogService.selectJobLogList(sysJobLog); - ExcelUtils.exportExcel(list, "调度日志", SysJobLog.class, response); + ExcelUtil.exportExcel(list, "调度日志", SysJobLog.class, response); } /** diff --git a/ruoyi-ui/src/api/demo/demo.js b/ruoyi-ui/src/api/demo/demo.js index c7195afbd..04d40256f 100644 --- a/ruoyi-ui/src/api/demo/demo.js +++ b/ruoyi-ui/src/api/demo/demo.js @@ -52,11 +52,3 @@ export function delDemo(id) { }) } -// 导出测试单表 -export function exportDemo(query) { - return request({ - url: '/demo/demo/export', - method: 'get', - params: query - }) -} diff --git a/ruoyi-ui/src/api/demo/tree.js b/ruoyi-ui/src/api/demo/tree.js index d597e7261..4c7ebc070 100644 --- a/ruoyi-ui/src/api/demo/tree.js +++ b/ruoyi-ui/src/api/demo/tree.js @@ -42,12 +42,3 @@ export function delTree(id) { method: 'delete' }) } - -// 导出测试树表 -export function exportTree(query) { - return request({ - url: '/demo/tree/export', - method: 'get', - params: query - }) -} \ No newline at end of file diff --git a/ruoyi-ui/src/views/demo/demo/index.vue b/ruoyi-ui/src/views/demo/demo/index.vue index c2ef2e005..a0d9edc72 100644 --- a/ruoyi-ui/src/views/demo/demo/index.vue +++ b/ruoyi-ui/src/views/demo/demo/index.vue @@ -169,7 +169,8 @@ diff --git a/sql/sys_oss_config.sql b/sql/sys_oss_config.sql new file mode 100644 index 000000000..5d6442075 --- /dev/null +++ b/sql/sys_oss_config.sql @@ -0,0 +1,45 @@ +/* +Navicat MySQL Data Transfer + +Source Server : mysql57 +Source Server Version : 50735 +Source Host : localhost:3306 +Source Database : ry-vue + +Target Server Type : MYSQL +Target Server Version : 50735 +File Encoding : 65001 + +Date: 2021-08-12 09:01:33 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for sys_oss_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oss_config`; +CREATE TABLE `sys_oss_config` ( + `oss_config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '主建', + `config_key` varchar(255) NOT NULL DEFAULT '' COMMENT '配置key', + `access_key` varchar(255) DEFAULT '' COMMENT 'access_key', + `secret_key` varchar(255) DEFAULT '' COMMENT '秘钥', + `bucket_name` varchar(255) DEFAULT '' COMMENT '桶名称', + `prefix` varchar(255) DEFAULT '' COMMENT '前缀', + `endpoint` varchar(255) DEFAULT '' COMMENT '访问站点', + `is_https` char(1) DEFAULT '0' COMMENT '是否htpps(0否 1是)', + `region` varchar(255) DEFAULT '' COMMENT '域', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `ext1` varchar(255) DEFAULT '' COMMENT '扩展字段', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`oss_config_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='云存储配置表'; + +-- ---------------------------- +-- Records of sys_oss_config +-- ---------------------------- +INSERT INTO `sys_oss_config` VALUES ('1', 'minio3', 'ruoyi', 'ruoyi123', 'ruoyi', '', 'http://localhost:9000', '0', '', '0', '', 'admin', '2021-08-11 21:29:37', 'admin', '2021-08-11 22:52:41', null); From 5139265d32cd9de6067b29a5a6f3deb2991cd2f5 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 13 Aug 2021 10:10:29 +0800 Subject: [PATCH 082/106] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8keep-alive=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/system/service/impl/SysConfigServiceImpl.java | 1 - .../com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java | 1 - ruoyi-ui/src/router/index.js | 4 ++-- ruoyi-ui/src/utils/request.js | 2 +- ruoyi-ui/src/views/index.vue | 2 +- ruoyi-ui/src/views/system/role/selectUser.vue | 2 +- 6 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 278841f6f..bb3b47a6a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -13,7 +13,6 @@ import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.service.ISysConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import javax.annotation.PostConstruct; import java.util.Collection; import java.util.List; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index daad3034f..6179c3554 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -12,7 +12,6 @@ import com.ruoyi.system.service.ISysDictTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import javax.annotation.PostConstruct; import java.util.List; diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js index b593898e5..95824b3f2 100644 --- a/ruoyi-ui/src/router/index.js +++ b/ruoyi-ui/src/router/index.js @@ -66,8 +66,8 @@ export const constantRoutes = [ { path: 'index', component: (resolve) => require(['@/views/index'], resolve), - name: '首页', - meta: { title: '首页', icon: 'dashboard', noCache: true, affix: true } + name: 'Index', + meta: { title: '首页', icon: 'dashboard', affix: true } } ] }, diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index b9b5ad80d..7a058e870 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -64,7 +64,7 @@ service.interceptors.response.use(res => { location.href = '/index'; }) }).catch(() => {}); - return Promise.reject() + return Promise.reject('令牌验证失败') } else if (code === 500) { Message({ message: msg, diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index 37c439b17..2d7df7b62 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -601,7 +601,7 @@ diff --git a/ruoyi-ui/src/views/system/oss/index.vue b/ruoyi-ui/src/views/system/oss/index.vue index e8e471e47..2bbbba060 100644 --- a/ruoyi-ui/src/views/system/oss/index.vue +++ b/ruoyi-ui/src/views/system/oss/index.vue @@ -96,6 +96,15 @@ v-hasPermi="['system:oss:remove']" >删除 + + 预览开关 : {{previewListResource ? "禁用" : "启用"}} + - - + + + + + From 25b47db3cb5f99c1b266138444587c3bb026dd60 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, 15 Aug 2021 16:59:46 +0800 Subject: [PATCH 095/106] =?UTF-8?q?update=20=E7=A7=BB=E9=99=A4Spring?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=20=E6=94=B9=E4=B8=BA=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=20=E5=B9=B6=E4=BD=BF=E7=94=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=97=B6=E9=97=B4=E7=A1=AE=E4=BF=9D=E9=9B=86=E7=BE=A4?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9C=80=E7=BB=88=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/oss/factory/OssFactory.java | 49 ++++++++++++------- .../properties/CloudStorageProperties.java | 7 +++ .../oss/service/ICloudStorageStrategy.java | 2 +- .../service/impl/SysOssConfigServiceImpl.java | 36 +++++++------- 4 files changed, 57 insertions(+), 37 deletions(-) diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java index ea64b27ac..129068561 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java @@ -12,6 +12,7 @@ import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.CloudStorageProperties; import com.ruoyi.oss.service.ICloudStorageStrategy; +import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -22,15 +23,27 @@ import java.util.concurrent.ConcurrentHashMap; */ public class OssFactory { - private static RedisCache redisCache; + private static RedisCache redisCache; static { OssFactory.redisCache = SpringUtils.getBean(RedisCache.class); } + /** + * 服务实例缓存 + */ private static final Map SERVICES = new ConcurrentHashMap<>(); + /** + * 服务配置更新时间缓存 + */ + private static final Map SERVICES_UPDATE_TIME = new ConcurrentHashMap<>(); + + /** + * 获取默认实例 + */ public static ICloudStorageStrategy instance() { + // 获取redis 默认类型 String type = Convert.toStr(redisCache.getCacheObject(CloudConstant.CACHE_CONFIG_KEY)); if (StringUtils.isEmpty(type)) { throw new OssException("文件存储服务类型无法找到!"); @@ -38,27 +51,27 @@ public class OssFactory { return instance(type); } + /** + * 根据类型获取实例 + */ public static ICloudStorageStrategy instance(String type) { ICloudStorageStrategy service = SERVICES.get(type); - if (service == null) { - Object json = redisCache.getCacheObject(CloudConstant.SYS_OSS_KEY + type); - CloudStorageProperties properties = JsonUtils.parseObject(json.toString(), CloudStorageProperties.class); - String beanName = CloudServiceEnumd.getServiceName(type); - ICloudStorageStrategy bean = (ICloudStorageStrategy) ReflectUtils.newInstance(CloudServiceEnumd.getServiceClass(type), properties); - SpringUtils.registerBean(beanName, bean); - service = SpringUtils.getBean(beanName); - SERVICES.put(type, bean); + Date oldDate = SERVICES_UPDATE_TIME.get(type); + Object json = redisCache.getCacheObject(CloudConstant.SYS_OSS_KEY + type); + CloudStorageProperties properties = JsonUtils.parseObject(json.toString(), CloudStorageProperties.class); + if (properties == null) { + throw new OssException("系统异常, '" + type + "'配置信息不存在!"); } + Date nowDate = properties.getUpdateTime(); + // 服务存在并更新时间相同则返回(使用更新时间确保配置最终一致性) + if (service != null && oldDate.equals(nowDate)) { + return service; + } + // 获取redis配置信息 创建对象 并缓存 + service = (ICloudStorageStrategy) ReflectUtils.newInstance(CloudServiceEnumd.getServiceClass(type), properties); + SERVICES.put(type, service); + SERVICES_UPDATE_TIME.put(type, nowDate); return service; } - public static void destroy(String type) { - ICloudStorageStrategy service = SERVICES.get(type); - if (service == null) { - return; - } - SpringUtils.unregisterBean(CloudServiceEnumd.getServiceName(type)); - SERVICES.remove(type); - } - } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java index d1bafdecf..1c62ae2ca 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java @@ -2,6 +2,8 @@ package com.ruoyi.oss.properties; import lombok.Data; +import java.util.Date; + /** * OSS云存储 配置属性 * @@ -45,4 +47,9 @@ public class CloudStorageProperties { */ private String isHttps; + /** + * 更新时间 + */ + private Date updateTime; + } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java index 6f8ed85ca..f91fc7af6 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java @@ -70,5 +70,5 @@ public interface ICloudStorageStrategy { */ UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); - String getEndpointLink(); + String getEndpointLink(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java index 49bf1fabc..a202790b1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java @@ -15,7 +15,6 @@ import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.constant.CloudConstant; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.system.domain.SysOssConfig; import com.ruoyi.system.domain.bo.SysOssConfigBo; import com.ruoyi.system.domain.vo.SysOssConfigVo; @@ -54,7 +53,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl Date: Sun, 15 Aug 2021 10:26:05 +0000 Subject: [PATCH 096/106] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=90=8D=E5=8D=95=E8=AF=8D=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 3d95f3175..ff789d522 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -195,11 +195,11 @@ public class ExcelUtil Map pictures; if (isXSSFWorkbook) { - pictures = getSheetPictrues07((XSSFSheet) sheet, (XSSFWorkbook) wb); + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); } else { - pictures = getSheetPictrues03((HSSFSheet) sheet, (HSSFWorkbook) wb); + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); } // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 int rows = sheet.getLastRowNum(); @@ -1196,7 +1196,7 @@ public class ExcelUtil * @param workbook 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ - public static Map getSheetPictrues03(HSSFSheet sheet, HSSFWorkbook workbook) + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { Map sheetIndexPicMap = new HashMap(); List pictures = workbook.getAllPictures(); @@ -1229,7 +1229,7 @@ public class ExcelUtil * @param workbook 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ - public static Map getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { Map sheetIndexPicMap = new HashMap(); for (POIXMLDocumentPart dr : sheet.getRelations()) From 57b159eb98577f910e586f3cf79356274d68db0f Mon Sep 17 00:00:00 2001 From: wangzhaoqiang Date: Mon, 16 Aug 2021 14:48:34 +0800 Subject: [PATCH 097/106] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E6=94=AF=E6=8C=81=E9=87=8D=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=9A=E7=BB=84=E6=97=A5=E6=9C=9F=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E6=B1=82=E5=8F=82=E6=95=B0=E4=B8=AD=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=9A=84=E5=B1=9E=E6=80=A7=E4=B8=BAnull=E3=80=81undef?= =?UTF-8?q?ined=E4=B8=8D=E8=BF=9B=E8=A1=8C=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/utils/request.js | 8 +++++--- ruoyi-ui/src/utils/ruoyi.js | 23 +++++++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 7a058e870..e95d01d91 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -28,9 +28,11 @@ service.interceptors.request.use(config => { if (value !== null && typeof(value) !== "undefined") { if (typeof value === 'object') { for (const key of Object.keys(value)) { - let params = propName + '[' + key + ']'; - var subPart = encodeURIComponent(params) + "="; - url += subPart + encodeURIComponent(value[key]) + "&"; + if (value[key] !== null && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + let subPart = encodeURIComponent(params) + '=' + url += subPart + encodeURIComponent(value[key]) + '&' + } } } else { url += part + encodeURIComponent(value) + "&"; diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index bf8390e97..db428850f 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -55,18 +55,17 @@ export function resetForm(refName) { // 添加日期范围 export function addDateRange(params, dateRange, propName) { - var search = params; - search.params = {}; - if (null != dateRange && '' != dateRange) { - if (typeof (propName) === "undefined") { - search.params["beginTime"] = dateRange[0]; - search.params["endTime"] = dateRange[1]; - } else { - search.params["begin" + propName] = dateRange[0]; - search.params["end" + propName] = dateRange[1]; - } - } - return search; + let search = params + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0] + search.params['endTime'] = dateRange[1] + } else { + search.params['begin' + propName] = dateRange[0] + search.params['end' + propName] = dateRange[1] + } + return search } // 回显数据字典 From 73d2ed4c0277869d3644fdc030d56ba06bbd03d6 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, 16 Aug 2021 16:18:36 +0800 Subject: [PATCH 098/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=BC=94=E7=A4=BAdemo=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/demo/controller/TestBatchController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java index 334f004cd..9a66fddff 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java @@ -5,6 +5,8 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.service.ITestDemoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; @@ -21,6 +23,7 @@ import java.util.List; * @author Lion Li * @date 2021-05-30 */ +@Api(value = "测试批量方法", tags = {"测试批量方法"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping("/demo/batch") @@ -31,7 +34,9 @@ public class TestBatchController extends BaseController { /** * 新增批量方法 ( 全量覆盖填充 ) */ + @ApiOperation(value = "新增批量方法") @PostMapping() +// @DataSource(DataSourceType.SLAVE) public AjaxResult add() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { @@ -41,10 +46,12 @@ public class TestBatchController extends BaseController { } /** - * 修改批量方法 + * 删除批量方法 */ + @ApiOperation(value = "删除批量方法") @DeleteMapping() - public AjaxResult edit() { +// @DataSource(DataSourceType.SLAVE) + public AjaxResult remove() { return toAjax(iTestDemoService.remove(new LambdaQueryWrapper() .eq(TestDemo::getOrderNum, -1L)) ? 1 : 0); } From 03cf98d3c92de33a4666a05369a4a6ae3c365e1c Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 16 Aug 2021 16:25:25 +0800 Subject: [PATCH 099/106] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/CustomException.java | 43 ---------- .../common/exception/GlobalException.java | 58 +++++++++++++ .../common/exception/ServiceException.java | 73 ++++++++++++++++ .../exception/{ => base}/BaseException.java | 2 +- .../common/exception/file/FileException.java | 2 +- .../common/exception/user/UserException.java | 2 +- .../com/ruoyi/common/utils/SecurityUtils.java | 10 +-- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 4 +- .../com/ruoyi/common/utils/sql/SqlUtil.java | 4 +- .../web/exception/GlobalExceptionHandler.java | 83 +++++++++---------- .../web/service/SysLoginService.java | 4 +- .../web/service/UserDetailsServiceImpl.java | 8 +- .../service/GenTableServiceImpl.java | 18 ++-- .../service/impl/SysConfigServiceImpl.java | 4 +- .../service/impl/SysDeptServiceImpl.java | 4 +- .../service/impl/SysDictTypeServiceImpl.java | 4 +- .../service/impl/SysPostServiceImpl.java | 4 +- .../service/impl/SysRoleServiceImpl.java | 6 +- .../service/impl/SysUserServiceImpl.java | 8 +- 19 files changed, 213 insertions(+), 128 deletions(-) delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java rename ruoyi-common/src/main/java/com/ruoyi/common/exception/{ => base}/BaseException.java (92%) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java deleted file mode 100644 index a99a1001c..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ruoyi.common.exception; - -/** - * 自定义异常 - * - * @author ruoyi - */ -public class CustomException extends RuntimeException -{ - private static final long serialVersionUID = 1L; - - private Integer code; - - private String message; - - public CustomException(String message) - { - this.message = message; - } - - public CustomException(String message, Integer code) - { - this.message = message; - this.code = code; - } - - public CustomException(String message, Throwable e) - { - super(message, e); - this.message = message; - } - - @Override - public String getMessage() - { - return message; - } - - public Integer getCode() - { - return code; - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java new file mode 100644 index 000000000..318b9aecc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.ruoyi.common.exception; + +/** + * 全局异常 + * + * @author ruoyi + */ +public class GlobalException extends RuntimeException +{ + + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java new file mode 100644 index 000000000..734e8fc5d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.exception; + +/** + * 业务异常 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java similarity index 92% rename from ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java rename to ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java index c1e55c176..3dd2c1ee7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/BaseException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java @@ -1,4 +1,4 @@ -package com.ruoyi.common.exception; +package com.ruoyi.common.exception.base; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.StringUtils; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java index f0ae563aa..ed14af126 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java @@ -1,6 +1,6 @@ package com.ruoyi.common.exception.file; -import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.exception.base.BaseException; /** * 文件信息异常类 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java index b85dab6dd..79160d861 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java @@ -1,6 +1,6 @@ package com.ruoyi.common.exception.user; -import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.exception.base.BaseException; /** * 用户信息异常类 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 479aea6b5..96e437b2a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -5,7 +5,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; /** * 安全服务工具类 @@ -25,7 +25,7 @@ public class SecurityUtils } catch (Exception e) { - throw new CustomException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); } } @@ -40,7 +40,7 @@ public class SecurityUtils } catch (Exception e) { - throw new CustomException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); } } @@ -55,7 +55,7 @@ public class SecurityUtils } catch (Exception e) { - throw new CustomException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); } } @@ -70,7 +70,7 @@ public class SecurityUtils } catch (Exception e) { - throw new CustomException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index ff789d522..54157f353 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -66,7 +66,7 @@ import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; @@ -450,7 +450,7 @@ public class ExcelUtil catch (Exception e) { log.error("导出Excel异常{}", e.getMessage()); - throw new CustomException("导出Excel失败,请联系网站管理员!"); + throw new UtilException("导出Excel失败,请联系网站管理员!"); } finally { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index 39e88ef76..ceff84132 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -1,6 +1,6 @@ package com.ruoyi.common.utils.sql; -import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.StringUtils; /** @@ -22,7 +22,7 @@ public class SqlUtil { if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { - throw new BaseException("参数不符合规范,不能进行查询"); + throw new UtilException("参数不符合规范,不能进行查询"); } return value; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 300fe9d29..bf0a7ed8f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,20 +1,18 @@ package com.ruoyi.framework.web.exception; +import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.authentication.AccountExpiredException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.NoHandlerFoundException; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.exception.BaseException; -import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; /** @@ -28,59 +26,58 @@ public class GlobalExceptionHandler private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** - * 基础异常 + * 权限校验异常 */ - @ExceptionHandler(BaseException.class) - public AjaxResult baseException(BaseException e) + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); return AjaxResult.error(e.getMessage()); } /** * 业务异常 */ - @ExceptionHandler(CustomException.class) - public AjaxResult businessException(CustomException e) - { - if (StringUtils.isNull(e.getCode())) - { - return AjaxResult.error(e.getMessage()); - } - return AjaxResult.error(e.getCode(), e.getMessage()); - } - - @ExceptionHandler(NoHandlerFoundException.class) - public AjaxResult handlerNoFoundException(Exception e) + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { log.error(e.getMessage(), e); - return AjaxResult.error(HttpStatus.NOT_FOUND, "路径不存在,请检查路径是否正确"); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); } - @ExceptionHandler(AccessDeniedException.class) - public AjaxResult handleAuthorizationException(AccessDeniedException e) + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { - log.error(e.getMessage()); - return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); - } - - @ExceptionHandler(AccountExpiredException.class) - public AjaxResult handleAccountExpiredException(AccountExpiredException e) - { - log.error(e.getMessage(), e); - return AjaxResult.error(e.getMessage()); - } - - @ExceptionHandler(UsernameNotFoundException.class) - public AjaxResult handleUsernameNotFoundException(UsernameNotFoundException e) - { - log.error(e.getMessage(), e); + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); return AjaxResult.error(e.getMessage()); } + /** + * 系统异常 + */ @ExceptionHandler(Exception.class) - public AjaxResult handleException(Exception e) + public AjaxResult handleException(Exception e, HttpServletRequest request) { - log.error(e.getMessage(), e); + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); return AjaxResult.error(e.getMessage()); } @@ -88,7 +85,7 @@ public class GlobalExceptionHandler * 自定义验证异常 */ @ExceptionHandler(BindException.class) - public AjaxResult validatedBindException(BindException e) + public AjaxResult handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); @@ -99,7 +96,7 @@ public class GlobalExceptionHandler * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) - public Object validExceptionHandler(MethodArgumentNotValidException e) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); @@ -110,7 +107,7 @@ public class GlobalExceptionHandler * 演示模式异常 */ @ExceptionHandler(DemoModeException.class) - public AjaxResult demoModeException(DemoModeException e) + public AjaxResult handleDemoModeException(DemoModeException e) { return AjaxResult.error("演示模式,不允许操作"); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 37c38866b..07bb03cfd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -11,7 +11,7 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; import com.ruoyi.common.exception.user.UserPasswordNotMatchException; @@ -82,7 +82,7 @@ public class SysLoginService else { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); - throw new CustomException(e.getMessage()); + throw new ServiceException(e.getMessage()); } } AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java index 43faf6456..575bd8d80 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserStatus; -import com.ruoyi.common.exception.BaseException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysUserService; @@ -37,17 +37,17 @@ public class UserDetailsServiceImpl implements UserDetailsService if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); - throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); + throw new ServiceException("登录用户:" + username + " 不存在"); } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); - throw new BaseException("对不起,您的账号:" + username + " 已被删除"); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { log.info("登录用户:{} 已被停用.", username); - throw new BaseException("对不起,您的账号:" + username + " 已停用"); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); } return createLoginUser(user); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 6ff6aea0e..f2ffbe951 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -25,7 +25,7 @@ import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.text.CharsetKit; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.domain.GenTable; @@ -180,7 +180,7 @@ public class GenTableServiceImpl implements IGenTableService } catch (Exception e) { - throw new CustomException("导入失败:" + e.getMessage()); + throw new ServiceException("导入失败:" + e.getMessage()); } } @@ -269,7 +269,7 @@ public class GenTableServiceImpl implements IGenTableService } catch (IOException e) { - throw new CustomException("渲染模板失败,表名:" + table.getTableName()); + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); } } } @@ -291,7 +291,7 @@ public class GenTableServiceImpl implements IGenTableService List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); if (StringUtils.isEmpty(dbTableColumns)) { - throw new CustomException("同步数据失败,原表结构不存在"); + throw new ServiceException("同步数据失败,原表结构不存在"); } List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); @@ -383,25 +383,25 @@ public class GenTableServiceImpl implements IGenTableService JSONObject paramsObj = JSONObject.parseObject(options); if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { - throw new CustomException("树编码字段不能为空"); + throw new ServiceException("树编码字段不能为空"); } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { - throw new CustomException("树父编码字段不能为空"); + throw new ServiceException("树父编码字段不能为空"); } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { - throw new CustomException("树名称字段不能为空"); + throw new ServiceException("树名称字段不能为空"); } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { if (StringUtils.isEmpty(genTable.getSubTableName())) { - throw new CustomException("关联子表的表名不能为空"); + throw new ServiceException("关联子表的表名不能为空"); } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { - throw new CustomException("子表关联的外键名不能为空"); + throw new ServiceException("子表关联的外键名不能为空"); } } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index bb3b47a6a..f65c0f532 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -6,7 +6,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.enums.DataSourceType; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; @@ -156,7 +156,7 @@ public class SysConfigServiceImpl implements ISysConfigService SysConfig config = selectConfigById(configId); if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { - throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); } configMapper.deleteConfigById(configId); redisCache.deleteObject(getCacheKey(config.getConfigKey())); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 2b081f9df..be87e0be5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -12,7 +12,7 @@ import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; @@ -184,7 +184,7 @@ public class SysDeptServiceImpl implements ISysDeptService // 如果父节点不为正常状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { - throw new CustomException("部门停用,不允许新增"); + throw new ServiceException("部门停用,不允许新增"); } dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); return deptMapper.insertDept(dept); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index 6179c3554..4fb15596d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDictDataMapper; @@ -122,7 +122,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService SysDictType dictType = selectDictTypeById(dictId); if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) { - throw new CustomException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); } dictTypeMapper.deleteDictTypeById(dictId); DictUtils.removeDictCache(dictType.getDictType()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 127ed3fbd..a1b3d21ef 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -4,7 +4,7 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.mapper.SysPostMapper; @@ -147,7 +147,7 @@ public class SysPostServiceImpl implements ISysPostService SysPost post = selectPostById(postId); if (countUserPostById(postId) > 0) { - throw new CustomException(String.format("%1$s已分配,不能删除", post.getPostName())); + throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); } } return postMapper.deletePostByIds(postIds); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index 2d36686e4..14609589c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -11,7 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysRoleDept; @@ -183,7 +183,7 @@ public class SysRoleServiceImpl implements ISysRoleService { if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) { - throw new CustomException("不允许操作超级管理员角色"); + throw new ServiceException("不允许操作超级管理员角色"); } } @@ -342,7 +342,7 @@ public class SysRoleServiceImpl implements ISysRoleService SysRole role = selectRoleById(roleId); if (countUserRoleByRoleId(roleId) > 0) { - throw new CustomException(String.format("%1$s已分配,不能删除", role.getRoleName())); + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); } } // 删除角色与菜单关联 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 2561e0835..3270f9cd8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -11,7 +11,7 @@ import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysPost; @@ -223,7 +223,7 @@ public class SysUserServiceImpl implements ISysUserService { if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { - throw new CustomException("不允许操作超级管理员用户"); + throw new ServiceException("不允许操作超级管理员用户"); } } @@ -485,7 +485,7 @@ public class SysUserServiceImpl implements ISysUserService { if (StringUtils.isNull(userList) || userList.size() == 0) { - throw new CustomException("导入用户数据不能为空!"); + throw new ServiceException("导入用户数据不能为空!"); } int successNum = 0; int failureNum = 0; @@ -530,7 +530,7 @@ public class SysUserServiceImpl implements ISysUserService if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); - throw new CustomException(failureMsg.toString()); + throw new ServiceException(failureMsg.toString()); } else { From 52d0d62c35d01ee73d9dba7b1be99a29adc35ef2 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, 17 Aug 2021 10:45:01 +0800 Subject: [PATCH 100/106] =?UTF-8?q?update=20=E5=90=8C=E6=AD=A5=20ruoyi=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/web/controller/system/SysOssController.java | 6 +++--- .../main/java/com/ruoyi/framework/config/AsyncConfig.java | 4 ++-- .../mybatisplus/CreateAndUpdateMetaObjectHandler.java | 6 +++--- .../framework/web/exception/GlobalExceptionHandler.java | 5 ++--- .../com/ruoyi/generator/service/GenTableServiceImpl.java | 2 +- .../ruoyi/system/service/impl/SysOssConfigServiceImpl.java | 6 +++--- .../com/ruoyi/system/service/impl/SysOssServiceImpl.java | 4 ++-- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 08d7e7ee7..609d41fc1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -10,7 +10,7 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.oss.constant.CloudConstant; @@ -79,7 +79,7 @@ public class SysOssController extends BaseController { @PostMapping("/upload") public AjaxResult> upload(@RequestPart("file") MultipartFile file) { if (file.isEmpty()) { - throw new CustomException("上传文件不能为空"); + throw new ServiceException("上传文件不能为空"); } SysOss oss = iSysOssService.upload(file); Map map = new HashMap<>(2); @@ -94,7 +94,7 @@ public class SysOssController extends BaseController { public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); if (sysOss == null) { - throw new CustomException("文件数据不存在!"); + throw new ServiceException("文件数据不存在!"); } response.reset(); response.addHeader("Access-Control-Allow-Origin", "*"); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java index 2eb4eb3f2..e30f83c79 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -41,7 +41,7 @@ public class AsyncConfig extends AsyncConfigurerSupport { public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (throwable, method, objects) -> { throwable.printStackTrace(); - throw new CustomException( + throw new ServiceException( "Exception message - " + throwable.getMessage() + ", Method name - " + method.getName() + ", Parameter value - " + Arrays.toString(objects)); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java index 02efe6488..ae36fc3b4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java @@ -3,7 +3,7 @@ package com.ruoyi.framework.mybatisplus; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -30,7 +30,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { this.setFieldValByName("createBy", getLoginUsername(), metaObject); } } catch (Exception e) { - throw new CustomException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); } updateFill(metaObject); } @@ -45,7 +45,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { this.setFieldValByName("updateTime", new Date(), metaObject); } } catch (Exception e) { - throw new CustomException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 4df326535..9cf69ffb8 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -2,9 +2,8 @@ package com.ruoyi.framework.web.exception; import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.exception.BaseException; -import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,8 +13,8 @@ import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.NoHandlerFoundException; +import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolationException; /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 48bec600c..94a9975c6 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -267,7 +267,7 @@ public class GenTableServiceImpl extends ServicePlusImpl ids, Boolean isValid) { if(isValid) { if (CollUtil.containsAny(ids, CloudConstant.SYSTEM_DATA_IDS)) { - throw new CustomException("系统内置, 不可删除!"); + throw new ServiceException("系统内置, 不可删除!"); } } boolean flag = removeByIds(ids); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index 28f0f167a..13a22204b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; @@ -61,7 +61,7 @@ public class SysOssServiceImpl extends ServicePlusImpl Date: Tue, 17 Aug 2021 11:43:14 +0800 Subject: [PATCH 101/106] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96OSS=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/web/controller/system/SysOssController.java | 5 +++-- ruoyi-ui/src/utils/download.js | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 609d41fc1..c7772ab9c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -2,6 +2,7 @@ package com.ruoyi.web.controller.system; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.Log; @@ -78,7 +79,7 @@ public class SysOssController extends BaseController { @RepeatSubmit @PostMapping("/upload") public AjaxResult> upload(@RequestPart("file") MultipartFile file) { - if (file.isEmpty()) { + if (ObjectUtil.isNull(file)) { throw new ServiceException("上传文件不能为空"); } SysOss oss = iSysOssService.upload(file); @@ -93,7 +94,7 @@ public class SysOssController extends BaseController { @GetMapping("/download/{ossId}") public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); - if (sysOss == null) { + if (ObjectUtil.isNull(sysOss)) { throw new ServiceException("文件数据不存在!"); } response.reset(); diff --git a/ruoyi-ui/src/utils/download.js b/ruoyi-ui/src/utils/download.js index aeac6b5b9..8f66c249c 100644 --- a/ruoyi-ui/src/utils/download.js +++ b/ruoyi-ui/src/utils/download.js @@ -42,9 +42,11 @@ export function downLoadExcel(url, params) { if (value !== null && typeof(value) !== "undefined") { if (typeof value === 'object') { for (const key of Object.keys(value)) { - let params = propName + '[' + key + ']'; - var subPart = encodeURIComponent(params) + "="; - urlparams += subPart + encodeURIComponent(value[key]) + "&"; + if (value[key] !== null && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']'; + let subPart = encodeURIComponent(params) + "=" + urlparams += subPart + encodeURIComponent(value[key]) + "&"; + } } } else { urlparams += part + encodeURIComponent(value) + "&"; From 5c155f5f110964e0ca1ccc4e4256c91d68abd7dc Mon Sep 17 00:00:00 2001 From: RuoYi Date: Tue, 17 Aug 2021 14:08:18 +0800 Subject: [PATCH 102/106] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=B3=A8=E8=A7=A3=E5=AE=9E=E7=8E=B0=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/annotation/Excels.java | 2 +- .../ruoyi/common/annotation/RateLimiter.java | 40 ++++++ .../com/ruoyi/common/constant/Constants.java | 5 + .../com/ruoyi/common/enums/LimitType.java | 20 +++ .../framework/aspectj/RateLimiterAspect.java | 116 ++++++++++++++++++ .../ruoyi/framework/config/RedisConfig.java | 29 +++++ ruoyi-ui/src/utils/request.js | 6 +- ruoyi-ui/src/utils/ruoyi.js | 22 ++-- 8 files changed, 225 insertions(+), 15 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java index 940763f06..585072302 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java @@ -14,5 +14,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Excels { - Excel[] value(); + public Excel[] value(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java new file mode 100644 index 000000000..564203861 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.enums.LimitType; + +/** + * 限流注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default Constants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 7fdf1639b..7a57fc021 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -74,6 +74,11 @@ public class Constants */ public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + /** * 验证码有效期(分钟) */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java new file mode 100644 index 000000000..ad01659dc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.enums; + +/** + * 限流类型 + * + * @author ruoyi + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 000000000..fd456b0d5 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,116 @@ +package com.ruoyi.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.RateLimiter; +import com.ruoyi.common.enums.LimitType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + // 配置织入点 + @Pointcut("@annotation(com.ruoyi.common.annotation.RateLimiter)") + public void rateLimiterPointCut() + { + } + + @Before("rateLimiterPointCut()") + public void doBefore(JoinPoint point) throws Throwable + { + RateLimiter rateLimiter = getAnnotationRateLimiter(point); + String key = rateLimiter.key(); + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍后再试"); + } + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍后再试"); + } + } + + /** + * 是否存在注解,如果存在就获取 + */ + private RateLimiter getAnnotationRateLimiter(JoinPoint joinPoint) + { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) + { + return method.getAnnotation(RateLimiter.class); + } + return null; + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append("-").append(targetClass.getName()).append("- ").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 7422f3fb8..322d6e344 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -47,4 +48,32 @@ public class RedisConfig extends CachingConfigurerSupport template.afterPropertiesSet(); return template; } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 限流脚本 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return current;\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return current;"; + } } diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index e95d01d91..e4418b17d 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -29,9 +29,9 @@ service.interceptors.request.use(config => { if (typeof value === 'object') { for (const key of Object.keys(value)) { if (value[key] !== null && typeof (value[key]) !== 'undefined') { - let params = propName + '[' + key + ']' - let subPart = encodeURIComponent(params) + '=' - url += subPart + encodeURIComponent(value[key]) + '&' + let params = propName + '[' + key + ']'; + let subPart = encodeURIComponent(params) + '='; + url += subPart + encodeURIComponent(value[key]) + '&'; } } } else { diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index db428850f..f2765f036 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -55,17 +55,17 @@ export function resetForm(refName) { // 添加日期范围 export function addDateRange(params, dateRange, propName) { - let search = params - search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} - dateRange = Array.isArray(dateRange) ? dateRange : [] - if (typeof (propName) === 'undefined') { - search.params['beginTime'] = dateRange[0] - search.params['endTime'] = dateRange[1] - } else { - search.params['begin' + propName] = dateRange[0] - search.params['end' + propName] = dateRange[1] - } - return search + let search = params; + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}; + dateRange = Array.isArray(dateRange) ? dateRange : []; + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0]; + search.params['endTime'] = dateRange[1]; + } else { + search.params['begin' + propName] = dateRange[0]; + search.params['end' + propName] = dateRange[1]; + } + return search; } // 回显数据字典 From c271ffc066c35beafe40acfb63679555f1ed7d18 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, 17 Aug 2021 14:34:29 +0800 Subject: [PATCH 103/106] =?UTF-8?q?update=20=E5=90=8C=E6=AD=A5=20ruoyi=20?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=99=90=E6=B5=81=20=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/framework/config/RedisConfig.java | 34 ++++++++++--------- ruoyi-ui/src/utils/download.js | 4 +-- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 8deee6b66..d66d86bf6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -1,5 +1,6 @@ package com.ruoyi.framework.config; +import cn.hutool.core.util.StrUtil; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.RedissonProperties; import org.redisson.Redisson; @@ -16,6 +17,7 @@ import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.script.DefaultRedisScript; import java.io.IOException; import java.util.HashMap; @@ -90,8 +92,7 @@ public class RedisConfig extends CachingConfigurerSupport { } @Bean - public DefaultRedisScript limitScript() - { + public DefaultRedisScript limitScript() { DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setScriptText(limitScriptText()); redisScript.setResultType(Long.class); @@ -101,20 +102,21 @@ public class RedisConfig extends CachingConfigurerSupport { /** * 限流脚本 */ - private String limitScriptText() - { - return "local key = KEYS[1]\n" + - "local count = tonumber(ARGV[1])\n" + - "local time = tonumber(ARGV[2])\n" + - "local current = redis.call('get', key);\n" + - "if current and tonumber(current) > count then\n" + - " return current;\n" + - "end\n" + - "current = redis.call('incr', key)\n" + - "if tonumber(current) == 1 then\n" + - " redis.call('expire', key, time)\n" + - "end\n" + - "return current;"; + private String limitScriptText() { + return StrUtil.builder() + .append("local key = KEYS[1]\n") + .append("local count = tonumber(ARGV[1])\n") + .append("local time = tonumber(ARGV[2])\n") + .append("local current = redis.call('get', key);\n") + .append("if current and tonumber(current) > count then\n") + .append(" return current;\n") + .append("end\n") + .append("current = redis.call('incr', key)\n") + .append("if tonumber(current) == 1 then\n") + .append(" redis.call('expire', key, time)\n") + .append("end\n") + .append("return current;") + .toString(); } } diff --git a/ruoyi-ui/src/utils/download.js b/ruoyi-ui/src/utils/download.js index 8f66c249c..52b07f713 100644 --- a/ruoyi-ui/src/utils/download.js +++ b/ruoyi-ui/src/utils/download.js @@ -44,8 +44,8 @@ export function downLoadExcel(url, params) { for (const key of Object.keys(value)) { if (value[key] !== null && typeof (value[key]) !== 'undefined') { let params = propName + '[' + key + ']'; - let subPart = encodeURIComponent(params) + "=" - urlparams += subPart + encodeURIComponent(value[key]) + "&"; + let subPart = encodeURIComponent(params) + '='; + urlparams += subPart + encodeURIComponent(value[key]) + '&'; } } } else { From 8cc673ec95258787dc674b4369f0dadc9fceedc8 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, 17 Aug 2021 14:39:38 +0800 Subject: [PATCH 104/106] =?UTF-8?q?update=20=E5=90=8C=E6=AD=A5=20ruoyi=20?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=99=90=E6=B5=81=20=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/aspectj/RateLimiterAspect.java | 232 +++++++++--------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index fd456b0d5..1e21e376d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -1,116 +1,116 @@ -package com.ruoyi.framework.aspectj; - -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.List; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.Signature; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.script.RedisScript; -import org.springframework.stereotype.Component; -import com.ruoyi.common.annotation.RateLimiter; -import com.ruoyi.common.enums.LimitType; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.IpUtils; - -/** - * 限流处理 - * - * @author ruoyi - */ -@Aspect -@Component -public class RateLimiterAspect -{ - private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); - - private RedisTemplate redisTemplate; - - private RedisScript limitScript; - - @Autowired - public void setRedisTemplate1(RedisTemplate redisTemplate) - { - this.redisTemplate = redisTemplate; - } - - @Autowired - public void setLimitScript(RedisScript limitScript) - { - this.limitScript = limitScript; - } - - // 配置织入点 - @Pointcut("@annotation(com.ruoyi.common.annotation.RateLimiter)") - public void rateLimiterPointCut() - { - } - - @Before("rateLimiterPointCut()") - public void doBefore(JoinPoint point) throws Throwable - { - RateLimiter rateLimiter = getAnnotationRateLimiter(point); - String key = rateLimiter.key(); - int time = rateLimiter.time(); - int count = rateLimiter.count(); - - String combineKey = getCombineKey(rateLimiter, point); - List keys = Collections.singletonList(combineKey); - try - { - Long number = redisTemplate.execute(limitScript, keys, count, time); - if (StringUtils.isNull(number) || number.intValue() > count) - { - throw new ServiceException("访问过于频繁,请稍后再试"); - } - log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key); - } - catch (ServiceException e) - { - throw e; - } - catch (Exception e) - { - throw new RuntimeException("服务器限流异常,请稍后再试"); - } - } - - /** - * 是否存在注解,如果存在就获取 - */ - private RateLimiter getAnnotationRateLimiter(JoinPoint joinPoint) - { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - - if (method != null) - { - return method.getAnnotation(RateLimiter.class); - } - return null; - } - - public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) - { - StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); - if (rateLimiter.limitType() == LimitType.IP) - { - stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())); - } - MethodSignature signature = (MethodSignature) point.getSignature(); - Method method = signature.getMethod(); - Class targetClass = method.getDeclaringClass(); - stringBuffer.append("-").append(targetClass.getName()).append("- ").append(method.getName()); - return stringBuffer.toString(); - } -} +package com.ruoyi.framework.aspectj; + +import com.ruoyi.common.annotation.RateLimiter; +import com.ruoyi.common.enums.LimitType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + // 配置织入点 + @Pointcut("@annotation(com.ruoyi.common.annotation.RateLimiter)") + public void rateLimiterPointCut() + { + } + + @Before("rateLimiterPointCut()") + public void doBefore(JoinPoint point) throws Throwable + { + RateLimiter rateLimiter = getAnnotationRateLimiter(point); + String key = rateLimiter.key(); + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍后再试"); + } + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍后再试"); + } + } + + /** + * 是否存在注解,如果存在就获取 + */ + private RateLimiter getAnnotationRateLimiter(JoinPoint joinPoint) + { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) + { + return method.getAnnotation(RateLimiter.class); + } + return null; + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(ServletUtils.getClientIP()); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append("-").append(targetClass.getName()).append("- ").append(method.getName()); + return stringBuffer.toString(); + } +} From 4eb94f4a1eb921801caabd77e81780235279eb15 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, 18 Aug 2021 10:44:08 +0800 Subject: [PATCH 105/106] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0vip=E7=BE=A4?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b0d7ef24a..808b70faa 100644 --- a/README.md +++ b/README.md @@ -102,8 +102,9 @@ RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期 * 单模块 fast 分支 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) * Oracle 模块 oracle 分支 [RuoYi-Vue-Plus-oracle](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/oracle/) -## 扫码加群 一起交流 -![输入图片说明](https://images.gitee.com/uploads/images/2021/0625/160026_11d949aa_1766278.jpeg "07f7121fab14e57e03e5f6a35eff6ce.jpg") +## 加群与捐献 +>[加群与捐献](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598) +>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/加群与捐献?sort_id=4104598) ## 捐献作者 作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭 From a937e3f268a94d9d94696bc5adc0a031cb2ed744 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, 18 Aug 2021 11:09:14 +0800 Subject: [PATCH 106/106] =?UTF-8?q?=E5=8F=91=E5=B8=83=20v3.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docker/docker-compose.yml | 6 +-- pom.xml | 4 +- ruoyi-admin/pom.xml | 2 +- ruoyi-common/pom.xml | 2 +- ruoyi-demo/pom.xml | 2 +- ruoyi-extend/pom.xml | 2 +- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 2 +- ruoyi-framework/pom.xml | 2 +- ruoyi-generator/pom.xml | 2 +- ruoyi-oss/pom.xml | 2 +- ruoyi-quartz/pom.xml | 2 +- ruoyi-system/pom.xml | 2 +- ruoyi-ui/package.json | 2 +- ruoyi-ui/src/views/index.vue | 48 ++++++++++++++++++++++++ 15 files changed, 65 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 808b70faa..778b901f4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/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-2.6.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.0.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 330202338..228ddbf29 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -103,7 +103,7 @@ services: ipv4_address: 172.30.0.54 ruoyi-server1: - image: "ruoyi/ruoyi-server:2.6.0" + image: "ruoyi/ruoyi-server:3.0.0" environment: # 时区上海 TZ: Asia/Shanghai @@ -118,7 +118,7 @@ services: ipv4_address: 172.30.0.60 ruoyi-server2: - image: "ruoyi/ruoyi-server:2.6.0" + image: "ruoyi/ruoyi-server:3.0.0" environment: # 时区上海 TZ: Asia/Shanghai @@ -133,7 +133,7 @@ services: ipv4_address: 172.30.0.61 ruoyi-monitor-admin: - image: "ruoyi/ruoyi-monitor-admin:2.6.0" + image: "ruoyi/ruoyi-monitor-admin:3.0.0" environment: # 时区上海 TZ: Asia/Shanghai diff --git a/pom.xml b/pom.xml index 02f046c50..45a538124 100644 --- a/pom.xml +++ b/pom.xml @@ -6,14 +6,14 @@ com.ruoyi ruoyi-vue-plus - 2.6.0 + 3.0.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 2.6.0 + 3.0.0 2.5.3 UTF-8 UTF-8 diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index ba0ad3252..b46acd50a 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 jar diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 650411f56..c242a0823 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 1066d2f61..1393d491e 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index 4df48bab7..3bfe77021 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 9aca296c1..bada747b4 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 2.6.0 + 3.0.0 4.0.0 jar diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 41e8ca431..5fca8f94b 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 5535bd77f..a712e1fc7 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml index 68e6a8c45..06cd57f73 100644 --- a/ruoyi-oss/pom.xml +++ b/ruoyi-oss/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml index ef70d323b..1d0e30940 100644 --- a/ruoyi-quartz/pom.xml +++ b/ruoyi-quartz/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index f95e293cc..ed08fe205 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.6.0 + 3.0.0 4.0.0 diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index df35e83e3..604d964c3 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "2.6.0", + "version": "3.0.0", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index 6339cf424..23c0e0598 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -93,6 +93,54 @@ 更新日志 + +
    +
  1. add [重大更新]重写 OSS 模块相关实现 支持动态配置(页面配置)
  2. +
  3. add [重大更新]增加 jackson 超出 JS 最大数值自动转字符串(雪花id序列化)处理
  4. +
  5. add [重大更新]重写 防重提交拦截器 支持全局与注解自定义 拦截时间配置配置 优化逻辑
  6. +
  7. add [重大更新]新增是否开启用户注册功能
  8. +
  9. add [重大更新]增加 easyexcel 工具类
  10. +
  11. add [重大更新]集成 性能分析插件 p6spy 更强劲的 SQL 分析
  12. +
  13. add [重大更新]增加 完整国际化解决方案
  14. +
  15. add [重大更新]支持自定义注解实现接口限流
  16. +
  17. update feign-okhttp 11.0 => 11.2
  18. +
  19. update okhttp 3.19.4 => 4.9.1
  20. +
  21. update minio 8.2.0 => 8.3.0
  22. +
  23. update hutool 5.7.6 => 5.7.7
  24. +
  25. update element-ui 2.15.2 => 2.15.5
  26. +
  27. update springboot admin 2.4.3 => 2.5.0 (新增 Quartz 专属监控页)
  28. +
  29. add 增加 admin 监控客户端开关
  30. +
  31. add 增加 国际化演示demo
  32. +
  33. update 更新软件架构图
  34. +
  35. update 优化XSS跨站脚本过滤
  36. +
  37. update 优化BLOB下载时清除URL对象引用
  38. +
  39. update 更新 防重提交拦截器 demo演示案例
  40. +
  41. update 日常字符串校验 统一重构到 StringUtils 便于维护扩展
  42. +
  43. update 修改 自动注入器 用户未登录异常拦截抛出警告 返回Null
  44. +
  45. update 重构 统一使用 流工具下载
  46. +
  47. update 重写 所有业务导出 适配easyexcel工具
  48. +
  49. update 移动文件存储业务到 system 模块
  50. +
  51. update 代码生成模板 适配新excel导出
  52. +
  53. update 将 Actuator 配置 移动到全局配置
  54. +
  55. update 统一镜像时区配置 移除主机时间映射
  56. +
  57. update 更改多数据源框架更清晰的依赖名
  58. +
  59. update 更新 阿里云 maven源 新地址
  60. +
  61. update 补全基础实体 文档注解
  62. +
  63. update 代码生成文档注解 增加必填判断配置
  64. +
  65. update 注入器 insert 增加 update 字段处理
  66. +
  67. update 默认首页使用keep-alive缓存
  68. +
  69. fix 生产minio回显问题
  70. +
  71. fix 修复角色分配用户页面接收参数与传递参数类型不一致导致的错误
  72. +
  73. fix 修复代码生成 删除按钮报错 loading 不取消问题
  74. +
  75. fix 解决登录后浏览器后台Breadcrumb组件报错
  76. +
  77. fix 修复DictUtils方法报错
  78. +
  79. fix 头像上传 未走OSS存储问题
  80. +
  81. fix oss列表 jpeg 不回显问题
  82. +
  83. fix 修复操作日志根据状态查询异常问题
  84. +
  85. remove 移除原生excel工具
  86. +
  87. remove 移除通用上传下载接口与配置
  88. +
+
  1. add [重大新增] 增加 OSS 对象存储模块