From 46c9b810c0018d5bf153de695dec3844b15de728 Mon Sep 17 00:00:00 2001 From: ASxx <2075995406@qq.com> Date: Wed, 9 Aug 2023 17:12:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +- pom.xml | 74 +- ruoyi-admin/pom.xml | 6 +- .../controller/common/CaptchaController.java | 37 +- .../controller/common/CommonController.java | 74 +- .../controller/monitor/CacheController.java | 82 +- .../controller/monitor/ServerController.java | 4 +- .../monitor/SysLogininforController.java | 40 +- .../monitor/SysOperlogController.java | 27 +- .../monitor/SysUserOnlineController.java | 46 +- .../system/SysConfigController.java | 43 +- .../controller/system/SysDeptController.java | 84 +- .../system/SysDictDataController.java | 36 +- .../system/SysDictTypeController.java | 41 +- .../controller/system/SysIndexController.java | 4 +- .../controller/system/SysLoginController.java | 15 +- .../controller/system/SysMenuController.java | 43 +- .../system/SysNoticeController.java | 19 +- .../controller/system/SysPostController.java | 47 +- .../system/SysProfileController.java | 56 +- .../system/SysRegisterController.java | 10 +- .../controller/system/SysRoleController.java | 83 +- .../controller/system/SysUserController.java | 99 +- .../web/controller/tool/TestController.java | 71 +- .../ruoyi/web/core/config/SwaggerConfig.java | 11 +- .../src/main/resources/application-druid.yml | 21 +- .../src/main/resources/application.yml | 83 +- .../main/resources/i18n/messages.properties | 3 +- .../main/resources/mybatis/mybatis-config.xml | 19 +- ruoyi-common/pom.xml | 35 +- .../ruoyi/common/annotation/DataScope.java | 5 - .../ruoyi/common/annotation/DataSource.java | 3 +- .../com/ruoyi/common/annotation/Excel.java | 67 +- .../java/com/ruoyi/common/annotation/Log.java | 17 +- .../ruoyi/common/annotation/RateLimiter.java | 7 +- .../ruoyi/common/annotation/RepeatSubmit.java | 8 - .../com/ruoyi/common/config/RuoYiConfig.java | 103 +- .../com/ruoyi/common/constant/Constants.java | 53 +- .../ruoyi/common/constant/GenConstants.java | 3 - .../com/ruoyi/common/constant/HttpStatus.java | 5 - .../ruoyi/common/constant/UserConstants.java | 6 +- .../core/controller/BaseController.java | 50 +- .../ruoyi/common/core/domain/AjaxResult.java | 84 +- .../ruoyi/common/core/domain/BaseEntity.java | 7 +- .../ruoyi/common/core/domain/TreeSelect.java | 7 +- .../common/core/domain/entity/SysDept.java | 20 +- .../core/domain/entity/SysDictData.java | 11 +- .../core/domain/entity/SysDictType.java | 11 +- .../common/core/domain/entity/SysMenu.java | 22 +- .../common/core/domain/entity/SysRole.java | 44 +- .../common/core/domain/entity/SysUser.java | 46 +- .../common/core/domain/model/LoginBody.java | 2 +- .../common/core/domain/model/LoginUser.java | 55 +- .../ruoyi/common/core/page/TableSupport.java | 5 +- .../ruoyi/common/core/redis/RedisCache.java | 51 +- .../ruoyi/common/core/text/CharsetKit.java | 3 +- .../com/ruoyi/common/core/text/Convert.java | 20 +- .../com/ruoyi/common/enums/HttpMethod.java | 3 +- .../common/exception/GlobalException.java | 2 +- .../common/exception/ServiceException.java | 15 +- .../file/InvalidExtensionException.java | 3 +- .../ruoyi/common/filter/RepeatableFilter.java | 7 +- .../filter/RepeatedlyRequestWrapper.java | 18 +- .../com/ruoyi/common/filter/XssFilter.java | 12 +- .../filter/XssHttpServletRequestWrapper.java | 21 +- .../com/ruoyi/common/utils/DateUtils.java | 49 +- .../com/ruoyi/common/utils/DictUtils.java | 48 +- .../com/ruoyi/common/utils/ExceptionUtil.java | 6 +- .../com/ruoyi/common/utils/MessageUtils.java | 2 +- .../com/ruoyi/common/utils/SecurityUtils.java | 6 +- .../com/ruoyi/common/utils/ServletUtils.java | 93 +- .../com/ruoyi/common/utils/StringUtils.java | 89 +- .../java/com/ruoyi/common/utils/Threads.java | 7 +- .../common/utils/file/FileTypeUtils.java | 3 +- .../common/utils/file/FileUploadUtils.java | 44 +- .../ruoyi/common/utils/file/FileUtils.java | 58 +- .../ruoyi/common/utils/file/ImageUtils.java | 18 +- .../ruoyi/common/utils/html/EscapeUtil.java | 34 +- .../ruoyi/common/utils/html/HTMLFilter.java | 50 +- .../ruoyi/common/utils/http/HttpHelper.java | 13 +- .../ruoyi/common/utils/http/HttpUtils.java | 43 +- .../ruoyi/common/utils/ip/AddressUtils.java | 16 +- .../com/ruoyi/common/utils/ip/IpUtils.java | 208 +-- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 1182 +++++------------ .../common/utils/reflect/ReflectUtils.java | 15 +- .../com/ruoyi/common/utils/sign/Md5Utils.java | 6 +- .../common/utils/spring/SpringUtils.java | 40 +- .../com/ruoyi/common/utils/sql/SqlUtil.java | 31 - .../com/ruoyi/common/utils/uuid/UUID.java | 130 +- ruoyi-framework/pom.xml | 10 +- .../framework/aspectj/DataScopeAspect.java | 108 +- .../framework/aspectj/DataSourceAspect.java | 9 +- .../ruoyi/framework/aspectj/LogAspect.java | 159 ++- .../framework/aspectj/RateLimiterAspect.java | 58 +- .../framework/config/ApplicationConfig.java | 3 +- .../ruoyi/framework/config/CaptchaConfig.java | 23 +- .../ruoyi/framework/config/DruidConfig.java | 31 +- .../config/FastJson2JsonRedisSerializer.java | 34 +- .../ruoyi/framework/config/FilterConfig.java | 15 +- .../framework/config/KaptchaTextCreator.java | 18 +- .../ruoyi/framework/config/MyBatisConfig.java | 18 +- .../ruoyi/framework/config/RedisConfig.java | 14 +- .../framework/config/ResourcesConfig.java | 25 +- .../framework/config/SecurityConfig.java | 44 +- .../ruoyi/framework/config/ServerConfig.java | 21 +- .../framework/config/ThreadPoolConfig.java | 12 +- .../config/properties/DruidProperties.java | 14 +- .../datasource/DynamicDataSource.java | 5 +- .../DynamicDataSourceContextHolder.java | 16 +- .../interceptor/RepeatSubmitInterceptor.java | 27 +- .../impl/SameUrlDataInterceptor.java | 54 +- .../ruoyi/framework/manager/AsyncManager.java | 9 +- .../framework/manager/ShutdownManager.java | 1 - .../manager/factory/AsyncFactory.java | 9 +- .../filter/JwtAuthenticationTokenFilter.java | 19 +- .../handle/AuthenticationEntryPointImpl.java | 17 +- .../handle/LogoutSuccessHandlerImpl.java | 22 +- .../ruoyi/framework/web/domain/Server.java | 57 +- .../framework/web/domain/server/Jvm.java | 13 +- .../web/exception/GlobalExceptionHandler.java | 37 +- .../web/service/PermissionService.java | 12 +- .../web/service/SysLoginService.java | 113 +- .../web/service/SysPermissionService.java | 28 +- .../web/service/SysRegisterService.java | 38 +- .../framework/web/service/TokenService.java | 32 +- .../web/service/UserDetailsServiceImpl.java | 24 +- ruoyi-generator/pom.xml | 8 +- .../generator/controller/GenController.java | 55 +- .../com/ruoyi/generator/domain/GenTable.java | 59 +- .../generator/domain/GenTableColumn.java | 129 +- .../mapper/GenTableColumnMapper.java | 3 +- .../generator/mapper/GenTableMapper.java | 3 +- .../service/GenTableColumnServiceImpl.java | 7 +- .../service/GenTableServiceImpl.java | 148 +-- .../service/IGenTableColumnService.java | 3 +- .../generator/service/IGenTableService.java | 3 +- .../com/ruoyi/generator/util/GenUtils.java | 12 +- .../generator/util/VelocityInitializer.java | 8 +- .../ruoyi/generator/util/VelocityUtils.java | 61 +- .../src/main/resources/generator.yml | 6 +- .../mapper/generator/GenTableColumnMapper.xml | 44 +- .../main/resources/vm/java/controller.java.vm | 31 +- .../src/main/resources/vm/java/mapper.java.vm | 2 +- .../resources/vm/java/serviceImpl.java.vm | 3 - .../src/main/resources/vm/js/api.js.vm | 9 + .../main/resources/vm/vue/index-tree.vue.vm | 174 ++- .../src/main/resources/vm/vue/index.vue.vm | 1127 ++++++++-------- .../src/main/resources/vm/xml/mapper.xml.vm | 10 +- ruoyi-quartz/pom.xml | 6 +- .../ruoyi/quartz/config/ScheduleConfig.java | 114 +- .../quartz/controller/SysJobController.java | 73 +- .../controller/SysJobLogController.java | 31 +- .../java/com/ruoyi/quartz/domain/SysJob.java | 11 +- .../com/ruoyi/quartz/domain/SysJobLog.java | 7 +- .../ruoyi/quartz/mapper/SysJobLogMapper.java | 3 +- .../com/ruoyi/quartz/mapper/SysJobMapper.java | 3 +- .../quartz/service/ISysJobLogService.java | 3 +- .../ruoyi/quartz/service/ISysJobService.java | 7 +- .../service/impl/SysJobLogServiceImpl.java | 7 +- .../service/impl/SysJobServiceImpl.java | 30 +- .../java/com/ruoyi/quartz/task/RyTask.java | 2 +- .../ruoyi/quartz/util/AbstractQuartzJob.java | 13 +- .../java/com/ruoyi/quartz/util/CronUtils.java | 3 +- .../com/ruoyi/quartz/util/JobInvokeUtil.java | 37 +- .../QuartzDisallowConcurrentExecution.java | 2 +- .../ruoyi/quartz/util/QuartzJobExecution.java | 2 +- .../com/ruoyi/quartz/util/ScheduleUtils.java | 38 +- ruoyi-system/pom.xml | 30 +- .../com/ruoyi/system/domain/SysConfig.java | 9 +- .../ruoyi/system/domain/SysLogininfor.java | 3 +- .../com/ruoyi/system/domain/SysNotice.java | 31 +- .../com/ruoyi/system/domain/SysOperLog.java | 17 +- .../java/com/ruoyi/system/domain/SysPost.java | 18 +- .../com/ruoyi/system/domain/vo/RouterVo.java | 1 - .../ruoyi/system/mapper/SysConfigMapper.java | 11 +- .../ruoyi/system/mapper/SysDeptMapper.java | 7 +- .../system/mapper/SysDictDataMapper.java | 5 +- .../system/mapper/SysDictTypeMapper.java | 5 +- .../system/mapper/SysLogininforMapper.java | 3 +- .../ruoyi/system/mapper/SysMenuMapper.java | 15 +- .../ruoyi/system/mapper/SysNoticeMapper.java | 3 +- .../ruoyi/system/mapper/SysOperLogMapper.java | 3 +- .../ruoyi/system/mapper/SysPostMapper.java | 5 +- .../system/mapper/SysRoleDeptMapper.java | 3 +- .../ruoyi/system/mapper/SysRoleMapper.java | 5 +- .../system/mapper/SysRoleMenuMapper.java | 3 +- .../ruoyi/system/mapper/SysUserMapper.java | 9 +- .../system/mapper/SysUserPostMapper.java | 3 +- .../system/mapper/SysUserRoleMapper.java | 5 +- .../system/service/ISysConfigService.java | 8 +- .../ruoyi/system/service/ISysDeptService.java | 15 +- .../system/service/ISysDictDataService.java | 4 +- .../system/service/ISysDictTypeService.java | 6 +- .../system/service/ISysLogininforService.java | 5 +- .../ruoyi/system/service/ISysMenuService.java | 17 +- .../system/service/ISysNoticeService.java | 3 +- .../system/service/ISysOperLogService.java | 3 +- .../ruoyi/system/service/ISysPostService.java | 10 +- .../ruoyi/system/service/ISysRoleService.java | 11 +- .../ruoyi/system/service/ISysUserService.java | 11 +- .../service/impl/SysConfigServiceImpl.java | 24 +- .../service/impl/SysDeptServiceImpl.java | 43 +- .../service/impl/SysDictDataServiceImpl.java | 8 +- .../service/impl/SysDictTypeServiceImpl.java | 16 +- .../impl/SysLogininforServiceImpl.java | 9 +- .../service/impl/SysMenuServiceImpl.java | 82 +- .../service/impl/SysNoticeServiceImpl.java | 7 +- .../service/impl/SysOperLogServiceImpl.java | 7 +- .../service/impl/SysPostServiceImpl.java | 14 +- .../service/impl/SysRoleServiceImpl.java | 26 +- .../impl/SysUserOnlineServiceImpl.java | 2 +- .../service/impl/SysUserServiceImpl.java | 110 +- .../mapper/system/SysConfigMapper.xml | 5 - .../resources/mapper/system/SysDeptMapper.xml | 28 +- .../mapper/system/SysDictDataMapper.xml | 6 +- .../mapper/system/SysDictTypeMapper.xml | 3 +- .../mapper/system/SysLogininforMapper.xml | 4 +- .../resources/mapper/system/SysMenuMapper.xml | 27 +- .../mapper/system/SysOperLogMapper.xml | 13 +- .../resources/mapper/system/SysPostMapper.xml | 8 +- .../resources/mapper/system/SysRoleMapper.xml | 12 +- .../resources/mapper/system/SysUserMapper.xml | 106 +- ry.bat | 26 +- ry.sh | 12 +- 224 files changed, 3512 insertions(+), 5034 deletions(-) diff --git a/README.md b/README.md index 4263bb7..f1ec311 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,3 @@ -

- logo -

-

RuoYi v3.8.6

-

基于SpringBoot+Vue前后端分离的Java快速开发框架

-

- - - -

- ## 平台简介 若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 @@ -18,9 +7,9 @@ * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 * 高效率开发,使用代码生成器可以一键生成前后端代码。 -* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 * 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 * 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) +* 特别鸣谢:[element](https://github.com/ElemeFE/element),[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://github.com/elunez/eladmin-web)。 * 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   * 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   @@ -93,4 +82,4 @@ ## 若依前后端分离交流群 -QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) 点击按钮入群。 \ No newline at end of file +QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) 点击按钮入群。 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0d7bad1..10960d9 100644 --- a/pom.xml +++ b/pom.xml @@ -1,34 +1,37 @@ - 4.0.0 com.ruoyi ruoyi - 3.8.6 + 3.7.0 ruoyi http://www.ruoyi.vip 若依管理系统 - 3.8.6 + 3.7.0 UTF-8 UTF-8 1.8 3.1.1 - 1.2.16 + 1.2.6 1.21 3.0.0 - 2.3.3 - 1.4.6 - 2.0.34 - 6.4.3 + 2.3.2 + 2.1.4 + 1.3.1 + 1.2.76 + 5.8.0 + 5.8.0 2.11.0 + 1.4 3.2.2 4.1.2 - 2.3 + 1.7 0.9.1 @@ -40,7 +43,7 @@ org.springframework.boot spring-boot-dependencies - 2.5.15 + 2.2.13.RELEASE pom import @@ -59,6 +62,13 @@ ${bitwalker.version} + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot.version} + + com.github.pagehelper @@ -73,6 +83,18 @@ ${oshi.version} + + net.java.dev.jna + jna + ${jna.version} + + + + net.java.dev.jna + jna-platform + ${jna.version} + + io.springfox @@ -93,6 +115,13 @@ ${commons.io.version} + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + org.apache.poi @@ -103,8 +132,14 @@ org.apache.velocity - velocity-engine-core + velocity ${velocity.version} + + + commons-collections + commons-collections + + @@ -116,8 +151,8 @@ - com.alibaba.fastjson2 - fastjson2 + com.alibaba + fastjson ${fastjson.version} @@ -130,7 +165,7 @@ - pro.fessional + com.github.penggle kaptcha ${kaptcha.version} @@ -183,6 +218,11 @@ pom + + + + + @@ -202,7 +242,7 @@ public aliyun nexus - https://maven.aliyun.com/repository/public + http://maven.aliyun.com/nexus/content/groups/public/ true @@ -213,7 +253,7 @@ public aliyun nexus - https://maven.aliyun.com/repository/public + http://maven.aliyun.com/nexus/content/groups/public/ true diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 2ed4c69..f24ab34 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -1,11 +1,11 @@ - ruoyi com.ruoyi - 3.8.6 + 3.7.0 4.0.0 jar 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 6b03f19..0aad226 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 @@ -1,25 +1,23 @@ package com.ruoyi.web.controller.common; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; import com.google.code.kaptcha.Producer; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.sign.Base64; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysConfigService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.FastByteArrayOutputStream; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletResponse; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.concurrent.TimeUnit; /** * 验证码操作处理 @@ -38,6 +36,10 @@ public class CaptchaController @Autowired private RedisCache redisCache; + // 验证码类型 + @Value("${ruoyi.captchaType}") + private String captchaType; + @Autowired private ISysConfigService configService; /** @@ -47,22 +49,21 @@ public class CaptchaController public AjaxResult getCode(HttpServletResponse response) throws IOException { AjaxResult ajax = AjaxResult.success(); - boolean captchaEnabled = configService.selectCaptchaEnabled(); - ajax.put("captchaEnabled", captchaEnabled); - if (!captchaEnabled) + boolean captchaOnOff = configService.selectCaptchaOnOff(); + ajax.put("captchaOnOff", captchaOnOff); + if (!captchaOnOff) { return ajax; } // 保存验证码信息 String uuid = IdUtils.simpleUUID(); - String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String capStr = null, code = null; BufferedImage image = null; // 生成验证码 - String captchaType = RuoYiConfig.getCaptchaType(); if ("math".equals(captchaType)) { String capText = captchaProducerMath.createText(); 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 e39e82a..e0c728f 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,26 +1,22 @@ package com.ruoyi.web.controller.common; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.file.FileUploadUtils; -import com.ruoyi.common.utils.file.FileUtils; -import com.ruoyi.framework.config.ServerConfig; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.framework.config.ServerConfig; /** * 通用请求处理 @@ -28,11 +24,10 @@ import java.util.List; * @author ruoyi */ @RestController -@RequestMapping("/common") public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); - private static final String FILE_DELIMETER = ","; + @Autowired private ServerConfig serverConfig; @@ -42,7 +37,7 @@ public class CommonController * @param fileName 文件名称 * @param delete 是否删除 */ - @GetMapping("/download") + @GetMapping("common/download") public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { try @@ -69,9 +64,9 @@ public class CommonController } /** - * 通用上传请求(单个) + * 通用上传请求 */ - @PostMapping("/upload") + @PostMapping("/common/upload") public AjaxResult uploadFile(MultipartFile file) throws Exception { try @@ -82,47 +77,8 @@ public class CommonController String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); - ajax.put("url", url); ajax.put("fileName", fileName); - ajax.put("newFileName", FileUtils.getName(fileName)); - ajax.put("originalFilename", file.getOriginalFilename()); - return ajax; - } - catch (Exception e) - { - return AjaxResult.error(e.getMessage()); - } - } - - /** - * 通用上传请求(多个) - */ - @PostMapping("/uploads") - public AjaxResult uploadFiles(List files) throws Exception - { - try - { - // 上传文件路径 - String filePath = RuoYiConfig.getUploadPath(); - List urls = new ArrayList(); - List fileNames = new ArrayList(); - List newFileNames = new ArrayList(); - List originalFilenames = new ArrayList(); - for (MultipartFile file : files) - { - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - String url = serverConfig.getUrl() + fileName; - urls.add(url); - fileNames.add(fileName); - newFileNames.add(FileUtils.getName(fileName)); - originalFilenames.add(file.getOriginalFilename()); - } - AjaxResult ajax = AjaxResult.success(); - ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); - ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); - ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); - ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + ajax.put("url", url); return ajax; } catch (Exception e) @@ -134,7 +90,7 @@ public class CommonController /** * 本地资源通用下载 */ - @GetMapping("/download/resource") + @GetMapping("/common/download/resource") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception { 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 b121455..7b97de2 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,26 +1,19 @@ package com.ruoyi.web.controller.monitor; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysCache; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; 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.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; /** * 缓存监控 @@ -31,20 +24,9 @@ import java.util.Set; @RequestMapping("/monitor/cache") public class CacheController { - private final static List caches = new ArrayList(); @Autowired private RedisTemplate redisTemplate; - { - caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); - caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); - caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); - caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); - caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); - caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); - caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); - } - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @GetMapping() public AjaxResult getInfo() throws Exception @@ -68,54 +50,4 @@ public class CacheController result.put("commandStats", pieList); return AjaxResult.success(result); } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @GetMapping("/getNames") - public AjaxResult cache() - { - return AjaxResult.success(caches); - } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @GetMapping("/getKeys/{cacheName}") - public AjaxResult getCacheKeys(@PathVariable String cacheName) - { - Set cacheKeys = redisTemplate.keys(cacheName + "*"); - return AjaxResult.success(cacheKeys); - } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @GetMapping("/getValue/{cacheName}/{cacheKey}") - public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) - { - String cacheValue = redisTemplate.opsForValue().get(cacheKey); - SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); - return AjaxResult.success(sysCache); - } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @DeleteMapping("/clearCacheName/{cacheName}") - public AjaxResult clearCacheName(@PathVariable String cacheName) - { - Collection cacheKeys = redisTemplate.keys(cacheName + "*"); - redisTemplate.delete(cacheKeys); - return AjaxResult.success(); - } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @DeleteMapping("/clearCacheKey/{cacheKey}") - public AjaxResult clearCacheKey(@PathVariable String cacheKey) - { - redisTemplate.delete(cacheKey); - return AjaxResult.success(); - } - - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") - @DeleteMapping("/clearCacheAll") - public AjaxResult clearCacheAll() - { - Collection cacheKeys = redisTemplate.keys("*"); - redisTemplate.delete(cacheKeys); - return AjaxResult.success(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java index 6a8bab1..cc805ad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java @@ -1,11 +1,11 @@ package com.ruoyi.web.controller.monitor; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.framework.web.domain.Server; 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 com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.domain.Server; /** * 服务器监控 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 e120909..339f242 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 @@ -1,25 +1,21 @@ package com.ruoyi.web.controller.monitor; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; 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.framework.web.service.SysPasswordService; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.service.ISysLogininforService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; /** * 系统访问记录 @@ -33,9 +29,6 @@ public class SysLogininforController extends BaseController @Autowired private ISysLogininforService logininforService; - @Autowired - private SysPasswordService passwordService; - @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") @GetMapping("/list") public TableDataInfo list(SysLogininfor logininfor) @@ -47,12 +40,12 @@ public class SysLogininforController extends BaseController @Log(title = "登录日志", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysLogininfor logininfor) + @GetMapping("/export") + public AjaxResult export(SysLogininfor logininfor) { List list = logininforService.selectLogininforList(logininfor); ExcelUtil util = new ExcelUtil(SysLogininfor.class); - util.exportExcel(response, list, "登录日志"); + return util.exportExcel(list, "登录日志"); } @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") @@ -69,15 +62,6 @@ public class SysLogininforController extends BaseController public AjaxResult clean() { logininforService.cleanLogininfor(); - return success(); - } - - @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") - @Log(title = "账户解锁", businessType = BusinessType.OTHER) - @GetMapping("/unlock/{userName}") - public AjaxResult unlock(@PathVariable("userName") String userName) - { - passwordService.clearLoginRecordCache(userName); - return success(); + return AjaxResult.success(); } } 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 2595377..1d7eb02 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 @@ -1,5 +1,13 @@ package com.ruoyi.web.controller.monitor; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -8,17 +16,6 @@ import com.ruoyi.common.enums.BusinessType; 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; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; /** * 操作日志记录 @@ -43,12 +40,12 @@ public class SysOperlogController extends BaseController @Log(title = "操作日志", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysOperLog operLog) + @GetMapping("/export") + public AjaxResult export(SysOperLog operLog) { List list = operLogService.selectOperLogList(operLog); ExcelUtil util = new ExcelUtil(SysOperLog.class); - util.exportExcel(response, list, "操作日志"); + return util.exportExcel(list, "操作日志"); } @Log(title = "操作日志", businessType = BusinessType.DELETE) @@ -65,6 +62,6 @@ public class SysOperlogController extends BaseController public AjaxResult clean() { operLogService.cleanOperLog(); - return success(); + return AjaxResult.success(); } } 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 343aede..9b157ea 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,18 @@ package com.ruoyi.web.controller.monitor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; @@ -11,18 +22,6 @@ import com.ruoyi.common.enums.BusinessType; 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; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; /** * 在线用户监控 @@ -43,22 +42,31 @@ public class SysUserOnlineController extends BaseController @GetMapping("/list") public TableDataInfo list(String ipaddr, String userName) { - Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + Collection keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); List userOnlineList = new ArrayList(); for (String key : keys) { LoginUser user = redisCache.getCacheObject(key); if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } } else if (StringUtils.isNotEmpty(ipaddr)) { - userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { - userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + if (StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } } else { @@ -78,7 +86,7 @@ public class SysUserOnlineController extends BaseController @DeleteMapping("/{tokenId}") public AjaxResult forceLogout(@PathVariable String tokenId) { - redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); - return success(); + redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); + return AjaxResult.success(); } } 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 2442e9e..f44c392 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 @@ -1,13 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -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.system.domain.SysConfig; -import com.ruoyi.system.service.ISysConfigService; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -19,9 +12,16 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.constant.UserConstants; +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.system.domain.SysConfig; +import com.ruoyi.system.service.ISysConfigService; /** * 参数配置 信息操作处理 @@ -49,12 +49,12 @@ public class SysConfigController extends BaseController @Log(title = "参数管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:config:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysConfig config) + @GetMapping("/export") + public AjaxResult export(SysConfig config) { List list = configService.selectConfigList(config); ExcelUtil util = new ExcelUtil(SysConfig.class); - util.exportExcel(response, list, "参数数据"); + return util.exportExcel(list, "参数数据"); } /** @@ -64,7 +64,7 @@ public class SysConfigController extends BaseController @GetMapping(value = "/{configId}") public AjaxResult getInfo(@PathVariable Long configId) { - return success(configService.selectConfigById(configId)); + return AjaxResult.success(configService.selectConfigById(configId)); } /** @@ -73,7 +73,7 @@ public class SysConfigController extends BaseController @GetMapping(value = "/configKey/{configKey}") public AjaxResult getConfigKey(@PathVariable String configKey) { - return success(configService.selectConfigByKey(configKey)); + return AjaxResult.success(configService.selectConfigByKey(configKey)); } /** @@ -82,11 +82,12 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:add')") @Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping + @RepeatSubmit public AjaxResult add(@Validated @RequestBody SysConfig config) { - if (!configService.checkConfigKeyUnique(config)) + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { - return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); } config.setCreateBy(getUsername()); return toAjax(configService.insertConfig(config)); @@ -100,9 +101,9 @@ public class SysConfigController extends BaseController @PutMapping public AjaxResult edit(@Validated @RequestBody SysConfig config) { - if (!configService.checkConfigKeyUnique(config)) + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { - return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); } config.setUpdateBy(getUsername()); return toAjax(configService.updateConfig(config)); @@ -129,6 +130,6 @@ public class SysConfigController extends BaseController public AjaxResult refreshCache() { configService.resetConfigCache(); - return success(); + return AjaxResult.success(); } } 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 db50fce..a6030ea 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,13 +1,7 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.controller.BaseController; -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.StringUtils; -import com.ruoyi.system.service.ISysDeptService; +import java.util.Iterator; +import java.util.List; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -20,8 +14,14 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +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.StringUtils; +import com.ruoyi.system.service.ISysDeptService; /** * 部门信息 @@ -43,7 +43,7 @@ public class SysDeptController extends BaseController public AjaxResult list(SysDept dept) { List depts = deptService.selectDeptList(dept); - return success(depts); + return AjaxResult.success(depts); } /** @@ -54,8 +54,17 @@ public class SysDeptController extends BaseController public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); - depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); - return success(depts); + Iterator it = depts.iterator(); + while (it.hasNext()) + { + SysDept d = (SysDept) it.next(); + if (d.getDeptId().intValue() == deptId + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) + { + it.remove(); + } + } + return AjaxResult.success(depts); } /** @@ -66,7 +75,30 @@ public class SysDeptController extends BaseController public AjaxResult getInfo(@PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); - return success(deptService.selectDeptById(deptId)); + return AjaxResult.success(deptService.selectDeptById(deptId)); + } + + /** + * 获取部门下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); + } + + /** + * 加载对应角色部门列表树 + */ + @GetMapping(value = "/roleDeptTreeselect/{roleId}") + public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) + { + List depts = deptService.selectDeptList(new SysDept()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.buildDeptTreeSelect(depts)); + return ajax; } /** @@ -77,9 +109,9 @@ public class SysDeptController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysDept dept) { - if (!deptService.checkDeptNameUnique(dept)) + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { - return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); } dept.setCreateBy(getUsername()); return toAjax(deptService.insertDept(dept)); @@ -93,19 +125,18 @@ public class SysDeptController extends BaseController @PutMapping public AjaxResult edit(@Validated @RequestBody SysDept dept) { - Long deptId = dept.getDeptId(); - deptService.checkDeptDataScope(deptId); - if (!deptService.checkDeptNameUnique(dept)) + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { - return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); } - else if (dept.getParentId().equals(deptId)) + else if (dept.getParentId().equals(dept.getDeptId())) { - return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); } - else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) + && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) { - return error("该部门包含未停用的子部门!"); + return AjaxResult.error("该部门包含未停用的子部门!"); } dept.setUpdateBy(getUsername()); return toAjax(deptService.updateDept(dept)); @@ -121,13 +152,12 @@ public class SysDeptController extends BaseController { if (deptService.hasChildByDeptId(deptId)) { - return warn("存在下级部门,不允许删除"); + return AjaxResult.error("存在下级部门,不允许删除"); } if (deptService.checkDeptExistUser(deptId)) { - return warn("部门存在用户,不允许删除"); + return AjaxResult.error("部门存在用户,不允许删除"); } - deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } } 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 94d252f..7609689 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,15 +1,7 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -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.StringUtils; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.system.service.ISysDictDataService; -import com.ruoyi.system.service.ISysDictTypeService; +import java.util.ArrayList; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -21,10 +13,16 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +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.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDictDataService; +import com.ruoyi.system.service.ISysDictTypeService; /** * 数据字典信息 @@ -52,12 +50,12 @@ public class SysDictDataController extends BaseController @Log(title = "字典数据", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:dict:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysDictData dictData) + @GetMapping("/export") + public AjaxResult export(SysDictData dictData) { List list = dictDataService.selectDictDataList(dictData); ExcelUtil util = new ExcelUtil(SysDictData.class); - util.exportExcel(response, list, "字典数据"); + return util.exportExcel(list, "字典数据"); } /** @@ -67,7 +65,7 @@ public class SysDictDataController extends BaseController @GetMapping(value = "/{dictCode}") public AjaxResult getInfo(@PathVariable Long dictCode) { - return success(dictDataService.selectDictDataById(dictCode)); + return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); } /** @@ -81,7 +79,7 @@ public class SysDictDataController extends BaseController { data = new ArrayList(); } - return success(data); + return AjaxResult.success(data); } /** 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 2629c5e..c2e4d74 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 @@ -1,13 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -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.poi.ExcelUtil; -import com.ruoyi.system.service.ISysDictTypeService; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -19,9 +12,15 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +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.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDictTypeService; /** * 数据字典信息 @@ -46,12 +45,12 @@ public class SysDictTypeController extends BaseController @Log(title = "字典类型", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:dict:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysDictType dictType) + @GetMapping("/export") + public AjaxResult export(SysDictType dictType) { List list = dictTypeService.selectDictTypeList(dictType); ExcelUtil util = new ExcelUtil(SysDictType.class); - util.exportExcel(response, list, "字典类型"); + return util.exportExcel(list, "字典类型"); } /** @@ -61,7 +60,7 @@ public class SysDictTypeController extends BaseController @GetMapping(value = "/{dictId}") public AjaxResult getInfo(@PathVariable Long dictId) { - return success(dictTypeService.selectDictTypeById(dictId)); + return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); } /** @@ -72,9 +71,9 @@ public class SysDictTypeController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysDictType dict) { - if (!dictTypeService.checkDictTypeUnique(dict)) + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { - return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); } dict.setCreateBy(getUsername()); return toAjax(dictTypeService.insertDictType(dict)); @@ -88,9 +87,9 @@ public class SysDictTypeController extends BaseController @PutMapping public AjaxResult edit(@Validated @RequestBody SysDictType dict) { - if (!dictTypeService.checkDictTypeUnique(dict)) + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { - return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); } dict.setUpdateBy(getUsername()); return toAjax(dictTypeService.updateDictType(dict)); @@ -117,7 +116,7 @@ public class SysDictTypeController extends BaseController public AjaxResult refreshCache() { dictTypeService.resetDictCache(); - return success(); + return AjaxResult.success(); } /** @@ -127,6 +126,6 @@ public class SysDictTypeController extends BaseController public AjaxResult optionselect() { List dictTypes = dictTypeService.selectDictTypeAll(); - return success(dictTypes); + return AjaxResult.success(dictTypes); } } 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 e79be55..13007eb 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,10 +1,10 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.StringUtils; /** * 首页 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 6a54c4b..d959a17 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,5 +1,12 @@ package com.ruoyi.web.controller.system; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +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.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysMenu; @@ -9,14 +16,6 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.system.service.ISysMenuService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Set; /** * 登录验证 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 f3770e1..4a9f73f 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,13 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysMenuService; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -19,8 +12,14 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysMenuService; /** * 菜单信息 @@ -42,7 +41,7 @@ public class SysMenuController extends BaseController public AjaxResult list(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); - return success(menus); + return AjaxResult.success(menus); } /** @@ -52,7 +51,7 @@ public class SysMenuController extends BaseController @GetMapping(value = "/{menuId}") public AjaxResult getInfo(@PathVariable Long menuId) { - return success(menuService.selectMenuById(menuId)); + return AjaxResult.success(menuService.selectMenuById(menuId)); } /** @@ -62,7 +61,7 @@ public class SysMenuController extends BaseController public AjaxResult treeselect(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); - return success(menuService.buildMenuTreeSelect(menus)); + return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); } /** @@ -86,13 +85,13 @@ public class SysMenuController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysMenu menu) { - if (!menuService.checkMenuNameUnique(menu)) + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { - return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } menu.setCreateBy(getUsername()); return toAjax(menuService.insertMenu(menu)); @@ -106,17 +105,17 @@ public class SysMenuController extends BaseController @PutMapping public AjaxResult edit(@Validated @RequestBody SysMenu menu) { - if (!menuService.checkMenuNameUnique(menu)) + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { - return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } else if (menu.getMenuId().equals(menu.getParentId())) { - return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); } menu.setUpdateBy(getUsername()); return toAjax(menuService.updateMenu(menu)); @@ -132,11 +131,11 @@ public class SysMenuController extends BaseController { if (menuService.hasChildByMenuId(menuId)) { - return warn("存在子菜单,不允许删除"); + return AjaxResult.error("存在子菜单,不允许删除"); } if (menuService.checkMenuExistRole(menuId)) { - return warn("菜单已分配,不允许删除"); + return AjaxResult.error("菜单已分配,不允许删除"); } return toAjax(menuService.deleteMenuById(menuId)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index 9071d33..4da9f04 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -1,12 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -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.system.domain.SysNotice; -import com.ruoyi.system.service.ISysNoticeService; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -18,8 +12,13 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.List; +import com.ruoyi.common.annotation.Log; +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.system.domain.SysNotice; +import com.ruoyi.system.service.ISysNoticeService; /** * 公告 信息操作处理 @@ -52,7 +51,7 @@ public class SysNoticeController extends BaseController @GetMapping(value = "/{noticeId}") public AjaxResult getInfo(@PathVariable Long noticeId) { - return success(noticeService.selectNoticeById(noticeId)); + return AjaxResult.success(noticeService.selectNoticeById(noticeId)); } /** 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 e8e0c7e..c2501c7 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 @@ -1,13 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -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.system.domain.SysPost; -import com.ruoyi.system.service.ISysPostService; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -19,9 +12,15 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +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.system.domain.SysPost; +import com.ruoyi.system.service.ISysPostService; /** * 岗位信息操作处理 @@ -49,12 +48,12 @@ public class SysPostController extends BaseController @Log(title = "岗位管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:post:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysPost post) + @GetMapping("/export") + public AjaxResult export(SysPost post) { List list = postService.selectPostList(post); ExcelUtil util = new ExcelUtil(SysPost.class); - util.exportExcel(response, list, "岗位数据"); + return util.exportExcel(list, "岗位数据"); } /** @@ -64,7 +63,7 @@ public class SysPostController extends BaseController @GetMapping(value = "/{postId}") public AjaxResult getInfo(@PathVariable Long postId) { - return success(postService.selectPostById(postId)); + return AjaxResult.success(postService.selectPostById(postId)); } /** @@ -75,13 +74,13 @@ public class SysPostController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysPost post) { - if (!postService.checkPostNameUnique(post)) + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { - return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } - else if (!postService.checkPostCodeUnique(post)) + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { - return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } post.setCreateBy(getUsername()); return toAjax(postService.insertPost(post)); @@ -95,13 +94,13 @@ public class SysPostController extends BaseController @PutMapping public AjaxResult edit(@Validated @RequestBody SysPost post) { - if (!postService.checkPostNameUnique(post)) + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { - return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } - else if (!postService.checkPostCodeUnique(post)) + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { - return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } post.setUpdateBy(getUsername()); return toAjax(postService.updatePost(post)); @@ -125,6 +124,6 @@ public class SysPostController extends BaseController public AjaxResult optionselect() { List posts = postService.selectPostAll(); - return success(posts); + return AjaxResult.success(posts); } } 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 354b7a5..90eb8f3 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,7 +1,18 @@ package com.ruoyi.web.controller.system; +import java.io.IOException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; @@ -10,18 +21,8 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; -import com.ruoyi.common.utils.file.MimeTypeUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; /** * 个人信息 业务处理 @@ -59,21 +60,20 @@ public class SysProfileController extends BaseController @PutMapping public AjaxResult updateProfile(@RequestBody SysUser user) { - LoginUser loginUser = getLoginUser(); - SysUser sysUser = loginUser.getUser(); - user.setUserName(sysUser.getUserName()); - if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } - if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); user.setUserId(sysUser.getUserId()); user.setPassword(null); - user.setAvatar(null); - user.setDeptId(null); if (userService.updateUserProfile(user) > 0) { // 更新缓存用户信息 @@ -82,9 +82,9 @@ public class SysProfileController extends BaseController sysUser.setEmail(user.getEmail()); sysUser.setSex(user.getSex()); tokenService.setLoginUser(loginUser); - return success(); + return AjaxResult.success(); } - return error("修改个人信息异常,请联系管理员"); + return AjaxResult.error("修改个人信息异常,请联系管理员"); } /** @@ -99,20 +99,20 @@ public class SysProfileController extends BaseController String password = loginUser.getPassword(); if (!SecurityUtils.matchesPassword(oldPassword, password)) { - return error("修改密码失败,旧密码错误"); + return AjaxResult.error("修改密码失败,旧密码错误"); } if (SecurityUtils.matchesPassword(newPassword, password)) { - return error("新密码不能与旧密码相同"); + return AjaxResult.error("新密码不能与旧密码相同"); } if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { // 更新缓存用户密码 loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); tokenService.setLoginUser(loginUser); - return success(); + return AjaxResult.success(); } - return error("修改密码异常,请联系管理员"); + return AjaxResult.error("修改密码异常,请联系管理员"); } /** @@ -120,12 +120,12 @@ public class SysProfileController extends BaseController */ @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping("/avatar") - public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException { if (!file.isEmpty()) { LoginUser loginUser = getLoginUser(); - String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file); if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { AjaxResult ajax = AjaxResult.success(); @@ -136,6 +136,6 @@ public class SysProfileController extends BaseController return ajax; } } - return error("上传图片异常,请联系管理员"); + return AjaxResult.error("上传图片异常,请联系管理员"); } } 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 afd9f93..762f1d9 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,15 +1,15 @@ 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.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; /** * 注册验证 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 241ab0d..4a876ab 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,9 +1,21 @@ package com.ruoyi.web.controller.system; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -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.domain.model.LoginUser; @@ -14,23 +26,8 @@ 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; -import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; /** * 角色信息 @@ -46,16 +43,13 @@ public class SysRoleController extends BaseController @Autowired private TokenService tokenService; - + @Autowired private SysPermissionService permissionService; - + @Autowired private ISysUserService userService; - @Autowired - private ISysDeptService deptService; - @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/list") public TableDataInfo list(SysRole role) @@ -67,12 +61,12 @@ public class SysRoleController extends BaseController @Log(title = "角色管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:role:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysRole role) + @GetMapping("/export") + public AjaxResult export(SysRole role) { List list = roleService.selectRoleList(role); ExcelUtil util = new ExcelUtil(SysRole.class); - util.exportExcel(response, list, "角色数据"); + return util.exportExcel(list, "角色数据"); } /** @@ -83,7 +77,7 @@ public class SysRoleController extends BaseController public AjaxResult getInfo(@PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); - return success(roleService.selectRoleById(roleId)); + return AjaxResult.success(roleService.selectRoleById(roleId)); } /** @@ -94,13 +88,13 @@ public class SysRoleController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysRole role) { - if (!roleService.checkRoleNameUnique(role)) + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { - return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); } - else if (!roleService.checkRoleKeyUnique(role)) + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { - return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); } role.setCreateBy(getUsername()); return toAjax(roleService.insertRole(role)); @@ -116,14 +110,13 @@ public class SysRoleController extends BaseController public AjaxResult edit(@Validated @RequestBody SysRole role) { roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); - if (!roleService.checkRoleNameUnique(role)) + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { - return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); } - else if (!roleService.checkRoleKeyUnique(role)) + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { - return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); } role.setUpdateBy(getUsername()); @@ -137,9 +130,9 @@ public class SysRoleController extends BaseController loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); tokenService.setLoginUser(loginUser); } - return success(); + return AjaxResult.success(); } - return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); } /** @@ -151,7 +144,6 @@ public class SysRoleController extends BaseController public AjaxResult dataScope(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.authDataScope(role)); } @@ -164,7 +156,6 @@ public class SysRoleController extends BaseController public AjaxResult changeStatus(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); - roleService.checkRoleDataScope(role.getRoleId()); role.setUpdateBy(getUsername()); return toAjax(roleService.updateRoleStatus(role)); } @@ -187,7 +178,7 @@ public class SysRoleController extends BaseController @GetMapping("/optionselect") public AjaxResult optionselect() { - return success(roleService.selectRoleAll()); + return AjaxResult.success(roleService.selectRoleAll()); } /** @@ -244,20 +235,6 @@ public class SysRoleController extends BaseController @PutMapping("/authUser/selectAll") public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) { - roleService.checkRoleDataScope(roleId); return toAjax(roleService.insertAuthUsers(roleId, userIds)); } - - /** - * 获取对应角色部门树列表 - */ - @PreAuthorize("@ss.hasPermi('system:role:query')") - @GetMapping(value = "/deptTree/{roleId}") - public AjaxResult deptTree(@PathVariable("roleId") Long roleId) - { - AjaxResult ajax = AjaxResult.success(); - ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); - ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); - return ajax; - } } 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 9fcb23a..619f6f1 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,20 +1,7 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -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.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.ISysDeptService; -import com.ruoyi.system.service.ISysPostService; -import com.ruoyi.system.service.ISysRoleService; -import com.ruoyi.system.service.ISysUserService; +import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,10 +15,20 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; -import java.util.stream.Collectors; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +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.ISysPostService; +import com.ruoyi.system.service.ISysRoleService; +import com.ruoyi.system.service.ISysUserService; /** * 用户信息 @@ -48,9 +45,6 @@ public class SysUserController extends BaseController @Autowired private ISysRoleService roleService; - @Autowired - private ISysDeptService deptService; - @Autowired private ISysPostService postService; @@ -68,12 +62,12 @@ public class SysUserController extends BaseController @Log(title = "用户管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:user:export')") - @PostMapping("/export") - public void export(HttpServletResponse response, SysUser user) + @GetMapping("/export") + public AjaxResult export(SysUser user) { List list = userService.selectUserList(user); ExcelUtil util = new ExcelUtil(SysUser.class); - util.exportExcel(response, list, "用户数据"); + return util.exportExcel(list, "用户数据"); } @Log(title = "用户管理", businessType = BusinessType.IMPORT) @@ -85,14 +79,14 @@ public class SysUserController extends BaseController List userList = util.importExcel(file.getInputStream()); String operName = getUsername(); String message = userService.importUser(userList, updateSupport, operName); - return success(message); + return AjaxResult.success(message); } - @PostMapping("/importTemplate") - public void importTemplate(HttpServletResponse response) + @GetMapping("/importTemplate") + public AjaxResult importTemplate() { ExcelUtil util = new ExcelUtil(SysUser.class); - util.importTemplateExcel(response, "用户数据"); + return util.importTemplateExcel("用户数据"); } /** @@ -109,10 +103,9 @@ public class SysUserController extends BaseController ajax.put("posts", postService.selectPostAll()); if (StringUtils.isNotNull(userId)) { - SysUser sysUser = userService.selectUserById(userId); - ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId)); ajax.put("postIds", postService.selectPostListByUserId(userId)); - ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); } return ajax; } @@ -125,17 +118,19 @@ public class SysUserController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysUser user) { - if (!userService.checkUserNameUnique(user)) + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { - return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); } - else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } - else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setCreateBy(getUsername()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); @@ -151,18 +146,15 @@ public class SysUserController extends BaseController public AjaxResult edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); - userService.checkUserDataScope(user.getUserId()); - if (!userService.checkUserNameUnique(user)) - { - return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); - } - else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } - else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setUpdateBy(getUsername()); return toAjax(userService.updateUser(user)); @@ -192,7 +184,6 @@ public class SysUserController extends BaseController public AjaxResult resetPwd(@RequestBody SysUser user) { userService.checkUserAllowed(user); - userService.checkUserDataScope(user.getUserId()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); user.setUpdateBy(getUsername()); return toAjax(userService.resetPwd(user)); @@ -207,7 +198,6 @@ public class SysUserController extends BaseController public AjaxResult changeStatus(@RequestBody SysUser user) { userService.checkUserAllowed(user); - userService.checkUserDataScope(user.getUserId()); user.setUpdateBy(getUsername()); return toAjax(userService.updateUserStatus(user)); } @@ -235,18 +225,7 @@ public class SysUserController extends BaseController @PutMapping("/authRole") public AjaxResult insertAuthRole(Long userId, Long[] roleIds) { - userService.checkUserDataScope(userId); userService.insertUserAuth(userId, roleIds); return success(); } - - /** - * 获取部门树列表 - */ - @PreAuthorize("@ss.hasPermi('system:user:list')") - @GetMapping("/deptTree") - public AjaxResult deptTree(SysDept dept) - { - return success(deptService.selectDeptTreeList(dept)); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java index 94d998d..381ab13 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -1,14 +1,9 @@ package com.ruoyi.web.controller.tool; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.StringUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -17,11 +12,15 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; /** * swagger 用户测试方法 @@ -41,75 +40,73 @@ public class TestController extends BaseController @ApiOperation("获取用户列表") @GetMapping("/list") - public R> userList() + public AjaxResult userList() { List userList = new ArrayList(users.values()); - return R.ok(userList); + return AjaxResult.success(userList); } @ApiOperation("获取用户详细") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") @GetMapping("/{userId}") - public R getUser(@PathVariable Integer userId) + public AjaxResult getUser(@PathVariable Integer userId) { if (!users.isEmpty() && users.containsKey(userId)) { - return R.ok(users.get(userId)); + return AjaxResult.success(users.get(userId)); } else { - return R.fail("用户不存在"); + return error("用户不存在"); } } @ApiOperation("新增用户") @ApiImplicitParams({ - @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), - @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), - @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), - @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer"), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String"), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String"), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String") }) @PostMapping("/save") - public R save(UserEntity user) + public AjaxResult save(UserEntity user) { if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) { - return R.fail("用户ID不能为空"); + return error("用户ID不能为空"); } - users.put(user.getUserId(), user); - return R.ok(); + return AjaxResult.success(users.put(user.getUserId(), user)); } @ApiOperation("更新用户") @PutMapping("/update") - public R update(@RequestBody UserEntity user) + public AjaxResult update(@RequestBody UserEntity user) { if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) { - return R.fail("用户ID不能为空"); + return error("用户ID不能为空"); } if (users.isEmpty() || !users.containsKey(user.getUserId())) { - return R.fail("用户不存在"); + return error("用户不存在"); } users.remove(user.getUserId()); - users.put(user.getUserId(), user); - return R.ok(); + return AjaxResult.success(users.put(user.getUserId(), user)); } @ApiOperation("删除用户信息") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") @DeleteMapping("/{userId}") - public R delete(@PathVariable Integer userId) + public AjaxResult delete(@PathVariable Integer userId) { if (!users.isEmpty() && users.containsKey(userId)) { users.remove(userId); - return R.ok(); + return success(); } else { - return R.fail("用户不存在"); + return error("用户不存在"); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java index c9585c6..ae1c3ec 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -1,12 +1,14 @@ package com.ruoyi.web.core.config; -import com.ruoyi.common.config.RuoYiConfig; -import io.swagger.annotations.ApiOperation; -import io.swagger.models.auth.In; +import java.util.ArrayList; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; @@ -20,9 +22,6 @@ import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; -import java.util.ArrayList; -import java.util.List; - /** * Swagger2的接口配置 * diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 426a48a..51c9968 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,16 +6,21 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + #本地 + #url: jdbc:mysql://39.101.188.84:3306/taicangscreen?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + #username: root + #password: adminadmin + #公司 + url: jdbc:mysql://39.101.188.84:3307/taicangscreen?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: password + password: Admin123@ # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false - url: - username: - password: + url: + username: + password: # 初始连接数 initialSize: 5 # 最小连接池数量 @@ -24,10 +29,6 @@ spring: maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 - # 配置连接超时时间 - connectTimeout: 30000 - # 配置网络超时时间 - socketTimeout: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 @@ -39,7 +40,7 @@ spring: testWhileIdle: true testOnBorrow: false testOnReturn: false - webStatFilter: + webStatFilter: enabled: true statViewServlet: enabled: true diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index cfe0d50..dc5cf76 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -1,37 +1,34 @@ # 项目相关配置 ruoyi: # 名称 - name: RuoYi + name: taicangZongzhi # 版本 - version: 3.8.6 + version: 3.7.0 # 版权年份 - copyrightYear: 2023 + copyrightYear: 2021 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: D:/ruoyi/uploadPath + profile: D:/taicangZongzhi/uploadPath # 获取ip地址开关 addressEnabled: false - # 验证码类型 math 数字计算 char 字符验证 + # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8080 + port: 9027 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 - # 连接数满后的排队数,默认为100 - accept-count: 1000 - threads: - # tomcat最大线程数,默认为200 - max: 800 - # Tomcat启动初始化的线程数,默认值10 - min-spare: 100 + # tomcat最大线程数,默认为200 + max-threads: 800 + # Tomcat启动初始化的线程数,默认值25 + min-spare-threads: 30 # 日志配置 logging: @@ -39,29 +36,21 @@ logging: com.ruoyi: debug org.springframework: warn -# 用户配置 -user: - password: - # 密码最大错误次数 - maxRetryCount: 5 - # 密码锁定时间(默认10分钟) - lockTime: 10 - # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages - profiles: + profiles: active: druid # 文件上传 servlet: - multipart: - # 单个文件大小 - max-file-size: 10MB - # 设置总上传的文件大小 - max-request-size: 20MB + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB # 服务模块 devtools: restart: @@ -69,14 +58,16 @@ spring: enabled: true # redis 配置 redis: - # 地址 + # 数据服务器 +# host: 192.168.2.39 + # 本地地址 host: localhost # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 - password: + password: # 连接超时时间 timeout: 10s lettuce: @@ -92,37 +83,37 @@ spring: # token配置 token: - # 令牌自定义标识 - header: Authorization - # 令牌密钥 - secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 30 - + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + # MyBatis配置 mybatis: - # 搜索指定包别名 - typeAliasesPackage: com.ruoyi.**.domain - # 配置mapper的扫描,找到所有的mapper.xml映射文件 - mapperLocations: classpath*:mapper/**/*Mapper.xml - # 加载全局的配置文件 - configLocation: classpath:mybatis/mybatis-config.xml + # 搜索指定包别名 + typeAliasesPackage: com.ruoyi.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 -pagehelper: +pagehelper: helperDialect: mysql supportMethodsArguments: true - params: count=countSql + params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 - pathMapping: /dev-api + pathMapping: / # 防止XSS攻击 -xss: +xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 93de005..71cf52d 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -5,11 +5,10 @@ user.jcaptcha.expire=验证码已失效 user.not.exists=用户不存在/密码错误 user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次 -user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 user.password.delete=对不起,您的账号已被删除 user.blocked=用户已封禁,请联系管理员 role.blocked=角色已封禁,请联系管理员 -login.blocked=很遗憾,访问IP已被列入系统黑名单 user.logout.success=退出成功 length.not.valid=长度必须在{min}到{max}个字符之间 diff --git a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml index ac47c03..e8b52be 100644 --- a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml +++ b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml @@ -3,18 +3,13 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> - - - - - - - - - - - - + + + + + + + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 0fc7c63..5bfa14f 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -1,11 +1,11 @@ - ruoyi com.ruoyi - 3.8.6 + 3.7.0 4.0.0 @@ -43,8 +43,8 @@ - org.springframework.boot - spring-boot-starter-validation + javax.validation + validation-api @@ -58,18 +58,11 @@ com.fasterxml.jackson.core jackson-databind - - - - com.baomidou - dynamic-datasource-spring-boot-starter - 3.5.2 - - com.alibaba.fastjson2 - fastjson2 + com.alibaba + fastjson @@ -78,6 +71,12 @@ commons-io + + + commons-fileupload + commons-fileupload + + org.apache.poi @@ -90,18 +89,12 @@ snakeyaml - + io.jsonwebtoken jjwt - - - javax.xml.bind - jaxb-api - - org.springframework.boot diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java index be49c80..176878e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -25,9 +25,4 @@ public @interface DataScope * 用户表的别名 */ public String userAlias() default ""; - - /** - * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 - */ - public String permission() default ""; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java index 2c5c8c2..79cd191 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -1,13 +1,12 @@ package com.ruoyi.common.annotation; -import com.ruoyi.common.enums.DataSourceType; - 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 com.ruoyi.common.enums.DataSourceType; /** * 自定义多数据源切换注解 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 index 70d3a0a..b09f4ce 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -1,9 +1,5 @@ package com.ruoyi.common.annotation; -import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.IndexedColors; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -60,12 +56,17 @@ public @interface Excel public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; /** - * 导出时在excel中每个列的高度 + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 */ public double height() default 14; /** - * 导出时在excel中每个列的宽度 + * 导出时在excel中每个列的宽 单位为字符 */ public double width() default 16; @@ -89,11 +90,6 @@ public @interface Excel */ public String[] combo() default {}; - /** - * 是否需要纵向合并单元格,应对需求:含有list集合单元格) - */ - public boolean needMerge() default false; - /** * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. */ @@ -110,44 +106,25 @@ public @interface Excel public boolean isStatistics() default false; /** - * 导出类型(0数字 1字符串 2图片) + * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右) */ - public ColumnType cellType() default ColumnType.STRING; + Align align() default Align.AUTO; - /** - * 导出列头背景颜色 - */ - public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; - - /** - * 导出列头字体颜色 - */ - public IndexedColors headerColor() default IndexedColors.WHITE; - - /** - * 导出单元格背景颜色 - */ - public IndexedColors backgroundColor() default IndexedColors.WHITE; - - /** - * 导出单元格字体颜色 - */ - public IndexedColors color() default IndexedColors.BLACK; - - /** - * 导出字段对齐方式 - */ - public HorizontalAlignment align() default HorizontalAlignment.CENTER; + public enum Align + { + AUTO(0), LEFT(1), CENTER(2), RIGHT(3); + private final int value; - /** - * 自定义数据处理器 - */ - public Class handler() default ExcelHandlerAdapter.class; + Align(int value) + { + this.value = value; + } - /** - * 自定义数据处理器参数 - */ - public String[] args() default {}; + public int value() + { + return this.value; + } + } /** * 字段类型(0:导出导入;1:仅导出;2:仅导入) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java index d03d043..eb05dc7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java @@ -1,13 +1,12 @@ package com.ruoyi.common.annotation; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.enums.OperatorType; - 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.enums.BusinessType; +import com.ruoyi.common.enums.OperatorType; /** * 自定义操作日志记录注解 @@ -21,7 +20,7 @@ import java.lang.annotation.Target; public @interface Log { /** - * 模块 + * 模块 */ public String title() default ""; @@ -39,14 +38,4 @@ public @interface Log * 是否保存请求的参数 */ public boolean isSaveRequestData() default true; - - /** - * 是否保存响应的参数 - */ - public boolean isSaveResponseData() default true; - - /** - * 排除指定的请求参数 - */ - public String[] excludeParamNames() default {}; } 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 index 3d75790..69461ea 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -1,13 +1,12 @@ package com.ruoyi.common.annotation; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.enums.LimitType; - 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; /** * 限流注解 @@ -22,7 +21,7 @@ public @interface RateLimiter /** * 限流key */ - public String key() default CacheConstants.RATE_LIMIT_KEY; + public String key() default Constants.RATE_LIMIT_KEY; /** * 限流时间,单位秒 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 b769748..9e350f1 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 @@ -19,13 +19,5 @@ import java.lang.annotation.Target; @Documented public @interface RepeatSubmit { - /** - * 间隔时间(ms),小于此时间视为重复提交 - */ - public int interval() default 5000; - /** - * 提示消息 - */ - public String message() default "不允许重复提交,请稍候再试"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java index abab62b..faf25be 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -12,21 +12,64 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "ruoyi") public class RuoYiConfig { - /** 上传路径 */ - private static String profile; - /** 获取地址开关 */ - private static boolean addressEnabled; - /** 验证码类型 */ - private static String captchaType; /** 项目名称 */ private String name; + /** 版本 */ private String version; + /** 版权年份 */ private String copyrightYear; + /** 实例演示开关 */ private boolean demoEnabled; + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + this.demoEnabled = demoEnabled; + } + public static String getProfile() { return profile; @@ -47,14 +90,6 @@ public class RuoYiConfig RuoYiConfig.addressEnabled = addressEnabled; } - public static String getCaptchaType() { - return captchaType; - } - - public void setCaptchaType(String captchaType) { - RuoYiConfig.captchaType = captchaType; - } - /** * 获取导入上传路径 */ @@ -86,44 +121,4 @@ public class RuoYiConfig { return getProfile() + "/upload"; } - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public String getVersion() - { - return version; - } - - public void setVersion(String version) - { - this.version = version; - } - - public String getCopyrightYear() - { - return copyrightYear; - } - - public void setCopyrightYear(String copyrightYear) - { - this.copyrightYear = copyrightYear; - } - - public boolean isDemoEnabled() - { - return demoEnabled; - } - - public void setDemoEnabled(boolean demoEnabled) - { - this.demoEnabled = demoEnabled; - } } 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 8c1d99a..d36253c 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 @@ -19,11 +19,6 @@ public class Constants */ public static final String GBK = "GBK"; - /** - * www主域 - */ - public static final String WWW = "www."; - /** * http请求 */ @@ -63,7 +58,27 @@ public class Constants * 登录失败 */ public static final String LOGIN_FAIL = "Error"; - + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + /** * 验证码有效期(分钟) */ @@ -110,33 +125,27 @@ public class Constants public static final String JWT_AUTHORITIES = "authorities"; /** - * 资源映射路径 前缀 + * 参数管理 cache key */ - public static final String RESOURCE_PREFIX = "/profile"; + public static final String SYS_CONFIG_KEY = "sys_config:"; /** - * RMI 远程方法调用 + * 字典管理 cache key */ - public static final String LOOKUP_RMI = "rmi:"; + public static final String SYS_DICT_KEY = "sys_dict:"; /** - * LDAP 远程方法调用 - */ - public static final String LOOKUP_LDAP = "ldap:"; - - /** - * LDAPS 远程方法调用 + * 资源映射路径 前缀 */ - public static final String LOOKUP_LDAPS = "ldaps:"; + public static final String RESOURCE_PREFIX = "/profile"; /** - * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + * RMI 远程方法调用 */ - public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; + public static final String LOOKUP_RMI = "rmi://"; /** - * 定时任务违规的字符 + * LDAP 远程方法调用 */ - public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", - "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" }; + public static final String LOOKUP_LDAP = "ldap://"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 7d899d4..1fa328e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -109,9 +109,6 @@ public class GenConstants /** 模糊查询 */ public static final String QUERY_LIKE = "LIKE"; - /** 相等查询 */ - public static final String QUERY_EQ = "EQ"; - /** 需要 */ public static final String REQUIRE = "1"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java index a983c77..d60afee 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -86,9 +86,4 @@ public class HttpStatus * 接口未实现 */ public static final int NOT_IMPLEMENTED = 501; - - /** - * 系统警告消息 - */ - public static final int WARN = 601; } 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 96b149c..4ed6009 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 @@ -60,9 +60,9 @@ public class UserConstants /** InnerLink组件标识 */ public final static String INNER_LINK = "InnerLink"; - /** 校验是否唯一的返回标识 */ - public final static boolean UNIQUE = true; - public final static boolean NOT_UNIQUE = false; + /** 校验返回结果码 */ + public final static String UNIQUE = "0"; + public final static String NOT_UNIQUE = "1"; /** * 用户名长度限制 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 71f90c3..9b3d9c7 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,5 +1,12 @@ package com.ruoyi.common.core.controller; +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ruoyi.common.constant.HttpStatus; @@ -9,18 +16,9 @@ import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableSupport; import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sql.SqlUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; - -import java.beans.PropertyEditorSupport; -import java.util.Date; -import java.util.List; /** * web层通用数据处理 @@ -53,7 +51,15 @@ public class BaseController */ protected void startPage() { - PageUtils.startPage(); + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } } /** @@ -69,14 +75,6 @@ public class BaseController } } - /** - * 清理分页的线程变量 - */ - protected void clearPage() - { - PageUtils.clearPage(); - } - /** * 响应请求分页数据 */ @@ -114,14 +112,6 @@ public class BaseController { return AjaxResult.success(message); } - - /** - * 返回成功消息 - */ - public AjaxResult success(Object data) - { - return AjaxResult.success(data); - } /** * 返回失败消息 @@ -131,14 +121,6 @@ public class BaseController return AjaxResult.error(message); } - /** - * 返回警告消息 - */ - public AjaxResult warn(String message) - { - return AjaxResult.warn(message); - } - /** * 响应返回结果 * diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java index 1d99433..28e5a68 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -1,11 +1,9 @@ package com.ruoyi.common.core.domain; +import java.util.HashMap; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.utils.StringUtils; -import java.util.HashMap; -import java.util.Objects; - /** * 操作消息提醒 * @@ -13,13 +11,16 @@ import java.util.Objects; */ public class AjaxResult extends HashMap { + private static final long serialVersionUID = 1L; + /** 状态码 */ public static final String CODE_TAG = "code"; + /** 返回内容 */ public static final String MSG_TAG = "msg"; + /** 数据对象 */ public static final String DATA_TAG = "data"; - private static final long serialVersionUID = 1L; /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 @@ -100,33 +101,10 @@ public class AjaxResult extends HashMap return new AjaxResult(HttpStatus.SUCCESS, msg, data); } - /** - * 返回警告消息 - * - * @param msg 返回内容 - * @return 警告消息 - */ - public static AjaxResult warn(String msg) - { - return AjaxResult.warn(msg, null); - } - - /** - * 返回警告消息 - * - * @param msg 返回内容 - * @param data 数据对象 - * @return 警告消息 - */ - public static AjaxResult warn(String msg, Object data) - { - return new AjaxResult(HttpStatus.WARN, msg, data); - } - /** * 返回错误消息 * - * @return 错误消息 + * @return */ public static AjaxResult error() { @@ -137,7 +115,7 @@ public class AjaxResult extends HashMap * 返回错误消息 * * @param msg 返回内容 - * @return 错误消息 + * @return 警告消息 */ public static AjaxResult error(String msg) { @@ -149,7 +127,7 @@ public class AjaxResult extends HashMap * * @param msg 返回内容 * @param data 数据对象 - * @return 错误消息 + * @return 警告消息 */ public static AjaxResult error(String msg, Object data) { @@ -161,54 +139,10 @@ public class AjaxResult extends HashMap * * @param code 状态码 * @param msg 返回内容 - * @return 错误消息 + * @return 警告消息 */ public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } - - /** - * 是否为成功消息 - * - * @return 结果 - */ - public boolean isSuccess() - { - return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); - } - - /** - * 是否为警告消息 - * - * @return 结果 - */ - public boolean isWarn() - { - return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); - } - - /** - * 是否为错误消息 - * - * @return 结果 - */ - public boolean isError() - { - return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); - } - - /** - * 方便链式调用 - * - * @param key 键 - * @param value 值 - * @return 数据对象 - */ - @Override - public AjaxResult put(String key, Object value) - { - super.put(key, value); - return this; - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java index dc659d0..f7d5bf4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -1,13 +1,10 @@ package com.ruoyi.common.core.domain; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; - import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonFormat; /** * Entity基类 @@ -19,7 +16,6 @@ public class BaseEntity implements Serializable private static final long serialVersionUID = 1L; /** 搜索值 */ - @JsonIgnore private String searchValue; /** 创建者 */ @@ -40,7 +36,6 @@ public class BaseEntity implements Serializable private String remark; /** 请求参数 */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) private Map params; public String getSearchValue() diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java index 16b54a5..bd835db 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java @@ -1,12 +1,11 @@ package com.ruoyi.common.core.domain; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.core.domain.entity.SysMenu; - import java.io.Serializable; import java.util.List; import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysMenu; /** * Treeselect树结构实体类 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java index ec6c622..c9238e2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -1,15 +1,13 @@ package com.ruoyi.common.core.domain.entity; -import com.ruoyi.common.core.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - +import java.util.ArrayList; +import java.util.List; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import java.util.ArrayList; -import java.util.List; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; /** * 部门表 sys_dept @@ -33,7 +31,7 @@ public class SysDept extends BaseEntity private String deptName; /** 显示顺序 */ - private Integer orderNum; + private String orderNum; /** 负责人 */ private String leader; @@ -98,13 +96,13 @@ public class SysDept extends BaseEntity this.deptName = deptName; } - @NotNull(message = "显示顺序不能为空") - public Integer getOrderNum() + @NotBlank(message = "显示顺序不能为空") + public String getOrderNum() { return orderNum; } - public void setOrderNum(Integer orderNum) + public void setOrderNum(String orderNum) { this.orderNum = orderNum; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java index a6634b7..3f152b3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -1,14 +1,13 @@ package com.ruoyi.common.core.domain.entity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; /** * 字典数据表 sys_dict_data @@ -132,7 +131,7 @@ public class SysDictData extends BaseEntity public boolean getDefault() { - return UserConstants.YES.equals(this.isDefault); + return UserConstants.YES.equals(this.isDefault) ? true : false; } public String getIsDefault() diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java index 64d437b..d2c4249 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -1,14 +1,12 @@ package com.ruoyi.common.core.domain.entity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; /** * 字典类型表 sys_dict_type @@ -59,7 +57,6 @@ public class SysDictType extends BaseEntity @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") - @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") public String getDictType() { return dictType; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 0a05dd4..5e79fc9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,14 +1,12 @@ package com.ruoyi.common.core.domain.entity; -import com.ruoyi.common.core.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; /** * 菜单权限表 sys_menu @@ -32,7 +30,7 @@ public class SysMenu extends BaseEntity private Long parentId; /** 显示顺序 */ - private Integer orderNum; + private String orderNum; /** 路由地址 */ private String path; @@ -55,7 +53,7 @@ public class SysMenu extends BaseEntity /** 显示状态(0显示 1隐藏) */ private String visible; - /** 菜单状态(0正常 1停用) */ + /** 菜单状态(0显示 1隐藏) */ private String status; /** 权限字符串 */ @@ -109,13 +107,13 @@ public class SysMenu extends BaseEntity this.parentId = parentId; } - @NotNull(message = "显示顺序不能为空") - public Integer getOrderNum() + @NotBlank(message = "显示顺序不能为空") + public String getOrderNum() { return orderNum; } - public void setOrderNum(Integer orderNum) + public void setOrderNum(String orderNum) { this.orderNum = orderNum; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index e4245df..36629eb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -1,15 +1,12 @@ package com.ruoyi.common.core.domain.entity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.Set; /** * 角色表 sys_role @@ -34,7 +31,7 @@ public class SysRole extends BaseEntity /** 角色排序 */ @Excel(name = "角色排序") - private Integer roleSort; + private String roleSort; /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") @@ -62,9 +59,6 @@ public class SysRole extends BaseEntity /** 部门组(数据权限) */ private Long[] deptIds; - /** 角色菜单权限 */ - private Set permissions; - public SysRole() { @@ -75,11 +69,6 @@ public class SysRole extends BaseEntity this.roleId = roleId; } - public static boolean isAdmin(Long roleId) - { - return roleId != null && 1L == roleId; - } - public Long getRoleId() { return roleId; @@ -95,6 +84,11 @@ public class SysRole extends BaseEntity return isAdmin(this.roleId); } + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + @NotBlank(message = "角色名称不能为空") @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") public String getRoleName() @@ -119,13 +113,13 @@ public class SysRole extends BaseEntity this.roleKey = roleKey; } - @NotNull(message = "显示顺序不能为空") - public Integer getRoleSort() + @NotBlank(message = "显示顺序不能为空") + public String getRoleSort() { return roleSort; } - public void setRoleSort(Integer roleSort) + public void setRoleSort(String roleSort) { this.roleSort = roleSort; } @@ -209,17 +203,7 @@ public class SysRole extends BaseEntity { this.deptIds = deptIds; } - - public Set getPermissions() - { - return permissions; - } - - public void setPermissions(Set permissions) - { - this.permissions = permissions; - } - + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 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 c6ae49b..f6968c0 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 @@ -1,19 +1,19 @@ package com.ruoyi.common.core.domain.entity; +import java.util.Date; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; 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.core.domain.BaseEntity; -import com.ruoyi.common.xss.Xss; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import java.util.Date; -import java.util.List; /** * 用户对象 sys_user @@ -58,6 +58,9 @@ public class SysUser extends BaseEntity /** 密码 */ private String password; + /** 盐加密 */ + private String salt; + /** 帐号状态(0正常 1停用) */ @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") private String status; @@ -102,11 +105,6 @@ public class SysUser extends BaseEntity this.userId = userId; } - public static boolean isAdmin(Long userId) - { - return userId != null && 1L == userId; - } - public Long getUserId() { return userId; @@ -122,6 +120,11 @@ public class SysUser extends BaseEntity return isAdmin(this.userId); } + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + public Long getDeptId() { return deptId; @@ -132,7 +135,6 @@ public class SysUser extends BaseEntity this.deptId = deptId; } - @Xss(message = "用户昵称不能包含脚本字符") @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") public String getNickName() { @@ -144,7 +146,6 @@ public class SysUser extends BaseEntity this.nickName = nickName; } - @Xss(message = "用户账号不能包含脚本字符") @NotBlank(message = "用户账号不能为空") @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") public String getUserName() @@ -200,6 +201,8 @@ public class SysUser extends BaseEntity this.avatar = avatar; } + @JsonIgnore + @JsonProperty public String getPassword() { return password; @@ -210,6 +213,16 @@ public class SysUser extends BaseEntity this.password = password; } + public String getSalt() + { + return salt; + } + + public void setSalt(String salt) + { + this.salt = salt; + } + public String getStatus() { return status; @@ -312,6 +325,7 @@ public class SysUser extends BaseEntity .append("sex", getSex()) .append("avatar", getAvatar()) .append("password", getPassword()) + .append("salt", getSalt()) .append("status", getStatus()) .append("delFlag", getDelFlag()) .append("loginIp", getLoginIp()) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java index b5bc8c8..03948b4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -25,7 +25,7 @@ public class LoginBody /** * 唯一标识 */ - private String uuid; + private String uuid = ""; public String getUsername() { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index 9f0958a..a8a0d0f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -1,12 +1,11 @@ package com.ruoyi.common.core.domain.model; -import com.alibaba.fastjson2.annotation.JSONField; -import com.ruoyi.common.core.domain.entity.SysUser; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - import java.util.Collection; import java.util.Set; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ruoyi.common.core.domain.entity.SysUser; /** * 登录用户身份权限 @@ -72,24 +71,6 @@ public class LoginUser implements UserDetails */ private SysUser user; - public LoginUser() - { - } - - public LoginUser(SysUser user, Set permissions) - { - this.user = user; - this.permissions = permissions; - } - - public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) - { - this.userId = userId; - this.deptId = deptId; - this.user = user; - this.permissions = permissions; - } - public Long getUserId() { return userId; @@ -120,7 +101,25 @@ public class LoginUser implements UserDetails this.token = token; } - @JSONField(serialize = false) + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + @JsonIgnore @Override public String getPassword() { @@ -136,7 +135,7 @@ public class LoginUser implements UserDetails /** * 账户是否未过期,过期无法验证 */ - @JSONField(serialize = false) + @JsonIgnore @Override public boolean isAccountNonExpired() { @@ -148,7 +147,7 @@ public class LoginUser implements UserDetails * * @return */ - @JSONField(serialize = false) + @JsonIgnore @Override public boolean isAccountNonLocked() { @@ -160,7 +159,7 @@ public class LoginUser implements UserDetails * * @return */ - @JSONField(serialize = false) + @JsonIgnore @Override public boolean isCredentialsNonExpired() { @@ -172,7 +171,7 @@ public class LoginUser implements UserDetails * * @return */ - @JSONField(serialize = false) + @JsonIgnore @Override public boolean isEnabled() { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java index a120c30..5f30168 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java @@ -1,6 +1,5 @@ package com.ruoyi.common.core.page; -import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.ServletUtils; /** @@ -41,8 +40,8 @@ public class TableSupport public static PageDomain getPageDomain() { PageDomain pageDomain = new PageDomain(); - pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); - pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM)); + pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE)); pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 4e1c929..22a610d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -1,18 +1,17 @@ package com.ruoyi.common.core.redis; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.BoundSetOperations; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Component; - import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; /** * spring redis 工具类 @@ -75,28 +74,6 @@ public class RedisCache return redisTemplate.expire(key, timeout, unit); } - /** - * 获取有效时间 - * - * @param key Redis键 - * @return 有效时间 - */ - public long getExpire(final String key) - { - return redisTemplate.getExpire(key); - } - - /** - * 判断 key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public Boolean hasKey(String key) - { - return redisTemplate.hasKey(key); - } - /** * 获得缓存的基本对象。 * @@ -125,9 +102,9 @@ public class RedisCache * @param collection 多个对象 * @return */ - public boolean deleteObject(final Collection collection) + public long deleteObject(final Collection collection) { - return redisTemplate.delete(collection) > 0; + return redisTemplate.delete(collection); } /** @@ -244,18 +221,6 @@ public class RedisCache return redisTemplate.opsForHash().multiGet(key, hKeys); } - /** - * 删除Hash中的某条数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return 是否成功 - */ - public boolean deleteCacheMapValue(final String key, final String hKey) - { - return redisTemplate.opsForHash().delete(key, hKey) > 0; - } - /** * 获得缓存的基本对象列表 * diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java index 656b3aa..84124aa 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -1,9 +1,8 @@ package com.ruoyi.common.core.text; -import com.ruoyi.common.utils.StringUtils; - import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import com.ruoyi.common.utils.StringUtils; /** * 字符集工具类 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java index fe83994..1fb7461 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java @@ -1,14 +1,13 @@ package com.ruoyi.common.core.text; -import com.ruoyi.common.utils.StringUtils; -import org.apache.commons.lang3.ArrayUtils; - import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Set; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; /** * 类型转换器 @@ -563,12 +562,17 @@ public class Convert switch (valueStr) { case "true": + return true; + case "false": + return false; case "yes": + return true; case "ok": - case "1": return true; - case "false": case "no": + return false; + case "1": + return true; case "0": return false; default: @@ -714,7 +718,7 @@ public class Convert } if (value instanceof Double) { - return BigDecimal.valueOf((Double) value); + return new BigDecimal((Double) value); } if (value instanceof Integer) { @@ -895,7 +899,7 @@ public class Convert */ public static String toSBC(String input, Set notConvertSet) { - char[] c = input.toCharArray(); + char c[] = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (null != notConvertSet && notConvertSet.contains(c[i])) @@ -937,7 +941,7 @@ public class Convert */ public static String toDBC(String text, Set notConvertSet) { - char[] c = text.toCharArray(); + char c[] = text.toCharArray(); for (int i = 0; i < c.length; i++) { if (null != notConvertSet && notConvertSet.contains(c[i])) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java index fc9f7ad..be6f739 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java @@ -1,9 +1,8 @@ package com.ruoyi.common.enums; -import org.springframework.lang.Nullable; - import java.util.HashMap; import java.util.Map; +import org.springframework.lang.Nullable; /** * 请求方式 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 index 81a71b5..211441b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -7,6 +7,7 @@ package com.ruoyi.common.exception; */ public class GlobalException extends RuntimeException { + private static final long serialVersionUID = 1L; /** @@ -44,7 +45,6 @@ public class GlobalException extends RuntimeException return this; } - @Override public String getMessage() { return message; 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 index d820fe2..6297f87 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -49,16 +49,14 @@ public final class ServiceException extends RuntimeException return detailMessage; } - public ServiceException setDetailMessage(String detailMessage) + public String getMessage() { - this.detailMessage = detailMessage; - return this; + return message; } - @Override - public String getMessage() + public Integer getCode() { - return message; + return code; } public ServiceException setMessage(String message) @@ -67,8 +65,9 @@ public final class ServiceException extends RuntimeException return this; } - public Integer getCode() + public ServiceException setDetailMessage(String detailMessage) { - return code; + this.detailMessage = detailMessage; + return this; } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java index 011f308..f1c8e83 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java @@ -1,6 +1,7 @@ package com.ruoyi.common.exception.file; import java.util.Arrays; +import org.apache.commons.fileupload.FileUploadException; /** * 文件上传 误异常类 @@ -17,7 +18,7 @@ public class InvalidExtensionException extends FileUploadException public InvalidExtensionException(String[] allowedExtension, String extension, String filename) { - super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); + super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); this.allowedExtension = allowedExtension; this.extension = extension; this.filename = filename; 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 8618ecf..a1bcfe2 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,8 +1,6 @@ package com.ruoyi.common.filter; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.http.MediaType; - +import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -10,7 +8,8 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import java.io.IOException; +import org.springframework.http.MediaType; +import com.ruoyi.common.utils.StringUtils; /** * Repeatable 过滤器 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java index 14efa86..614c24c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java @@ -1,17 +1,15 @@ package com.ruoyi.common.filter; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.http.HttpHelper; - +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import com.ruoyi.common.utils.http.HttpHelper; /** * 构建可重复读取inputStream的request @@ -25,10 +23,10 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException { super(request); - request.setCharacterEncoding(Constants.UTF8); - response.setCharacterEncoding(Constants.UTF8); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); - body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + body = HttpHelper.getBodyString(request).getBytes("UTF-8"); } @Override 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 4e50a49..99323ed 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,8 +1,8 @@ package com.ruoyi.common.filter; -import com.ruoyi.common.enums.HttpMethod; -import com.ruoyi.common.utils.StringUtils; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -11,9 +11,7 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.utils.StringUtils; /** * 防止XSS攻击的过滤器 @@ -61,7 +59,7 @@ public class XssFilter implements Filter String url = request.getServletPath(); String method = request.getMethod(); // GET DELETE 不过滤 - if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + if (method == null || method.matches("GET") || method.matches("DELETE")) { return true; } 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 21446a7..b1eeb65 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,17 +1,16 @@ package com.ruoyi.common.filter; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.html.EscapeUtil; -import org.apache.commons.io.IOUtils; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; - +import java.io.ByteArrayInputStream; +import java.io.IOException; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import java.io.ByteArrayInputStream; -import java.io.IOException; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; /** * XSS过滤处理 @@ -35,13 +34,13 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper if (values != null) { int length = values.length; - String[] escapesValues = new String[length]; + String[] escapseValues = new String[length]; for (int i = 0; i < length; i++) { // 防xss攻击和过滤前后空格 - escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + escapseValues[i] = EscapeUtil.clean(values[i]).trim(); } - return escapesValues; + return escapseValues; } return super.getParameterValues(name); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index 565eb0a..536cb3c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -1,16 +1,10 @@ package com.ruoyi.common.utils; -import org.apache.commons.lang3.time.DateFormatUtils; - import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; import java.util.Date; +import org.apache.commons.lang3.time.DateFormatUtils; /** * 时间工具类 @@ -28,7 +22,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; - + private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", @@ -127,7 +121,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return null; } } - + /** * 获取服务器启动时间 */ @@ -138,28 +132,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils } /** - * 计算相差天数 - */ - public static int differentDaysByMillisecond(Date date1, Date date2) - { - return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); - } - - /** - * 计算时间差 - * - * @param endDate 最后时间 - * @param startTime 开始时间 - * @return 时间差(天/小时/分钟) + * 计算两个时间差 */ - public static String timeDistance(Date endDate, Date startTime) + public static String getDatePoor(Date endDate, Date nowDate) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // long ns = 1000; // 获得两个时间的毫秒时间差异 - long diff = endDate.getTime() - startTime.getTime(); + long diff = endDate.getTime() - nowDate.getTime(); // 计算差多少天 long day = diff / nd; // 计算差多少小时 @@ -170,23 +152,4 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils // long sec = diff % nd % nh % nm / ns; return day + "天" + hour + "小时" + min + "分钟"; } - - /** - * 增加 LocalDateTime ==> Date - */ - public static Date toDate(LocalDateTime temporalAccessor) - { - ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } - - /** - * 增加 LocalDate ==> Date - */ - public static Date toDate(LocalDate temporalAccessor) - { - LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); - ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } } 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 e466536..fd9946d 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,14 +1,12 @@ package com.ruoyi.common.utils; -import com.alibaba.fastjson2.JSONArray; -import com.ruoyi.common.constant.CacheConstants; +import java.util.Collection; +import java.util.List; +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; - /** * 字典工具类 * @@ -40,10 +38,11 @@ public class DictUtils */ public static List getDictCache(String key) { - JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); - if (StringUtils.isNotNull(arrayCache)) + Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(cacheObj)) { - return arrayCache.toList(SysDictData.class); + List dictDatas = StringUtils.cast(cacheObj); + return dictDatas; } return null; } @@ -85,30 +84,27 @@ public class DictUtils StringBuilder propertyString = new StringBuilder(); List datas = getDictCache(dictType); - if (StringUtils.isNotNull(datas)) + if (StringUtils.containsAny(separator, dictValue) && StringUtils.isNotEmpty(datas)) { - if (StringUtils.containsAny(separator, dictValue)) + for (SysDictData dict : datas) { - for (SysDictData dict : datas) + for (String value : dictValue.split(separator)) { - for (String value : dictValue.split(separator)) + if (value.equals(dict.getDictValue())) { - if (value.equals(dict.getDictValue())) - { - propertyString.append(dict.getDictLabel()).append(separator); - break; - } + propertyString.append(dict.getDictLabel() + separator); + break; } } } - else + } + else + { + for (SysDictData dict : datas) { - for (SysDictData dict : datas) + if (dictValue.equals(dict.getDictValue())) { - if (dictValue.equals(dict.getDictValue())) - { - return dict.getDictLabel(); - } + return dict.getDictLabel(); } } } @@ -136,7 +132,7 @@ public class DictUtils { if (label.equals(dict.getDictLabel())) { - propertyString.append(dict.getDictValue()).append(separator); + propertyString.append(dict.getDictValue() + separator); break; } } @@ -170,7 +166,7 @@ public class DictUtils */ public static void clearDictCache() { - Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + Collection keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); SpringUtils.getBean(RedisCache.class).deleteObject(keys); } @@ -182,6 +178,6 @@ public class DictUtils */ public static String getCacheKey(String configKey) { - return CacheConstants.SYS_DICT_KEY + configKey; + return Constants.SYS_DICT_KEY + configKey; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java index 6ae8a4c..ae81a69 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java @@ -1,9 +1,8 @@ package com.ruoyi.common.utils; -import org.apache.commons.lang3.exception.ExceptionUtils; - import java.io.PrintWriter; import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; /** * 错误信息处理类。 @@ -19,7 +18,8 @@ public class ExceptionUtil { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw, true)); - return sw.toString(); + String str = sw.toString(); + return str; } public static String getRootErrorMessage(Exception e) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java index 59cf09e..7dac75a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -1,8 +1,8 @@ package com.ruoyi.common.utils; -import com.ruoyi.common.utils.spring.SpringUtils; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; +import com.ruoyi.common.utils.spring.SpringUtils; /** * 获取i18n资源文件 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 e8ab744..a6f3d53 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 @@ -1,11 +1,11 @@ package com.ruoyi.common.utils; -import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.ServiceException; import org.springframework.security.core.Authentication; 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.ServiceException; /** * 安全服务工具类 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 ea4b9bc..03576c5 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,22 +1,13 @@ package com.ruoyi.common.utils; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.text.Convert; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.ServletRequest; +import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.ruoyi.common.core.text.Convert; /** * 客户端工具类 @@ -73,34 +64,6 @@ public class ServletUtils return Convert.toBool(getRequest().getParameter(name), defaultValue); } - /** - * 获得所有请求参数 - * - * @param request 请求对象{@link ServletRequest} - * @return Map - */ - public static Map getParams(ServletRequest request) - { - final Map map = request.getParameterMap(); - return Collections.unmodifiableMap(map); - } - - /** - * 获得所有请求参数 - * - * @param request 请求对象{@link ServletRequest} - * @return Map - */ - public static Map getParamMap(ServletRequest request) - { - Map params = new HashMap<>(); - for (Map.Entry entry : getParams(request).entrySet()) - { - params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); - } - return params; - } - /** * 获取request */ @@ -136,8 +99,9 @@ public class ServletUtils * * @param response 渲染对象 * @param string 待渲染的字符串 + * @return null */ - public static void renderString(HttpServletResponse response, String string) + public static String renderString(HttpServletResponse response, String string) { try { @@ -150,6 +114,7 @@ public class ServletUtils { e.printStackTrace(); } + return null; } /** @@ -160,13 +125,13 @@ public class ServletUtils public static boolean isAjaxRequest(HttpServletRequest request) { String accept = request.getHeader("accept"); - if (accept != null && accept.contains("application/json")) + if (accept != null && accept.indexOf("application/json") != -1) { return true; } String xRequestedWith = request.getHeader("X-Requested-With"); - if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { return true; } @@ -178,42 +143,10 @@ public class ServletUtils } String ajax = request.getParameter("__ajax"); - return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); - } - - /** - * 内容编码 - * - * @param str 内容 - * @return 编码后的内容 - */ - public static String urlEncode(String str) - { - try - { - return URLEncoder.encode(str, Constants.UTF8); - } - catch (UnsupportedEncodingException e) - { - return StringUtils.EMPTY; - } - } - - /** - * 内容解码 - * - * @param str 内容 - * @return 解码后的内容 - */ - public static String urlDecode(String str) - { - try + if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) { - return URLDecoder.decode(str, Constants.UTF8); - } - catch (UnsupportedEncodingException e) - { - return StringUtils.EMPTY; + 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 694c1f7..4ca2bfc 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,15 +1,14 @@ package com.ruoyi.common.utils; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.text.StrFormatter; -import org.springframework.util.AntPathMatcher; - import java.util.ArrayList; import java.util.Collection; 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; /** * 字符串工具类 @@ -325,32 +324,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return list; } - /** - * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value - * - * @param collection 给定的集合 - * @param array 给定的数组 - * @return boolean 结果 - */ - public static boolean containsAny(Collection collection, String... array) - { - if (isEmpty(collection) || isEmpty(array)) - { - return false; - } - else - { - for (String str : array) - { - if (collection.contains(str)) - { - return true; - } - } - return false; - } - } - /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 * @@ -482,8 +455,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } /** - * 驼峰式命名法 - * 例如:user_name->userName + * 驼峰式命名法 例如:user_name->userName */ public static String toCamelCase(String s) { @@ -491,10 +463,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return null; } - if (s.indexOf(SEPARATOR) == -1) - { - return s; - } s = s.toLowerCase(); StringBuilder sb = new StringBuilder(s.length()); boolean upperCase = false; @@ -563,53 +531,4 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return (T) obj; } - - /** - * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 - * - * @param num 数字对象 - * @param size 字符串指定长度 - * @return 返回数字的字符串格式,该字符串为指定长度。 - */ - public static final String padl(final Number num, final int size) - { - return padl(num.toString(), size, '0'); - } - - /** - * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 - * - * @param s 原始字符串 - * @param size 字符串指定长度 - * @param c 用于补齐的字符 - * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 - */ - public static final String padl(final String s, final int size, final char c) - { - final StringBuilder sb = new StringBuilder(size); - if (s != null) - { - final int len = s.length(); - if (s.length() <= size) - { - for (int i = size - len; i > 0; i--) - { - sb.append(c); - } - sb.append(s); - } - else - { - return s.substring(len - size, len); - } - } - else - { - for (int i = size; i > 0; i--) - { - sb.append(c); - } - } - return sb.toString(); - } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java index 0a9f56d..1934195 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -1,13 +1,12 @@ package com.ruoyi.common.utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 线程相关工具类. @@ -37,7 +36,7 @@ public class Threads * 停止线程池 * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. - * 如果仍然超時,則強制退出. + * 如果仍人超時,則強制退出. * 另对在shutdown时线程本身被调用中断做了处理. */ public static void shutdownAndAwaitTermination(ExecutorService pool) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java index c0bdbf4..68130b9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -1,8 +1,7 @@ package com.ruoyi.common.utils.file; -import org.apache.commons.lang3.StringUtils; - import java.io.File; +import org.apache.commons.lang3.StringUtils; /** * 文件类型工具类 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 6615d58..eb12806 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,5 +1,9 @@ package com.ruoyi.common.utils.file; +import java.io.File; +import java.io.IOException; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; @@ -7,14 +11,7 @@ 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 com.ruoyi.common.utils.uuid.Seq; -import org.apache.commons.io.FilenameUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.Objects; +import com.ruoyi.common.utils.uuid.IdUtils; /** * 文件上传工具类 @@ -38,14 +35,14 @@ public class FileUploadUtils */ private static String defaultBaseDir = RuoYiConfig.getProfile(); - public static String getDefaultBaseDir() + public static void setDefaultBaseDir(String defaultBaseDir) { - return defaultBaseDir; + FileUploadUtils.defaultBaseDir = defaultBaseDir; } - public static void setDefaultBaseDir(String defaultBaseDir) + public static String getDefaultBaseDir() { - FileUploadUtils.defaultBaseDir = defaultBaseDir; + return defaultBaseDir; } /** @@ -103,7 +100,7 @@ public class FileUploadUtils throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException { - int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + int fileNamelength = file.getOriginalFilename().length(); if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); @@ -113,9 +110,10 @@ public class FileUploadUtils String fileName = extractFilename(file); - String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); - file.transferTo(Paths.get(absPath)); - return getPathFileName(baseDir, fileName); + File desc = getAbsoluteFile(baseDir, fileName); + file.transferTo(desc); + String pathFileName = getPathFileName(baseDir, fileName); + return pathFileName; } /** @@ -123,8 +121,10 @@ public class FileUploadUtils */ public static final String extractFilename(MultipartFile file) { - return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), - FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + return fileName; } public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException @@ -145,7 +145,8 @@ public class FileUploadUtils { int dirLastIndex = RuoYiConfig.getProfile().length() + 1; String currentDir = StringUtils.substring(uploadDir, dirLastIndex); - return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + return pathFileName; } /** @@ -160,7 +161,7 @@ public class FileUploadUtils throws FileSizeLimitExceededException, InvalidExtensionException { long size = file.getSize(); - if (size > DEFAULT_MAX_SIZE) + if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) { throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); } @@ -194,6 +195,7 @@ public class FileUploadUtils throw new InvalidExtensionException(allowedExtension, extension, fileName); } } + } /** @@ -226,7 +228,7 @@ public class FileUploadUtils String extension = FilenameUtils.getExtension(file.getOriginalFilename()); if (StringUtils.isEmpty(extension)) { - extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + extension = MimeTypeUtils.getExtension(file.getContentType()); } return extension; } 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 5288d2d..ff33055 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 @@ -1,15 +1,5 @@ package com.ruoyi.common.utils.file; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.uuid.IdUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.ArrayUtils; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -19,6 +9,14 @@ import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; /** * 文件处理工具类 @@ -117,7 +115,8 @@ public class FileUtils // 路径为文件且不为空则进行删除 if (file.isFile() && file.exists()) { - flag = file.delete(); + file.delete(); + flag = true; } return flag; } @@ -197,6 +196,7 @@ public class FileUtils * * @param response 响应对象 * @param realFileName 真实文件名 + * @return */ public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { @@ -210,9 +210,7 @@ public class FileUtils .append("utf-8''") .append(percentEncodedFileName); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); response.setHeader("Content-disposition", contentDispositionValue.toString()); - response.setHeader("download-filename", percentEncodedFileName); } /** @@ -255,38 +253,4 @@ public class FileUtils } return strFileExtendName; } - - /** - * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png - * - * @param fileName 路径名称 - * @return 没有文件路径的名称 - */ - public static String getName(String fileName) - { - if (fileName == null) - { - return null; - } - int lastUnixPos = fileName.lastIndexOf('/'); - int lastWindowsPos = fileName.lastIndexOf('\\'); - int index = Math.max(lastUnixPos, lastWindowsPos); - return fileName.substring(index + 1); - } - - /** - * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi - * - * @param fileName 路径名称 - * @return 没有文件路径和后缀的名称 - */ - public static String getNameNotSuffix(String fileName) - { - if (fileName == null) - { - return null; - } - String baseName = FilenameUtils.getBaseName(fileName); - return baseName; - } } 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 966a0a0..0b7b5aa 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,18 +1,18 @@ 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; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; /** * 图片处理工具类 @@ -59,12 +59,13 @@ public class ImageUtils /** * 读取文件为字节数据 * - * @param url 地址 + * @param key 地址 * @return 字节数据 */ public static byte[] readFile(String url) { InputStream in = null; + ByteArrayOutputStream baos = null; try { if (url.startsWith("http")) @@ -94,6 +95,7 @@ public class ImageUtils finally { IOUtils.closeQuietly(in); + IOUtils.closeQuietly(baos); } } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java index f52e83e..7f74ac2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java @@ -69,37 +69,26 @@ public class EscapeUtil */ private static String encode(String text) { - if (StringUtils.isEmpty(text)) + int len; + if ((text == null) || ((len = text.length()) == 0)) { return StringUtils.EMPTY; } - - final StringBuilder tmp = new StringBuilder(text.length() * 6); + StringBuilder buffer = new StringBuilder(len + (len >> 2)); char c; - for (int i = 0; i < text.length(); i++) + for (int i = 0; i < len; i++) { c = text.charAt(i); - if (c < 256) + if (c < 64) { - tmp.append("%"); - if (c < 16) - { - tmp.append("0"); - } - tmp.append(Integer.toString(c, 16)); + buffer.append(TEXT[c]); } else { - tmp.append("%u"); - if (c <= 0xfff) - { - // issue#I49JU8@Gitee - tmp.append("0"); - } - tmp.append(Integer.toString(c, 16)); + buffer.append(c); } } - return tmp.toString(); + return buffer.toString(); } /** @@ -156,12 +145,11 @@ public class EscapeUtil public static void main(String[] args) { String html = ""; - String escape = EscapeUtil.escape(html); // String html = "ipt>alert(\"XSS\")ipt>"; // String html = "<123"; // String html = "123>"; - System.out.println("clean: " + EscapeUtil.clean(html)); - System.out.println("escape: " + escape); - System.out.println("unescape: " + EscapeUtil.unescape(escape)); + System.out.println(EscapeUtil.clean(html)); + System.out.println(EscapeUtil.escape(html)); + System.out.println(EscapeUtil.unescape(html)); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java index 9f7da6d..cd8cd4f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java @@ -165,6 +165,11 @@ public final class HTMLFilter alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; } + private void reset() + { + vTagCounts.clear(); + } + // --------------------------------------------------------------- // my versions of some PHP library functions public static String chr(final int decimal) @@ -182,31 +187,8 @@ public final class HTMLFilter return result; } - private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) - { - Matcher m = regex_pattern.matcher(s); - return m.replaceAll(replacement); - } - // --------------------------------------------------------------- - private static boolean inArray(final String s, final String[] array) - { - for (String item : array) - { - if (item != null && item.equals(s)) - { - return true; - } - } - return false; - } - - private void reset() - { - vTagCounts.clear(); - } - /** * given a user submitted input String, filter out any invalid or restricted html. * @@ -335,6 +317,12 @@ public final class HTMLFilter return result; } + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + private String processTag(final String s) { // ending tags @@ -344,7 +332,7 @@ public final class HTMLFilter final String name = m.group(1).toLowerCase(); if (allowed(name)) { - if (!inArray(name, vSelfClosingTags)) + if (false == inArray(name, vSelfClosingTags)) { if (vTagCounts.containsKey(name)) { @@ -399,7 +387,7 @@ public final class HTMLFilter { paramValue = processParamProtocol(paramValue); } - params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); + params.append(' ').append(paramName).append("=\"").append(paramValue).append("\""); } } @@ -558,6 +546,18 @@ public final class HTMLFilter return inArray(entity, vAllowedEntities); } + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + private boolean allowed(final String name) { return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java index 48c782f..dac60ad 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java @@ -1,15 +1,14 @@ package com.ruoyi.common.utils.http; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 通用http工具封装 @@ -26,7 +25,7 @@ public class HttpHelper BufferedReader reader = null; try (InputStream inputStream = request.getInputStream()) { - reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); String line = ""; while ((line = reader.readLine()) != null) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index f6036e4..9aee92e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -1,16 +1,5 @@ package com.ruoyi.common.utils.http; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -20,8 +9,16 @@ import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; -import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; /** * 通用http发送方法 @@ -32,17 +29,6 @@ public class HttpUtils { private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); - /** - * 向指定 URL 发送GET方法的请求 - * - * @param url 发送请求的 URL - * @return 所代表远程资源的响应结果 - */ - public static String sendGet(String url) - { - return sendGet(url, StringUtils.EMPTY); - } - /** * 向指定 URL 发送GET方法的请求 * @@ -69,7 +55,7 @@ public class HttpUtils BufferedReader in = null; try { - String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + String urlNameString = url + "?" + param; log.info("sendGet - {}", urlNameString); URL realUrl = new URL(urlNameString); URLConnection connection = realUrl.openConnection(); @@ -132,8 +118,9 @@ public class HttpUtils StringBuilder result = new StringBuilder(); try { - log.info("sendPost - {}", url); - URL realUrl = new URL(url); + String urlNameString = url; + log.info("sendPost - {}", urlNameString); + URL realUrl = new URL(urlNameString); URLConnection conn = realUrl.openConnection(); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); @@ -145,7 +132,7 @@ public class HttpUtils out = new PrintWriter(conn.getOutputStream()); out.print(param); out.flush(); - in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); String line; while ((line = in.readLine()) != null) { @@ -219,7 +206,7 @@ public class HttpUtils { if (ret != null && !"".equals(ret.trim())) { - result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8")); } } log.info("recv - {}", result); 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 a852b43..01c24fc 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,13 +1,12 @@ package com.ruoyi.common.utils.ip; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * 获取地址类 @@ -16,14 +15,17 @@ import org.slf4j.LoggerFactory; */ public class AddressUtils { + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + // IP地址查询 public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + // 未知地址 public static final String UNKNOWN = "XX XX"; - private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); public static String getRealAddressByIP(String ip) { + String address = UNKNOWN; // 内网不查询 if (IpUtils.internalIp(ip)) { @@ -39,7 +41,7 @@ public class AddressUtils log.error("获取地理位置异常 {}", ip); return UNKNOWN; } - JSONObject obj = JSON.parseObject(rspStr); + JSONObject obj = JSONObject.parseObject(rspStr); String region = obj.getString("pro"); String city = obj.getString("city"); return String.format("%s %s", region, city); @@ -49,6 +51,6 @@ public class AddressUtils log.error("获取地理位置异常 {}", ip); } } - return UNKNOWN; + return address; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java index ca13916..1b3f42b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java @@ -1,11 +1,10 @@ package com.ruoyi.common.utils.ip; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; - -import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; /** * 获取IP方法 @@ -14,29 +13,6 @@ import java.net.UnknownHostException; */ public class IpUtils { - public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; - // 匹配 ip - public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; - // 匹配网段 - public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; - public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; - - /** - * 获取客户端IP - * - * @return IP地址 - */ - public static String getIpAddr() - { - return getIpAddr(ServletUtils.getRequest()); - } - - /** - * 获取客户端IP - * - * @param request 请求对象 - * @return IP地址 - */ public static String getIpAddr(HttpServletRequest request) { if (request == null) @@ -65,28 +41,15 @@ public class IpUtils { ip = request.getRemoteAddr(); } - - return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip); } - /** - * 检查是否为内部IP地址 - * - * @param ip IP地址 - * @return 结果 - */ public static boolean internalIp(String ip) { byte[] addr = textToNumericFormatV4(ip); return internalIp(addr) || "127.0.0.1".equals(ip); } - /** - * 检查是否为内部IP地址 - * - * @param addr byte地址 - * @return 结果 - */ private static boolean internalIp(byte[] addr) { if (StringUtils.isNull(addr) || addr.length < 2) @@ -147,8 +110,7 @@ public class IpUtils { case 1: l = Long.parseLong(elements[0]); - if ((l < 0L) || (l > 4294967295L)) - { + if ((l < 0L) || (l > 4294967295L)) { return null; } bytes[0] = (byte) (int) (l >> 24 & 0xFF); @@ -158,14 +120,12 @@ public class IpUtils break; case 2: l = Integer.parseInt(elements[0]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[0] = (byte) (int) (l & 0xFF); l = Integer.parseInt(elements[1]); - if ((l < 0L) || (l > 16777215L)) - { + if ((l < 0L) || (l > 16777215L)) { return null; } bytes[1] = (byte) (int) (l >> 16 & 0xFF); @@ -176,15 +136,13 @@ public class IpUtils for (i = 0; i < 2; ++i) { l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); } l = Integer.parseInt(elements[2]); - if ((l < 0L) || (l > 65535L)) - { + if ((l < 0L) || (l > 65535L)) { return null; } bytes[2] = (byte) (int) (l >> 8 & 0xFF); @@ -194,8 +152,7 @@ public class IpUtils for (i = 0; i < 4; ++i) { l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); @@ -212,11 +169,6 @@ public class IpUtils return bytes; } - /** - * 获取IP地址 - * - * @return 本地IP地址 - */ public static String getHostIp() { try @@ -229,11 +181,6 @@ public class IpUtils return "127.0.0.1"; } - /** - * 获取主机名 - * - * @return 本地主机名 - */ public static String getHostName() { try @@ -245,139 +192,4 @@ public class IpUtils } return "未知"; } - - /** - * 从多级反向代理中获得第一个非unknown IP地址 - * - * @param ip 获得的IP地址 - * @return 第一个非unknown IP地址 - */ - public static String getMultistageReverseProxyIp(String ip) - { - // 多级反向代理检测 - if (ip != null && ip.indexOf(",") > 0) - { - final String[] ips = ip.trim().split(","); - for (String subIp : ips) - { - if (false == isUnknown(subIp)) - { - ip = subIp; - break; - } - } - } - return StringUtils.substring(ip, 0, 255); - } - - /** - * 检测给定字符串是否为未知,多用于检测HTTP请求相关 - * - * @param checkString 被检测的字符串 - * @return 是否未知 - */ - public static boolean isUnknown(String checkString) - { - return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); - } - - /** - * 是否为IP - */ - public static boolean isIP(String ip) - { - return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); - } - - /** - * 是否为IP,或 *为间隔的通配符地址 - */ - public static boolean isIpWildCard(String ip) - { - return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); - } - - /** - * 检测参数是否在ip通配符里 - */ - public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) - { - String[] s1 = ipWildCard.split("\\."); - String[] s2 = ip.split("\\."); - boolean isMatchedSeg = true; - for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) - { - if (!s1[i].equals(s2[i])) - { - isMatchedSeg = false; - break; - } - } - return isMatchedSeg; - } - - /** - * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 - */ - public static boolean isIPSegment(String ipSeg) - { - return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); - } - - /** - * 判断ip是否在指定网段中 - */ - public static boolean ipIsInNetNoCheck(String iparea, String ip) - { - int idx = iparea.indexOf('-'); - String[] sips = iparea.substring(0, idx).split("\\."); - String[] sipe = iparea.substring(idx + 1).split("\\."); - String[] sipt = ip.split("\\."); - long ips = 0L, ipe = 0L, ipt = 0L; - for (int i = 0; i < 4; ++i) - { - ips = ips << 8 | Integer.parseInt(sips[i]); - ipe = ipe << 8 | Integer.parseInt(sipe[i]); - ipt = ipt << 8 | Integer.parseInt(sipt[i]); - } - if (ips > ipe) - { - long t = ips; - ips = ipe; - ipe = t; - } - return ips <= ipt && ipt <= ipe; - } - - /** - * 校验ip是否符合过滤串规则 - * - * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` - * @param ip 校验IP地址 - * @return boolean 结果 - */ - public static boolean isMatchedIp(String filter, String ip) - { - if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) - { - return false; - } - String[] ips = filter.split(";"); - for (String iStr : ips) - { - if (isIP(iStr) && iStr.equals(ip)) - { - return true; - } - else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) - { - return true; - } - else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) - { - return true; - } - } - return false; - } } \ No newline at end of file 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 d504f57..4862a4b 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,23 +1,24 @@ package com.ruoyi.common.utils.poi; -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.core.text.Convert; -import com.ruoyi.common.exception.UtilException; -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.FileUtils; -import com.ruoyi.common.utils.file.ImageUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.RegExUtils; -import org.apache.commons.lang3.reflect.FieldUtils; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFPicture; import org.apache.poi.hssf.usermodel.HSSFPictureData; @@ -39,14 +40,12 @@ import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.PictureData; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; -import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFWorkbook; @@ -60,31 +59,21 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; +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.core.text.Convert; +import com.ruoyi.common.exception.UtilException; +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.FileUtils; +import com.ruoyi.common.utils.file.ImageUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; /** * Excel相关处理 @@ -93,284 +82,74 @@ import java.util.stream.Collectors; */ public class ExcelUtil { - public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; - public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + /** * Excel sheet最大行数,默认65536 */ public static final int sheetSize = 65536; - private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); - /** - * 数字格式 - */ - private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); - /** - * 用于dictType属性数据存储,避免重复查缓存 - */ - public Map sysDictMap = new HashMap(); - /** - * 实体对象 - */ - public Class clazz; - /** - * 需要排除列属性 - */ - public String[] excludeFields; + /** * 工作表名称 */ private String sheetName; + /** * 导出类型(EXPORT:导出数据;IMPORT:导入模板) */ private Type type; + /** * 工作薄对象 */ private Workbook wb; + /** * 工作表对象 */ private Sheet sheet; + /** * 样式列表 */ private Map styles; + /** * 导入导出数据列表 */ private List list; + /** * 注解列表 */ private List fields; - /** - * 当前行号 - */ - private int rownum; - /** - * 标题 - */ - private String title; + /** * 最大高度 */ private short maxHeight; - /** - * 合并后最后行数 - */ - private int subMergedLastRowNum = 0; - /** - * 合并后开始行数 - */ - private int subMergedFirstRowNum = 1; - /** - * 对象的子列表方法 - */ - private Method subMethod; - /** - * 对象的子列表属性 - */ - private List subFields; + /** * 统计列表 */ private Map statistics = new HashMap(); - public ExcelUtil(Class clazz) - { - this.clazz = clazz; - } - - /** - * 获取画布 - */ - public static Drawing getDrawingPatriarch(Sheet sheet) - { - if (sheet.getDrawingPatriarch() == null) - { - sheet.createDrawingPatriarch(); - } - return sheet.getDrawingPatriarch(); - } - - /** - * 解析导出值 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(propertyValue, separator)) - { - 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(propertyValue, separator)) - { - 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); - } - - /** - * 获取Excel2003图片 - * - * @param sheet 当前sheet对象 - * @param workbook 工作簿对象 - * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + * 数字格式 */ - public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) - { - Map sheetIndexPicMap = new HashMap(); - List pictures = workbook.getAllPictures(); - if (!pictures.isEmpty()) - { - for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) - { - HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); - if (shape instanceof HSSFPicture) - { - HSSFPicture pic = (HSSFPicture) shape; - int pictureIndex = pic.getPictureIndex() - 1; - HSSFPictureData picData = pictures.get(pictureIndex); - String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); - sheetIndexPicMap.put(picIndex, picData); - } - } - return sheetIndexPicMap; - } - else - { - return sheetIndexPicMap; - } - } + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); /** - * 获取Excel2007图片 - * - * @param sheet 当前sheet对象 - * @param workbook 工作簿对象 - * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + * 实体对象 */ - public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) - { - Map sheetIndexPicMap = new HashMap(); - for (POIXMLDocumentPart dr : sheet.getRelations()) - { - if (dr instanceof XSSFDrawing) - { - XSSFDrawing drawing = (XSSFDrawing) dr; - List shapes = drawing.getShapes(); - for (XSSFShape shape : shapes) - { - if (shape instanceof XSSFPicture) - { - XSSFPicture pic = (XSSFPicture) shape; - XSSFClientAnchor anchor = pic.getPreferredSize(); - CTMarker ctMarker = anchor.getFrom(); - String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); - sheetIndexPicMap.put(picIndex, pic.getPictureData()); - } - } - } - } - return sheetIndexPicMap; - } + public Class clazz; - /** - * 隐藏Excel中列属性 - * - * @param fields 列属性名 示例[单个"name"/多个"id","name"] - * @throws Exception - */ - public void hideColumn(String... fields) + public ExcelUtil(Class clazz) { - this.excludeFields = fields; + this.clazz = clazz; } - public void init(List list, String sheetName, String title, Type type) + public void init(List list, String sheetName, Type type) { if (list == null) { @@ -379,97 +158,29 @@ public class ExcelUtil this.list = list; this.sheetName = sheetName; this.type = type; - this.title = title; createExcelField(); createWorkbook(); - createTitle(); - createSubHead(); - } - - /** - * 创建excel第一行标题 - */ - public void createTitle() - { - if (StringUtils.isNotEmpty(title)) - { - subMergedFirstRowNum++; - subMergedLastRowNum++; - int titleLastCol = this.fields.size() - 1; - if (isSubList()) - { - titleLastCol = titleLastCol + subFields.size() - 1; - } - Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); - titleRow.setHeightInPoints(30); - Cell titleCell = titleRow.createCell(0); - titleCell.setCellStyle(styles.get("title")); - titleCell.setCellValue(title); - sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); - } - } - - /** - * 创建对象的子列表名称 - */ - public void createSubHead() - { - if (isSubList()) - { - subMergedFirstRowNum++; - subMergedLastRowNum++; - Row subRow = sheet.createRow(rownum); - int excelNum = 0; - for (Object[] objects : fields) - { - Excel attr = (Excel) objects[1]; - Cell headCell1 = subRow.createCell(excelNum); - headCell1.setCellValue(attr.name()); - headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); - excelNum++; - } - int headFirstRow = excelNum - 1; - int headLastRow = headFirstRow + subFields.size() - 1; - if (headLastRow > headFirstRow) - { - sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); - } - rownum++; - } } /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ public List importExcel(InputStream is) throws Exception { - return importExcel(is, 0); - } - - /** - * 对excel表单默认第一个索引名转换成list - * - * @param is 输入流 - * @param titleNum 标题占用行数 - * @return 转换后集合 - */ - public List importExcel(InputStream is, int titleNum) throws Exception - { - return importExcel(StringUtils.EMPTY, is, titleNum); + return importExcel(StringUtils.EMPTY, is); } /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 - * @param titleNum 标题占用行数 * @param is 输入流 * @return 转换后集合 */ - public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + public List importExcel(String sheetName, InputStream is) throws Exception { this.type = Type.IMPORT; this.wb = WorkbookFactory.create(is); @@ -498,7 +209,7 @@ public class ExcelUtil // 定义一个map用于存放excel列的序号和field. Map cellMap = new HashMap(); // 获取表头 - Row heard = sheet.getRow(titleNum); + Row heard = sheet.getRow(0); for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); @@ -513,18 +224,25 @@ public class ExcelUtil } } // 有数据时才处理 得到类的所有field. - List fields = this.getFields(); - Map fieldsMap = new HashMap(); - for (Object[] objects : fields) + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个map用于存放列的序号和field. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) { - Excel attr = (Excel) objects[1]; - Integer column = cellMap.get(attr.name()); - if (column != null) + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { - fieldsMap.put(column, objects); + // 设置类的私有字段属性可访问. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, field); + } } } - for (int i = titleNum + 1; i <= rows; i++) + for (int i = 1; i <= rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(i); @@ -534,15 +252,14 @@ public class ExcelUtil continue; } T entity = null; - for (Map.Entry entry : fieldsMap.entrySet()) + for (Map.Entry entry : fieldsMap.entrySet()) { Object val = this.getCellValue(row, entry.getKey()); // 如果不存在实例则新建. entity = (entity == null ? clazz.newInstance() : entity); // 从map中得到对应列的field. - Field field = (Field) entry.getValue()[0]; - Excel attr = (Excel) entry.getValue()[1]; + Field field = fieldsMap.get(entry.getKey()); // 取得类型,并根据对象类型设置值. Class fieldType = field.getType(); if (String.class == fieldType) @@ -557,7 +274,7 @@ public class ExcelUtil String dateFormat = field.getAnnotation(Excel.class).dateFormat(); if (StringUtils.isNotEmpty(dateFormat)) { - val = parseDateToStr(dateFormat, val); + val = DateUtils.parseDateToStr(dateFormat, (Date) val); } else { @@ -569,7 +286,7 @@ public class ExcelUtil { val = Convert.toInt(val); } - else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + else if (Long.TYPE == fieldType || Long.class == fieldType) { val = Convert.toLong(val); } @@ -602,6 +319,7 @@ public class ExcelUtil } if (StringUtils.isNotNull(fieldType)) { + Excel attr = field.getAnnotation(Excel.class); String propertyName = field.getName(); if (StringUtils.isNotEmpty(attr.targetAttr())) { @@ -615,10 +333,6 @@ public class ExcelUtil { val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); } - else if (!attr.handler().equals(ExcelHandlerAdapter.class)) - { - val = dataFormatHandlerAdapter(val, attr); - } else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) { PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); @@ -626,11 +340,8 @@ public class ExcelUtil { val = ""; } - else - { - byte[] data = image.getData(); - val = FileUtils.writeImportBytes(data); - } + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); } ReflectUtils.invokeSetter(entity, propertyName, val); } @@ -643,121 +354,71 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 */ public AjaxResult exportExcel(List list, String sheetName) { - return exportExcel(list, sheetName, StringUtils.EMPTY); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @param title 标题 - * @return 结果 - */ - public AjaxResult exportExcel(List list, String sheetName, String title) - { - this.init(list, sheetName, title, Type.EXPORT); + this.init(list, sheetName, Type.EXPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param response 返回数据 - * @param list 导出数据集合 - * @param sheetName 工作表的名称 - * @return 结果 - */ - public void exportExcel(HttpServletResponse response, List list, String sheetName) - { - exportExcel(response, list, sheetName, StringUtils.EMPTY); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 - * @param title 标题 * @return 结果 + * @throws IOException */ - public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + public void exportExcel(HttpServletResponse response, List list, String sheetName) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - this.init(list, sheetName, title, Type.EXPORT); - exportExcel(response); + this.init(list, sheetName, Type.EXPORT); + exportExcel(response.getOutputStream()); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ public AjaxResult importTemplateExcel(String sheetName) { - return importTemplateExcel(sheetName, StringUtils.EMPTY); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * - * @param sheetName 工作表的名称 - * @param title 标题 - * @return 结果 - */ - public AjaxResult importTemplateExcel(String sheetName, String title) - { - this.init(null, sheetName, title, Type.IMPORT); + this.init(null, sheetName, Type.IMPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param sheetName 工作表的名称 - * @return 结果 - */ - public void importTemplateExcel(HttpServletResponse response, String sheetName) - { - importTemplateExcel(response, sheetName, StringUtils.EMPTY); - } - - /** - * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 - * @param title 标题 * @return 结果 */ - public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + public void importTemplateExcel(HttpServletResponse response, String sheetName) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - this.init(null, sheetName, title, Type.IMPORT); - exportExcel(response); + this.init(null, sheetName, Type.IMPORT); + exportExcel(response.getOutputStream()); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ - public void exportExcel(HttpServletResponse response) + public void exportExcel(OutputStream out) { try { writeSheet(); - wb.write(response.getOutputStream()); + wb.write(out); } catch (Exception e) { @@ -766,12 +427,13 @@ public class ExcelUtil finally { IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); } } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public AjaxResult exportExcel() @@ -803,31 +465,19 @@ public class ExcelUtil public void writeSheet() { // 取出一共有多少个sheet. - int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); - for (int index = 0; index < sheetNo; index++) + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) { createSheet(sheetNo, index); // 产生一行 - Row row = sheet.createRow(rownum); + Row row = sheet.createRow(0); int column = 0; // 写入各个字段的列头名称 for (Object[] os : fields) { - Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - if (Collection.class.isAssignableFrom(field.getType())) - { - for (Field subField : subFields) - { - Excel subExcel = subField.getAnnotation(Excel.class); - this.createHeadCell(subExcel, row, column++); - } - } - else - { - this.createHeadCell(excel, row, column++); - } + this.createCell(excel, row, column++); } if (Type.EXPORT.equals(type)) { @@ -839,78 +489,34 @@ public class ExcelUtil /** * 填充excel数据 - * + * * @param index 序号 * @param row 单元格行 */ - @SuppressWarnings("unchecked") public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); - int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { - rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; - row = sheet.createRow(rowNo); + row = sheet.createRow(i + 1 - startNo); // 得到导出对象. T vo = (T) list.get(i); - Collection subList = null; - if (isSubList()) - { - if (isSubListValue(vo)) - { - subList = getListCellValue(vo); - subMergedLastRowNum = subMergedLastRowNum + subList.size(); - } - else - { - subMergedFirstRowNum++; - subMergedLastRowNum++; - } - } int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) - { - boolean subFirst = false; - for (Object obj : subList) - { - if (subFirst) - { - rowNo++; - row = sheet.createRow(rowNo); - } - List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); - int subIndex = 0; - for (Field subField : subFields) - { - if (subField.isAnnotationPresent(Excel.class)) - { - subField.setAccessible(true); - Excel attr = subField.getAnnotation(Excel.class); - this.addCell(attr, row, (T) obj, subField, column + subIndex); - } - subIndex++; - } - subFirst = true; - } - this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); - } - else - { - this.addCell(excel, row, vo, field, column++); - } + // 设置实体类私有属性可访问 + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++); } } } /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ @@ -921,16 +527,6 @@ public class ExcelUtil CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); - Font titleFont = wb.createFont(); - titleFont.setFontName("Arial"); - titleFont.setFontHeightInPoints((short) 16); - titleFont.setBold(true); - style.setFont(titleFont); - styles.put("title", style); - - 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); @@ -945,6 +541,20 @@ public class ExcelUtil 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); @@ -954,111 +564,41 @@ public class ExcelUtil style.setFont(totalFont); styles.put("total", style); - styles.putAll(annotationHeaderStyles(wb, styles)); - - styles.putAll(annotationDataStyles(wb)); + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.LEFT); + styles.put("data1", style); - return styles; - } + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + styles.put("data2", style); - /** - * 根据Excel注解创建表格头样式 - * - * @param wb 工作薄对象 - * @return 自定义样式列表 - */ - private Map annotationHeaderStyles(Workbook wb, Map styles) - { - Map headerStyles = new HashMap(); - for (Object[] os : fields) - { - Excel excel = (Excel) os[1]; - String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); - if (!headerStyles.containsKey(key)) - { - CellStyle style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); - style.setFillForegroundColor(excel.headerBackgroundColor().index); - style.setFillPattern(FillPatternType.SOLID_FOREGROUND); - Font headerFont = wb.createFont(); - headerFont.setFontName("Arial"); - headerFont.setFontHeightInPoints((short) 10); - headerFont.setBold(true); - headerFont.setColor(excel.headerColor().index); - style.setFont(headerFont); - headerStyles.put(key, style); - } - } - return headerStyles; - } + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.RIGHT); + styles.put("data3", style); - /** - * 根据Excel注解创建表格列样式 - * - * @param wb 工作薄对象 - * @return 自定义样式列表 - */ - private Map annotationDataStyles(Workbook wb) - { - Map styles = new HashMap(); - for (Object[] os : fields) - { - Excel excel = (Excel) os[1]; - String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); - if (!styles.containsKey(key)) - { - CellStyle style = wb.createCellStyle(); - style.setAlignment(excel.align()); - 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()); - style.setFillPattern(FillPatternType.SOLID_FOREGROUND); - style.setFillForegroundColor(excel.backgroundColor().getIndex()); - Font dataFont = wb.createFont(); - dataFont.setFontName("Arial"); - dataFont.setFontHeightInPoints((short) 10); - dataFont.setColor(excel.color().index); - style.setFont(dataFont); - styles.put(key, style); - } - } return styles; } /** * 创建单元格 */ - public Cell createHeadCell(Excel attr, Row row, int column) + 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(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); - if (isSubList()) - { - // 填充默认样式,防止合并单元格样式失效 - sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); - if (attr.needMerge()) - { - sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); - } - } + cell.setCellStyle(styles.get("header")); return cell; } /** * 设置单元格信息 - * + * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 @@ -1067,17 +607,7 @@ public class ExcelUtil { if (ColumnType.STRING == attr.cellType()) { - String cellValue = Convert.toStr(value); - // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 - if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) - { - cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); - } - if (value instanceof Collection && StringUtils.equals("[]", cellValue)) - { - cellValue = StringUtils.EMPTY; - } - cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); } else if (ColumnType.NUMERIC == attr.cellType()) { @@ -1099,6 +629,18 @@ public class ExcelUtil } } + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + /** * 获取图片类型,设置图片插入类型 */ @@ -1130,18 +672,17 @@ public class ExcelUtil // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } - if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + // 如果设置了提示信息则鼠标放上去提示. + if (StringUtils.isNotEmpty(attr.prompt())) { - if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) - { - // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 - setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); - } - else - { - // 提示信息或只能选择不能输入的列内容. - setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); - } + // 这里默认设了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); } } @@ -1160,12 +701,8 @@ public class ExcelUtil { // 创建cell cell = row.createCell(column); - if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) - { - CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); - sheet.addMergedRegion(cellAddress); - } - cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + int align = attr.align().value(); + cell.setCellStyle(styles.get("data" + (align >= 1 && align <= 3 ? align : ""))); // 用于读取对象中的属性 Object value = getTargetValue(vo, field, attr); @@ -1175,7 +712,7 @@ public class ExcelUtil String dictType = attr.dictType(); if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { - cell.setCellValue(parseDateToStr(dateFormat, value)); + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { @@ -1183,20 +720,11 @@ public class ExcelUtil } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { - if (!sysDictMap.containsKey(dictType + value)) - { - String lable = convertDictByExp(Convert.toStr(value), dictType, separator); - sysDictMap.put(dictType + value, lable); - } - cell.setCellValue(sysDictMap.get(dictType + 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())).doubleValue()); - } - else if (!attr.handler().equals(ExcelHandlerAdapter.class)) - { - cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); } else { @@ -1214,78 +742,48 @@ public class ExcelUtil } /** - * 设置 POI XSSFSheet 单元格提示或选择框 - * + * 设置 POI XSSFSheet 单元格提示 + * * @param sheet 表单 - * @param textlist 下拉框显示的内容 + * @param promptTitle 提示标题 * @param promptContent 提示内容 * @param firstRow 开始行 * @param endRow 结束行 * @param firstCol 开始列 * @param endCol 结束列 */ - public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); - DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); DataValidation dataValidation = helper.createValidation(constraint, regions); - if (StringUtils.isNotEmpty(promptContent)) - { - // 如果设置了提示信息则鼠标放上去提示 - dataValidation.createPromptBox("", promptContent); - dataValidation.setShowPromptBox(true); - } - // 处理Excel兼容性问题 - if (dataValidation instanceof XSSFDataValidation) - { - dataValidation.setSuppressDropDownArrow(true); - dataValidation.setShowErrorBox(true); - } - else - { - dataValidation.setSuppressDropDownArrow(false); - } + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); sheet.addValidationData(dataValidation); } /** - * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). - * + * 设置某些列的值只能输入预制的数据,显示下拉框. + * * @param sheet 要设置的sheet. * @param textlist 下拉框显示的内容 - * @param promptContent 提示内容 * @param firstRow 开始行 * @param endRow 结束行 * @param firstCol 开始列 * @param endCol 结束列 + * @return 设置好的sheet. */ - public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) { - String hideSheetName = "combo_" + firstCol + "_" + endCol; - Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 - for (int i = 0; i < textlist.length; i++) - { - hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); - } - // 创建名称,可被其他单元格引用 - Name name = wb.createName(); - name.setNameName(hideSheetName + "_data"); - name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); DataValidationHelper helper = sheet.getDataValidationHelper(); // 加载下拉列表内容 - DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 数据有效性对象 DataValidation dataValidation = helper.createValidation(constraint, regions); - if (StringUtils.isNotEmpty(promptContent)) - { - // 如果设置了提示信息则鼠标放上去提示 - dataValidation.createPromptBox("", promptContent); - dataValidation.setShowPromptBox(true); - } // 处理Excel兼容性问题 if (dataValidation instanceof XSSFDataValidation) { @@ -1298,30 +796,106 @@ public class ExcelUtil } sheet.addValidationData(dataValidation); - // 设置hiddenSheet隐藏 - wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); } /** - * 数据处理器 - * - * @param value 数据值 - * @param excel 数据注解 - * @return + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 */ - public String dataFormatHandlerAdapter(Object value, Excel excel) + public static String convertByExp(String propertyValue, String converterExp, String separator) { - try + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { - Object instance = excel.handler().newInstance(); - Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); - value = formatMethod.invoke(instance, value, excel.args()); + 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]; + } + } } - catch (Exception e) + 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) { - log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + 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 Convert.toStr(value); + 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); } /** @@ -1375,13 +949,13 @@ public class ExcelUtil */ public String encodingFilename(String filename) { - filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; return filename; } /** * 获取下载路径 - * + * * @param filename 文件名称 */ public String getAbsoluteFile(String filename) @@ -1397,7 +971,7 @@ public class ExcelUtil /** * 获取bean中的属性值 - * + * * @param vo 实体对象 * @param field 字段 * @param excel 注解 @@ -1410,7 +984,7 @@ public class ExcelUtil if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); - if (target.contains(".")) + if (target.indexOf(".") > -1) { String[] targets = target.split("[.]"); for (String name : targets) @@ -1428,7 +1002,7 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value @@ -1451,60 +1025,31 @@ public class ExcelUtil */ private void createExcelField() { - this.fields = getFields(); - this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); - this.maxHeight = getRowHeight(); - } - - /** - * 获取字段注解信息 - */ - public List getFields() - { - List fields = new ArrayList(); + 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 (!ArrayUtils.contains(this.excludeFields, field.getName())) + // 单注解 + if (field.isAnnotationPresent(Excel.class)) { - // 单注解 - if (field.isAnnotationPresent(Excel.class)) - { - Excel attr = field.getAnnotation(Excel.class); - if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) - { - field.setAccessible(true); - fields.add(new Object[] { field, attr }); - } - if (Collection.class.isAssignableFrom(field.getType())) - { - subMethod = getSubMethod(field.getName(), clazz); - ParameterizedType pt = (ParameterizedType) field.getGenericType(); - Class subClass = (Class) pt.getActualTypeArguments()[0]; - this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); - } - } + putToField(field, field.getAnnotation(Excel.class)); + } - // 多注解 - if (field.isAnnotationPresent(Excels.class)) + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) { - Excels attrs = field.getAnnotation(Excels.class); - Excel[] excels = attrs.value(); - for (Excel attr : excels) - { - if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) - && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) - { - field.setAccessible(true); - fields.add(new Object[] { field, attr }); - } - } + putToField(field, excel); } } } - return fields; + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); } /** @@ -1516,42 +1061,54 @@ public class ExcelUtil for (Object[] os : this.fields) { Excel excel = (Excel) os[1]; - maxHeight = Math.max(maxHeight, excel.height()); + 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); - this.sheet = wb.createSheet(); - wb.setSheetName(0, sheetName); - this.styles = createStyles(wb); } /** * 创建工作表 - * + * * @param sheetNo sheet数量 * @param index 序号 */ - public void createSheet(int sheetNo, int index) + public void createSheet(double sheetNo, int index) { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); // 设置工作表的名称. - if (sheetNo > 1 && index > 0) + if (sheetNo == 0) + { + wb.setSheetName(index, sheetName); + } + else { - this.sheet = wb.createSheet(); - this.createTitle(); wb.setSheetName(index, sheetName + index); } } /** * 获取单元格值 - * + * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 @@ -1611,7 +1168,7 @@ public class ExcelUtil /** * 判断是否是空行 - * + * * @param row 判断的行 * @return */ @@ -1633,92 +1190,67 @@ public class ExcelUtil } /** - * 格式化不同类型的日期对象 - * - * @param dateFormat 日期格式 - * @param val 被格式化的日期对象 - * @return 格式化后的日期字符 + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ - public String parseDateToStr(String dateFormat, Object val) + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { - if (val == null) - { - return ""; - } - String str; - if (val instanceof Date) - { - str = DateUtils.parseDateToStr(dateFormat, (Date) val); - } - else if (val instanceof LocalDateTime) - { - str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); - } - else if (val instanceof LocalDate) + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) { - str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; } else { - str = val.toString(); - } - return str; - } - - /** - * 是否有对象的子列表 - */ - public boolean isSubList() - { - return StringUtils.isNotNull(subFields) && subFields.size() > 0; - } - - /** - * 是否有对象的子列表,集合不为空 - */ - public boolean isSubListValue(T vo) - { - return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; - } - - /** - * 获取集合的值 - */ - public Collection getListCellValue(Object obj) - { - Object value; - try - { - value = subMethod.invoke(obj, new Object[] {}); - } - catch (Exception e) - { - return new ArrayList(); + return sheetIndexPicMap; } - return (Collection) value; } /** - * 获取对象的子列表方法 - * - * @param name 名称 - * @param pojoClass 类对象 - * @return 子列表方法 + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ - public Method getSubMethod(String name, Class pojoClass) + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { - StringBuffer getMethodName = new StringBuffer("get"); - getMethodName.append(name.substring(0, 1).toUpperCase()); - getMethodName.append(name.substring(1)); - Method method = null; - try - { - method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); - } - catch (Exception e) + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) { - log.error("获取对象异常{}", e.getMessage()); + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } } - return method; + return sheetIndexPicMap; } } 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 f3b3cd6..b19953e 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,13 +1,5 @@ package com.ruoyi.common.utils.reflect; -import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.utils.DateUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Validate; -import org.apache.poi.ss.usermodel.DateUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -15,6 +7,13 @@ import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java index cbbd3d8..de77ee8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java @@ -1,11 +1,9 @@ package com.ruoyi.common.utils.sign; +import java.security.MessageDigest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; - /** * Md5加密方法 * @@ -57,7 +55,7 @@ public class Md5Utils { try { - return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8"); } catch (Exception e) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java index 61c9e5b..9993b98 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java @@ -1,6 +1,5 @@ package com.ruoyi.common.utils.spring; -import com.ruoyi.common.utils.StringUtils; import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -9,6 +8,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.StringUtils; /** * spring工具类 方便在非spring管理环境中获取bean @@ -23,6 +23,18 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC private static ApplicationContext applicationContext; + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + /** * 获取对象 * @@ -101,7 +113,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC /** * 获取aop代理对象 - * + * * @param invoker * @return */ @@ -131,28 +143,4 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC final String[] activeProfiles = getActiveProfiles(); return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; } - - /** - * 获取配置文件中的值 - * - * @param key 配置文件的key - * @return 当前的配置文件的值 - * - */ - public static String getRequiredProperty(String key) - { - return applicationContext.getEnvironment().getRequiredProperty(key); - } - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException - { - SpringUtils.beanFactory = beanFactory; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - SpringUtils.applicationContext = applicationContext; - } } 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 63fba39..a198946 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 @@ -10,14 +10,6 @@ import com.ruoyi.common.utils.StringUtils; */ public class SqlUtil { - /** - * 限制orderBy最大长度 - */ - private static final int ORDER_BY_MAX_LENGTH = 500; - /** - * 定义常用的 sql关键字 - */ - public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) */ @@ -32,10 +24,6 @@ public class SqlUtil { throw new UtilException("参数不符合规范,不能进行查询"); } - if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) - { - throw new UtilException("参数已超过最大限制,不能进行查询"); - } return value; } @@ -46,23 +34,4 @@ public class SqlUtil { return value.matches(SQL_PATTERN); } - - /** - * SQL关键字检查 - */ - public static void filterKeyword(String value) - { - if (StringUtils.isEmpty(value)) - { - return; - } - String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); - for (String sqlKeyword : sqlKeywords) - { - if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) - { - throw new UtilException("参数存在SQL注入风险"); - } - } - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java index 7fd3c11..062d633 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java @@ -1,12 +1,11 @@ package com.ruoyi.common.utils.uuid; -import com.ruoyi.common.exception.UtilException; - import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; +import com.ruoyi.common.exception.UtilException; /** * 提供通用唯一识别码(universally unique identifier)(UUID)实现 @@ -16,14 +15,25 @@ import java.util.concurrent.ThreadLocalRandom; public final class UUID implements java.io.Serializable, Comparable { private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + /** 此UUID的最高64有效位 */ private final long mostSigBits; + /** 此UUID的最低64有效位 */ private final long leastSigBits; /** * 私有构造 - * + * * @param data 数据 */ private UUID(byte[] data) @@ -56,8 +66,8 @@ public final class UUID implements java.io.Serializable, Comparable } /** - * 获取类型 4(伪随机生成的)UUID 的静态工厂。 - * + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。 + * * @return 随机生成的 {@code UUID} */ public static UUID fastUUID() @@ -67,7 +77,7 @@ public final class UUID implements java.io.Serializable, Comparable /** * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 - * + * * @return 随机生成的 {@code UUID} */ public static UUID randomUUID() @@ -77,7 +87,7 @@ public final class UUID implements java.io.Serializable, Comparable /** * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 - * + * * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 * @return 随机生成的 {@code UUID} */ @@ -153,47 +163,6 @@ public final class UUID implements java.io.Serializable, Comparable return new UUID(mostSigBits, leastSigBits); } - /** - * 返回指定数字对应的hex值 - * - * @param val 值 - * @param digits 位 - * @return 值 - */ - private static String digits(long val, int digits) - { - long hi = 1L << (digits * 4); - return Long.toHexString(hi | (val & (hi - 1))).substring(1); - } - - /** - * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) - * - * @return {@link SecureRandom} - */ - public static SecureRandom getSecureRandom() - { - try - { - return SecureRandom.getInstance("SHA1PRNG"); - } - catch (NoSuchAlgorithmException e) - { - throw new UtilException(e); - } - } - - /** - * 获取随机数生成器对象
- * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 - * - * @return {@link ThreadLocalRandom} - */ - public static ThreadLocalRandom getRandom() - { - return ThreadLocalRandom.current(); - } - /** * 返回此 UUID 的 128 位值中的最低有效 64 位。 * @@ -320,7 +289,7 @@ public final class UUID implements java.io.Serializable, Comparable * *

* UUID 的字符串表示形式由此 BNF 描述: - * + * *

      * {@code
      * UUID                   = ----
@@ -333,7 +302,7 @@ public final class UUID implements java.io.Serializable, Comparable
      * hexDigit               = [0-9a-fA-F]
      * }
      * 
- * + * * * * @return 此{@code UUID} 的字符串表现形式 @@ -350,7 +319,7 @@ public final class UUID implements java.io.Serializable, Comparable * *

* UUID 的字符串表示形式由此 BNF 描述: - * + * *

      * {@code
      * UUID                   = ----
@@ -363,7 +332,7 @@ public final class UUID implements java.io.Serializable, Comparable
      * hexDigit               = [0-9a-fA-F]
      * }
      * 
- * + * * * * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 @@ -374,25 +343,25 @@ public final class UUID implements java.io.Serializable, Comparable final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); // time_low builder.append(digits(mostSigBits >> 32, 8)); - if (!isSimple) + if (false == isSimple) { builder.append('-'); } // time_mid builder.append(digits(mostSigBits >> 16, 4)); - if (!isSimple) + if (false == isSimple) { builder.append('-'); } // time_high_and_version builder.append(digits(mostSigBits, 4)); - if (!isSimple) + if (false == isSimple) { builder.append('-'); } // variant_and_sequence builder.append(digits(leastSigBits >> 48, 4)); - if (!isSimple) + if (false == isSimple) { builder.append('-'); } @@ -402,8 +371,6 @@ public final class UUID implements java.io.Serializable, Comparable return builder.toString(); } - // Comparison Operations - /** * 返回此 UUID 的哈希码。 * @@ -416,9 +383,6 @@ public final class UUID implements java.io.Serializable, Comparable return ((int) (hilo >> 32)) ^ (int) hilo; } - // ------------------------------------------------------------------------------------------------------------------- - // Private method start - /** * 将此对象与指定对象比较。 *

@@ -439,6 +403,8 @@ public final class UUID implements java.io.Serializable, Comparable return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); } + // Comparison Operations + /** * 将此 UUID 与指定的 UUID 比较。 * @@ -462,6 +428,21 @@ public final class UUID implements java.io.Serializable, Comparable 0)))); } + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + /** * 检查是否为time-based版本UUID */ @@ -474,11 +455,30 @@ public final class UUID implements java.io.Serializable, Comparable } /** - * SecureRandom 的单例 - * + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} */ - private static class Holder + public static SecureRandom getSecureRandom() { - static final SecureRandom numberGenerator = getSecureRandom(); + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); } } diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 5a88c8e..9bd9ee6 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -1,11 +1,11 @@ - ruoyi com.ruoyi - 3.8.6 + 3.7.0 4.0.0 @@ -37,11 +37,11 @@ - pro.fessional + com.github.penggle kaptcha - servlet-api + javax.servlet-api javax.servlet 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 9839f38..226e150 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,21 +1,20 @@ package com.ruoyi.framework.aspectj; +import java.lang.reflect.Method; +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.springframework.stereotype.Component; 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.core.text.Convert; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.security.context.PermissionContextHolder; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.utils.SecurityUtils; /** * 数据过滤处理 @@ -56,36 +55,58 @@ public class DataScopeAspect */ public static final String DATA_SCOPE = "dataScope"; + // 配置织入点 + @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)") + public void dataScopePointCut() + { + } + + @Before("dataScopePointCut()") + public void doBefore(JoinPoint point) throws Throwable + { + clearDataScope(point); + handleDataScope(point); + } + + protected void handleDataScope(final JoinPoint joinPoint) + { + // 获得注解 + DataScope controllerDataScope = getAnnotationLog(joinPoint); + if (controllerDataScope == null) + { + return; + } + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias()); + } + } + } + /** * 数据范围过滤 * * @param joinPoint 切点 * @param user 用户 - * @param deptAlias 部门别名 - * @param userAlias 用户别名 - * @param permission 权限字符 + * @param userAlias 别名 */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) { StringBuilder sqlString = new StringBuilder(); - List conditions = new ArrayList(); for (SysRole role : user.getRoles()) { String dataScope = role.getDataScope(); - if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) - { - continue; - } - if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) - && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) - { - continue; - } if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); - conditions.add(dataScope); break; } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) @@ -113,16 +134,9 @@ public class DataScopeAspect else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 - sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + sqlString.append(" OR 1=0 "); } } - conditions.add(dataScope); - } - - // 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 - if (StringUtils.isEmpty(conditions)) - { - sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); } if (StringUtils.isNotBlank(sqlString.toString())) @@ -136,28 +150,20 @@ public class DataScopeAspect } } - @Before("@annotation(controllerDataScope)") - public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + /** + * 是否存在注解,如果存在就获取 + */ + private DataScope getAnnotationLog(JoinPoint joinPoint) { - clearDataScope(point); - handleDataScope(point, controllerDataScope); - } + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); - protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) - { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNotNull(loginUser)) + if (method != null) { - SysUser currentUser = loginUser.getUser(); - // 如果是超级管理员,则不过滤数据 - if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) - { - String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); - dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias(), permission); - } + return method.getAnnotation(DataScope.class); } + return null; } /** 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 04729e9..8c2c9f4 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,6 @@ package com.ruoyi.framework.aspectj; -import com.ruoyi.common.annotation.DataSource; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; +import java.util.Objects; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -13,8 +11,9 @@ import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; - -import java.util.Objects; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; /** * 多数据源处理 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 14334dc..89b5a32 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,35 +1,36 @@ package com.ruoyi.framework.aspectj; -import com.alibaba.fastjson2.JSON; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.HandlerMapping; +import com.alibaba.fastjson.JSON; 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.filter.PropertyPreExcludeFilter; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.system.domain.SysOperLog; -import org.apache.commons.lang3.ArrayUtils; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.NamedThreadLocal; -import org.springframework.stereotype.Component; -import org.springframework.validation.BindingResult; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Collection; -import java.util.Map; /** * 操作日志记录处理 @@ -40,19 +41,12 @@ import java.util.Map; @Component public class LogAspect { - /** 排除敏感属性字段 */ - public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; private static final Logger log = LoggerFactory.getLogger(LogAspect.class); - /** 计算操作消耗时间 */ - private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); - /** - * 处理请求前执行 - */ - @Before(value = "@annotation(controllerLog)") - public void boBefore(JoinPoint joinPoint, Log controllerLog) + // 配置织入点 + @Pointcut("@annotation(com.ruoyi.common.annotation.Log)") + public void logPointCut() { - TIME_THREADLOCAL.set(System.currentTimeMillis()); } /** @@ -60,10 +54,10 @@ public class LogAspect * * @param joinPoint 切点 */ - @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") - public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) { - handleLog(joinPoint, controllerLog, null, jsonResult); + handleLog(joinPoint, null, jsonResult); } /** @@ -72,16 +66,23 @@ public class LogAspect * @param joinPoint 切点 * @param e 异常 */ - @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + @AfterThrowing(value = "logPointCut()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) { - handleLog(joinPoint, controllerLog, e, null); + handleLog(joinPoint, e, null); } - protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) { try { + // 获得注解 + Log controllerLog = getAnnotationLog(joinPoint); + if (controllerLog == null) + { + return; + } + // 获取当前的用户 LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -89,9 +90,12 @@ public class LogAspect SysOperLog operLog = new SysOperLog(); operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); // 请求的地址 - String ip = IpUtils.getIpAddr(); + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); operLog.setOperIp(ip); - operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + // 返回参数 + operLog.setJsonResult(JSON.toJSONString(jsonResult)); + + operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); if (loginUser != null) { operLog.setOperName(loginUser.getUsername()); @@ -109,22 +113,17 @@ public class LogAspect // 设置请求方式 operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); // 处理设置注解上的参数 - getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); - // 设置消耗时间 - operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); + getControllerMethodDescription(joinPoint, controllerLog, operLog); // 保存数据库 AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); } catch (Exception exp) { // 记录本地异常日志 + log.error("==前置通知异常=="); log.error("异常信息:{}", exp.getMessage()); exp.printStackTrace(); } - finally - { - TIME_THREADLOCAL.remove(); - } } /** @@ -134,7 +133,7 @@ public class LogAspect * @param operLog 操作日志 * @throws Exception */ - public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog) throws Exception { // 设置action动作 operLog.setBusinessType(log.businessType().ordinal()); @@ -146,12 +145,7 @@ public class LogAspect if (log.isSaveRequestData()) { // 获取参数的信息,传入到数据库中。 - setRequestValue(joinPoint, operLog, log.excludeParamNames()); - } - // 是否需要保存response,参数和值 - if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) - { - operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + setRequestValue(joinPoint, operLog); } } @@ -161,56 +155,57 @@ public class LogAspect * @param operLog 操作日志 * @throws Exception 异常 */ - private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception { - Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); String requestMethod = operLog.getRequestMethod(); - if (StringUtils.isEmpty(paramsMap) - && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { - String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + String params = argsArrayToString(joinPoint.getArgs()); operLog.setOperParam(StringUtils.substring(params, 0, 2000)); } else { - operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); + Map paramsMap = (Map) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000)); } } + /** + * 是否存在注解,如果存在就获取 + */ + private Log getAnnotationLog(JoinPoint joinPoint) throws Exception + { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) + { + return method.getAnnotation(Log.class); + } + return null; + } + /** * 参数拼装 */ - private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) + private String argsArrayToString(Object[] paramsArray) { String params = ""; if (paramsArray != null && paramsArray.length > 0) { - for (Object o : paramsArray) + for (int i = 0; i < paramsArray.length; i++) { - if (StringUtils.isNotNull(o) && !isFilterObject(o)) + if (StringUtils.isNotNull(paramsArray[i]) && !isFilterObject(paramsArray[i])) { - try - { - String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); - params += jsonObj.toString() + " "; - } - catch (Exception e) - { - } + Object jsonObj = JSON.toJSON(paramsArray[i]); + params += jsonObj.toString() + " "; } } } return params.trim(); } - /** - * 忽略敏感属性 - */ - public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) - { - return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); - } - /** * 判断是否需要过滤的对象。 * @@ -228,17 +223,17 @@ public class LogAspect else if (Collection.class.isAssignableFrom(clazz)) { Collection collection = (Collection) o; - for (Object value : collection) + for (Iterator iter = collection.iterator(); iter.hasNext();) { - return value instanceof MultipartFile; + return iter.next() instanceof MultipartFile; } } else if (Map.class.isAssignableFrom(clazz)) { Map map = (Map) o; - for (Object value : map.entrySet()) + for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { - Map.Entry entry = (Map.Entry) value; + Map.Entry entry = (Map.Entry) iter.next(); return entry.getValue() instanceof MultipartFile; } } 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 20cc62c..12aa291 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,13 +1,13 @@ 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.StringUtils; -import com.ruoyi.common.utils.ip.IpUtils; +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; @@ -15,10 +15,12 @@ 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; +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; /** * 限流处理 @@ -47,9 +49,17 @@ public class RateLimiterAspect this.limitScript = limitScript; } - @Before("@annotation(rateLimiter)") - public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + // 配置织入点 + @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(); @@ -60,9 +70,9 @@ public class RateLimiterAspect Long number = redisTemplate.execute(limitScript, keys, count, time); if (StringUtils.isNull(number) || number.intValue() > count) { - throw new ServiceException("访问过于频繁,请稍候再试"); + throw new ServiceException("访问过于频繁,请稍后再试"); } - log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key); } catch (ServiceException e) { @@ -70,8 +80,24 @@ public class RateLimiterAspect } catch (Exception e) { - throw new RuntimeException("服务器限流异常,请稍候再试"); + 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) @@ -79,12 +105,12 @@ public class RateLimiterAspect StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); if (rateLimiter.limitType() == LimitType.IP) { - stringBuffer.append(IpUtils.getIpAddr()).append("-"); + stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())); } MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); Class targetClass = method.getDeclaringClass(); - stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + stringBuffer.append("-").append(targetClass.getName()).append("- ").append(method.getName()); return stringBuffer.toString(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java index 63693fb..1d4dc1f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -1,13 +1,12 @@ package com.ruoyi.framework.config; +import java.util.TimeZone; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; -import java.util.TimeZone; - /** * 程序注解配置 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java index 3ad9b38..43e78ae 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java @@ -1,26 +1,11 @@ package com.ruoyi.framework.config; -import com.google.code.kaptcha.impl.DefaultKaptcha; -import com.google.code.kaptcha.util.Config; +import java.util.Properties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - -import java.util.Properties; - -import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER; -import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER_COLOR; -import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_HEIGHT; -import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_WIDTH; -import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_COLOR; -import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_IMPL; -import static com.google.code.kaptcha.Constants.KAPTCHA_OBSCURIFICATOR_IMPL; -import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_CONFIG_KEY; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE; -import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_IMPL; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; /** * 验证码配置 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java index ff4aacf..f6abac1 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -1,5 +1,20 @@ package com.ruoyi.framework.config; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; @@ -8,22 +23,6 @@ import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.DruidProperties; import com.ruoyi.framework.datasource.DynamicDataSource; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.sql.DataSource; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; /** * druid 配置多数据源 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java index a9d9e35..59812ea 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java @@ -1,11 +1,14 @@ package com.ruoyi.framework.config; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONReader; -import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; - +import com.alibaba.fastjson.parser.ParserConfig; +import org.springframework.util.Assert; import java.nio.charset.Charset; /** @@ -15,10 +18,18 @@ import java.nio.charset.Charset; */ public class FastJson2JsonRedisSerializer implements RedisSerializer { + @SuppressWarnings("unused") + private ObjectMapper objectMapper = new ObjectMapper(); + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Class clazz; + static + { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } + public FastJson2JsonRedisSerializer(Class clazz) { super(); @@ -32,7 +43,7 @@ public class FastJson2JsonRedisSerializer implements RedisSerializer { return new byte[0]; } - return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override @@ -44,6 +55,17 @@ public class FastJson2JsonRedisSerializer implements RedisSerializer } String str = new String(bytes, DEFAULT_CHARSET); - return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + return JSON.parseObject(str, clazz); + } + + public void setObjectMapper(ObjectMapper objectMapper) + { + Assert.notNull(objectMapper, "'objectMapper' must not be null"); + this.objectMapper = objectMapper; + } + + protected JavaType getJavaType(Class clazz) + { + return TypeFactory.defaultInstance().constructType(clazz); } } 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 8b668d6..87b3750 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,17 +1,16 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.filter.RepeatableFilter; -import com.ruoyi.common.filter.XssFilter; -import com.ruoyi.common.utils.StringUtils; +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; - -import javax.servlet.DispatcherType; -import java.util.HashMap; -import java.util.Map; +import com.ruoyi.common.filter.RepeatableFilter; +import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; /** * Filter配置 @@ -19,6 +18,7 @@ import java.util.Map; * @author ruoyi */ @Configuration +@ConditionalOnProperty(value = "xss.enabled", havingValue = "true") public class FilterConfig { @Value("${xss.excludes}") @@ -29,7 +29,6 @@ public class FilterConfig @SuppressWarnings({ "rawtypes", "unchecked" }) @Bean - @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") public FilterRegistrationBean xssFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java index ff6a368..3e74580 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java @@ -1,12 +1,11 @@ package com.ruoyi.framework.config; -import com.google.code.kaptcha.text.impl.DefaultTextCreator; - import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; /** * 验证码文本生成器 - * + * * @author ruoyi */ public class KaptchaTextCreator extends DefaultTextCreator @@ -21,7 +20,7 @@ public class KaptchaTextCreator extends DefaultTextCreator int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); - int randomoperands = random.nextInt(3); + int randomoperands = (int) Math.round(Math.random() * 2); if (randomoperands == 0) { result = x * y; @@ -31,7 +30,7 @@ public class KaptchaTextCreator extends DefaultTextCreator } else if (randomoperands == 1) { - if ((x != 0) && y % x == 0) + if (!(x == 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); @@ -46,7 +45,7 @@ public class KaptchaTextCreator extends DefaultTextCreator suChinese.append(CNUMBERS[y]); } } - else + else if (randomoperands == 2) { if (x >= y) { @@ -63,6 +62,13 @@ public class KaptchaTextCreator extends DefaultTextCreator suChinese.append(CNUMBERS[x]); } } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } suChinese.append("=?@" + result); return suChinese.toString(); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java index fc3633c..057c941 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java @@ -1,6 +1,11 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.utils.StringUtils; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import javax.sql.DataSource; import org.apache.ibatis.io.VFS; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; @@ -17,13 +22,7 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.ClassUtils; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; +import com.ruoyi.common.utils.StringUtils; /** * Mybatis支持*匹配扫描包 @@ -33,10 +32,11 @@ import java.util.List; @Configuration public class MyBatisConfig { - static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; @Autowired private Environment env; + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + public static String setTypeAliasesPackage(String typeAliasesPackage) { ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); 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 3f4f485..3c3185e 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 @@ -8,6 +8,11 @@ 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; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; /** * redis配置 @@ -27,6 +32,11 @@ public class RedisConfig extends CachingConfigurerSupport FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + serializer.setObjectMapper(mapper); + // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); @@ -58,12 +68,12 @@ public class RedisConfig extends CachingConfigurerSupport "local time = tonumber(ARGV[2])\n" + "local current = redis.call('get', key);\n" + "if current and tonumber(current) > count then\n" + - " return tonumber(current);\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 tonumber(current);"; + "return current;"; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index d15b8fb..5e4ab00 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -1,20 +1,17 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.CacheControl; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.concurrent.TimeUnit; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; /** * 通用配置 @@ -31,13 +28,10 @@ public class ResourcesConfig implements WebMvcConfigurer public void addResourceHandlers(ResourceHandlerRegistry registry) { /** 本地文件上传路径 */ - registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") - .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); /** swagger配置 */ - registry.addResourceHandler("/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") - .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); } /** @@ -55,20 +49,17 @@ public class ResourcesConfig implements WebMvcConfigurer @Bean public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 设置访问源地址 - config.addAllowedOriginPattern("*"); + config.addAllowedOrigin("*"); // 设置访问源请求头 config.addAllowedHeader("*"); // 设置访问源请求方法 config.addAllowedMethod("*"); - // 有效期 1800秒 - config.setMaxAge(1800L); - // 添加映射路径,拦截一切请求 - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + // 对接口配置跨域设置 source.registerCorsConfiguration("/**", config); - // 返回新的CorsFilter return new CorsFilter(source); } } \ No newline at end of file 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 9bf8240..7333182 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 @@ -1,9 +1,5 @@ package com.ruoyi.framework.config; -import com.ruoyi.framework.config.properties.PermitAllUrlProperties; -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; -import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; @@ -12,13 +8,15 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.web.filter.CorsFilter; +import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; +import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; +import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; /** * spring security配置 @@ -57,13 +55,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Autowired private CorsFilter corsFilter; - - /** - * 允许匿名访问的地址 - */ - @Autowired - private PermitAllUrlProperties permitAllUrl; - + /** * 解决 无法直接注入 AuthenticationManager * @@ -95,15 +87,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter @Override protected void configure(HttpSecurity httpSecurity) throws Exception { - // 注解标记允许匿名访问的url - ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); - permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); - httpSecurity // CSRF禁用,因为不使用session .csrf().disable() - // 禁用HTTP响应标头 - .headers().cacheControl().disable().and() // 认证失败处理类 .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() // 基于token,所以不需要session @@ -111,15 +97,27 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage").permitAll() - // 静态资源,可匿名访问 - .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() - .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + .antMatchers("/login", "/register", "/captchaImage").anonymous() + .antMatchers( + HttpMethod.GET, + "/", + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js", + "/profile/**" + ).permitAll() + .antMatchers("/common/download**").anonymous() + .antMatchers("/common/download/resource**").anonymous() + .antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous() + .antMatchers("/druid/**").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() .headers().frameOptions().disable(); - // 添加Logout filter httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); // 添加JWT filter httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java index a4977e5..b5b7de3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java @@ -1,9 +1,8 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.utils.ServletUtils; -import org.springframework.stereotype.Component; - import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.ServletUtils; /** * 服务相关配置 @@ -13,16 +12,9 @@ import javax.servlet.http.HttpServletRequest; @Component public class ServerConfig { - public static String getDomain(HttpServletRequest request) - { - StringBuffer url = request.getRequestURL(); - String contextPath = request.getServletContext().getContextPath(); - return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); - } - /** * 获取完整的请求路径,包括:域名,端口,上下文访问路径 - * + * * @return 服务地址 */ public String getUrl() @@ -30,4 +22,11 @@ public class ServerConfig HttpServletRequest request = ServletUtils.getRequest(); return getDomain(request); } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java index 36695a2..0d67c22 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -1,14 +1,13 @@ package com.ruoyi.framework.config; -import com.ruoyi.common.utils.Threads; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; +import com.ruoyi.common.utils.Threads; /** * 线程池配置 @@ -50,8 +49,7 @@ public class ThreadPoolConfig protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(corePoolSize, - new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), - new ThreadPoolExecutor.CallerRunsPolicy()) + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { @Override protected void afterExecute(Runnable r, Throwable t) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java index 8064ec8..84f7e00 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -1,8 +1,8 @@ package com.ruoyi.framework.config.properties; -import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; /** * druid 配置属性 @@ -24,12 +24,6 @@ public class DruidProperties @Value("${spring.datasource.druid.maxWait}") private int maxWait; - @Value("${spring.datasource.druid.connectTimeout}") - private int connectTimeout; - - @Value("${spring.datasource.druid.socketTimeout}") - private int socketTimeout; - @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @@ -60,12 +54,6 @@ public class DruidProperties /** 配置获取连接等待超时的时间 */ datasource.setMaxWait(maxWait); - - /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ - datasource.setConnectTimeout(connectTimeout); - - /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ - datasource.setSocketTimeout(socketTimeout); /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java index 9d585fc..e70b8cf 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -1,9 +1,8 @@ package com.ruoyi.framework.datasource; -import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; - -import javax.sql.DataSource; import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * 动态数据源 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java index 9b929b0..3572db9 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java @@ -14,25 +14,25 @@ public class DynamicDataSourceContextHolder /** * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, - * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 */ private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); /** - * 获得数据源的变量 + * 设置数据源的变量 */ - public static String getDataSourceType() + public static void setDataSourceType(String dsType) { - return CONTEXT_HOLDER.get(); + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); } /** - * 设置数据源的变量 + * 获得数据源的变量 */ - public static void setDataSourceType(String dsType) + public static String getDataSourceType() { - log.info("切换到{}数据源", dsType); - CONTEXT_HOLDER.set(dsType); + return CONTEXT_HOLDER.get(); } /** 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 a057002..17d607f 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 @@ -1,16 +1,15 @@ package com.ruoyi.framework.interceptor; -import com.alibaba.fastjson2.JSON; +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.ServletUtils; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.lang.reflect.Method; /** * 防止重复提交拦截器 @@ -18,7 +17,7 @@ import java.lang.reflect.Method; * @author ruoyi */ @Component -public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception @@ -30,10 +29,10 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); if (annotation != null) { - if (this.isRepeatSubmit(request, annotation)) + if (this.isRepeatSubmit(request)) { - AjaxResult ajaxResult = AjaxResult.error(annotation.message()); - ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); + ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult)); return false; } } @@ -41,7 +40,7 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor } else { - return true; + return super.preHandle(request, response, handler); } } @@ -52,5 +51,5 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor * @return * @throws Exception */ - public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); + public abstract boolean isRepeatSubmit(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 34230aa..cb4edbe 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,21 +1,19 @@ package com.ruoyi.framework.interceptor.impl; -import com.alibaba.fastjson2.JSON; -import com.ruoyi.common.annotation.RepeatSubmit; -import com.ruoyi.common.constant.CacheConstants; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.filter.RepeatedlyRequestWrapper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpHelper; import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; /** * 判断请求url和数据是否和上一次相同, @@ -37,9 +35,21 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor @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, RepeatSubmit annotation) + public boolean isRepeatSubmit(HttpServletRequest request) { String nowParams = ""; if (request instanceof RepeatedlyRequestWrapper) @@ -51,7 +61,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor // body参数为空,获取Parameter的数据 if (StringUtils.isEmpty(nowParams)) { - nowParams = JSON.toJSONString(request.getParameterMap()); + nowParams = JSONObject.toJSONString(request.getParameterMap()); } Map nowDataMap = new HashMap(); nowDataMap.put(REPEAT_PARAMS, nowParams); @@ -61,10 +71,14 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor String url = request.getRequestURI(); // 唯一值(没有消息头则使用请求地址) - String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + String submitKey = request.getHeader(header); + if (StringUtils.isEmpty(submitKey)) + { + submitKey = url; + } - // 唯一标识(指定key + url + 消息头) - String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + // 唯一标识(指定key + 消息头) + String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey; Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); if (sessionObj != null) @@ -73,7 +87,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor if (sessionMap.containsKey(url)) { Map preDataMap = (Map) sessionMap.get(url); - if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap)) { return true; } @@ -81,7 +95,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor } Map cacheMap = new HashMap(); cacheMap.put(url, nowDataMap); - redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, intervalTime, TimeUnit.SECONDS); return false; } @@ -98,11 +112,11 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor /** * 判断两次间隔时间 */ - private boolean compareTime(Map nowMap, Map preMap, int interval) + private boolean compareTime(Map nowMap, Map preMap) { long time1 = (Long) nowMap.get(REPEAT_TIME); long time2 = (Long) preMap.get(REPEAT_TIME); - if ((time1 - time2) < interval) + if ((time1 - time2) < (this.intervalTime * 1000)) { return true; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java index 93da79f..7387a02 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java @@ -1,11 +1,10 @@ package com.ruoyi.framework.manager; -import com.ruoyi.common.utils.Threads; -import com.ruoyi.common.utils.spring.SpringUtils; - import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import com.ruoyi.common.utils.Threads; +import com.ruoyi.common.utils.spring.SpringUtils; /** * 异步任务管理器 @@ -14,11 +13,11 @@ import java.util.concurrent.TimeUnit; */ public class AsyncManager { - private static AsyncManager me = new AsyncManager(); /** * 操作延迟10毫秒 */ private final int OPERATE_DELAY_TIME = 10; + /** * 异步操作任务调度线程池 */ @@ -29,6 +28,8 @@ public class AsyncManager */ private AsyncManager(){} + private static AsyncManager me = new AsyncManager(); + public static AsyncManager me() { return me; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java index db928d4..e36ca3c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -3,7 +3,6 @@ package com.ruoyi.framework.manager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; - import javax.annotation.PreDestroy; /** 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 4920d5f..23d0230 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 @@ -1,5 +1,8 @@ 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; @@ -12,10 +15,6 @@ import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.service.ISysLogininforService; import com.ruoyi.system.service.ISysOperLogService; import eu.bitwalker.useragentutils.UserAgent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.TimerTask; /** * 异步工厂(产生任务用) @@ -39,7 +38,7 @@ public class AsyncFactory final Object... args) { final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); - final String ip = IpUtils.getIpAddr(); + final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); return new TimerTask() { @Override 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 caadd4b..3eb2495 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,21 +1,20 @@ package com.ruoyi.framework.security.filter; -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 java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; +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; /** * token过滤器 验证token有效性 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 fed2232..c22dd32 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,18 +1,17 @@ package com.ruoyi.framework.security.handle; -import com.alibaba.fastjson2.JSON; +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSON; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.Serializable; /** * 认证失败处理类 返回未授权 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 5f94762..e5fc11d 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,7 +1,16 @@ package com.ruoyi.framework.security.handle; -import com.alibaba.fastjson2.JSON; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson.JSON; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.ServletUtils; @@ -9,15 +18,6 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.framework.web.service.TokenService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; /** * 自定义退出处理类 返回成功 @@ -48,6 +48,6 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler // 记录用户退出日志 AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); } - ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "退出成功"))); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java index d64f191..63b03da 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java @@ -1,5 +1,9 @@ package com.ruoyi.framework.web.domain; +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; import com.ruoyi.common.utils.Arith; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.web.domain.server.Cpu; @@ -17,11 +21,6 @@ import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.Util; -import java.net.UnknownHostException; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; - /** * 服务器相关信息 * @@ -106,30 +105,6 @@ public class Server this.sysFiles = sysFiles; } - /** - * 设置磁盘信息 - */ - private void setSysFiles(OperatingSystem os) - { - FileSystem fileSystem = os.getFileSystem(); - List fsArray = fileSystem.getFileStores(); - for (OSFileStore fs : fsArray) - { - long free = fs.getUsableSpace(); - long total = fs.getTotalSpace(); - long used = total - free; - SysFile sysFile = new SysFile(); - sysFile.setDirName(fs.getMount()); - sysFile.setSysTypeName(fs.getType()); - sysFile.setTypeName(fs.getName()); - sysFile.setTotal(convertFileSize(total)); - sysFile.setFree(convertFileSize(free)); - sysFile.setUsed(convertFileSize(used)); - sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); - sysFiles.add(sysFile); - } - } - public void copyTo() throws Exception { SystemInfo si = new SystemInfo(); @@ -208,6 +183,30 @@ public class Server jvm.setHome(props.getProperty("java.home")); } + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + /** * 字节转换 * diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java index 463477a..485d201 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java @@ -1,10 +1,9 @@ package com.ruoyi.framework.web.domain.server; +import java.lang.management.ManagementFactory; import com.ruoyi.common.utils.Arith; import com.ruoyi.common.utils.DateUtils; -import java.lang.management.ManagementFactory; - /** * JVM相关信息 * @@ -118,14 +117,6 @@ public class Jvm */ public String getRunTime() { - return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); - } - - /** - * 运行参数 - */ - public String getInputArgs() - { - return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate()); } } 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 42f7978..51dd8c5 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,22 +1,19 @@ package com.ruoyi.framework.web.exception; -import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.exception.DemoModeException; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.StringUtils; +import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; - -import javax.servlet.http.HttpServletRequest; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; /** * 全局异常处理器 @@ -62,28 +59,6 @@ public class GlobalExceptionHandler return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); } - /** - * 请求路径中缺少必需的路径变量 - */ - @ExceptionHandler(MissingPathVariableException.class) - public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) - { - String requestURI = request.getRequestURI(); - log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); - } - - /** - * 请求参数类型不匹配 - */ - @ExceptionHandler(MethodArgumentTypeMismatchException.class) - public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) - { - String requestURI = request.getRequestURI(); - log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue())); - } - /** * 拦截未知的运行时异常 */ 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 44c25ef..68b1d69 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,14 +1,12 @@ package com.ruoyi.framework.web.service; +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.security.context.PermissionContextHolder; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.Set; /** * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 @@ -45,7 +43,6 @@ public class PermissionService { return false; } - PermissionContextHolder.setContext(permission); return hasPermissions(loginUser.getPermissions(), permission); } @@ -63,7 +60,7 @@ public class PermissionService /** * 验证用户是否具有以下任意一个权限 * - * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 + * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 * @return 用户是否具有以下任意一个权限 */ public boolean hasAnyPermi(String permissions) @@ -77,7 +74,6 @@ public class PermissionService { return false; } - PermissionContextHolder.setContext(permissions); Set authorities = loginUser.getPermissions(); for (String permission : permissions.split(PERMISSION_DELIMETER)) { 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 0572eeb..cdccaed 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 @@ -1,34 +1,28 @@ package com.ruoyi.framework.web.service; -import com.ruoyi.common.constant.CacheConstants; +import javax.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; 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.LoginUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.exception.user.BlackListException; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.exception.user.UserNotExistsException; import com.ruoyi.common.exception.user.UserPasswordNotMatchException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; -import com.ruoyi.framework.security.context.AuthenticationContextHolder; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; /** * 登录校验方法 @@ -64,18 +58,19 @@ public class SysLoginService */ public String login(String username, String password, String code, String uuid) { - // 验证码校验 - validateCaptcha(username, code, uuid); - // 登录前置校验 - loginPreCheck(username, password); +// boolean captchaOnOff = configService.selectCaptchaOnOff(); +// // 验证码开关 +// if (captchaOnOff) +// { +// validateCaptcha(username, code, uuid); +// } // 用户验证 Authentication authentication = null; try { - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); - AuthenticationContextHolder.setContext(authenticationToken); // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername - authentication = authenticationManager.authenticate(authenticationToken); + authentication = authenticationManager + .authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (Exception e) { @@ -90,13 +85,9 @@ public class SysLoginService throw new ServiceException(e.getMessage()); } } - finally - { - AuthenticationContextHolder.clearContext(); - } AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); - recordLoginInfo(loginUser.getUserId()); + recordLoginInfo(loginUser.getUser()); // 生成token return tokenService.createToken(loginUser); } @@ -111,72 +102,28 @@ public class SysLoginService */ public void validateCaptcha(String username, String code, String uuid) { - boolean captchaEnabled = configService.selectCaptchaEnabled(); - if (captchaEnabled) - { - String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); - String captcha = redisCache.getCacheObject(verifyKey); - redisCache.deleteObject(verifyKey); - if (captcha == null) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); - throw new CaptchaException(); - } - } - } - - /** - * 登录前置校验 - * @param username 用户名 - * @param password 用户密码 - */ - public void loginPreCheck(String username, String password) - { - // 用户名或密码为空 错误 - if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); - throw new UserNotExistsException(); - } - // 密码如果不在指定范围内 错误 - if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); - throw new UserPasswordNotMatchException(); - } - // 用户名不在指定范围内 错误 - if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); - throw new UserPasswordNotMatchException(); + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); } - // IP黑名单校验 - String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); - if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + if (!code.equalsIgnoreCase(captcha)) { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); - throw new BlackListException(); + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); } } /** * 记录登录信息 - * - * @param userId 用户ID */ - public void recordLoginInfo(Long userId) + public void recordLoginInfo(SysUser user) { - SysUser sysUser = new SysUser(); - sysUser.setUserId(userId); - sysUser.setLoginIp(IpUtils.getIpAddr()); - sysUser.setLoginDate(DateUtils.getNowDate()); - userService.updateUserProfile(sysUser); + user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); + user.setLoginDate(DateUtils.getNowDate()); + userService.updateUserProfile(user); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java index 2534005..feb8038 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java @@ -1,16 +1,12 @@ package com.ruoyi.framework.web.service; -import com.ruoyi.common.core.domain.entity.SysRole; +import java.util.HashSet; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysRoleService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; /** * 用户权限处理 @@ -63,21 +59,7 @@ public class SysPermissionService } else { - List roles = user.getRoles(); - if (!CollectionUtils.isEmpty(roles)) - { - // 多角色设置permissions属性,以便数据权限匹配权限 - for (SysRole role : roles) - { - Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); - role.setPermissions(rolePerms); - perms.addAll(rolePerms); - } - } - else - { - perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); - } + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); } return perms; } 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 bdc7b98..a47cafd 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,6 +1,8 @@ package com.ruoyi.framework.web.service; -import com.ruoyi.common.constant.CacheConstants; +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; @@ -10,13 +12,10 @@ 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.StringUtils; 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; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; /** * 注册校验方法 @@ -41,14 +40,13 @@ public class SysRegisterService public String register(RegisterBody registerBody) { String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); + boolean captchaOnOff = configService.selectCaptchaOnOff(); // 验证码开关 - boolean captchaEnabled = configService.selectCaptchaEnabled(); - if (captchaEnabled) + if (captchaOnOff) { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + //validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + validateCaptcha(username, registerBody.getUuid()); } if (StringUtils.isEmpty(username)) @@ -69,14 +67,16 @@ public class SysRegisterService { msg = "密码长度必须在5到20个字符之间"; } - else if (!userService.checkUserNameUnique(sysUser)) + 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(password)); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); boolean regFlag = userService.registerUser(sysUser); if (!regFlag) { @@ -84,7 +84,8 @@ public class SysRegisterService } else { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"))); } } return msg; @@ -98,18 +99,19 @@ public class SysRegisterService * @param uuid 唯一标识 * @return 结果 */ - public void validateCaptcha(String username, String code, String uuid) + public void validateCaptcha(String username, String uuid) + // public void validateCaptcha(String username, String code, String uuid) { - String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(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(); - } +// 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 693328f..bf28e0f 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,12 @@ package com.ruoyi.framework.web.service; -import com.ruoyi.common.constant.CacheConstants; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; @@ -13,14 +19,6 @@ import eu.bitwalker.useragentutils.UserAgent; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; /** * token验证处理 @@ -30,18 +28,24 @@ import java.util.concurrent.TimeUnit; @Component public class TokenService { - protected static final long MILLIS_SECOND = 1000; - protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; - private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; // 令牌自定义标识 @Value("${token.header}") private String header; + // 令牌秘钥 @Value("${token.secret}") private String secret; + // 令牌有效期(默认30分钟) @Value("${token.expireTime}") private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + @Autowired private RedisCache redisCache; @@ -151,7 +155,7 @@ public class TokenService public void setUserAgent(LoginUser loginUser) { UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = IpUtils.getIpAddr(); + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); loginUser.setIpaddr(ip); loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); loginUser.setBrowser(userAgent.getBrowser().getName()); @@ -216,6 +220,6 @@ public class TokenService private String getTokenKey(String uuid) { - return CacheConstants.LOGIN_TOKEN_KEY + uuid; + return Constants.LOGIN_TOKEN_KEY + uuid; } } 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 a4926fb..c8b1c7b 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,12 +1,5 @@ package com.ruoyi.framework.web.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.ServiceException; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -14,6 +7,12 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; 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.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysUserService; /** * 用户验证处理 @@ -27,9 +26,6 @@ public class UserDetailsServiceImpl implements UserDetailsService @Autowired private ISysUserService userService; - - @Autowired - private SysPasswordService passwordService; @Autowired private SysPermissionService permissionService; @@ -41,21 +37,19 @@ public class UserDetailsServiceImpl implements UserDetailsService if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); - throw new ServiceException(MessageUtils.message("user.not.exists")); + throw new ServiceException("登录用户:" + username + " 不存在"); } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); - throw new ServiceException(MessageUtils.message("user.password.delete")); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { log.info("登录用户:{} 已被停用.", username); - throw new ServiceException(MessageUtils.message("user.blocked")); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); } - passwordService.validate(user); - return createLoginUser(user); } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index c562372..e1c461b 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -1,11 +1,11 @@ - ruoyi com.ruoyi - 3.8.6 + 3.7.0 4.0.0 @@ -20,7 +20,7 @@ org.apache.velocity - velocity-engine-core + velocity diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index 8b6879f..6dfe5e3 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -1,15 +1,10 @@ package com.ruoyi.generator.controller; -import com.ruoyi.common.annotation.Log; -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.core.text.Convert; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.generator.domain.GenTable; -import com.ruoyi.generator.domain.GenTableColumn; -import com.ruoyi.generator.service.IGenTableColumnService; -import com.ruoyi.generator.service.IGenTableService; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -22,12 +17,16 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import com.ruoyi.common.annotation.Log; +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.core.text.Convert; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.service.IGenTableColumnService; +import com.ruoyi.generator.service.IGenTableService; /** * 代码生成 操作处理 @@ -60,17 +59,17 @@ public class GenController extends BaseController * 修改代码生成业务 */ @PreAuthorize("@ss.hasPermi('tool:gen:query')") - @GetMapping(value = "/{tableId}") - public AjaxResult getInfo(@PathVariable Long tableId) + @GetMapping(value = "/{talbleId}") + public AjaxResult getInfo(@PathVariable Long talbleId) { - GenTable table = genTableService.selectGenTableById(tableId); + GenTable table = genTableService.selectGenTableById(talbleId); List tables = genTableService.selectGenTableAll(); - List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); Map map = new HashMap(); map.put("info", table); map.put("rows", list); map.put("tables", tables); - return success(map); + return AjaxResult.success(map); } /** @@ -89,7 +88,7 @@ public class GenController extends BaseController * 查询数据表字段列表 */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") - @GetMapping(value = "/column/{tableId}") + @GetMapping(value = "/column/{talbleId}") public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo(); @@ -111,7 +110,7 @@ public class GenController extends BaseController // 查询表信息 List tableList = genTableService.selectDbTableListByNames(tableNames); genTableService.importGenTable(tableList); - return success(); + return AjaxResult.success(); } /** @@ -124,7 +123,7 @@ public class GenController extends BaseController { genTableService.validateEdit(genTable); genTableService.updateGenTable(genTable); - return success(); + return AjaxResult.success(); } /** @@ -136,7 +135,7 @@ public class GenController extends BaseController public AjaxResult remove(@PathVariable Long[] tableIds) { genTableService.deleteGenTableByIds(tableIds); - return success(); + return AjaxResult.success(); } /** @@ -147,7 +146,7 @@ public class GenController extends BaseController public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); - return success(dataMap); + return AjaxResult.success(dataMap); } /** @@ -171,7 +170,7 @@ public class GenController extends BaseController public AjaxResult genCode(@PathVariable("tableName") String tableName) { genTableService.generatorCode(tableName); - return success(); + return AjaxResult.success(); } /** @@ -183,7 +182,7 @@ public class GenController extends BaseController public AjaxResult synchDb(@PathVariable("tableName") String tableName) { genTableService.synchDb(tableName); - return success(); + return AjaxResult.success(); } /** 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 3889ac9..269779c 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,13 +1,12 @@ package com.ruoyi.generator.domain; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import org.apache.commons.lang3.ArrayUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; -import org.apache.commons.lang3.ArrayUtils; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import java.util.List; /** * 业务表 gen_table @@ -96,31 +95,6 @@ public class GenTable extends BaseEntity /** 上级菜单名称字段 */ private String parentMenuName; - public static boolean isSub(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); - } - - public static boolean isTree(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); - } - - public static boolean isCrud(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); - } - - public static boolean isSuperColumn(String tplCategory, String javaField) - { - if (isTree(tplCategory)) - { - return StringUtils.equalsAnyIgnoreCase(javaField, - ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); - } - return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); - } - public Long getTableId() { return tableId; @@ -356,18 +330,43 @@ public class GenTable extends BaseEntity return isSub(this.tplCategory); } + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + public boolean isTree() { return isTree(this.tplCategory); } + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + public boolean isCrud() { return isCrud(this.tplCategory); } + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + public boolean isSuperColumn(String javaField) { return isSuperColumn(this.tplCategory, javaField); } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, 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 7a0335f..d1733b6 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,10 +1,9 @@ package com.ruoyi.generator.domain; +import javax.validation.constraints.NotBlank; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; -import javax.validation.constraints.NotBlank; - /** * 代码生成业务字段表 gen_table_column * @@ -69,19 +68,9 @@ public class GenTableColumn extends BaseEntity /** 排序 */ private Integer sort; - public static boolean isSuperColumn(String javaField) - { - return StringUtils.equalsAnyIgnoreCase(javaField, - // BaseEntity - "createBy", "createTime", "updateBy", "updateTime", "remark", - // TreeEntity - "parentName", "parentId", "orderNum", "ancestors"); - } - - public static boolean isUsableColumn(String javaField) + public void setColumnId(Long columnId) { - // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 - return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + this.columnId = columnId; } public Long getColumnId() @@ -89,9 +78,9 @@ public class GenTableColumn extends BaseEntity return columnId; } - public void setColumnId(Long columnId) + public void setTableId(Long tableId) { - this.columnId = columnId; + this.tableId = tableId; } public Long getTableId() @@ -99,9 +88,9 @@ public class GenTableColumn extends BaseEntity return tableId; } - public void setTableId(Long tableId) + public void setColumnName(String columnName) { - this.tableId = tableId; + this.columnName = columnName; } public String getColumnName() @@ -109,9 +98,9 @@ public class GenTableColumn extends BaseEntity return columnName; } - public void setColumnName(String columnName) + public void setColumnComment(String columnComment) { - this.columnName = columnName; + this.columnComment = columnComment; } public String getColumnComment() @@ -119,9 +108,9 @@ public class GenTableColumn extends BaseEntity return columnComment; } - public void setColumnComment(String columnComment) + public void setColumnType(String columnType) { - this.columnComment = columnComment; + this.columnType = columnType; } public String getColumnType() @@ -129,9 +118,9 @@ public class GenTableColumn extends BaseEntity return columnType; } - public void setColumnType(String columnType) + public void setJavaType(String javaType) { - this.columnType = columnType; + this.javaType = javaType; } public String getJavaType() @@ -139,9 +128,9 @@ public class GenTableColumn extends BaseEntity return javaType; } - public void setJavaType(String javaType) + public void setJavaField(String javaField) { - this.javaType = javaType; + this.javaField = javaField; } public String getJavaField() @@ -149,24 +138,19 @@ public class GenTableColumn extends BaseEntity return javaField; } - public void setJavaField(String javaField) - { - this.javaField = javaField; - } - public String getCapJavaField() { return StringUtils.capitalize(javaField); } - public String getIsPk() + public void setIsPk(String isPk) { - return isPk; + this.isPk = isPk; } - public void setIsPk(String isPk) + public String getIsPk() { - this.isPk = isPk; + return isPk; } public boolean isPk() @@ -199,14 +183,14 @@ public class GenTableColumn extends BaseEntity return isIncrement != null && StringUtils.equals("1", isIncrement); } - public String getIsRequired() + public void setIsRequired(String isRequired) { - return isRequired; + this.isRequired = isRequired; } - public void setIsRequired(String isRequired) + public String getIsRequired() { - this.isRequired = isRequired; + return isRequired; } public boolean isRequired() @@ -219,14 +203,14 @@ public class GenTableColumn extends BaseEntity return isRequired != null && StringUtils.equals("1", isRequired); } - public String getIsInsert() + public void setIsInsert(String isInsert) { - return isInsert; + this.isInsert = isInsert; } - public void setIsInsert(String isInsert) + public String getIsInsert() { - this.isInsert = isInsert; + return isInsert; } public boolean isInsert() @@ -239,14 +223,14 @@ public class GenTableColumn extends BaseEntity return isInsert != null && StringUtils.equals("1", isInsert); } - public String getIsEdit() + public void setIsEdit(String isEdit) { - return isEdit; + this.isEdit = isEdit; } - public void setIsEdit(String isEdit) + public String getIsEdit() { - this.isEdit = isEdit; + return isEdit; } public boolean isEdit() @@ -259,14 +243,14 @@ public class GenTableColumn extends BaseEntity return isEdit != null && StringUtils.equals("1", isEdit); } - public String getIsList() + public void setIsList(String isList) { - return isList; + this.isList = isList; } - public void setIsList(String isList) + public String getIsList() { - this.isList = isList; + return isList; } public boolean isList() @@ -279,14 +263,14 @@ public class GenTableColumn extends BaseEntity return isList != null && StringUtils.equals("1", isList); } - public String getIsQuery() + public void setIsQuery(String isQuery) { - return isQuery; + this.isQuery = isQuery; } - public void setIsQuery(String isQuery) + public String getIsQuery() { - this.isQuery = isQuery; + return isQuery; } public boolean isQuery() @@ -299,14 +283,14 @@ public class GenTableColumn extends BaseEntity return isQuery != null && StringUtils.equals("1", isQuery); } - public String getQueryType() + public void setQueryType(String queryType) { - return queryType; + this.queryType = queryType; } - public void setQueryType(String queryType) + public String getQueryType() { - this.queryType = queryType; + return queryType; } public String getHtmlType() @@ -319,14 +303,19 @@ public class GenTableColumn extends BaseEntity this.htmlType = htmlType; } + public void setDictType(String dictType) + { + this.dictType = dictType; + } + public String getDictType() { return dictType; } - public void setDictType(String dictType) + public void setSort(Integer sort) { - this.dictType = dictType; + this.sort = sort; } public Integer getSort() @@ -334,14 +323,18 @@ public class GenTableColumn extends BaseEntity return sort; } - public void setSort(Integer sort) + public boolean isSuperColumn() { - this.sort = sort; + return isSuperColumn(this.javaField); } - public boolean isSuperColumn() + public static boolean isSuperColumn(String javaField) { - return isSuperColumn(this.javaField); + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); } public boolean isUsableColumn() @@ -349,6 +342,12 @@ public class GenTableColumn extends BaseEntity return isUsableColumn(javaField); } + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + public String readConverterExp() { String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index 4119882..951e166 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,8 +1,7 @@ package com.ruoyi.generator.mapper; -import com.ruoyi.generator.domain.GenTableColumn; - import java.util.List; +import com.ruoyi.generator.domain.GenTableColumn; /** * 业务字段 数据层 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 5e6bd42..9b330df 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -1,8 +1,7 @@ package com.ruoyi.generator.mapper; -import com.ruoyi.generator.domain.GenTable; - import java.util.List; +import com.ruoyi.generator.domain.GenTable; /** * 业务 数据层 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 2ec4495..0679689 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,12 +1,11 @@ package com.ruoyi.generator.service; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import com.ruoyi.common.core.text.Convert; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; /** * 业务字段 服务层实现 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 2e3b00f..499da03 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 @@ -1,7 +1,27 @@ package com.ruoyi.generator.service; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.text.CharsetKit; @@ -15,28 +35,6 @@ import com.ruoyi.generator.mapper.GenTableMapper; import com.ruoyi.generator.util.GenUtils; import com.ruoyi.generator.util.VelocityInitializer; import com.ruoyi.generator.util.VelocityUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; /** * 业务 服务层实现 @@ -54,26 +52,9 @@ public class GenTableServiceImpl implements IGenTableService @Autowired private GenTableColumnMapper genTableColumnMapper; - /** - * 获取代码生成地址 - * - * @param table 业务表信息 - * @param template 模板文件路径 - * @return 生成地址 - */ - public static String getGenPath(GenTable table, String template) - { - String genPath = table.getGenPath(); - if (StringUtils.equals(genPath, "/")) - { - return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); - } - return genPath + File.separator + VelocityUtils.getFileName(template, table); - } - /** * 查询业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @@ -87,7 +68,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @@ -99,7 +80,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @@ -111,7 +92,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @@ -123,7 +104,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询所有表信息 - * + * * @return 表信息集合 */ @Override @@ -134,7 +115,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -156,7 +137,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 删除业务对象 - * + * * @param tableIds 需要删除的数据ID * @return 结果 */ @@ -170,7 +151,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 导入表结构 - * + * * @param tableList 导入表列表 */ @Override @@ -205,7 +186,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 预览代码 - * + * * @param tableId 表编号 * @return 预览数据列表 */ @@ -238,7 +219,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(下载方式) - * + * * @param tableName 表名称 * @return 数据 */ @@ -254,7 +235,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(自定义路径) - * + * * @param tableName 表名称 */ @Override @@ -296,7 +277,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 同步数据库 - * + * * @param tableName 表名称 */ @Override @@ -305,7 +286,7 @@ public class GenTableServiceImpl implements IGenTableService { GenTable table = genTableMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); - Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); if (StringUtils.isEmpty(dbTableColumns)) @@ -315,29 +296,9 @@ public class GenTableServiceImpl implements IGenTableService List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); dbTableColumns.forEach(column -> { - GenUtils.initColumnField(column, table); - if (tableColumnMap.containsKey(column.getColumnName())) - { - GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); - column.setColumnId(prevColumn.getColumnId()); - if (column.isList()) - { - // 如果是列表,继续保留查询方式/字典类型选项 - column.setDictType(prevColumn.getDictType()); - column.setQueryType(prevColumn.getQueryType()); - } - if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() - && (column.isInsert() || column.isEdit()) - && ((column.isUsableColumn()) || (!column.isSuperColumn()))) - { - // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 - column.setIsRequired(prevColumn.getIsRequired()); - column.setHtmlType(prevColumn.getHtmlType()); - } - genTableColumnMapper.updateGenTableColumn(column); - } - else + if (!tableColumnNames.contains(column.getColumnName())) { + GenUtils.initColumnField(column, table); genTableColumnMapper.insertGenTableColumn(column); } }); @@ -351,7 +312,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 批量生成代码(下载方式) - * + * * @param tableNames 表数组 * @return 数据 */ @@ -398,7 +359,7 @@ public class GenTableServiceImpl implements IGenTableService zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); IOUtils.write(sw.toString(), zip, Constants.UTF8); IOUtils.closeQuietly(sw); - zip.flush(); + zip.flush(); zip.closeEntry(); } catch (IOException e) @@ -410,7 +371,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 修改保存参数校验 - * + * * @param genTable 业务信息 */ @Override @@ -419,7 +380,7 @@ public class GenTableServiceImpl implements IGenTableService if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { String options = JSON.toJSONString(genTable.getParams()); - JSONObject paramsObj = JSON.parseObject(options); + JSONObject paramsObj = JSONObject.parseObject(options); if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { throw new ServiceException("树编码字段不能为空"); @@ -448,7 +409,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置主键列信息 - * + * * @param table 业务表信息 */ public void setPkColumn(GenTable table) @@ -484,7 +445,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置主子表信息 - * + * * @param table 业务表信息 */ public void setSubTable(GenTable table) @@ -498,12 +459,12 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置代码生成其他选项值 - * + * * @param genTable 设置后的生成对象 */ public void setTableFromOptions(GenTable genTable) { - JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); if (StringUtils.isNotNull(paramsObj)) { String treeCode = paramsObj.getString(GenConstants.TREE_CODE); @@ -511,7 +472,7 @@ public class GenTableServiceImpl implements IGenTableService String treeName = paramsObj.getString(GenConstants.TREE_NAME); String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); - + genTable.setTreeCode(treeCode); genTable.setTreeParentCode(treeParentCode); genTable.setTreeName(treeName); @@ -519,4 +480,21 @@ public class GenTableServiceImpl implements IGenTableService genTable.setParentMenuName(parentMenuName); } } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } } \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java index 36a3215..3037f70 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -1,8 +1,7 @@ package com.ruoyi.generator.service; -import com.ruoyi.generator.domain.GenTableColumn; - import java.util.List; +import com.ruoyi.generator.domain.GenTableColumn; /** * 业务字段 服务层 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 86195db..9d53f95 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,9 +1,8 @@ package com.ruoyi.generator.service; -import com.ruoyi.generator.domain.GenTable; - import java.util.List; import java.util.Map; +import com.ruoyi.generator.domain.GenTable; /** * 业务 服务层 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 c9d26ad..06c6821 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 @@ -1,13 +1,12 @@ package com.ruoyi.generator.util; +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.config.GenConfig; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; -import org.apache.commons.lang3.RegExUtils; - -import java.util.Arrays; /** * 代码生成器 工具类 @@ -43,7 +42,6 @@ public class GenUtils column.setJavaField(StringUtils.toCamelCase(columnName)); // 设置默认类型 column.setJavaType(GenConstants.TYPE_STRING); - column.setQueryType(GenConstants.QUERY_EQ); if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { @@ -153,7 +151,8 @@ public class GenUtils { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); - return StringUtils.substring(packageName, lastIndex + 1, nameLength); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); + return moduleName; } /** @@ -166,7 +165,8 @@ public class GenUtils { int lastIndex = tableName.lastIndexOf("_"); int nameLength = tableName.length(); - return StringUtils.substring(tableName, lastIndex + 1, nameLength); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); + return businessName; } /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java index dbecfe4..32452b8 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -1,9 +1,8 @@ package com.ruoyi.generator.util; -import com.ruoyi.common.constant.Constants; -import org.apache.velocity.app.Velocity; - import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.ruoyi.common.constant.Constants; /** * VelocityEngine工厂 @@ -21,9 +20,10 @@ public class VelocityInitializer try { // 加载classpath目录下的vm文件 - p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); // 定义字符集 p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8); // 初始化Velocity引擎,指定配置Properties Velocity.init(p); } 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 915e05e..4472928 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,18 +1,15 @@ package com.ruoyi.generator.util; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; -import org.apache.velocity.VelocityContext; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; /** * 模板处理工具类 @@ -61,7 +58,6 @@ public class VelocityUtils velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); velocityContext.put("columns", genTable.getColumns()); velocityContext.put("table", genTable); - velocityContext.put("dicts", getDicts(genTable)); setMenuVelocityContext(velocityContext, genTable); if (GenConstants.TPL_TREE.equals(tplCategory)) { @@ -77,7 +73,7 @@ public class VelocityUtils public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); - JSONObject paramsObj = JSON.parseObject(options); + JSONObject paramsObj = JSONObject.parseObject(options); String parentMenuId = getParentMenuId(paramsObj); context.put("parentMenuId", parentMenuId); } @@ -85,7 +81,7 @@ public class VelocityUtils public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); - JSONObject paramsObj = JSON.parseObject(options); + JSONObject paramsObj = JSONObject.parseObject(options); String treeCode = getTreecode(paramsObj); String treeParentCode = getTreeParentCode(paramsObj); String treeName = getTreeName(paramsObj); @@ -230,7 +226,8 @@ public class VelocityUtils public static String getPackagePrefix(String packageName) { int lastIndex = packageName.lastIndexOf("."); - return StringUtils.substring(packageName, 0, lastIndex); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); + return basePackage; } /** @@ -263,44 +260,6 @@ public class VelocityUtils return importList; } - /** - * 根据列类型获取字典组 - * - * @param genTable 业务表对象 - * @return 返回字典组 - */ - public static String getDicts(GenTable genTable) - { - List columns = genTable.getColumns(); - Set dicts = new HashSet(); - addDicts(dicts, columns); - if (StringUtils.isNotNull(genTable.getSubTable())) - { - List subColumns = genTable.getSubTable().getColumns(); - addDicts(dicts, subColumns); - } - return StringUtils.join(dicts, ", "); - } - - /** - * 添加字典列表 - * - * @param dicts 字典列表 - * @param columns 列集合 - */ - public static void addDicts(Set dicts, List columns) - { - for (GenTableColumn column : columns) - { - if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( - column.getHtmlType(), - new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) - { - dicts.add("'" + column.getDictType() + "'"); - } - } - } - /** * 获取权限前缀 * @@ -383,7 +342,7 @@ public class VelocityUtils public static int getExpandColumn(GenTable genTable) { String options = genTable.getOptions(); - JSONObject paramsObj = JSON.parseObject(options); + JSONObject paramsObj = JSONObject.parseObject(options); String treeName = paramsObj.getString(GenConstants.TREE_NAME); int num = 0; for (GenTableColumn column : genTable.getColumns()) diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml index 7eae68e..27aee34 100644 --- a/ruoyi-generator/src/main/resources/generator.yml +++ b/ruoyi-generator/src/main/resources/generator.yml @@ -1,10 +1,10 @@ # 代码生成 -gen: +gen: # 作者 author: ruoyi # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool - packageName: com.ruoyi.system + packageName: com.ruoyi.zjgyyingji # 自动去除表前缀,默认是false autoRemovePre: false # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: sys_ \ No newline at end of file + tablePrefix: b_ \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index 66109de..5fa790f 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -28,23 +28,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column - + - + - + insert into gen_table_column ( table_id, @@ -88,37 +88,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sysdate() ) - + update gen_table_column - column_comment = #{columnComment}, - java_type = #{javaType}, - java_field = #{javaField}, - is_insert = #{isInsert}, - is_edit = #{isEdit}, - is_list = #{isList}, - is_query = #{isQuery}, - is_required = #{isRequired}, - query_type = #{queryType}, - html_type = #{htmlType}, - dict_type = #{dictType}, - sort = #{sort}, - update_by = #{updateBy}, + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, update_time = sysdate() where column_id = #{columnId} - delete from gen_table_column where table_id in + delete from gen_table_column where table_id in #{tableId} - + - delete from gen_table_column where column_id in + delete from gen_table_column where column_id in #{item.columnId} 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 bf88988..e634340 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -1,7 +1,9 @@ package ${packageName}.controller; +import com.ruoyi.common.annotation.DataScope; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import java.util.List; -import javax.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -26,10 +28,12 @@ import com.ruoyi.common.core.page.TableDataInfo; /** * ${functionName}Controller - * + * * @author ${author} * @date ${datetime} */ +@Api(tags="${functionName}" ,description = +"${className}") @RestController @RequestMapping("/${moduleName}/${businessName}") public class ${ClassName}Controller extends BaseController @@ -40,7 +44,9 @@ public class ${ClassName}Controller extends BaseController /** * 查询${functionName}列表 */ +@ApiOperation("查询${functionName}信息") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @DataScope( deptAlias = "t", userAlias = "t") @GetMapping("/list") #if($table.crud || $table.sub) public TableDataInfo list(${ClassName} ${className}) @@ -53,58 +59,69 @@ public class ${ClassName}Controller extends BaseController public AjaxResult list(${ClassName} ${className}) { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); - return success(list); + return AjaxResult.success(list); } #end /** * 导出${functionName}列表 */ + @ApiOperation("导出${functionName}列表") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, ${ClassName} ${className}) + @GetMapping("/export") + public AjaxResult export(${ClassName} ${className}) { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); - util.exportExcel(response, list, "${functionName}数据"); + return util.exportExcel(list, "${functionName}数据"); } /** * 获取${functionName}详细信息 */ + @ApiOperation("获取${functionName}详细信息") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") @GetMapping(value = "/{${pkColumn.javaField}}") public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { - return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); } /** * 新增${functionName} */ + @ApiOperation("新增${functionName}详细信息") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") @Log(title = "${functionName}", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ${ClassName} ${className}) { + ${className}.setCreateId(getUserId()); + ${className}.setCreateBy(getUsername()); + ${className}.setUserId(getUserId()); + ${className}.setDeptId(getDeptId()); return toAjax(${className}Service.insert${ClassName}(${className})); } /** * 修改${functionName} */ + @ApiOperation("修改${functionName}详细信息") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody ${ClassName} ${className}) { + ${className}.setUpdateId(getUserId()); + ${className}.setUpdateBy(getUsername()); return toAjax(${className}Service.update${ClassName}(${className})); } /** * 删除${functionName} */ + @ApiOperation("删除${functionName}详细信息") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") @Log(title = "${functionName}", businessType = BusinessType.DELETE) @DeleteMapping("/{${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 7e7d7c2..42d015d 100644 --- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -69,7 +69,7 @@ public interface ${ClassName}Mapper * @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} 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 14746e1..75105ce 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -129,9 +129,6 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ -#if($table.sub) - @Transactional -#end @Override public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { diff --git a/ruoyi-generator/src/main/resources/vm/js/api.js.vm b/ruoyi-generator/src/main/resources/vm/js/api.js.vm index 9295524..296d41a 100644 --- a/ruoyi-generator/src/main/resources/vm/js/api.js.vm +++ b/ruoyi-generator/src/main/resources/vm/js/api.js.vm @@ -42,3 +42,12 @@ export function del${BusinessName}(${pkColumn.javaField}) { method: 'delete' }) } + +// 导出${functionName} +export function export${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/export', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index 07104a7..58790c2 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -1,6 +1,6 @@ -#elseif($column.list && $column.htmlType == "imageUpload") - - - #elseif($column.list && "" != $column.dictType) #elseif($column.list && "" != $javaField) @@ -187,12 +169,12 @@ #elseif($column.htmlType == "imageUpload") - - + + #elseif($column.htmlType == "fileUpload") - - + + #elseif($column.htmlType == "editor") @@ -202,14 +184,11 @@ @@ -220,45 +199,42 @@ #elseif($column.htmlType == "checkbox" && "" != $dictType) - + - {{dict.label}} + v-for="dict in ${field}Options" + :key="dict.dictValue" + :label="dict.dictValue"> + {{dict.dictLabel}} #elseif($column.htmlType == "checkbox" && $dictType) - + 请选择字典生成 #elseif($column.htmlType == "radio" && "" != $dictType) - + {{dict.label}} + v-for="dict in ${field}Options" + :key="dict.dictValue" + #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.dictValue)"#else:label="dict.dictValue"#end + + >{{dict.dictLabel}} #elseif($column.htmlType == "radio" && $dictType) - + 请选择字典生成 #elseif($column.htmlType == "datetime") - 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 0ceb3d8..0895aee 100644 --- a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm +++ b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #end - select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} - - @@ -36,6 +38,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND parent_id = #{parentId} + + AND xiaoqu_id = #{xiaoquId} + AND dept_name like concat('%', #{deptName}, '%') @@ -47,7 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by d.parent_id, d.order_num - select d.dept_id from sys_dept d left join sys_role_dept rd on d.dept_id = rd.dept_id @@ -59,10 +64,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1 + where dept_name=#{deptName} and parent_id = #{parentId} limit 1 @@ -93,11 +96,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" parent_id, dept_name, ancestors, - order_num, + order_num, leader, phone, email, status, + intro, create_by, create_time )values( @@ -105,11 +109,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{parentId}, #{deptName}, #{ancestors}, - #{orderNum}, + #{orderNum}, #{leader}, #{phone}, #{email}, #{status}, + #{intro}, #{createBy}, sysdate() ) @@ -121,11 +126,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" parent_id = #{parentId}, dept_name = #{deptName}, ancestors = #{ancestors}, - order_num = #{orderNum}, + order_num = #{orderNum}, leader = #{leader}, phone = #{phone}, email = #{email}, status = #{status}, + intro = #{intro}, update_by = #{updateBy}, update_time = sysdate() diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml index 8da9030..8ac41b4 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -120,5 +120,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sysdate() ) - + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml index 55b4075..6a24d00 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -59,7 +59,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where dict_type = #{dictType} limit 1 - + + delete from sys_dict_type where dict_id = #{dictId} diff --git a/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml index 822d665..b8178fa 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -34,10 +34,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND user_name like concat('%', #{userName}, '%') - AND login_time >= #{params.beginTime} + and date_format(login_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') - AND login_time <= #{params.endTime} + and date_format(login_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') order by info_id desc diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 6762007..3e4cd8b 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -28,7 +28,7 @@ - select menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + select menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time from sys_menu @@ -49,13 +49,13 @@ - select m.menu_id from sys_menu m left join sys_role_menu rm on m.menu_id = rm.menu_id @@ -111,13 +111,6 @@ where m.status = '0' and r.status = '0' and ur.user_id = #{userId} - - @@ -40,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND title like concat('%', #{title}, '%') - + AND business_type = #{businessType} @@ -56,10 +55,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND oper_name like concat('%', #{operName}, '%') - AND oper_time >= #{params.beginTime} + and date_format(oper_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') - AND oper_time <= #{params.endTime} + and date_format(oper_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') order by oper_id desc diff --git a/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml index 227c459..c82d808 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where post_id = #{postId} - select p.post_id from sys_post p left join sys_user_post up on up.post_id = p.post_id @@ -77,7 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" post_code = #{postCode}, post_name = #{postName}, - post_sort = #{postSort}, + post_sort = #{postSort}, status = #{status}, remark = #{remark}, update_by = #{updateBy}, @@ -91,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" post_id, post_code, post_name, - post_sort, + post_sort, status, remark, create_by, @@ -100,7 +100,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{postId}, #{postCode}, #{postName}, - #{postSort}, + #{postSort}, #{status}, #{remark}, #{createBy}, diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 52306c2..96e8615 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -85,12 +85,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -98,7 +98,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" role_id, role_name, role_key, - role_sort, + role_sort, data_scope, menu_check_strictly, dept_check_strictly, @@ -110,7 +110,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{roleId}, #{roleName}, #{roleKey}, - #{roleSort}, + #{roleSort}, #{dataScope}, #{menuCheckStrictly}, #{deptCheckStrictly}, @@ -126,7 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" role_name = #{roleName}, role_key = #{roleKey}, - role_sort = #{roleSort}, + role_sort = #{roleSort}, data_scope = #{dataScope}, menu_check_strictly = #{menuCheckStrictly}, dept_check_strictly = #{deptCheckStrictly}, @@ -139,7 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_role set del_flag = '2' where role_id = #{roleId} + update sys_role set del_flag = '2' where role_id = #{roleId} diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index d86c444..38680d3 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -4,61 +4,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, - d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, + d.xiaoqu_id, d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status, r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status from sys_user u - left join sys_dept d on u.dept_id = d.dept_id + left join v_dept d on u.dept_id = + d.dept_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id - where u.user_name = #{userName} and u.del_flag = '0' + where u.user_name = #{userName} - + select count(1) from sys_user where user_name = #{userName} limit 1 @@ -208,7 +210,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_user set del_flag = '2' where user_id = #{userId} + update sys_user set del_flag = '2' where user_id = #{userId} diff --git a/ry.bat b/ry.bat index ac1e437..a6ba5a5 100644 --- a/ry.bat +++ b/ry.bat @@ -4,36 +4,36 @@ rem jarƽ set AppName=ruoyi-admin.jar rem JVM -set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" -ECHO. +ECHO. ECHO. [1] %AppName% ECHO. [2] ر%AppName% ECHO. [3] %AppName% ECHO. [4] ״̬ %AppName% - ECHO. [5] -ECHO. + ECHO. [5] +ECHO. ECHO.ѡĿ: set /p ID= - IF "%id%"=="1" GOTO start - IF "%id%"=="2" GOTO stop - IF "%id%"=="3" GOTO restart + IF "%id%"=="1" GOTO start + IF "%id%"=="2" GOTO stop + IF "%id%"=="3" GOTO restart IF "%id%"=="4" GOTO status IF "%id%"=="5" EXIT -PAUSE +PAUSE :start for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( set pid=%%a set image_name=%%b ) if defined pid ( - echo %%is running - PAUSE - ) + echo %%is running + PAUSE + ) -start javaw %JVM_OPTS% -jar %AppName% +start javaw -jar %JAVA_OPTS% ruoyi-admin.jar echo starting echo Start %AppName% success... @@ -64,4 +64,4 @@ goto:eof if not defined pid (echo process %AppName% is dead ) else ( echo %image_name% is running ) -goto:eof +goto:eof \ No newline at end of file diff --git a/ry.sh b/ry.sh index d6a9cf3..7c4f503 100644 --- a/ry.sh +++ b/ry.sh @@ -1,9 +1,13 @@ #!/bin/sh -# ./ry.sh start 启动 stop 停止 restart 重启 status 状态 +# author ruoyi +# ./ry.sh start 启动 +# ./ry.sh stop 停止 +# ./ry.sh restart 重启 +# ./ry.sh status 状态 AppName=ruoyi-admin.jar # JVM参数 -JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" +JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" APP_HOME=`pwd` LOG_PATH=$APP_HOME/logs/$AppName.log @@ -26,7 +30,7 @@ function start() if [ x"$PID" != x"" ]; then echo "$AppName is running..." else - nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & + nohup java -jar $JVM_OPTS target/$AppName > /dev/null 2>&1 & echo "Start $AppName success..." fi } @@ -34,7 +38,7 @@ function start() function stop() { echo "Stop $AppName" - + PID="" query(){ PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`